OmniAICreator/Qiita-1.07M huggingface dataset:
過去の自分が行った、Google Drive への自動保存設定を見つける



Gmail に届く特定の添付ファイル（pdf）を Google Drive に自動保存する仕組みを導入済。

ある日、自動保存の条件を変更しようと思ったのですが…
GAS ？ IFTTT？ どうやって実装したんだっけ…。　となったので、その確認方法です。

# Google Apps Script の一覧を確認

作成したGASの一覧から、各スクリプトを確認します。
私の場合は、該当のスクリプトがありませんでした。

https://script.google.com/home

# Googleへアクセス許可がある他社サービスの確認

別のサービスで設定した可能性を考えます。

Googleアカウント > セキュリティ > サードパーティ製のアプリとサービス から
Gmail や Google Drive にアクセス権を持つ サードパーティ製サービスを確認します。

https://myaccount.google.com/connections

私の環境では「Microsoft Power Platform」に
Gmail と Google Drive のアクセス権が付与されていることがわかりました。
![スクリーンショット 2023-09-04 18.53.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/b1f9e381-0968-1c2b-8517-c5262b8fc4e3.png)



<a id="#Chapter2"></a>
# Microsoft Power Automate を確認

「Microsoft Power Platform」というサービス名を元に、自動化サービスである
Microsoft Power Automate というサービスにサインインしてみると…

https://powerautomate.microsoft.com/ja-jp/

ありました！
![スクリーンショット 2023-09-04 18.56.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979767/90d50325-7d94-2a9e-2554-aa2bffede425.png)

# 最後に

事前にIFTTT や PowerAutomate も確認していたのですが
普段使っていないMicrosoftアカウントだったため、長らくの間見つけられませんでした。
Googleアカウントのアクセス権設定から行けばよかったんですね…
ついでに、googleへのアクセス権限を付与しているサービスで
使っていないものがあれば削除しておきましょう。

そもそも自分で作成した自動化の設定を忘れないようにしないと…



---
自身の名前のドメインを取得し、S3バケットで
各種SNSへのリンクページを公開しています。
エンジニアの卵として情報発信していければ、と思っておりますので
よければX（旧Twiter）のフォローお願いします。

https://naokichigyoza.com
PowerAutomateの選択アクション「マップ」欄に貼り付けた値がシリアライズされてしまう

PowerAutomateで「選択」（select）アクションを利用していると、稀に、「マップ」欄の値列（右側の列）にオブジェクト型のデータを記述しなくてはならないことがあります。
今回はこの「マップ」欄のオブジェクト型データの扱いに関する不具合のお話。
チームメンバーの方からの相談で気がついた問題です。

# Problem

選択アクション「マップ」欄に貼り付けたオブジェクトの値がシリアライズされてしまう。

例えば、以下のような設定が施された選択アクションがあったとする：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/2a559960-8cee-36cf-b571-9b9d555e50a1.png)

これをキー値モードで表示するとこうなる。値列にオブジェクト形式のデータが記述された状態：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/bc20267e-bc59-1b0d-e912-bcefab4b263f.png)

ここで、この選択アクションの内容を元に他の「選択」アクションを作成するとする。

__問題1：__ まず、キー値モードで値列の内容をコピー＆ペーストしてみる：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/496338d5-f79c-e81a-3031-1eb002780122.png)

すると、パッと見は問題ないように見えるのだが、テキストモードにすると勝手にシリアライズされてしまっていることがわかる：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/261b3325-df8b-d14a-3813-8b4a23c51a35.png)

__問題2：__ 次に、テキストモードでマッピング情報全体をコピー＆ペーストしてみる：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/a7f0d6f0-dbef-cbf4-c751-48de0d09e8d5.png)

これも、パッと見は問題ないように見えるのだが：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/2241b0f9-2c79-3df4-96a0-bf55052fff37.png)

再びテキストモードにするとやはりシリアライズされてしまっている：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/dec66d8c-da30-c3ff-6d44-be20d41eac8a.png)

# Solution

基本的に、「クリップボードにコピー」機能を利用すること。
この方法なら勝手にシリアライズされてしまうことはない：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/93da7eb5-ae97-33bd-459d-0c9d2ebf55bd.png)

何らかの理由で、「クリップボードにコピー」機能を利用せず、手作業でコピー＆ペーストする場合は、以下の2点を守ること：

* テキストモードを利用してコピー＆ペーストする（これだけでは問題2が発生する）
* ペースト後、必ず「保存」し、さらに一度フロー詳細画面に移動、その後編集画面に戻る

どういうわけか、これでシリアライズは回避できる。
なお問題1はどうにもならないので、キー値モードでコピー＆ペーストをしてはならない。
Llama.cppで扱えるモデル形式が GGMLからGGUFに変更になりモデル形式の変換が必要になった話

# はじめに
`Llama2`は Meta がリリースした大規模言語モデル(LLM)だ。Llama2をWindows/Linux/MacのようなOSがインストールされた、いわゆるパソコン(PC)で動作させるランタイムとして[`llama.cpp`](https://github.com/ggerganov/llama.cpp)が公開されている。

# これまでの利用方法

llama.cpp を利用するためには Llama2 がGGML形式に変換されている必要がある
```bash:これまでの例
./main -m ./models/llama-2-7b-chat.ggmlv3.q4_K_M.bin --temp 0.1 -p "### Instruction: What is LLM? ### Response:"
```

# 今後の利用方法
llama.cpp がGGMLのサポートを終了し GGUF 形式への変換が必要になる
GGUF形式へのコンバーターは[llama.cpp のリポジトリ](https://github.com/ggerganov/llama.cpp#be-prepared-to-re-convert-and--or-re-quantize-your-gguf-models-while-this-notice-is-up)で公開されている。
下記のように自前でコンバートすることが可能だ。

```bash:
python convert-llama-ggmlv3-to-gguf.py --input llama-2-7b-chat.ggmlv3.q4_K_M.bin --output llama-2-7b-chat.q4_K_M.gguf
```

```bash:これからの例
./main -m ./models/llama-2-7b-chat.q4_K_M.gguf --temp 0.1 -p "### Instruction: What is LLM? ### Response:"
```


# Llama2 の使用例の記事の一部

https://note.com/npaka/n/n0ad63134fbe2#35915832-3719-401a-950c-16bae12f576f

https://note.com/npaka/n/n3164e8b24539

https://qiita.com/nabata/items/b2ef32b30fec19923131

https://qiita.com/ASID/items/3dee38ff24bac243bc76
VanJSでのグローバル状態管理（store管理）の導入が楽だった

ReactやVueのグローバル状態管理（store管理）がVanJSでも可能だったので紹介します。ReactだとReduxやRecoil、VueだとVuexやPiniaなどのライブラリを入れて状態管理をする方法がありますが、VanJSでは必要ありません。VanJSを使用するための`vanjs-core`だけで状態管理ができます。

デモコードを書いたので、実際に状態管理ができるか試してみてください。

## デモ

https://stackblitz.com/edit/vitejs-vite-hjx1cv?file=src%2Fstore.ts,src%2Fmain.ts,src%2Fcomponents%2FTextInput1.ts,src%2Fcomponents%2FTextInput2.ts,src%2Fcomponents%2FTextInput3.ts&terminal=dev

## コード

```tree
.
└── src
  ├── components
  │   ├── TextInput1.ts
  │   ├── TextInput2.ts
  │   └── TextInput3.ts
  ├── main.ts
  └── store.ts
```

`src/store.ts`のファイルが状態管理のファイルです。`textState`をstoreの変数としています。

```typescript:src/store.ts
import van from 'vanjs-core'

// storeの変数
export const textState = van.state('')

// storeのtextStateの値を取得する場合はこの変数を使用
export const text = van.derive(() => textState.val.toUpperCase())

// storeのtextStateを更新する場合はこの関数を使用
export const updateText = (value: string) => (textState.val = value)
```

`import { text } from './store'`で、storeから値を取得しています。storeの`text`の値が変更されたら、この`text`の値も変わります。

```typescript:src/main.ts
import van from 'vanjs-core'

import { TextInput1 } from './components/TextInput1'
import { TextInput2 } from './components/TextInput2'
import { TextInput3 } from './components/TextInput3'

// storeから値を取得
import { text } from './store'

const App = () => {
  const { div, p } = van.tags

  return div(
    p('Text is ', text),
    TextInput1,
    TextInput2,
    TextInput3,
  )
}

van.add(document.getElementById('app')!, App())
```

inputフォームの入力で、`updateText`関数を使ってstoreの`textState`の値を更新してます。

```typescript:src/components/TextInput1.ts
import van from 'vanjs-core'

// storeから値と更新する関数を取得
import { text, updateText } from '../store'

export const TextInput1 = () => {
  const { div, p, input } = van.tags

  return div(
    { style: 'padding: 1em; background: #cff;' },
    p('TextInput1 Component'),
    input({ value: text, oninput: (e) => updateText(e.target.value) }),
  )
}
```

```typescript:src/components/TextInput2.ts
import van from 'vanjs-core'

// storeから値と更新する関数を取得
import { text, updateText } from '../store'

export const TextInput2 = () => {
  const { div, p, input } = van.tags

  return div(
    { style: 'padding: 1em; background: #fcf;' },
    p('TextInput2 Component'),
    input({ value: text, oninput: (e) => updateText(e.target.value) }),
  )
}
```

```typescript:src/components/TextInput3.ts
import van from 'vanjs-core'

// storeから値と更新する関数を取得
import { text, updateText } from '../store'

export const TextInput3 = () => {
  const { div, p, input } = van.tags

  return div(
    { style: 'padding: 1em; background: #ffc;' },
    p('TextInput3 Component'),
    input({ value: text, oninput: (e) => updateText(e.target.value) }),
  )
}
```

## 感想

通常のコンポーネントの状態管理と書き方が同じため、とても楽だなと思いました。VanJSができれば学習コストもほぼ必要ない点も良いと思いました。

## まとめ

VanJSでの状態管理を紹介しました。VanJSでの状態管理はライブラリを入れる必要がないため、既存のプロジェクトで状態管理したくなった場合でも、依存関係など気にせず導入することができます。VanJSでコンポーネント間でのバケツリレーが辛くなった場合に、導入してはいかがでしょうか。


## 最後に

### GoQSystemでは一緒に働いてくれる仲間を募集中です！

ご興味がある方は以下リンクよりご確認ください。

https://goqsystem.recruit.site?qiita=2d0be8681d394e7447af
Angular：インストール

## 前書き
* 自分の勉強メモ、ご参考まで

## インストール

参考サイト

https://developer.mozilla.org/ja/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Angular_getting_started

環境
`C:\aaa\AngularSample01>node -v` **v18.17.1**
`C:\aaa\AngularSample01>npm --version` **9.6.7**

Angular CLI
`C:\aaa\AngularSample01>npm install -g @angular/cli`

最初のアプリを作成
```console
ng new todo --routing=false --style=css
cd todo
ng serve
```

結果
http://localhost:4200/
CORS問題、勝手な対策


## CORS問題、勝手な対策

サーバーの応答に、ヘッダーを下記のように設定すれば解決
勝手な対策であり、推薦しない

```json
Access-Control-Allow-Headers: *
Access-Control-Allow-Methods: *
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: *
```
.NET？Framework？Core？色々あるから整理しよう

## 概要
普段なにげなくUnityでC#を使っていたけれど、`.NET`とか`.NET Framework`とか、`.NET Core`とかの違いをよく分かってなかったな～と思ったので、簡単な歴史や名称の違いを自分用にまとめてみました。

間違っている部分があるかもしれませんが、多めに見ていただけますと幸いです。

## .NETとは
2000年6月に掲げた`Microsoft .NET`という構想が元になっている。
現在のIoTに近い、様々な情報デバイスをネットワークに接続させて、インターネット経由でつながることを目指すというものであった。

その後、`Visual Studio .NET`が発表され、これが今の.NETの原型になっている。
現在では、`Microsoft .NET`という呼称は使われておらず、現在使われている`.NET`は`.NET Framework`の呼称のひとつとなっている。
しかし、後述の内容により、`.NET Core`の名称が`.NET`に変更されたため、非常に分かりづらくなっている。

`.NET 4.8`(.NET Framework 4.8)と`.NET 5.0`(旧.NET Core)は似ているが、全く別物である。

## .NET Standardとは？
複数の`.NET実装`で使用できる`.NET API`の仕様。

この仕様に従い、`.NET Framework`、`.NET Core`、`Xamarin.iOS/Mac/Android`、`UWP`といった様々な.NET実装でAPIが実装されている。
つまり、すべての.NET実装で実装するべきAPIの一覧のようなもので、
「.NET Standard実装の共通するAPI」＋「各.NET実装の固有のAPI」となる。

## .NET Frameworkとは？
`.NET Framework`とは、Microsoftが提供するソフトウェア開発フレームワーク。
Windows系のアプリケーションやWebサービスなどを開発することができる。

.NET Frameworkでは、C#、VB、C++、F#など、複数のプログラミング言語による開発が可能。

2.0/3.0/3.5系と4系で独立しているため、4系をインストールしても2.0/3.0/3.5系と共存することが可能。

最新バージョンは4.8で、このバージョンが最終リリースとなる。

## .NET Coreとは？
`.NET Framework`の後継としてリリースされた。オープンソース。
マルチプラットフォームに対応しているため、Widnwosのほか、macOS、Linuxでも動作する。

`.Net Core`は3.1でリリースを終了し、名称を`.NET 5`に変更された。
その後、`.NET 6`...`.NET 7`...と続いていく。

## Unityでは？
Unity 2022.3では、`API Compatibility Level`を`.NET Framework`もしくは`.NET Standard 2.1`から選択できる。

 `.NET Standard 2.1`をサポートしており、これに伴って`C# 8.0`を完全にサポートしている。

## まとめ
以前は、略称として`.NET Framework`が`.NET`と呼ばれていました。
その後、`.NET Framework`のメジャーアップデートが終了し、その後継となる`.NET Core`が`.NET`へと改名されました。
`.NET`が２つの意味合いをもっているためややこしいですが、今後は１つのフレームワークを指すことになるため少しはシンプルになるでしょうか。

## 参考
.NET Standard
https://learn.microsoft.com/ja-jp/dotnet/standard/net-standard?tabs=net-standard-1-0
.NET Framework 4.8 と .NET 5.0 は全く違う、両者の扱い方の注意点を解説します。 
https://wake-mob.jp/2020/11/02/net-framework-4-8-%e3%81%a8-net-5-0-%e3%81%af%e5%85%a8%e3%81%8f%e9%81%95%e3%81%86%e3%80%81%e4%b8%a1%e8%80%85%e3%81%ae%e6%89%b1%e3%81%84%e6%96%b9%e3%81%ae%e6%b3%a8%e6%84%8f%e7%82%b9%e3%82%92%e8%a7%a3/
.NETとは？ 初心者にもわかりやすく解説
https://game-creators.jp/g-job-tenshoku/news_articles/23
.NET Framework とは？歴史やできることを解説
https://www.rstone-jp.com/column/109860/
ねえ、みんな幸せ？～ハピネススカウターを使わせていただいてカスタムした～



発端はこちら

https://qiita.com/keeey999/items/7ce7c4bc342ca2ec7319

うお～つくってみてえ～と思いきっかけを待っていましたが、なかなか~~余興を頼んでくれる友人の調達が難しく~~そのタイミングがなく時が経ってしまっておりました。
実際作るとなってもAWSもLINE BotもPythonも触ったことがないのでハードル高すぎよな～なんて思ってました。

その2年後、独自で作成し解説記事を投稿してくださった神が現れます

https://qiita.com/ymd65536/items/f1d50596cdd1d76d1c7b

しかし自分が余興を頼まれることもなく時は過ぎ、ひょんなことから自分の式（格式ばったものでないですが…）を開催することになりました。
久しく開発もしていなかったですがこれはやるしかないなと、重い腰を上げました。

# 準備編

基本は上記記事を参考に作成し、不明点はChatGPTに質問しながら進めました。
ChatGPTがなかったら諦めてたと思います、わからなすぎですAWS。
PythonもPHPと似てるらしいって噂を聞いていましたがインデントが重要だったりびっくりしました！繊細ねPython。

画像送信時の全体像はこんな感じ。ほぼ参考記事と一緒です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132618/81f41ae9-e6e7-a5be-329e-199142958f28.png)

初代記事でネットミームがアップされる問題が提起されていたので、Exif情報を取得して当日の日付かの判定するっていうのをpythonライブラリpillowで実装しようと画策しましたが、日が空いたことでどうやってここまでやってきたか忘れてしまいました（わはは！）
むやみなカスタマイズは諦め、当日は~~ネットミームで盛り上がれば御の字ですが~~ネットミームが上がらないことを祈ります。

写真をアップすることに抵抗がある場合を想定し、写真アップと引き換えに何かしらお楽しみ要素があれば一回くらいは送ってくれるのでは？と、戦闘力を返すときにランダムで地元のお土産や帰りに食べてってほしいお店等のおすすめ情報をランダムで送信するカスタマイズを追加しました。
遠方から来てくれたゲストそれぞれに地元をおすすめできましたし、近隣のゲストにはお気に入りの飲み屋を紹介することができました。

その他、今回はブラウザ出力してランキングや、イベント終了後のアルバムとして使用したかったので出力部分を新規構築しました。
Webページ表示の全体像はこんな感じ。
![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132618/91a69c6d-68b2-d796-bf68-6d98351e003a.png)
イベント当日使用するランキングページは定期的に更新したかったので、Javascriptで自動更新を実装しました。
理想を言えば「○○さんが投稿しました！」とポップアップ表示とかやりたかったですけど、さすがにそこまでは未経験すぎました。いつかはできるようになりたいですね。

# 本番編

結論から述べると大方うまくいきました！やった！
100枚以上が集まりかなりイベントとして盛り上がりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132618/3d80dd37-3e8c-1e2f-265a-44f1be816dc3.png)

しかし反省点が2点ありましたので改善案をまとめようと思います。

## 予防線を張りすぎた
仕組み上当日の写真でなくカメラロールの写真もアップできることが自分の中でネックだったために、ルール説明の時に「カメラロールの写真もあげられる」事実を説明してしまいました。
それで盛り上がればいいなと思ったのですが、思ったより子供の写真など、ネットミームよりネタにしにくいものがアップされてしまいました。
また、人数が多いと点数が高いことを説明することで参加者がわいわいすればいいなと思ったのですが、会のメンバーと撮影すのではなく人数の多さにフォーカスした昔の集合写真が集まってしまいました。
この記事を見た方はExifの処理を頑張るか、説明しないか、対策はしたほうが良いと思います！！！

## API上限を超えた
上記のこともあり、心の優しい参加者がちゃんとイベントの写真で上位をとろうと頑張ってくれたのですが、なんとLINE APIの上限に達してしまい測定ができない問題が発生しました。終盤に差し掛かっていたのであやふやに終わったのですが、APIエラーがたくさん出ていました。
たくさんの参加、有難いことです。実施される方は有料プランの一番下でも加入しておくのが良いかと思います。



悲しみのない世界を目指しましたが、少し悲しみはあったかもしれません。
しかし一発勝負というところでいえばまあまあな出来でしょう。

以上、私のイベント記録でした。
いつかどなたかの参考になれば幸いです。
labelのforとinputのidの関係性の備忘録

毎度忘れるので記事にします。

# そもそも`<label>`ってなんやねん
[MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/label)によると、「UIのアイテムにキャプションをつけるためのもの」だそうです。

キャプションをつけることができるものは labelableな要素と呼ばれ、以下だそうです。
- button
- input
- meter
- output
- progress
- select
- textarea


## じゃあfor属性とは？
labelが「キャプション」である以上、その対象となるアイテムがあります。そのアイテムと、labelを紐づけるための属性です。

## labelとlabelableな要素を明示的に結びつける方法
まず、labelableな要素に`id`を設定します。
これに対して`for`属性を持つlabelは、ドキュメントの最初に出てきた`for`と同じ値の`id`をもつlabelableな要素に関連づけられます。

従って、同じ`id`をもつlabelableな要素が1つのDOM Treeの中に複数あった場合、最もTreeの上にある要素にlabelは関連づけられるということになります。

## ついでに、htmlForとは？
Reactなどではlabelに`for`をsetする際に`htmlFor`という属性を使用します。このhtmlForは、現在のlabelの`for`属性を取得したりセットしたりする属性です。

[HTML Living Standards](https://html.spec.whatwg.org/multipage/forms.html#dom-label-htmlfor:~:text=The%20htmlFor%20IDL%20attribute%20must%20reflect%20the%20for%20content%20attribute.)によると、
```
The htmlFor IDL attribute must reflect the for content attribute.
```
だそうです。
以下のサイトがかなりわかりやすかったです

https://www.decodingweb.dev/label-htmlfor-property-explained

## `for`と`id`を明示しない書き方もある
labelの中にlabelableな要素をいれてやると、そもそも`for`も`id`も明示しなくてもlabelと関連付けされる。

```html
<label>
  Do you like peas?
  <input type="checkbox" name="peas" />
</label>
```
【学習用】基本情報技術者試験「整列アルゴリズム」

## 目次
* 整列(ソート)について
* バブルソート
* 選択ソート
* 挿入ソート
* マージソート
* クイックソート
* まとめ

## 整列(ソート)について
****ソート****(sort)とは、配列の要素の順序をそろえること
#### 昇順
配列の先頭から末尾に向かって、データの値が大きくなるようにそろえること
![qiita-square.png](https://00m.in/QhTvg)

#### 降順
配列の先頭から末尾に向かって、データの値が小さくなるようにそろえること
![qiita-square.png](https://00m.in/mkn5k)

## バブルソート
配列の末尾から先頭に向かって隣同士の要素を比較し、小さい方が前になるように交換する

##### 【手順1】1番小さいカードを確定させる
![qiita-square.png](https://00m.in/vJdLE)

##### 【手順2】2番目に小さいカードを確定させる
![qiita-square.png](https://00m.in/p92eq)

##### 【手順3】3番目小さいカードを確定させる
![qiita-square.png](https://00m.in/tqT9Z)

## 選択ソート
配列の先頭から末尾に向かって要素の値をチェックして最小値を選択し、それを先頭の要素と交換する

##### 【手順1】1番小さいカードを確定させる
![qiita-square.png](https://00m.in/1ycI3)

##### 【手順2】2番目に小さいカードを確定させる
![qiita-square.png](https://00m.in/tpn6N)

##### 【手順3】3番目小さいカードを確定させる
![qiita-square.png](https://00m.in/EsNnW)

## 挿入ソート

##### 【手順1】2番目のカードを挿入する
![qiita-square.png](https://00m.in/ZGSi2)

##### 【手順2】3番目のカードを挿入する
![qiita-square.png](https://00m.in/FUjbN)

##### 【手順3】4番目のカードを挿入する
![qiita-square.png](https://00m.in/4UmGb)

## マージソート
要素数が1個になるまで分割し、分割した配列から要素を小さい順に取り出して結合する

##### 【手順1】配列を2分割する
![qiita-square.png](https://00m.in/2PR4X)

##### 【手順2】分割した配列をさらに2分割する
![qiita-square.png](https://00m.in/NJWkz)

##### 【手順3】要素数が1個になったら結合する
![qiita-square.png](https://00m.in/2DZ6v)

****小さい方****から順番に取り出して結合する

##### 【手順4】ソート済みの２つの配列を結合する
![qiita-square.png](https://00m.in/BvcpN)
![qiita-square.png](https://00m.in/NJBAW)

## クイックソート
配列の中から基準値を1つ選び、残りの要素を基準値との大小でグループ分けする

##### 【手順1】カード全体から任意の1枚を取り出して基準のカードにする
![qiita-square.png](https://00m.in/ubwgT)

##### 【手順2】残りのカードを1枚ずつ取り出し、基準のカードより小さければ左側に、大きければ右側に積み上げる
![qiita-square.png](https://00m.in/ceFZJ)

##### 【手順3】より小さいカードで、手順1・手順2と同じ処理を行う
![qiita-square.png](https://00m.in/diNww)

##### 【手順4】より大きいカードで、手順1・手順2と同じ処理を行う
![qiita-square.png](https://00m.in/Pz3BY)

## まとめ

#### バブルソート
配列の末尾から先頭に向かって隣同士の要素を比較し、小さい方が前になるように交換する

#### 選択ソート
配列の先頭から末尾に向かって要素の値をチェックして最小値を選択し、それを先頭の要素と交換する

#### 挿入ソート
配列の先頭から末尾に向かって要素を１つずつ取り出し、それより前の部分の適切な位置に挿入する

#### マージソート
要素数が1個になるまで分割し、分割した配列から要素を小さい順に取り出して結合する

#### クイックソート
配列の中から基準値を1つ選び、残りの要素を基準値との大小でグループ分けする
Service MeshのControl Planeが削除できない

OpenShift Service Meshをアンインストールする際に、Control Planeが削除できなくなる事象が発生したのでメモ。

# 事象

oc deleteでControl Planeを削除しようとしたところ、deletingのままスタックしてしまい、istio-systemも削除できなくなる。
```
$ oc get smcp -n istio-system
NAME    READY   STATUS     PROFILES      VERSION   AGE
basic   9/9     Deleting   ["default"]   2.4.2     36d
```
Operatorのアンインストールはできたが、istio-systemとControl Planeは残ったままになる。oc delete --forceでも状況変わらず。


# 対応
Kubernetesでは、リソースを削除する前に実行される処理がfinalizersで指定される。この処理が完了しないとリソースが残ってしまうので、これを無効化する。

コマンドは以下。
```
$ oc patch -n istio-system smcp/basic --type=merge -p '{"metadata": {"finalizers":null}}'
servicemeshcontrolplane.maistra.io/basic patched
$ oc get smcp -n istio-system
Error from server (NotFound): Unable to list "maistra.io/v2, Resource=servicemeshcontrolplanes": the server could not find the requested resource (get servicemeshcontrolplanes.maistra.io)
```

ちなみに、Namespaceは以下のように削除できる。
```
$ oc get namespace istio-system -o json | sed -e 's/"kubernetes"//' | kubectl replace --raw "/api/v1/namespaces/istio-system/finalize" -f -
```

ただし、上記のようなリソースが削除できない状態だと、Namespaceを消してもリソースが残ったままになる可能性あり。今回実行したところ、Control Planeは相変わらずdeletingのままとなっていた。


# 参考
- https://github.com/kubernetes/kubernetes/issues/60807
- https://access.redhat.com/documentation/ja-jp/red_hat_openshift_container_storage/4.5/html/troubleshooting_openshift_container_storage/troubleshooting-and-deleting-remaining-resources-during-uninstall_rhocs
Slack新ワークフローの管理について（Slack CLI）

### はじめに
Slack管理者向けの記事となります。
Slack開発者の方でも読んでみてふーんとなるかもしれません。


https://slack.com/intl/ja-jp/help/articles/15363357403411-Slack-%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%AE%E6%96%B0%E3%81%97%E3%81%84%E6%A9%9F%E8%83%BD%E3%81%A8%E6%96%99%E9%87%91%E3%83%97%E3%83%A9%E3%83%B3%E3%81%AE%E3%81%94%E7%B4%B9%E4%BB%8B

2023年8月時点でSlackが新プラットフォームに移行されました。

今までと管理の仕方やGUIの画面等を共有したいと思います。
参考になれば幸いです。

---
### 新しいワークフローの管理画面

https://adventure-inc-hq.slack.com/apps

App Directoryの管理画面（右上）からも入れます。

公開されているワークフローの一覧が新環境で作成されたワークフローとなります。

:::note info
ここでプレミアムかスタンダードか判別、実行回数の確認ができます。
更に公開停止等の管理が可能です。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184018/5af49cb8-c4df-7f8a-e000-83d1ddfa69f6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184018/4a9df72e-6e92-ac67-6f80-b7112c35d7fe.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184018/09989db6-d3c1-1919-f9a4-0b83abffe6b3.png)

基本的にシンプルな管理画面です。
プレミアムに該当するワークフローの野生化は防げそうです。

---
### 本記事の本題

実は新環境に移行する前にローカル環境で新ワークフローのカスタムアプリの調査と検証を繰り返しておりました。

公式マニュアルのサンプルをひたすらローカル環境に落としては
Slackにアップして~~遊んでいた~~いたのですが、管理画面上に大量にアップした
ワークフローが表示されていました。

https://api.slack.com/automation/quickstart

実行もユーザーから見られる（見える）わけでもなさそうなので
害はないのですが、気持ち悪いので一つずつアプリの詳細から削除をしました。

、、、キエナイ、、、、ダト

いくら削除ボタンを押しても消えず気持ち悪い状況が続いたので
重い腰を上げｔ本格的に削除することに

---

### ローカル環境からアップしたSlack ワークフローの削除方法

⓵手っ取り早いのは、ローカル環境のプロジェクトフォルダからワークフローを消す

```slack cli:
slack app list //ディレクトリ上に展開されているアプリ一覧を表示
slack app delete -a [app ID] -v -f //アプリ削除
```

自分はワークスペースにインストールされているワークフローはワークスペース上のapp IDだけ削除、ローカルにしかインストールされてないものはローカルのapp IDを削除

これで管理画面上から綺麗に消えていきました。

#### 問題発生

過去作ったプロジェクトフォルダでもうフォルダ毎消したものはどうしたらいいのか・・・・

⓶app IDさえ分かっていれば消せます（消せました）。
　適当なプロジェクトフォルダの.slackフォルダを適当なディレクトリにコピーします。
  同じく適当なプロジェクトのslack.jsonファイルを.slackと同一階層に置きます（適当なプロジェクトからコピペでOK）。

apps.[].jsonファイル内のapp_idを書き換えます。
app_idはアプリの詳細ページのURLに表示されているワークフロー名以前の文字列

⓵と同じくdeleteコマンドで削除。リクエストBODYには何も入ってないように見えますが、きちんと削除されていました。

:::note warn
slack.jsonファイルがないとCLIを実行するディレクトリにプロジェクトがインストールされていないとエラーになるので、slack.jsonファイルは必ず置きましょう。
:::

　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184018/f26b3104-f240-f8b8-e74c-0e7dbb68c93e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184018/7c5890c5-f398-b567-c33a-398a65ff43e8.png)

ローカルからワークフローアップしまくって管理画面がめちゃくちゃな事になってる方は
ぜひ整理整頓してみてください。
せんせー、バイオリズムモニタリングってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、バイオリズムモニタリングってなに？

# バイオリズムモニタリングとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## バイオリズムモニタリングとは何でしょうか？

皆さまの体には、生体のリズムや周期があります。これを「バイオリズム」と言います。バイオリズムモニタリングは、このリズムや周期を測定し、分析することを指します。

## どのように行われるのでしょうか？

現代の技術には、心拍数や睡眠の質、活動量などの生体情報を測定するセンサーがあります。これらのセンサーを用いて、個人の日常生活の中での生体情報を収集し、それをもとにバイオリズムを分析することができます。

## なぜそれが重要なのでしょうか？

バイオリズムのモニタリングを行うことで、健康状態や生活習慣の最適化のヒントが得られます。例えば、適切な睡眠時間や最も活動的な時間帯、体調の変化などを知ることで、より健康的な生活を送る手助けとなります。

# まとめ

バイオリズムモニタリングは、私たちの体のリズムや周期を理解し、それに基づいて健康管理を行うための重要なツールとなっています。近年のウェアラブルデバイスの普及により、日常生活の中で簡単にこのモニタリングを行うことができるようになってきております。
せんせー、リキッドメタルロボティクスってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、リキッドメタルロボティクスってなに？

# リキッドメタルロボティクスとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## リキッドメタルロボティクスとは何でしょうか？

リキッドメタルロボティクスは、液体の金属（リキッドメタル）を使用して作られたロボットやデバイスの技術のことを指します。これは、伝統的な固定形状のロボットとは異なり、流動性と柔軟性を持つ特性を活かして、様々な形状やタスクに対応可能なロボットを設計する研究分野です。

## どんな特徴があるのでしょうか？

リキッドメタルを使用することで、ロボットは非常に柔軟で伸縮自在になります。これにより、狭い場所へのアクセスや変形しての移動など、従来の固定形状のロボットでは難しかった動作を行うことが可能となります。

## どんな応用が考えられるのでしょうか？

リキッドメタルロボティクスの応用例としては、医療分野での内視鏡のようなデバイスや、災害現場での救助活動、難しい場所でのメンテナンス作業などが考えられます。また、ウェアラブルデバイスや柔軟なセンサーの開発にも利用されることが期待されています。

# まとめ

リキッドメタルロボティクスは、ロボット技術の新しい方向性を示しています。流動性と柔軟性を活かしたこの技術は、今後の多くの産業や研究分野での応用が期待されております。
せんせー、グラフェンバッテリーってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、グラフェンバッテリーってなに？

# グラフェンバッテリーとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## グラフェンバッテリーとは何でしょうか？

電池やバッテリーは、私たちの生活の多くの部分で使用されていますね。スマートフォンや電車、車など、様々なものの動力源として使われています。グラフェンバッテリーは、従来のバッテリーに代わる、新しい技術を取り入れたバッテリーです。主要な成分として「グラフェン」という物質を使用しています。

## グラフェンって何でしょうか？

グラフェンは、一枚の炭素原子の層からなる薄い物質で、非常に軽く、しかも電気をとてもよく伝える特性があります。そのため、電子機器の部品やバッテリーの材料として注目されています。

## どんなメリットがあるのでしょうか？

グラフェンバッテリーは、従来のリチウムイオンバッテリーと比較して、より高速に充電することができ、また放電も長持ちします。さらに、使用する際の発熱が少ないため、安全性の面でも期待が持たれています。

# まとめ

グラフェンバッテリーは、新しい技術を持つバッテリーとして、多くの電子機器や輸送手段におけるエネルギー供給の方法として注目されています。充電の速さや持続時間、安全性の向上など、多くのメリットが期待されております。
javascript まとめ①

##  HTML要素の取得方法

```javascript
document.querySelector('セレクター');
```

HTML全体を表すdocumentオブジェクトの中から指定したセレクターを、持つ要素を取得するという
意味になる。

## javascriptで「どこ」の「何」を「どう変える」かの書き方

例）
どこの

```javascript
document.querySelector('#text');
```

何を
```javascript
document.querySelector('#text').textContent;
```

どう変える
```javascript
document.querySelector('#text').textContent=hello;
```

HTML内からてtextというidの要素を探しだし、そのテキストにhelloという文字列を入れるという指示になる

## 定数

定数とはいろいろな文字列や数値、式などを入れておくことができる箱

```javascript
const 定数名 = 定数に入れる値;
```
## イベント

「何が」「どうなったら」「どうなるか」をaddEventListenerで書く


```javascript
const btn = document.querySelector("button");

function bgChange() {
  const rndCol =
    "rgb(" + random(255) + "," + random(255) + "," + random(255) + ")";
  document.body.style.backgroundColor = rndCol;
}

btn.addEventListener("click", bgChange);
```

1行目
htmlからbutton要素を取得し、定数btnに代入


2行目から
bgChangeという関数を定義
中の処理はバックグラウンドカラーをランダムに変える処理

7行目
ボタンがクリックされたら、bgChange関数を行う
【Swift】Chartsを使って折れ線グラフを表示する方法

## はじめに
備忘録
タイトルの通りです。
どなたかのお役に立てれば幸いです。

## 解決方法
:::note warn
`Charts`は`iOS 16`からサポートされています。
:::

使用するには`Charts`をインポートする必要があります。
```swift
import Charts
```

以下のように使います。
`LineMark`は折れ線グラフを表示します。
`PointMark`はデータがあるところにプロットします。
これら２つを組み合わせることで、プロットした点同士を結んだ折れ線グラフを表示することができます。
```swift
struct ContentView: View {
    let data = [  // サンプルデータの作成
        Data(time: 1, voltage: 100),
        Data(time: 2, voltage: 200),
        Data(time: 3, voltage: 300),
    ]

    var body: some View {
        Chart {
            ForEach(data) { datum in
                LineMark(x: .value("Time", datum.time),
                         y: .value("Voltage", datum.voltage))
                PointMark(x: .value("Time", datum.time),
                          y: .value("Voltage", datum.voltage))
                .foregroundStyle(.green)  // 色を変えることもできるし
                .opacity(0.5)             // 透明度を変えることもできる
            }
        }
        .chartYAxis {
            AxisMarks(position: .leading)  // たて軸を左側に表示
        }
        .chartXAxisLabel(position: .bottom, alignment: .center) {
            Text("Time [s]")
        }  // 軸ラベルをグラフの下側の左右中心に表示
        .chartYAxisLabel(position: .leading, alignment: .center, spacing: 0) {
            Text("Voltage [mV]")
        }  // 軸ラベルをグラフの左側の上下中央に表示し、周りの要素とのスペースをなくす
    }
}
```
【Java SE11 Silver】試験対策メモ（順次更新、自分用）

# 目的
Java Silverの黒本勉強中に躓いたところ、なかなか覚えられないところを順次アウトプットし、いつでも見返せる自分用メモを作成する。

# Javaの基本データ型と文字列操作

## 基本データ型

|データ型|値|
|---|---|
|boolean|true, false|
|char|16ビットUnicode文字|
|byte|8ビット整数|
|short|16ビット整数|
|int|32ビット整数|
|long|64ビット整数|
|float|32ビット単精度浮動小数点数||
|double|64ビット倍精度浮動小数点数|

# 配列の操作

## 配列変数の宣言
```java:例
// 方法1
int[] array;
int[][] array;

// 方法2
int array[];
int array[][];

// 方法3
int[] array[];
int[][] array[];
```

```java:例 (エラー)
// 宣言時に要素数の指定は不可
int[3] array;
```

## 配列インスタンス生成
new演算子を使う。

```java:例
// 宣言後に生成
int[] array;
array = new int[3];

// 宣言時に生成
int[] array = new int[3];
```

```java:例 (エラー)
// 要素数を指定していない
int[] array = new int[];

// 1次元目の要素数は省略不可
int[][] array = new int[][3];
```

## 配列の宣言と同時に初期化
初期化演算子{}を使う。

```java:例
// 簡潔な初期化
int[] array = {1, 2, 3};

// 明示的な初期化
int[] array = new int[]{1, 2, 3};

// 要素数ゼロも可
int[] array = {};
int[] array = new int[]{};
```

```java:例 (エラー)
// 初期化演算子 + 大カッコに要素数を指定
int[] array = [3]{1, 2, 3};
int[] array = new int[3]{1, 2, 3};

// 変数宣言と初期化が別タイミング
int array[];
array = {1, 2, 3};

// これはOK
int[] array;
array = new int[]{1, 2, 3};
```

## 配列要素のデフォルト値

|型|デフォルト値|
|---|---|
|整数型|0|
|浮動小数点数型|0.0|
|真偽型|false|
|文字型|\u0000|
|オブジェクト型|null|

# インスタンスとメソッド

## アクセス修飾子

|修飾子|同クラス|同パッケージ|サブクラス|全クラス|
|---|:-:|:-:|:-:|:-:|
|public|○|○|○|○|
|protected|○|○|○||
|なし|○|○|||
|private|○|

## オーバーロード = 多重定義

オーバーロードのルールは、以下のとおり。
- メソッド名が同じ
- 引数が異なる

「引数が異なる」とは、具体的には以下のケース。
```java:例
// 1. 引数の型が異なる
public void test (int a) {}
public void test (long a) {}

// 2. 引数の数が異なる
public void test (int a) {}
public void test (int a, int b) {}

// 3. 引数の並びが異なる
public void test (int a, String s) {}
public void test (String s, int a) {}
```

ちなみに、オーバーロードに関係するのは上の3つのケースのみなので、以下のようなパターンは関係なし。
```java:例 (エラー)
// × アクセス修飾子の違いは関係なし
public void test (int a) {}
private void test (int a) {}

// × 戻り値は関係なし
public void test (int a) {}
public long test (int a) {}

// × 引数の名前は関係なし
public void test (int a) {}
public void test (int b) {}
```

これらのパターンはすべてオーバーロードにはならず、同じメソッドが二つあると判断され、コンパイルエラーとなる。

## オーバーライド = 再定義

オーバーライドのルールは以下のとおり。
- メソッド名が同じ
- 引数の型、名前、数、並びが同じ
- 戻り値の型が同じ又はそのサブクラスである
- アクセス修飾子が同じ又はそれよりスコープが広い

以下、オーバーライドにならない例。
```java:例
// 元のメソッド
public void test (int a) {}

public void sample (int a) {}  // × メソッド名が違う → 別のメソッドとみなされる
public void test (String a) {}   // × 引数が違う → オーバーロードとみなされる
public int test (int a) {}      // × 戻り値の型が違う → コンパイルエラー
private void test (int a) {}    // × アクセス修飾子がNG → コンパイルエラー
```
PYNQZU3.0　にROS-IRONをインストールする

# PYNQZU3.0　にROS-IRONをインストールする

最近、研究の一環としてPYNQ-ZUボードを使用してROSのプロジェクトに取り組んでいます
しかし、PYNQのlinuxは通常のlinuxとは異なり、PYNQLINUX（Ubuntu 22.04ベース）を使用しているらしいです。そのため、PYNQにROS 2をインストールしようとすると、問題が発生します。したがって、修正が必要です。

今から私たちのアプローチを共有したいと思います。これはかならずしも最適な方法とは限らないと思いますが、これまで問題はなかった方法です。


PYNQのバージョン：PYNQ3.0　（Ubuntu22.04）
ROS2のバージョン：ros-iron-desktop

まずは、以下を実行する。

> sudo vim /etc/lsb-release

そして内容を以下のように変更する
>DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.1 LTS"

次に、以下のコマンドを実行する
>　sudo vim /etc/os-release

内容を以下のように変更してください
> NAME="Ubuntu"
VERSION="22.04.1 LTS (Jammy Jellyfish)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 22.04.1 LTS"
VERSION_ID="22.04"
HOME_URL="https://www.pynq.io/"
SUPPORT_URL="https://discuss.pynq.io/"
BUG_REPORT_URL="https://www.pynq.io"
PRIVACY_POLICY_URL="https://www.pynq.io"
VERSION_CODENAME=jammy
UBUNTU_CODENAME=jammy

以上の操作を行うと、通常の手順を従ってインストールできるはずです
電子工作メモ - マトリクスLED

# マトリクスLED

## 種類

- ピンアサイン
  - 左下から反時計回りに、1-16

    |col|pin|74HC595| |row|pin|74HC595|
    |:--:|:--:|:--:|:--|:--:|:--:|:--:|
    |1|13|Q0 15||1| 9|Q0 15|
    |2| 3|Q1  2||2|14|Q1  2|
    |3| 4|Q2  3||3| 8|Q2  3|
    |4|10|Q3  4||4|12|Q3  4|
    |5| 6|Q4  5||5| 1|Q4  5|
    |6|11|Q5  6||6| 7|Q5  6|
    |7|15|Q6  7||7| 2|Q6  7|
    |8|16|Q7  8||8| 5|Q7  8|


- コモンアノード（キットのLEDはこっち）
  - 行: High
  - 列: Low
    - で点灯する

- コモンカソード
  - 行: Low
  - 列: High
    - で点灯する

- スマイルマーク

    ||col1|col2|col3|col4|col5|col6|col7|col8|
    |:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
    |row1|0|0|0|0|0|0|0|0|
    |row2|0|0|1|1|1|1|0|0|
    |row3|0|1|0|0|0|0|1|0|
    |row4|1|0|1|0|0|1|0|1|
    |row5|1|0|0|0|0|0|0|1|
    |row6|1|0|0|1|1|0|0|1|
    |row7|0|1|0|0|0|0|1|0|
    |row8|0|0|1|1|1|1|0|0|


    |col|Binary|Hex|
    |:--|:--|:--|
    |1|0001 1100|0x1c|
    |2|0010 0010|0x22|
    |3|0101 0001|0x51|
    |4|0100 0101|0x45|
    |5|0100 0101|0x45|
    |6|0101 0001|0x51|
    |7|0010 0010|0x22|
    |8|0001 1100|0x1c|

## ソース

```python
import time
from my74HC595 import Chip74HC595

smilingFace=[0x1C, 0x22, 0x51, 0x45, 0x45, 0x51, 0x22, 0x1C] #^_^#
numdata = [
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # " "
    0x00, 0x00, 0x3E, 0x41, 0x41, 0x3E, 0x00, 0x00, # "0"
    0x00, 0x00, 0x21, 0x7F, 0x01, 0x00, 0x00, 0x00, # "1"
    0x00, 0x00, 0x23, 0x45, 0x49, 0x31, 0x00, 0x00, # "2"
    0x00, 0x00, 0x22, 0x49, 0x49, 0x36, 0x00, 0x00, # "3"
    0x00, 0x00, 0x0E, 0x32, 0x7F, 0x02, 0x00, 0x00, # "4"
    0x00, 0x00, 0x79, 0x49, 0x49, 0x46, 0x00, 0x00, # "5"
    0x00, 0x00, 0x3E, 0x49, 0x49, 0x26, 0x00, 0x00, # "6"
    0x00, 0x00, 0x60, 0x47, 0x48, 0x70, 0x00, 0x00, # "7"
    0x00, 0x00, 0x36, 0x49, 0x49, 0x36, 0x00, 0x00, # "8"
    0x00, 0x00, 0x32, 0x49, 0x49, 0x3E, 0x00, 0x00, # "9"
    0x00, 0x00, 0x3F, 0x44, 0x44, 0x3F, 0x00, 0x00, # "A"
    0x00, 0x00, 0x7F, 0x49, 0x49, 0x36, 0x00, 0x00, # "B"
    0x00, 0x00, 0x3E, 0x41, 0x41, 0x22, 0x00, 0x00, # "C"
    0x00, 0x00, 0x7F, 0x41, 0x41, 0x3E, 0x00, 0x00, # "D"
    0x00, 0x00, 0x7F, 0x49, 0x49, 0x41, 0x00, 0x00, # "E"
    0x00, 0x00, 0x7F, 0x48, 0x48, 0x40, 0x00, 0x00, # "F"
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00  # " "
]

chip = Chip74HC595(18, 20, 21, 19)
try:
    while True:
        #smilingFace
        for j in range(100):
            cols = 0x01
            for i in range(8):
                chip.disable()
                chip.shiftOut(1, smilingFace[i])
                chip.shiftOut(0, ~cols)
                cols <<= 1
                chip.enable()
                time.sleep_us(500)
        #numdata
        for i in range(136):
            for _ in range(5):
                cols = 0x01
                for j in range(i, 8+i):
                    chip.disable()
                    chip.shiftOut(1, numdata[j])
                    chip.shiftOut(0, ~cols)
                    cols <<= 1
                    chip.enable()
                    time.sleep_us(500)
except:
    pass
```
DonutをSlackに導入したらコニュニケーションの輪が拡がった話

こんにちは！withサーバーチームの@10keiと申します。

突然ですが、ドーナツって、美味しいですよね！
私はオールドファッションハニーが一番好きなのですが
みなさんは、何が一番好きですか？🍯

## 🍩 Donutって、なに？
そんな気軽な会話を後押ししてくれるのが
Slackのbotアプリである「[Donut](https://www.donut.com/)」です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391935/9ac500aa-8e36-7095-bfd7-1f20803a9407.png)
このアプリは、指定のチャンネルに参加しているメンバー同士を
週に一回、ランダムにマッチングさせ、おしゃべりの時間を自動でセッティングしてくれる優れたSlackアプリです。

弊社では、毎週月曜日の11時にマッチングが行われ、その週のどこかのタイミングにて
二人で雑談するGoogle Meetを設定するようにしています。
Googleカレンダーとも連携しているので、二人の予定が開いている時間をいくつかピックアップしてくれるのが便利です。
あとは候補時間から一つ選んで、時間になったらMeetに入るだけ。簡単です😋
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391935/69cfdb01-304a-4096-020c-9ca72697f3dd.png)
DMの開設〜予定の作成〜MeetのURLの発行まで、全てDonutが勝手にやってくれるので、雑談を始めるまでのハードルが低いのがポイントです。

さて、以下ではDonutの導入に至るまでの経緯と、導入の結果をお伝えします。
## 🍩 導入に至るまで
#### 〇〇さんって、どんな人だっけ？
弊社はコロナ禍を機にリモートワーク体制へ移行し、現在もリモートでの業務が中心になっています。
（オフィス出社とリモートワークを自由に選べる勤務形態です）

中には、そもそも首都圏に住んでいない方もジョインしており、一度も直接会ったことがないメンバーと、一緒に仕事をする機会も多くあります。

また、社員数もどんどん増えている最中にあり、気付けば
__「〇〇さんって、どんな人なんだっけ？」__
ということが時たま起こるようになりました。

それでも仕事は普通にできるよ！って方もいらっしゃると思いますが
同じ会社で働いているメンバーの人となりを知っておいた方が
安心して仕事ができるよね、という声もあり
リモート業務下でのコミュニケーション課題として
何か解決策はないか、考えることとなりました。

#### リモート下におけるコーヒーマシン前の実現
私たちのオフィスには、コーヒーマシンや、ウォーターサーバーが置いてある一画があるのですが
その前でコーヒーを淹れていたりしていると、たまたますれ違った人同士で、自然発生的なコミュニケーションが生まれることがあります。
このようなコミュニケーションのきっかけを、リモートワーク下でも実現できれば
感じている課題を解消する手段になるのではないかと思いました。
Donutは、自然発生的なコミュニケーションとは少し違いますが
- 偶然マッチングした人同士で、1対1のコミュニケーションが取れる
- 異なるチームや部署の人同士が、関わり合うきっかけとなる
- 業務上のやり取りだけではわからない人となりを、雑談を通じて窺い知れる
- 業務の合間の時間で、気軽な会話が行えることでリフレッシュの機会にもなりそう

と、求めていたシチュエーションに近いことが実現できそうでした。

#### そして導入へ…
弊社では、社内課題を解決する有志の委員会があり、まずはそこでDonutを試してみることにしました。
結果、評判も上々だったので、晴れて全社に導入することに！
全社展開後、参加者も着実に伸びていき、今ではすっかり定着した施策となってくれました。

## 🍩 導入の結果
Donutを導入して、半年以上が経とうとしていますが
概ね、期待した通りの働きを見せてくれているなと感じています。
導入を主導した私自身、初めて会話するな〜という方とDonutでマッチングして
業務内外のいろんなことを話せたり
その後オフィスでたまたますれ違った時に、Donutで話した事をきっかけに会話が弾んだりしました。
単純に、さまざまなメンバーの話を聞けるのが楽しいですね🙌

参加してくれているメンバーからも

>普段、外部のセクションのメンバーと話す機会はほとんどないので、その後のコミュニケーションの糸口を作れる良い機会になっています。

>勝手に予定を組んでくれるので、参加のハードルが低く、気軽にリフレッシュできる機会となっている。

>普段の業務だけでは測り知れない、メンバーの個性に触れる時間となって
なんだか、仲間であることの実感をDonutで得られました。

などなど、嬉しいリアクションをいただいています。
なんだかコミュニケーションの輪がどんどん拡がっていく感覚がありますね！
ドーナツだけに！ね！！！🍩

## 🍩 みんなもLet's ドーナツ！
組織やチームが大きくなってきて、同様のコミュニケーション課題を抱えている方
Donutを、あなたのSlackに導入してみてはいかがでしょうか。

freeプランでも十分使えますが
課金すれば、マッチングを3人以上にしたり
マッチングするメンバーを異なるチーム限定にしたりなど
柔軟にセッティングを行うことができますので、一考の価値ありですね🙆

それでは、私は次のドーナツがありますので、ミスドにおやつを買いに行ってきますね！
みなさま、良きドーナツライフを！
SalesforceのTaskオブジェクト（ToDo）との連携：Pardot


以下を読むとキューを併用してToDoオブジェクトを使えば複数の人で情報を共有できるみたい。

+ [How To Use Salesforce Activities and Tasks](https://www.linkedin.com/pulse/how-use-salesforce-activities-tasks-jennifer-lynn-schneider-mba)
+ [Use Salesforce Task Queues with Pardot (for Re-engaged Prospect Alerts)](https://www.salesforceben.com/the-drip/use-salesforce-task-queues-with-pardot-for-re-engaged-prospect-alerts/)

しかし、Page Actionsを使った場合に不要なレコードも追加されてしまう？

+ [ページアクションの仕様について](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007FUFuF)
Auth0 SDKを使用し、Azure上で稼働するWebアプリの認証制御を行う方法

## はじめに

- Azure上で稼働するWebアプリの認証にAuth0を利用する方法を調査
- Azureが提供する組み込み認証の仕組み (Easy Auth) は使わず、Auth0のSDKで制御する方法を検討
- ステートレス・ステートフル認証の実装パターンをそれぞれまとめる
  - [ソースコード](https://github.com/yomote/auth0-azure-spa-sample/tree/main)
  - サンプル実装のため、参考程度に留めていただけると幸いです

## 背景

- 下図の構成で、Azure上で稼働しているWebアプリの認証が実現できるか調査していた
- 当初、[Static Web Appsの組み込み認証機能](https://learn.microsoft.com/ja-jp/azure/static-web-apps/authentication-authorization) の利用を検討していたが、認証エラーのメッセージによって処理を分けることができないため、不採用
  - [ステータスコードごとのレスポンスオーバライド](https://learn.microsoft.com/ja-jp/azure/static-web-apps/configuration#response-overrides)は可能
- エラーメッセージごとの処理を行うために、Auth0 SDKを使用した実装を検討

  <img src="https://github.com/yomote/auth0-azure-spa-sample/blob/main/docs/img/built-in_auth_(easy_auth).png?raw=true">

## ステートレス・ステートフル認証

|            | ステートレス                             | ステートフル   |
| --------- | ---------------------------------------- | -------------- |
| 認証状態   | 保持しない (トークンに認証情報を記録)    | サーバ側で保持 |
| 認証の失効 | トークンの有効期限が切れることにより失効 | 即時に可能     |
| サーバ負荷 | 低い                                     | 高い           |

- ステートレス認証では、トークンの有効期限が切れるまで認証が失効されない
  - アクセストークン (IDトークン) の有効期限はある程度短く設定するべき
  - 有効期限が切れるたびにログインし直すのはユーザ負荷が高いので、リフレッシュトークンを併用することで回避する
    - リフレッシュトークンは認証サーバ側で状態を管理しているため、有効期限を長くしても良い
    - リフレッシュトークンを使用して、ユーザのログイン操作なしでトークンの再発行が可能
- ステートフル認証はサーバ負荷が高いとしたが、相対的な評価
  - スケーラビリティが重視されない限り、ステートフル形式の方が良さそう？
- どちらを選択するかは、セキュリティ要件次第
  - 例. パスワード変更時、認証の即時失効が必須かどうか
    - フィッシングでパスワードが流出した場合等が該当
- 脅威分析を行ったうえで、リスクを許容するかを検討することが大切

### 参照

- [SPAセキュリティ入門～PHP Conference Japan 2021](https://www.docswell.com/s/ockeghem/ZM6VNK-phpconf2021-spa-security#p78)
- [JWT形式を採用したChatWorkのアクセストークンについて](JWT形式を採用したChatWorkのアクセストークンについて)

## ステートレス認証の実装例

  <img src="https://github.com/yomote/auth0-azure-spa-sample/blob/main/docs/img/stateless_auth.png?raw=true">

- Static Web AppsはSPA用静的ファイルを提供するWebサーバとして機能
- Auth0が発行するトークンはローカルPCで稼働するWebブラウザで管理
- バックエンドAPIには、アクセストークンを用いてWebブラウザから直接アクセス

## ステートフル認証の実装例

  <img src="https://github.com/yomote/auth0-azure-spa-sample/blob/main/docs/img/stateful_auth.png?raw=true">

- App ServiceにExpressサーバをデプロイ。Expressサーバの機能は下記の通り
  - SPA用静的ファイルを提供するWebサーバ
  - [Authroization Code Flow with PKCE](https://auth0.com/docs/get-started/authentication-and-authorization-flow/authorization-code-flow-with-proof-key-for-code-exchange-pkce)の`App`の役割
  - トークンをセッションに格納し、Redisで管理
  - WebブラウザからのAPIエンドポイントリクエストをバックエンドに中継
  - IDトークンの検証やSPAの画面遷移時の認証制御
- バックエンドの実装はステートレス認証と共通

## おわりに

- Auth0 SDKを使用し、Azure上で稼働するWebアプリの認証制御を行う方法を調査
- ステートレス・ステートフル認証にはそれぞれ長所短所があり、要件に応じてどちらを使うか判断すべき
  - 例1. パスワード変更時、認証の即時失効が必要要件 => ステートフル認証
  - 例2. スケーラビリティを重視 => ステートレス認証
Microsoft Teams とのインテグレーション

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)

---------------

+ [Microsoft Teams とのインテグレーション](https://help.salesforce.com/s/articleView?id=sf.teams_int_parent.htm&type=5)

+ [フローを使用して Microsoft Teams にメッセージを投稿する](https://unofficialsf.com/use-flows-to-post-messages-to-microsoft-teams/)

+ [受信 Webhook を作成する](https://learn.microsoft.com/ja-jp/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook?tabs=dotnet)


+ [当社のサービス チームのメンバーによると、以前は Salesforce の連絡先レコードで携帯電話番号をクリックすると、Microsoft Teams 経由でその電話番号に自動的に電話をかけることができたそうです。 ](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007eppD9SAI)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/79a4b0dc-c3e0-d34f-1c41-98dc1bbdac0b.png)


:::note
ラップトップの構成のようです。これを試してください:

https://answers.microsoft.com/en-us/msteams/forum/all/how-can-i-configure-a-custom-teams-app-to-be-my/30003959-7d34-4b06-9012-9747ff3e1e3f
:::

+ [Microsoft Teams "Webinar" Integration with Sales Cloud](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000MYhQq)

:::note
Microsoft Teams ウェビナーと Salesforce (Sales Cloud) の間にはウェビナーの自動作成のための直接的な組み込み統合はありませんが、Microsoft Graph API と Salesforce Apex を使用したカスタム開発を通じて同様の結果を達成できます。これにより、サードパーティの統合ツールに依存せずにウェビナー データを同期し、ウェビナーの作成を自動化し、ワークフローを合理化できます。   


次のような同様のアイデア交換も役に立つかもしれません: 
https://ideas.salesforce.com/s/idea/a0B8W00000GdZ9pUAF/create-a-pardot-connector-for-microsoft-teamss-webinar-feature

追加リソース: 
https://help.salesforce.com/s/articleView?id=sales.teams_int_parent.htm&type=5
:::

+ [Salesforce and Microsoft Teams Outbound Webhook Integration Error?](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000MYaGj)


# M365 copilot 

+ [Integrate M365 co pilot and salesforce](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000SXR9H)
Chrome Developer ToolでDockの表示位置をショートカットで切り替えてサイト制作の時間を短縮しよう

## この記事の対象読者
- ブラウザはGoogle Chromeを使っている。
- ディベロッパーツールの起動の仕方を知っている。
- スマホ用とPC用の画面とで表示が異なるレスポンシブなWebサイトを作っている。

## この記事を読んでできるようになること
- スマホ用の画面を検証している時は、ドックを右側に、PC用の画面を検証している時は、ドックを下側に表示させたい。
- 以上の切り替え操作をショートカットでできるようになる。

## ドック(dock)という用語について
- この記事では英語表記を参考に下図の赤枠の箇所をドック(dock)と表現しています。
- 日本語ではウィンドウ(window)という表現をされる方もいました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589583/842d57d7-d953-5646-14e8-c3001239f29a.png)

## 設定手順
1. Developer Toolを起動する。
2. 縦3つのドットをクリックし、”Dock to right”を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589583/cd40e1fb-91f6-f0fc-e42c-ede7fc472e72.png)
3. 再度縦3つのドックをクリックし、”Dock to bottom”を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589583/9ee05d12-50e3-b056-bb7e-39b00d225466.png)
4. 以下のショートカットでドックの表示位置を切り替える。  
[Windows]
` Ctrl + Shift + D  `
[Mac]
` Command + Shift + D  `

## 仕組み
- [Windows] `Ctrl + Shift + D`/ [Mac] `Command + Shift + D`は直近二つの手動による表示位置を切り替えます。

- 上記手順は、ドックの表示位置を右<->下で切り替える例でしたが、右でなく、左<->下といった具合に組み合わせを変えることもできます。
その場合は、手順2で”Dock to right”を設定した後、以降の手順を試してみてください。左<->下の順で切り替わります。

## 参考にした記事
https://engineering.webstudio168.jp/2022/02/google-chrome-dev-shortcut/#toc5
https://developer.chrome.com/blog/toggle-the-devtools-dock-state-with-a-keyboard-shortcut/
ChromeエクステンションとGASの連携について

 ファイル構成の概要

この記事では、ChromeエクステンションとGoogle Apps Script（GAS）を連携させるプロジェクトのコード解析を行います。まずは、プロジェクトの主要なファイルについて説明します。

 `manifest.json` の解析

このファイルから得られる主要な情報は以下の通りです：

- `manifest_version`: 3（Manifest V3を採用）
- `name`: "ChromeエクステンションとGASを連携させるやーつ"
- `version`: "1.0"
- `permissions`: "identity", "activeTab", "scripting"
- `background`: `background.js` をバックグラウンドスクリプトとして使用
- `content_scripts`: Google Meet（"https://meet.google.com/"）で動作する `contentscript.js`
- `action`: ポップアップとして `index.html` を使用

 `background.js` の解析

このスクリプトには以下の主要な機能が含まれています：

1. ブラウザのアクションボタンがクリックされた際に、`index.html` を新しいタブで開く。
2. タブが閉じられたときに、特定のGASのエンドポイントにPOSTリクエストを送信。

 `contentscript.js` の解析

このスクリプトには以下の主要な機能が含まれています：

1. `readParticipants()` という関数で、Google Meetの参加者の名前を取得。
2. 参加者の名前はDOMの特定のdiv要素から抽出。
3. 抽出した名前は配列に格納。

 `popup.js` の解析

このスクリプトには以下の主要な機能が含まれています：

1. スクリプトが実行された際に、コンソールに "start" と出力。
2. `record` というIDを持つHTML要素がクリックされた際に、バックグラウンドスクリプトに "updateParticipantsTime" メッセージを送信。

 コードのフローとレビュー

 コードの動作フロー

1. ユーザーアクション: アクションボタンをクリックすると、`background.js` が `index.html` を新しいタブで開きます。
2. タブのクローズ: タブが閉じられると、`background.js` がGASのエンドポイントにデータをPOSTします。
3. Google Meet参加: `contentscript.js` がGoogle Meetの参加者名を取得します。
4. ポップアップ操作: `popup.js` で特定のボタンがクリックされた場合、バックグラウンドスクリプトにメッセージが送られます。

 コードレビューと改善点

1. 可読性: コードには適切なコメントがありますが、全体的なフローの説明が不足しています。
2. 冗長性: `popup.js` で同じイベントリスナーが二重に追加されている点が改善の余地があります。
3. エラーハンドリング: ネットワークリクエストやDOM操作でのエラーハンドリングが不足しています。
4. セキュリティ: GASのエンドポイントURLがハードコードされているのはセキュリティリスクです。
5. モジュール性: 各JSファイルは独立して機能していますが、拡張性や再利用性を考慮するとモジュール化が望ましいです。

以上、基本的な機能は備わっていますが、いくつかの改善点が見られます。
UNIX

Chartsライブラリを使用してXcodeのStoryboardでUNIX時刻を分まで表示するための方法を説明します。

1. **X軸の設定**：
   X軸にUNIX時刻を分まで表示するために、X軸のラベルフォーマッターをカスタマイズします。

   ```swift
   let xAxis = chartView.xAxis
   xAxis.valueFormatter = DateAxisValueFormatter() // DateAxisValueFormatterは後で作成します
   xAxis.labelPosition = .bottom
   xAxis.granularity = 60.0 // 60秒ごとにラベルを表示
   ```

2. **DateAxisValueFormatterの作成**：
   カスタムフォーマッターを作成して、UNIX時刻を分まで表示するために次のように設定します：

   ```swift
   class DateAxisValueFormatter: NSObject, IAxisValueFormatter {
       private let dateFormatter = DateFormatter()

       override init() {
           super.init()
           dateFormatter.dateFormat = "HH:mm:ss" // 例：時間、分、秒のフォーマット
       }

       func stringForValue(_ value: Double, axis: AxisBase?) -> String {
           return dateFormatter.string(from: Date(timeIntervalSince1970: value))
       }
   }
   ```

   このカスタムフォーマッターは、X軸ラベルをUNIX時刻から時間、分、秒まで正確に表示します。

3. データをグラフに追加する前に、UNIX時刻を持つデータポイントを準備し、それを正確な日付と時刻に変換してからグラフに追加してください。

これらの手順に従うことで、Chartsライブラリを使用してUNIX時刻を分まで表示できます。秒まで表示する場合は、`dateFormatter.dateFormat`を`"HH:mm:ss"`から`"HH:mm"`に変更してください。それにより、UNIX時刻から秒まで正確に表示されます。

グラフのX軸の間隔を調節するには、Chartsライブラリの `xAxis` プロパティを設定します。以下は、X軸の間隔を調節する方法です：

```swift
let xAxis = chartView.xAxis

// ラベルの間隔を調整する
xAxis.granularity = 60.0 // 60秒ごとにラベルを表示
```

上記のコードでは、X軸のラベルの間隔を60秒（1分）ごとに設定しています。このように設定することで、グラフ上に表示されるラベルが1分ごとに配置されます。間隔を他の値に調節することも可能です。たとえば、15分ごとにラベルを表示するには `xAxis.granularity = 900.0` とします。

間隔の調整を行うことで、グラフのX軸ラベルが表示される頻度を制御できます。必要に応じて、データと表示の精度に合わせて間隔を調整してください。
VB.Netの実装あれこれ


### Usingを使ったファイル書込み

```vb
Dim utf8 As New UTF8Encoding(False) 'BOM無し
Using sw As New StreamWriter("ファイルパス", True, utf8)
  sw.WriteLine(errorInfo)
End Using
```

### ファイル更新日時が新しいものから順番に並べ直す

```vb
Dim fileList As New List(Of FileInfo)

'ファイル取得処理
'・・・

'ファイル更新日時が新しいものから順番に並べ直す
Dim sorted() As FileInfo = fileList.OrderByDescending(Function(n) n.LastWriteTime).ToArray()
```

### exeファイルと同じフォルダにあるiniファイルを指定する

```vb
AppDomain.CurrentDomain.BaseDirectory & "Setting.ini"
```

### Datatableから特定の列の値を取得して、リスト化する

```vb
Dim valueList As List(Of String) = DT.Select(caseWhere).AsEnumerable().Select(Function(row) row("列名").ToString).ToList()
```

### VBにおける日付のデータ型
Date、DateTime、TimeSpanなどがある
DateとDateTimeは日時、TimeSpanは時間を表す
DateTimeのほうが一般的らしい

### VB.NETにおけるstaticとshared
sharedはクラスレベルで定義し、ずっと有効
staticはブロックレベルで定義し、クラスが消滅するまで

### 多重起動を防止する方法
いくつか実装方法はあるが、以下の方法が一番簡単
＜実装手順＞
１．アプリケーションのプロパティを開く
２．「単一インスタンスのアプリケーションを作成する」にチェックを入れる
３．「アプリケーションイベントの表示」をクリックすると
ApplicationEvents.vbファイルが表示されるようになる。
４．ファイルのクラス内に以下のコードを実装する。
```vb
Private Sub MyApplication_StartupNextInstance( _
ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs) _
Handles Me.StartupNextInstance
'多重起動しようとした時の処理を実装する
Dim msg As String = "多重起動はできません。"
Dim title As String = My.Settings.ExeName
Dim style As MsgBoxStyle = MsgBoxStyle.SystemModal
MsgBox(msg, style, title)
End Sub
```

### 特殊な代名詞
Me：Javaで言うthisと同義、現在のインスタンスを指す
MyClass：自クラスを指す、Javaでこれにあたるのは無い？？
MyBase：規定クラスを指す、Javaで言うSuper

### MustInheritとNotInheritable修飾子
クラスにつけるもの
MustInheritは、抽象クラス(Javaでいうabstract)
NotInheritableは、継承させないクラス(Javaでいうfinal)

### テキストボックスに入力された文字
文字列、数値問わず全てString型となる

### AndAlsoとOrElse
Javaでいう&&と||と同じ
1つ目を満たせば2つ目は評価しない

### 文字列の連結
&と+で連結できる

### call文について
FunctionやSubプロシージャを呼び出すのに使うが、call文がなくても
FunctionやSubプロシージャは呼び出せるので、call文は使用しないほうが良い

### 型変換の方法
・CType
　よく使う
　使い方としては、CType（変換対象オブジェクト, クラス型）
・DirectCast
　パフォーマンスが良い、理由は暗黙的型変換が行われないから
　使い方としては、DirectCast（変換対象オブジェクト, クラス型）
・TryCast
　型変換出来なくても例外が発生しない、その場合、Nothingが返る
　使い方としては、TryCast（変換対象オブジェクト, クラス型）

### デバッグ
・ステップイン(ショートカットキー：F11)
　ステートメント1行単位の実行、関数があれば関数内部に入っていく
・ステップオーバ(ショートカットキー：F10)
　ステートメント1行単位の実行、関数があっても関数内部には入っていかない
・ステップアウト(ショートカットキー：Shift + F11)
　今実行している関数の外まででる

### Option ExplicitとOption Strict
Option Explicitは、変数を宣言しないと使えないという意味
Option Strictは、変数の型宣言をしないといけない、型変換は明示的にしないといけないという意味

### 標準出力への書き込み
Console.Out.WriteLine

### ByValとByRef
ByValは値渡し
ByRefは参照渡し
引数に、ByRefを指定して、メソッド内でその変数を変更した場合、メソッドの呼び出し元にも影響がある
ByValを指定すると変数のコピーが渡されるため、メソッドの呼び出しに影響はない

### 等価比較
比較の方法は２つ
・=で比較する
　⇒値の等価を調べる
・Equalsで比較する
　⇒参照の等価を調べる
Javaとは違って、String型であっても=の比較で正しい結果が得られるようになっている
Stringが演算子をオーバーロードしているため

### オブジェクトの宣言と初期化
VBでは以下は同義
Dim MyPen As New Pen(Color.Blue)
Dim MyPen As Pen = New Pen(Color.Blue)

### On Error Resume Next
この一文を書くと、それ以降の処理で例外が発生しても無視される

### ClickOnceの情報を取得したい
My.Applicationのなかに色々はいっているみたい

### DataGridViewを表示するときに、セルを選択状態にしない
以下のようにする。
ポイントとしては、Formのloadイベントに書いてもうまくいかない。
DataSourceChangedイベントなどに書く必要がある。
Me.MySimDataGridView.CurrentCell = Nothing

### Dimによる変数宣言
Dim aaa = ""
とした場合、型を指定していないので、Object型になる。

### バージョン管理対象外にすべきもの
binフォルダ
objフォルダ
*.vbproj.user
*.suo(slnファイルは管理対象)
Golang: to Point or not to Point!

### はじめに
こちらの要約とポイントをまとめておこうと思います。
https://itnext.io/golang-to-point-or-not-to-point-79b64e56a1bb

### 要約と説明
この記事は、Go言語でのポインタの使用に関する議論を取り上げています。ポインタには多くの利点がありますが、注意深く使用しないとコードを壊す原因となることもあります。
ポインタを使用するかどうかの決定の難しさや、ポインタのパフォーマンスに関する懸念、スタックとヒープの違いなどについても触れています。以下は、記事の主なポイントをまとめたものです。

1. **ポインタの利点と欠点**: ポインタは多くの利点がありますが、注意深く使用しないと予期しない動作を引き起こすことがあります。
2. **値の渡し方**: Goはすべてのものを値として渡します。ポインタも関数に渡す際にコピーされますが、同じ基本メモリを表しているため、基本値を変更することができます。
3. **パフォーマンス**: ポインタを使用することでパフォーマンスが向上するとは限らない。実際には、非常に大きな構造体のみがポインタと比較して遅いパフォーマンスを引き起こす可能性があります。
4. **スタックとヒープ**: スタックはアクセスが高速で、ヒープはガベージコレクタによって管理されるため、一定の遅延が発生することがあります。
5. **ポインタの選択**: ポインタを使用するかどうかの決定は、コードの可読性や簡潔さに基づいて行うべきです。

### 要約
ポインタの使用に関する決定は、パフォーマンスやコードの複雑さを考慮して慎重に行う必要があります。パフォーマンスの問題が確認された場合、まずベンチマークでそれを証明する必要があります。ポインタの不適切な使用は、パフォーマンスの低下や不要な複雑さを引き起こす可能性があります。

### [参考リンク]
[The Stack and the Heap — GopherCon SG 2019](https://www.youtube.com/watch?v=ZMZpH4yT7M0)
[runtime: don’t allocate for non-escaping conversions to interface{}](https://github.com/golang/go/issues/8618)
[fmt.Println causes memory escape](https://github.com/golang/go/issues/31317)