OmniAICreator/Qiita-1.07M huggingface dataset:
Azure ML Studio でのパイプラインのキャッシュの再利用。

# 背景

pipeline 動作をさせていた際、キャッシュの動きがよくわからなかったので、調べた記録

Console-to-Code の Azure 版はいつですか？ :laughing: 

# 結論

- 以下のフローに従う

![再利用フロー](https://learn.microsoft.com/ja-jp/azure/machine-learning/media/how-to-debug-pipeline-reuse/reuse-logic.png?view=azureml-api-2)

# 補足

- キャッシュされたかどうかは、以下アイコンで判断可能

![キャッシュアイコン](https://learn.microsoft.com/ja-jp/azure/machine-learning/media/how-to-debug-pipeline-reuse/recycle-icon.png?view=azureml-api-2)

- 再利用条件は以下

> 再利用条件:
> - コンポーネントの定義が is_deterministic = true
> パイプラインのランタイム設定が ForceReRun = false
> コンポーネント コード、環境定義、入力とパラメーター、出力設定、実行設定がすべて同じ。



- 作成済みの pipeline の再設定は出来無さそう 2023/11/14
    - GUI にはないってだけなので、CLIだともしかしたら出来るかも？（未確認）
- 変更したい場合は、pipeline draft から [Configure & Submit] で job 再作成
    - Force Rerun を ☑ 入れれば、キャッシュ無視が可能


# あとがき

GUI だけで結構便利に使えるんだけど、やっぱり pipeline となると、Yaml で生成して CLI でって感じがする。

AWS での Console-to-Code が Azure にも欲しいけど・・既にあったりするんかな？


[Console-to-Code はここに詳しい](https://dev.classmethod.jp/articles/console-to-code/)



AWS vs Azure のサービス比較にも、最新機能過ぎて記載されてない :sweat: 

https://qiita.com/baku2san/items/0c97bf5d3445ab5e811f
行っている勉強会の話

# はじめに
この記事は2023年度の振り返りです。

今年も、去年から継続で新人向けに勉強会を開催していましたので、それの振り返りです
(zennで書いた内容とも少し重複しますが、そこは割愛で。。。)

# 勉強会の内容
railsを主体とし、active recordを中心にした内容にしています。(合わせてSQLも学ばせてます)
理由としては、社内ではSQLを知らずにactive recordを最初に触って、それが中心になってる初学者が目に付いたからです。
(SQLにこんな機能があって、それをactive recordでも書けることを伝えたい。。。)

# 勉強会の方向性
言語の勉強は、基本手を動かさないと習得度が低くなると考えています。
そのため、ハンズオン形式で実施しておりますが、勉強会となると難しい所があります。
そういう所を鑑みた結果、モブプログラミングを採用し、メンバーでタイピストを回しながら、全員で議論しつつ問題を解くような形式をとっています。
また、この勉強会では、ベストプラクティスは教えるというのではなく、解答を導く手段を多く教えるようにしています。
(1問とはいえ、解き方を変えて3回解かせてたりします)

# ここ最近の悩み
答えを伝えるのは簡単なんですが、その答えに行きつくように受講者をハンドリングするのが難しいと感じています。
毎回、これを使えばー、あれを使えばー、と、喉まで出かかった物を止めています。
が、偶にこれはどう伝えればこの解き方に行きつけるのだろう？と悩みます。
説明が下手な自分の修行の場と考えて、今後とも精進していきたいものです。

# さいごに
4月受講開始で2チームを担当しており、その2チームで発生した内容を短いシリーズとして書いていこうと思います。
資格・試験一覧　フロントエンジニア、ウェブデザイナーver

1.　illustratorクリエイター能力認定試験
2.　Photoshopクリエイター能力認定試験
3.　ウェブクリエイター能力認定試験　スタンダード
4.　ウェブクリエイター能力認定試験　エキスパート
5.　ウェブデザイン技能検定　3級・2級・1級（国家資格）
6.　ウェブデザイナー検定
7.　色彩検定　UC級・3級・2級・1級
8.　kusanagi for wordpress認定試験
9.　PHP8初級試験、上級/準上級試験
10.　ウェブ・セキュリティ基礎試験(徳丸基礎試験）
11.　ウェブ・セキュリティ実務知識試験(徳丸実務試験）
12.　ITパスポート（国家資格）

バックエンドエンジニアからするとPHP知ってくれてると嬉しいかもな？
デザイナーの方がPJでPHPの知識がなくて苦しそうだったからなんとなく書いときました。
基本情報まではいるかな？っと思い、、、。基本情報とるんだったら応用情報とれ！っと常々上司にいわれてる。
初心者エンジニアが GitHub Issue の作成から得たこと

## はじめに
私は Web アプリケーションエンジニアとしてのキャリアがまだ浅く、学びながら業務に取り組んでいます。そんな日々の業務の中で扱う GitHub Issue を通じていくつかの学びがありました。

この記事では、GitHub Issue の作成から得られた経験や学びについて紹介します。

## 初心者エンジニアがGitHub Issueの作成から得たこと
### GitHub Issue の役割
私が所属するチームでは、開発タスクなどを GitHub Issue で管理しています。

https://docs.github.com/ja/issues/tracking-your-work-with-issues/about-issues

Issue は、バグの報告やタスクの割り当てのなど、プロジェクトの進行をサポートしたり、関連情報を記録するのに役立ちます。

### GitHub Issue を作成することのメリット
私はエンジニアの経験が浅いため、少しでもチームに対して貢献ができるように率先して Issue を作成したり、会議の進行などを行っていました。これらのことを通じて、いくつかの重要な利点があることに気づきました。

#### 1. ドメイン知識の増加
Issue には、タスクを遂行する上で必要な情報を記載しておく必要があります。私はその情報がわからないことが多かったため、よくチームメンバーに質問していました。その過程でプロダクトや技術に関する知識が自然と深まりました。

#### 2. コードレビューを通じた学び
実際に自分がその Issue を対応しない場合でも、自分で Issue を作成しておいてよかったと思ったことがありました。それは、Issue の状況がメールで送られてくることです。

自分で作成した Issue にコメントが来たり、Issue に紐づく Pull Request にレビューのコメントなどをしたりすると、メールが送られてきます。それを確認すると、メンバーがどういうやりとりをしているか、コードレビューしている内容がわかります。それらを読んで全部を完全に吸収できるわけではありませんが、この過程でより良いコーディング慣行や問題解決の技術について学ぶことができます。

#### 3. チーム内コミュニケーションの活性化
1 と 2 を通して、結果的にチームメンバー間のコミュニケーションが活性化したと思っています。

## さいごに
今回は、初心者エンジニアである私が GitHub Issue を作成してよかったことについてまとめました。最初は GitHub Issue を単なるタスク管理ツールとしか思っていませんでしたが、結果的に自分のスキルを向上させるために役立ったと思っています。

この記事が、同じような立場にある方々にとって、何かしらのヒントを与えることができれば幸いです。
VirtualBoxでLinuxをインストールする際に画面が見切れるのを改善する方法

## はじめに
VirtualBoxでLinuxをインストールする際に以下の画像のように見切れてしまうのでその対処方法をメモしておく


![Qiita_VirtualBoxでLinux...0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538284/a1d8048c-0f1e-234a-0445-7daa7a135233.png)


## 対処方法
以下の画面の時にtabキーを押して

![Qiita_VirtualBoxでLinux...1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538284/3b63e3e1-b109-1838-65bf-3cb7e3d5f159.png)


vga=askを入力して「Enter」を押す
![Qiita_VirtualBoxでLinux...2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538284/652e3fd0-8d8a-4fb1-3043-5861f7062cab.png)


Press ＜ENTER＞ to see video modes available, ...と表示されるので「Enter」を押す
Resolutionを選んで(出来るだけ大きい1280×1024)、そのModeを入力して「Enter」で実行するとインストール画面に移る。見切れてたのが改善されていると思う。

![Qiita_VirtualBoxでLinux...4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538284/d303ecdb-ad44-4f89-581c-8d17ba7fdb53.png)

![Qiita_VirtualBoxでLinux...5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538284/9da4d7d1-0a8d-11c0-c94e-adda02c42f5d.png)
22歳高卒セキュリティ業務未経験エンジニアが一発で情報処理安全確保支援士に合格した話

# はじめに
今回、令和5年度秋期の情報処理安全確保支援士を合格しました。
お恥ずかしながら点数は非常にギリギリでした。
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355973/1c36b1f2-9041-f8c3-c088-9f0fe8afb2f6.png)

でも合格は合格なので許してほしい！！

# 自身のスペック
* 年齢：22歳
* 学歴：高卒
* 職種：モバイルアプリ開発エンジニア(に転職したばかり)
* 保持資格：基本情報技術者試験及び応用情報技術者試験
* セキュリティ業務経験：一切無し

# 試験の感想(午前II)
易しめ。
しっかり学習しておけば受かるが、暗記メインだと難しそうな印象があった。

# 試験の感想(午後)
問3 / 問4を選択。

問3は化け物すぎた。
コンテナなんてDockerで少し触ったくらいですよ...。

問4は鬼畜の所業。
とはいえ、マルウェア + キーロガーの組合せを思いついたのは大きかった。
問3が悲惨だったのでここに全てがかかっていた。

# 勉強時間
大体、1カ月半程度です。
平日は仕事終わりで2-4時間程度
休日はバラツキますが、4-10時間程度勉強しています。

4-10時間って集中力持たなくない？と思う方もいらっしゃるかもしれませんが、
朝1.5時間 / 昼1.0時間 / 夜2.0時間みたいに分割すると意外とちょろいっす。
なお、これは応用情報受かった前提での勉強時間です。

基本情報レベルから計算したら600-800時間とかは学習しています。
勉強方法の誤りのせいで応用情報でかなり沼にハマりました。

# 勉強方法
## 午前I
今回、午前Iは免除だった為一切勉強していません。
ただ、もし自分が午前Iを受ける立場なら恐らく、APの過去問道場を何周もしているでしょう

## 午前II
SCの過去問道場を永遠と学習していました。
範囲は、H25春~R4秋位で、受験時での段位は、3段でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3355973/8a966016-7ce0-e2a3-f12e-eac37654b253.png)

とにかく、午前IIは正答率を90%キープすることを目指していました。
どんな問題・類が来てもです。

## 午後
午後については2点ポイントがあります。
1. 何度も午後問題を練習してくこと
2. 暗記ではなく理解をすること

実は特にこの2が本当に重要です。

# 理解をするとは？
これ、意外とされてる方いません。
例えば、DNSにを例に挙げます。
DNSは名前解決要求を行う際に使われますが、皆さんこの程度で理解を止めてしまっていませんか？
具体的に、DNSサーバの中にはキャッシュサーバやコンテンツ(権威)サーバがあります。
リゾルバからキャッシュサーバに対して、名前解決要求が行われた際にキャッシュサーバが当該データを保持していればそれらを返すが、保持していない場合はコンテンツ(権威)サーバに問い合わせる。
その時に使われる情報の1つにトランザクションidが使われて...とここまで理解を深めておく必要があります。

# 理解することの重要性
理解することの重要性はまだまだ活きます。
情報処理安全確保支援士は、サイバーセキュリティを対象とした資格試験ですが実体はネットワークにもかなり入り込んでいます。
それ位、サイバーセキュリティとネットワークは密にあるんですね。
例えば、さっきのDNSの例を再度挙げましょう。
キャッシュサーバがコンテンツサーバにデータを引き渡す、といった時に私はこんな疑問が出てきました。
「ん？ならもしキャッシュサーバがデータを返す前に攻撃者が偽装してコンテンツサーバにデータ返せたらどうなるの？」と...。
それがまさかのサイバーセキュリティのDNSキャッシュポイズニング攻撃に繋がっていました。
つまり、ネットワークの基礎・仕組みを学ぶことで、*必然的にサイバーセキュリティ*へ繋がるのです。
これに気が付くと仕組みの重要性が更に高まるのではないでしょうか。

# 勉強した分野
## 特に重点的に抑えた分野
* 認証・認可（SAML、OIDC、Oauth）
* 公開鍵暗号
* デジタル署名
* HTTP/HTTPS
* DNS
* プロキシ
* デジタル証明書

## ある程度抑えた分野
* 共通鍵暗号
* メッセージ認証コード
* TLS
* FW

## ちょっとだけ抑えた分野
* DKIM
* SPF
* オンプレ関係

# 最後に
やはり、情報処理安全確保支援士は難しいです。
ネットでは国語さえ出来れば等と囁かれていますが、私としては技術知識も一定程度の水準で必要だと思います。
特に今回の午後の問4は、攻撃の種類を知っているだけ、とかだと手も足も出ないでしょう。
問3も文章読み取るだけでは無理で知識力が必須でした。

もし、上記のような勉強方法が参考になれば幸いです。
ぜひ、頑張ってください。
私は、来年からTOEIC&Google Cloud資格を頑張ります！！！
windowsで使うvscode remote developmentでのzsh環境構築

# 経緯
いままでずっとbashを使っていたのですが、zshが便利というのを聞いて使いたくなってみたので、入れてみました。今のところファイル選択の時の補完が優秀ということだけなので、これからもっと使い込んでいきたいです。

環境は以下のとおりです。

- ホストPC
    - windows11
- 接続先
    - ubuntu server
    - wsl2 ubuntu
- 統合開発環境
    - VScode
- 利用拡張機能
    - Remote Development

# zshのインストール

```bash
sudo apt-get update && sudo apt-get upgrade
sudo apt-get install zsh
```

そのあとzshを起動させる。

```bash
zsh
```
するとconfigrationメッセージがでてくるがdo nothingのqを押す。

# Prezto
zshの設定のフレームワークのPreztoをインストールして設定する。
https://github.com/sorin-ionescu/prezto
インストール方法はgithubにも記載してあるのでそちらを参照してもOKです。

```bash
git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"
```
```bash
setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done
```

デフォルトshellをzshに変更する

```bash
chsh -s /bin/zsh
```

# spaceship-prompt
今回はオシャレなspaceship-promptを利用する。
https://github.com/spaceship-prompt/spaceship-prompt

インストール方法に従ってコマンドを入力していく。

最初にprezrto-contribを入れる。(これがないとテーマが使えない)
```bash
cd $ZPREZTODIR
git clone --recurse-submodules https://github.com/belak/prezto-contrib contrib
```
 zshの設定ファイルである`~/.zpreztorc`を編集する
以下のように編集する

before
```
zstyle ':prezto:load' pmodule \
  'environment' \
  'terminal' \
  'editor' \
  'history' \
  'directory' \
  'spectrum' \
  'utility' \
  'completion' \
  'history-substring-search' \
  'prompt'
```
after
```
zstyle ':prezto:load' pmodule \
  'environment' \
  'terminal' \
  'editor' \
  'history' \
  'directory' \
  'spectrum' \
  'utility' \
  'completion' \
  'history-substring-search' \
  'contrib-prompt' \
  'prompt'
```

そして、`~/.zpreztorc`にテーマ設定があるので、
`zstyle ':prezto:module:prompt' theme 'spaceship'`と記載する。
もともとsorinが設定されているとおもうので、そこにspaceshipと上書きすれば良い。

# VScodeの設定
これでも使えるのだが、spaceshipがPowerLineというFontを使っている。しかし、windows側にこのfontがないと文字化けしてしまうので、fontをインストールして文字化けを治す

## fontのインストール
このファイルをダウンロードして、右クリックからのインストールをする。
https://github.com/powerline/fonts/blob/master/UbuntuMono/Ubuntu%20Mono%20derivative%20Powerline.ttf

## VScodeでのフォント設定
VScodeの設定画面で`terminal.integrated.fontFamily`の項目を先程インストールしたフォントである`Ubuntu Mono derivative Powerline`を設定し、VScodeを再起動する。
導関数 dy/dx を分数扱いする

　この記事は[ちゅらデータ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/churadata) 22日目の記事です。
 
　導関数を表す記法 $dy/dx$ はあたかも分数のようですが、導関数は分数では**ありません**。一方で、合成関数の微分では
$$ \frac{dy}{dx} = \frac{dy}{du}\frac{du}{dx} $$
と $dy$ を分子、$dx$ を分母のように扱って計算することが許されています。この式を見ていると、$dy/dx$ を分数として扱うことをどうにか正当化したいという気持ちになってきますね。

# 微分のおさらい
　関数 $y = f(x)$ の入力を変化させてみたときのことを考えてみましょう。入力 $x_0\in \mathrm{dom}(f)$ から正の方向に $\Delta x >0$ だけ動かす、つまり入力が $x_0$ から $x_0 + \Delta x $ に変化したとき、出力の変化 $\Delta y$ は $f(x_0)$ と $f(x_0 + \Delta x)$ の差分
$$ \Delta y = f(x_0 + \Delta x) - f(x_0)$$
となります。入力の変化あたりの出力の変化
$$\frac{\Delta y}{\Delta x} = \frac{f(x_0 + \Delta x) - f(x_0)}{\Delta x}$$
を $f$ の $x_0$ から $x_0 + \Delta x$ までの**平均変化率**といいます。入力の変化幅 $\Delta x$ についての極限をとった
$$ \frac{dy}{dx}(x_0) = \lim_{\Delta x \rightarrow 0} \frac{f(x_0 + \Delta x) - f(x_0)}{\Delta x}$$
を $f$ の $x_0$ における**微分係数**といい、入力 $x$ に対し「$x$ における微分係数」を出力する関数
$$\frac{dy}{dx} = \frac{dy}{dx}(x) = \lim_{\Delta x \rightarrow 0} \frac{f(x + \Delta x) - f(x)}{\Delta x}$$
を $f$ の**導関数**といいます。導関数の $(x)$ は省略されがちです。いつでも導関数が求められるとは限りませんが、関数からこの導関数を求めるのが**微分**です。

# 分数扱いすることを正当化したい
　導関数は分数のような記法で表されますが、「何かを何かで割ったものの極限」はもはや「何かを何かで割ったもの」として扱えるものではないため、分数ではありません。そのため、微分を教える際に「$dy/dx$ は分数のように表されるが分数ではない」と注意しておく必要があります。しかし冒頭で述べた通り、導関数を $dx$ 分の $dy$ だと思いたくなるような場面もあるのです。

　高校数学で習う微分の応用として、「接線の方程式を求める」ことが挙げられます。関数 $y = f(x)$ の点 $\left(a, f(a) \right)$ における接線の方程式は、微分係数を用いて
$$ y - f(a) = \frac{dy}{dx}(a) \left( x - a \right)$$
と表せました。$\mathrm{dy}(a) = y - f(a), \mathrm{dx}(a) = x - a$ とおくと、この方程式は
$$ \mathrm{dy}(a) = \frac{dy}{dx}(a)\ \mathrm{dx}(a) $$
と書き換えられます。$dy$ は $y$ 方向の変化量で、$dx$ は $x$ 方向の変化量というわけです。両辺を $\mathrm{dx}(a)$ で割ることで、
$$\frac{\mathrm{dy}(a)}{\mathrm{dx}(a)} = \frac{dy}{dx}(a)$$
が得られます。$a$ を変数と考えると
$$\frac{\mathrm{dy}}{\mathrm{dx}} = \frac{dy}{dx}$$
となり、導関数を「$x$ 方向の変動」分の「$y$ 方向の変動」で表すことができました。

　そもそも定義からして分数ではないので「分数ではない」でよいのですが、結果的に「何かを何かで割ったもの」と考えられるよ、というお話でした。

# 参考文献
- 高木貞治. 解析概論 改訂第三版, 岩波書店. 1983.
【簡単に定例を効率化】WEBの情報をメールで共有！

## 定例のコピペメールは自動で送ってほしい！

みなさんこんにちは！ショッピングモールで施設管理をしているobatanです。



業務効率化の部署でも何でもない普通の現場事務所なのですが、私は「脳死でコピペ / 書き写し」がとにかく大嫌い！
今回は、Power Automate Desktopを用いて、メールの自動送信に取り組んでみましょう

## とりくみ

:::note warn
お詫び
冒頭早速のお詫びで申し訳ありません。<br>ここで皆さんに動画をご覧頂き、「実際動くとこんな感じですよ」というご紹介をしたかったのですが、動画にすると社内サイトのURLと送信先のメールアドレスが公開されるという問題が起こりました。
:::
そのため、せめてどんな感じになったか、をお伝えすべく該当箇所にモザイクを入れましたので、下の画像をぜひご覧ください。
※動作自体は10秒かからずで終了します。

![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3580275/1fa0c431-c2a1-e70b-fede-5043a6c36caf.png)

<details><summary>ご自身のPADで試してみる方はこちら</summary>

https://url.ccomは私の場合社内サイトのURLになっていますので、差し替えてください。
from@fromからtest@testにメールを送信するフローになっていますので、ご利用のメールアドレスに変更ください。

``` Power Automate

DateTime.GetCurrentDateTime.Local DateTimeFormat: DateTime.DateTimeFormat.DateAndTime CurrentDateTime=> CurrentDateTime
WebAutomation.LaunchChrome.LaunchChrome Url: $'''https://url.ccom''' WindowState: WebAutomation.BrowserWindowState.Normal ClearCache: False ClearCookies: False WaitForPageToLoadTimeout: 60 Timeout: 60 BrowserInstance=> Browser
WebAutomation.ExtractData.ExtractTable BrowserInstance: Browser Control: $'''html > body > div:eq(0) > main > section > table > tbody > tr''' ExtractionParameters: {[$'''td:eq(7)''', $'''Own Text''', $'''''', $'''Value #1'''], [$'''td:eq(5)''', $'''Own Text''', $'''''', $'''Value #2'''], [$'''td:eq(6)''', $'''Own Text''', $'''''', $'''Value #3'''] } PostProcessData: False TimeoutInSeconds: 60 ExtractedData=> DataFromWebPage
WebAutomation.CloseWebBrowser BrowserInstance: Browser
Outlook.Launch Instance=> OutlookInstance
Outlook.SendEmailThroughOutlook.SendEmail Instance: OutlookInstance Account: $'''from@from''' SendTo: $'''test@test''' Subject: $'''【AMW】%CurrentDateTime%時点''' Body: $'''以下の申請を受付中にしておりますので、担当者は確認をお願いします。

[開始日時] [業者名] [内容]

%DataFromWebPage%''' IsBodyHtml: False

```
</details>

Power Automate Desktopは、ノーコードでRPAを行えるツールの為、どういう挙動をするかが日本語で書いてあります。とても分かりやすい！

今回は『簡単』を謳っていますので、フローを簡単にご説明します。
|番号|フロー名|内容|
|:--:|:--|:--|
|1|現在の日時を取得|現在の日時を取得します|
|2|新しいChromeを起動する|アクション内で指定したURLを開きます
|3|Webページからデータを抽出する|2番で開いたChromeから情報を吸い上げます。Power AutomateではChrome画面をクリックして選択できるので、HTMLの知識が無くても、画面の情報を選べます。
|4|Webブラウザーを閉じる|開いたブラウザーは閉じましょう<br>制作中に何回もフローを実行した際にChromeの数がとんでもないことになります
|5|Outlookを起動します|名の通りです。
|6|Outlookからのメール メッセージの送信|メールの宛先・本文を設定することが出来ます。

## 実際に使ってみた結果…
せっかく完成したフローですので、誰かに使ってみてもらいレビューを受けてみましょう。
複数部署を経験し、現部署を俯瞰してみることが出来る先輩社員に協力を要請します。

冒頭に、
「いつもやってる〇〇の業務ですけど、効率化ツールを作ってみたので、一回試してもらえませんか？」とお願い。メールの宛先を設定し、実際に送信してみました。
緊張の第一声は…

### ぜひやってほしい！！！

やったー！上々の手応えです！

まだまだ未完成形なのは承知なので、改善できる点を聞いてみました。
- 開始日時は日付だけで良いのでは？
- 1行が長くなればなるほど見にくい、表形式で出ると嬉しい
- 担当者の名前が出てほしい
- そのページに直接飛ぶリンクが欲しい（⇒[承認はこちら]的な）

どれも達成が可能そう…？
まず、上記の課題は解決させましょう。
リリース後、また投稿させて頂きます！


## 余談


先輩社員「1日10分かかる作業として考えると、めちゃくちゃ経費削減になるんじゃない？」

せっかくなので計算してみましょう。

- 10分（日）× 365日（年間）＝　3650分　≒　60時間

- 全国の150拠点全てで共通する業務なので、
60（時間） ×　150（拠点）　＝　9000時間

- 仮に社員の人件費が¥1500/時間だとすると、
9000（時間）　×　¥1500　＝　¥13,500,000

とんでもない金額がはじき出されました。
フローの作成に1時間も掛かっていないので、費用対効果は抜群です。

業務効率化は、単純作業から解放される精神面での喜びと、会社から見ても大幅な経費節約というWin-Winな関係だということを再認識しました。
この数字を見ると、俄然やる気が出てきますよね(?)
これからも、もっと頑張ろう！
OpenTelemetry設定ファイルが見つからないのでコマンドで済ませる。

### 備忘録
AWS ECSのtaskdefにぶち込む用
```
"command": [
  "/bin/sh", "-c",
  "echo 'receivers:\n  awsxray:\n    transport: udp\nexporters:\n  awsxray:\n    region: \"us-west-2\"\nservice:\n  extensions:\n  pipelines:\n    traces:\n      receivers: [awsxray]\n      exporters: [awsxray]' > /etc/otel/config.yaml && otelcol --config=/etc/otel/config.yaml"
]
```
参考
https://aws-otel.github.io/docs/components/x-ray-receiver
ConoHaVPSにDocker（PHP、MySQL、Python、Node.js、phpMyAdmin）を構築

ConoHaVPSにDocker（PHP、MySQL、Python、Node.js、phpMyAdmin）を構築する手順についての覚え書き
## Dockerのインストール
ConoHaVPSのアプリケーションインストールでDockerをインストール

パッケージのアップデート
```
sudo apt update; sudo apt upgrade
```
Dockerが正しくインストールされたか確認します
```
sudo systemctl status docker
```
## ユーザーアカウントの追加
ユーザーの追加（オプション）
```
adduser username
```
ユーザーにsudo権限を割り当てる場合（任意）
```
usermod -aG sudo username
```
ログインできるか確認
```
login
```
ユーザーIDとパスワードを入力

rootアカウントに戻る
```
su -
```
sudo グループの確認
```
groups 【ユーザーＩＤ】
```
sudo コマンドの確認
次のコマンドを使用して、追加したユーザーが sudo 権限を使ってコマンドを実行できるか確認します。
```
sudo -l -U 【ユーザーＩＤ】
```
## 各種サービスを定義する
（PHP、MySQL、Python、Node.js、phpMyAdmin）

次は、docker-compose.yml ファイルを作成
```
cd /home/【ユーザーＩＤ】
```
ファイル編集
```
nano docker-compose.yml
```
ファイルの内容
```
version: '3'
services:
  php:
    image: php:latest
    # PHPの設定を追加

  mysql:
    image: mysql:latest
    # MySQLの設定を追加

  python:
    image: python:latest
    # Pythonの設定を追加

  node:
    image: node:latest
    # Node.jsの設定を追加

  phpmyadmin:
    image: phpmyadmin/phpmyadmin:latest
    environment:
      PMA_HOST: mysql
      # phpMyAdminの設定を追加
    ports:
      - "8080:80"
    depends_on:
      - mysql
```

ファイルを作成・編集したら、docker-compose up -d コマンドを実行してコンテナを起動します。
```
sudo docker-compose up -d
```
各コンテナが起動しているか確認する
```
sudo docker ps
```
以上
AWS 相当の機能を Azure 探すの面倒と思ってたら、MS-Learn に比較があった

# 背景

「AWS の〇〇みたいなやつってで出来るんじゃないかな？」とか言われても、Azure のサービス名とかわからないと困っていた。

が、ひょんなことから、比較表があることに気付いたってだけ

# 結論

以下を見ましょう :sweat: 

https://learn.microsoft.com/ja-jp/azure/architecture/aws-professional/services

なんだかんだ更新もしっかりしてくれてるみたい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/78eba42c-110a-e2dc-6a0c-e30648594c11.png)

まぁ、もちろん、最近のブランド名変更までは対応していないこともあるので、その辺は自分で置換しつつ頑張る

- 以下の例でいえば、Cognitive Service は、Azure AI Service になっている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/13e50b78-5e3c-ae4f-25d0-e24ff0b8bc5e.png)

# あとがき

- 思いついたアイディアはすでに誰かが実装してくれている

という言葉通りだったわけで・・もっとドキュメントを探す癖をつけないとですね。
まぁ、今なら Bing さんに聞く癖をつけるってところか・・

どっちかというと、呟きを勝手に拾って関連情報を呟いてくれるチャットボットが欲しいな・・
アーキテクチャテンプレートA2G配置について

この記事は[設計こばなし Advent Calendar 2023](https://qiita.com/advent-calendar/2023/software_design_talk)の22日目です。

# 概要
去る2023/9/22に[ビースラッシュ株式会社](https://www.bslash.co.jp/)主催の[設計図フォーラム [第９回]](https://www.bslash.co.jp/Seminar/seminar_cstm/9thdesignforum/)に参加しました。

フォーラムでアーキテクチャ設計に役立つであろう**アーキテクチャテンプレートA2G配置**という考え方を知りました。

知った時に

* こんなアーキテクチャ設計の考え方があるんだ!!!
* シンプルで美しい!!
* 趣味のプロダクトで気軽に練習できそう!
* よく考えれている!!

と鳥肌が立つくらい感動しました。

そんなA2G配置の概要、使い所につい書きます。

# アーキテクチャテンプレートA2G配置とは?
アーキテクチャテンプレートA2G配置ですが下図を参照ください。
ざっくりいうと**この図に記載の名称でディレクトリをつくり、ソフトウェアモジュールを配置しましょう**、ということです。

![a2g_fig.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171866/7dad8ab4-2353-b54c-73ef-4a195a6ed24a.jpeg)

> Web資料: [ビースラッシュ株式会社 既存コードのグレイボックステスト～潜在バグをあぶりだす～](https://www.bslash.co.jp/AtScope/wp-content/uploads/2023/11/bslashGrayboxTest.pdf)の21ページからの引用

# A2G配置の効果・効用
A2G配置のアーキテクチャに則ると何が良いのか?という話ですがつぎの効用があると思います。

* ソフトウェアの階層がアルファベット順になっている。エクスプローラーで見た時に上の階層から下の階層に自然と表示される。
* 直感的にわかりやすい。
* どの階層に何のモジュールを配置するかの指標がある。このソフトウェアモジュールはどこに配置するか思考することになるので整理されたソフトウェアの構造になりそう。
* 7つの階層で程よい数で理解、記憶しやすい（マジカルナンバー7±2（ミラーの法則）の観点でも良い）
* A2G配置に従い開発しているとどこに何があるか明確になる。仕様変更の影響範囲の特定などが早くおこなえそう。

# 感想
A2G配置のことを知った時に**なんてシンプルで美しいのだろう、よく考えたなー**と尊敬の念を抱きました。
趣味のソフトウェア開発の場面でディレクトリにコードを無秩序に配置し続けていき見通しが悪くなることがあります。
そういったときはA2G配置で整理し練習してみると良いかもしれない・・・と思いました。
Githubで草を生やすのを忘れて、芝に穴が開いてしまったときの対処法/コミット日付を変更する


## 結論

```bash
# コミットする前に日時を指定したい
git commit -m "コミットメッセージ" --date="May 15 23:59:59 2023 +0900"

# コミット後に日時を変えたい
git commit --amend --date="May 15 23:59:59 2023 +0900"
```

## そもそも「草」とは何か

「草」は、GitHub上でどのような活動をしたかを表しています。GitHubでは、コミットが日付ごとに異なる色(コントリビューションの量により変動)で表示され、草地のような模様になります。
この模様は、利用者がどの日にどれくらいの活動を行ったかを一目で確認できるようになっています。

### これが「芝」(Contribution Graph)

![芝](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243130/9637905f-dbcd-5423-aea1-f5e9243fbafc.png)

### これが「草」(Contribution)

![草](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243130/9bce3ed8-2f4f-327e-9f1b-498a6f056ec9.png)

## 「草」が生えるタイミングは？

「草」が生えるタイミングは主に以下の4つになります。
- コミットをする(リポジトリのデフォルトブランチ または gh-pagesブランチへのコミット)
- ISSUEをオープンする
- プルリクエストを提案する
- プルリクエスト・レビューの提出をする

※基本的にデフォルトブランチ(`master`や`main`)以外にコミットした場合は反映されませんので、ご注意ください。

## 「草」を生やすと何が良いのか

### 活動の可視化

利用者のプロフィールページが「草」で埋まっていると、その利用者がGitHub上で活発に活動していることが伝わります。草の密度が高いほど、その利用者はコミットやプロジェクトへの参加などで積極的にGitHubを利用していることがわかります。
転職活動などでも、Githubの「草」は見られることがあります。継続して「草」を生やせている人の方が評価が高いでしょう。(内容にもよります)

### 貢献の可視化

プロジェクトにコミットすることで、そのプロジェクトに対する貢献が可視化されます。
草の模様が活発なプロフィールは、他の利用者やプロジェクトメンバーに対してその人の積極的な貢献を印象づけます。

### モチベーション

「草を生やす」ことは、自身の成果を可視化するだけでなく、日々のプログラミングやプロジェクトへの取り組みを継続するモチベーションにもつながります。
新しいプロジェクトを開始したり、他の利用者と協力してプロジェクトに参加することで、より多くの草を生やすことができます。

## 他の人から自分のプロフィールを見ると、「草」が少ない場合

Githubのプロフィールページにある`Contribution settings`の内容が誤っているかもしれません。
設定内容が自分の想定と合っているか確認してみてください。

### Private contributions

プライベートリポジトリへのコミットやプッシュも「芝」に表示するかどうかを制御出来ます。
有効にすると、プライベートリポジトリの活動もプロフィール上に表示されます。
※デフォルトではオフになっています。

### Activity overview on your profile

プロフィールに表示される活動の概要（Activity overview）を有効または無効にします。
無効にすると、「芝」が表示されません。
※デフォルトでオンになっています。


![image-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243130/ff799720-2a1c-a85a-7fee-8ef115194807.png)


## コミットの日時を変更する

では実際にコミットの日時を変更する方法を、場合別にお教えします。

### コミットするのを忘れてしまった！

以下のコマンドで、現在時刻ではなく過去日付などを指定してコミットすることが出来ます。

```bash
git commit -m "コミットメッセージ" --date="May 15 23:59:59 2023 +0900"
```

### 色々やってたら0時過ぎてて、昨日の分のコミットがない！

以下のコマンドで、既存のコミットの日時のみ変更できます。

```bash
git commit --amend --date="May 15 23:59:59 2023 +0900"
```

※既にPUSHしてしまっている場合は、強制PUSHをすることでGithub上に反映することが出来ます。
多人数で開発している場合は、細心の注意の元行ってください。

## 参考

https://qiita.com/mi-1109/items/006a534b26190424c499
Azure Logic Apps で Javascript Action を使う時は統合アカウントの紐付けが必要

# 背景

自社では Power Automate の制限が厳しい
Logic Apps なら比較的緩いので、そっちで遊ぼうと思った際に見つけた Javascript Action

ただ、いざ使おうとしたら、動かねーってなったので、その対処記録

# 概要

- 統合アカウントを作成して、Logic Apps に紐づけてやる

# 補足

 統合アカウントの作成は以下で
- [Enterprise Integration Pack で、Azure Logic Apps の B2B ワークフローを使用するための統合アカウントを作成、管理する](https://learn.microsoft.com/ja-jp/azure/logic-apps/enterprise-integration/create-integration-account?tabs=azure-portal%2Cconsumption)

作ったら、ロジックアプリ側のワークフロー設定で紐づけてやるだけ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/bd95bf3f-e337-cc38-5af5-15cf2cc1c183.png)

# あとがき

ただ、まだよくわかってないのが・・

- 具体的な課金額
- セキュリティ的な話
 
結局怖いから試行しただけで使ってない・・ :sweat: 

まぁ、実行制限が厳しいものの、Power Automate には Office scripts という逃げ道もあるので・・・
LinuxPCの電源を入れ、Apacheが起動するまでの流れ


Xで以下のような投稿を見つけ、技術面接だと思い取り組んでみました。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">面接やってたこともあるんで、Linuxできます、の基準についてはそうですね、たとえばこんな感じです。<br><br>「PCにLinuxがインストールされてます。電源スイッチを入れてから、例えばApache httpサーバが起動するまでの処理内容をザックリと説明してください。」<br><br>説明できたら、技術面接をパスですね。…</p>&mdash; 衛星経由で監視されてるハムスター🐹 (@rioriost) <a href="https://twitter.com/rioriost/status/1736914312760095217?ref_src=twsrc%5Etfw">December 19, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

すると「Linux起動の流れ」について正確な知識が身についていないことがわかりました。なので、X上に自分用メモツリーを作り調べました。すると思った以上にが多くの方に閲覧されていたためQiitaでも記事にすることにしました。

### この記事でわかること

- Linux起動の流れ 　
電源投入時のCPUの処理
BIOSの役割
MBRとブートローダー
カーネルと初期RAMディスク
systemdとプロセスの起動

### Linux起動の流れ全体図

[![](https://mermaid.ink/img/pako:eNqrVkrOT0lVslJKL0osyFAIcbGOyVMAgoD88tSi6Jezdz_bNeFZ19SnrUtjFXR17RScPP2Do0FELFQhiA2W8XUKigbix40rHjdPe9y853Fzx-PmtWBGA5CEqQcqASv3Ti3KS82Jfty0Gqyk93HzaqDWpx1zn82ZH-To-7i5_XHT4sdNOx83rYdphWgB6y6uLC5JzU2JhtJgS6eDrGvaDdLTuO7F1u1Pu6eCdCrpKOWmFuUmZqYAfVkNMilGqSQjNTc1RskKyExJLMqOUYrJqwWqSywtyQ-uzEtWsiopKk3VUSotSEksSXXJTAQGTq6SVVpiTjFQtCAxLyo_H8FPTcksyS_yhQQjODRrAerSjsg?type=png)](https://mermaid.live/edit#pako:eNqrVkrOT0lVslJKL0osyFAIcbGOyVMAgoD88tSi6Jezdz_bNeFZ19SnrUtjFXR17RScPP2Do0FELFQhiA2W8XUKigbix40rHjdPe9y853Fzx-PmtWBGA5CEqQcqASv3Ti3KS82Jfty0Gqyk93HzaqDWpx1zn82ZH-To-7i5_XHT4sdNOx83rYdphWgB6y6uLC5JzU2JhtJgS6eDrGvaDdLTuO7F1u1Pu6eCdCrpKOWmFuUmZqYAfVkNMilGqSQjNTc1RskKyExJLMqOUYrJqwWqSywtyQ-uzEtWsiopKk3VUSotSEksSXXJTAQGTq6SVVpiTjFQtCAxLyo_H8FPTcksyS_yhQQjODRrAerSjsg)

### 電源投入時のCPUの処理

特に明記がなければ、メモリ＝RAM、ROM＝ROMで読んでいただければと思います。
また、レガシーBIOSを説明に用います。UEFIを想定していません。

パソコンの電源を投入するとBIOSがまず読みだされることを知っている人は多いはずです。CPUはBIOSを読みだしメモリに展開したいと思うはずです。CPUはプログラムをメモリに展開して実行するからです。しかしメモリの内容は電源を切れば消えているはずですよね。電源をつけたばかりのCPUはどのようにしてBIOSをメモリに展開するのでしょうか。

答えを言うとBIOSはマザーボードのROMにあります。電源投入直後のCPUの命令をROMに向けるようにしておきます。そうすることで、CPUは他のプログラムの力を借りずにBIOSを読みだすことができます。

### BIOSの役割

初めにBIOSはPOST（Power On Self Test）と呼ばれる最低限のハードウェアチェックを行い、メモリやグラフィックボードに異常があれピープ音で知らせます。

ハードウェアチェックが正常に終了した場合、外部記憶装置（HDDやSSD）の先頭512バイトをメモリに読みだします。それが決められた2バイトのパターンで終わっていたら、残りの510バイトを起動用プログラムと認識して実行を開始します。

この先頭の512バイトのことをMBRといいます。

### MBRとブートローダー

MBR内のGRUB(ブートローダー)が起動し、Linuxカーネルをメモリ上に読み出します。
GRUBはLinuxで一般的に使用されるブートローダーで、Linuxカーネルをストレージから読み出します。

### カーネルと初期RAMディスク

Linuxカーネルはメモリに常駐し、ハードウェアの管理やプロセススケジューリングなどを行う役割があります。

Linuxカーネルは初期RAMディスクという一時的なルートディレクトリのマウント後、本来のルートディレクトリのマウントを行います。HDDやSSDへのアクセスにドライバが必要な場合があります。そのために一時的なルートディレクトリにあるドライバを読み出し、最終的にルートディレクトリになるHDDやSSDをマウントするというわけです。

### systemdとプロセスの起動

Linuxカーネルは最初のプロセスとしてsytemdを起動します。systemdはその後default.targetを実行し、様々な準備（ディストリビューションによって異なると思われます）を行います。

bash等が立ち上がり、ユーザからのコマンドを受け付ける状態になったさい、systemctl start httpdでApacheを起動させることができます。

自動起動設定(chkconfig)がされていたら起動に伴い自動起動しているはずです。

### 参考文献

ただしこの記事の内容の誤りがあったとすればこの記事の著者によるものです。

ソフトウェアデザイン2022年6月号
https://amzn.to/3vh8Txm

試して理解Linuxのしくみ
https://amzn.to/41ypHMw

LinuCレベル2
https://amzn.to/47eRClM

作って理解するOS x86系コンピュータを動かす理論と実装
https://amzn.to/3NFCC9Q
WordPressのセキュリティ

# WordPressの脆弱性
みんな使っているぶんたくさんあるよう。
一年で数百件単位で報告されているよう。
チョット調べてみたのでメモ

## 手軽にセキュリティ強化しよう

## wp-json/wp/v2/users/ 
テーマ別のfunction.phpを編集することで解決できます。
やらないとユーザ名などがもろばれです。

## readme.html
wordpressのバージョンなどの情報を与え攻撃の材料を増やします。public_htmlのところにあります。

## /?author=1
ユーザ名がばれます。ブログの投稿者がそのまま見えてしまう。
function.phpを編集する。

## 対策
一つ一つつぶしていくのも必要だけどプラグインでWAFとかをしっかり入れれるといいね。

* SiteGuard
* Wordfence 
よさそうです。
ロボットの自律走行を試す

turlebot3 simulator で自律走行を試した際のメモです!

# 1.ロボットの起動

turtlebot3_gazebo等の,インストール方法は[こちら](https://qiita.com/hoshianaaa/items/322ec39edc8efa261e44)

```
export TURTLEBOT3_MODEL=burger
roslaunch turtlebot3_gazebo turtlebot3_world.launch
```

# 2.地図の作成

- slamの実行
```
export TURTLEBOT3_MODEL=burger
roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=gmapping
```

- ロボットの操作パネルの実行

```
rosrun rqt_robot_steering rqt_robot_steering
```

![Screenshot from 2023-12-22 22-12-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/16c0fdea-c298-3f62-bf3d-2a7dc101f425.png)

上記２つのノード起動後，ロボットを操作パネルから動かして地図を作成します．

![Screenshot from 2023-12-22 20-41-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/2fadd5a2-ff0c-7c17-6ff3-4be63f2f0e59.png)

- mapの保存

地図が完成したらmap_server/map_saverを使用して，ファイルに保存します．

```
rosrun map_server map_saver -f map
```

# 3.自律走行

`2.地図の作成`で実行したSLAMのコードは停止して,下記コマンドを実行すると自律走行に必要なamclやmove_baseとうのノードが起動します．

```
export TURTLEBOT3_MODEL=burger
roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$HOME/map.yaml
```

エラーなく実行できたらRvizの`2D Pose Estimate`でamclに現在位置を指定してあげれば，Rvizの`2D Nav Goal`などから自律走行ができます．

[![Screenshot from 2023-12-22 22-37-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/8f3f76cb-be54-0df3-55e9-17a0b9995e05.png)](https://youtu.be/hdhuxWe_Kp4)

# エラー対策

## move_baseのプラグインがインストールされていない
- エラー内容
```
[FATAL] [1703251523.987719066, 5781.166000000]: Failed to create the dwa_local_planner/DWAPlannerROS planner, are you sure it is properly registered and that the containing library is built? Exception: According to the loaded plugin descriptions the class dwa_local_planner/DWAPlannerROS with base class type nav_core::BaseLocalPlanner does not exist. Declared types are  base_local_planner/TrajectoryPlannerROS
[move_base-4] process has died [pid 1817071, exit code 1, cmd /opt/ros/noetic/lib/move_base/move_base cmd_vel:=/cmd_vel odom:=odom __name:=move_base __log:=/home/dev/.ros/log/6ede42da-a0a5-11ee-bbe5-21225b0a423d/move_base-4.log].
log file: /home/dev/.ros/log/6ede42da-a0a5-11ee-bbe5-21225b0a423d/move_base-4*.log
```
- 対策
```
export TURTLEBOT3_MODEL=burger
sudo apt install ros-noetic-dwa-local-planner
```

参考: https://qiita.com/seigot/items/a13558e92c84f676dd0a



# 宣伝

販売製品

- 3D Vision Controller ： ロボットアームによる3次元ピッキングを実現可能にします！

https://hoshinarobot.base.shop/items/70144084

お仕事依頼お受けしています！

- メールアドレス : ryotaro.hoshina@gmail.com

- coconala : https://coconala.com/users/4162706

- CloudWorks : https://crowdworks.jp/public/employees/5569031
【Flutter】ToggleButtons

on off 切り替えるために欲しくなったので調べた。

# ToggleButtons とは
トグルボタンのセット。

# 選択可能項目数 0 ~ 全項目数
``` dart
ToggleButtons(
  isSelected: isSelected,
  onPressed: (int index) {
    setState(() {
      isSelected[index] = !isSelected[index]; // 反転させてる
    });
  },
  children: const <Widget>[
    Icon(Icons.ac_unit),
    Icon(Icons.call),
    Icon(Icons.cake),
  ],
),
```
# 選択可能項目数 1
``` dart
ToggleButtons(
  isSelected: isSelected,
  onPressed: (int index) {
    setState(() {
      for (int buttonIndex = 0; buttonIndex < isSelected.length; buttonIndex++) {
        if (buttonIndex == index) {
          isSelected[buttonIndex] = true;
        } else {
          isSelected[buttonIndex] = false;
        }
      }
    });
  },
  children: const <Widget>[
    Icon(Icons.ac_unit),
    Icon(Icons.call),
    Icon(Icons.cake),
  ],
),
```
# 選択可能項目数 0 ~ 1
``` dart
ToggleButtons(
  isSelected: isSelected,
  onPressed: (int index) {
    setState(() {
      for (int buttonIndex = 0; buttonIndex < isSelected.length; buttonIndex++) {
        if (buttonIndex == index) {
          isSelected[buttonIndex] = !isSelected[buttonIndex];
        } else {
          isSelected[buttonIndex] = false;
        }
      }
    });
  },
  children: const <Widget>[
    Icon(Icons.ac_unit),
    Icon(Icons.call),
    Icon(Icons.cake),
  ],
),
```
# 選択可能項目数 1 ~ 全項目数
``` dart
ToggleButtons(
  isSelected: isSelected,
  onPressed: (int index) {
    int count = 0;
    for (final bool value in isSelected) {
      if (value) {
        count += 1; // isSelectedを数える
      }
    }
    if (isSelected[index] && count < 2) { 
      return; // 1個しか選択されてなかったらここで終了 => 0 にはできない
    }
    setState(() {
      isSelected[index] = !isSelected[index];
    });
  },
  children: const <Widget>[
    Icon(Icons.ac_unit),
    Icon(Icons.call),
    Icon(Icons.cake),
  ],
),
```

# 今更ちゃんと調べたもの
- int
  - 整数

# 参考

https://api.flutter.dev/flutter/material/ToggleButtons-class.html
java入門　その１　

この記事は[【完走したい】楽しくいろいろやる Advent Calendar 2023](https://qiita.com/advent-calendar/2023/notbeginner)の18日目の記事です。
AndroidStudioを使いたいので、ちょっと学びます。
できるようになったらなんか作ります。
# java
androidのアプリ開発に使われる言語のようです。
kotlinがjavaといい感じの関係らしいです。
# 書き方
https://eng-entrance.com/java-hello-world

このサイトを参考に、文法を学びます。
```
public class HelloWorld{
   public static void main(String[] args){
     System.out.println("Hello World!!");
   }
}
```

### public class　名前
publicなclassで、動かすものの塊です。public classの横の名前を入力することでプログラムを実行できます。
実行するプログラムは{}の中のものです
### public static void main(strings[] args)
public(誰にでも見える状態の)、static(静的)なvoid がmainという名前で入っています。
voidは、classの中にある、さらに小さな動かすものの塊のようなものでしょうか。
カッコ内にあるstrings[] argsは、引数と思われます
stringとか型を書かないといけない感じっぽいです。
調べてみたところ、

https://workteria.forward-soft.co.jp/blog/detail/10102

argsは別の文字でもいいと書かれていました。
試しに、このargsを別の言葉に変えてみたいと思います。とりあえずhitoとしておきます。
これで実行すると、
```
Hello
```
がちゃんとでました。
### System.out.println("Hello world!");
printlnというのが出力っぽい意味であることは何となく想像がつきました。
しかし、その前の「System.out」とは何なのでしょうか
⇒値を出力するときに必要なようです。
また、system.out.printlnで一つのまとまりになっているそうです。

# 疑問
public static void main(String[] a)の()内は
stringでなく、intにしたら文字列でなく数値を扱えるか？
⇒無理そうでした。
エラー: クラスにmain(String[])メソッドが見つかりません: Hello  
と帰ってきました。
エラーになると、クラス名が表示されるみたいです。
# まとめ
Hello world!を出力するために、javaは様々なものが必要であることがわかった。


以上
参考

https://developer.android.com/kotlin/learn?hl=ja

https://hnavi.co.jp/knowledge/blog/kotlin-development/

https://eng-entrance.com/java-hello-world

https://x-tech.pasona.co.jp/media/detail.html?p=2610

https://workteria.forward-soft.co.jp/blog/detail/10102

https://www.javadrive.jp/start/before/index2.html

https://www.javadrive.jp/start/const/index8.html
BigQueryからファイルサイズとファイル数を制限してGCSにエクスポートする

BigQueryにはテーブルデータをCloud Storageにエクスポートする機能があります。

https://cloud.google.com/bigquery/docs/exporting-data?hl=ja


こちらの機能を使用してエクスポートするファイルサイズ上限とファイル数を制限してエクスポートする方法についてご紹介します

[ドキュメント](https://cloud.google.com/bigquery/docs/exporting-data?hl=ja#limit_the_exported_file_size)にもある通り、エクスポートするファイルのサイズを制限する場合は、テーブルデータをパーティションで分割し、パーティションごとにエクスポートすることで実現できます。

下記のSQLでファイルサイズを制限しながらエクスポートは出来るものの、[ドキュメント](https://cloud.google.com/bigquery/docs/exporting-data?hl=ja#exporting_data_into_one_or_more_files)にもあるようにEXPORT DATAステートメントではワイルドカードを使用したURIしか使用できず、単一のURIを使用することが出来ません。

``` sql
EXPORT DATA
  OPTIONS (
    uri = 'gs://temp_bucket/test_export*',
    format = 'CSV',
    compression = 'GZIP',
    overwrite = true,
    header = true,
    field_delimiter = ',')
AS (
  SELECT * EXCEPT(partition_id)
  FROM `table_name`
  WHERE partition_id = 0
)
```

ワイルドカードを使用したURIの場合、テーブルデータのサイズによっては複数のファイルに分割されてしまう可能性があります。そのため、当初のパーティション数以上のファイルが生成される可能性があります。

ファイルサイズ上限を制限した上でエクスポートされるファイル数も制限したい場合、EXPORT DATAステートメントではなくbqコマンド or クライアントライブラリを使う必要があります。
bqコマンド or クライアントライブラリを使う場合、EXPORT DATAステートメントのようにSQLでの抽出結果をエクスポートすることが出来ず、エクスポート対象のテーブルしか出来ません。
そのため、パーティションごとに一時テーブルを作成し、その一時テーブルを指定してエクスポートする必要があります。
Azure ML Studio でNotebooks 使う際の Compute は、ちゃんとVM立てよう

# 背景

勘違いをしていて、思わぬ課金がされたので、自戒の意味を込めて記録

# 結論

- Serverless は安くはないよ、便利なわけだから
- VM は Serverless より単位時間辺りは安いけど、付けっ放しになり勝ちなので、高いかもよ
- VM には Spot VM って方法で 9 割カットで安く使う方法もあるらしいよ

# 補足

いや、ほんと隙間時間で動いてくれるんで、てっきり安いのかと思ってたけど、フルマネージドだから高いの当然じゃんって言われたら、「なるほど、確かに！」だった

しかも、隙間時間って意味なら、Spot VM ってものがある、という・・

サーバーレスの利点は以下にまとまってる

https://learn.microsoft.com/ja-jp/azure/machine-learning/how-to-use-serverless-compute?view=azureml-api-2&tabs=python#advantages-of-serverless-compute


まだ実際に Spot VM は試してないけど、試す際は以下を参照のこと

https://learn.microsoft.com/ja-jp/azure/virtual-machines/spot-vms

# ML Studio で VM 使うならスケジュール設定をきちんとしておこう

Compute 定義する際に、以下設定出来るので、必ずやる。特に idle shutdown は他ごとやってて止まってるともったいないので。

- Idle shutdown: まぁ、20-30分程度にしとかないと、他ごとだったり休憩とかで止まってて困る
- Start/Stop compute instance: 定時内とかに設定しておくと、帰りやすい？ :laughing: 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/68747c99-fd9c-de79-f3be-2b0f2db4c501.png)

# あとがき

コストアラームや、コスト予算を設定してアラーム通知などもちゃんとしておかないと、お財布に穴が開くことに :&
octobuildでUnreal Engineのビルドを高速化する

# はじめに
[octobuild](https://github.com/octobuild/octobuild)はUnreal Engine用のビルド高速化ツールです.

## 動作原理
`ccache`や`icecream`と同じくコンパイルコマンドを元にコンパイル結果をキャッシュすることでビルドを高速化します. つまり２回目から速くなります.
また, `Incredibuild`の振りをしているので併用はできません. `Incredibuild`にもキャッシュ機能があるので, 併用する意味はありません.

# インストール
インストーラがあるので, そのまま実行してもらうといいです.
2023/12の時点では, キャッシュディレクトリの扱いに不具合があるらしく工夫が必要です. （気が向いたらIssueなりPull Requestを投げる.）

Windowsの`マイ ドキュメント`以下がキャッシュ保存ディレクトリのデフォルトなのですが, ディレクトリへのアクセス処理が不具合を起こしているようです. 特殊フォルダあるあるです.
次のどちらかに設定ファイルを作成して, キャッシュディレクトリを変更します.

`C:\ProgramData\octobuild\octobuild.conf`
`C:\Users\<user_name>\AppData\Roaming\octobuild\config\octobuild.conf`

例えば次のようにします.
```
cache: C:\octobuid\cache
cache_limit_mb: 65536
cache_compression_level: 1
coordinator: null
coordinator_bind: 0.0.0.0:3000
helper_bind: 0.0.0.0:0
process_limit: 16
run_second_cpp: true
use_response_files: true
```
さらに, `octobuild`のサービスは起動時に設定ファイルをロードしているので, 設定ファイル変更後はWindowsを再起動するといいでしょう.

# トラブルシューティング

- オブジェクトファイルが壊れている等のエラーでビルドが失敗する.
    - 動作原理的にコンパイル時の環境で追えない環境変化, グローバルなプリプロセッサマクロの変化などに弱いです. 何かおかしいなと思ったら, `xgConsole /reset`を試してみてください.

# 計測
軽く計測しました。

| | |
| :--- | :--- |
| CPU | Ryzen 7 7700 |
| Memory | DDR5-4800 64GB |
| キャッシュSSD | CT2000MX500SSD1 |
| エンジンHDD | 7200rpm SATA |

`msvc`と`キャッシュ`はSSD, エンジンのソースコードはHDDに置いてあります.
エンジンのソースコードをHDDに置いてしまっているのがいけないのかもしれない. ただ確実に速くはなるようです. あとはキャッシュを共有できるかです, どう設定したらいいのでしょう.

- 初回

```
Cache statistic: hit 0 of 2748 (0 %), remote 0, read 0, write 14556535849, total 14556535849
Total time in XGE executor: 10455.87 seconds
Total execution time: 11060.79 seconds
```

- リビルド
```
Cache statistic: hit 2745 of 2748 (99 %), remote 0, read 14554198893, write 2336983, total 14556535876
Total time in XGE executor: 9843.48 seconds
Total execution time: 10390.62 seconds
```
アウトプットの効果（出力、発信）

人間はアウトプットすることにより...

1.知識が濃く定着する。
2.プレゼンの練習になる。
3.考えや記憶が１回目より２回目、２回目より３回目という風に整理されまとまる。
4.理解度が高まる。
5.転職時に成果物として提出できる。

※個人的には
・自己肯定感、自己満足感の向上にも繋がっている気がしなくも。。。
・キータでまとめる時、HTMLタグを活用してまとめれば初学者はHTMLの勉強にも繋がると思う。
AWS re:Invent 2023 生成AI系アップデート一覧(その1)

# はじめに
この記事は株式会社ナレッジコミュニケーションが運営する [クラウド AI by ナレコム Advent Calendar 2023](https://qiita.com/advent-calendar/2023/knowcom-cloudai)の23日目にあたる記事になります！

AWS re:Invent 2023における生成AIサービスのアップデートの一覧を紹介致します。この記事では、初心者エンジニアや非エンジニア層を対象としており、各サービスの概要やユースケースをに焦点を当て、これらのサービスが私たちの業務や生活にどのように影響を与えるか、考えていきたいと思います。

# AWS re:Invent 2023で発表された生成AIサービスのアップデート一覧
* Amazon Bedrockのファインチューニング
* Knowledge base for Amazon Bedrock
* Continued pre-training in Amazon Bedrock
* Agents for Amazon Bedrock
* Guardrails for Amazon Bedrock
* Anthropic Claude 2.1
* Meta Llama 2 70B
* Amazon Titan Image Generator/Amazon Titan Text Express
* Amazon Q
　Amazon Q in Amazon QuickSight
　Amazon Q in Amazon Connect
　Amazon Q in AWS Supply Chain
* AWS Generative AI Innovation Center

# Amazon Bedrockのファインチューニング
ユーザーは特定のタスクに特化したトレーニングデータセットを提供することで、ファウンデーションモデルの精度を向上させることができます。
独自の未ラベルデータを使用して、よりドメイン固有の知識や適応性を持つモデルにすることが可能です。
###### ※ユースケース※
・企業固有のデータを使用して、顧客の問い合わせに対応したり、大量の文書を要約するその企業独自のAIアシスタント
・投資会社が財務やアナリストレポートを使ってモデルをさらに事前トレーニングし、金融業界の用語に精通させてレポート作成ツール

# Knowledge base for Amazon Bedrock
Knowledge Baseを利用することで、Bedrockが企業内のデータソースの情報と接続し、Retrieval Augmented Generation(RAG)ができるようになります。
###### ※ユースケース※
・個々にカスタマイズされたカスタマーサービス: 企業のデータベースから顧客情報を取得し、個々の顧客に合わせたカスタマイズされた対応を行う。
・リサーチ: 特定の業界やトピックに関連する情報を企業内のデータソースから迅速に検索し、分析やレポート作成を助ける。

# Continued pre-training in Amazon Bedrock
Amazon Titan Text Express と Amazon Titan Text Lite FMに対して、独自の未ラベルデータを使ってカスタマイズできる機能です。この機能により、モデルは異なるトピック、ジャンル、コンテキストにまたがるデータにより継続的に事前訓練され、自社ビジネスにより活用できるモデルを開発することが可能になります。
###### ※ユースケース※
・特定の業界やビジネス領域に特化した用語やコンセプトを反映するアプリケーションの開発。
・特定の分野やトピックに関する深い知識を持つモデルを使用して、研究や分析を支援に活用

# Agents for Amazon Bedrock
複数ステップのタスクを実行した生成AIアプリケーションを可能にします。外部システムや外部のデータソースと簡単に連携でき、ユーザーがやりたいことに応答を返す一連の流れを統率して制御すると共に、生成AIに対するプロンプトの指示を自動で生成することができます。
###### ※ユースケース※
・リアルタイムの情報を元にした料理のレコメンドサービス
・リテール業界で顧客の注文を処理し、在庫管理や注文状況の追跡を行うオーダー管理サービス

# Guardrails for Amazon Bedrock
ファウンデーションモデル(FM)に対して、自社のユースケースとポリシーに基づいたセーフガードを実装することを可能にします。このツールを使用すると、企業はモデルが使用できる言語の種類を定義し、制限することができます。これにより、モデルが不適切な回答を提供することを防ぐことが可能になります
###### ※ユースケース※
・投資アドバイスなど、不適切な推奨を提供する可能性があるトピックを避けるための制限の設定。
・モデルの回答から個人情報をフィルタリングし、プライバシーを保護。

# まとめ
いかがでしたか。まだプレビュー版で提供されているサービスが多いですが、自社データを活用したLLMの構築や、LLMを活用する際に課題となる自社ポリシー外の回答を防ぐ方法などに対応できるサービスもあり、今後のアップデートが楽しみですね！続きは別の記事でご紹介いたします。

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


直接 MongoDB 読みたくなること、ありますよね？

## 環境

- SSH でログインできる
- symbol-bootstrap が動いている
- ロールに API が含まれている

## MongoDB コンテナの IP とポートを調べる

まず、`docker ps` コマンドで MongoDB コンテナ名を調べます。

```plaintext
$ docker ps
CONTAINER ID   IMAGE                                        COMMAND                  CREATED       STATUS      PORTS                    NAMES
4d96499f3f7b   symbolplatform/symbol-explorer:1.3.0-amd64   "ash -c '/bin/ash /s…"   2 weeks ago   Up 8 days   0.0.0.0:90->4000/tcp     explorer
822f26cc3a46   symbolplatform/symbol-server:gcc-1.0.3.8     "/bin/bash /symbol-c…"   2 weeks ago   Up 8 days   0.0.0.0:7990->7990/tcp   node
67b201564375   symbolplatform/symbol-server:gcc-1.0.3.8     "/bin/bash /symbol-c…"   2 weeks ago   Up 8 days                            broker
45b03f3e1fd3   symbolplatform/symbol-rest:2.5.0             "npm start --prefix …"   2 weeks ago   Up 8 days   0.0.0.0:3002->3000/tcp   rest-gateway
2fd67db4ec70   mongo:7.0.17                                 "docker-entrypoint.s…"   8 weeks ago   Up 8 days   27017/tcp                db
```

IMAGE に mongo が含まれる行を探します。この例では、NAME が db で、ポートが 27017 であることが分かります。

次に、コンテナ名を使って IP アドレスを調べます。

```bash
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' コンテナ名
```

上記の例では、以下のように実行します。

```plaintext
$ docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' db
172.20.0.2
```

これで、IP アドレスが 172.20.0.2 であることが分かりました。

## PuTTY でトンネルを作る

:::note warn
Tera Term でも出来ると思います。
:::

PuTTY の接続設定で「接続 -> SSH -> トンネル」を選択します。

- 受け側ポート: ローカル PC 側の任意のポート番号（例: `27022`）
- 送り先: 上記で調べた IP とポート（例: `172.20.0.2:27017`）
  「受け側ポート」は、ローカル PC に MongoDB がインストールされている場合、ポートが衝突しないように任意の番号を指定してください。

設定例:

- 受け側ポート: `27022`
- 送り先: `172.20.0.2:27017`

入力後、「追加」ボタンを押します。
![スクリーンショット 2024-03-12 054542.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622558/a2150a37-0736-babf-b008-8e9ab5ac8829.png)

「転送するポート一覧」に設定が追加されます。
![スクリーンショット 2024-03-12 054547.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622558/76b36a52-9d28-fc69-7c1a-b932c900a251.png)

設定が完了したら、SSH でサーバーにログインします。

## MongoDB Compass で接続

MongoDB Compass をインストールします。以下のリンクからダウンロードできます。

https://www.mongodb.com/ja-jp/products/tools/compass

Compass の接続設定で、ポート番号を「受け側ポート」に設定した値（例: 27022）に変更し、「Connect」ボタンを押すと接続できます。
![スクリーンショット 2024-03-12 054951.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622558/e0b4c2bc-d4a2-b566-2181-1b4ccb372075.png)

## 自作プログラムからアクセスしたい

Python などのプログラムから接続する場合、ローカルホストに接続するように記述します。以下は例です。
![スクリーンショット 2024-03-12 055626.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622558/21807e9f-9212-c14d-03d4-2891840de81c.png)
Azure の Cloud Shell を日本で使うとデータ転送料が発生するのね、安いけど

# 背景

Azure を使い始めた中で、cloud shell 便利だなと思ったのですが・・
リージョンを意識するようになったら、なんか変と思ったので、ドキュメント漁った記録

# 結論

- 件名の通りで、微々たるものでも個人利用は避けよう・・ :sweat: 

# 詳細

- VM はプライマリリージョンの、３Regionにしかない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/8ba815ae-9581-4b5b-7e00-b77038eeeafe.png)

- [セカンダリ ストレージ リージョン](https://learn.microsoft.com/ja-jp/azure/cloud-shell/persisting-shell-storage#secondary-storage-regions) を指定出来るけど、プライマリがなくなるわけじゃない。まぁ、名前からもわかるけど・・

- プライマリとセカンダリのデータ転送料も微々たるものだけど発生するんちゃうん？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/7bef89df-6258-4b36-92f7-64fa56143a20.png)

# あとがき

リソースのデフォルトが日本じゃない場合もあるし、特にサンプル利用する際なんか、無償サービスあっても有償デフォルトがよくある。

安く済ませたいのに料金かかる系があるので基本は会社で試したいなぁ・・
個人的に学習はしたいので、クレカ登録しようか悩み中だけど・・なんか良い方法はないものか

そんなときこそ、MS支援のスタートアップ！！ なんてね :laughing:  

https://www.microsoft.com/ja-jp/startups?WT.mc_id=academic-105485-koreyst
WEB開発環境構築のメモ

# WEB開発環境構築のメモ

WEB界隈のプログラマ、エンジニアを離れて10数年。昨年あたりからPythonを使った機械学習・AIに触れることもあったことがきっかけで、WEB業界にも少し戻ろうと思います。

WEB業界を離れて10年は経っているので、2023年のWEB関連（主にサーバ構築関連）の情報収集に関するメモです。
サーバ構築としては、LAMP環境（今は言わないのか？）を構築し、Wordpressのインストールするまでを目標としています。

以降、少しずつ記事のメンテンナンスしていきます。
何か、有益な情報ありましたら、コメントいただけるとありがたいです。

## サーバOS
以前からさくらのVPSを借りていたので、このVPSサーバを使ってサイト構築します。
過去はCentOSを使ってましたが、後継のOSも出ているようですね。
今回は、久しぶりにdebianを選択してみました。

## WEBサーバ
業界を離れる前あたりに登場していたnginxが今やApacheを上回る稼働数のようですね。
スマホの登場により、モバイルからのリクエスト数も過去より膨大になったので、1リクエスト処理するのには軽量なWEBサーバがいいんでしょうね。

Google検索エンジンの仕組み上、2007年あたりからSSLが標準になって、httpプロトコルは今は信頼されないってことでかなり怪しい位置づけになってるんですね。
それに伴って無料のSSサーバ証明書もあったりするのか。

## FTPサーバ
10年前もFTPサーバは暗号化してないから危険とかで、scpとか使ってファイルのアップロードを行ってました。
今はsftpが主流なんでしょうか。仕組みとしてはsshを使ったFTPプロトコルのようです。


## データベースサーバ
PostgreSQLは健在のようです。MySQLはOracle買収後、MariaDBという名前になったのかな。


## バージョン管理システム
CVSとかsubversionを以前はつかってましたが、これはもう主流はgitなんでしょうね。
コンポーネントを開発する際に便利なサイト「Adele」

コンポーネントを開発する際にさまざまなデザインシステムを比較したいニーズはあると思います。
こんなのあるよ！って紹介してもらったので皆さんにも紹介したいと思います！

## デザインシステムを一覧で見たいを叶えるサイト「Adele」


https://adele.uxpin.com/

コンポーネントを設計する際に世の中のデザインシステムを参考にすることは多いと思います。
「デザインシステム」で調べてサイトを確認していましたが、**Storybookを見たいけどリンクはどこにあるのか？そもそもあるのかもわからい**という状態によくなりました…。

:::note warn
公式サイト内を探してStoryboookが存在していなかった時もあり、時折悲しい思いをしました…
:::

### 「Adele」はデザインシステムの一覧情報が掲載されている！
デザインシステムごとに技術やStorybookの有無をまとめてくれておりテーブルをスクロールすることで情報を確認できます！

![画面収録 2023-12-22 21.37.05.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/ba4db7e2-3c09-f6b7-6d7b-c1c527b1b6de.gif)

:::note info
デザインシステムのコンポーネントを探す手間がかなり短縮されました！
:::

### 利用されているフレームワークもわかる！
嬉しかったのは利用されているフレームワークが掲載されていることです。

:::note info
Vue.jsもReactおおよそ同じようなコードになりますが、できれば同じ言語で開発されているコンポーネントを確認したいですよね。
:::

中身を見てから気がつくより、確認する前に気がつけるので良いと思っています！

## まとめ
コンポーネント開発する場合はなるべくたくさんの実装例に触れたいですよね。
同じようなサイトもありますが、デザインシステムの表示数が多いので良いかと思っています！

:::note info
コンポーネント作成だけでなく、サイトパーツのアイディアや命名について調べたい時も役に立つと思います！
:::

他にも良いサイトがあればコメントで教えていただけると嬉しいです！
[Godot 4.2] スクリプト内で Control ノードをアンカー基準で移動させる

`position` の代わりに `offset_bottom` `offset_top` `offset_left` `offset_right` を操作します。

# 即座に原点へ戻す
```gdscript
offset_bottom = 0.0
offset_top = 0.0
offset_left = 0.0
offset_right = 0.0
```
4行書くのが大変です。

# Tweenを使って原点へ戻す
```gdscript
create_tween().tween_property(cursor, "offset_bottom", 0.0, 0.5)
create_tween().tween_property(cursor, "offset_top", 0.0, 0.5)
create_tween().tween_property(cursor, "offset_left", 0.0, 0.5)
create_tween().tween_property(cursor, "offset_right", 0.0, 0.5)
```
同じ Tween インスタンスに続けて書くと順番に実行されてしまうので気をつけましょう。

参考: [Tween — Godot Engine (4.x)の日本語のドキュメント](https://docs.godotengine.org/ja/4.x/classes/class_tween.html)

# Tweenを使ってカーソルをフォーカスされた要素の側へと移動させる
これがやりたかったことです。

```gdscript
func _on_viewport_gui_focus_changed(focused_node):
    if not _check_node_somehow(focused_node):
        return
    var cursor = _get_cursor_somehow()

    # 先に元の値を残しておかないと消えます。もちろん定数にしてもいいです
    var default_offset_bottom = cursor.offset_bottom
    var default_offset_top = cursor.offset_top
    var default_offset_left = cursor.offset_left
    var default_offset_right = cursor.offset_right

    # 親は切り替わりますが、グローバル座標はそのままです
    cursor.reparent(focused_node)

    create_tween().tween_property(cursor, "offset_bottom", default_offset_bottom, 0.5)
    create_tween().tween_property(cursor, "offset_top", default_offset_top, 0.5)
    create_tween().tween_property(cursor, "offset_left", default_offset_left, 0.5)
    create_tween().tween_property(cursor, "offset_right", default_offset_right, 0.5)
```


# 参考文献
[サイズとアンカー — Godot Engine (4.x)の日本語のドキュメント](https://docs.godotengine.org/ja/4.x/tutorials/ui/size_and_anchors.html)
[Control — Godot Engine (4.x)の日本語のドキュメント](https://docs.godotengine.org/ja/4.x/classes/class_control.html)
Sharepoint Lists に対してよく使う REST API の備忘録

# 背景

Sharepoint Lists の自動化などでよく使う REST API 
ついつい忘れがちなので、備忘録


# Sharepoint Lists


https://docs.microsoft.com/ja-jp/sharepoint/dev/sp-add-ins/sharepoint-net-server-csom-jsom-and-rest-api-index#sharepoint-api-index

<table>
    <thead>
        <tr>
            <th>目的</th>
            <th>api</th>
            <th>MS Doc</th>
            <th>補足</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Lists 一覧</td>
            <td>_api/web/lists</td>
            <td rowspan=3><a href="https://docs.microsoft.com/ja-jp/sharepoint/dev/sp-add-ins/working-with-lists-and-list-items-with-rest">REST を使用してリストとリスト アイテムを操作する</a></td>
            <td></td>
        </tr>
        <tr>
            <td>List 取得 by <b>Title</b></td>
            <td>_api/web/lists<br/>/getByTitle('{Title}')</td>
            <td></td>
        </tr>
        <tr>
            <td>対象List の items 一覧</td>
            <td>_api/web/lists<br/>/getByTitle('{Title}')/items</td>
            <td></td>
        </tr>
        <tr>
            <td>対象List の View 一覧</td>
            <td>_api/web/lists<br/>/getByTitle('{Title}')/views</td>
            <td rowspan=3><a href="https://docs.microsoft.com/en-us/previous-versions/office/sharepoint-visio/jj245986%28v%3doffice.15%29#properties">View Properties（古い？）</a></td>
            <td></td>
        </tr>
        <tr>
            <td>対象List の View 取得 by <b>Title</b></td>
            <td>_api/web/lists<br/>/getByTitle('{Title}')/views<br/>/getByTitle('{Title}')</td>
            <td></td>
        </tr>
        <tr>
            <td>対象List の View の Fileds 一覧</td>
            <td>_api/web/lists<br/>/getByTitle('{Title}')/views<br/>/getByTitle('{Title}')/ViewFields</td>
            <td></td>
        </tr>
        <tr>
            <td>対象List の View の Fileds に Field 追加</td>
            <td>_api/web/lists<br/>/getByTitle('{Title}')/views<br/>/getByTitle('{Title}')/ViewFields<br/>/AddViewField</td>
            <td><a href="https://docs.microsoft.com/en-us/previous-versions/office/developer/sharepoint-rest-reference/dn531433(v=office.15)#viewfieldcollection-methods">ViewFieldCollection methods</a></td>
            <td></td>
        </tr>
        <tr>
            <td>Site の user 一覧</td>
            <td>_api/Web/SiteUsers</td>
            <td><a href="https://docs.microsoft.com/en-us/dotnet/api/microsoft.sharepoint.spweb.siteusers?view=sharepoint-server">SPWeb.SiteUsers Property</a></td>
            <td>UserのGUIDではなく、サイトに紐づいたIDが取得可能。というか、Actionで取る方法は無いのかな？あってもサイト指定になるから面倒かなぁ・・</td>
        </tr>
        <tr>
            <td>自分の情報</td>
            <td>_api/SP.UserProfiles.PeopleManager<br/>/GetMyProperties</td>
        <td><a href="https://docs.microsoft.com/ja-jp/previous-versions/office/developer/sharepoint-rest-reference/dn790354(v=office.15)?redirectedfrom=MSDN#peoplemanager-%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89">PeopleManager メソッド</a></td>
            <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/3f7b104c-7881-365e-4929-a1db2f0e8db2.png">これで取れない事があれば？</img></td>
        </tr>
    </tbody>
</table>


# あとがき


使ったときに更新することを忘れないようにしないと・・・ :sweat: