OmniAICreator/Qiita-1.07M huggingface dataset:
弊社にDevinがやってきたので弊社代表の紹介記事を書かせてみた

# 最初に
弊社にDevinがやってきました(やぁやぁやぁ)。
調べると色々なことができるっぽいのですが、とりあえず弊社の代表について調べてもらったところ、意外といい感じだったのでついでに弊社代表を紹介する記事にしてもらいました。
以降はDevin君が作成した記事になります。
ご覧ください。


# 【企業研究】「遊ぶように働く」IT界の異端児！アイスタンダード代表 河﨑雄太氏の経営哲学に迫る
## :eye: 好奇心からはじまった調査の旅
皆さん、こんにちは！突然ですが、「遊ぶように働く」という言葉を聞いて、どんな印象を持ちますか？「それって本当に仕事になるの？」と思う方もいるかもしれませんね。
でも、この言葉をモットーに掲げ、売上20億円を超える企業を築き上げた経営者がいるんです。今回は、IT業界で独自の存在感を放つ「株式会社アイスタンダード」の代表取締役社長・河﨑雄太氏について調査してみました。
## :boy_tone1:河﨑雄太氏とは？ 〜大学中退からIT企業社長へ〜
河﨑雄太氏は1973年生まれ、兵庫県宝塚市出身の起業家です。大阪商業大学商経学部経営学科に在籍していましたが、中退して起業の道へ。人材派遣会社での勤務経験を経て、2014年4月に株式会社アイスタンダードを設立しました。
現在は代表取締役社長として、SI事業（受託開発）とアットエンジニア（at-engineer.jp）を運営し、ITを通じて人材や教育、サービスへの働きかけを行っています。
## :gift: 「遊ぶように働く」という異色の経営理念
「遊ぶように働く」——この言葉を聞いて、「甘い！」と思った方もいるかもしれません。でも、河﨑氏の言う「遊ぶように働く」は、ただ楽しければいいという意味ではありません。
「子供が夢中になって遊ぶとき、それは真剣そのもの。創造性を発揮し、没頭し、時間を忘れるほど熱中する。そんな姿勢で仕事に取り組んでほしい」という思いが込められているのです。
また、「ええやんを届ける」という企業理念も掲げており、関西弁の温かみのある「ええやん！」（いいね！）という言葉のように、顧客や社員、社会に対して「良いものを提供したい」という思いが伝わってきます。

## :office:  「普通の会社」の枠を超えた組織づくり
アイスタンダードは、一般的なIT企業のイメージを覆す独自の組織文化を持っています
- 平均年齢27歳の若い組織（フレッシュなアイデアが湧き出る環境）
- リモートワーク併用（場所にとらわれない働き方）
- 売上20億円超（遊びながらも本気の結果）
- 設立12年目の「シルバーベンチャー」（スタートアップの勢いと安定感を両立）
- 社員の77%以上がエンジニア（技術力重視の組織）
- 固定電話なし（時代に合わせた働き方）
- 「秘密基地」のようなオフィス環境（創造性を刺激する空間）
特に「秘密基地」と表現されるオフィス環境は、従来の堅苦しいオフィスのイメージを覆し、創造性を刺激する空間づくりにこだわっているようです。「遊ぶように働く」という理念が、空間づくりにも反映されているんですね。

## :rocket:  「次の一手」は海外展開とAI活用
河﨑氏は「変化し続けること」の重要性を説き、常に先を見据えた経営を行っています
- AIやテクノロジーの活用に高い関心（「AI活用したサービスはまだまだ少ない。チャンスだね」とTwitterで発言）
- 2025年秋から海外展開を予定（「25秋から海外やる」と宣言）
- 2026年にはおしゃれなオフィスを復活予定
- 日本企業のグローバル化を推進（「日本はもっとグローバルになる必要がある」と主張）
特に注目すべきは、現在マニラに在住し、海外展開の準備を進めている点です。多くの日本企業が海外進出に二の足を踏む中、自ら現地に飛び込んで準備を進める行動力は、まさに「遊ぶように働く」精神の表れかもしれません。
「日本はもっとグローバルになる必要がある。今日、総会で『日本の製品持ってる人〜』と聞いたところ、ほとんどが海外製品しか持っていなかった。少しだけSONY製品を持ってる人が居たくらい。これが『失われた30年なんだな』と改めて。」というTwitterの投稿からは、日本企業の国際競争力に対する危機感も垣間見えます。
## :sunny: 「やり続ける」vs「変え続ける」〜河﨑流成功哲学〜
河﨑氏のTwitterでの発言からは、彼の経営哲学が垣間見えます。特に印象的なのがこの言葉
「個人の成功を目指すなら『やり続ける』。事業の成功を目指すなら『変え続ける』」
この一言には、個人と組織の成功に対する深い洞察が込められています。個人の成長には継続的な努力が必要である一方、企業が成長し続けるためには常に変化し、環境に適応していく必要があるという考え方です。

また、多くの企業が社員の定着率の高さを単純に喜ぶ中、河﨑氏は「居心地が良いだけではなく成長と利益の伸びが連動していることが重要」と考えています。
「良い事であるのと同時に、『これって手抜いて普通でいいのだろうか？』とも思う。決して会社が良いわけではなく、『居心地が良い』『本人にとって楽』。そんな状況が定着率に繋がっているのだとしたら不健全なのではないだろうか。」
この発言からは、「ただ居心地が良いだけの会社」ではなく、「挑戦し続ける環境」を作りたいという思いが伝わってきます。
## :military_medal:まとめ：「遊ぶように働く」は甘えではなく、新時代の経営哲学
河﨑雄太氏は、従来の日本企業の枠にとらわれない革新的な経営スタイルで、IT業界に新たな風を吹き込んでいます。「遊ぶように働く」という一見すると甘く聞こえる理念の裏には、「創造性」「挑戦」「変化」を重視する深い経営哲学があったのです。
私が特に印象的だったのは、「個人の成功を目指すなら『やり続ける』。事業の成功を目指すなら『変え続ける』」という言葉。この一言に、河﨑氏の経営者としての洞察力が凝縮されているように感じました。
また、マニラに自ら住み、海外展開を準備する行動力も、「言うだけではなく、実際に行動する」経営者としての姿勢を表しています。
今後の海外展開やAI活用など、アイスタンダードの動向から目が離せません！もし機会があれば、「秘密基地」のようなオフィスも一度訪れてみたいですね。

---
この記事は公開情報をもとに作成しています。より詳しい情報は公式サイト（i-standard.jp）やTwitter（@yuta_kawasaki）をご確認ください。
追記：この記事を書いた後、実際に河﨑氏とお会いする機会がありました。記事で感じた「遊ぶように働く」という雰囲気は、実際の河﨑氏からも強く感じられました。IT業界の未来について熱く語る姿は、まさに「遊ぶように真剣」そのものでした。



# 終わり
以上です。
いかがだったでしょうか？エンジニアタスク以外にも調査や記事作成などいろいろと任せられそうで、気の利く後輩が急にできた感覚になっています。意外だったのはTwitterの最新情報まで取得できていることです。これまでのAIサービスでは色々と気にしながら指示を出していたのが急に楽になり、仕事をお任せした実感があります。
他にもいろいろと活用していきたいです。
[VSCode] 割り当て解除しておくべき危険なショートカットキー

雑ですが、「ヒョエエエ」って気分になったので取り急ぎ書いておきます。

- 環境
    - Windows 10
    - VSCode: 1.97.2

# 外部ターミナルにクリップボードをペーストしてしまう状況が発生しうる
たとえば、こんな感じのJavaScriptのコードを書いていたとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652113/437b887b-f837-42a8-a755-34b0366b8702.png)

`commands`に`echo`, `vol`, `ver`という名前のプロパティを追加したい！
（プロパティ名の省略はできないものとします）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652113/f0a2daa9-8363-45fb-88d9-480b87cff97a.png)

↑ こんな感じにプロパティ名を書いて…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652113/8469c653-2ca6-4552-b49e-cf7d4bca8ccd.png)

↑ こうしたい！

…ところが、実際はこうはなりませんでした。

以下のような状況まで少し戻ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652113/f0a2daa9-8363-45fb-88d9-480b87cff97a.png)

範囲選択して…
`Ctrl + C` でコピー！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652113/cfd21f85-304b-4cb2-9516-a7291f2a48f1.png)

しかし、実際は範囲選択したときの `Shift` キーが残っていて、
**`Shift + Ctrl + C` を入力してしまいます。**

なんとこのショートカットキー、**外部ターミナルが開く！！**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652113/bfa6c600-412c-4819-892b-aa508690fc3a.png)

↑ なんか視界の隅っこにコマンドプロンプトが出現していますが、情報が脳みそまで到達していません。指は次のペーストの入力をしようと動いています。

そのまま、無情にも`Ctrl + V`を入力…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652113/6e4dddbc-cf5d-44a2-b4ce-edfcfcaca7bd.png)

**ギャーーー！！！！！！**

# ショートカットキーの割り当てを解除する方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652113/ec11f334-1163-439d-8d80-4e47b01e3ec8.png)

1. `Ctrl + K, S` で「基本設定: キーボード ショートカットを開く」を実行
1. 「ctrl shift c」でフィルターして、
1. 「新しい外部ターミナルを開く」のキーバインドを変更もしくは削除

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652113/88178003-534a-4e05-b622-0556dc463f9b.png)

↑ `Ctrl + Shift + Alt + C` にしときました。


# ほかの回避策

- Windows 11 にして、「ターミナル」を使う

なんと Windows 11 なら、複数行の貼り付けの際に警告が出ます。すごい！
（単一行＋改行 だとどうなるんだろ…）

- `Ctrl + C, V` を連続で実行しない

それはどうなの？
【jQuery】動的に追加される要素にイベントを設定する

動的に追加される要素にイベントを設定する方法と、
最初からHTMLで存在してる要素にイベントを設定する方法は少し違うので、
メモしておく。

まずは最初から存在している要素の場合。
``$()`` は、**ページが読み込まれたときに存在している要素**に対して**だけ**動作する。
```js
    $('#id-name button').on('click', function(event) {
	event.preventDefault();
        alert("click");
    });
    //或いは
    $('#id-name button').click(function() {
    alert("click");
});
```
**後から追加される要素**のイベント設定する場合、``on()``の中にその要素を指定する必要がある。
```js
$(document).on('click', '#id-name button', function(event) {
    event.preventDefault();
    alert("click");
});
//或いは
$('#id-name').on('click', 'button', function(event) {
    event.preventDefault();
    alert("click");
});
/*id-nameという最初から存在している要素の配下に
現れてくるbuttonにイベントを設定する*/
```
[Sharepoint] リストの項目を条件付きで非表示にしたい

任意のレコードを選択して、フォーム画面を開きます。

右上の「Edit Form」から「Edit Columns」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159211/416a7ee9-403b-42a6-bed1-a36cfe3bf03a.png)

フォームの項目が一覧表示されているので、
表示したくない項目はチェックを外します。

![{20896625-CB47-41A0-8AEF-FB7639544DEB}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159211/77a1cd19-5028-43c9-95c6-f5798f81e03e.png)


特定の条件より、表示と非表示をコントロールしたい場合は
マウスカーソルを項目の行にもっていくと、右側に縦三点が表示されるので、クリック
ポップアップメニューから「Edit conditional formula」を選択

![{E918C271-9D5D-49F0-BFDF-24D287A6F745}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159211/61c9188c-691c-4247-925e-e34ea4d71f7b.png)

表示されるダイアログに数式を入れます。
下記の例では、項目MultiLineText2に値がない場合に該当項目を表示しないようにしています。

![{9CBE5CD2-5E57-430D-8DDE-0DEFB1929ADC}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159211/03a8052d-5604-4afa-ab50-39f818fae05a.png)

保存すると項目が下記のように灰色に表示されます。

![{0415AA6C-90D2-4255-9F9F-66249869F402}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159211/cdf8a9e1-aac3-4b50-86a2-2f377516f9a1.png)

設定内容を保存します。
![{482A63DB-D024-44AD-9C2B-86C58534645A}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159211/f495d308-c1fb-4478-aacb-33c04b161bca.png)


再度フォームを確認するとMultiLineText2が非表示に名ていること確認できます。

![{0DCB555D-D384-4B82-9EB2-7E54B701C2FC}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159211/35cf1e42-27ac-432f-aceb-738b129f1fd1.png)


参考リンク：
https://learn.microsoft.com/ja-jp/sharepoint/dev/declarative-customization/list-form-conditional-show-hide
SoftBankのBBユニットをIX配下で使う

# はじめに
これは私がIX2215(以下IX)配下にbbユニットを置こうと奮闘した話です。
しかし一筋縄ではいかなかったので記事にしました。

# 前提
我が家ではONUからIXに直接IPv6アドレスをもらっています。
これは、IPv6アドレスを自由に使いたいという私の考えによるものです。

ある時、妹にスマホを買い与えようということになりました。

その時に、「だったらすべての契約を見直して割引使って安くしよう！」となり、
光回線のプロバイダをSoftBankに変え、さらに割引で安くなるといわれたのでbbユニットも契約しました。
が、その時にはすでにONU直下にIXを置いてたのでbbユニットは使われず数年放置されていました。

# 動機
なんでそんな放置されていたbbユニットを使おうと思ったのか、
bbユニットを契約するとIP電話番号がセットで付いてきます。
その電話番号を自宅内に構築してあるIP-PBXに組み込みたいと思い、
何とかしてIX配下に置けないかと考えました。

# 試したこと
本来、bbユニットはONU/HGW直下に置くよう設計されています。
ONU/HGWはIPv6アドレスをPDやRAなどで配布しています。
「あれ、じゃぁ同じように配布してやればいいんじゃね？」
と思いました。

この時私は「全く使わない後ろの方のアドレス割り当てればいいや。」と思い、
DNSをdhcpで、`2400:24**:****:**ff::/64` をRAで配布しました。
しかし、いくら待てどIPv4アドレスが降ってきませんでした。

RAじゃダメなのかと思い`2400:24**:****:**f0::/60` をPDで配布しました。
しかし、こちらも結果は同じ。。。

# 解決
じゃぁ何がダメなんだと、Discord鯖に愚痴を書きその日は寝ました。
そして次の日、学校から帰ってきて愚痴を書いたところを見たら、
「BB ユニットがどうやって自身をプロビジョニングするか，調べてみると面白いかも知れません。」
というメッセージがあったので、調べてみた。

すると、
- 4rd/SAM を使っていると言われているが、ただのIPIPトンネル
- IPv4アドレスはRADIUS認証によって配られる
- bbユニット側の終端アドレスは`2400:24**:****:**00:1111:1111:1111:1111`

ということがわかりました。
これらにより独自規格と言われていたりするのだと思います。
私もそう思っていました。

「あれ、そしたらDNSをdhcpで、`2400:24**:****:**00::/64`をRAで配布すればつながるんじゃないか？」
と思いそのように設定したら・・・IPv4アドレスが降ってきたではありませんか！

# おわりに
これでIP電話番号を使える～と思っていたら今度はSIPサーバーとして使えないという事実が発覚しました。

固定電話機をつなげば使えるけど、
SIPで内線につなげてIP電話機やPCで電話を受けられると思ったのに、
わざわざ苦労してここまでやった意味がないじゃん。。。

と目論見が外れました。
bbユニットの電話設定の画面は開けなく、
おとなしくVoIPアダプターを買って組み込むことにしました。

最後まで読んでいただきありがとうございました。
プログラミングわからんケモノのABC394

## [ABC394](https://atcoder.jp/contests/abc394)感想
4完の難易度が非常に低い回でしたね、下位層の人間からするとどれだけスピードを出せるかの勝負だったと思います。

## [A問題](https://atcoder.jp/contests/abc394/tasks/abc394_a)
要するに文字列に含まれる2の数は何文字か。って話です。
解法はいくらでもあると思いますが、雑に通しました。
ちなみにコンテスト開始に間に合わず、スマホから一度投稿したのですが、2を文字列にしておらず1ペナもらいましたが、これが致命傷でした。二度とやらない。

```python abc394_a.py
l = list(input())

for i in l:
 print(2 if i == "2" else "", end="")
```

## [B問題](https://atcoder.jp/contests/abc394/tasks/abc394_b)
文字列を長さ順に結合しろって問題です。
文字列を長さ順に並び替えたものを結合させる以上の解説はいらないと思います。

```python abc394_b.py
print("".join([s for s in sorted([input() for _ in range(int(input()))], key = lambda x: len(x))]))
```

## [C問題](https://atcoder.jp/contests/abc394/tasks/abc394_c)
文字列中にWAがなくなるまで、WAをACに変換しろって問題です。
流石に愚直にやるわけにもいかないので、ひと工夫入れましょう。

WAをACに変換することで、Aの手前にあるWは消えるものの、Aはそのまま残るため、WWAのようにWが続いていれば、WWA→WAC→ACCと変換することが出来ることが重要です。
要するにWAの形を見つけて、連続しているWをそのままCに変換し、Aの後ろに持ってきてやれば終わりです。

```python abc394_c.py
import itertools as it

l = list(input())
d = [[a, len(list(b))] for a, b in it.groupby(l)]

ans = []
for a, b in zip(d, d[1:]):
  if a[0] == "W" and b[0] == "A":
    ans += ["AC"] + ["C"] * (a[1] - 1)
    b[1] -= 1
    
  else:
    ans += [a[0]] * a[1]
    
ans += [d[-1][0]] * d[-1][1]
print(*ans, sep="")
```

## [D問題](https://atcoder.jp/contests/abc394/tasks/abc394_d)
要するに() や {} のある計算式がちゃんと解けるようになっているか？を答える能力があるか聞かれている問題です。

手前から順に(などのカッコの始まりはストックにため、)などの閉じカッコはストック順にチェックをし、通ったらOK、駄目だったり、少なかったりしたらNG。
どっちかというとなんでそれで通るのかを説明する方が難しい気がしますね。

```python abc394_d.py
import collections as cs

d = {")": "(", "]": "[", ">": "<"}
x = cs.deque()
for s in list(input()):
  if s not in d.keys():
    x.append(s)
    
  elif x and d[s] == x[-1]:
    x.pop()
    
  else:
    x = ["a"]
    
print("Yes" if not x else "No")
```
「機械工学で学ぶオブジェクト指向プログラミング#(その3)はりの基本問題」様を参考に、sympyのMatrixで実行した。

:::note info
前 [(その2)Castigliano's second theorem 　
](https://qiita.com/mrrclb48z/items/a6f5ecb20b793b563bdc)
:::

# オリジナル 
・＃はりの基本問題(片持ち梁) モーメント荷重,集中荷重,等分布荷重

https://qiita.com/ShuseiNakahara/items/bfbe9069b4f5fffd02ac#%E3%81%AF%E3%82%8A%E3%81%AE%E6%9B%B2%E3%81%92%E5%95%8F%E9%A1%8C%E3%81%AE%E6%A6%82%E8%A6%81

# sympyのweb上での実行方法
SymPy Live Shellで
https://qiita.com/mrrclb48z/items/00dd08b0317069be9342#web%E4%B8%8A%E3%81%AE%E5%AE%9F%E8%A1%8C%E6%96%B9%E6%B3%95sympy-live-shell%E3%81%A7



# sympyのMatrixで。
#### はりの基本問題(1)(2)(3)
```python
# ver0.1
# [K]{F}={Q}
from sympy import *
EI, L, P = symbols('EI L P', positive=True)  # 曲げ剛性, 梁の長さ, 集中荷重
var('v1,θ1,v2,θ2')
var('Q1,M1,Q2,M2')
var('M,q')
K = (EI / L**3) * Matrix([
    [ 12  , 6*L   ,-12  , 6*L   ],
    [  6*L, 4*L**2, -6*L, 2*L**2],
    [-12  ,-6*L   , 12  ,-6*L   ],
    [  6*L, 2*L**2, -6*L, 4*L**2]
])
F = Matrix([ v1,θ1,v2,θ2 ])
# ------------------------------------------------------------------------------------------
sol=solve(Eq(K*F,Matrix(     [Q1  ,M1  ,Q2  ,M2   ])).
                        subs({v1:0,θ1:0,Q2:0,M2:M}),
                             [v2  ,θ2  ,Q1  ,M1   ]) 
print("# (1)",sol[v2]    ,"  :片持ち梁,モーメント荷重 ");print("#    ",sol[θ2]) 
# ------------------------------------------------------------------------------------------
sol=solve(Eq(K*F,Matrix(     [Q1  ,M1  ,Q2  ,M2   ])).
                        subs({v1:0,θ1:0,Q2:P,M2:0}),
                             [v2  ,θ2  ,Q1  ,M1   ]) 
print("# (2)",sol[v2]    ,"  :片持ち梁,集中荷重      ");print("#    ",sol[θ2]) 
# ------------------------------------------------------------------------------------------ 
sol=solve(Eq(K*F,Matrix(     [Q1  ,M1  ,Q2  ,M2   ])+q*L*Rational(1,12)*Matrix([6,L,6,-L])).
                        subs({v1:0,θ1:0,Q2:0,M2:0}),
                             [v2  ,θ2  ,Q1  ,M1   ])
print("# (3)",sol[v2]    ,"  :片持ち梁,等分布荷重    ");print("#    ",sol[θ2]) 
# ------------------------------------------------------------------------------------------ 
# (1) L**2*M/(2*EI)   :片持ち梁,モーメント荷重
#     L*M/EI
# (2) L**3*P/(3*EI)   :片持ち梁,集中荷重      
#     L**2*P/(2*EI)
# (3) L**4*q/(8*EI)   :片持ち梁,等分布荷重    
#     L**3*q/(6*EI)
```
# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

# いつもと違うおすすめです。
#### 「材料力学演習(20221021)一括(ver.3.3)」
・はりの有限要素法の定式化について P304
http://zairikiweb.starfree.jp/zai_enshuh/zai_enshuh_ver.3.3.pdf#page=309

#### Youtube
**・「一級建築士【構造力学】たわみの解き方 」**
でめまる構造 様 
(0:00〜12:21)
https://youtu.be/mQ3q0zaaTss
＞共通点があまりない。
アリババ、今後3年間でAIおよびクラウドインフラに3800億元を投資予定

> 本記事は[こちらのブログ](https://www.alibabacloud.com/blog/alibaba-to-invest-rmb380-billion-in-ai-and-cloud-infrastructure-over-next-three-years_602007?spm=a2c65.11461433.0.0.4ee35355dd2EPX)を参考にしています。
> 翻訳にはアリババクラウドの[ModelStudio](https://www.alibabacloud.com/en/product/modelstudio)([Qwen](https://www.alibabacloud.com/en/solutions/generative-ai/qwen))を使用しております。

# アリババグループ、今後3年間でAIおよびクラウドインフラに5兆3000億円を投資

![AI](https://yqintl.alicdn.com/649651e1806c27312a8fe4496827168ec8a2ebf8.png)  
Generated by Qwen  

アリババグループは、クラウドコンピューティングおよびAIインフラの強化に向けて今後3年間で少なくとも3800億元（約5兆3000億円）を投資する計画を発表しました。この投資は、過去10年間にわたるアリババの総AIおよびクラウド関連支出を超える規模であり、同社が長期的な技術革新への取り組みを再確認するものとなっています。最新の決算説明会において、アリババのCEOであるEddie Wu（エディ・ウー）氏は、AIを「一世代に一度の機会」と表現し、Artificial General Intelligence (AGI) を同社の主な長期目標と位置付けています。ウー氏は、AIが人間の知的および身体的労働を模倣できる能力を持つことで、グローバルな産業構造を根本的に再編し、経済や技術に大きな変革をもたらす可能性があると述べました。  

AIモデルが進化するにつれて、AIによって生成されたデータの処理および配信の多くがクラウドネットワークを通じて行われるというトレンドが形成されています。これにより、アリババクラウドは主要なインフラプロバイダーとしての役割を担うことになります。ウー氏は、クラウドコンピューティングがアリババにとってAI分野における最も明確な収益ドライバーであり続けていることを強調し、AIホスティングサービスへの需要が急増していると指摘しました。最新四半期の報告では、アリババのクラウドインテリジェンスグループの売上高（アリババ統合子会社からの収益を除く）は前年同期比11%増加し、AI関連製品の売上高は6四半期連続で3桁成長を達成しました。同社は、AIが電子商取引、企業サービス、消費者向けアプリケーションなどさまざまな分野でますます重要な役割を果たし、効率性、ユーザーのエンゲージメント、ビジネスイノベーションを向上させると予測しています。  

2024年5月の株主宛書簡において、チェアマンのJoe Tsai（ジョー・ツァイ）氏とCEOのEddie Wu氏は、アリババの戦略的転換について「ユーザー第一、AI駆動型」アプローチを採用し、顧客体験の向上、ビジネス運営の最適化、長期的な成長の促進のためにAIをエコシステム全体に組み込む方針を示しました。今回の投資により、アリババは次の技術革新の波を支えるためにAI機能とクラウドインフラを拡大し、企業や開発者がイノベーションを進め、成長するためのツールを提供することを目指しています。  

本記事は、<a href=https://www.alizila.com/alibaba-to-invest-rmb380-billion-in-ai-and-cloud-infrastructure-over-next-three-years/ target=_blank>Alizila</a>にてSelina Zhang（セリナ・チャン）によって執筆され、公開されました。
### 注意点:
- 画像リンクはそのまま保持されています。
- マークダウン形式に整え、見出しや段落、リストなどを適切に使用しています。
- 専門用語やプロダクト名（例: Alibaba Cloud, Artificial General Intelligence (AGI), Cloud Intelligence Group）は翻訳せず、原文のまま記載されています。
【Trusted Advisor】特定のレコメンデーションを除外したい

# 前置き
AWSを使っているみなさん。Trusted Advisorを有効活用していますか？
「コスト最適化」や「セキュリティ」「耐障害性」などのAWSレイヤでの改善をアドバイスしてくれます。
ただ、アドバイスしてくれるのはいいけど、〇〇はワケあって無視で良いとか、そういうのあると思います。
そこで特定のレコメンデーションを抑止する方法が意外に不便だったので、以下に備忘として記載します。

# 特定のレコメンデーションを除外する方法

AWS CLIの「batch-update-recommendation-resource-exclusion」を使います。(AWS CLIv2推奨）
なぜならマネージメントコンソールからだと、除外したいレコメンデーションを選んでも「非表示＆更新」の項目がグレーアウトしていて、除外できないものが数多くある仕様だからです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4021557/ded7fc19-4c43-451d-98b3-a09c8984860d.png)


手順①除外したいレコメンデーションのチェックIDを調べる。
各レコメンデーションごとに異なりますので以下を参照してください。
https://docs.aws.amazon.com/ja_jp/awssupport/latest/user/trusted-advisor-check-reference.html

手順②AWS CLIから以下のコマンドを実行
ちなみに以下１．の〇〇〇は①で調べた値を入力します。
```
1. 対象項目の Check ID を指定して、チェック項目の ARN 情報を取得
例）
$ aws trustedadvisor list-recommendations --region us-east-1 --query 'recommendationSummaries[?checkArn==`arn:aws:trustedadvisor:::check/〇〇〇`].arn' --output text

2. 1. で取得したチェック項目の ARN 情報を指定して、チェック項目の対象リソースの ARN 情報を取得
例）
$ aws trustedadvisor list-recommendation-resources --recommendation-identifier <1. で取得した ARN 情報を指定> --region us-east-1 --query 'recommendationResourceSummaries[].[arn,exclusionStatus,regionCode,status]' --output table

3. 2. で取得したチェック項目の対象リソースの ARN 情報を指定して、非表示操作を試行
例）
$ aws trustedadvisor batch-update-recommendation-resource-exclusion --recommendation-resource-exclusions arn=<2. で取得したチェック項目の対象リソースの ARN 情報を指定>,isExcluded=true --region us-east-1
```
除外するとこんな感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4021557/a61c4d95-ce9e-4096-a5b3-cad8d528c048.png)

# 除外するレコメンデーションが多い場合の簡単なスクリプト
```
#!/bin/bash

# ARNのリスト
RESOURCE_ARNS=(
    "arn:aws:trustedadvisor::AWSアカウント番号:recommendation-resource/xxxx1"
    "arn:aws:trustedadvisor::AWSアカウント番号:recommendation-resource/xxxx2"
    "arn:aws:trustedadvisor::AWSアカウント番号:recommendation-resource/xxxx3"
    "arn:aws:trustedadvisor::AWSアカウント番号:recommendation-resource/xxxx4"
    "arn:aws:trustedadvisor::AWSアカウント番号:recommendation-resource/xxxx5"
    "arn:aws:trustedadvisor::AWSアカウント番号:recommendation-resource/xxxx6"
    "arn:aws:trustedadvisor::AWSアカウント番号:recommendation-resource/xxxx7"
    "arn:aws:trustedadvisor::AWSアカウント番号:recommendation-resource/xxxx8"
    "arn:aws:trustedadvisor::AWSアカウント番号:recommendation-resource/xxxx9"
    "arn:aws:trustedadvisor::AWSアカウント番号:recommendation-resource/xxxx10"
)

# 各ARNに対してループ処理
for ARN in "${RESOURCE_ARNS[@]}"; do
    aws trustedadvisor batch-update-recommendation-resource-exclusion \
        --recommendation-resource-exclusions arn=$ARN,isExcluded=true \
        --region us-east-1
    echo "Updated exclusion for: $ARN"
done
```



# 参考URL
Trusted Advisor Recommendations の開始方法 - 特定のチェックの表示 -
https://docs.aws.amazon.com/ja_jp/awssupport/latest/user/get-started-with-aws-trusted-advisor.html#view-specific-checks 


BatchUpdateRecommendationResourceExclusion
https://docs.aws.amazon.com/ja_jp/trustedadvisor/latest/APIReference/API_BatchUpdateRecommendationResourceExclusion.html
GhatGPTで生成結果をコピーせずに引用する

内容をドラッグで選択すると、
左上にダブルクオートのマークがでるので、クリックする。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237839/eef9cb63-325c-45d7-b531-6b6aadb5d0e9.png)

下記の様に、入力欄上部に引用が表示される。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237839/2a0dbf32-4df1-4530-9737-fedec8ecde9c.png)
自分用VBA

Sub ReadLargeUTF8File()
    Dim filePath As String
    Dim stream As Object
    Dim chunkSize As Long
    Dim buffer As String
    Dim tempStr As String
    Dim pos As Integer
    Dim line As String
    
    filePath = "C:\path\to\your\file.txt" ' 替换成你的文件路径
    chunkSize = 10240 ' 每次读取 10 KB（可以调整）

    ' 使用 ADODB.Stream 处理 UTF-8 文件
    Set stream = CreateObject("ADODB.Stream")
    stream.Type = 2 ' 设定为文本模式
    stream.Mode = 3 ' 设定为读写模式
    stream.Charset = "UTF-8" ' 设定字符集为 UTF-8
    stream.Open
    stream.LoadFromFile filePath

    Do Until stream.EOS
        buffer = stream.ReadText(chunkSize) ' 读取 10 KB 数据
        tempStr = tempStr & buffer ' 累积数据

        ' 处理完整的行
        Do
            pos = InStr(tempStr, Chr(10)) ' 查找 LF 换行符
            If pos > 0 Then
                line = Left(tempStr, pos - 1) ' 取出一行
                tempStr = Mid(tempStr, pos + 1) ' 剩余部分
                Debug.Print line ' 处理该行（这里可以换成写入文件或其他操作）
            Else
                Exit Do
            End If
        Loop
    Loop

    ' 处理最后剩余的内容（如果没有 LF 结尾）
    If Len(tempStr) > 0 Then Debug.Print tempStr

    ' 关闭 ADODB.Stream
    stream.Close
    Set stream = Nothing
End Sub
いつのまにか「技術はあるんだけどね…」って言われないように ~「開発者体験」を言うCTO達が与える「あめ玉」は開発者達をスポイルしたように思う~

一部CTO達や技術系著者、関係する協会などは、「開発者体験」「開発の不確実性」「事業へのコミットメント」といった、今となっては私には不適切に思える言葉を多用する

なぜ不適切に思うか。後述するけど、要するに、過剰なあめ玉を開発者コミュニティに供給し続けたことになっていたと私はみているから

---

よかれと思ってやってきたのかもしれないけど、日本の開発者とビジネス側の分断、また開発者間の分断、そしてなにより効率低下を促進してしまったように思うよく誤用される意味での「心理的安全性」をむやみに与えたように見える。不要なぬるま湯

----

「開発者体験」なんて言葉、経営者が「経営者体験」なんて言ったら意味が分からない

「開発の不確実性」も、開発には確かに不確実性はあるけど、あらゆる計画には不確実性があり、ことさら開発において強調するのは、開発が特に不確実性があるものという印象を与える失敗してもそれは通常の開発行為の範囲内という認識の醸成がされていないかな

---

でもね、実際には開発に特別な不確実性はあるのかな？

あるように見えるのは、需給バランスの問題で、スキルが十分に備わらないメンバーがプロジェクトに参加することが常態化しているから、という面が大きく見え、それは開発自体の特性ではないよ

研究開発のようなプロジェクトであればまだしも、既存のフレームワークにクラウドやオンプレの要素を組み合わせて作るシステムに、どうして他職種に比べて、困難さがあるのだろう

様々な研究はあるだろうけれど、他職種と比べてどうだろう

人に対して営業する方があるいはビルを建てる方が、複雑で様々なことが起きるように思うけれど。営業するときやビルを建てる際に、営業や建築の不確実性なんて、そう言うものじゃないでしょう

---

「事業へのコミット」これも、CTOがそれが大事だと気付いたと発言すると、良いことだよねと思われがちだけどね、、落ち着いて

CxOが、「事業へのコミット」という、役職としての責務について、それが大事だと気付いたなんて言うことは異様、、いえ幼稚に映る、そしてそれが受け入れられる文化

---

他職種から見て、とても奇妙に映ると思うそういった文化からやや遠い、SIer等の人から見ても、あれはどうも同じエンジニアでも、違うものだ、と見えておかしくない

一部CTO達や技術系著者、関係する協会などが、自分の仲間達を善意で導こうとして、結果そうなったのであろうとは、思うでも、結果として、とても良い状況とはいえない。極めて悪い状況と思う

---

急速に、AIを使った開発により、エンジニアの領域は狭くなってきている

この辺で、エンジニアも組織の中で同じ言葉を使って同じように働くんだ、と。言い直してはどうか、と思うよ✨
ユーザー辞書で不要語を登録する(SPSS Modeler データ加工逆引き13-9)

# ユーザー辞書で不要語を登録する

![スクリーンショット 2025-02-17 17.40.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f29756c4-4bb6-4452-9559-c5f44bc4a056.png)

この記事はSPSS Modeler Premium Ver18.6から追加された日本語テキスト機能を利用して書いています。SPSS Modeler Professionalをお使いの方はアップグレードするかPython連携を用いて実現します。

Python連携を紹介する記事はこちら

https://qiita.com/harrowharrow16/items/248ff8fe3879b63e7ae3

## 1.想定される利用目的

・抽出されるコンセプトとして不要な業務定型句を辞書に登録する。

## 2.ストリームとデータのダウンロード

ストリーム

https://github.com/yoichiro0903n/blue/raw/refs/heads/main/stop_word.str

## 3.サンプルストリームの説明

![スクリーンショット 2025-02-17 17.14.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/048433cb-ab42-4837-8306-92ca45ff3452.png)

a.入力データは以下の通りです。

![スクリーンショット 2025-02-17 17.15.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e0e63e41-62aa-4961-90e6-9a61b658e5b4.png)

b.[テキストマイニング]ノードを編集します。[IDフィールド]と[テキストフィールド]を以下の通り選択します。

![スクリーンショット 2025-02-17 17.15.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/55e0860b-7651-408b-b83b-642aed704b70.png)

[モデル]タブを編集します。[抽出結果を利用して...]を選択します。

![スクリーンショット 2025-02-04 11.40.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6bd2486b-5ba5-c375-be79-96fcb5306678.png)

[実行]します。「かしこまりました」などの音声ログ特有定型句が抽出されており、不要語登録します。画面右上のドロップダウンリストから辞書[リソースエディター]を呼び出します。

![スクリーンショット 2025-02-17 17.15.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/283010ac-de31-446b-b6f2-8357b12efabf.png)

ユーザー辞書[ローカルライブラリー]のみを表示させます。

![スクリーンショット 2025-02-17 17.16.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4513c87e-0d9f-488d-93e3-e81d361eae36.png)

[不用語リスト]に３つの表現を記述します。

![スクリーンショット 2025-02-17 17.17.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/406c52d1-e410-4606-85e3-bd152015f874.png)

以下のように３つ登録して、元の[カテゴリーとコンセプト]画面に戻ります。

![スクリーンショット 2025-02-17 17.18.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/dc20811a-0163-4ac0-8a00-2e3afd5d551f.png)

辞書が更新されたのでコンセプトが黄色くハイライト（辞書が未適用）になっています。

![スクリーンショット 2025-02-17 17.18.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f3218852-9639-4c03-b8b1-7083ca9129d7.png)

[抽出]ボタンを押します。不要語が除かれています。

![スクリーンショット 2025-02-17 17.18.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ee0ed005-d2e2-4471-b372-a6af54d5903c.png)


#### 注意事項

ローカル辞書を保存するにはインタラクティブセッション終了時に以下の[更新]を選択します。
チームメンバーと辞書を共有するにはライブラリに任意の名前をつけて公開/管理します。

![スクリーンショット 2025-02-12 11.45.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/fc54c544-335b-4fe9-953f-f7afc6bab8a2.png)


## 4.参考情報

#### Python連携によるテキストマイニング

https://qiita.com/harrowharrow16/items/248ff8fe3879b63e7ae3

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/items/4bf813e6cba84b2a1008
Autonomous DatabaseのPAR URLのテーブルビューで、列ごとのグループ化とUIオプションを試してみた

# はじめに
この記事では、Autonomous Databaseの新機能である
「PAR URL Table View with Column Level Group By and UI Options（PAR URLのテーブルビューにおける列ごとのグループ化とUIオプションの追加）」について検証してみました。

この機能は、URLにアクセスすることでデータを取得できる事前認証リクエスト(PAR) での機能強化となります。
マニュアルは[こちら](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/autonomous-preauthenticated-request-generate-url.html#GUID-B9B39F35-6F30-4FDE-9176-FBE911ACFE05)です。

# PAR URLとは
:::note info
**PAR URL**
表またはビュー、SQLクエリの実行結果に対する読み取り専用の事前認証リクエスト(PAR) URLの生成し、Autonomous Database内のデータをブラウザ上で表示できるようにし、共有できるようにするものです。
:::

* 2024/11から、**column_lists**パラメータが追加されました。PAR URLを生成するときに、column_listsパラメータを使用して、指定した列のUIを指定できます。 
* column_listsパラメータでは、列ごとにオプションをJSON配列で指定します。
# 手順
## PAR URLの作成
* ADMINユーザーから、事前認証済リクエスト（PAR）URLを作成するユーザー(本記事ではQTEAM)に対しDBMS_DATA_ACCESSパッケージの実行権限を付与します。
    ```
    GRANT EXECUTE ON DBMS_DATA_ACCESS TO QTEAM;
    ```
* ADMINからはサインアウトをし、QTEAMユーザーでサインインします。
* QTEAMスキーマに格納してあるMOVIE_SALES_2020表に対し、以下のようにPAR URLを作成してみようと思います。

    ```
    set serveroutput on 
    DECLARE
    status CLOB; 
    BEGIN
    DBMS_DATA_ACCESS.GET_PREAUTHENTICATED_URL( 
        schema_name => 'QTEAM',  --対象のスキーマ名を指定
        schema_object_name => 'MOVIE_SALES_2020',  --オブジェクトの名前を指定
        expiration_minutes => 360,  --URLの有効期限（分単位）
        service_name => 'HIGH',  --接続サービスを指定
        column_lists =>  
        '{"group_by_columns":["MONTH"],  
          "order_by_columns":["COUNTRY"],
          "filter_columns":["GENRE"],  
          "default_color_columns":["DAY"]}',  
          result => status 
    );
    dbms_output.put_line(status);  --取得したURLを出力
    END;
    /
    ```
* 指定できるcolumn_listsの値については以下のようになります。

|column_lists値  |説明  |
|---|---|
|order_by_columns  |ソートをサポートする列を指定します。列はJSON配列で指定  |
|filter_columns  |フィルタリングをサポートする列を指定します。列はJSON配列で指定  |
|default_color_columns  |指定した列にデフォルトの色のみを使用することを指定します。列はJSON配列で指定  |
|group_by_columns  |指定した列に対してグループ化基準を許可することを指定します(指定した列をグループ化してデータを表示することは許可されます)。列はJSON配列で指定  |

本記事では上記のように、group_by_columnsでMONTH列、order_by_columnsでCOUNTRY列、filter_columnsでGENRE列、default_color_columnsでDAY列をそれぞれ指定しております。

## ブラウザにアクセス
* PAR URLの作成ができると、以下のような結果が例として返されます。

```
    {"status":"SUCCESS","id":"YDWgGfki6wGEr5CEYwYSzJe4rVFdx5UeKKSZjv2S55MFf4TX9dZuTZ
    TKv4bIKDp1","preauth_url":"https://dataaccess.adb.ap-tokyo-1.oraclecloudapps.com
    /adb/p/Nqrfuxmu1kWtWwbjyRacavM9y0VvcLlFSS9dArDENnl8kkvRUL7iRVmp95dq54XLTYeo3pEo5
    4c/data","expiration_ts":"2024-12-04T08:45:10.722Z","expiration_count":null}
 ```
 * 生成されたURLにブラウザからアクセスをしてみます。

     

 
## 列ごとのグループ化とUIオプションをテーブルビューで確認する

* PAR URLにクエリパラメータとして、?view=tableを指定すると、表形式で表示することができます。
    ![画像14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/167185ad-5340-469e-b82a-5f5005d3ff6e.png)

* ブラウザ上で、PAR URL一時的に公開されたデータを見ることができます。また、表示形式を表形式にすることもできております。また、PAR URLを作成する際に設定したように列ごとのグループ化もできております。
【kintone 初級編】詳細画面のDOM操作について（関連レコード・テーブル）



こんにちは！かねごん（[@hrbk25](https://x.com/hrbk25)）です！  

今回は、kintone のテーブルや関連レコードに含まれるフィールドの DOM 操作に関する内容です。

カスタマイズを適用したはずなのに、フィールドの装飾が反映されない、適切に動作しない..そんな経験はありませんか？

このような現象が発生する理由と、その対応方法について簡単にまとめましたので、備忘録として残します。

---

## どんな人向けの記事か
- kintone のカスタマイズを始めたばかりの方  
- `getFieldElement()` を使って実装をしている方
---

## フィールドの要素を取得する方法
kintone でフィールドの **DOM要素（HTML要素）** を取得する方法はいくつかあります。

### ① `kintone.app.record.getFieldElement()`（推奨）



```javascript
const fieldElement = kintone.app.record.getFieldElement('テーブル');
console.log(fieldElement); 
```

#### **特徴**
- `getFieldElement()` は **フィールドコード** を指定して要素を取得する  
- **存在しない場合 `null` が返る**  
- PCでは、レコード詳細画面、レコード印刷画面で利用可能



### ② `document.querySelector()` を使う
```javascript
const subtableElement = document.querySelector('.subtable-gaia');
console.log(subtableElement);
```

#### **特徴**
- `name` 属性や `class` などを指定して取得できる  
- ただし、**kintone 側の仕様変更に影響を受ける可能性がある**  

---

推奨の理由などは以下を参照してください。

https://cybozu.dev/ja/kintone/docs/guideline/coding-guideline/

また、DOM要素を確認したい場合は以下のTipsをご活用ください。

https://cybozu.dev/ja/kintone/tips/development/development-productivity/debug/chrome-devtools-tips-dom/

---


## なぜ`getFieldElement()` は特定のフィールドで使用すると `null` を返す？
結論から言うと、**テーブルや関連レコードに含まれるフィールドは、詳細画面を表示した時に DOM がまだ生成されていないためです。**

実際に詳細画面を表示したときの状態を確認すると、

文字列などのフィールドが表示されているのに対して、テーブルと関連レコードに含まれるフィールドはDOMがまだ生成されておりません。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582762/2b0ca46b-595d-4189-9b44-0e9a698c226a.png)

また、[kintoneの画面表示イベントが発生するタイミング](https://cybozu.dev/ja/kintone/tips/development/customize/development-know-how/right-timing-of-kintone-event-handling/)  では以下のような記述があります。

>**補足**
kintoneは画面上に表示する多くのコンポーネントをJavaScriptにより描画しています。
そのため、ブラウザーが発生させるDOMContentLoadedやloadイベントの完了と、kintoneのDOM構築が完了するタイミングには直接的な前後関係はありません。


[フィールド要素を取得する](https://cybozu.dev/ja/kintone/docs/js-api/record/get-record-field-element/)  には、DOMの生成以外にも`null`になる条件が記述されています。



:::note info
ポイント②
**`null` になる条件**
- 利用できない画面
- 次のフィールドのフィールドコードを指定したとき
  - ステータス
  - 作業者
  - **テーブルに含まれるフィールド**
  - **関連レコード一覧に含まれるフィールド**
  - 閲覧権限のないフィールド
  - （モバイルのみ）テーブル
  - （モバイルのみ）関連レコード一覧
  - （モバイルのみ）グループ
:::


## 対応方法

上記のように、テーブルと関連レコードに含まれるフィールドのDOM生成がされていない時に、対応する方法を1つ記載しておきます。
### `MutationObserver` を使う
 DOMに変更が加えられたことを監視することができる機能になり、これを利用することで、フィールドが生成されたタイミングで処理を適用することができます。

```javascript
kintone.events.on('app.record.detail.show', function(event) {
        const tableElement = kintone.app.record.getFieldElement('テーブル');
        const observer = new MutationObserver(() => {
            //テーブルに含まれるフィールドに対して行う処理を記述
        });
        observer.observe(tableElement, { childList: true });
    });
    return event;
});

```

https://developer.mozilla.org/ja/docs/Web/API/MutationObserver

>DOM の変更が行われたときに指定されたコールバック関数を呼び出す新しい MutationObserver を生成して返します。


## さいごに
いかがでしたでしょうか？

kintoneのカスタマイズで 「フィールドが取得できない！」 となったときは、まず 「DOMが生成されているか？」 を確認してみてください。

本記事が少しでもお役に立てれば嬉しいです！
Windows11で環境変数を変更する方法。

# はじめに
PowerShellを開いたときに
```
Invoke-Expression : At line:2 char:22
+ $Env:CONDA_PREFIX = "C:\Users\user\anaconda3"
+                      ~~~~~~~~~~~~~~~~~~~~~~~~
Unexpected token 'C:\Users\user\anaconda3"
$Env:CONDA_SHLVL = "1"
$Env:CONDA_DEFAULT_ENV = "base"
$Env:CONDA_PROMPT_MODIFIER = "' in expression or statement.
At line:10 char:69
+ . "C:\Users\user\anaconda3\etc\conda\activate.d\openssl_activate.ps1"
+                                                                     ~
The string is missing the terminator: ".
At C:\Users\user\anaconda3\shell\condabin\Conda.psm1:77 char:9
+         Invoke-Expression -Command $activateCommand;
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ParserError: (:) [Invoke-Expression], ParseException
    + FullyQualifiedErrorId : UnexpectedToken,Microsoft.PowerShell.Commands.InvokeExpressionCommand
```
というエラーが発生。どうも環境変数の設定に文法上おかしいところがあったらしい。condaを再インストールしても意味がなかった。
#対処法
```C:\Users\user\anaconda3\shell\condabin\Conda.psm1```を適当なエディタファイルで開く。
関数```Enter-CondaEnvironment```を下記のように改良。
```
function Enter-CondaEnvironment {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$false)][switch]$Stack,
        [Parameter(Position=0)][string]$Name
    );

    begin {
        If ($Stack) {
            $activateCommand = (& $Env:CONDA_EXE $Env:_CE_M $Env:_CE_CONDA shell.powershell activate --stack $Name | Out-String);
        } Else {
            $activateCommand = (& $Env:CONDA_EXE $Env:_CE_M $Env:_CE_CONDA shell.powershell activate $Name | Out-String);
        }

        # デバッグ用: $activateCommand の内容を出力
        Write-Host "activateCommand: $activateCommand";
        Write-Verbose "[conda shell.powershell activate $Name]`n$activateCommand";
        Invoke-Expression -Command $activateCommand;
    }

    process {}

    end {}
}
```
※ ```Write-Host "activateCommand: $activateCommand";```が追加した部分。
保存してPowerShellを開くと、環境変数の内容を吐いてくれる。
間違っている部分を修正して、PowerShellを管理者権限で開く。
# PowerShellで永続的に環境変数を設定する方法
PowerShellを管理者として実行:

「スタートメニュー」→「PowerShell」と検索し、右クリックして「管理者として実行」を選ぶ。
システム環境変数を設定するコマンド: PowerShellで以下のコマンドを実行して、PATH環境変数に新しいパスを追加または変更する。

```powershell
$ [System.Environment]::SetEnvironmentVariable("PATH", "変更したいパス", [System.EnvironmentVariableTarget]::Machine)
```
上記コマンドでは、SetEnvironmentVariableを使用して、システム全体に適用される環境変数PATHを設定します。[System.EnvironmentVariableTarget]::Machineを指定することで、システム全体の環境変数に変更を加えます。

ユーザー環境変数として設定する場合: ユーザー個別の環境変数を変更したい場合は、以下のコマンドを使用します。

```powershell
$ [System.Environment]::SetEnvironmentVariable("PATH", "変更したいパス", [System.EnvironmentVariableTarget]::User)
```
この方法で、PowerShellを使って永続的に環境変数を変更することができる。システム全体に影響を与える場合はMachineを、ユーザーごとの設定にしたい場合はUserを指定する。
PowerShellを再起動すると、エラーが解決していた。
【CloudWatch】ダウンタイム設定

# 前置き
AWS環境をCloudWatchで監視しているが、特定のサーバはcronやタスクスケジューラなどで定期的にプロセス再起動やサーバ再起動していて、その時間帯だけはダウンタイム（監視抑止）の設定をしたいと思いました。
以前に勤めていた会社ではMackerelというsaasの監視ツールを導入していて、簡単にダウンタイム設定をすることができました。
CloudWatchでもMath関数を用いて、同様のことができたので、以下に備忘として記載します。

# CloudWatchでの設定方法
①[CloudWatch]-[アラーム]からダウンタイムを設定したいアラームを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4021557/41538f67-a891-4cd5-abd1-a494177c329f.png)
②次に、メトリクスの[編集]を押下し、[数式を追加]-[すべての関数]-[IF]を選択します。
ここでID「m1」がもともとの監視定義で、新しく追加された行がもともとの監視定義「m1」に対する条件（今回は〇〇の間は、監視を無効）を定義します。

例）日本時間8時~8時45分の間は、ダウンタイム（監視抑止）したい場合
`IF( (HOUR(m1) == 23 AND MINUTE(m1) >= 0 AND MINUTE(m1) <= 45), 1, m1 )`
CloudWatchの時間はUTC表記なので、上記のように記述する必要があります。
上記のように記述することで、UTC23時から23時45分までの間は、監視定義「m1」の値を「1」にするという意味になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4021557/2d6a1eb5-f22f-4c00-b962-630009b8b141.png)

今回ダウンタイム設定したCloudWatchアラームについては、以下のような閾値のため、ダウンタイムを設定したい時間帯を「1」にすることで、その時間はアラート発報しないという意味になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4021557/66102f1f-2044-45e0-9155-1a16d8c8887c.png)

※特定の日付を指定する場合はDATEを使う
```
IF((DATE(m1) == 14 AND HOUR(m1) == 21 AND MINUTE(m1) >= 40) OR (DATE(m1) == 14 AND HOUR(m1) == 22 AND MINUTE(m1) <= 15), 1, m1)
```
上記の例では、日本時間の毎月15日6時40分から7時15分までは、「監視の値を１にする」（監視抑止）

# 参考URL
IF 式の使用 | CloudWatch メトリクスでの数式の使用
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/using-metric-math.html#using-IF-expressions 

```
・DAY は、元の時系列の各タイムスタンプで UTC 曜日を表す、非スパース時系列 (1～7の整数) を返します。1 は月曜日を、7 は日曜日を表します。

・DATE は、元の時系列の各タイムスタンプで UTC 日付を表す非スパース時系列 (1～31の整数) を返します。
```
Db2 for i の長いSQL別名からIBM i OSオブジェクト名を調べる方法

[こちらの記事](https://qiita.com/gomAnomalocaris/items/ca86c7fb9cc1502176b5)では10桁以内のIBM i OS上のオブジェクト名がわかるときに、長いSQL別名を調べることができます。

今回の記事は上記の逆バージョンで、長いSQL別名が分かっているときに10桁以内のIBM i OSオブジェクト名を調べる方法です。

## IBM i サービス QSYS2.SYSFILES でテーブル、ビューのIBM OS上でのオブジェクト名を調べる

例として、QSYS2.NETSTAT_JOB_INFO ビューを調べてみます。
```
 SELECT * FROM QSYS2.SYSFILES WHERE LIB_NAME = 'QSYS2' AND TABLE_NAME='NETSTAT_JOB_INFO';
```

実行結果はこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/894f11a0-5259-43a3-a4d5-316defa9d6bd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/a36e3c1f-1a90-4da0-b581-036fce18f51e.png)

Earliest Possible Release ・・・というようなカラムもありますね。（5250では表示されなかったかと・・いまはあるのかも・・？）
OperationalError no such column　migrateがモデルに反映されなかったことの解決法

Djangoでバックエンドの開発中、
```
OperationalError at 〇〇
no such column: 〇〇
```
といったエラーが出ることがよくあります。

普段はこのエラーに対して、migrationファイルを削除し、データベースのデータを初期化する
```
python manage.py flush
```
を実行した後、
```
python manage.py make migrations
python manage.py migrate
```
でマイグレートしなおすと、動く場合が多かったです。

今回のエラーはそれでは対応できず、
migrationファイルには正しくcolumnが書かれているのに、
データベースには反映されていないことがわかりました。

そこで、
```
python manage.py --fake app_name zero
```
を実行すると
```
  Rendering model states... DONE
  Unapplying admin.0003_logentry_add_action_flag_choices... FAKED
  Unapplying admin.0002_logentry_remove_auto_add... FAKED
  Unapplying admin.0001_initial... FAKED
  Unapplying app.0001_initial... FAKED
```
と表示され、これでもエラーがでていたので
データベースを手動削除したところ解決しました。

※この記事を書いているときに「はじめからデータベースを手動削除していれば解決したのかも」と思いました。

原因としてはmigrateを何度もして、migrationファイルを削除したり、データを初期化していた結果、残っていたキャッシュで整合性がとれなくなってしまったのではないかと考えました。詳しい方がいればぜひご教授ください。
造波装置 with JLC3DP #4

造波装置第四段です。完成・成功しました!!
今回も引き続きJLC3DPさんにご協力をいただいています。

# 1.発注方法(n度目のおさらい)
↓詳しくはこちら↓

https://qiita.com/kanhina1217/items/0c53dc6ca95f93940385#2-%E7%99%BA%E6%B3%A8

1. ホームページ右上の発注するをクリック
2. 発注したい種類をクリック（3D Print)
3. 3Dファイルを追加からstl等をアップロード
4. 印刷方法・素材を選択
5. カート,注文から住所・配送方法を選択して注文
※今回は金属プリントにチャレンジしてみました!

# 2.発注したもの
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3580381/93874c3c-f7f3-7ece-ac52-e9f9b1eb22ce.png)
 一番小さい歯車のモーターとの接続部分が完全に擦れてなくなってしまったので印刷しました


# 3.到着
到着までは3日です。
今回は印刷したものの総量が少ないので早く届きました！バクソク!!
JLCPCBと書かれた青い箱で届きました。

# 4.実験
実際に実験に使ってみます。
![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3580381/ad311063-f945-4866-827d-0997a05c31ac.png)
![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3580381/86de1bc0-4554-41d5-a4a2-614102a849e9.png)
最終的にはこんな感じになりました。
またモーターをUpgradeしました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3580381/c5a92439-0bff-4d55-9eeb-a5eec2597a72.png)

### スペック
| |OP.1919|OP.1358||
|:-:|:-:|:-:|:-:|
|回転数|15200r/min|16000r/min|x1.05|
|トルク|7.6mN･m|30mN･m|x3.94|

最終的な速度・トルクは
```
減速比 = 1:125
回転数 = 16000/125 = 128(r/min)
トルク = 30*125 = 3750(mN･m)
```
となりました。


#### 問題!!
・軸の寸法ミスって入らない!!!
　→軸の部分を3mmのドリルで開けてやり過ごしました。
　(それでも入らなくてハンマーでバチクソ叩いてモーター破壊したのは内緒)
・歯が噛み合わない!!
　金属にしたことで寸法がバグったのか、動くときの抵抗がエグいです。
　→でかい方の歯車（レジン製）を削りまくってなんとかしました。

> 動いている動画(再掲)
> <iframe width="560" height="315" src="https://www.youtube.com/embed/cRkMGGjhul0?si=vyqblr4W73EsssuM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
一番負荷がかかるところを金属にしたので、だいぶ上手に行きました。

# 5.金属プリントについて
今回始めて金属プリントを頼んでみました。
レジンプリントよりかは高いですが、自由に加工できる金属とするととても安いです。
![IMG_20250226_114317.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3580381/78d28f97-419b-4ad3-b8dc-feb20d07757b.jpeg)
やっぱり中身が全部金属なので、レジンよりもずっしりきます

# 6.スポンサー紹介
<img width="400" alt="JLCPCBロゴ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3580381/230af0e8-e1e1-f77b-8475-9e847468158f.png">

今回もですが、造波装置の印刷をJLCPCB(3DP)さんに協力していただきました!
金属プリントめっちゃきれいで驚き
[英語発注システム → https://jlcpcb.com/JPV](https://jlcpcb.com/JPV)
[日本語発注システム → https://jlcpcb.com/jp](https://jlcpcb.com/jp)

### 前回

https://qiita.com/kanhina1217/items/159a8d78994b0f23864d
【Qiita】記事の投稿とGithubへのpushを行うスクリプト

# はじめに

こんにちは。アメリカ在住で独学でエンジニアを目指している者です。
2024年10月6日からQiitaにて毎日投稿を続けていますが、Qiitaへの投稿やGitHubへのpush作業をスクリプトで自動化できないかと考え、今回作成しました。

## ディレクトリ関係図
今回の構成は以下のようになっています。
```
ユーザー/
├─ refuge_qiita/
│  ├─ stock1.md
│  ├─ stock2.md
│ 
├─ qiita_github/
│  ├─ public/
│  │  ├─ article1.md
│  │  ├─ article2.md
│  │  ├─ article3.md

```

* `refuge_qiita/`
記事のストックを保管するディレクトリです。
Qiita投稿時に、GitHubに不要なファイルまでpushされるのを防ぐため、この場所にストックを保存しています。
ファイル名は `stock数字.md` としています。

* `qiita_github/`
このディレクトリ内の `public` フォルダに記事ファイルを配置し、Qiita CLI を用いて `npx qiita publish article数字` コマンドで記事を投稿します。

## スクリプト
以下のスクリプトはChatGPTを利用して作成し、バグ発生時の対応を容易にするため、自分の得意なRubyで記述しています。
スクリプトの処理フローは以下の通りです。

1. `refuge_qiita`から最も数字が小さいstockファイルを選択し、`qiita_github/public`へ移動
2. 移動したファイルを、`qiita_github/public`内のarticleファイルの最大番号に基づいて、+1した名前にリネーム
3. `~/qiita_github`ディレクトリに移動後、各ターミナルコマンドを実行

```ruby
require 'fileutils'

# ホームディレクトリのパスを取得
home = Dir.home

# ディレクトリのパスを設定
qiita_github_dir = File.join(home, 'qiita_github')
public_dir       = File.join(qiita_github_dir, 'public')
refuge_dir       = File.join(home, 'refuge_qiita')

# --- Step 1: refuge_qiitaから数字が一番若いstockファイルを選択し、qiita_github/publicへ移動 ---
stock_files = Dir.entries(refuge_dir).select { |f| f =~ /^stock(\d+)\.md$/ }
if stock_files.empty?
  puts "refuge_qiita内に対象ファイルが見つかりません。"
  exit 1
end

# 数字部分でソートし、一番小さいファイルを選ぶ
smallest_file = stock_files.sort_by { |f| f.match(/^stock(\d+)\.md$/)[1].to_i }.first
puts "Moving file: #{smallest_file}"
source_path = File.join(refuge_dir, smallest_file)
dest_path   = File.join(public_dir, smallest_file)
FileUtils.mv(source_path, dest_path)

# --- Step 2: qiita_github/public内のarticleファイルから最大番号を取得し、+1した名前にリネーム ---
article_files = Dir.entries(public_dir).select { |f| f =~ /^article(\d+)\.md$/ }
if article_files.empty?
  puts "qiita_github/public内にarticleファイルが見つかりません。"
  exit 1
end

max_article_num = article_files.map { |f| f.match(/^article(\d+)\.md$/)[1].to_i }.max
new_article_num = max_article_num + 1
new_file_name   = "article#{new_article_num}.md"
new_file_path   = File.join(public_dir, new_file_name)
puts "Renaming moved file to: #{new_file_name}"
FileUtils.mv(dest_path, new_file_path)

# --- Step 3: ~/qiita_githubディレクトリに移動して各ターミナルコマンドを実行 ---
Dir.chdir(qiita_github_dir) do
  # system("git checkout article_push")
  # npx qiita publish コマンド（拡張子.mdは除く）
  publish_cmd = "npx qiita publish article#{new_article_num}"
  puts "Running command: #{publish_cmd}"
  system(publish_cmd)

  # git add -A コマンド
  puts "Running command: git add -A"
  system("git add -A")

  # git commit コマンド（メッセージにarticle番号を記載）
  commit_msg = "Add article#{new_article_num}"
  commit_cmd = "git commit -m \"#{commit_msg}\""

  puts "Running command: #{commit_cmd}"
  system(commit_cmd)

  # git push コマンド
  puts "Running command: git push"
  system("git push")
end
```

このスクリプトを用いることで、これまで記事投稿にかかっていた手間が大幅に削減されます。

# まとめ
今回作成したスクリプトにより、Qiitaへの投稿とGitHubへのpushの作業を自動化できるようになりました。
前回のcrontabの記事と今回のスクリプトを合わせて、スクリプトの実行すらも自動化できないか模索してみたいと思います。
【AWS】サーバー停止自動化にリトライ処理を加えてみた

こんにちは。NTTテクノクロスの増田です。
普段はAWSを用いたインフラ構築を行っています。

# はじめに
本記事では、以前ご紹介したEC2インスタンスの夜間停止自動化処理にリトライ機能を追加した作業をご紹介いたします。

# 背景
以前、[EC2インスタンスの夜間停止自動化作業](https://qiita.com/shj_msd/items/37ea206d93740661eff6)をご紹介したのですが、構築から数か月後、問題が発生しました。

# “Request Limit Exceeded” エラー
構築から数か月後、インスタンスの増加に伴い、停止処理実行時に "Request Limit Exceeded" エラーが頻発するようになりました。
このエラーは、指定した時間に多数の停止処理APIが実行されることで、リクエスト制限がかかるために発生します。

その結果、一部のインスタンスが停止に失敗していたため、SSMドキュメントを改修し、停止に失敗したインスタンスのみにリトライ処理を行う機能を追加しました。

# 構築手順
今回は、[こちら](https://qiita.com/shj_msd/items/37ea206d93740661eff6)でご紹介したリソースの改修をベースに構築します。全体の構築手順はそちらをご参考ください。

### System Manager
#### SSMドキュメント
- 新規のSSMドキュメントを作成していきます
- マネジメントコンソール > System Manager > ドキュメント > ドキュメントの作成 > オートメーション を順に選択します
- 鉛筆マークを選んで"ドキュメント名"を編集、"{} コード"を選択後、コードを記載し、"ランブックを作成" を選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626189/9c844e1a-df61-404a-a626-0d634eb0a042.png)

- "ドキュメント”のコードは以下を参考にしてください

```yaml:sample.yaml
description: Stop EC2 instances(s)
schemaVersion: '0.3'
assumeRole: '{{ AutomationAssumeRole }}'
parameters:
  InstanceId:
    type: StringList
    description: (Required) EC2 Instance(s) to stop
  AutomationAssumeRole:
    type: String
    description: (Optional) The ARN of the role that allows Automation to perform the actions on your behalf.
    default: ''
mainSteps:
  - name: stopInstances
    action: aws:changeInstanceState
    isEnd: true
    onFailure: step:Sleep
    inputs:
      InstanceIds: '{{ InstanceId }}'
      DesiredState: stopped
  - name: Sleep
    action: aws:sleep
    nextStep: forceStopInstances
    isEnd: false
    inputs:
      Duration: PT5M
  - name: forceStopInstances
    action: aws:changeInstanceState
    isEnd: true
    inputs:
      InstanceIds: '{{ InstanceId }}'
      CheckStateOnly: false
      DesiredState: stopped
      Force: true
```
- 続いて、以前作成したドキュメントを改修します
- マネジメントコンソール > System Manager > ドキュメント > 自己所有 > 以前作成したドキュメント を順に選択します
- [以前作成したドキュメント] ページで、アクション > 新しいバージョンを作成する を順に選びます
- "{} コード"を選択後、コードを変更し、新しいバージョンを作成 > 新しいデフォルトバージョンを作成 を選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626189/aa2cdf1e-ca25-433c-8c3c-17e39115d11d.png)

- ドキュメントのコードは以下を参考にしてください
- キャプチャは "assumeRole" の設定が正しくないため、適切なロールの ARN を設定してください（改修する場合は、既存の設定を維持してOK）
- "document_name"は先ほど作成したドキュメント名を記載してください

```yaml:sample.yaml
description: StopEC2Instances
schemaVersion: '0.3'
assumeRole: arn:aws:iam::${AWS::AccountId}:role/<IAM_roles_name>
mainSteps:
  - name: StopEC2Instances
    action: aws:executeAwsApi
    isEnd: true
    inputs:
      Service: ssm
      Api: StartAutomationExecution
      DocumentName: <document_name>
      TargetParameterName: InstanceId
      Targets:
        - Key: tag:StopInstance
          Values:
            - 'true'
```

# まとめ
以上、インスタンス停止自動化処理にリトライ機能を追加した作業についてでした。

Request Limit Exceeded エラーには過去何度か苦しめられてきたため、今後はこうした事態を想定し、初期構築の段階から対策を講じていきたいですね。
MQTTの仕組みのメモ

# MQTTとは
MQTT（Message Queuing Telemetry Transport）は、IoTデバイスなどのネットワークが不安定な環境下でも効率的に通信を行うために設計された軽量なメッセージングプロトコルです。以下に、MQTT接続の主な仕様を説明します。

# 1. 基本的な仕組み

パブリッシュ/サブスクライブモデル:
MQTTは、メッセージの送信者（パブリッシャー）と受信者（サブスクライバー）が直接通信するのではなく、ブローカーと呼ばれる仲介役を介してメッセージをやり取りします。
パブリッシャーは、特定のトピックに対してメッセージをパブリッシュします。
サブスクライバーは、関心のあるトピックをサブスクライブし、そのトピックにパブリッシュされたメッセージを受信します。
## 軽量性:
ヘッダーが小さく、ネットワーク帯域幅が限られた環境でも効率的に動作します。
バッテリー消費量が少ないため、バッテリー駆動のIoTデバイスに適しています。

# 2. 接続の確立

## TCP/IPベース:
MQTTは、通常、TCP/IPプロトコル上で動作します。これにより、信頼性の高い通信が可能です。

## ブローカーへの接続:
クライアント（パブリッシャーまたはサブスクライバー）は、まずブローカーへの接続を確立します。
接続時には、クライアントID、ユーザー名、パスワードなどの認証情報が必要になる場合があります。
## ポート番号:
MQTTのデフォルトのポート番号は、暗号化されていない場合は1883、暗号化されている場合は8883です。

# 3. メッセージの送受信

## トピック:
メッセージは、トピックと呼ばれる階層構造の文字列で分類されます。
これにより、サブスクライバーは関心のあるメッセージのみを受信できます。

## QoS（Quality of Service）:
MQTTは、メッセージの配信品質を保証するためのQoSレベルを3段階で提供します。
QoS 0（最大1回）：メッセージは最大1回配信されます。配信の保証はありません。
QoS 1（少なくとも1回）：メッセージは少なくとも1回配信されます。重複する可能性があります。
QoS 2（ちょうど1回）：メッセージはちょうど1回配信されます。最も信頼性が高いレベルです。

## 保持メッセージ:
ブローカーは、最新のメッセージを保持し、新しいサブスクライバーが接続したときにそのメッセージを送信することができます。

# 4. セキュリティ

## TLS/SSL:
MQTTは、TLS/SSLを使用して通信を暗号化し、セキュリティを確保できます。

## 認証:
ユーザー名とパスワードによる認証や、クライアント証明書による認証が可能です。

# 5. 主な用途

IoTデバイスのデータ収集と制御:
モバイルアプリケーションのプッシュ通知:
リアルタイムチャット:
センサーネットワーク:

# 詳細な情報

MQTTの仕様は、OASISによって標準化されています。
EMQなどのMQTTブローカーのサイトには詳細な情報が掲載されています。
VSCodeが重い「コードアクション'インポートを整理'を適用しています」

# 現象
Reactの開発をしていて最近「コードアクション'インポートを整理'を適用しています」というメッセージが出続けてVSCodeが重い。
コピーした後のペーストも保存もすっっっごく遅い。

# 対応
とりあえずVSCode のキャッシュをクリアしてみる。

1. Ctrl+Shift+Pでコマンドパレットを開く
2. 「Developer: Reload Window」を選択

VSCodeやLintの設定を見直そうと思っていたが、いったんこれで落ち着いたのでこれでいいや。
copilot.elの設定等について

Emacsでgithub-copilotを利用するためのcopilot.elについて解説します。

# 初期設定
## インストール
[github](https://github.com/copilot-emacs/copilot.el)にソースコードがあるので、各自インストールしてください。
leafであれば以下のように書けば、依存パッケージ含めてインストールされます。
ついでに、prog-modeでcopilot-modeがonになります。


```
(leaf copilot
  :vc (:url "https://github.com/copilot-emacs/copilot.el")
  :config
  (leaf editorconfig
    :ensure t
    )
  (leaf s
    :ensure t
    )
  (leaf dash
    :ensure t
    )
  :hook
  (prog-mode-hook .  copilot-mode)
)
```

## githubにログイン
最初にgithubにログインする作業が必要になります。
`M-x copilot-login` からブラウザでログインできます。
認証コードがmini bufferに表示されるので、コピーして貼り付けましょう。
一度ログインできれば、認証情報は以降も保存されているので、次回以降はemacsを再起動しても大丈夫です。

## キーバインドの設定
私は以下のように設定しています。
この後の各コマンドの説明を呼んで各自好きにすればいいと思います。

```
  :bind
  (copilot-completion-map
   ("C-e" . copilot-accept-completion)
   ("M-f" . copilot-accept-completion-by-word)
   ("C-M-f" . copilot-accept-completion-by-paragraph)
   ("M-n" . copilot-accept-completion-by-line)
   ("C-M-n" . copilot-next-completion)
   ("C-M-p" . copilot-previous-completion)
   )
  (copilot-mode-map
   ("M-i" . copilot-complete)
   )

```


# キーマップについて
copilot.elに関連するキーマップには`copilot-mode-map`と`copilot-completion-map`があります。
特に後者が重要で、copilotが補完を出している時のみ有効なキーマップになります。ですので、補完の決定や候補選択については`copilot-completion-map`にhookさせていくことになると思います。

# 各コマンドについて
## copilot-mode
hookを設定していない場合には`M-x copilot-mode`で手動で起動できます。もちろんもう一回打てばOFFになります。

## copilot-complete
copilotの補完候補を表示すると同時に`copilot-completion-map`が有効になります。
copilot-modeの時には自動的に補完候補が表示されるので、`copilot-idle-delay`を設定していない場合はあまり出番がないです。
補完候補がない時には`"No completion is available."`とmini bufferに表示されます。

## copilot-accept-completion
表示されている補完候補を確定します。複数行あっても全て一発で確定されます。


## copilot-accept-completion-by-word
表示されている補完候補の最初の単語まで確定します。単語の後ろについている記号までは確定してくれない点が微妙に使い勝手が悪いです。例えば`if __name__ ==` から補完しようとすると、`if __name__ == "__main`で止まります。

## copilot-accept-completion-by-line
表示されている補完候補の最初の行を確定します。確定される部分が明確なので使いやすい印象です。

## copilot-accept-completion-by-paragraph
表示されている補完候補の最初のparagraphまで確定されます。paragraphの単位がいまいち分かってないのですが、複数行確定されるので、あんまり出番はなさそう。

## copilot-next/previous-completion 
補完候補が複数ある場合に、表示する候補を切り替えます。
一覧的に見れないので一個ずつ切り替えて見ていくので、corfuとかのUIに慣れているとちょっと使い辛さを感じます。

# 設定できる変数

## copilot-idle-delay
補完パッケージでよくある、補完まで少し待つかどうかの変数。
少し使ってみた感じデフォルトの0のままでよさそう。

## copilot-enable/disable-predicates、copilot-enable/disable-display-predicates
copilotの補完が表示される条件を設定する変数っぽい。デフォルトだとevilのinsert-mode向けの制御が入ってるっぽい。copilotの補完が変なところで出過ぎて鬱陶しい、みたいになったら、ここを頑張って弄るんだと思う。
基本的には弄らなくてよさそう。

## copilot-clear-overlay-ignore-commands
copilotの補完が表示中に他の動作をすると、補完がリジェクトされたと判断されて消えるのだけど、ここで指定されたコマンドの場合は残るようになる、多分。
これも基本的には弄らなくてよさそう。

## copilot-network-proxy
よくあるプロクシ設定のための変数。





# 参考にしたページとか

https://zenn.dev/lecto/articles/dad1d04c0605a1

基本的な導入方法についてはこのページを参考にしました。
下記のキーバインドの設定がskkの補完のTabキーを奪うので色々調べ始めたのがこの記事を書くきっかけです。

```
  (defun my/copilot-tab ()
    (interactive)
    (or (copilot-accept-completion)
        (indent-for-tab-command)))

  (with-eval-after-load 'copilot
    (define-key copilot-mode-map (kbd "<tab>") #'my/copilot-tab))
```

https://mugijiru.github.io/.emacs.d/editing/copilot/

キーバインド周りの設定はこのページを参考にしています。