OmniAICreator/Qiita-1.07M huggingface dataset:
Gather.townを使ってリモートワーク環境で ”ちょい聞き” 文化を作る

# はじめに
Gather.townとは少し前に流行したバーチャルオフィスサービスです。
バーチャル空間内に物理オフィスのように各自のデスクや会議室などを設置でき、その空間内をアバターで自由に移動したり、他の人と気軽に話したり、簡易的な会議ができたりします。
従来のアバターを用いたサービス同様アバターやインテリアのカスタマイズなどのお遊び要素もあります。
リモートワークでの社員間のコミュニケーション不足緩和に役立ちそう。

https://ja.gather.town/

利用方法等は既に色々記事がありますので今回は触れません。

そんなGather.townを試験運用して数週間経ちましたので、個人的に感じたメリット・デメリットを書き殴っていこうと思います。

# メリット
### 気軽に話せる
圧倒的なメリットはこれです。

普通のリモートワークだったら
「これ聞くためにわざわざSlackのHuddleお願いしたり、Googleカレンダーで予定飛ばすのもなぁ」
ってときでも気軽に話しかけられます。アバターでトコトコその人のところまで歩いていけばすぐに話せる。まさに本当に出社しているかのように。
このスピード感が何より良いと感じました。

なお、話しかけるタイミングに関してもステータスが
- Available（応答可能）
- Busy（取込み中）
- Do Not Disturb（応答不可）

の3つから設定できるので直感的に把握可能です。

### 寂しくない
おまけ程度のメリットですがw
リモートワークのデメリットって孤独感だと思うんですよね。
Gatherの画面を見たらみんないるってのは地味に良いなと普通に思いました。寂しがり屋なんで。

# デメリット
### 急に話しかけられるとビックリする
会話可能エリアに入ったら誰でも話しかけられる性質上、急に声をかけられることがあります。
マジでビビりますw

### 集中したいときの操作が面倒
ステータスをBusyに変更すれば周りには「この人忙しいんだな、集中してるんだな」はアピールできるのですが、近くに来たら話しかけられてしまう。
集中していて話しかけられたくないときは
1. 自身のデスクやFocus Boothなどのプライベートエリアに移動
2. そのエリアに鍵をかける

をすれば会話可能エリアに誰も侵入できなくなります。
ただこれを毎回やるのが本当に面倒。割と忘れます。

しかもプライベートエリアから出るたびに鍵が解除される仕様となってます。

### ログを残すのには向いていない
チャットのログは残るがスレッド分けされている訳ではないので見づらい。
MTG録画も課金プランじゃないとできない。

チャットのログを残すならSlack、録画するならZoom等々、そこは住み分けが必要かなと思いました。

### 人によっては管理されてると感じるかも？
僕は気になりませんが、人によっては管理されてる感を感じるかもしれません。
例えば単なるログイン忘れなのに周りから「サボってるな」「寝坊してるな」と思われたら嫌ですよね。

ただ、そういう物理出社なら忘れるはずがないことを忘れてしまいそれによって誤解が生じるってのは通常のリモートワークでも生じ得ることではあるのでGatherに限った話ではないとは思います。

目に見えてしまうことによって顕在化するので気になる人は気になるかもなーくらい感。

# 現時点での総評
デメリットを厚めに書いてしまいましたが、気軽に話せるというメリットが圧倒的に勝っているので総評的にはかなりアリだと思っています。
少なくとも話しかけてもらえる機会が増えましたし、簡単な確認やコミュニケーションも気楽にできて楽しいです。

:::note
特に新人のうちは些細な質問も多いはずなので新人にとってはよりメリット多そう。
:::

ただ、今後も運用していくのであればいくつか課題があるようにも思いました。

# 課題
### 1. 他ツールでのMTG中に話しかけられちゃう問題
GatherでGoogleカレンダー連携していると予定がある時間はMTG中と表示されるが、連携していない場合は声をかけられてしまいます。もっと言えばMTG中と表示されていようが話しかけられてしまう。
対策としては
- 先のデメリットでも述べたプライベートエリアの鍵機能を使う
- ZoomやGoogle Meetなどの他ツールでMTG中はGatherを応答不可にする

などでしょうか。結構大きな課題だと感じました。

### 2. 運用ルール
ある程度の運用ルールを決める必要があるなと思います。むしろこれが長く続けるにあたっての肝かと。

どこまで決めるかは結構塩梅が難しく、あまりにもキッチリし過ぎると嫌になっちゃうし、管理されてる感が増しちゃうので、ゆるく運用できるルールが良いのではと思っています。

● 個人的な最低限のルール候補
- 出社時は必ずログイン
- 急遽の離席を除き、昼食・私用などの離席時はログアウトもしくはステータス変更する
- 声をかけるときは先にWaveかチャットを送る
  - びっくり防止。普通の出社時でも先にちょっと遠く声かけたり手を振ったりするでしょ？
  - どこどこの場所にいるときは「Wave無しで即声かけても良いよ。気軽に話かけて。」みたいな場所ルールとかはあっても良いかも
- Zoomなどの他ツールでのMTG中は応答不可にする
  - 課題1の対策として
  - すべてのMTGをGatherに集約は不可能、というか逆に非効率的なので両立できるルールにする必要がある

まだ弊社でもルールは定めていない段階ですので色々と試行錯誤していきたいです。

## 3. どの部署までGather利用をしてもらうか
試験運用中ということもあり、現在はエンジニアのみでの運用となっています。
メリットを最大化するためには、ビジネスサイドの人やデザイナーさんにも積極的に利用してもらった方が良いと思っています。
基本的に同部署間よりも対他部署の方がコミュニケーションコストは大きいと思うので。

例えば下記のようなサッと済む話をGather内で完結できるのは効率的かと思います。
- (デザイナーさん向けに)「このアイコンの元データどこにしまいましたか」
- (設計書いてる人向けに)「この設計の意図を確認したいんですけど」

物理出社と同様に、これらの「ちょい聞き」ができると開発がスムーズになるのはもちろん、答える側もチャットのメンションを追ったり文字を打ったりなどの回答コストが削減できるのではと思っています。

# 最後に
かなりエンジニア寄りの偏った意見ですが、Gather.townはコミュニケーション促進・ひいては生産性の向上という意味で物理出社に近い環境を作り得ると思いました。

もっと長期間運用してみたらまた別の意見になるかもしれませんが数週間運用での所感は以上です。

面白い時代になってきてますねー
SharePoint リストの複数行テキストを全文表示したい（できない）

Share Point Listsを使うと、レコードの行高さがなぜか制限されます。
詳細な書式設定を使うと行高さを自動にできることが分かりました。
<code>
"elmType": "div",
"style": {
"height": "auto"
},
"txtContent": "[@currentField]"
</code>

これで行高さが自動設定になり全文が表示できます。そして複数行テキストの場合、HTMLのコードがそのまま表示されます。これが解消できませんでした。同様にコード表記されるという記事がいくつかありますが、皆さん同じところで苦労している。Copilotにも問い合わせましたが、htmlContentという嘘プロパティを作ったり、@htmlという嘘演算子を作ってごまかしてきましたが、できないと認めました（Share Point Onlineではできるという主張）。Power Appsを使ってくれということでした。
globalなgitignoreの設定方法備忘録

### まずは自分のglobalなgitignoreがどこで設定されているか確認しよう
私はこれを確認が漏れていたので、いくら設定しても反映されないということがありました。

```
$ cat ~/.gitconfig  
[core]
	excludesfile = /Users/xxx/.gitignore_global
```
gitconfigを見てgitの設定を確認しましょう。
この場合`.gitignore_global`に無視したいものを書けば反映されます。

別にこのままでいいや〜ここに書いちゃお〜でも全然いいのですが
公式では
>Its default value is $XDG_CONFIG_HOME/git/ignore. If $XDG_CONFIG_HOME is either not set or empty, $HOME/.config/git/ignore is used instead.

とあります。要は`~/.config/git/ignore`がデフォルトということが書かれています。
後々なんか変わった〜としても、デフォルトの方が管理しやすそうです

そんなに難しくないので、さっとしちゃいましょう。

### .config/git/ignoreにする
```
$ ~/.gitconfig  
[core]
	excludesfile = /Users/xxx/.config/git/ignore
```
- `.gitignore_global`→`.config/git/ignore`に変更
- `.config/git/ignore`が無ければ作成
- `.config/git/ignore`に無視したいファイルやディレクトリを書き込む


例えばこんな感じ
```
$ cat .config/git/ignore 
Procfile
Procfile.dev
database.yml
.env
```
asdf使ってみた

## 前提
mac使用してます。
brew使ってinstallします！！shはzshです。

## asdfとは
言語やツールのバージョン管理できるCLIツール

## install
▼以下公式ガイドの通りにinstall
https://asdf-vm.com/guide/getting-started.html

## 詰まった。。。
公式ガイドの通りにinstallしたが、nodeが実行できない！
```
$ node
zsh: command not found: node
```

どうやら以下のパスを通さなれければいけなさそう。

```zsh:.zshrc
export PATH=$PATH/.asdf/shims/
```

```
$ asdf reshim nodejs
```
Androidチームでインターンを取ってみた

## 組織とインターンの内容
私の所属するAndroidチームは私含めて社員４人に加え業務委託1人の５人チームの組織です。そこに長期のインターンとして３ヶ月〜というスパンで働いてらうという形で1人を採用しました。今まで2人のインターン生を受け入れたのでその記録を残します。

### インターン生の主な業務内容
- Androidを触れたことのないインターン生であればcodelabをやってもらいAndroidを学習してもらう
- 学習が終わり次第簡単な業務から振ってチケット作成からPRマージまでの流れを学んでもらう
- それ以降は基本的には我々と同じような仕事を振って対応してもらう
- 毎日誰かと1on1をしてもらい色々話してもらう

### 入ってくれた2人のインターン生のレベル
1. Kotlinに軽く触れたことがあるレベル
2. アプリを作ったことがあるし結構書ける 

#### うちの技術スタック
Kotlinで書かれておりUIはほぼjetpackで書かれている、UsecaseなどはRxからFlowへの以降は完了しており、RipositoryもRetrofitに対応しているしマルチモジュールなども対応している。MVPのようなMVVMというような環境です

### 長期でやるメリット
- 教えられる内容が濃くなる
- 新卒への採用に繋がりやすいし本人のステップアップにも繋がる
- 人生の先輩の話を聞ける
- 社会人エンジニアの現実を早い段階でわかる
- 業経験を積むことができる

### 教える上で心がけたほうがいいこと
- 自分がわからないことはわからないとはっきり伝えることうろ覚えものもそう
- 一緒に調べるなどして自分も勉強しながら教える
- Flowなど新しい技術は一回では、絶対覚えられ得ないので何度もこれ何と聞いて言語化できるまで聞くこと
- 1on1の時はフレンドリーに話すことで質問しやすい環境を整えてあげること
- 一番最初の1on1ではまず業務の話はせずプライベートな話をして中を深めましょう

#### 自分がわからないことはわからないとはっきり伝える
社会人であるから分かっていないといけないという事は何のではっきりとわからないと伝えることがインターン生のためにもなるし、そのインターン生が教える立場になった時にもきっとそうしてくれるから
ポイント：自分のプライドに負けないこと

#### 用語の言語化
Flowなど技術を聞かれた時に言語化できなければ正直書けても習得したとは言い難いと思う、インターン生に聞かれた時に言語化し尚且つ、それで分からなければ別の例え（webを作ったことある子ならwebの技術で言うとこれみたいな）を使って理解できるようにして説明する。これをインターン生に理解してもらったのちにことあるごとに、インターン生が言語化できるまで聞いてみる。インターン生だけでなく我々理解も深まるのでやって非常によかった

### 書くのが面倒になったのでまとめ
正直仕事としてのエンジニアは学生が想定しているよりも栗エイティビティーでもないし地味だけど長期でインターンをしてみることで実際はこんなもんかって言うのもわかるし、最近新卒の面接をしていて思うのだけれどインターンを経験している学生とそうでない学生はかなり差があると言うのは実務の経験がないので質問をしてもうまく質問の意図を受け取ってくれないことが多い。これがインターンを経験していると意図が理解できることが多いので学生はやってみるのがおすすめ。私のような怠惰なエンジニアにも会えます。
我々受け入れる側としても心のゆとりを持って接してあげることで自分のコミュニケーションの向上と技術を言語化して教えることで理解が深まることもありいい経験になるのではないでしょうか。
と雑に締めくくります。
git リモートリポジトリにソースコードをpush

```git
$cd フォルダが置かれている場所（desktop)など)/フォルダの名前

$ git init

$ git add .

$ git commit -m "好きなコメント"

$ git remote add origin git@github.com:jibunNO/jibunNoRepositoryName.git

$ git push origin main
```

git push origin masterにするとエラーがでる
Azure Policyの割り当て手順


Azure policyについてほとんど触った事がなかったんですが、
ポリシー追加割り当てをする機会がありましたので簡易なポリシー割り当て手順を残してみます。

設定できる手順はいくつかあると思いますが、ここで書く手順はその中の一例だとご理解ください！

# ■そもそも「Azure policy」とは？

かなりざっくりと説明しますと、
Azure Policyを設定する事で、やってはダメな事を決める事ができます。

更に言うとやってはダメな事が発生した時に、違反を防止する事も出来れば、監査（つまり記録）だけも出来るという事です。

# ■どんな項目がある？

かなり膨大な量のポリシーが用意されているので、用途に合ったものを見つけましょう！
以下のURLから確認できます。

Azure Policy の組み込みのポリシー定義
https://learn.microsoft.com/ja-jp/azure/governance/policy/samples/built-in-policies

# ■ポリシーの割り当て手順

### ①
まず初めにポリシーを設定したいAzure環境にログインしましょう。

### ②
次に、先ほどのポリシー定義について書かれたページの中から割り当てたいポリシーを見つけます。
今回は「API Management の API では暗号化されたプロトコルのみを使用する必要がある」にしてみました。

Azure Policy の組み込みのポリシー定義
https://learn.microsoft.com/ja-jp/azure/governance/policy/samples/built-in-policies

### ③
ポリシーが決まったら、そのポリシーのリンクをAzure環境にログインしたブラウザーで開きましょう。
（「名前」の部分が、Azure portal のポリシー定義ページにリンクされています）

![20240220173418.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/6a7f8360-1c60-7693-31d6-55502a68b437.png)

### ④
内容を確認し、割り当てに進みましょう。
利用可能な特殊効果は「Audit」になっています。つまり監査のみで拒否などは発生しません

![わりあて1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/8f55ed59-15d4-4231-d584-0c856cd787b6.png)

### ⑤
対象となるサブスクリプションやリソースを設定する必要があります。
「スコープ」から設定しましょう。（ポリシーによるかも知れませんが、最低限埋める必要がある項目だと思います）

![わりあて2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/e9cbc00e-ea96-f5a2-4ab9-4dedfd3ea0c0.png)

### ⑥
内容を確認して、作成すれば完了です！

# ■結果を見る

Azure Policyページの「概要」から状況を確認できます。

多分最初は「コンプライアンスの状態」が未開始になっているかと思いますが、自分の場合10分ほどで「準拠している」に変更されました。

![わりあて3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/67fbd84d-b77b-3251-d994-920deb6274b0.png)

検証環境ではあるんですが、デフォルトであるポリシーは全然準拠できていませんでした！
ちなみにデフォルトっぽいポリシーの内容は以下です。

```
Microsoft クラウド セキュリティ ベンチマーク

Microsoft クラウド セキュリティ ベンチマーク イニシアティブでは、
Microsoft クラウド セキュリティ ベンチマークで定義されたセキュリティ推奨事項を実装しているポリシーとコントロールが表されます (https://aka.ms/azsecbm を参照)。
これは、Microsoft Defender for Cloud の既定のポリシー イニシアティブとしても機能します。
このイニシアティブを直接割り当てたり、そのポリシーやコンプライアンスの結果を Microsoft Defender for Cloud 内で管理したりすることができます。
```

# ■最後に
これはポリシー単体を割り当てる手順でしたが、「イニシアティブ」という項目でポリシーをグループ化する事もできます。
本日以上です！
はじめてのalias設定(Ubuntu)

# はじめに
どうもこんにちは！僕は現在1ヵ月本気の技術力向上を目指している現役高校生1年生です！今回はUbuntuで初めてaliasの設定をしてみたのでまとめます。

# 問題
僕はUbuntuのxselというコマンドを使おうとしていたのですが、ちょっとコマンドが長い！！(怠惰ですねぇ笑)

xselでは以下のようなコマンドを記述することで、パイプラインの左側のコマンドの出力をクリップボードにコピーすることが可能になります。
```terminal
コマンド |  xsel --clipboard --input
```

# 解決策
alias(エイリアス)を設定しました。エイリアスというのは自分で設定した**省略記法のようなもの**です。
### 流れ
1. .bashrcファイルを編集する
    <font color="grey">※vscodeを入れてある前提です。vimでも大丈夫です！</font>
    ```terminal
    code ~/.bashrc
    ```

    以下のように加えてみてください。
    ```:.bashrc
    # xsel alias
    alias clip='xsel --clipboard --input'
    ```
    <br/>
2. 変更を適用する
    ```
    source ~/.bashrc
    ```
    <br/>
3. コマンドを実行してみる
    今回の場合はこんな感じです！
    ```
    コマンド | clip
    ```

# 終わりに
楽にできるぞ～～。ただそれだけですか何だか重要な気がします。みなさんもぜひ怠惰な自分を認めてエンジニアっぽく(学生ですけど笑)解決してみましょ！！

# 参考
https://qiita.com/kagami_t/items/84f6ec3142a8b370d908

# About Me
- X(Twitter)

https://twitter.com/shunii_hack
メンバーへのPower Platformの教育

書き出す前に前提条件
・筆者は、言うほど「Power Platform」熟知していない
・2024/02現在 PL-900とPL-100の資格は持っているがそこまで熟知してない
・作成したフローは、たぶん30前後で運用されているのはその半分ぐらい
・現在は自分の環境を作って入るけども当時～現在は出向先の環境で
　権限周りとかは、開発者程度にとどまっている
・Power Platform ってモノを知って、勧めて、調査して、実装してたら
　Power Platform の担当者っぽいポジションに収まっていた
・啓蒙活動？が実ったのか、Power Platform の担当者を増員する事となって

　  メンバーに「Power Automate(Power Platform)」を教えることになって
 　 まずは何をしてもらおうかと考えた際
  
 　 自分が部分的にPower Automateの学習を行ったかというと
 　 確かに最初はPower Automateの調査からだったけども
 　 わからないと足掻いているうちに
 　 コミュニティなどの勉強会を通して
 　 現場でこれは使えるし提案できるかも？、作ってみよう等を繰り返して
  
 　 そのあと
 　 ユーザにPower Platformの作業を任せてもらえる為に
  　PL-900を取得して、そのあとPL-100を取得して
  　一応、Power Platformの基本的な知識はありますよと説得力のある肩書を
  　手に入れまして
　　(悲しいかなPL-100は2024年の6月になくなるそうで、、、)

　　今回、
## 「メンバーへのPower Platformの教育」
 　ってなったわけです


　最初に苦労したのは「Power Platform」って何？って説明する際に
  大体は、

  ![describe-the-business-value-of-the-microsoft-power-platform-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3701343/a1df64f2-c4a2-c396-33e7-34e9cd32e879.png)

この図を示して、ざっくりと
「Power Platform」というのはクラウド上で以下のツールを使用して開発できる「SaaS」です
・Power BI
・Power Apps
・Power Automate
・Power Virtual Agents
・Power Pages

っとユーザには言ってしまうのですが
今回は、開発メンバーに「Power Platform」を扱って開発するには
とても説明が不十分・・・

なので、今回のメンバーに行う教育に関しては
### 「先ずは、Power Platformを知ってもらう」
話はそれから

じゃぁ、知ってもらう方法として
こちらMicrosoft learnのPL-900を履修してもらうことにしました
https://learn.microsoft.com/ja-jp/training/paths/power-plat-fundamentals/
  
サインインすれば、記録が残るので履修済なのかわかるので
履修後にメンバーの許可をもらって画面共有か何かで履修履歴を見せてもらう
って方法をとっていきます。

履修後に
「Power Automate」で例となる要件のケースを
数件、メンバーに提示
フローにて製造可否を聞き
できる、できないを理解出来たらそこで
最初の学習目標達成と考えてみました

この方法の結果はまだまだ先になりますが
現場に合わせた方法を模索していきたいと思います
Microsoft Fabric で、一つのワークスペース内でWarehouse/Lakehouse をたくさん作ると エラー：QueryUserError: A payload exceeded the allowed size. Reduce the number of warehouses / artifacts within the workspace and try again 

## はじめに

本記事は事例の共有を目的としています。

ワークスペース内のアイテム数には明示的な制限はありませんが、大量に作成すると問題が発生する可能性があることを周知します。

### 注意事項

- この現象は環境や状況により再現しない場合があります。
- 2024年2月の情報です。今後、動作が変わる可能性があります。


## いつエラーが起きた？

アイテムが51を超えるとエラーが発生します。

以下は正常に動作している時のアイテム（Warehouse or SQLEndpoint）の数です。


| Type        | Count |
|-------------|-------|
| SQLEndpoint | 44    |
| Warehouse   | 7     |
| 総計          | 51    |

しかし、レイクハウス=SQLEndpoint を増やしたタイミングでエラーが発生しました。

以下はエラー発生時のアイテム（Warehouse or SQLEndpoint）の数です。	

| Type        | Count |
|-------------|-------|
| SQLEndpoint | 45    |
| Warehouse   | 7     |
| 総計          | 52    |


## 関連する docs 上の記載

Warehouse（レイクハウスのSQLエンドポイントを含む）が多すぎるとエラーが発生するようです。エラーメッセージとは直接関係がなく、見つけるのが難しかったのですが、サポート担当者から教えてもらいました。


https://learn.microsoft.com/ja-jp/fabric/data-warehouse/connectivity#considerations-and-limitations
AWSの試験履歴が表示されなくなった話

# はじめに

AWS試験の申込内容や履歴を確認できる[AWS認定サイト](https://www.aws.training/Certification)にて、<font color="red">**過去の試験情報やバウチャー等が一切表示されなくなった**</font>件について、事象および解決策を書いてみようと思います。

## 何が起きたのか
以前はAmazonアカウントでログインしていたのですが、2024年2月からAmazonアカウントでのログインが不可となり、AWS Builderのアカウントでのログインが必要となりました。

そうと知った2024年1月ごろに、以下のことを行いました。


①AWS Builderを登録（あいうえお@gmail.com)
②Amazonアカウントのメルアド変更
　(かきくけこ@yahoo.co.jp → あいうえお@gmail.com)


1月中は、試験履歴等が表示され、試験の登録も行っていたのですが、<font color="red">**2月になってから表示されなくなりました。**</font>

## 複数アカウントが作成されていた
[サポート](https://support.aws.amazon.com/#/contacts/aws-training)に問い合わせると、どうやら<font color="red">**AWS Builder上に複数のアカウントが登録されていた**</font>状態になっていたとのことです。

おそらく②をやってから①を実施すれば正しく連携できていたのだと思いますが、先に①を実施してしまったことで、おそらく同じあいうえお@gmail.comのアカウントが２つ登録されたものと思われます。

上記のサポートから問い合わせを行い、途中でメールを送ってきてくれて、そこでやり取りしてなんとかアカウントをマージしてもらって、最終的には以前の情報が表示されることを確認できました。

## 最後に
検索しても同じような現象になっている人は見つからなかったので何かの役に立てばと思い投稿しました。

英語のサイトだったのでGoogle翻訳と[GEMINI](https://gemini.google.com/app)を使用して英文でやり取りしました。
（平日の日中にやり取りすれば、30分ぐらいでメール返事くれました。）

おそらく以下の内容を送ればすぐにアカウントマージできたのではないかと思います。


## 英文
Hello,

This is an inquiry regarding account merging.

When I log in, my exam history and certification information are not displayed.
This is probably due to multiple accounts being registered.
I would like you to merge the email address that I think I used in the past into my account.
Current email address:
あいうえお@gmail.com
Previously used email address:
かきくけこ@yahoo.co.jp

Best regards,
〇〇

〇〇は自分の名前を入力。

## 日本語訳
こんにちは。

アカウント統合に関するお問い合わせです。

ログインすると、試験履歴と認定情報が表示されません。
複数のアカウントが登録されていることが原因と考えられます。
過去に使っていたと思われるメールアドレスをアカウント統合してほしいです。
現在のメールアドレス（ファイルを保存するメールアドレス）：
あいうえお@gmail.com
以前に使用していたメールアドレス:
かきくけこ@yahoo.co.jp

よろしくお願いします。
〇〇

---
ファイル保存したいアドレスというのを聞かれるので、文中でも指定しています。
（結局何のファイルのことかは分かりませんでしたが・・・。）


問い合わせのタイプは以下のように指定しました。
![問い合わせ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3716943/c37643b8-224d-4a19-eb7f-092fc94308fe.png)
JavaScript のスロットル、完全に理解した

JavaScript の世には **デバウンス(debounce)** と **スロットル(throttle)** という便利な手法があることを最近知りました。

残念ながら弊社エンジニアは誰も知らない可能性が高いので、メモして共有するため記事にしました。

デバウンスの記事は先に書いてます。

https://qiita.com/kazumacchi/items/91915fe69d3b570cc089

# スロットル (throttle)

同じイベントが連続して発火するような状況で、発火した回数分処理を実行すると負荷が高くなってしまう場合に、最初のイベント発火から指定した秒数を経過するまで、次のイベント処理を遅延させる手法です。

デバウンスと似てますが、真逆という訳でもなさそうですね

デバウンスは「指定秒数待ってからイベント処理を実行する。その指定秒数内のイベントは停止される」のに対して、スロットルは「イベント処理を実行してから指定秒数経過するまでは次のイベント処理を遅延させる」という感じですね。デバウンスのイベント処理を停止させるのとはちょっと違います。
（※複数回イベント処理が実行された場合、最後のイベント処理以外は停止になるようですが）


## 雑なサンプルコード

'test-throttle' という id を持つボタンがあり、クリック後に 'Click Event Called' という文字列と現在日時とコンソールに出力する。その後1秒経過する前に再度クリックイベントが発火した場合は、1秒経過するまでは遅延される。

```javascript
/**
 * 無名関数の実行を制限し、指定間隔(ms)毎に一回のみ実行
 *
 * @param {Function} anonymousFunction - スロットルされる無名関数
 * @param {number} limit - 実行間隔(ms)
 * @returns {Function}
 */
function throttle(anonymousFunction, limit)
{
    let lastFunctionTimerId;
    let lastExecute;

    return function() {
        const context = this;
        const args = arguments;

        // 最初の1回はすぐ実行
        if (!lastExecute) {
            anonymousFunction.apply(context, args);
            lastExecute = Date.now();
            return;
        }

        clearTimeout(lastFunctionTimerId);
        lastFunctionTimerId = setTimeout(function() {
            anonymousFunction.apply(context, args);
            lastExecute = Date.now();
        // 1秒以上経過している場合は即実行、そうでなければ残り時間経過後に実行
        }, limit - (Date.now() - lastExecute));
    }
}

/**
 * 'Click Event Called' という文字列と現在日時を console に出力し、1秒間は次のイベントを受け付けない
 */
const clickEvent = throttle(function() {
    console.log('Click Event Called');
    console.log(new Date());
}, 1000);

/**
 * ページロード後、id が test-throttle の要素に対して click イベントリスナーを追加
 */
window.addEventListener('load', function() {
    document.getElementById('test-throttle').addEventListener('click', clickEvent);
});

```

確かに連打しまくっても1秒毎にしか実行されてない模様

![throttle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76272/7659cb57-5306-c046-08ad-86852e8cc110.png)

# 感想

底辺エンジニアなのでスロットルのよい使い道がイマイチ思いつかない…
デバウンスと比べて、ちょっと使いづらい気がします
[ifs] no such file or directory: /usr/local/etc/mecabrc の解決方法

## 状況
OS：windows 11 pro 
dockerイメージ：nvcr.io/nvidia/pytorch:23-04-py3
dockerのコンテナ上でMecabを使用して、自然言語処理を行っていたところ以下のエラーが発生
```
[ifs] no such file or directory: /usr/local/etc/mecabrc
```
以下のように環境変数にmecabrcのパスを通しても治らない
```
export MECABRC="[インストール先]/etc/mecabrc"
```

## 解決策
MeCab.Taggerの中でmecabrcファイルを指定してあげるとうまくいく。
```
tagger = MeCab.Tagger(r'-r /etc/mecabrc -d /usr/share/mecab/dic/mecab-ipadic-neologd')
```

mecabrcファイルの探し方は以下のコマンド
```
find / -iname mecabrc
```
Instana で IBM MQ を監視する際に 作成される テンポラリ・キューに関して


Instana で IBM MQを監視した際、知らないキューが いくつかできていることに気づきました。これが、なぜ 作成されているかについて、調べてみました
## Instana で IBM MQ を監視します
[昨年の記事](https://qiita.com/iwashinat/items/ea01d5678751388120d9) でも記載したように、非常にシンプルに監視することが可能です。

たとえば、Instana Agentの稼働ユーザーを mqmグループに追加するだけで、QMGRを自動的に検知し、監視が行われます（ローカル・バインディング・モード）。

収集されたメトリックを見てみると、アプリケーションのキューに `AMQ.654DC38C2406D803` など見慣れないキューが存在します。これは プロジェクトのなかで定義したキューではありません。このキューがなにものか、調べました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323873/cec1efa8-5f2b-560e-8496-096690c873e6.png)


## IBM MQ PCF　と テンポラリ・キュー


### IBM MQ PCF (Programable Command Format）
Instanaは、IBM MQのメトリック・データを IBM MQが提供する PCF機能を呼び出すことによって、取得しています。
IBM MQ の　PCF に関しては、以下をご参照ください。
[IBM MQ プログラマブル・コマンド・フォーマットの概要](https://www.ibm.com/docs/ja/ibm-mq/9.3?topic=commands-introduction-mq-programmable-command-formats)

### テンポラリ・キュー
任意のアプリケーション（今回の環境では Instana Agent）が、MQOPENコマンドを発行して、PCFを呼び出すと IBM MQは テンポラリー・キューを動的に作成します（これは IBM MQの挙動です）。
これが先ほど見えていた `AMQ.654DC38C2406D803` といったキューの正体です。

この挙動は、今回のような Local Binding モードで接続していようが、ネットワーク越しに クライアント接続モードで接続していようが同じ振る舞いです。
PCFが呼び出されると、テンポラリ・キューが動的に作成されること自体は MQの仕様であり、PCFを呼び出すためには queue の create 権限は必要ありません。

## テンポラリ・キューのライフサイクルについて

動的テンポラリ・キューは、QMGRが起動したタイミングで、まず削除されます（クリアされる）。
アプリケーションが（今回は Instana Agent）が PCFを呼び出したタイミングで作成されます。
その後、アプリケーション（今回は Instana Agent）がキューをclose したタイミングまたは アプリケーションが終了したタイミングで削除されます。
これらの 動的テンポラリ・キューで扱われるのは、永続化されないメッセージのみであり、メンテナンスなど気にすることは必要ないとのことです。

動的キューについてはこちらをご参照ください。
[動的キューとモデル・キュー](https://www.ibm.com/docs/ja/ibm-mq/9.3?topic=queues-dynamic-model)

## Instana 監視時に 作成されている テンポラリ・キューの数 
Instana Agent では、QMGRごとに10個の接続を張ってパフォーマンス・メトリックを取得するため、各QMGRに10個のテンポラリ・キューが動的に作成されます。


## まとめ
Instanaで IBM MQを監視した際に、知らないキューがたくさん作成されているように見えますが、これは Instanaがキューを作成しているのではなく、パフォーマンス情報を取得するために利用している IBM MQ PCFの内部仕様として作成されるテンポラリー・キューでした。
PCFについて 理解していないと慌ててしまいますが、特に心配する必要のないものです。
Databricksのインタフェースでダークモードがサポートされました！

気づいたらサポートされていました。これまではノートブックのみでしたが、対象がインタフェースに拡張されています。

**ユーザー設定 > 環境設定 > インタフェースのテーマ**でダークモードを選択します。
![Screenshot 2024-02-20 at 14.11.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/86ac86cc-9210-34f1-d5e9-ba862a75a7b7.png)

おおー。
![Screenshot 2024-02-20 at 14.11.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9cf1d8d6-e398-afdc-ea5d-b187e0e13732.png)

ランディングページも。
![Screenshot 2024-02-20 at 14.11.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c400091d-f3b3-f824-7199-b99ef02ab8b3.png)

従来通りノートブックも。
![Screenshot 2024-02-20 at 14.12.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6bea2b10-634c-660f-eeeb-8de3a5ce0b3b.png)

クエリーエディタも。
![Screenshot 2024-02-20 at 14.12.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e8dfdc1b-7466-9b4f-f77b-03014ed137f4.png)

モデルレジストリも。
![Screenshot 2024-02-20 at 14.20.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/058c154f-ae28-a3c8-0345-42098d322ad4.png)

ご活用ください！

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
narou.rbを改造版AozoraEpub3で使用する際の修正点まとめ (未完)

# 目的
以下の記事で整理した問題点の解消方法を修正手順とともに整理する

https://qiita.com/kokotaro@github/items/879897516a792652db9c

## 状況
2024/02/20時点
アップした上記の記事で改善されなかった二つの問題が既知であり、すでに不具合スレの有志にて解消されていた

https://jbbs.shitaraba.net/bbs/read.cgi/computer/44668/1511245701/568

## 解決済みの問題点
  * 前書き／後書きのスタイルが反映されない
  * 濁点フォント指定が反映されない
  * JDK21を使用した場合にエラーとなる

変更対象のファイルは

* lib/command/init.rb
* lib/novelconverter.rb
* preset/vertical_font.css
* preset/vertical_font_with_dakuten.css

## 未解決の問題点 
1. 表紙のスタイルが反映されない
1. 目次のスタイルが反映されない

主観になってしまうが両方ともに致命的ではない。目次についても修正案はあるものCSSがいまいち理解できていなく、どこに修正を盛り込めばいいのかという点でまだ調査中。

## 結論
改造版AozoraEpub3を使用した場合にJDK21や濁点フォントを使用したエラーは解消されているという整理で問題ないと思っている。この結果は改造版AozoraEpub3のインストール手順としてまとめる予定だけど、パッチ対象のファイルが多すぎるのでファイルコピーで済むようなファイル群を一時的にgithubにアップすることも検討中
databricksのテーブルの末尾の全角、半角スペースをカラム単位で除去する

# 目的
以下がやりたい
①カラム単位で文末の半角スペースを削除
②カラム単位で文末の半角スペース、全角スペース両方を削除

# 検証
### 準備
Untiy Catalog上にスキーマ作成
```sql
%sql
create database  uc_kthoriguchi.test
```

テーブル作成
```sql
%sql
create table uc_kthoriguchi.test.test1 (
  columnA string,
  columnB string
)
```


以下をinsertする
```sql
%sql
insert into  uc_kthoriguchi.test.test1 values('   te   st1   ','   te   st1   ');
insert into  uc_kthoriguchi.test.test1 values('　　　te　　　st2　　　','　　　te　　　st2　　　');
insert into  uc_kthoriguchi.test.test1 values(' 　 　te 　 　st3 　 　',' 　 　te 　 　st3 　 　');
insert into  uc_kthoriguchi.test.test1 values('　 　 te　 　 st4　 　 ','　 　 te　 　 st4　 　 ');
insert into  uc_kthoriguchi.test.test1 values(null,null);
/*
半角スペース：^
全角スペース：▲
test1：^^^te^^^st1^^^
test2：▲▲▲te▲▲▲st2▲▲▲
test3：^▲^▲te^▲^▲st3^▲^▲
test4：▲^▲^te▲^▲^st4▲^▲^
test5：null,null
*/
```

確認
```sql
%sql
select * from  uc_kthoriguchi.test.test1 order by columnA
```
csv出力結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/a9068cd6-0bbc-5edb-6591-5f31ae0da9db.png)


### 検証
以下を実行
```sql
%sql
update uc_kthoriguchi.test.test1 set columnA = rtrim(columnA);
update uc_kthoriguchi.test.test1 set columnB = trim(trailing from columnB);
```

半角のみが消されているので①はできたが、②ができていない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/e4951ce5-544d-3178-2ced-e6e96405a5c7.png)

diffでみても文末の半角空白のみが削除されているのがわかる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/e9afad25-b8b1-8c28-8319-386066375248.png)
https://difff.jp/


露頭に迷っていたところで以下のBlogを発見。
[Databricks SQL にて 2 つ以上の文字にて TRIM する方法](https://qiita.com/manabian/items/af4af96455a1275947e4#2-%E5%8D%8A%E8%A7%92%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%A8%E5%85%A8%E8%A7%92%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%82%92-rtrim-%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)
ロジックとしては最初にnullかそうでないか判定し、nullでなければ後ろの半角空白、全角空白をぬいた文字列を返すというもの。nullであればnullを返す。


先ほどのテーブルをtruncata insertでつくりなおしてupdateを実行
```sql
%sql
--columnA
update uc_kthoriguchi.test.test1 set columnA = 
CASE
  WHEN (regexp_instr(columnA, '[^ 　]+')) > 0 THEN
    substring(
      columnA,
      1,
      len(columnA) - (regexp_instr(reverse(columnA), '[^ 　]+') - 1)
    )
  WHEN columnA IS NULL THEN
    NULL
  ELSE ''
END ;

--columnB
update uc_kthoriguchi.test.test1 set columnB = 
CASE
  WHEN (regexp_instr(columnB, '[^ 　]+')) > 0 THEN
    substring(
      columnB,
      1,
      len(columnB) - (regexp_instr(reverse(columnB), '[^ 　]+') - 1)
    )
  WHEN columnB IS NULL THEN
    NULL
  ELSE ''
END ;
```
結果は以下。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/48d86107-40e4-debe-873f-83d7a5305afb.png)


全角、半角空白ともに削除されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/9211e090-21fe-e0ba-b079-bbafc3f2716a.png)
Vue勉強 算出プロパティ computed でgetter,setterを使う。

(Vue.js 3.1.5を使用)
算出プロパティ computed
で、getter, setterを使う。

```javascript:javascript
const app = Vue.createApp({
    data: () => ({
        meter: 300
    }),
    computed:{  
        kiloMeter: {
            get: function(){
                return this.meter * 0.001
            },
            set: function(value){
                this.meter = value * 1000
            }
        }
    },

})
app.mount('#app')
```

```html:html
    <div id="app">
        <p>メートル: <input type="text" v-model="meter"> </p>
        <p>キロメートル: <input type="text" v-model="kiloMeter"> </p>
    </div>
```

### 初期状態
meter の値が、メートル欄に表示されている。
meterを0.001倍した値（computedのkiloMeterのgetの値）が、キロメートル欄に表示されている。

![20.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/15bf4f3d-88e6-d088-883b-a1e87a219755.png)

### 片方の入力に連動して、もう片方の値も変化する
メートル欄に適当な値を入力すると、キロメートル欄の値も自動的に変更される。
（キロメートル欄はメートル欄の0.001倍の値になる。）

![21.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/ac4f400f-d273-2528-0a53-d9391bd824c1.png)

逆に、キロメートル欄に値を入力すると、今度はメートル欄の値が変更される。
（メートル欄はキロメートル欄の1000倍の値になる。）
（computedのkiloMeterのsetの値）

![22.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/718e093f-e3a9-d37c-62ac-4fbd66e3a89a.png)
Windows Server 2022でもGPU-Pしたい！

## え？Windows Server 2022じゃGPU-Pできないの？
**結論から言えば出来ます。**

でもWindows10や11と同様にGPU-Pを有効化しようとすると、VMの起動に失敗しエラーを吐きます。
ひと手間加えてやることで、Windows Server 2022でもGPU-Pを利用することが出来ます。
## 対応策
以下のパスに2つのレジストリキーを追加してください。

パス：`HKLM:\SOFTWARE\Policies\Microsoft\Windows\HyperV`

名称：`RequireSecureDeviceAssignment`
種別：`DWORD`
値：`0`

名称：`RequireSupportedDeviceAssignment`
種別：`DWORD`
値：`0`

![IMG_6064.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717253/260f6aef-7029-a284-f9d8-ed40a40ab418.jpeg)

追加後は再起動をしてください。
（タスクマネージャーからMMC.exeを終了するだけでも良い、との情報がありますが未検証です。）

すると、あら不思議！正常にVMが起動するではありませんか！！

![IMG_6080.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717253/69a6738b-3f91-e406-e1ea-01e508bf4d41.jpeg)
↑無事にGPUを認識している

## 余談
これは余談となりますが、GPU-PとSR-IOVは共存できないみたいです。
両方を有効にしようとすると動作しません。
VM毎に片方使う分には問題ないので、VMの用途に応じてどちらを適用するか選択しましょう。


## 参考
https://qiita.com/Hyper-W/items/3a2c7ff1d983deb80070
AWS CloudWatchのLiveTailがLambdaデバッグに便利

最近、でもないけど半年ほど前？に追加されたLiveTailがLambdaのデバッグにめちゃ便利だった話。

## 前置き
直接環境にアクセスできるときはTailコマンドを使ってアプリケーションのログをリアルタイムで見ることはよくあります。それのクラウド版です。
ELB配下で複数台動くマシンのログをリアルタイムで確認するのに少しだけ使っていました。
これはこれで強力です。だって特定のマシンに乗り込んじゃうとロードバランスされた後でどこにログが落ちるかわからないので。
と言ってもそこまでありがたみを感じることなくあんまり使ってませんでした。

## 環境
AWS CloudWatch Logs - LiveTail
Lambda python3.12

## Lambdaのデバッグ
初期のDebugにはprintを使ってResultに表示されるログを確認しながら作業します。
VisualStudioを使ってやるという人、ごめんなさい。ローテクでお話が進みます。
ほとんどこれで事足りるぐらいの比較的軽い処理しか乗せないので大丈夫です。

![スクリーンショット 2024-02-20 151604.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491285/84a9e2b5-8db6-1066-8098-244998e158a0.png)

このLambdaがプロダクトに組み込まれてAPI Gateway経由でhttpsアクセスされるようになるとヘッダにのせる情報量やパターンが増えて、よりリアルな挙動を確認したくなってきました。
というシチュエーションになってくるとパラメータを簡単に変更できるPostツールや別の開発製品から呼び出したときのインタフェースでログを見たくなるわけです。もちろんLambdaにテストパターンを記載もできるんですけどやはり面倒で、あれはやはり初期の単体動作確認レベルなのかなと思うわけです。


## LiveTailを使う
Lambdaの実行ログはCloudWatchに落ちて特定できることを前提とします。

LiveTailを開いてください。
CloudWatch > Live Tail
![スクリーンショット 2024-02-20 153008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491285/8bee8a17-83df-64cd-8bcd-9e457b6b2601.png)

ログ出力がないとずっとぐるぐるしてますけど焦らないで。
何かログが出るようにLambdaを実行させてください。
![メディア2 (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491285/ebcaef51-6499-84c0-822b-0253524fcc11.gif)

Tailコマンドと同じ要領でログが出てきます。
これで外部からPostman等のレストツールやプロダクトに近い開発環境から呼び出してログをリアルタイムに確認することが簡単にできます。
ログを１回１回開くのがだるかった（私がそう）ので地味な時間削減になりました。
Lambdaデバッグにこそむいてるかなと思いましたが皆さんはどうでしょう？
是非使ったことない人は使ってみてください。

## その他
[ここ](https://qiita.com/yoshii0110/items/ff0fce18a74221000310)も参考になりました。
Confluence 6.15.7: 拡張子がない画像ファイルを添付して、それを参照するXMLを入力しても画像は表示されない

# 環境
* Confluence 6.15.7


# やりたいこと
HTMLファイルをConfluenceに移行したいです。HTMLファイルは画像を参照しています。

以下の手順でConfluenceに移行しようとしました。
1. 事前に添付ファイルをアップロードする。
2. Source Editorで以下のようなConfluence用のXMLを入力する。


```xml
<p>
  <ac:image ac:thumbnail="true">
  <ri:attachment ri:filename="A.png"/>
</ac:image>
</p>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37903/ed520d12-b8fd-bf76-b017-7ccf804214ec.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37903/c4d18fea-f1f6-de4a-3df6-7f26f987eccc.png)

# 起きたこと
拡張子がない画像（PNG）を添付ファイルにアップロードしました。ファイル名は`B`です。この画像を参照するXMLを入力すると、「Cannot generate thumbnail for the file 'B' attached to the content 'test'.」というメッセージがページに表示されました。

```xml
<p>
  <ac:image ac:thumbnail="true">
  <ri:attachment ri:filename="B"/>
</ac:image>
</p>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37903/5fb31e6b-5c71-2693-b708-9e4d6ecdb81e.png)

# 原因
Confluenceが`B`を画像ファイルと認識していないと、画像ファイルを参照できないようです。
添付ファイル画面を確認すると、添付ファイル`B`のアイコンは添付ファイル`A.png`と異なっており、画像ファイルだと認識されていないことが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37903/30af7bfc-6f52-2986-4fb0-30c068a84ede.png)


# 対応策
## 添付ファイルのコンテンツタイプを変える
添付ファイル`B`のプロパティを見ると、新規コンテンツタイプは`application/octet-stream`でした。
コンテンツタイプを`image/png`に変えたあと、再度XMLを入力すればページに画像が表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37903/f025cf14-e493-9d15-fe46-d2855856308b.png)

## 添付ファイルの名前に画像を示す拡張子を付ける
添付ファイル`B`の名前を`B.png`に変更した後、以下のXMLを入力すればページに画像が表示されました。


```xml
<p>
  <ac:image ac:thumbnail="true">
  <ri:attachment ri:filename="B.png"/>
</ac:image>
</p>
```
<router-link>の属性を文字列+変数で置く時の記述

# 経緯
久しぶりにvueを書いていたら忘れていることが多々・・・。
悲しいですが、初心に返り作業中です。

今回は、エスケープの記述についてになります。
度々失念するのでメモです。

# したいこと
ある要素の属性に対し、「文字列＋変数」の形式で値を指定したい時


# 解決策
```vue
<router-link :to="`/product/${item.id}`">
```
私は「`」をよく失念するので注意。
504エラーが発生してもDBにデータが保存されてしまう問題

# 起こったこと
CSVデータアップロード機能をPHP(Laravel)で作成していた。
1万件以上のレコードを持つ大容量のCSVデータをアップロードし、DBにデータを保存しようとした際、開発環境でタイムアウトエラーが発生してしまい、正常なアップロードが出来なかった。
しかし、DBにはデータがアップロードされていたため、「エラーが発生しているのにトランザクションがロールバックされていない」問題が発生してしまった。

# 原因
CloudFrontはタイムアウト(504 gateway timeout)をクライアントにレスポンスしているが、PHPのプロセスが裏側で動いており、トランザクションが正常にコミットされていたためDBにデータが登録されていた。
 
# 解決策
大容量のCSVデータ自体は時間がかかっても正常に登録されることが分かったので、DBの該当テーブルに新しくフラグを追加し、
「処理中(デフォルトの値)」
「成功(コミットした場合更新)」
「失敗(ロールバックした場合更新)」
の3種類の値を入れられるようにした。
504エラーが出た際に画面を開きなおしてもらい、フラグの値に応じて現在の状況をメッセージで非同期に表示できるようにした。

これにより、504エラーが出た際裏側でアップロードが続いていたとしても対応することが出来、たとえ他のエラーが起きてcatchブロックに入ったとしても「失敗」フラグが立つためメッセージにその旨が表示されるようになる。

# 終わりに
504エラーが発生した時点で処理が中断されるとばかり思いこんでいたため、盲点だった。
なぜロールバックされないのか、トランザクションに問題があるとばかり考えて調査していたが、完全に見当違いだった。
今後は視野を広く持ち、様々な可能性を考えていきたい。
＜Python＞xlsファイル群を読み取りシート削除

物流の現状分析を行うにあたり、月次に倉庫業者が提供する請求書データ、xlsファイルを大量に受領。

協力会社に情報共有を行うにあたり、受領した各xlsファイルのなかの、
シート「料率」部分のみを削除したかったため、下記コーディングを行った。

人を介してファイル提供してもらう場合、シートの順序が変わる場合もあるため、
シート名を指定して削除した。

```
import xlwings as xw
import glob

#Excel画面を見せない
xw.App(visible=False)

for file in glob.glob("*.xls"):
    wb = xw.Book(file)
    wb.sheets["料率"].delete()
    wb.save()
    wb.close()
```
shared_ptr にカスタムデリーターを追加する方法

## 概要
４つ方法があります。
1. 関数オブジェクトを使用する方法
1. 一般関数
1. Lambda式
1. std::default_delete式

## 1. 関数オブジェクトを使用する方法

```c++
class Deleter
{
public:
	void operator() (MyClass *x) {
		delete[] x;
	}
};

int main(int argc, char** args)
{
    std::shared_ptr<MyClass> p2(new MyClass[5], Deleter);
    return 0;
}

```
## 2. 一般関数
関数`deleter`はカスタムデリーターです。
```c++
void deleter(MyClass *x)
{
	std::cout << "Deleter function called" << std::endl;
	delete x;
}

std::shared_ptr<MyClass> p1(new MyClass, deleter);

```
## 3. Lambda式

```c++
int main(int argc, char** args)
{
    shared_ptr<MyClass> objClass(
        new MyClass(), [](MyClass* obj)
        {
            if (obj)
            {
                obj->cleanup();
                delete obj;
            }
        });
    return 0;
}
```

## 4. std::default_delete式
`std::default_delete`は、C++ 標準ライブラリで提供されている削除器（デリータ）のデフォルト実装です。これは、delete 演算子を使用してリソースを解放する単純な関数オブジェクトです。
```c++
std::shared_ptr<MyClass> p(new MyClass[5], std::default_delete<MyClass[]>());
```
AES(簡易版）を作ってみた

# はじめに
専門学校に通っている私、クワトロは退屈していた
「…資格対策が…だるい」
FEをとれだのAPをとれだの、LPIC、ORACLEを取れだの…
私はプログラミングがしたいんじゃ
そんな中、私はAPの資格勉強中、ある単語に目がついた

AES

そうだ、AESをCで実装してみよう

# AESってなんぞ？
AESは共通鍵暗号のアルゴリズムで、今ではWPA2やらなんやらで大活躍をしている
現在までには脆弱性は見つかっていない（らしい）

# AESの概念的な暗号化方法

AESは共通鍵暗号だから、もちろん暗号化、復号に使われる暗号化キーがある
AESの鍵長は128,192,256のどれかから選択ができ、もちろん数が大きいと強度も強い
（ブルートフォースと一緒）
AESは、素のキーから暗号化をするためのキーを色々して10個(128bitの場合）作成し、それぞれをXORして、換字式暗号のように書き換え、Byteをずらしていくことによって、実装ができる


# ソースコード
https://github.com/Mikan-777-star/AES_Test

## メゾットの解説

AESは基本的に以下のように動く
ラウンドキー生成（KeyExpansion)
    ↓
keyと本体を16byteを4*4の表として考える
    ↓
ループ開始
ラウンドキーとXor(AddRoundKey)
（ラウンドキーが最後ならループ脱出）
    ↓
SBOXを参照して換字(SubBytes)
    ↓
4byteずつ、表が階段状になるようにずらす（ShiftRows)
    ↓
カラム混合という仕組みを使って、4byteを混合（MixColumns）
ループ

（細かいことを説明するには語彙が足りないので、先人たちにおまかせします）

復号は、この逆をするだけ

ラウンドキー生成（KeyExpension)
    ↓
ラウンドキーとXor（AddRoundKey)
    ↓
4byteずつ、階段からもとに戻す（InvShiftRows)
    ↓
逆SBOX（INVSBOX）を使って、換字（InvSubBytes)
    ↓
カラム混合を解く（InvMixColumns)
ループ


このような仕組みを使用して、AESを実装している

# 実行
上記のコードを実行すると以下のようになる
```
text = Hello world AES
memory = 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x20, 0x41, 0x45, 0x53, 0x00, 
text = ����M%<J�����@h
memory = 0x9d, 0x8d, 0x98, 0xa1, 0x4d, 0x25, 0x3c, 0x4a, 0xca, 0xf4, 0xe6, 0xe8, 0x10, 0xd6, 0x40, 0x68, 
text = Hello world AES
memory = 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x20, 0x41, 0x45, 0x53, 0x00, 
```

1つ目→もともとの文字列
2つ目→暗号化された文字列
3つ目→暗号から複合された文字列

# 作ってみて、わかったこと

- AESは、思ったより単純であること
Xor＋バイトごとのShift、カラム混合の3つの繰り返しをしているだけで　
これで本当に暗号化できているのだろうかと、少し心配になってしまった

# わからなかったこと

…有限体（カラム体）がわからん
Wikipediaや先人の書いたQiitaたちを参照したから、なんとか形になったが
依然、カラム混合の既約多項式や、乗算の実装がどうしてそう実装するのかとかがわからなかった
（その部分はChatGPT君に補助してもらいながら作成した）
もともと、高校数学すらできてなかった私には荷が重かったのだろうか


# まとめ
- AESは、想像以上に単純であった
- AESは、XOR,置換、ByteShift、カラム混合からできている
- 有限体という、すんごい計算方法を採用している
Jetpack ComposeでonResume/onStartに相当する処理を実行する

lifecycleのバージョン2.7.0以降で `LifecycleEventEffect`を使うことができます。

```kotlin
LifecycleEventEffect(Lifecycle.Event.ON_RESUME) {
  // do something here
}
```

```kotlin
LifecycleEventEffect(Lifecycle.Event.ON_START) {
  // do something here
}
```

onPause/onStopに相当する処理が必要な場合には、`LifecycleResumeEffect`もしくは`LifecycleStartEffect`を使いましょう。

```kotlin
LifecycleResumeEffect {
  // ON_RESUME code is executed here

  onPauseOrDispose {
    // do any needed clean up here
  }
}
```

```kotlin
LifecycleStartEffect {
  // ON_START code is executed here

  onStopOrDispose {
    // do any needed clean up here
  }
}
```


## 参考
https://developer.android.com/topic/libraries/architecture/compose#run-code
Microsoft Fabric レイクハウス (OneLake) に対して azcopy でファイルを転送する

## はじめに

OneLake は Azure Data Lake Storage Gen2 と互換性をもつAPIを提供してるということで、↓を Onelake 宛に実施します。

https://learn.microsoft.com/ja-jp/azure/storage/common/storage-use-azcopy-blobs-upload?toc=%2Fazure%2Fstorage%2Fblobs%2Ftoc.json&bc=%2Fazure%2Fstorage%2Fblobs%2Fbreadcrumb%2Ftoc.json

タネとしては--trusted-microsoft-suffixes で、onelake.dfs.fabric.microsoft.com に 認証トークンを送信する許可をしてやれば動きます。

https://learn.microsoft.com/ja-jp/azure/storage/common/storage-ref-azcopy-copy#options-inherited-from-parent-commands

## ユーザー IDでの認証

### 手順

対象のアップロード先のURLを取得します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/e16b903d-7276-3f8b-e239-d278d307d6f8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/c3549560-8871-e050-f05b-6953765ad57b.png)

以下の形式でコマンドを実行する

```bash:bash

export AZCOPY_AUTO_LOGIN_TYPE=DEVICE

azcopy copy {ファイルパス} {確認したURL}/{ファイルパス} --trusted-microsoft-suffixes onelake.dfs.fabric.microsoft.com

```

結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/0d3439da-2f9c-cb00-ca98-887611e61bac.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/9a92f279-3a0c-4707-6527-d61ce40d8281.png)



### 補足

こちらの認証方法は version=10.23.0 だと動作しませんでした・・・とりあえずISSUEをあげています

https://github.com/Azure/azure-storage-azcopy/issues/2580

そのため、本記事はazcli の10.15.0 で確認しています


## サービスプリンシパルでの認証

こっちは最新バージョンでも動きました。

### 前提条件

「サービス プリンシパルは Fabric API を使用できます」を有効にしておく必要があります。

これが有効じゃないとサービスプリンシパルをワークスペースロールに追加できません。

https://learn.microsoft.com/ja-jp/power-bi/developer/embedded/embed-service-principal#step-3---enable-the-power-bi-service-admin-settings

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/ac3174e7-e03e-931b-4005-62eb8e9c9f9e.png)

### 手順

1.サービスプリンシパルをワークスペースに追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/acd937f3-ad08-1021-1bba-f5847b382af1.png)

2.以下の形式でコマンドを実行する



```bash:bash

export AZCOPY_AUTO_LOGIN_TYPE=SPN
export AZCOPY_SPA_APPLICATION_ID=<application-id>
export AZCOPY_SPA_CLIENT_SECRET=<client-secret>
export AZCOPY_TENANT_ID=<tenant-id>

azcopy copy {ファイルパス} {確認したURL}/{ファイルパス} --trusted-microsoft-suffixes onelake.dfs.fabric.microsoft.com

```

結果は割愛

## powershell 

こういうのもあるみたい

https://learn.microsoft.com/ja-jp/fabric/onelake/onelake-powershell
【初心者向け】Java ソースコードの解説①

# :writing_hand_tone1:はじめに
2023年12月18日からJava言語を学び始めた初心者です。
これまでにプログラミングに触れた機会は小学生のころにホームページをHTML,cssで
作成したことくらいです。
商業高校だったので情報処理などの授業は受けていましたが、全商2級程度です。
情報系の専門学校、大学ではありません。


# :page_with_curl:Java ソースコードの解説
サンプルコード
~~~java
public class Test {
    public static void main(String[] args) {
        System.out.println("はじめてのJava");
    }
}
~~~~
### :ledger:クラスとは

プログラムの1単位を `クラス` という。
サンプルコードでは` class Test { … }  ` と記載しているためここでは
` Testというクラス `を作成している。

Javaのプログラムを作成する際は 
` public class クラス名 { … }` と記述する必要がある。

※publicについては別途まとめます。

### :ledger:メソッドとは
一連の処理をまとめたもの。
ブロック（`{` ～ `}` まで）を使って、機能をひとまとめにしている。
` public static void main(String [] args){…} `　もメソッドであり` mainメソッド`と呼ぶ


 :::note warn
 main()メソッドだけは自由に決めることができず、書き方が決まっている。
その理由は、JVM（Java）がプログラムを実行するとき、
public static void main(String [] args)からスタートするという決まりだからです。
:::

` System.out.println()`は`()`内の文字を出力することができます。

mainメソッドの中に `System.out.println()` を記述しました。
プログラムとして実行することで画面上に「はじめてのJava」と表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676721/ce892232-9cf5-9f62-e635-8f1dd36b41be.png)



実行したい命令は、mainメソッドの中に書くことがJavaの基本的な形です。

### :ledger:ブロックとは

`{` と `}` の括弧で囲まれた部分のことを `ブロック` といいます。
このブロックという区切りがないと
Java側はどこからどこまでが特定の処理に該当するのかが判別できなくなります。
閉じ忘れるとプログラムは動作しません。

### :ledger:インデントとは
字下げのこと。
サンプルコードも右に一段ずつずれているかと思います。
こうすることでプログラムを読みやすくしています。

まとめてプログラムの行を整理したい時は
Windows:　` ctrl + shift + F`
Mac    : `command + shift+ F`を押すとスッキリします。

### :ledger:コメントとは
プログラム内に日本語でメモを残したい時に使います。

また、`コメントアウト`といって
動作させたくない命令をひとまずコメントにして無視させるいう使い方もできます。

コメントには `// `と `/* */` の2種類があります。

`//`  単一行（`//` の場所から行末まで）
`/* */` 複数行（`/*` と `*/` の間に挟まれた部分）がコメントの範囲となります。

コメントサンプルコード
~~~java
public class Test {

    //コメントです。
    public static void main(String[] args) {
        //System.out.println("はじめてのJava");　←コメントアウト
        
        /*　複数行のコメントです。
            System.out.println("表示されません");
        */
        System.out.println("こちらのみ表示されます");

    }
}
~~~

### :pencil:ここまでのまとめ
1. クラスを作成する
2. mainメソッドを作成する
3. mainメソッドの`{ }`内に処理を書く
4. 実行する

この手順でコーディングを行っていきます。

****
簡単なコードの説明でした。
次回はもう少し深堀していきながら解説したいと思います。
文字列リテラルと整数リテラル

# リテラル
リテラルとはプログラム中に直接書かれた値を指します。この記事ではC言語における文字列リテラルおよび、整数リテラルの種類と使い方について解説します。

# 関連記事

https://qiita.com/yokan/items/7f95b2e8cfd7868af14c

# 開発環境
- Windows11
- Visual Studio 2022

# 文字列リテラル
文字列リテラルはダブルクォート`"`で囲まれた文字の並びです。

```c
#include <stdio.h>

int main( void )
{
    // "で囲まれていれば文字、数字関係なく文字列リテラル
    printf( "ABC" );
    printf( "123" );
    return 0;
}
```

# 整数リテラル
整数リテラルはプログラム中に直接書かれた整数のことを指します。整数リテラルには2進数、8進数、10進数、16進数による表記方法が用意されています。

```c
#include <stdio.h>

int main( void )
{
    printf( "値は%dです。\n", 0b01100100 ); // 2進数で表記
    printf( "値は%dです。\n", 0144 );       // 8進数で表記
    printf( "値は%dです。\n", 100 );        // 10進数で表記
    printf( "値は%dです。\n", 0x64 );       // 16進数で表記
    return 0;
}
```

```txt:実行結果
値は100です。
値は100です。
値は100です。
値は100です。
```

整数リテラルには、基数（進数）を表すための接頭辞があります。`0b`で始まる整数は2進数、`0`で始まる整数は8進数、`0x`で始まる整数は16進数として扱われます。なお、%dは10進数で値を表示する書式指定子なので、整数リテラルの進数関係なく常に10進数で表示されます。

また、コメントや文字列リテラル内に書かれている数値は整数リテラルではありません。間違いやすいので注意してください。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713748/4ab5d0ab-e0eb-8e5a-7895-5e6df628abaf.png)
シェルソート

https://paiza.jp/works/mondai/sort_efficient/sort_efficient__shell

シェルソートのやり方がよく分からなかったので下記で学習しました。
（ありがとうございます）

https://medium-company.com/%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%BD%E3%83%BC%E3%83%88/

```py

def insertion_sort(A, n, h):
    # アルゴリズムが正しく実装されていることを確認するために導入するカウンタ変数、ソート処理には関係がないことに注意
    num_of_move = 0

    for i in range(h,n):
        # A[i] を、整列済みの A[i-ah], ..., A[i-2h], A[i-h] の適切な位置に挿入する
        # 実装の都合上、A[i] の値が上書きされてしまうことがあるので、予め A[i] の値をコピーしておく 
        x = A[i]
        # A[i] の適切な挿入位置を表す変数 j を用意
        j = i - h

        # A[i] の適切な挿入位置が見つかるまで、A[i] より大きい要素を後ろにずらしていく
        while j >= 0 and A[j] > x:
            A[j+h] = A[j]
            j -= h
            num_of_move += 1
        
        # A[i] を挿入
        A[j+h] = x
    print(num_of_move)
    
def shell_sort(A, n):
    H = list(map(int,input().split()))
    
    for h in H:
        insertion_sort(A, n, h)
        
n = int(input())
A = list(map(int,input().split()))
k = int(input())
shell_sort(A,n)
```
基本的には、前に学習した挿入ソートを距離間隔のループの中で回していくだけなのだが、
学習したサイトでは、きれいに２つに分けられていた。８要素を４つにきれいに分けることができるのでグループにわけやすい。

しかし、こちらのケースだとどうだろうか。
7,6,10,2,5,4,8,3,9,1　この１０個の要素において、
最初の間隔が４でグループを作るケース。

この場合、
７と、４つ先にある５、次の４つ先が９
同じように
6と、４つ先にある４、次の４つ先が１
10、４つ先が8その先はないので終わり
２と、４つ先にある３、その先はないので終わり
ということになる。

その後、理屈では、
７，５，９の場合、5だけ７の前に入れ替えることになる。

A[i] の適切な挿入位置が見つかるまで、
A[i] より大きい要素を後ろにずらしていくというところが
難しい。
要するに、グループの中で、4つ飛びに要素を取得して比較するということを
繰り返しやっているということ。
JavaScript のデバウンス、完全に理解した

JavaScript の世には **デバウンス(debounce)** と **スロットル(throttle)** という便利な手法があることを最近知りました。

「これを知らずに今まで開発していたなんて…あの時のロジックもっと簡単に書けたやん」と今悶えています。

残念ながら弊社エンジニアは誰も知らない可能性が高いので、メモして共有するため記事にしました。

スロットルの記事はこちら

https://qiita.com/kazumacchi/items/d1d1222c2e8ee629fe9b

# デバウンス (debounce)

同じイベントが連続して発火するような状況で、発火した回数分処理を実行すると負荷が高くなってしまう場合に、途中のイベント処理は実行せず、最後のイベント発火から指定した秒数待った後に処理を実行する手法。

例えばサイトでフォームの値を入力後にイベントを発火させたいが、ユーザーが連続して入力する場合は入力完了を待ちたいという場合に使えますね。

## 雑なサンプルコード

'test-debounce' という id を持つボタンがあり、最後にクリックしてから1秒後に 'Click Event Called' という文字列と現在日時とコンソールに出力する。1秒経過前に再度クリックが発生した場合は、その前の処理は実行されない。

```javascript
/**
 * @param {Function} anonymousFunction 遅延実行される無名関数
 * @param {number} delay 遅延時間(ms)
 * @returns
 */
function debounce(anonymousFunction, delay)
{
    let inDebounce;
    return function() {
        const context = this;
        const args = arguments;
        clearTimeout(inDebounce);
        inDebounce = setTimeout(() => anonymousFunction.apply(context, args), delay);
    }
}

/**
 * 1秒後に 'Click Event Called' という文字列と現在日時を console に出力する
 */
const clickEvent = debounce(function() {
    console.log('Click Event Called');
    console.log(new Date());
}, 1000);

/**
 * ページロード後、id が test-debounce の要素に対して click イベントリスナーを追加
 */
window.addEventListener('load', function() {
    document.getElementById('test-debounce').addEventListener('click', clickEvent);
});
```

### １回目クリックして1秒待ったのち、3秒間ほど高橋名人並みにクリックし続けた上で止めた場合のサンプル

2024/02/20 14:03:31 1回目のクリック
2024/02/20 14:03:32 1秒後 console に表示される。その後3秒間高橋名人並みにクリック連打
2024/02/20 14:03:33 クリックし続けており、 console には表示されない。
2024/02/20 14:03:34 クリックし続けており、 console には表示されない。
2024/02/20 14:03:35 クリックし続けており、 console には表示されない。クリックを止める
2024/02/20 14:03:36 最後のクリックから1秒経過したので、console に表示される

![samplecode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76272/86ae388f-8614-0066-4840-bb1bda1535ff.png)

# 感想

めっちゃ便利。もっと早く知りたかった。
Top Emerging Trends In Computer Science Engineering

Computer science engineering is one of the fastest-growing fields among the top engineering courses in Tamilnadu. Technology is a robust force that drives many innovations in the future. Let us have a peep into the emerging trends and career scope in computer science engineering in villupuram.

1. Artificial intelligence and machine learning

AI and ML are significant technologies that have heavily influenced the way that people interact with technology. AI and machine learning courses cover essential topics such as deep learning, data analysis, natural language processing, fundamental algorithms, and programming languages including JavaScript, Java, C++, Python and R. 

If you are interested in solving complex problems, it is good to take a CSE course in the best Engineering College.

Career opportunities

●      Machine Learning Engineer

●      Senior Data Scientist

●      Artificial Intelligence/Machine Learning Research Scientist

●      Deep Learning Engineer

●      Algorithm Engineer

2. Cloud Computing & Edge Computing

This internet-based computing allows sharing resources, information and software, with computers and other devices through an active internet connection from anywhere in the world.

Job scopes

●      Edge Computing Specialist

●      Computer Network Architect

●      Software Developer

●      Application Developer

●      Computer Systems Analyst

3. Quantum Computing

Quantum computing adopts quantum mechanics like entanglement and superposition for performing computations. Leading brands such as IBM, Microsoft and Google are all in fierce competition to build quantum computers that can beat the world's most powerful supercomputers.

Job opportunities

●      Quantum Computer Architect

●      Quantum Computer Research Scientist

●      Quantum Software Developer

●      Quantum Algorithm Researcher

4. Robotics

Robotics is a multidisciplinary branch and it combines electrical and mechanical engineering and also covers artificial intelligence and machine learning. This popular course in any Villupuram Engineering College is aimed at automating various repetitive processes in industries and businesses.

Job opportunities

●      Robotics Engineer

●      Software Engineer

●      Algorithm Engineer

●      Data Scientist

●      Robotics Research Scientist

5. Cybersecurity

The recent and widespread cyber threats and attacks on computer systems and networks emphasize the need for Cybersecurity. Cyberattacks end up in drastic financial losses to individuals, companies, and governments. 

Job opportunities

●      Information Security Analyst

●      Information Security Consultant

●      Chief Information Security Officer

●      IT Security Managers

The growth of completely new technologies assures a wide scope for computer science engineering learners.
Authyのまとめ

# デスクトップ版の廃止

+ [AuthyDesktop終了に伴う代替アプリケーションについて](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007YvccZ)

+ [Authyデスクトップ版からモバイル版への切り替えについて](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Yvlfc)

:::note
英語ですが、以下に解説があります。使っているPCがMacだとiOS版のアプリをインストールして、既存のアカウントをすべて同期することで以前と同じように使えるみたいですね。

それ以外のOSではモバイル デバイスで同社の iOSまたは Androidアプリの使用に切り替えることです。この利点は、それほど手間をかけずに切り替えられることです。欠点は、コンピュータ上の 2FA コードに直接アクセスできなくなることです。

と書かれているので、モバイル版を使う必要がありそうですね。

https://www.zdnet.com/article/rely-on-authy-desktop-apps-you-have-one-month-to-switch-your-2fa-or-else/

マルチデバイスで設定できるみたいなので、その機能を使うという事かな。
https://support.authy.com/hc/en-us/articles/360016317013-Enable-or-Disable-Authy-Multi-Device
:::

# 「Authyなどの時間ベースのワンタイムパスワード認証」を一括でチェック済みにする設定を管理者側で行えるか？

[Salesforce側の権限一括設定について](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000BsvcB)

Authy利用時には、記載いただいた設定に加えて、 「アプリケーション登録: ワンタイムパスワード認証」をチェック済みにする必要があり、こちらも一括で設定できればと思ったのですが、ユーザにお願いするしかなさそうですね。。
タイガーのssh

MacOS X 10.4のiBook Dual-USBからNetBSD 10にsshすると入れません。

```
no hostkey alg
```

sshをビルドすることも考えましたが、必要となるOpenSSLがParlが古くてビルドできません。

仕方がないのでNetBSDのsshd_configに以下を追加しました。

```
HostKeyAlgorithms +ssh-rsa
PubkeyAcceptedKeyTypes +ssh-rsa
```

おそらくセキュリティー強度が下がるのだと思われますが、おうちの中なので問題ないと思います。

iBook Dual-USBはCD読み込みに使っていて、読み込んだMP3ファイルをNetBSDにコピーするために必要でした。

NFSやrsyncなども考えたのですが、日本語ファイル名の変換も必要なので、読み込んだファイルを[AppleScriptでscp](https://qiita.com/yamori813/items/3fc13ea14ad3addf06a0#ver-2)することにしました。
Yubikey を用いた ssh key の作成方法

## 準備

### PIN を設定
```bash
brew install ykman
ykman fido access change-pin
```

### OpenSSH のインストール

mac プリインストールの ssh が対応していないため

```bash
brew install openssh
```

以下を `.zshrc` などに追加

```bash
export PATH=$(brew --prefix openssh)/bin:$PATH
```

## 鍵の生成
```bash
ssh-keygen -t ed25519-sk -O resident -O verify-required -O application=ssh:main
```

## Option

### `-O resident`

YubiKey に秘密鍵を保存する。別の PC でも秘密鍵を使いたい時に。
別の PC で秘密鍵を取り出したいときは以下。

```bash
ssh-keygen -K
```

### `-O application={name}`

YubiKey 内での名前を指定。指定しないと `ssh:` になる

### `-O verify-required`
使用時に PIN の入力を必須にする。

### `-O no-touch-required`
使用時に YubiKey のタッチを不要にする。
が、GitHub が対応しておらずこれを指定すると GitHub で鍵が使えなくなるので注意。