OmniAICreator/Qiita-1.07M huggingface dataset:
はじめてのSquid

# はじめに
Squidはプロキシサーバーです。
までは、勉強して理解したけど、いざまじめにプロキシ使った通信を考えるとなると
試しにつくってみないとわからないので挑戦しようと思う

# インストール
CentOS7のサーバでためしたよ

サーバにログインして以下のコマンド実行

```
yum install squid
```

インストールできたら、squidの常駐軌道の設定を入れてから、起動

```
systemctl is-active squid
systemctl enable squid
systemctl status squid
systemctl start squid
systemctl status squid
```

起動完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/a667289f-a52f-38dd-9519-8eef3ca7ec3f.png)

# 初期設定

```
vi /etc/squid/squid.conf
```

デフォルトポートが3128であることを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/43c50697-d414-c03c-c17b-fcd47473c3d7.png)

外部からのhttpアクセスをすべて許可する（普通は。。。送信元を絞るけど今回は検証のためこれで行く）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/11def8b6-f217-64c4-96cd-84e940b07de7.png)

設定が完了したら再起動

```
systemctl reload squid
```

# ブラウザからプロキシを経由できてるか動作確認
ローカルPCでいつも使ってるEdgeをつかってプロキシを設定する

設定　クリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/edeee3df-b4d9-5516-5a50-afe4eedf6f4c.png)

プロキシサーバを使う　クリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/0888d0ec-705e-0c32-ef47-c00db4d57de7.png)

プロキシサーバーを使うにチェックを入れて
プロキシIPアドレスにsquidをいれたサーバのグローバルIPを入力、
ポートに設定に記載してあった3128を入力して
保存　クリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/55b27291-ed7a-e0e3-93a0-41d94821fef1.png)

これでプロキシ設定完了。

確認くんを使ってちゃんとプロキシを通っているか確認する

https://env.b4iine.net/

結果がこちら。あなたのリモートホストの部分にプロキシサーバのグローバルIPが入っていたら成功！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/2c6ee322-59f2-eeef-a721-19122253cff9.png)
Pythonで「リストを作成する」の動作を確認してみた

# 概要

Pythonで「リストを作成する」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/python/list/index1.html

# 実装

以下のファイルを作成しました。
```sample.py
x = 10
y = 15
numlist = [x, y]
print(numlist)

x = 10
y = 15
numlist = [x, y]
print(numlist)
x = 50
print(numlist)

numlist = [0] * 10
print(numlist)

namellist = ["undefined"] * 5
print(namellist)

numlist = [10, 20, 30] * 3
print(numlist)
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
[10, 15]
[10, 15]
[10, 15]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
['undefined', 'undefined', 'undefined', 'undefined', 'undefined']
[10, 20, 30, 10, 20, 30, 10, 20, 30]
```

# まとめ

何かの役に立てばと。
自衛官からエンジニアへ Elixirから始める Web開発 Part10

この記事は「Elixir Advent Calendar 2023」10日目の記事です
東京にいるけどfukuokaexのYOSUKEです。

普段は 合同会社TheWaggle で教材開発・システム開発・研修講師などマルチに活動してます。

このシリーズでは、文系ですらない、体育会系でも始められるプログラミング学習　というテーマで元自衛官だった僕が
自衛官からエンジニアになってもらいたいという気持ちを込めて、普段は大人しいですが、このコラムシリーズでは、あえて、体育会系のノリで、貴様ら理屈で覚えるなら体で覚えろ！というノリで書いてみたいと思います。

なので、初学者向けですが、理論は後回し、まずは動かして体感しろってノリの第10回目です。

それでは、いくぞ！

## 便利な技を覚える前に、道具（関数）の使い方を覚えよう
前回、```{name, soubi}```に名前と武器をまとめるデータの形を決めた。そう、タプルの中に文字列とマップのデータを収めたものだ。


```elixir
{name, soubi} = 
{ "松浦", 
    %{ 
        "名称" => "20式5.56mm小銃" ,
        "種類" => "小銃" ,
        "製造国" =>  "日本" ,
        "口径" =>	"5.56 mm" ,
        "銃身長" => "330 mm" ,
        "使用弾薬" =>	"89式5.56mm普通弾" , 
        "装弾数" => "30発" ,
        "作動方式" => "ガス圧作動方式" ,
        "全長" =>	"851 mm (銃床最小 779 mm)" ,
        "重量" => "3.5 kg" ,
        "発射速度" =>	"650 – 850発/分" ,
        "有効射程" =>	"500 m以上"
    } 
}
```

これを全部、タプルの中に収めて管理しても良いが、それだと少し面倒だ。
そこで、少し効率よく作業できるように貴様らには```{}```タプルとは別に新たな```[]```リストというものを教えてやろう！

よし、それでは前回タプルで準備した名前のデータをリストに変換しよう。
変換するのに便利な道具がある。今回はそれを教えてやろう。

```elixir
Tuple.to_list（{:ok, :tuple})
[:ok, :tuple]
```

```Tuple.to_list()```という道具だ。使い方は、```()```このカッコの中に```タプル```を入れると```リスト```にしてくれるとい便利なものだ。

```elixir
Tuple.to_list({ "松浦", "橋本", "鈴木", "後藤", "伊藤", "薪", "空", "峰", "桂", "早乙女" })
["松浦", "橋本", "鈴木", "後藤", "伊藤", "薪", "空", "峰", "桂", "早乙女"]
```
このように返してくれる

プログラムには、このように便利な道具が存在する。こいつを使うことで簡単にデータの形を変換することができる。
いいか、貴様らは間違ってもなぜ、こうなるのかは考えるな。まずは使い方を覚えろ。

貴様が銃を撃つときに引き金を引いたら激鉄が雷管を叩いて、銃身の中の溝に沿って回転をして発射するなどの理解を学習するよりも、的に当てる練習をするだろう！

それと同じだ、貴様らはまず理屈を学ぶ前に使い方をマスターしろ。

次回、このリストを使うことで便利にする方法パート２だ。今日はここまで、それでは次回 Part11でまた会おう！
俺にはないよ^_^    ググり力

　　[COLUMN ググり力]

 - 何かの課題を抱えている時に、何が問題でどう調べれば適切な情報にたどり着くのかっていう
    
      ことをしっかり抽象化して自分で考えるのが大事
    
- 闇雲に調べずに、問題点とどう調べれば解決できそうかと仮説を立ててから調べていく

- 検索する際に、何がしたいかが細かく明確になっていれば後は頭の中のしたいことを
    
    　そのままググればいい
    
- 先ずは公式ドキュメントを参照する
    - 公式ドキュメントが出てこなかったり内容が理解できない時のみブログ記事を参照する

- 恐らくはこういう理由でERRORになっているのではないか、ということは
    
       こういうことが出来るとERRORが解消されそうだなと当たりを付けてからググれば良い
    
    - ググったら見出し文(タイトル)を読んで期待している内容が書かれていそうかチェック
        
           してから開く!!
        
- 余りに古い情報はスキップする
【Salesforce認定アドミニストレータ試験】公式模擬試験の英日翻訳と図解解説 (2)

この試験を受けるための勉強をした際に思わぬ苦戦をしたので、英語公式模擬問題を翻訳しながら図解解説として整理しました。

第2回目の投稿です。

第1回目の投稿と類似の問題です。設問の仕方と答えは違うように見えますが基本は同じです。

Aung

〇第2回目の投稿 [Question 2-2]　← 今回の投稿
　　営業プロセスと選択リスト値に関する問題

  ![Q2-2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626902/b48ea0c8-b68e-5b61-a66a-e11648159b0b.jpeg)


〇第1回目の投稿 [Question 2-1]
　　レコードタイプと営業プロセスに関する問題
　　https://qiita.com/Aungz/items/204d20c5c2c72a52c9df
正規表現を学ぶなら、ぜひ、Udemyのこの講座で(^^)

Quiitaを訪問中のエンジニアの皆さんなら、知識ではなく、体感として知っていると思いますが、正規表現を身につける前と後では圧倒的に「できること」の範囲が広がります。むしろ、エンジニアで正規表現を書けないと仕事にならない。。。が現実でしょうか。

今、その流れがマーケターにも来ていると思います。

# マーケターにも正規表現が求められる訳

マーケターにとって正規表現を使える場所が増えてきています。例えば、以下です。
使える場所が増えてきているということは、正規表現を書ける人はどんどん書いて、自分に必要な分析を行い、書けない人は悔しいけれど、涙目。という状況があちこちで起きているってことなんじゃないかと思います。

1. GA4の探索レポートのフィルタ
2. GA4の探索レポートで使えるセグメント
3. Looker Studioの関数
4. Tableau Desktopの関数
5. BigQueryなどのデータベース

特に、5番については、Googleが頑張っているので、Google Search Consoleのデータ、GA4のデータがBigQueryにエクスポートできます。検索クエリ、URL、ページタイトル、参照元などを柔軟に分類するのにSQLの中で使える正規表現を使った関数はものすごくパワフルです。

書けないのはもったいない。マーケターも、正規表現書けたほうがいい。


# 正規表現は「学パ」のよい学習分野

どんなことも学ぶにはコストがかかります。時間や、エネルギー、情熱、教材代などです。
一方、学んだ結果のリターンもあります。
すると、コストとリターンを対比したパフォーマンス、いわば「学習パフォーマンス」とでもいえる概念が成立しうるでしょう。数値ではだせないけれど、どれだけのコストをかけて学べば、どんなリターンがあるのか、、、についての概念的な比率です。

正規表現はその「学パ」が非常に高い学習分野だと思います。

勉強はそんなに大変じゃないけど、身につけばすごくお得。マーケターも、正規表現書けたほうがいい。


# 正規表現を学ぶなら、ぜひ、Udemyのこの講座で

という訳で、マーケターの方にもぜひ、正規表現を学んで欲しいな。と思ってます。で、ここで我田引水的に宣伝しますと、わたし、Udemyで正規表現の講座を持っていまして、自画自賛的ではありますが、その講座が評判よいので、ぜひ、正規表現を学びたいマーケターの方にご紹介したいな。と。

講座はこちらです。

![fe4dc259ad1b5e8490a59102bfd0db9b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552657/d8a53012-39eb-2992-ed5b-fda8f355c1b0.png)

[映画1本分の学習時間で分かる！書ける！ 分析担当者のための正規表現入門](https://www.udemy.com/course/regexp_with_drill/?referralCode=FAE3A96E63B40A80D7C7)
[https://www.udemy.com/course/regexp_with_drill/](https://www.udemy.com/course/regexp_with_drill/?referralCode=FAE3A96E63B40A80D7C7)

理由は以下の2つです。

## ネット上の練習用ツールを使って「手を動かせる」

正規表現は、お題があって、それを解くために手を動かすと身につく。そういった種類の技術です。ということは、勉強するにあたっては、ふんだんに手を動かす講座が望ましいということになります。

わたしのリリースしている講座では、ネット上のTableau Publicを利用して、つまり、PCになんのソフトウェアをインストールすることなしに、演習環境を用意しています。以下がその画面です。

マッチ判定で、　.+　つまり、なんでもよい文字や数字の1回以上の繰り返しを抽出した状態がこちらです。

![d4902315300a2da8e78c0b366befa338.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552657/aafbc84d-04a8-3931-9b8a-7f814aebbee6.png)


一方、「Aで始まる名前」をマッチさせるために、　^A　と記述すると、以下の通り「真」には、Aで始まる名前だけが該当します。

![5a683d51a96be695016053336e579f10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552657/e9ce287d-9330-9b5f-6a1a-21260e834843.png)

『「Aで始まる名前」に該当する氏名の平均文字数は何文字ですか？』　といった形での出題を数多く用意していますので、手を動かして正規表現を学ぶことができます。

## 評判が（お陰様で）よい

以下は12月8日時点での講座別のレビューの評点(5点満点）です。わたしがリリースした10本のUdemyの講座の中で、なんと、もっともレビューの評点の良いのがこの講座なんです。

![10370312efe941ee7b582e5f4a5a2089.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552657/27db40ae-4ebf-a659-c276-3a6b562d266e.png)


正規表現を学びたいという方は、ぜひ、検討してみてください。
Raspberry Pi Pico で 229個の Neopixel を使って、X'masツリーを作った

# とは言っても、シミュレータ`WOKWI`での話です

<br><br>

> シミュレータについては、↓こちらの記事を参照してください。

https://qiita.com/nak435/items/583468cbf79a69c8fb67

<br>

# 実際に動かした動画が↓こちらです

<br>

<iframe width="300" height="356" src="https://www.youtube.com/embed/NS-OafEbtGw?autoplay=1&mute=1&playsinline=1&loop=1&playlist=NS-OafEbtGw" title="X&#39;mas Tree using 229 Neopixels by nak435, 2023" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>　


プロジェクト一式を公開していますので、コードや回路は、`WOKWI`で見てください。

https://wokwi.com/projects/383653870387037185

センスがイマイチなのが残念ですが、
今後、点灯パターンを追加していくかも知れません。
（追加/変更した点灯パターンは、上のリンクから`WOKWI`で動作させて見てください）

<hr>

追伸；
229個のNeopixelの配置と配線は、とても手作業ではやってられませんので、別でデータを生成して、貼り付けました。
k210開発ボードのマシンコードの取得（MaixHubモデルダウンロード用マシンコード取得方法）

# 背景
MaixPyのサンプルアプリケーションである、 [self learning classifier](https://wiki.sipeed.com/soft/maixpy/en/course/ai/image/self_learn_classifier.html)で遊ぶためには、MaixHubのモデルのダウンロードが必要で、そのためには使うハードウェアのマシンコードが必要だったので、取得してみます。

# 環境
- Windows11
- [UnitV AI Camera(OV7740版)](https://www.switch-science.com/products/6996)
- [kflash_gui](https://github.com/sipeed/kflash_gui/releases) v1.8.1


# やり方
[获取MaixPy系列开发板机器码——MaixHub 模型下载机器码获取方法
](https://maixhub.com/share/6)(MaixPyシリーズ開発ボードのマシンコードを取得 - MaixHubモデルダウンロード マシンコード取得方法)を参考に導入していきます。

## 1. kflash_guiをインストール
kflash_guiは、いわゆるマイコンにbin等のファームウェアを書き込むツールです。

[kflash_guiリポジトリのreleases](https://github.com/sipeed/kflash_gui/releases)からインストール
Windowsでしたので、kflash_gui_v1.8.1_windows.7zを選択。


## 2. key_gen.binをダウンロード
key_gen.binは、各ハードウェアからマシンコードを吐くファームウェアです。
[サイト](https://maixhub.com/share/6)のkey_gen.binをクリックすればダウンロードできますが、できないときは、[こちらのサイト](https://dl.sipeed.com/shareURL/MaixHub_Tools)からもダウンロードできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/43f25ee1-f9a8-31c2-8e98-be6c0a5019d6.png)

## 3. key_gen.binの書き込み
kflash_guiを使って、先ほどダウンロードしたバイナリを書き込みます。

マシンコードを読み出すハードウェアをUSBでつなぎます。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/9ba0a8a7-aa13-e118-e3d0-a8ad7fe9b1ff.jpeg">

書き込み先のアドレスは0×00000。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/524cab77-d4c8-964d-0520-280527c977ec.png)

Downloadボタンで書き込めます。
一度書き込むとMaixPy対応ファームを書き直さないとMaixPy IDEで接続できなくなるため注意が必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/aa3e2b54-c955-679a-ee01-7d6ff45fe795.png)

## 4. マシンコードの読み出し
TeraTerm等シリアル通信で読めるツールでマシンコードを読みます
レートは115200、8bit、none、1、noneで接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/8f0eeaf2-c540-4967-770a-2a69dccc9736.png)

読み出すとこのようにマシンコードが出てきます。32文字。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/c8921210-2531-0843-c7c0-3f3f6e58ed5f.png)

## 5. MaixPy対応ファームの復帰
key_gen.binを書き込んだ際に、MaixPyに対応するファームウェアが上書きされているので、書き込み直します

[こちらのリンク](https://dl.sipeed.com/shareURL/MAIX/MaixPy/release/master/maixpy_v0.6.2_85_g23d09fbcc)から、各ハードウェアごとのファームウェアをダウンロード
今回用いたのはUnitVのため、M5StickVのもの（maixpy_v0.6.2_85_g23d09fbcc_m5stickv.bin）
を用います。

上書きするのでアドレスは先ほどと同じく0x00000を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/5623892a-2dd5-6fac-f78a-4f19ac502142.png)

MaixPy IDEで接続可能か確認してください。

## おわりに
中国語の解読難しいかつ、マシンコードの必要なモデルを使うことはあまりないかもしれませんが、かなり苦戦したので、記録として残しておきます。
そもそもモデルのダウンロードに必要なマシンコードってなんだ…？から始まりました。

間違い・質問等あればご質問お願いします。
Visual Studio 2022 を別のドライブに再インストールする方法


## このドキュメントの内容

Visual Studio のインストールには Visual Studio Installer を使用しますが、何らかの理由でインストール情報が破損するとインストールができなくなることがあります。

私の場合、Visual Studio をインストールしていたドライブが破損しました。別のドライブにインストールし直そうとしたのですが、インストール先のドライブを変更できず「ドライブに空き容量がない」というエラーでインストールが失敗してしまう事象に陥りました。レジストリに記録されているインストール情報を変更することによって解決できましたので、事例として共有します。

この内容はマイクロソフトの公式回答に基づくものではありません。同じ処置をされる場合は自己責任でお願いします。

## 発生した事象

* Visual Studio Installer では次のように表示されました。
  * インストール済みリストは空欄。
  * 使用可能リストには Visual Studio 2022 が表示される。
* Visual Studio のインストールに失敗する。
  * 「ドライブに空き容量がない」というエラーで失敗する。
  * インストールウィザードではインストール先のパスは指定できませんでした。ダウンロードキャッシュのパスは変更できましたが、変更しても意味がないようでした。

## 実施したこと

### インストール情報の変更

 レジストリエディタで次のキーの値を変更しました。以前の環境のパスが設定されていましたので、インストールしたいドライブに変更しました。

キー : コンピューター\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\Setup
名前 : CachePath

### Visual Studio のインストール

Visual Studio Installer を起動すると、Visual Studio 2022 がインストール済リストに表示されるようになりました。インストール情報が破損しているからか「セットアップに失敗しました」と表示されていました。

* 削除ボタンを押すとアンインストール処理が実行されました。
* 使用可能リストからインストールを開始すると、インストールウィザードでインストール先のパスを指定できるようになりました。

インストールは正常終了しました。Visual Studio の起動やビルドは特に問題なく行えています。「最近使用したプロジェクトテンプレート」のリストがクリアされていたりしますが、インストール情報が初期化されたためだと思われます。
なんかおかしい時の「バルス」

何も変更を加えていないのに開発環境でエラーが発生し始めた…。
そんな時のおまじないを伝えておきます。

:::note info
package.jsonが更新した時ぐらいしか実行したことがなかったですが、解決方法の検討がなくなった時に利用し案外助けられているので伝えておきます。
:::

## 考えるのをやめて全てを無に返す
下記のコマンドをターミナルで実行してください。

```bash
rm -rf node_modules
rm -f package-lock.json
npm install or yarn install
```

大袈裟に言いましたが、いったん環境にインストールされたものを刷新しましょう。

:::note alert
package.jsonの書き方次第ではプラグインを再インストールすることでマイナーバージョンが変更されます。
そうした場合、さらにエラーが深刻化する場合もあるので注意してください。
直近で入れたプラグインなどが原因だと思われる場合は、3分間考えてからバルスを実行してください。
:::

## まとめ
「バルス」の実行は**最終手段である**ことを念頭に実行してください。
何も検討がつかないと、闇雲に解決策を探して30分以上悩んでしまうぐらいなら…って時の奥義です。

基本的に何かわからんが直った。という状況は全く再現性がなく学びのない状態なので良くないと考えるためです。
ロボコン東海北陸地区大会2023＠鈴鹿B

## はじめに
鈴鹿高専アドベントカレンダー2023の17日目の記事です！
https://qiita.com/advent-calendar/2023/snct

大会の時系列、筆者の感想だけです
詳しいロボットの話は何も書いてないのでロボットについて知りたい人は後日投稿されるAチームの記事見てください

## 筆者
Bチームピットメンバーとして参加
９月ごろまではおばけ（すり抜け）機構とお助け（実際使われなかった）の制御をしていたがいろいろあって実際使われたロボットにはほぼ関わっていない
マネジメントしてた（はず）


## 開催地
石川　金沢工業大学体育館

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031787/0b0e2d59-45c7-b780-d6a7-ad8e25b31b09.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031787/92c1413e-6916-4ad2-debb-a5ab76e02071.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031787/35af97ae-6fe1-4436-08fc-517f3ae60479.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031787/59575fb2-b821-7180-fbab-93ef1fd3e68d.png)


## 1日目（11/27　金）
15:00　学校出発、４コマ目は公欠

　　　　※夕食休憩あり、SAには３回寄った

21:00　ホテル着

ホテルは大浴場つき、近くにコンビニあり
到着したのが遅かったのでコンビニだけ行って寝た

## 2日目（11/28　土）
6:45　朝ごはん
　　　バイキングだった！海鮮丼もあっておいしかった！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031787/10c81d9a-10ae-4f1c-95ca-facd45dacfb7.png)

7:45　ホテル出発

9:00　体育館入場開始
　　　１時間弱くらい待った、雨降ってて寒かった
　　　鈴鹿が２番目くらいだった

10:30　ロボット搬入
　　　鈴鹿のトラックは３番目くらいだった
　　　入場と同じ順番？

10:47　A軽量計測
10:54　B軽量計測
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031787/e9a28e69-f16d-9305-6ae7-03a1a3efd694.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031787/ef1421d7-4c4e-3427-6d31-12570c413cdb.png)

両チーム１発で通った！



11:00～　試走開始、今年はスプレッドシートでスケジュールが見れた↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031787/37ce54cf-70ac-969d-8208-35ddd6eb02f8.png)


12:00　オリエンテーション

13:00　お昼ごはん
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031787/05bddc92-9bfc-d606-9f81-6c5ea4dd7088.png)


14:00　Aテストラン１回目

他チームのテストランを見ててもセンターゾーンまで行けてるところは少なかった
豊田Bの足回りがめっちゃ早くて静かだった

～16:50　試走終了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031787/b103cb4b-1b0d-ac17-30f6-f725e40d885a.png)

19:00　退館

19:30　ホテル着　夜ごはんは自由


## 3日目（11/29　日　大会本番）
7:45　ホテル出発
　　　前日と同じ時間に出発したのについたら最後のほうだった

8:45　再テストラン開始
　　　Bは再テストランの対象

9:30　軽量計測開始、カメラリハーサル開始

カメラリハ、再テストランの影響で試走が５０分くらい遅れてた

11:30　応援団到着


12:30　開会式

Bが第一試合、Aが第六試合

試合前に試走入れたかったけどインタビューとかのせいで時間読めないので無理
鈴鹿試走入れすぎ

15:45　予選リーグ終了、鈴鹿A決勝トーナメントシード

17:30　決勝開始
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031787/b4cf8483-b4c5-5fd2-769a-b969d9f9a236.png)

**三連覇おめでとうございます！！！**

予定の30分遅れくらい
鈴鹿は開催地から遠くトラックの順番が早いため片づけ急がなきゃいけなかったけどどこで片づけしたらいいのか運営側が誰も知らない(？)

結局トラックの中に直接木枠入れてトラック周辺で梱包
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031787/37ca575a-0714-dee3-42c2-57b7d9a40d92.png)

## 4日目
6:50　ホテル出発

12:00過ぎ　学校着
　　　　　※午前中だけ公欠

## 感想
三連覇すごいうれしかった
Aはお助けアイテムが一回不調になってたけど目立ったトラブルはなくてみんな視察しに行ってた
Bは本番1試合目が終わってから試走ゾーンでの調整がうまくいって二試合目で勝てたのうれしかった！！
AB両チームとも2桁の点数とれてよかった


自分にはマネジメントが向いてると思った一年だった
来年はマネジメントメインで制御には関わらない気がする
ゲーム制作に内在する１０の言語

ゲーム作ってると色々な処理系が内在することになります。言語ばかり作ってる気分になるので楽しいのでご紹介します。

1. 画像データは言語だ。
    BMP,PNG,GIF,JPEG等のデータは仕様に従って画像が圧縮されています。エンコーダとデコーダがあるわけですが、パーサとシリアライザに見えちゃいます。
2. 音楽データは言語だ。
    音楽データにはWAVやMP3,OGGなどがありますけど言語ですよね。
    MMLという音楽記述言語もありコンパイラがあったりする。MIDやVGMの音楽演奏データはバイナリな音楽言語に思えます。昔の音楽再生ドライバはバイトコードを実行する仮想マシンに見えます。
3. マップデータは言語だ。
    Tiledというマップエディタを最近使ってますがXMLやJSONでデータが記述されているので好きに操作できて便利です。
4. キャラクターを定義したスプライトも言語だ。
    画像データを組み合わせたキャラクターデータも言語と考えられます。
5. シューティングゲームのキャラ配置は言語だ。
    ２Dのシューティングゲームなどは一定時間がたつと敵が現れます。これは音楽データのようでもありますが、ループして５体を編隊として出したいとか、ランダムに３体出したいとかあるので言語になります。
6. キャラの動きは言語だ。
    BulletMLのようにシューティングゲームのキャラの動きは言語を作れます。
7. ポリゴンのデータも言語だ。
    さまざまなモデリングツールが対応しているデータ形式もまた言語です。
8. GUIも言語だ。
    ボタンの配置やら何やらを配置するデータは言語として定義できます。
9. シーン移動も言語だ。
    デモシーンからタイトルシーンに移動し、ランキング表示シーンに移動する。
    スタートボタンでオプションシーンに移動したり、ゲームシーンにはいる。
    ゲームオーバーになるとゲームオーバーシーンに移行する。クリアするとエンディングシーンに移動する。
    こういったシーン移動も言語定義できます。
10. これらの要素を組み合わせて動かし制御するのももちろんプログラミング言語という言語です。

プログラミング言語処理系を作るノウハウは、汎用的な言語を作らずとも様々なデータを扱う際に生きてきます。
多くの言語はJSONやXMLで定義できるのですがプログラミング言語だけは自由に扱えないのが悔しいと思う今日このごろです。
Juliaの条件分岐について

# はじめに
Juliaの条件分岐についてまとめる
Pythonとは割と違うから意外と楽しいから共有。

# 条件分岐の書き方
Juliaでは条件分岐の書き方が4つある。
それぞれ紹介する。

---

まずはif/elseif/else/endを用いた書き方
```julia
function test1(x,y)
    if x < y
        println("xはyより小さい")
    elseif x > y
        println("xはyより大きい")
    else
        println("xとyは等しい")
    end
end
```
しっかり、if文と関数の最後には`end`を入れること。
これはPythonに似ているのではないだろうか。

---
次は、if文を式として扱う。
実は`if~end`の構文は`if式`と言い、最後に評価した値を変数に格納することができる。
```julia
function test2(x,y)
    result = if x < y
        "xはyより小さい"
    elseif x > y
        "xはyより大きい"
    else
        "xとyは等しい"
    end
    println(result)
end
```
上記の様にif文の値を`result`という変数に格納している。割と使いそう。

---
次は、C言語などにも見られる、三項演算子だ。
条件式が`true`なら式Aの結果を、そうでないなら式Bの結果を返す。というもの。
`if式`と変わらない。

```julia
function test3(x,y)
    result = x < y ? "xはyより小さい" :
    x > y ? "xはyより大きい" : "xとyは等しい"
    println(result)
end
```
?と：の間には必ずスペースを入れること。
三項演算子では条件式をネストすることができる。
ただ、ネストすると横に長くなるので、`:`で改行すると分かりやすくなる。

---
最後に短絡評価を説明する。
returnと組み合わせて、条件を満たしたときに短絡評価によって即その関数を終了させたい場合に使用する。

```julia
function test4(x,y)
    x < y && return "xはyより小さい"
    x > y && return "xはyより大きい"
    "xとyは等しい"
end
```
`&&`と`return`を用いて表現する。
実行速度が速いのか？
よくわからないけど、覚えておいて損はないかな。

# まとめ
今回は条件分岐について紹介した。
今後、繰り返し処理や内包表記などの文法についても勉強してまとめたいと思う。
それでは！！！
接続詞を音で覚えたいので、Azure Speach ServicとPythonで単語リストを雑に読み上げる

# 概要
お恥ずかしながら今更になって接続詞と前置詞を真面目に覚えたいため、Excelにまとめました。
ただ、やはり音声と対で覚えたいし、今後も似たようなシチュエーションが発生することが予見されるため、
Azure Speach Serviceの音声読み上げで改行区切りのテキストを読みだしてみました。

# pythonからAzure SpeachServiceの呼び出し
Microsoft公式リファレンスにサンプルコードは置いてあるためこちらを参考に、音声読み上げ用の関数を作成。
https://learn.microsoft.com/ja-jp/azure/ai-services/speech-service/get-started-text-to-speech?tabs=windows%2Cterminal&pivots=programming-language-python

「speech_config.speech_synthesis_voice_name」で以下の一覧から言語や音声を指定できるため、今回は「en-US-AriaNeural」を指定。
https://learn.microsoft.com/ja-jp/azure/ai-services/speech-service/language-support?tabs=stt

# 改行区切りのテキストをリスト化して順番に読み上げ
次に単語をテキスト化
以下の通りテキストを作成(今回は一部のみ記載)。今回は「part3.txt」とし、プログラムを保存したディレクトリの下に「words/part3.txt」で保存した。
※Excelからコピーすることを想定し、改行区切りとした。

```tex
so
whether
while
even if
if not
whereas
provided that
whether X or Y
in order that
```

続けて以下の通りテキストから読みだした単語でリストを作り、１行ずつ読み上げるリストを作成した。
「fileName」で保管場所を指定、「intervalSecond」で単語読み上げのインターバルを指定した。
※実際はAzureのレスポンスの都合で指定より少し遅くなる。
※textToSpeach(word)は上記のMicrosoft公式ドキュメントに従って記載したものを呼び出し

```python
#読み出し対象のテキストファイル
fileName = r"words\part3.txt"
#発話と発話の間隔
intervalSecond = 0.3

#テキストファイルを改行区切りでリスト化
with open(fileName ,'r') as file:
    wordsList = file.read().strip().split('\n')

#リストの要素ごとに読み上げ
for word in wordsList:
    #単語の読み上げ
    textToSpeach(word)
    #スリープ
    time.sleep(intervalSecond)
```
# 実行
実行すると想定通り音を読み上げた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3639433/9fa45b36-88be-c25b-bca4-ecbae39bb0ae.png)
awkで遊ぶシェル芸オンラインジャッジ【問5まで】

# はじめに
`awk`でシェル芸オンラインジャッジを遊んでみます。今回は問5まで解きます。

# シェル芸オンラインジャッジについて
ウェブサイトのURLはこちら↓

https://shellgei-online-judge.com/

詳しい説明はこちら↓

https://qiita.com/ykpages/items/176bcd6264e248fe9fb8

# 問1：テスト
`test`という文字列を出力します。

```sh
echo | awk '{print "test"}'
```

# 問2：入力テスト
与えられた入力をそのまま出力します。

```sh
awk '{print $0}' input.txt
```

# 問3：改行テスト
1から10までを改行区切りで出力します。

```sh
echo | awk '{for(i=1;i<=10;i++){print i}}'
```

# 問4：足し算
各行の数字の合計値を出力します。

```sh
awk '{sum=0;for(i=1;i<=NF;i++){sum+=$i};print sum}' input.txt
```

# 問5：フィボナッチ数列
フィボナッチ数列の第10項までを出力します。

```sh
echo | awk '{a=0;print a;b=1;print b;for(i=0;i<9;i++){c=a+b;print c;a=b;b=c;}}'
```

# おわりに
`awk`は便利ですね。
MapBoxMapをAndroid、JAVAのみで使ってマーカーで詰まった話

MapBoxMapは便利な地図APIです。

https://qiita.com/ppt_msdg_maas/items/c35c07ec2502e9a2de12

↑MapBoxMapの概要はこれ見てください
GoogleMap APIより体感お手軽に使えるしなんかマップの見た目とかかなりカスタマイズ効くので個人的には特に理由がなければ埋め込みのMapはこれを使うのが良いと思う。

## 記事の内容
MapBoxMapのドキュメントはほぼKotlinで書かれてる。
Kotlinはとても強い言語なのでやはり特に理由がなければJavaよりこちらを使うべきだが、なんかの理由でJavaでAndroidアプリを作らなければならない場合があった場合、公式ドキュメントに書かれているメソッドとかクラスとかが一部うまく動かないので、主に詰まったところをこの記事に書いていく。

## マーカーを打つ
公式ドキュメント：

https://docs.mapbox.com/android/maps/guides/annotations/annotations/

ここにはmapboxmapでマーカーを打つ方法が書かれていて、以下のようなコードでマーカーを追加できるとある。
```kotlin
// Create an instance of the Annotation API and get the PointAnnotationManager.
val annotationApi = mapView?.annotations
val pointAnnotationManager = annotationApi?.createPointAnnotationManager(mapView)
// Set options for the resulting symbol layer.
val pointAnnotationOptions: PointAnnotationOptions = PointAnnotationOptions()
    // Define a geographic coordinate.
    .withPoint(Point.fromLngLat(18.06, 59.31))
    // Specify the bitmap you assigned to the point annotation
    // The bitmap will be added to map style automatically.
    .withIconImage(YOUR_ICON_BITMAP)
// Add the resulting pointAnnotation to the map.
pointAnnotationManager?.create(pointAnnotationOptions)
```

このうち上部のAnnotaionAPIを取得する部分について
```kotlin
val annotationApi = mapView?.annotations
val pointAnnotationManager = annotationApi?.createPointAnnotationManager(mapView)
```
の部分がjavaだと以下のようになります
```java
AnnotationPlugin annotationPlugin = AnnotationPluginImplKt.getAnnotations(mapView);
PointAnnotationManager pointAnnotationManager = PointAnnotationManagerKt.createPointAnnotationManager(annotationPlugin, new AnnotationConfig());
```
Kotlinにおけるクラスのプロパティはget,setと名前につくメソッドとしてjavaに変換される仕様ですが、どうもannotationsのプロパティに対応するgetAnnotationsが使えない様子です。MapBoxmapをjavaで使用するときはこのようにそのままだと取得できないプロパティがいくつかあるため、代わりにAnnotationPluginImplのようなクラスを使用します（KtはKotlinにおいてトップレベルに置かれた関数がjavaに変換される際に付与される文字です）。


短いけど以上
僕が考える最強の言語処理系

1. mixfix演算子を持つ。
    プログラミングしていてASTを扱いたいと思うことは多々あるわけですが、扱いづらいです。LispのS式やXML, JSON のようにプログラミング言語自体をデータとして扱えると嬉しい。Prologはエジンバラ記法と呼ばれる数式でプログラムします。CoqやAgdaで使われている演算子順位法の１種であるmixfix演算子を使うとより自由度が増します。
1. 論理プログラミングができる。
    操作的意味論や型付け規則をきれいに書けると言語を理解するのに便利だから論理プログラミングができるとよいです。
1. 合併型(Untaged Union Type) がある。
    TypeScriptやScala3にあるようなタグレスの合併型は作るのが極めて難しいですが、歴史的に積み上げられた理論で用いられる図式の型システムとなるので大いに意味があります。Elixirの型システムの完成が楽しみですね。
1. 文法定義がそのまま代数的データ型の型定義にもなる。
    数学的なBNFを書けば木文法に対する構文定義であるXML SchemaやJSON Schemaの定義のようになりかつ、代数的データ型による抽象構文木の型定義となる。具象構文＝抽象構文になる。

これらの要件を満たす言語を作れば高レイヤーでの簡潔な言語理解が可能になるので最強な言語となります。

mixfixや論理プログラミング言語は作れるのですが合併型がとにかく難しい。
論理プログラミングの教科書を作らないと理解できる人が少ない状況が続くのが課題です。
Juliaの関数定義（関数適用演算子）

# はじめに
前回の記事の続きです。
割と便利だなと思ったやつです。

https://qiita.com/inoshun/items/2b59062ef5f5cec2f076

# 関数適用演算子
まずJuliaでは範囲オブジェクトの主な書き方として
```julia
1:10

1:2:10
```
があります。
`1:10`は1から10まで1ずつ数えていくという意味ですが、`1:2:10`は1から2飛ばしで10まで数えるという意味となります。つまり、`[1,3,5,7,9]`となるので、出力は`1:2:9`となります。
この範囲オブジェクトの計算を行う際の書き方についてまとめます。

まず以下のような関数があったとします。
```julia
println(sqrt(sum(1:2:20)))  # 10.0
```
1から20までの数字を2飛ばしでsum値を取り、平方根を取った値を出力するという関数ですが、ネストが多く可読性が落ちます。

Juliaではパイプライン演算子と関数合成演算子というものがあり、可読性を上げることができます。

- パイプライン演算子
```julia
1:2:20 |> sum |> sqrt |> plintln   # 10.0
```
`|>`で▶を表現することで、範囲オブジェクトのsum値を取り、平方根を取った値を出力するという左から右へ操作が流れていくことが直感的にわかります。

- 関数合成演算子
```julia
(println ∘ sqrt ∘ sum)(1:2:20)   # 10.0
```
`∘`は`\circ + tab`で入力できます。これは英語のような感じで後ろから処理を実行していきます。

これらを組み合わせることもできます。
```julia
1:2:20 |> sqrt ∘ sum |> println   # 10.0
```
使わなさそう。

途中に無名関数を挟むこともできます。
```julia
1:2:20 |> sum |> (x -> x^2) |> println   # 10000

(println ∘ (x -> x^2) ∘ sum)(1:2:20)   # 10000
```
使うことがあるかは不明。
パイプライン演算子はかなり便利そうだから覚えておこう( ..)φメモメモ

# まとめ
今回は関数適用演算子の使用でした。
Pythonと書き方似てる部分と、全く違う部分あって楽しい。
DX大賞の影での立役者　Power Automate

## 最初に
　この記事はMicrosoft Power Automate Advent Calendar 2023 22日目の記事です。

 https://qiita.com/advent-calendar/2023/powerautomate

## 自己紹介
　佐賀県の小売業（和服）で情シスをしています。

  社内ではPower Automate for Desktop（デスクトップフロー）の開発者が多く、Power Automate（クラウドフロー）の開発者が私しかおらず、増やしたいのだがなかなか増えないのが悩みの種です。



## 内容
社内で取り組んだ事業の一つで、Power Platformを利用した「内製化による業務アプリ作成とデータ分析」が、日本ＤＸ大賞を受賞して、様々なメディアで紹介されたのですが、Power Appsはテレビ・新聞の取材で紹介され、Power BIについても取材の内容で質問・記載があったのですが、Power Automateが裏で動いていたこともあり紹介されることがなく、ＤＸ大賞の影の立役者であるPower Automateの一部を紹介したいと思い記事にしてみました。

 
　
##  イベント等の通知
お客様の誕生日等のイベントについて、チャットに通知を出すことにより、営業社員が常にアプリを開いているわけではなく、大切なお客様のイベントを見過ごす可能性があったため、Power Automateにてイベントが近づく際にチャットに通知を出す仕組みを設けています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2277732/e8fe8acb-e358-1bee-a720-37698c8d63bd.png)


地元テレビ局の営業社員へのインタビューにて、
#### 「毎朝ちょっと見て、そして今月のお客様の誕生日『あっ今日だった！』って思って電話します」
は誕生日通知を見てアクションしており、お客様のサービス向上に役立っています。
 



## LINE友達登録者数の状況通知
ＤＸ事業のひとつで、LINEによるお客様コミュニケーション設計で、LINEの昨日の登録者数と累計での登録者数をマーケティングツールからダウンロード、エクセルで加工しチャットに貼り付けをしていた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2277732/c6c38a5a-92d6-2bdc-43de-6ab639f6f890.png)


Power AutomateにてPower BIのセマンティックモデルから店舗別の昨日友達登録数、累計友達登録数のDAXクエリを発行し、チャットに通知することにより業務効率化を行う。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2277732/9fcd7713-d277-ebbc-2248-ddb5bf73c0d3.png)




## まとめ
テレビ・新聞の取材では、Power Automateを説明するのが難しく使っていないように思われがちですが、Power Automateは影の立役者として活躍しており、ＤＸ事業の裏側を支えています。
rex0220 計算式プラグイン GPTs のプロンプトの書き方

GPTs に要件を伝えて計算式を作成するプロンプトを考えてみます。

# 概要

[rex0220 計算式プラグイン テーブル内商品カテゴリー別番号付与（GPTs版）](https://qiita.com/rex0220/items/2c8e8107d2c23687e069) では、チャットのやり取りで計算式を作成しました。
あらかじめ要件を整理して、一発で満足できる応答を引き出すようなプロンプトを目指して試してみます。

同じプロンプトでも回答内容がかなり異なることがあります。
学習させる資料の順番が変わるのが要因なのか、他にも影響するものがあるのかが不明で、いろいろ試しています。

# 計算式作成用のプロンプト

要件は、出来るだけ詳しく書くと応答内容の精度が上がるようです。
ただし、欲しい計算式に関係ない項目や仕様については記述しない方がよさそう。

変数名やコメントの規則も細かく指定することで、応答の再現性が向上するようです。
注意事項の変数名とコメントの部分は、なかなか応答に反映されなかったので、要望を強調するために指定しています。

# 課題1 テーブル内項目の商品カテゴリー別に番号を付与

## プロンプト

```
# 課題
テーブル内項目の商品カテゴリー別に番号を付与する計算式を教えてください。

# アプリ構成
テーブルに商品カテゴリー、商品カテゴリー別番号、金額を持ちます。

# 商品カテゴリー別番号の採番ルール
商品カテゴリー別番号は、商品カテゴリーと ": " と番号の書式としてください
商品カテゴリー別番号は、1 からの連番でお願いします。

# 変数名のルール
変数名は、日本語で 6文字以内でつけてください

# 計算式コード内コメントのルール
計算式コード内に１行毎にコメントを付けてください
コメントは、「//」で始まり改行までがコメントになります。
各項目の計算式の先頭に、対象の項目名をコメントで入れてください。

# 処理時間を考慮
テーブル全体の処理を行う集計関数については、テーブル外に作業用項目を追加して、効率化を行ってください。

# マークダウン型式で計算式を回答してください。
各項目の計算式は、プラグイン設定でコピペがしやすいようにコードブロックで回答をお願いします。
一つのコードブロックに、各項目の計算式をまとめて、記述してください。
各項目の計算式を記述する順番は、処理の順番に合うように記述してください。

# 注意事項
変数名は、日本語で 6文字以内とします。
コメントは、日本語で 10文字以内とします。
```

## GPTs の応答内容

```計算式.js
// 連結の計算式
TARRAY(商品カテゴリー)

// 商品カテゴリー別番号の計算式
LET(
  分類, 商品カテゴリー,  // 商品カテゴリーの値を分類にセット
  連, SPLIT(連結,","),  // 連結の値を配列に変換
  番号, ROWNO(テーブル),  // 現在の行番号
  前分類, SLICE(連,0,番号),  // 現行より前の行の分類
  分類数, ARRAY_FIL(前分類,x,x=分類),  // 前行までの同じ分類の数
  数, ARRAY_COUNT(分類数)+1,  // 同じ分類の行数 + 1
  分類 & ": " & 数  // 分類と連番を結合
)
```

## 実際の応答画面

![2023-12-10_09h25_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/2f9a9dfe-06fc-6f28-0987-d3593f3fc090.png)

# 課題２　スペース項目にボタンを表示し、ボタンクリックでテーブルをクリア

課題1 のプロンプトをベースにして、要件を変えて問合せてみます。
プロンプトの「変数名のルール」以降は、同じです。
こちらは簡単な処理なのですが、計算式のコメントなども指定したルールに従って、回答してくれました。

## プロンプト

```
# 課題
スペース項目にボタンを表示し、ボタンクリックでテーブルをクリアする計算式を教えてください。

# アプリ構成
テーブルに商品カテゴリー、商品カテゴリー別番号、金額を持ちます。

# 変数名のルール
変数名は、日本語で 6文字以内でつけてください

# 計算式コード内コメントのルール
計算式コード内に１行毎にコメントを付けてください
コメントは、「//」で始まり改行までがコメントになります。
各項目の計算式の先頭に、対象の項目名をコメントで入れてください。

# 処理時間を考慮
テーブル全体の処理を行う集計関数については、テーブル外に作業用項目を追加して、効率化を行ってください。

# マークダウン型式で計算式を回答してください。
各項目の計算式は、プラグイン設定でコピペがしやすいようにコードブロックで回答をお願いします。
一つのコードブロックに、各項目の計算式をまとめて、記述してください。
各項目の計算式を記述する順番は、処理の順番に合うように記述してください。

# 注意事項
変数名は、日本語で 6文字以内とします。
コメントは、日本語で 10文字以内とします。
```

## GPTs の応答内容

```計算式.js
// スペース項目の計算式
BUTTON(
  "テーブルクリア", // ボタンのラベル
  FSET(テーブル, ARRAY("","[]")) // テーブルをクリアする処理
)
```

## 実際の応答画面

![2023-12-10_09h40_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/fb7bea43-be49-07d6-c4a9-6275e57e16e9.png)

# プロンプトの共通部分を学習させるのに失敗中

計算式を回答する場合のルールを、GPTs に学習させて、プロンプトの記述を要件だけにしたい。
プロントの「変数名のルール」意向を、Instructions や Knowledge に乗せてみて、プロンプトを要件だけにしてみたが、効果が出ていない。
しばらくは、試行錯誤が必要です。
【Python】配列内の最小要素の最小 index を取得する

最小要素の最左 index がほしいことがあります。

# 任意配列の場合のコード
```py
a = [3, 1, 4, 1, 5]

A = [(a[i], i) for i in range(len(a))]
print(min(A)[1])
```

(値, index) のタプルにすることで、値最小のうち index 最小のものが選択されます。

# 自然数配列の場合のコード
```py
a = [3, 1, 4, 1, 5]

BASE = 10 ** 6
A = [a[i] * BASE + i for i in range(len(a))]
print(min(A) % BASE)
```

十分大きな値で乗じてから index を足しておくと、除算で index が取れるようになります。

## 応用
セグメント木にタプルを載せると遅いし、`min` を改造するのも遅い…… というときに使えます。ただの配列操作で大きな恩恵はありませんが、高度なデータ構造に載せる際に恩恵が得られます。

# おわり
初心者向け！
初めてDockerを触る人が受講すべき講座

# はじめに
私は現在、IT就活中の大学院生です。
就活を始める前に、Dockerを勉強したのですが、その際に役に立った講座を紹介します。

# Dockerとは
Dockerは、コンテナ型の仮想環境を作成、配布、実行するためのプラットフォームとなっています。近年のアプリ開発では、よく使われるプラットフォームとなっております。

# なぜ勉強しようと思ったのか
自分は、情報系の大学に通っていますが、その当時までDockerを使用したことがありませんでした。就活を始める前に、様々な会社を調べる中で、Dockerを使用しているケースが多いことがわかり、就活前に身に着けようと思い、勉強するに至りました。


# 勉強法
勉強法として**Udemy**を使用し、効率的な勉強を図りました。

今回使用したのは、
**Linux とネットワークの基礎から学ぶ Docker 入門**
（下記URL）
[Linux とネットワークの基礎から学ぶ Docker 入門](https://www.udemy.com/course/docker-from-linux-and-networking/)
の講座を使用しました。

# 結果

本講座の中では、実際のアプリケーション開発を通し、Dockerの使用法について紹介し、概要を掴みながら講座を進めていき、一通りの理解を行えるようになりました。

ある程度アプリ開発をしたことがある人なら、素早く理解できるので、ぜひ講座を使って学んでみてください
【PostgreSQL】トランザクションについて

## 初めに
データベースを利用するならトランザクションについての理解が必要不可欠。
今回はそんなトランザクションについてまとめていきます。

## トランザクションとは
- トランザクションは、データベース操作の処理単位。
- 複数の操作を一つのグループとして扱い、全てが成功するか、全てが失敗するかの「全て成功、または無し」の性質を持つ。
- データの整合性と安全性を保つ。

## トランザクションの特徴
1. ACID特性
   - 原子性(Atomicity)
トランザクション内の全ての操作が完全に実行されるか、全く実行されないかのどちらかです。
   - 一貫性(Consistency)
トランザクションはデータベースの一貫性を保った状態で完了します。
   - 隔離性(Isolation)
同時に実行される複数のトランザクションが互いに干渉しないようにします。
   - 耐久性(Durability)
トランザクションが完了したら、その結果はシステム障害にも耐える形で永続化されます。

2. トランザクションの制御
   - `BEGIN`でトランザクションを開始し、`COMMIT`で確定、`ROLLBACK`で取り消しを行います。
   - 隔離レベルを設定して、トランザクション間の可視性や影響を制御できます。

3. ロック
   - データの整合性を保つために、ロックを用いてデータへの同時アクセスを制御します。
   - ロックの種類やレベルに応じて、異なる振る舞いがあります。

## トランザクションの分離レベルについて
トランザクションが他のトランザクションからどの程度「隔離」されるかを決定する重要な設定。
トランザクションの分離レベルが弱い場合には、ダーティリードや反復不能読み取り、ファントムリードといった影響が発生する。
PostgreSQLでは以下の分離レベルを指定できる。
1. Read Uncommitted
このレベルでは、他のトランザクションがまだコミットしていない変更を見ることができる（ダーティリード）。
ただし、PostgreSQLでは実際にはこのレベルは「Read Committed」と同じ振る舞いをします。

2. Read Committed (デフォルト)
トランザクションは、自分が開始された時点でコミットされているデータのみを見ることができます。
他のトランザクションによる変更がコミットされると、それらの変更が見えるようになります。
これにより、ノンリピータブルリード（同じクエリが異なる結果を返す）は発生する可能性があります。

3. Repeatable Read
トランザクションは、自分が開始された時点のデータのスナップショットを見ます。
これにより、同じクエリはトランザクション中常に同じ結果を返します（ノンリピータブルリードを防止）。
しかし、ファントムリード（他のトランザクションによって新たに追加または削除された行が見えること）は発生する可能性があります。

4. Serializable
最も厳格な分離レベルで、トランザクションが他のトランザクションから完全に隔離されます。
他のトランザクションの影響を一切受けず、データベースに対する一連のトランザクションが逐次的に実行されたかのような振る舞いをします。
ファントムリードも防止されますが、このレベルではパフォーマンスの低下やロック競合が発生しやすくなる可能性があります。

### まとめ
- トランザクションは、データベースの信頼性と整合性を保つために必要。
- PostgreSQLでは、これらの概念がしっかりと実装されており、安全かつ効率的なデータ操作を可能。
Amazon Bedrockの料金をわかりやすく一つの表にまとめました

本記事は [Amazon Bedrock Advent Calendar 2023 by ナレコム](https://qiita.com/advent-calendar/2023/bedrock-knowledgecommunication) の9日目の記事です。

Amazon Bedrock Advent Calendar 2023 by ナレコム ではAmazon Bedrockの基本的な概要から具体的な各モデルの作り方や事例紹介などを行っていきます。

### はじめに
本記事は「Amazon Bedrock Advent Calendar 2023 by ナレコム」の一環として、AIの世界で重要な要素の一つであるコストに焦点を当てた内容をお届けします。公式サイトでも日本語と英語で情報量が違ったり、一部リージョンで金額が間違っていると思われる部分があるため、1つの表で比較できるようにまとめました。
AIモデルの選択において、性能だけでなく、コスト効率も重要な判断基準です。この記事では、Amazon Bedrockの主要プロバイダーが提供するテキスト、埋め込み（Embedding）、画像モデルの料金を比較し、読者の皆さんが最適な選択を行えるように支援します。さまざまなモデルの料金構造を詳細に解析し、それぞれの特徴とコストパフォーマンスを検討していきましょう。

### テキストモデル

プロバイダー|モデル名|入力トークン 1000 個の料金|出力トークン 1000 個の料金
-|-|-|-
AI21 Labs|Jurassic-2 Mid|0.0125 USD|0.0125 USD
AI21 Labs|Jurassic-2 Ultra|0.0188 USD|0.0188 USD
Amazon(N.Virginia)|Titan Text – Lite|0.0003 USD|0.0004 USD
Amazon(N.Virginia)|Titan Text – Express|0.0008 USD|0.0016 USD
Amazon(Tokyo)|Titan Text – Lite|0.0003 USD|0.0004 USD
Amazon(Tokyo)|Titan Text – Express|0.0013 USD|0.0017 USD
Anthropic(N.Virginia)|Claude Instant|0.00163 USD|0.00551 USD
Anthropic(N.Virginia)|Claude|0.00800 USD|0.02400 USD
Anthropic(Tokyo)|Claude Instant|0.00223 USD|0.00755 USD
Anthropic(Tokyo)|Claude|0.01102 USD|0.03268 USD
Cohere|Command|0.0015 USD|0.0020 USD
Cohere|Command – Light|0.0003 USD|0.0006 USD
Meta|Llama 2 チャット (13B)|0.00075 USD|0.001 USD
Meta|Llama 2 チャット (70B)|0.00195 USD|0.00256 USD

### Embedding（埋め込み）モデル

プロバイダー|モデル名|入力トークン 1000 個の料金|出力トークン 1000 個の料金
-|-|-|-
Amazon|Titan Embeddings|0.0001 USD|該当なし
Cohere|Embed – English|0.0001 USD|該当なし
Cohere|Embed – Multilingual|0.0001 USD|該当なし

### 画像モデル

プロバイダー|モデル名|画像解像度|標準品質(画像あたり)|高品質(画像あたり)
-|-|-|-|-
Amazon|Titan Image Generator|512X512|0.008 USD|0.01 USD
Amazon|Titan Image Generator|1024X1024|0.01 USD|0.012 USD
Stability AI|SDXL0.8|512x512 またはそれ以下|0.018 USD|0.036 USD
Stability AI|SDXL0.8|512x512 超え|0.036 USD|0.072 USD
Stability AI|SDXL 1.0|Up to 1024 x 1024|0.04 USD|0.08 USD

### まとめ
この記事では、AIモデルのコスト効率を重視し、Amazon Bedrockを含む複数のプロバイダーが提供するテキスト、埋め込み、画像モデルの料金を比較しました。各モデルの料金体系が詳細に分析され、利用者がニーズに応じて適切なモデルを選択できるようになっています。テキストモデル、埋め込みモデル、画像モデルの料金構造が明確にされ、よりインフォームドな選択をするための参考にしてください。

※正しい料金は公式の料金表をご確認お願いします。

https://aws.amazon.com/jp/bedrock/pricing/

---

また、ナレッジコミュニケーションでは  **「[Musubite](https://recruiting.musubite-job.com/features/company/knowledge-communication)」** というエンジニア同士のカジュアルトークサービスを利用しています！この記事にあるような生成AI 技術を使ったプロジェクトに携わるメンバーと直接話せるサービスですので興味がある方は是非利用を検討してください！

https://recruiting.musubite-job.com/features/company/knowledge-communication
Juliaの関数の定義

# はじめに
Juliaの関数の定義の仕方について

# 定義の仕方
Pythonの様に`def`の代わりに`function`を使用して書く。
```julia
function add(x,y)
    x + y
end
```

または、数学の様に`f(x)=`の形で書く。
```julia
f(x) = x^2 + 2x + 1
```
かなり直感的。しかも乗数を`^`で表すことができるのでわかりやすい。

ちなみに上の2つの関数はそれぞれ
```julia
add(x,y) = x + y

function f(x)
    x^2 + 2x + 1
end
```
と意味は同じ。

他の関数の定義はざっくり書いていく。

- 無名関数
```julia
x -> x^2 + x + 1
# 使用例
map(x -> x^2 + x + 1, 1:10)
```
名前を付けずに使用する関数。おそらくPythonのLambda関数のようなもの。

- 多重定義
```julia
add(x,y,z) = x + y + z

add(1,2,3)   # 6
add(1,2)   # 3
```
ちょっと混乱するが、`methods(add)`を実行すると以下のような出力になる。
```julia
methods(add)

・add(x, y) in Main
・add(x, y, z) in Main
```
つまり、有効となりうる関数を1つの関数定義で複数個持たせることができるみたいです。

- 可変長引数
```julia
function add(x,y,z...)
    add(x + y, z...)
end
```
このように仮引数を指定すると、関数の引数はいくつ入れても実行できます。例えば、`add(1,2,3,4,5,6)`であれば出力は21となります。

- オプショナル引数/キーワード引数
```julia
f2(x, y=1, z=0) = x + y + z

f3(x; y=1, z=0) = x + y + z
```
yとzの初期値を指定していますが、別の引数を取ればちゃんとそっちで計算してくれます。
これらの定義の違いはキーワード引数の場合、引数列の途中にセミコロンがあり、それ以降に指定した引数（通常オプショナル引数のように初期値を伴う）がキーワードになるだけです。
よくわかってないです。

- 型アノテーション
```julia
function addint(x::Integer, y::Integer)::Int
    x + y
end
```
引数の型と戻り値にも型を指定してます。
C言語などの静的言語みたいな書き方？なのかな？
Juliaは動的でありながらコンパイルを行うので、型指定をしておくことで、バグを減らし安全性を高めることができます。
多重ディスパッチ？を有効活用したいときに使用するみたいです。
ただ、「**関数定義時に下手にアノテーションをつける必要はない**」です。

# まとめ
関数適用演算子については別の記事でまとめます。
それでは！！！
Laravelで動く設計支援ライブラリを作ってみた


## はじめに

みなさん，こんにちは。
ご覧いただきありがとうございます。

突然ですが，皆さんは設計をする際にどのようなツールを使っていますか？
私は主にMarkdownやExcelを使っています。

Markdownはシンプルで書きやすいく，Gitで管理はできますが，設計をするには少し不便です。
Excelは使い慣れているので設計で必要な表をまとめたテンプレートを作成しており，設計はしやすいです。ただ，Gitで管理するのは難しいです。

そこでLaravelで動く設計支援ライブラリを作ってみました。

## 設計支援ライブラリの目標

普段の開発はLaravelを用いているため，設計支援ライブラリもLaravelで動くものが良いと考えました。
1つのリポジトリでオールインワンを目指した形です。

開発において，開発工数を抑えるため，バックエンドはすべてLaravelに頼る形で，フロントエンドはVite＋React.js(TS)を用いています。
また，設計支援ライブラリの構成は普段私が使っているExcelをパッケージに落とし込む形です。

## 設計支援ライブラリの構成

設計支援ライブラリは以下の機能を含んでいます。

- プロジェクトの管理：プロジェクトごとに設計ができます。
- テーブル関連：テーブルの設計（カラム名や型等）ができます。
- 機能関連：機能の一覧を作成できます。
- 画面関連：画面の一覧を作成できます。
- 例外関連：例外の一覧を作成できます。
- フォーム関連：フォームの設計（項目名やフォーム種類等）ができます。

## 設計支援ライブラリの使い方

### インストール

設計支援ライブラリを導入したいLaravelプロジェクトは作成されていることを前提とします。

以下のコマンドでインストールできます。

```bash
composer require ikepu-tp/laravel-designer-helper --dev
```

### 設定

以下のコマンドで設定ファイルを作成してください。

```bash
php artisan vendor:publish --tag=DesignerHelper-config
```

### 設定項目

| 設定項目キー     | デフォルト値                                                             | 説明                                                                                                                        |
| ---------------- | ------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------- |
| `connection`     | `mysql`                                                                  | データベースの接続名を指定します。ここで指定できる値は`database.connections`で設定されている値です。                        |
| `middleware`     | `\ikepu_tp\DesignerHelper\app\Http\Middleware\DesignerMiddleware::class` | 設計支援ライブラリのミドルウェアを指定します。 デフォルトのミドルウェアは開発orテスト環境のみ利用できるようになっています。 |
| `api_middleware` | `api`                                                                    | 設計支援ライブラリのAPIのミドルウェアを指定します。                                                                         |
| `web_middleware` | `web`，`auth:web`                                                        | 設計支援ライブラリのAPIのミドルウェアを指定します。                                                                         |

### マイグレーション

以下のコマンドでマイグレーションを実行してください。

```bash
php artisan migrate
```

:::note warn
マイグレーション実行前に`config/designer-helper.php`の`connection`を設定してください。
:::

これで使える状態になっています！
プロジェクト管理機能があるため，設計用のリポジトリを作成し，全てのプロジェクトの設計を管理することもできます。

## 今後の開発計画

以下の機能の追加を考えています。

- エクスポート・インポート機能：現在のライブラリはデータベースのデータ共有が必要ですが，エクスポート・インポート機能を追加することで，データベースのデータ共有が不要になります。JSON形式でファイルを作成し，Git管理ができるようにすることを考えています。
- コマンド実行機能：現在のライブラリは設計までですが，設計内容をもとに`artisan`コマンドを実行できるようにしたいと考えております。これが実現すれば例えば必要なモデルやマイグレーションファイルは簡単に作成され，コーディングのみとなります。

## 最後に

最後までご覧いただきありがとうございます。
この設計支援ライブラリは使える状態にはなりましたが，まだまだ開発段階であり，皆様からのご意見やご要望をお待ちしております。
是非ともご利用いただき，忌憚のないご意見を頂戴できれば幸いです。
また，プルリクやイシューの作成も大歓迎です！！
PostgreSQLで「連番に穴が空いているから詰めて」という依頼に応える方法

# 導入
今回の話題は業務システムではよくある「連番に穴が空いているから詰めてほしい」という依頼にSQLで応える方法です。

:::note info
※ 私が株式会社愛宕 Advent Calendar 2023に書く記事は主に社内向けに共有しておきたいけど勉強会をするまでもないちょっとしたTipsにしたいと思います。
:::

例えば、`items`テーブルのid=1〜99の次が150〜180となっているときにid=150〜180を100〜130に移動させることで連番に穴がないようにしたいとします。 普通に移動するなら、

```sql
UPDATE items SET id = id - 50;
```

でOKですが、items.idに外部キー制約がついているとこれができません。
こんな場合にどうするかという問題です。

# 解決
移動したいデータだけが含まれたテンポラリテーブルを作って対応します。
テンポラリテーブルには外部キー制約がついていないので自由にidを更新できます。

```sql
CREATE TEMPORARY TABLE tmp_items as SELECT * FROM items where id between 150 and 180;
UPDATE tmp_items SET id = id - 50;
INSERT INTO items SELECT * FROM tmp_items;
-- ここで制約がついてるテーブルの外部キー更新
DELETE FROM items WHERE id between 150 and 180;
```
[Python]数字を扱うときの型の注意（整数型，文字列型）

# 本記事の概要
本記事は数字を扱うときに整数型，文字列型どっちで扱うのかを注意しない自分が困りますよという内容です．

## 早めの結論
1. ソート順が異なります
1. 言語によって等価演算の扱いが異なります

## 注意1: ソート順

```Python
# リスト
int_list = [i for i in range(20)] # 整数型のリスト
str_list = [str(s) for s in range(20)] # 文字列型のリスト

# ソート
int_list = sorted(int_list)
str_list = sorted(str_list)
```

ソート順確認
```Python
print(int_list)
print(str_list)

# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
# ['0', '1', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '2', '3', '4', '5', '6', '7', '8', '9']
```

上記の通り，文字列型の場合は「1」の後に「10」が来ます．
文字列の比較は，先頭から見比べて，等価の場合は次の文字を比較です．
具体例はこちらです．

```Python
print(max(110, 11)) # 110
print(max('110', '11')) # '110' (2文字目まで等価で，3文字目が'0'と''なので)

print(max(110, 13)) # 110
print(max('110', '13')) # '13' (1文字目まで等価で，2文字目が'1'と'3'なので)
```


このように，ソート順が異なるので型を誤ると意図しない挙動になります．注意が必要です．

### ゼロパディング
先ほど見たように，数値型と数字文字列ではソート順が異なりました．
でも数字文字列で扱いたいし，ソート順も数値型と同じになって欲しい事もあります．
そこでゼロパディング（0 埋め）です．
「'1'」を「'001'」のように扱います．
それによってソート順が数値型と同じになります．
では具体例を見てみましょう．
下記では`zfill(3)`で 3 桁数になるように 0 埋めしています．

```Python
# リスト
str_list = [str(s) for s in range(20)] # 文字列型のリスト
str_zfill_list = [str(s).zfill(3) for s in range(20)] # 文字列型のリスト（ゼロパディング）

# ソート
str_list = sorted(str_list)
str_zfill_list = sorted(str_zfill_list)
```

ソート順確認

```
['0', '1', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '2', '3', '4', '5', '6', '7', '8', '9']
['000', '001', '002', '003', '004', '005', '006', '007', '008', '009', '010', '011', '012', '013', '014', '015', '016', '017', '018', '019']
```


## 注意2: 等価演算
Pythonの等価演算は以下の挙動になります．

```Python
print(1 == '1') # False
```

ここでJavaScriptの挙動を見てみましょう．

```javascript
console.log(1 == '1'); // true
console.log(1 === '1'); // false
```

上記のように，言語によって整数型と文字列型を「=
=」演算子で比較したときの挙動が異なります．
注意しましょう．
Juliaの包含演算子について

# はじめに
Juliaの勉強を進めていると、Pythonでは馴染みのない包含演算子というものがあるみたいで、演算子の入力が少し特殊だったのでまとめます。

また、Juliaは以下書籍を用いて勉強しています。

https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5Julia%E5%85%A5%E9%96%80-%E5%BE%8C%E8%97%A4-%E4%BF%8A%E4%BB%8B/dp/4297133504/ref=mp_s_a_1_3?adgrpid=152404614144&hvadid=658754969234&hvdev=m&hvlocphy=1009363&hvnetw=g&hvqmt=e&hvrand=12258130558018532528&hvtargid=kwd-1944246447987&hydadcr=17643_13601326&keywords=%E5%AE%9F%E8%B7%B5julia%E5%85%A5%E9%96%80&linkCode=plm&qid=1702255747&sr=8-3


# 包含演算子について
高校数学で習う、属するとか部分集合とかそのあたりの記号のことです（∋とか⊇など）。
この記号をJuliaではコード内に用いることが可能なんですが、どうやって打つの？？？ということでまとめます。

# 包含演算子の入力
- ∈：\in + tab
- ∉ ：\notin + tab
- ∋：\ni  + tab
- ∌ ：\nni  + tab
- ⊆：\subseteq  + tab
- ⊇：\supseteq  + tab
- ⊈：\nsubseteq  + tab
- ⊉：\nsupseteq  + tab    
- ⊊：\subsetneq  + tab 
- ⊋：\supsetneq  + tab

# まとめ
いつか使うだろう。多分
Web ブラウザ Arc と便利そうなショートカットの紹介

## この記事何？

Arc という便利な Web ブラウザの簡単な紹介と、便利なキーボードショートカットをまとめた記事です。

## Arc って何？

Arc は The Browser Company という会社が作った Web ブラウザです。

Google Chrome に使われている chronium というエンジンを使っているため、現在 Chrome を使われている方であればブックマークなどの設定引き継ぎも行えます。

https://arc.net/

私は長い間 Chrome ユーザーだったのですが、使用感が良かったので今は Arc をメインで使ってます。

2023年12月時点では Mac 版しかないようですが、Windows 版も随時開発中とのことです。

## どうやって導入するの？

下記の Gigazine の記事が分かりやすいです。

[Gigazine: 「ウェブの世界のOSを目指す」という壮大な目的で作成されたブラウザ「Arc」レビュー、使いやすい機能がてんこもりでサクサク快適にブラウジング可能](https://gigazine.net/news/20230727-arc-web-browser/)

## どんなポイントが魅力なの？

2点あります。
紹介のために SS 撮ってみました（雑でごめんなさい）

![Arc_ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193606/030b7bcb-94ed-e438-a1cc-7d16cebe4b14.png)

### 1. お気に入り機能

好きな Web サイトを置いておけます。
パッと開けて便利。

### 2. タブが縦型に溜まり、かつスクロール可能

**一番嬉しいのこれです。**


何か調べごとやネットサーフィンしていて「このページ一応開いとくか」「これ気になってたんだよな」と本能の赴くままにタブ開いてたら、いつの間にかタブが細切れになりすぎて何のページ開いてるか分からなくなることありませんか？

![chrome_komagire.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193606/c5be56e7-1a6c-0a70-fc95-d219c99d8444.png)

こんな感じです。

私はしょっちゅうやってしまい、「このウインドウで開いてるページもう用済みだっけ？」「さっき開いてたページ左から何番目だ？」と翻弄され困っていました…

Arc だと、こんな特徴があるので解消されます。快適です
・タブが縦型
・スクロール可能
・**特定期間が経過したタブは自動で消される！** 

ちなみに、この特定期間は自分で選べます（私は7日にしてます）

### 他におすすめなポイントある？


あとは @leo_rkc さんの以下記事が分かりやすくとても参考になります。
（勝手にご紹介してしまい恐縮です）

https://qiita.com/leo_rkc/items/7db010933f2af8437285

## 便利そうなショートカットメモ

よく使いそうなショートカットキーをまとめてみました。

### タブ切り替え

タブ切り替え:`Control + Tabキー`
（デフォだと直近でアクティブになったタブを5つまで表示されます）

タブを上に移動: `⌘(Command) + ⌥(Option) + ▲(上矢印キー)`
タブを下に移動: `⌘(Command) + ⌥(Option) + ▼(下矢印キー)`

タブの上下移動は `お気に入り` と `普通に開いてるタブ` の間も移動できます。

### スペース移動
次のスペースに移動: `⌘(Command) + ⌥(Option) + ▶︎(右矢印キー)`
前のスペースに移動: `⌘(Command) + ⌥(Option) + ◀︎(左矢印キー)`

スペースはプロフィールやユーザーみたいな感じです。

### その他

サイドバーを隠す/表示: `⌘(Command) + S`
ツールバーを隠す/表示: `Shift ⌘(Command) + D`

ページプレビュー表示: `Shift + クリック`

コマンドパレット表示: `⌘(Command) + T`


## おわりに

以上です。便利なのでぜひ使ってみてください！
素敵な Web ブラウジングライフを〜
例外処理（try-except）を活用しよう

## はじめに
Pythonの例外処理（try-except）について，簡単に紹介します．

## 基本構文
Pythonの例外処理の基本として，try-exceptがあります．

例として，ゼロ除算実行時に発生する```ZeroDivisionError```のケースについて説明します．
ゼロ除算を実行すると以下のようなエラーが発生します．
```python
print(1 / 0)
# ZeroDivisionError: division by zero
```

この例外を捕捉するには次のように記述します．

```python
try:
    print(1 / 0)
except ZeroDivisionError:
    print('Error')
# Error
```

```"except 例外名"```は```try```節内で例外名のエラーが発生した場合，```try```節のコードを中断し```except```節内のコードを実行します．
さらに，```except 例外名 as 変数名```とすると，変数に例外オブジェクトを格納して使用できます．例外オブジェクトはエラーメッセージなどが格納されており，エラーの内容を確認できます．
```python
try:
    print(1 / 0)
except ZeroDivisionError as e:
    print(e)
    print(type(e))
# division by zero
# <class 'ZeroDivisionError'>
```

基底クラスを指定しても捕捉することができます．例えば，```ZeroDivisionError```の基底クラスは```ArithmeticError```．変数には実際に発生した派生クラスの例外オブジェクトが格納されます．
```python
try:
    print(1 / 0)
except ArithmeticError as e:
    print(e)
    print(type(e))
# division by zero
# <class 'ZeroDivisionError'>
```

### 複数の例外に異なる処理を実行
複数の例外を捕捉し，それぞれ異なる処理を行いたい場合は，```except```を例外ごとに設定します．
```python
def divide(a, b):
    try:
        print(a / b)
    except ZeroDivisionError as e:
        print('catch ZeroDivisionError:', e)
    except TypeError as e:
        print('catch TypeError:', e)

divide(1, 0)
# catch ZeroDivisionError: division by zero

divide('a', 'b')
# catch TypeError: unsupported operand type(s) for /: 'str' and 'str'
```

### 複数の例外に同じ処理を実行
タプルで例外名を指定することで，1つの```except```節で複数の例外を捕捉することができます．
```python
def divide(a, b):
    try:
        print(a / b)
    except (ZeroDivisionError, TypeError) as e:
        print(e)

divide(1, 0)
# division by zero

divide('a', 'b')
# unsupported operand type(s) for /: 'str' and 'str'
```

### すべての例外を捕捉し，同じ処理を実行
全ての例外を捕捉したい場合は，例外名を指定せずに記述します．
```python
try:
    print(1 / 0)
except:
    print('Error')
# Error
```
複数の```except```がある場合は，最後の```except```節のみ例外名を省略できます．（```if```文で言う```elif```と'''else'''みたいな）

## 正常終了時の処理 : else
```try```節で例外が発生せず終了したあとに行う処理を，```else```節に指定できます．
```python
def divide(a, b):
    try:
        print(a / b)
    except ZeroDivisionError as e:
        print('catch ZeroDivisionError:', e)
    else:
        print('finish (no error)')

divide(1, 2)
# 0.5
# finish (no error)

divide(1, 0)
# catch ZeroDivisionError: division by zero
```

## 終了時に常に行う処理 : finally
例外の発生によらず，必ず最後に行う処理を```finally```節に指定できます．
```python
def divide(a, b):
    try:
        print(a / b)
    except ZeroDivisionError as e:
        print('catch ZeroDivisionError:', e)
    finally:
        print('all finish')

divide(1, 2)
# 0.5
# all finish

divide(1, 0)
# catch ZeroDivisionError: division by zero
# all finish
```

## まとめ
- ```except 例外名``` : 特定の例外を捕捉
- ```except 例外名 as 変数名``` : 変数に例外オブジェクトを格納
- ```except```は複数設定可
- ```except```に例外名を指定しない場合，すべての例外を捕捉

```python
try:
    print(1 / 0)
except: # tryで例外が発生した場合
    print('Error')
else: # tryで例外が発生しなかった場合
    print('finish (no error)')
finally: # 例外の発生に関わらず必ず実行
    print('all finish')
```

## 参考文献
- [Pythonの例外処理（try, except, else, finally）](https://note.nkmk.me/python-try-except-else-finally/#try-except)