OmniAICreator/Qiita-1.07M huggingface dataset:
Consumer Goods Cloud

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


+ [Consumer Goods Cloud と TPM 製品 - FAQ](https://help.salesforce.com/s/articleView?id=000393826&type=1)

# エラー

+ [【未解決】販売契約が組織で構成され、製品を追加するときにエラーが発生する](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JgU2r)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a6f8ca84-c00a-d9d6-5262-87d5e14378fb.png)

+ [Can't create the records of Vehicle, Tour, Route... object](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ZB9Kp)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/13cdb4ad-24aa-f60c-2514-dce21b2e22c6.png)
 
:::note

Yes, to resolve the issue, you have to assign one of these permission sets to the user: either Consumer Goods Cloud Business Admin or Consumer Goods Cloud Sales Support. 

We didn't have them in our org, so the support team suggested that we install the CG Cloud package, which fixed this issue and installed the missing permission sets. The ID of the package is 04t3n0000016IoP. 

An important point to note is that when we tried to install the package, we had to enter a password, as the package is protected. 

If you need the password, please reach out to me in a private message, and I'll share it with you. 

はい、問題を解決するには、Consumer Goods Cloud Business Admin または Consumer Goods Cloud Sales Support のいずれかの権限セットをユーザーに割り当てる必要があります。

私たちの組織にはこれらの権限がなかったため、サポート チームは CG Cloud パッケージをインストールすることを提案しました。これにより、この問題が修正され、不足している権限セットがインストールされました。パッケージの ID は 04t3n0000016IoP です。

注意すべき重要な点は、パッケージが保護されているため、パッケージをインストールしようとしたときにパスワードを入力する必要があることです。

パスワードが必要な場合は、プライベート メッセージで私にご連絡ください。パスワードを共有します。
:::


# Message | 00000351 action configureStartScreen_Decision failed. CallStack: Error: No next action found for action: configureStartScreen_Decision halting execution.

+ [Action configureStartScreen_Decision failed MODELER](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007YvqTW)

:::note
For admin profile in user setting change the default landing page to "Main Menu" instead of "Advanced Cockpit".

ユーザー設定の管理者プロファイルについては、デフォルトのランディング ページを「アドバンスト コックピット」ではなく「メイン メニュー」に変更します。
:::

# 未分類

+ [@ind-rcg/modeler-sfdx-cli-plugin をインストールできません](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ZBwIg)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/77c6cdb5-0b6c-247c-f2c2-00ad739a6ddc.png)

:::note
 today I took the task of analyzing the error, fortunately I have solved it, I was missing some components that were not installed.


今日、私はエラーを分析するタスクを引き受けました。幸いなことに、私はそれを解決しました。インストールされていないいくつかのコンポーネントが不足していました。
:::
猫型ボット（ChatGPTラスク）をDiscordへご招待


https://qiita.com/akiraak/items/d1d535d1d484b41be437

Slackに招待したラスクにゃんをDiscordにも入れました。

![2023-03-22_17h58_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33704/defc4e52-30eb-e0b5-5abd-5d3b285e2ee5.png)

コードはこちら。

```py
import discord
import openai
import os


openai.api_key = os.environ["OPENAI_API_KEY"]


class MyClient(discord.Client):
    async def on_ready(self):
        print('Logged on as', self.user)

    async def on_message(self, message):
        print('on_message', self.user, message)
        if message.author == self.user:
            return

        if self.user in message.mentions:
            chat_logs = ""
            messages = []
            async for msg in message.channel.history(limit=10):
                messages += [msg]
            messages.reverse()
            for msg in messages:
                chat_logs += f"USER:{msg.author} TEXT:{msg.content}\n"

            prompt = """{}
==== ここからAIの性格 ====
あなたはとてもかわいい猫AIエージェントです。
名前はラスクです。
語尾は２割くらいで「にゃん」になります。
次の会話に答えてあげてください。
USER: TEXT:などは使わなくてよいです。
==== ここから質問 ====
{}
ラスクの答え：
""".format(chat_logs, message.content)
            prompt = prompt[-2000:]
            prompt = """==== ここからこれまでのチャットログ ====\n""" + prompt
            print(prompt)
            completion = openai.ChatCompletion.create(model="gpt-3.5-turbo",  messages=[{"role": "user", "content": prompt}], temperature=0.7)
            answer = str(completion.choices[0].message.content).replace("\n", "")
            await message.channel.send(f'{message.author.mention} {answer}')

intents = discord.Intents.default()
intents.message_content = True
client = MyClient(intents=intents)
client.run(os.environ["DISCORD_APP_TOKEN"])
```

Slack版はスレッドの会話のみをプロンプトに入れてるけどDiscordはチャンネルの直近の会話を入れています。プロンプトの文字数が多すぎて溢れてしまうと肝心の質問部分が削られる可能性があるので末尾2000文字程度（チャットログの前をぶった切る）に切っています。
Ruby randとshuffleを使って占いプログラムを作成

# randとshuffleを使ってプログラムを作成
誕生日を入力すると、今日の運勢を表示してくれるプログラムを作ってください。
占い結果については、以下のアルゴリズムにて判定することとします。
必ず、メソッドを作成しそれを呼び出すように記述してください。

- 引数として誕生日の数字を受け取る(例：4月3日なら403、11月15日なら1115と入力)
- 誕生日の数字に、乱数で生成された0 ~ 9の数字のいずれかを掛け算し、その後4で割った時の余りを算出
- シャッフルした占い結果を格納した配列から、上記の数値の順番の値を取り出す
　["凶","中吉","吉", "大吉"]
 
※ヒント<br>
乱数を生成 = rand<br>
配列の要素をシャッフル = shuffle<br>

## shuffle使い方
```ruby
# shuffleメソッドで配列をシャッフルし、変数animalsに代入
animals = ["cat", "dog", "rabbit"].shuffle

puts animals
# => ["rabbit", "cat", "dog"]
```

```ruby
# 自分の回答
def uranai(birthday)
  results = ["凶","中吉","吉", "大吉"].shuffle
  num = birthday * rand(10) % 4
  puts "今日のあなたの運勢は#{results[num]}"
end

puts "誕生日を入力してください(例：4月3日なら403、11月15日なら1115と入力)"
birthday = gets.to_i
uranai(birthday)
```

```ruby
# 模範回答
def result_of_uranai(birthday)
  results = ["凶", "中吉", "吉", "大吉"].shuffle
  num = birthday * rand(10) % 4
  puts "今日のあなたの運勢は、#{results[num]}だよ！"
end

puts "誕生日を入力してください！"

birthday = gets.to_i
result_of_uranai(birthday)
```

## 解説
プログラムの組み立て方としてまず始めに書いたものは、誕生日を入力してもらう部分です。
```ruby
puts "誕生日を入力してください(例：4月3日なら403、11月15日なら1115と入力)"
birthday = gets.to_i
```
to_iメソッドは整数に変換するメソッドです。
その後、uranaiメソッド内を記述していきました。
変数resultsに占い結果の配列の値が入っていて、それらをshuffleします。
入力してもらった誕生日の数字に、乱数で生成された0〜9の数字を掛け、4で割った余りの数字を算出・計算方法が下記の部分になります。
```ruby
num = birthday * rand(10) % 4
```

最後に、計算結果を元に、占い結果を取得し、puts〜で出力します。
Eclipse 2022/2023での設定

Eclipse（を日本語化したPleiades）2022/2023ではJava EEパースペクティブが無くなるなど変更点が多く、前との互換性にとまどう場面も多いです。使いやすくするための設定を紹介します。

### 新規メニューにサーブレットと JSP
新規メニューに「サーブレット」と「JSP」がないため、「その他」から選択しなくてはなりません。新規メニューに「サーブレット」と「JSP」を表示するには以下のようにします。

[ウィンドウ]-[パースペクティブ]-[パースペクティブのカスタマイズ]で「メニュー可視性」の[ファイル]-[新規]で「JSPファイル」「サーブレット」をチェック。

### HTMLエディタの設定
HTMLファイルを開いたとき、以前のHTMLエディタと違うもので開かれるため色合いなどに違和感を感じます。また、JSPファイルは以前と同じエディタのためHTMLとJSPで異なる色になります。これを回避するには、HTMLをJSPエディタで開くようにすればよいです。

HTMLファイルを右クリックし、[次で開く]-[その他]から「JSPエディタ」を選び、下にある「すべての'*.html'ファイルで使用する」をチェックしてOKを押します。

これで次回以降、HTMLファイルを開いたときにもJSPエディタが起動し違和感が無くなります。

### スニペット表示
Java EEパースペクティブには最初からあった「スニペット」が表示されていません。
[ウィンドウ]-[ビューの表示]の「その他」から「スニペット」を選択します。

### ダークテーマの変更
黒背景のダークテーマから前の色合いに戻すには、[ウィンドウ]-[設定]の[一般]の[外観]で「ルック＆フィール」を「クラシック」にします。
【Rails】投稿文章にURLが含まれていたら自動的にリンク化し、文章の改行もする

# はじめに
ポートフォリオ制作中に、投稿文章の中に外部リンクを貼りたいと思ったら、まさかのリンク化されないことに気付いてしまいました。
どうすれば解決するのか調べてみると、
https://qiita.com/Jackson123/items/a5e21c6d6d229681cb6b
こちらの方が解説してくれていました！
記事を参考に自分なりに記述した内容を解説していきます！
# 問題
普通にtext_areaで文章を投稿し、viewページに以下のようにコードを記述。（Itemテーブルのtextカラムがあった場合）
```php:view
<%= @item.text %>
```
理想としてはこのような表示を作りたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291632/a3d85891-43ee-db41-9b7a-35f90db39436.png)


しかし上記のコードのままだと文章の改行がされず、URLもリンク化されません。
また、URLが長すぎるとレイアウトが崩れてしまう場合もあります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291632/e1461c2a-9cf3-2863-4719-76e0295b6262.png)

↑こんな感じになります。
（※URLの部分が改行されているのは自動でされてしまいました）

これを解決していきたいと思います。

# まずはRinkuを導入
Rinkuというgemが簡単に解決してくれました。
```php:Gemfile
gem 'rinku'
```
```
bundle install
```

# 実装
Rinkuの使い方は参考ページの方が解説してくれているので省略します。
```php:view
<%= raw Rinku.auto_link(h(変数)) %>
```
「変数」には「@item.text」など、当てはまる変数を入れてください。
これでURLを含んだ文章を投稿してみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291632/db0cfb6c-ef4f-f26e-8a6a-830a48cb91e5.png)
という風になったと思います。

# 仕上げ

続いて文章の改行やレイアウトが崩れないようにする記述を追加していきます。
```php:view.html.erb
<div class="url-text">
  <%= raw Rinku.auto_link(simple_format(h(変数)), :all, 'target="_blank"') %>
</div>
```
```php:css
.url-text {
  word-break: break-word;
}
```

１つずつ見ていきましょう。
```
(simple_format(h(変数))
```
この記述で文章の改行などををしています。
simple_formatはrailsが元々準備してくれているヘルパーで、文章の改行やスペースによる空白などを適用してくれるみたいです。
```
:all, 'target="_blank"'
```
「:all」はモードの指定です。URLもemailもリンク化します。
この部分を「:urls」に変更するとURLのみリンク化され、「:email_addresses」にするとemailのみリンク化されます。

「'target="_blank"'」は外部リンクの指定です。
簡単に言うと通常はリンクをクリックすると同タブ内での画面遷移が行われますが、'target="_blank"'を指定記述することによってタブを新しく開いてリンク先ページの表示を行ってくれます。
同webサイト内での画面遷移を行いたいなど、不要な機能だという方は記述しないようにしましょう。

```
word-break: break-word;
```
こちらのCSSについては、URLが長くなってしまった際に文章が親要素からはみ出る現象を防ぐためのものです。
はみ出る現象が起きない方は不要な記述です。記述しておいても特に損はない？　ので不安な方は入れておきましょう。
また、bootstrapを使用していてcssをあまり弄りたくないという方は、「class="text-break"」と記述してください。


# 最後に
今回はいろんな方の記事を参考にさせていただきました！
自分自身はまだまだプログラミング初心者ですが、同じ機能を欲している方は結構いるのではと思い記事にしてみました。
皆さんの参考になれば幸いです。

●参考●
simple_formatについて　https://qiita.com/mmaumtjgj/items/1b672f3accd37387b2f3
Rinkuについて　https://qiita.com/ngron/items/151e1e4b94319bcbdeec
word-breakについて　https://developer.mozilla.org/ja/docs/Web/CSS/word-break
新卒エンジニアが【Pythonエンジニアデータ分析試験】の模試を受けてみたら、、、

お久しぶりです！

前回はPythonエンジニア認定基礎試験を受験し、参考書なしで見事9割で合格することができました！！
→[前回の記事はこちら](https://qiita.com/asukitt/items/89df70694ffab24989e5)

そして次なる目標として、タイトルにもある通り

***Pythonエンジニアデータ分析試験を受験します！！！！***

なので今後は前回同様、模試を受験して、その結果と直しを記事にしていきたいと思います。

現在の学習状況はこちら
・指定教材を２周読んだ
・AIについての基礎知識有
・本の内容を自分なりにまとめている

## 模試の直し
・DBSCAN法とは（教科書では特に言及はされていないのですが）「特徴量ベクトル間の距離に着眼した手法」つまりデータ間のそれぞれの特徴を基に学習する手法で教師なし学習

・回帰：目的変数連続
　分類：目的変数カテゴリ

・venvはPython自体のバージョン管理はできない

#### 正規表現
?:0個か1個マッチ
|：どちらかがマッチ
[]：[]内のどれかがマッチ

retの中にある文字列が再現できればエラーは起きない。作れなかったらエラーを起こす。

#### JupyterLab
拡張子は.ipynb
データフォーマットはJSON形式

#### 数学
sin:正弦
cos:余弦
tan:正接

#### マンハッタン距離
ベクトルの距離ではなく、行くまでの道のり
B(4,7)→4+7=11

#### ベクトル
行列の列の数とベクトルのサイズが同じ場合は、これらの掛け算を定義することができ、結果は、元の行列の行数と同じサイズのベクトルになる。

#### 期待値
12面体のサイコロを1回振った場合の期待値
各目が出る確率を計算し総和
1+2+3+4+5+6+7+8+9+10+11+12/12=6.5

#### 条件付確率とベイズの定理

#### 確率密度関数と確率質量関数の確率変数
確率密度関数：連続
確率質量関数：離散的

#### np.dtype
int64,int32になる

#### @演算子、dot
[1 3]@[-1 5]=[-1+15]=14

#### pickle
 DataFrameを直列化してファイルとして保存し、再利用するためにpickleモジュールを利用することができる。

#### pandas
freq=Mとすると行数12になる

#### fillnaメソッド
平均値、中央値、最頻値はmethod引数に指定せずにdf.mean,df.median,df.mode

#### pandas,numpy
DataFrameをNumPy配列に変換するには、values属性を利用する。この場合、インデックス名、カラム名は保持されない。

#### Matplotlib
 同じフォントの指定を複数回繰り返す場合、フォントの設定を辞書データとして作成し、fontdict引数に一度に指定することができる。上書き可能。

#### np.arrange(0,1,25)
この場合、rangeとは違い1も含まれる

#### np.random.normal(mu,sigma,1000)
mu:平均値
sigma:標準偏差
1000：件数

#### 次元削減
説明変数の次元数を減らして計算量を減らすこと

#### 主成分分析
高次元のデータに対して分散が大きくなる方向を探して、元の次元と同じかそれよりも低い次元データに変換する手法

2次元のデータに対して主成分分析を行い、どちらも重要であると確認できた場合には、1次元に次元削減できる可能性が高いとはいえません。

#### 分類モデル
機械学習を用いて構築した分類モデルの良し悪しを評価する指標に適合率、再現率、F値、正解率がある。これらは混同行列から計算する。

適合率は予想するクラスをなるべく間違えないようにしたいときに重視する指標である。

#### 交差検証
10分割の交差検証を指定したため、最適な決定木の深さの値は毎回変わります。

#### iris.dataset
irisデータセットを出力してみると、0から149まで合計150個のアイリスの情報が記録されていることが確認できます。
ChatGPT使ってみた記録

少し前から話題になっているChatGPT，私もtwitterで良く目にするようになったので試しに使ってみました．
質問形式で検索が可能で様々な質問に高速かつ丁寧に回答するのでかなり使いやすいと感じました．
ところが...

**ある時，ChatGPTにおいて以下のようなエラーが発生しました**
![スクリーンショット (3896).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292130/0aeae00e-a4ce-dd90-555f-39d62d5d239d.png)
？？？
一番重要なところがSomethingと表記され，何が問題なのか分かりません！
因みにこのエラーはChatGPT内のRegenerate response（上記画像の下にあるボタン）を押しても解消されませんでした．
時間を置いて再度ボタンを押してみても上記のエラーは解消しません．
この状態ではchatを新たに更新してもChatGPTは反応しなくなってしまいます．

このエラーが出た時，日本時間で夜10時頃．
私はサーバー利用者の増加による混線が問題であると考え，時間をずらすことにしました．
ただ，朝，昼，夜と時間帯を変えてみてもこれと同じエラーが出る場合がありました．
このエラーは時間帯とは関係がなさそうです．

しかし，エラーが出た後に一度webページ自体を更新し再度出力を行うとエラーは解消されました．
複数回試してみたところ，毎回エラーが消えるので再現性は高いです．

**結論**
他の検索エンジンと異なり，ChatGPTは定期的にリログをする必要があることが分かりました．

原因不明のエラーが出てもセッション切れの場合もあるので落ち着いて対処する必要がありそうです...
Google DomainsでAレコードをAPI経由で自動設定する【グーグルドメイン】

Cloud DomainsにAPIあるけど、Google DomainsでAPI使って自動更新したいときにお試しください

```bash
curl https://username:password@domains.google.com/nic/update?hostname=subdomain.yourdomain.com

curl -u username:password https://domains.google.com/nic/update?hostname=subdomain.yourdomain.com
```

ユーザー名とパスワードは管理画面から確認できます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127414/94e93019-9021-6961-eb77-23b2ece0a9ec.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127414/78ae1fb6-6139-5ebf-600f-748b801bcdb4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127414/16b41aff-de2f-22fb-9063-15f16aaa3c15.png)


https://support.google.com/domains/answer/6147083?hl=ja
漢字を得意ではないの私のために, 記事を読める方法

<style>
img{
  margin-left: 50px;
  zoom: 0.5
}
</style>
漢字を得意ではないの私のために、[Furigana APP](https://apps.apple.com/jp/app/furigana/id1149116590)はこんな使い方があります。

Qiitaサイトで下記の面白そうの記事を見つかりました。読みたいと思ったら、やったら、漢字が多く、読み辛いです！

[ChatGPTに聞きます。（Java SE面談問題）](https://qiita.com/wzhang85turing/items/e68acd31ad3d54e43239)

![6mMfkmBJhzTeFUzqrRoA8J4KaAY2/91EYn5AmiSgLef4K.jpg](https://firebasestorage.googleapis.com:443/v0/b/type-c1c71.appspot.com/o/6mMfkmBJhzTeFUzqrRoA8J4KaAY2%2F91EYn5AmiSgLef4K.jpg?alt=media&token=c1e093da-88e4-4a01-973b-2c4a1e436f7d)

**その時、Safariの共有ボタンを押下して**
![6mMfkmBJhzTeFUzqrRoA8J4KaAY2/a1MfKN2gZ6epWNHb.jpg](https://firebasestorage.googleapis.com:443/v0/b/type-c1c71.appspot.com/o/6mMfkmBJhzTeFUzqrRoA8J4KaAY2%2Fa1MfKN2gZ6epWNHb.jpg?alt=media&token=71e0134a-4bbc-4b76-8b0c-a657ffde20c1)

**アクションから「ふりがな」を選択する**

![6mMfkmBJhzTeFUzqrRoA8J4KaAY2/je0MeBUbr48tVeVl.jpg](https://firebasestorage.googleapis.com:443/v0/b/type-c1c71.appspot.com/o/6mMfkmBJhzTeFUzqrRoA8J4KaAY2%2Fje0MeBUbr48tVeVl.jpg?alt=media&token=b0e1bafa-874d-46ce-8cf9-313988f39fbe)

**広告ブロックのページを閉じると、Safariの表示は下記のようになります。**
![6mMfkmBJhzTeFUzqrRoA8J4KaAY2/kPfCV7lQWpkOVLlf.jpg](https://firebasestorage.googleapis.com:443/v0/b/type-c1c71.appspot.com/o/6mMfkmBJhzTeFUzqrRoA8J4KaAY2%2FkPfCV7lQWpkOVLlf.jpg?alt=media&token=b6365ed2-3588-4062-accd-5236127236e0)

**読めます！**
sumメソッドについて

### <font color="MediumSlateBlue">sumメソッドとは

- sumメソッドは配列や範囲オブジェクトの合計値を求めるときに使用する。

### <font color="MediumSlateBlue">sumメソッドの書き方
```
配列.sum
```
空の配列を指定した場合は0を返す。

配列に文字列が含まれていた場合はエラー「TypeError」が発生する。

- 基本的な使い方
```ruby
array = [1, 2, 3, 4, 5, 6, 7, 8, 9]
p array.sum
```
実行結果
```ruby
45
```

### <font color="MediumSlateBlue">ブロックを使った処理方法

- umメソッド実行時にブロックを指定した場合、ブロックの処理結果が加算される。

以下の例文ではブロックの処理で各要素に10を掛けた結果の合計値。

```ruby
array = [1,2,3,4,5,6,7,8,9,10]
p array.sum { |num| num * 10 }
```
実行結果
```ruby
550
```

### <font color="MediumSlateBlue">配列の平均値を求める方法
- 平均値を求める場合は「配列の合計値 / 配列の要素数」で計算する。
```ruby
array = [1, 2, 3, 4, 5, 6, 7, 8, 9]
 
# 平均値を求める
p array.sum / array.length
```
実行結果
```ruby
5
```

<font color="DeepPink">※sumメソッドを使えば、簡単に合計値の取得や平均値の計算ができる</font>
[Tips]Google検索結果から日本語を対象外とする



❗️こちらは、社内のnotion記事の転記版です。社内記事ツールが利用できなくなったので、お引越ししました。

⏱️ 2分で読んで、ブックマークレットの登録に長くても３分くらいでいけるかと思われます。


## react css modulesを導入しようとして検索するとおきたこと🤭

「導入方法どのリンクにもないわ、本家本元どこなのよ・・・・」ということがありました。

日本語検索が優先されているので、本家リンクになかなか辿り着けないというのが原因です。

これを解決する方法を教えていただいたので共有＋[Qiita](https://qiita.com/matsuoshi/items/31a4ddd1177682f3de7e)や[ブログ](https://matsuoshi.hatenablog.com/entry/2019/09/06/000000)が消された時用の忘備録にします。

![思ってたのと違う。よくありますよね。それは他の人もそう思っているのかも。こういうのからすれ違いが始まりますね。](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2251393/711df4fa-4e52-3308-38da-6f4d8237cc86.png)

思ってたのと違う。よくありますよね。それは他の人もそう思っているのかも。こういうのからすれ違いが始まりますね。

## ブックマークレットを登録📝

以下のブックマークレットを登録してください。日本語除外検索であるかをチェックして、true=日本語検索、false=日本語除外検索にlrを更新するというシンプルさです。

```jsx
javascript:(()=>{u=new URL(location);u.searchParams.set('lr',(u.searchParams.get('lr')=='-lang_ja')?'lang_ja':'-lang_ja');location.href=u.href;})()
```

**ブックマークレット登録手順**

1. 適当に新しいブックマークを行い、ブックマークバーに登録します。
    
![スクリーンショット 2022-04-30 2.33.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2251393/94bacfb9-65df-f657-0584-88d764cdf8c2.png)

    
2. ブラウザ右上の…＞ブックマークから、該当のブックマークを右クリックし、**編集**をクリックします。
![スクリーンショット 2022-04-30 2.56.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2251393/cfc86127-dbdc-cbd2-78a1-b8651a48954d.png)

    
3. URL欄にjavascript:から始まるブックマークレットのコードをコピペすることで登録することができます。
    ![スクリーンショット 2022-04-30 2.40.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2251393/aeef1b3c-fe00-03c1-72bb-0705cbd8565f.png)

    

## 検索してブックマークレットを使用する😀

早速使ってみましょう！

**google検索を行った後**、先ほど登録したブックマークレットをクリックしてください。

日本語を除外した検索に切り替わります。

やっぱり日本語がいい！と思ったら、もう一度クリックすれば戻ります。

![スクリーンショット 2022-04-30 2.02.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2251393/5f830cdf-ce07-0346-4ad7-4d2e822cc121.png)


## 余談

ブックマークレット元コード

```jsx
(() => {
    let u = new URL(location);
    u.searchParams.set('lr', (u.searchParams.get('lr') == '-lang_ja') ? 'lang_ja' : '-lang_ja');
    location.href = u.href;
})()
```

[ここ](https://closure-compiler.appspot.com/home)にコードを貼り付けてコンパイルすると

```jsx
(function(){var a=new URL(location);a.searchParams.set("lr","-lang_ja"==a.searchParams.get("lr")?"lang_ja":"-lang_ja");location.href=a.href})();
```

という風に短くしてくれます。もうちょっと短くできるので手直しします。

アロー関数に変えて、varを省略して（letなのにvarに退化させれるのは、==ClosureCompiler==内に// @language_out ECMASCRIPT_2017あたりで指定していなかったからっぽいです）変数名をuにし、末尾の;位置を調整（しなくてもいいかも）。

urlでなくてjavascriptですよとブラウザに認識させるためにjavascript:を先頭につける。

____という過程を経ているかと思われます。

**ブックマークレットをドラッグ&ドロップで登録させられればいいのでは？**

<これ>をブックマークバーにドラッグ＆ドロップしてください。ってできたら登録の説明かかなくていい。と思ったのですが・・・

<a href = “javascript:(()=>{u=new URL(location);u.searchParams.set('lr',(u.searchParams.get('lr')=='-lang_ja')?'lang_ja':'-lang_ja');location.href=u.href;})()”>これ</a>

 //・・・html埋め込みをして誰得かな？と思いましたので、不採用となりました。
ChatGPTに聞きます。（Java SE面談問題）

**ChatGPTに聞きます。（Java SE面談問題）**

Q：

Webアプリケーションを動かすために、何が必要ですか？


A：

Webアプリケーションを動かすためには、以下のものが必要です：

1. Webサーバー：Webサーバーは、HTTPプロトコルを使用してWebページを配信するためのソフトウェアです。Webアプリケーションを実行するためには、Webサーバーが必要です。代表的なWebサーバーには、ApacheやNginxなどがあります。
2. アプリケーションサーバー：アプリケーションサーバーは、Webサーバーとデータベースサーバーの間でアプリケーションを実行するためのソフトウェアです。Webアプリケーションが動作するためには、アプリケーションサーバーが必要です。代表的なアプリケーションサーバーには、TomcatやJettyなどがあります。
3. データベースサーバー：データベースサーバーは、Webアプリケーションが使用するデータを保存するためのソフトウェアです。Webアプリケーションが動作するためには、データベースサーバーが必要です。代表的なデータベースサーバーには、MySQLやPostgreSQLなどがあります。
4. プログラミング言語：Webアプリケーションを開発するためには、プログラミング言語が必要です。代表的なWebアプリケーション開発言語には、Java、Python、Ruby、PHPなどがあります。
5. Webフレームワーク：Webフレームワークは、Webアプリケーションの開発を支援するためのソフトウェアです。代表的なWebフレームワークには、Spring、Django、Ruby on Rails、Laravelなどがあります。

これらの要素が揃っていれば、Webアプリケーションを動かすことができます。ただし、具体的な環境や要件に応じて、必要なものや設定は異なる場合があります。
JSでS3からのファイルダウンロードに手間取ったのでメモ

## 概要
aws-sdkのgetObjectを使用して、S3からファイルダウンロード行ったら
ファイルが壊れていた時のメモです

以下のサイトを参考にBlobを使用、リンクを生成しダウンロードできるようにしたかったのですが、
getObjectで取得したものをそのまま入れるとファイルが壊れてしまいました

https://tsuchippo.com/programming-blob


ダウンロードはボタンをクリックしたときにファイルがダウンロードされるようにしています
getObjectを使用してデータを取得する処理は省略しています
s3Dataにs3から取得したデータを格納しています


```

const downloadButton = document.querySelector('.download-button');
downloadButton.addEventListener('click', () => {
  const blob = new Blob([s3Data]); 
  const link = document.createElement('a');
  link.download = 'test.txt';
  link.href = URL.createObjectURL(blob); 
  link.click(); 
  URL.revokeObjectURL(link.href);
}, false);

```

## 結論

``` const blob = new Blob([s3Data]); ``` を ``` const blob = new Blob([Uint8Array.from(s3Data).buffer]); ```にしたところ、ファイルが壊れずにダウンロードできました

Blobでうまく変換ができていなかったのが原因でした

## 参考

- aws-sdk getObject

https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property

- Blobを使用したダウンロード処理

https://tsuchippo.com/programming-blob
メシエ天体の一覧をChatGPTに聞いてみた

以下は、前回の回答に等級での明るさを追加した一覧表です。

| メシエ天体の番号 | 名称 | 視直径 | 等級 |
|---|---|---|---|
| M1 | タウリス矮星雲 | 6.0' | +8.4 |
| M2 | 大マゼラン星雲 | 30.0' | +0.0 |
| M3 | 円盤状星団 | 16.0' | +6.2 |
| M4 | スコーピオン座の球状星団 | 26.0' | +5.9 |
| M5 | 蛇座の球状星団 | 23.0' | +5.6 |
| M6 | 蝶々星雲 | 25.0' | +4.2 |
| M7 | かに座のオープンクラスター | 80.0' | +3.3 |
| M8 | ラグーン星雲 | 90.0' | +6.0 |
| M10 | オフェウクス座の球状星団 | 20.0' | +6.6 |
| M13 | ヘラクレス座の球状星団 | 20.0' | +5.8 |
| M15 | ペガスス座の球状星団 | 18.0' | +6.2 |
| M17 | オメガ星雲 | 11.0' | +6.0 |
| M20 | 三叉路星雲 | 28.0' | +8.0 |
| M31 | アンドロメダ銀河 | 178.0' | +3.4 |
| M42 | オリオン大星雲 | 85.0' | +4.0 |
| M45 | 昴星団 | 110.0' | +1.6 |
| M57 | リング星雲 | 1.4' | +9.7 |
| M81 | ブノワ銀河 | 21.0' | +6.9 |
| M82 | シガレット銀河 | 11.0' | +8.4 |
| M92 | ヘルクレス座の球状星団 | 14.0' | +6.4 |
| M101 | ピンホール銀河 | 29.0' | +7.9 |
| M104 | サマリアン星雲 | 8.0' | +8.0 |
| M106 | くじら座の渦巻銀河 | 18.0' | +8.4 |
| M109 | うしかい座の渦巻銀河 | 7.0' | +9.8 |
| M110 | アンドロメダ銀河の伴銀河 | 20.0' | +8.5 |

４月に撮影に行くとして、時期も含めて質問した。

以下に、日本で4月から5月に見ることができる主なメシエ天体の一覧表を、視直径と表面の明るさ（投球）を含めて示します。

| メシエ天体番号 | 名称                           | 星座           | 視直径（分） | 投球（等級）  |
| --------------- | ------------------------------ | -------------- | ----------- | ------------ |
| M3              | 円盤状星団                     | かに座         | 18.0        | +6.2         |
| M13             | ヘラクレス座の球状星団         | ヘラクレス座   | 20.0        | +5.8         |
| M44             | やぎ座の散開星団               | やぎ座         | 95.0        | +3.7         |
| M67             | かに座の散開星団               | かに座         | 30.0        | +6.9         |
| M51             | かじき座のグローブル星団       | かじき座       | 11.2 x 6.9  | +8.4         |
| M65             | しし座の渦巻銀河               | しし座         | 9.3 x 4.2   | +9.3         |
| M66             | しし座の渦巻銀河               | しし座         | 9.6 x 4.2   | +8.9         |
| M81             | おおぐま座の渦巻銀河           | おおぐま座     | 26.9 x 14.1 | +6.9         |
| M82             | おおぐま座の星爆(銀河)         | おおぐま座     | 11.2 x 4.3  | +8.4         |
| M94             | とかげ座の渦巻銀河             | とかげ座       | 11.2 x 9.3  | +8.2         |
| M101            | うしかい座の渦巻銀河           | うしかい座     | 29.7 x 28.3 | +7.9         |
| M104            | おとめ座の銀河(目玉銀河)       | おとめ座       | 9.1 x 4.2   | +8.0         |
| M108            | へびつかい座の渦巻銀河         | へびつかい座   | 8.7 x 2.2   | +10.0        |
| M109            | おおぐま座の渦巻銀河           | おおぐま座     | 7.7 x 4.5   | +9.8
Django管理画面での権限管理

# Djangoの管理画面について

Djangoは、Pythonで開発された人気のあるWebフレームワークで、開発者が効率的にWebアプリケーションを構築できます。Djangoの管理画面は、データベースの管理や操作を容易にするための強力な機能を提供しています。この記事では、管理画面のカスタマイズ可能な機能について、いくつか解説します。

この記事はDjango管理画面カスタムシリーズの1つです。
以下に本シリーズの記事を添付します。

https://qiita.com/ryo-keima/items/b250abcdd378f85e4eed


## GitHubレポジトリ

ここで解説しているソースコードは、GitHubにて公開しておりますので、気になる方はチェックしてみてください！

https://github.com/ryo-keima/django-admin-dashboard-demo

# Django管理画面の権限管理

この記事はDjango管理画面の様々なカスタマイズシリーズの続きです。

## 概要

Djangoフレームワークは、Webアプリケーションの開発を効率的に行うための強力なツールです。その中でも、管理画面はデータの管理や操作を簡単に行える便利な機能ですが、デフォルトではすべてのユーザーに同じ権限が与えられています。このブログでは、Djangoの管理画面でユーザーごとにアクセス権を変更する方法を解説します。

## 目標

ユーザーごとにアクセス権を付与できることを目標とします。
具体的には、testuser2というユーザーを作成し、そのユーザーには、ブログの作成権限のみを付与してみます。
![Screenshot 2023-03-21 at 10.14.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951524/2abd24a8-8203-5656-3982-5e68cbaf19c0.png)


## 手順

### 1. スーパーユーザーアカウントで、管理画面にログイン

### 2. ユーザーを作成

![Screenshot 2023-03-21 at 10.32.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951524/64d01344-7e2c-cab4-71b6-f1d942a23b0d.png)


### 3. 2.で作成したユーザーに権限を付与

管理画面にログインできるよう、Staff statusのチェックボックスにチェックを入れます。
また、ブログの追加権限を付与したいので、User permissionsのセレクトボックスから、`blog | blog | Can add blog` を選択します。

![Screenshot 2023-03-21 at 10.42.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951524/e31c3221-cb84-86e1-bc7d-442a35981b3d.png)


### 4.  2.で作成したユーザーで管理画面にログインする

![Screenshot 2023-03-21 at 10.39.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951524/9a278105-75f6-a780-608d-13e54e4e865e.png)


ログイン後の画面を確認すると、Blogしか表示されていませんね！

![Screenshot 2023-03-21 at 10.44.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951524/75e752d3-3929-30fc-31d4-38306a1efb6c.png)

### 5. ブログを作成

ブログ作成権限があるか確認します。
title, body, authorを設定し、SAVEを押して登録します。

![Screenshot 2023-03-21 at 10.46.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951524/fdc0bdd6-f47b-f87d-0f56-75909e741afc.png)

ブログが作成されました。

![Screenshot 2023-03-21 at 10.46.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951524/36b09391-fa0d-6a7a-5947-6f3df369c47c.png)


上記画像の`Blog object(2)`を選択しても、閲覧権限がないため、以下の画面になりました。
![Screenshot 2023-03-21 at 10.48.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951524/76a0f783-cc24-95f9-b9a3-e5d06ac273bd.png)

スーパーユーザーアカウントで再度ログインすると、作成されたブログを確認できました🙆‍♂️
![Screenshot 2023-03-21 at 10.50.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951524/2d7d636a-d138-0fe6-c783-31105e6c0684.png)


## まとめ

Djangoの管理画面は非常に便利な機能ですが、デフォルトではすべてのユーザーに同じ権限が与えられています。
しかし、この記事で紹介した方法を用いることで、ユーザーごとにアクセス権を設定し、権限に応じて表示や編集、アクションを制御することが可能です。
これにより、さまざまな役割を持つユーザーが共同で管理画面を使用する際に、適切なアクセス権限を持たせることができます。
ぜひ、この機能を活用して、よりセキュアで使いやすいDjangoアプリケーションを開発しましょう！
恥ずかしさで口を開けられず、英語を真剣に勉強してもムダだと感じています

　多くのサラリーマンが、将来習得すべきスキルの一つとして「英会話」を挙げ、日本の英語学習者数も年々増加しています。しかし、多くの英語学習者が数年間勉強しても口から英語を話したことはあります。
　この文章では、英語初心者がどのようにすれば話せるかについて紹介します。
　以下のような4つのおすすめの英語学習法があり、英語力を素早く向上させるのに役立ちます。
1.今すぐ話しましょう
　周りのすべてのものを英語で説明することを試してみてください。もし恥ずかしく感じる場合は、自宅で独りで練習することができます。まず周りを観察し、自分がいる場所を英語で説明してみてください。その場所にあるもの、それぞれの大まかな使い方などについて説明してみてください。分からないものがあれば、まず付箋に記し、それぞれのものに貼って反復して練習を行います。いつか自分の家を簡単に英語で紹介できるようになったら、それから他の場所に行って、練習を続けましょう。

2.好きな映画やYouTube動画をシャドーイングする
　シャドーイングとは、英語を聞きながら、聞いた内容を口に出して言う学習方法です。好きな映画や音楽はありますか？人々は「好きな」ものに熱中し、想像以上に努力でき、記憶力ももっとを発揮することができます。
例えば、英語学習アプリのLingoChampのアフレコ機能を使用して、好きな映画の場面を選んで英語を練習することができます。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3295054/28e65fab-98ad-8d94-78c1-c00090b426a5.png)

　もし好きなセリフやフレーズを見つけたら、ぜひシャドーイングを試してみてください。そうすれば、流暢に話すようになれます。

3.他人と会話するのが怖くなら、まずはAIと会話する
　多くの英語学習者が口を開けられないのは、間違えることを恐れたり、恥ずかしいとを感じてしまうからです。その場合は、AIの先生との対話練習を試してみることができます。最新のAI技術では、流暢な会話が可能であり、発音の不足を是正することもできます。
例えば、英語学習アプリLingoChampのAIの先生であるAlixとBellaと一緒に練習します。実際の外国人講師と話すように、いつでもどこでも簡単に対話練習ができます。口を開けることをためらわず、練習の機会を逃すことなく、毎日15分、7日で英語のスピーキング力を向上させることができます。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3295054/90784c4c-0475-fd52-5788-4cd1d61f6ce1.png)


4.同じレベルのパートナーと練習して一緒に上達しましょう
　外国人と話すと恥ずかしいと思い、自分の外国語に引け目を感じてしまう場合は、自分と同じレベルのパートナーを探して一緒に学び、一緒に進歩しましょう。それによって、よりモチベーションが上がります。
　例えば、LingoChampのクラブでは、世界中の言語学習者と一緒に学ぶことができます。リラックスした雰囲気の中で、英語のスピーキング力を向上させることができます。もう人と話すことを恐れる必要はありません。
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3295054/00393e7f-89a0-5d9f-8223-b2f3bd79ac04.png)

まとめ
　恥ずかしさで口を開けられず、英語を真剣に学んでもムダだと思わないで、今から話しましょう！
Service Cloud Voice

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)


# エラー

+ [Contact Center Group edit to update Queues throws component error](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000O9pVg)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4c05773f-58ed-e18e-e2e2-1d1fa6a42be0.png)

:::note
Closing the loop with the known Issue Identification:
https://issues.salesforce.com/issue/a028c00000smIPpAAM
:::

#  "Session expired or invalid","errorCode":"INVALID_SESSION_ID" 

+ [Contact Flow Error in Rest API: "Session expired or invalid","errorCode":"INVALID_SESSION_ID"](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000HCe7Z)

:::note

Salesforce の接続アプリケーションは、Amazon Connect を使用すると自動的に生成されます。しかし、何かが変わらない限り、依然としてそうする必要があります

The connected apps in Salesforce are generated automatically when you use Amazon Connect, that is true.  But, unless something's changed, you do still have to 

1.) set up SSO by enabling Salesforce as an identity provider (https://help.salesforce.com/s/articleView?id=sf.identity_provider_enable.htm&type=5),

2.) generate a self-signed cert (https://help.salesforce.com/s/articleView?id=sf.security_keys_creating.htm&type=5), and 

3.)  extract the private key, which is one of the parameters you need in your lambda OAuth settings in AWS (see the link I provided in my last comment).
:::

# We’re having trouble with call monitoring right now Salesforce Exception

+ [Supervisor barge in feature throws error](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ZBhGC)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ac8f7f4b-5b93-2a91-0fc6-3d6dcc37ca77.png)

:::note
Is your SF user linked to a valid user in AWS? That is the problem we had.

SF ユーザーは AWS の有効なユーザーにリンクされていますか?それが私たちが抱えていた問題です
:::

# "We can't load the transcript" Error on Voice Call Page Load

+ ["We can't load the transcript" Error on Voice Call Page Load](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000C6LqU)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7a6a9bfd-4523-6da1-98e8-62c005935136.png)

:::note
I am getting it. I am needing to have a Amazon Connect Contact flow with a Transcription Lambda in order to initiate the Conversation Body component correctly.

分かりました。会話本文コンポーネントを正しく開始するには、Transcription Lambda を備えた Amazon Connect Contact フローが必要です。
:::



# AWS

+ [AWS Lambda to invoke a Salesforce flow using Amazon Connect Flow and Nice CxOne for Service Cloud Voice (SCV)](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007XIMnS)
Discord音楽Bot 事情とおすすめ

## 音楽Botとは
音楽Botである。

## 最近の事情
Rythm、Groovy、Hydra、GreenBotなど有名な音楽Botが次々とYouTubeによってシャットダウンさせられています。
なぜいまさらYouTubeが動き出したのかは闇の中ですが、音楽Bot界がなかなかな大荒れになってきています。

## まだ生きてるBot一覧

#### Lara
https://discord.com/oauth2/authorize?client_id=944016826751389717&permissions=8&scope=bot%20applications.commands

優秀。YouTubeもサポートしています。

#### FredBoat
https://discord.com/oauth2/authorize?permissions=274881072128&client_id=184405253028970496&guild_id=&scope=bot+applications.commands&response_type=code&redirect_uri=https%3A%2F%2Ffredboat.com%2Flogin-callback&state=%2Fmusic-rooms

定番。YouTubeサポートはありません。

#### Chip
https://discord.com/oauth2/authorize?client_id=614109280508968980&permissions=274914692360&redirect_uri=https%3A%2F%2Fdiscord.com%2Finvite%2FmgxyN7S&response_type=code&scope=applications.commands%20bot%20identify

YouTubeは非対応

#### Uzox
https://discord.com/oauth2/authorize?client_id=760027263046909992&scope=bot&permissions=2146762238

YouTubeは非対応

#### Amelia
https://discord.com/oauth2/authorize?client_id=706346679263035392&permissions=8&scope=bot%20applications.commands

YouTubeは使えます。

#### Lofi Radio
音楽BotではなくラジオBotですが優秀です。
https://discord.com/oauth2/authorize?client_id=830530156048285716&permissions=66440256&scope=bot%20applications.commands

## 自分でホストできるBot
#### Amelia (Discord.js v13)
バージョンが少し古いのが難点。
https://github.com/Julius-Ulee/AmeliaBot-Discord

#### JMusicBot JP (おそらくDiscord4j)
Javaのバージョンは11です。
https://github.com/Cosgy-Dev/JMusicBot-JP

#### Discord-Music-Bot (Discord.js v12)
バージョンが古いのとLavalinkサーバーが必要なのが欠点。
https://github.com/SudhanPlayz/Discord-MusicBot

#### MusicBot (Pycord)
Python 3.8が必要です。
https://github.com/Just-Some-Bots/MusicBot

#### MusicBot (Discord.js v14)
非常に優秀なBot。
https://github.com/umutxyp/MusicBot

## 自分で1から作りたい人へ
個人的にはNode.jsとDiscord.jsで開発するのが一番オススメです。文法的にも比較的簡単ですし、ガイドがしっかり揃っており迷うことが少ないです。

参考:
https://discord.js.org
https://discordjs.guide

## 追記
新しいBotなどがあれば逐次追加する予定です。

では！
多様体の特性類と位相的指数

https://qiita.com/hiro949/items/79ac833035571c39bae0

```math
\newcommand{\N}{\mathbb{N}}
\newcommand{\Z}{\mathbb{Z}}
\newcommand{\R}{\mathbb{R}}
\newcommand{\C}{\mathbb{C}}
\newcommand{\ind}{\mathrm{ind}}
\newcommand{\ch}{\mathrm{ch}}
\newcommand{\Td}{\mathrm{Td}}
```

で定義した位相的指数

```math
\ind_T:K(TM) \rightarrow \Z
```

は特性類を使って表すことができます：

https://qiita.com/hiro949/items/a5b7d54971bee90cd08b

この記事ではそれを導出したいと思います。

# トム類

$n$次元ベクトル束$E \xrightarrow{\pi} M$に対して、ゼロ切断$\sigma_0 \in \Gamma(E)$を用いて

```math
E_0 = E - \sigma_0(M) \subset E
```

とし、$E,E_0$のファイバーを

```math
E_x = \pi^{-1}_E(\{x\}) \\
E_{0,x} = \pi^{-1}_{E_0}(\{x\})
```

と表します。また、包含写像

```math
j_x: (\pi^*{x},\pi^*{x}|_{E_0}) \rightarrow (E,E_0)
```

を考えます。$H_n(E_x,E_{0,x};\Z)$は1次元であり、基本類

```math
\mathfrak{o}_x \in H_n(E_x,E_{0,x};\Z) \simeq \Z
```

が存在して、

```math
\exists h_x \in H^n(E_x,E_{0,x};\Z): \exists h_{Thom} \in H^n(E,E_0;\Z): \\\langle h_x,\mathfrak{o}_x \rangle = 1, \
 h_x = j_x^*(h_{Thom})
```

が成り立ちます。このとき、$h_{Thom} \in H^n(E,E_0;\Z)$をトム類と言います。

# トム同型

トム類$[\omega_{Thom}] \in H^n(E,E_0;\Z)$を用いた同型写像

```math
\psi: H^r(X) \rightarrow H^r(E) \\
\psi([\omega]) = (\pi^*[\omega]) \smile [\omega_{Thom}] = [\pi^*\omega \wedge \omega_{Thom}]
``` 

をトム同型と言います。カップ積$\smile$はより一般的な定義が別にありますが、ドラームコホモロジーに限っては

```math
\xi \in H^p(M) \\
\eta \in H^q(M)
```

に対して

```math
[\xi] \smile [\eta] = [\xi \wedge \eta] \in H^{p+q}(M)
```

です。

# チャーン指標とトッド類

ベクトル束の全空間$E$のチャーン指標

```math
\ch: K(U_\perp) \rightarrow H^*(U_\perp)
```

とK群とコホモロジーのトム同型

```math
\phi_E: K(M) \rightarrow K(E) \\
\psi_E: H^*(M) \rightarrow H^*(E)
```

を用いて

```math
\mu = \psi_E^{-1} \circ \ch \circ \phi_E: K(M) \rightarrow H^*(M)
```

とすれば、

```math
\mu([E]) = \prod_i \left( \frac{1-e^{\lambda_i(E)}}{\lambda_i(E)} \right) \\
= (\Td([E]))^{-1}
```

という関係式が成り立ちます。(微分形式なのに多項式で表されているのは、

https://qiita.com/hiro949/items/a5b7d54971bee90cd08b

で述べたように構造群$G$が行列群である場合を考えていて

曲率$F$が$T_eG$に1-1対応する行列で表されているためです。なお$\lambda_i$は曲率の行列の固有値です。)

# 位相的指数の特性類による表現

位相的指数を構成する際に各写像で写し合うK群はチャーン指標を使ってドラームコホモロジー群に写すことができます。また、コホモロジーのトム同型と

https://qiita.com/hiro949/items/79ac833035571c39bae0

で定義した$h:TM \rightarrow TU_\perp^+$のコホモロジー群に対する引き戻し$\tilde{h}^*$を考えることで、次の図式のように位相的指数をコホモロジー群の写像として書き直すことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445529/51338496-1f63-7809-39dc-a3ec877130f5.png)

ちなみに$J_!$の方の管状近傍(の像)から実空間上へのK群、コホモロジーの写像は同相なので省略しました。

すると、

```math
\ind_T(u) = j_!^{-1} \circ i_!(u) \\
= (-1)^{\dim M} \langle (\ch(u) \smile \Td(TM^\C)), [TM] \rangle 
```

となります。ただし、$TB\otimes_\R \C$は接束$TB$の複素化で(

https://qiita.com/hiro949/items/c5ac1cf91f18888444d3

を参照)、ドラームコホモロジーと特異ホモロジーの内積は

```math
\langle [\omega], [h] \rangle = \int_h \omega
```

で定義されています。

# コメント

詳細はかなり省いています。また数学的に矛盾している点を見落としている可能性もあるので発見した際はご指摘いただけると幸いです。

# 参考資料
- http://www.yo.rim.or.jp/~kenrou/math/index.pdf
- https://arxiv.org/pdf/math/0504555.pdf
- https://www.math.ucla.edu/~jas/writings/atiyah-singer.pdf
Data Mask

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


質問はDE組織などの本番環境でない環境で使いたいらしい、調べてみたけど無理そう。

+ [Trailhead Data Mask - Can't assign permission set issue](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JgaqE)

同じ質問があって、できないと分かって怒っている感じです。

I got this response from Salesforce:

"As per the case description, I understand that you need assistance with Data mask permission set.

In order to use the Data Mask functionality completely, you should have Data Mask permission set licenses available in your org.

They would not be able to assign the permission set license unless you have enough licenses available.

After checking your production org settings, I was not able to find the Data mask user licenses under company information.

I would request you to reach out to your account executive for purchasing licenses:"

It was really not made clear that you had to pay extra to use this feature in any of the Salesforce guidance I read. Now I have wasted my time installing an app I can't use. Not impressed.

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A7lriSAB

ヘルプにも本番環境にインストールするとある

Where:
This change applies to Lightning Experience in Enterprise, Performance, and Unlimited editions. 

How:
Data Mask is a managed package that you install in a production org. You then run the masking process from any sandbox created from the production org. 

[Secure Your Sandbox Data with Salesforce Data Mask](https://help.salesforce.com/s/articleView?id=release-notes.rn_sandboxes_data_mask.htm&release=224&type=5)


はやり有料のライセンスらしい

You are correct, Salesforce Data Mask is a paid offering. You pay 10% of the AOV(annual Order Value). It is not available in the Trailhead orgs....so your options are Contact Salesforce Sales or use the scratch org. 

In case your end goal is to mask your fullcopy/partial copy sandbox, there are other options, including the highly rated DataMasker (100% native AppExchange App). 

I eat, sleep, dream all things data privacy and security for large and complex Salesforce Orgs. Feel free to reach out to me directly at Rahul@CloudCompliance.app

 
+ [Partial の環境を本番環境と同等(データ量以外)のsandboxとして利用したいと考えております。更新頻度をなるべく多く実施したいのですが毎回本番データを取得してしまうことでテスト実施前にデータをマスクする作業がかなり手間になっております。（とくにメールアドレス等）](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Yvgzc)

:::note
有償のツールがあるみたいですが...

Data Mask は英語でのみ使用できます。 と言うのが気になりますね。

Salesforce Data Mask を使用した Sandbox データの保護
https://trailhead.salesforce.com/ja/content/learn/modules/salesforce-data-mask/install-and-configure-salesforce-data-mask
:::
Unity Editorの拡張 Vector3の座標をシーンから変更できるようにする 1/3

# 概要



Editorの拡張を行います。
今回はシーン上で点の座標を変更できるようにします。
下Gifアニメのようなことをできるように目指します。

![Edtior11.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/7abceb95-8037-003b-5472-0d79c93857b9.gif)


# 開発環境
IDE:Rider
Unity:2020.3.42(LTS)
OS:Windows10

# コード
```diff_c_sharp:Waypoint.cs

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

// 座標を定義しているクラス、オブジェクトにアタッチする
public class Waypoint : MonoBehaviour
{
    // Start is called before the first frame update
    [SerializeField] private Vector3[] points;
    public Vector3[] Points => points;
    void Start()
    {
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}
```


```diff_c_sharp:WaypointEditor.cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEngine;

[CustomEditor(typeof(Waypoint))]
public class WaypointEditor : Editor
{
    private Waypoint Waypoint => target as Waypoint;
    private void OnSceneGUI()
    {
        Handles.color = Color.red;
        for (int i = 0; i < Waypoint.Points.Length; i++)
        {
            EditorGUI.BeginChangeCheck();
            
            // シーンのGUI上の座標
            // 例えば、Waypoint.Point[i]=(0,0,0)だとすると、点が原点に密集し変更できない
            Vector3 currentWaypointPoint = Waypoint.Points[i];
            Vector3 newWaypointPoint = Handles.FreeMoveHandle(currentWaypointPoint,
                Quaternion.identity, 0.7f,new Vector3(0.3f,0.3f, 0.3f), Handles.SphereHandleCap);
            
            if (EditorGUI.EndChangeCheck())
            {
                // インスペクター上のベクトルの座標
                Waypoint.Points[i] = newWaypointPoint;
            }
        }
    }
}



```

# 参考

https://docs.unity3d.com/ja/current/ScriptReference/EditorGUI.EndChangeCheck.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/d45ea25e-7f20-1ff1-d080-2c6ef35b6c19.png)



https://docs.unity3d.com/ja/2020.3/ScriptReference/Handles.FreeMoveHandle.html

コミット分

https://github.com/RYA234/2DTowerDeffenceMyLearning/commit/a76918da302aab903168306ef760ecadaea24f8e

Section3.Spawner 7.WaypointEditor
https://www.udemy.com/course/learn-how-to-create-a-2d-tower-defense-game-in-unity-2020/
DefinitelytypedにPullRequestを出した話 + 型がないときの暫定の対処法

# やばい、型がない

ドラッグアンドドロップでリストの並び替えができるJSライブラリのSortableを使って開発をしていた際に、
PulginのOptionの型が存在していないことに気づきました。(つらい)

そもそも本体の最終リリースが1年前で活発にリポジトリが動いてないライブラリだけど、
自分がやりたい要件を満たせるライブラリ現状これしか見つからんしヤバい…
型ないと使えない…こまる…になってしまいひとしきり悶々した結果、

ていうかこれ他の人も困ってるかもしれんし[DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped)にPR出すか...になったときの備忘録です。

# 本記事で説明すること

- DefinitelyTypedで既存のpackageの修正時のPullRequest(以下PR)の出し方
- DefinitelyTypedへ出したPRがマージされるまでの暫定的な対処方法

# 本記事で説明しないこと

- DefinitelyTypedが何か
    - [リポジトリのREADME](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/README.ja.md)が日本語でも公開されているのでそちらを参考にしてください
- DefinitelyTypedに新規でパッケージの型を追加する方法
    - 今回は既にあるパッケージへ型を追加する方法を説明しています。

# 環境

- macOS: 11.7.1
- node: v16.13.0
- npm: v8.1.0
- 対象のpackage: [Sortable](https://github.com/SortableJS/Sortable)

# PRを作成するまでのフロー

## 1 DefinitelyTypedのリポジトリをフォークする

まず自分のリポジトリにDefinitelyTypedをフォークします
フォークはGitHubのリポジトリの右上にあるForkボタンを押して、
Create forkボタンを押せばOKです

## 2 フォークしたリポジトリをcloneする

フォークしたリポジトリをlocalにcloneします
リポジトリが大きいので自分の環境だと3分位かかりました

```tsx
git clone <フォークしたリポジトリ>
```

## 3 npm installを行う

cloneしたリポジトリのディレクトリへ移動し、`npm install`を行って環境構築を行います。

```tsx
cd DefinitelyTyped
npm install
```

## 4. 型定義の編集を行う

変更したいパッケージのディレクトリへ移動し型の修正を粛々と行います。

## 4.1 テストコードを書く

テストコードを書くと該当のパッケージの型定義のオーナーがApproveしたらマージできるようになるので、PRのマージまでの時間が短縮されます。（書けない場合はDefinitelyTyped本体のメンテナのApproveを待つ必要があります）

`${PACKAGE_NAME}-test.ts`が存在しているので、そちらに追加した型に対するコードを書けばOKです。

参考: [DefinitelyTyped/README.ja.md at master · DefinitelyTyped/DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/README.ja.md#パッケージ名-teststs)

## 5. PRを出す

修正とサンプルコードのフォークした自分のDefinitelyTypedのリポジトリにプルリクエストを作成します。

プルリクエストはテンプレートが用意されているので、そちらの記述を確認しながらチェックボックスにチェックをいれればOKです。

あとはApproveを待つだけ

## 6. マージする

マージできる状況になったらbotが教えてくれるので以下のコメントを入力すれば自動的にマージされます

```
Ready to Marge
```

---

# PRが通るまで暫定的に型を定義する方法

ほとんどのPRは1週間以内にマージされますが、

めちゃくちゃ急ぎでパッチを当てたいケースも世の中には存在すると思います。

そういうときは以下の方法で対応可能です。

その場合、コメントで一時しのぎであることも含めて書いてphおくと良いかなと思います

```tsx
/** @NOTE DefinitelyTypedに該当の型が存在しないためパッチ対応 マージされたら削除する */
declare module 'package名' {
追加したい型定義を書く。
}
```

自分は今回、sortablejsの`SortableOptions`という型に `avoidImplicitDeselect`というoptionがなかったため、以下のような記述で暫定的に型を定義しました。

```tsx
/** 
 * @NOTE DefinitelyTypedにavoidImplicitDeselectの型が存在しないためパッチ対応
 * マージされたら削除する 
 */
declare module 'sortablejs' {
  interface SortableOptions {
    avoidImplicitDeselect?: boolean | undefined;
  }
}
```

---

# 所感

大きいリポジトリなのでPRのフローが明確なのとbotが全てのプロセスを教えてくれるので開発体験としてめちゃくちゃ良いなと思いました。
OSSのコントリビュート、ハードルが高いものだとずっと思っていたんですが、意外と気軽にコントリビュートできるなと思ったのでまた機会があったらやってみたいです
【OpenSearch】ECSでIAMロールでアクセス制限したOpenSearchにアクセスする

# はじめに
下記リンク「IAMロールでアクセス制限したOpenSearch(旧: ElasticSearch)にリクエストする」の発展としてECSからリクエストを送るバージョンを紹介します
https://chariosan.com/2021/09/26/curl_aws-sigv4_iamrole_access_opensearch/

また、（【OpenSearch】IMDSv2のEC2でIAMロールを利用してOpenSearchにアクセスする際に注意すること）もぜひ参考までにご覧ください！
# ポイント
・メタデータのIPがEC2とECSでは下記の通り異なる
EC2：169.254.169.254
ECS：169.254.170.2
EC2：https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/instancedata-data-retrieval.html
ECS：https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task-metadata-endpoint-v2.html
・AWS_CONTAINER_CREDENTIALS_RELATIVE_URIという環境変数を利用しよう
# 前提
タスクロール→対象サービスへの必要アクセスを許可
パスワード認証を利用してロールマッピング
jqコマンド必要
curlコマンドは7.~以上が必要
# 実施内容
```
#環境変数設定
CRED=`curl 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`
AWS_ACCESS_KEY_ID=`echo $CRED | jq -r ".AccessKeyId"`
AWS_SECRET_ACCESS_KEY=`echo $CRED | jq -r ".SecretAccessKey"`
AWS_SESSION_TOKEN=`echo $CRED | jq -r ".Token"`
REGION="ap-northeast-1"
SERVICE="es"
#動作確認例
curl -k -XGET  -H "Content-Type: application/json" 'https://<OpenSearchドメイン>/_cat/indices'  -H "X-Amz-Security-Token: ${AWS_SESSION_TOKEN}" \
--aws-sigv4 "aws:amz:${REGION}:${SERVICE}" \
--user "${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}"
```
PHPでのCSVダウンロードするための配列作成




```
    // CSVヘッダー文字列設定
    $csvHeader = 'user_id,userName,prefectures,age';

    // レスポンスヘッダー設定
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename=' . ファイル変数 . '.csv');

    // ファイルダウンロード
    if (($fp = fopen('php://output', 'w')) !== false) {

        // ヘッダー
        $tmp = $csvHeader . '\n';
        fwrite($fp, mb_convert_encoding($tmp, 'SJIS', 'UTF-8'));

        // 日付ごとのID数
        foreach($info as $list){
            $tmp = implode(',', $list) . '\n';
            fwrite($fp, mb_convert_encoding($tmp, 'SJIS', 'UTF-8'));
        }

        fclose($fp);
    }


```

## fopen詳細

https://www.php.net/manual/ja/function.fopen.php

```
fopen('php://output', 'w')
```

'w'は、ファイルを書き込みモードで開くことを示しています。

'php://output'は、下記3点。
・　**標準出力**に**直接出力**を行うことができる。
・　リダイレクトを行わずに、出力をファイルに保存することができる。
・　**出力をバッファリング**することができる。

#### 出力バッファ
PHPにおいて出力されるコンテンツを一時的にメモリ上に保存するための領域のことを指します。

#### 標準出力
標準出力は、プログラムが実行されたコンソール画面などの標準的な出力先に対して出力されるものであり、echo文やprint文、var_dump()関数などで使用されます。標準出力には、stdoutというファイルディスクリプタが割り当てられており、ファイルハンドルとしてphp://stdoutを使用することができます。

#### 直接出力
直接出力は、php://outputなどの出力ストリームに対して直接出力されるものであり、fwrite()関数などで使用されます。直接出力は、出力先を自由に指定することができるため、ファイルやネットワークソケット、その他の出力ストリームに出力することができます。


##  header詳細

```
    header('Content-Type: application/octet-stream');
```

MIMEタイプの設定を行う。
MIMEタイプは、ウェブサイト上で扱うファイルの種類を識別するために使われます。
**application/octet-stream** を使用する場合、ブラウザーは自動的にダウンロードダイアログを表示し、ユーザーがダウンロードを選択することでファイルをダウンロードできます。このため、ファイルダウンロードの際に使用されることが多く、例えば、CSVデータやExcelファイル、PDFファイルなどのダウンロードで使用されることがあります。
<br>

```
 header('Content-Disposition: attachment; filename=' . $info['fileName'] . '.csv');
```

**Content-Disposition** ヘッダーは、サーバーから送信されるデータの処理方法を指示するために使用されます。 **attachment** は、ブラウザーがそのデータを直接表示するのではなく、ダウンロードするように指示するために使用されます。

**filename** パラメーターは、ダウンロードされるファイルの名前を指定します。 $info['fileName'] は、ファイル名の変数で、この例では .csv ファイルをダウンロードすることを意図しています。

このヘッダーを使用することで、ブラウザーは、ファイルを直接表示するのではなく、ユーザーがファイルをダウンロードすることを選択するダウンロードダイアログを表示します。ユーザーは、ダイアログボックスでファイル名と保存先を指定してファイルをダウンロードできます。

このように、 Content-Disposition ヘッダーは、ファイルのダウンロードを制御するための重要なHTTPヘッダーの一つであり、CSVファイルやExcelファイルなど、様々な種類のファイルをダウンロードする場合に使用されます。
【OpenSearch】IMDSv2のEC2でIAMロールを利用してOpenSearchにアクセスする際に注意すること

# はじめに
下記リンクで「IAMロールでアクセス制限したOpenSearch(旧: ElasticSearch)にリクエストする」内容を紹介していますが、こちらはIMDSv1を前提としているかと思います。本記事ではIMDSv2の場合に同様のことを実現する方法を紹介します。
https://chariosan.com/2021/09/26/curl_aws-sigv4_iamrole_access_opensearch/
# 結論
メタデータ情報をトークン付きでリクエストしてください

# 概要
・下記に記載の通りメタデータを取得する際にはトークンが必要になる
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html#instance-metadata-v2-how-it-works
・ロールに関連するメタデータは下記のパスから取得できるが2番目の方のパスを使って取得する→トークン情報は取得できるがエラーが発生するため（もし原因がわかればどなたか教えてください）
```txt:メタデータのパス
/meta-data/identity-credentials/ec2/security-credentials/ec2-instance/
/meta-data/iam/security-credentials/ →こっち
```
```txt:エラー
The request signature we calculated does not match the signature you provided
```
# 前提
タスクロール→対象サービスへの必要アクセスを許可
パスワード認証を利用してロールマッピング
jqコマンド必要
curlコマンドは7.~以上が必要
# 実施内容
```
#環境変数設定
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
ROLE_NAME=`curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/iam/security-credentials/`
CRED=`curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/${ROLE_NAME}/`
AWS_ACCESS_KEY_ID=`echo $CRED | jq -r ".AccessKeyId"`
AWS_SECRET_ACCESS_KEY=`echo $CRED | jq -r ".SecretAccessKey"`
AWS_SESSION_TOKEN=`echo $CRED | jq -r ".Token"`
REGION="ap-northeast-1"
SERVICE="es"
#動作確認例
curl -k -XGET -H "Content-Type: application/json" 'https://<OpenSearchドメイン>/_cat/indices' -H "X-Amz-Security-Token: ${AWS_SESSION_TOKEN}" --aws-sigv4 "aws:amz:${REGION}:${SERVICE}" --user "${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}"
```
デイトラ「Web制作コース」　受講内容をアウトプット 21日目

学んだことをアウトプットしています。完全に自己満足ですので悪しからず。
以下の点を確実にアウトプット
①何で学んでるか
②日々の学習内容
③学びのポイント
④制作物
⑤+αで参考にした記事
⑥+αでやってみたこと

①デイトラ「Web制作コース中級編」　JavaScript・jQuery学習編
②JavaScriptの基本文法①
　・コンソールに出力する文法
　　⇒console.log("");
　　　※文末のｾﾐｺﾛﾝは過去は必須で必要だったが今は特に不要
     ※文字列は'で囲っても良い
　・console.logでの文字列の結合方法
　・計算方法
　・変数
　　⇒let 変数名 = 数値 or　文字列　で定義する
　　　変数をこれまでの出力や計算にもちいることが可能
　　　console.log(変数名)　⇒　変数の出力
　　　変数　* 2 ⇒　で計算可能
　　　変数は更新することも可能
　　　※変数名は英数字で定義するのが慣例。また、小文字が頭文字になるのも慣例。数字頭文字はNG。
　・定数
　　⇒const 定数名 = 数値 or 文字列で定義
　　扱い方法は変数と同じで、定数の更新はできない。
　　基本は定数を使うと良い。
　・文字の埋め込み方法
　　${変数（定数）}で埋め込み可能
　・関数
　　関数の定義方法、引数と返り値について学ぶ
　　引数、返り値は2つ以上定義可能。
　　ｽｺｰﾌﾟの概念を学ぶ
　・条件分岐
　　BooleanとはTrueとFalseのこと
　　if文での条件分岐方法を学ぶ
　　条件を２つ以上追加し、満たさなければならない場合は&&でつなぐ。
　　条件のどれかを満たせばよい場合は、||でつなぐ。
　　else if,elseの使用方法を学ぶ
　　if文の中にif文を入れることができる。
③・jsconsoleでJavaScriptをWEB上で実行できる
④なし
⑤なし
⑥なし
cscの作法 その295

# 概要
cscの作法、調べてみた。
udpを叩いてみた。
練習問題やってみた。

# 練習問題
ブロードキャストで、helloを送信して、返事を受け取る。

# サンプルコード

```
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace ConsoleTest
{
	class Program {
		static void Main(string[] args) {
			UdpClient udp = new UdpClient(50000);
			udp.EnableBroadcast = true;
			while (true)
			{
				Byte[] sendBytes = Encoding.ASCII.GetBytes("hello");
				udp.Send(sendBytes, sendBytes.Length, new IPEndPoint(IPAddress.Broadcast, 49152));
				Console.WriteLine(Encoding.ASCII.GetString(sendBytes));
				IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 0);
				Byte[] receiveBytes = udp.Receive(ref endPoint);
				string returnData = Encoding.ASCII.GetString(receiveBytes);
				Console.WriteLine("recv: " + returnData.ToString());
			}
		}
	}
}

```


以上。