OmniAICreator/Qiita-1.07M huggingface dataset:
PythonでSlackにメッセージを通知(Webhook 機能)

# slackで適当なチャンネルを作成
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/a939549f-72c7-b572-2ead-4d75320e37d9.png)

# slack で Incoming Webhook の設定
slackでIncoming Webhooks の設定をすることで、
Pythonから対象チャンネルに通知を飛ばすことができるようになります。
設定方法
①　Incoming Webhookの設定ページへアクセス
https://my.slack.com/services/new/incoming-webhook/
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/5552f9f8-86dd-a2c6-de9d-d285c4b57b40.png)
先ほど作成したチェンネル"python通知"を選択。
「Incoming Webhook インテグレーションの追加」をクリック
遷移先のページでWebhook URLが発行されるので、メモっておく
一番下までスクロールして、「設定を保存」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/cb0ffbbc-6d3d-49a4-1258-1c04d9241fac.png)

# 方法１　”Requests”というHTTPライブラリを使用
```py
pip install requests
```

```SlackRequests.py
import requests
import json

web_hook_url = 'https://hooks.slack.com/services/先のWebhook URL'

requests.post(web_hook_url, data=json.dumps({
    #メッセージ
    "text" : "Pythonから投稿テスト",
}))

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/8824dc06-8f53-16eb-eaf0-3e8d89d4c700.png)

# 方法2　”slackweb”というライブラリを使用
```py
pip install slackweb
```
```post_slack.py
import slackweb
web_hook_url = 'https://hooks.slack.com/services/先のWebhook URL'
slack = slackweb.Slack(url=web_hook_url)
slack.notify(text="This is a test.")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/f89ef1bd-ebc9-d5fa-f967-18113a8d8bcd.png)

# 方法3　Slack SDKを使用
　以下記事を参照してください。

https://qiita.com/taidong5588/items/0f2ae3dac0bea18ff01d
【Xcode】Build Configurationごとにアプリ名を変更する方法

# Build Configrationとは
projectをクリックして出てくる`Debug`,　'Debug-Staging'等を指す👇
![スクリーンショット 2023-09-13 15.05.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092613/a120d9a0-54a4-0c3b-d3a2-85f9de12a5d3.png)

## アプリ名が変わる原理
Info.plist内の`<key>CFBundleDisplayName</key>`直下の`<string>`句がアプリ名に当たり、これを各Build Configrationに設定する

## Build Configurationごとにアプリ名を変更する方法 
プロジェクトの設定項目 > `Build Settings` Filterは`All|Combined`を開く

検索窓に`Packaging`と入れる

`Info.plist File`の項目を開くと、各Build Configrationに対応する`Info.plist`を選択できるようになっているので、必要な種類の`Info.plist`を作成して割り当てる![スクリーンショット 2023-09-13 15.15.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092613/7470f7cd-06dd-e067-0fe8-6acdca037373.png)

## アプリ名が変わらない場合
### Flutterの場合
ターミナルから`flutter clean`の実行

### iOS Nativeの場合
Clean Build Folderの実行

ご参考になれば幸いです！
conda install tensorflow-datasets のバージョンが古い

https://www.tensorflow.org/tutorials/text/transformer?hl=ja

上のやつを動かそうとしたとき、tensorflow-datasetsがないと動かないのですが、
```bash
conda install tensorflow-datasets
```
でやるとバージョンが古いので失敗します。

なので、
```bash
pip install tensorflow-datasets
```
でやるとうまくいきます。

##### 余談
```
conda uninstall tensorflow-datasets
```
でやってからpipでインストールするとなぜかうまくいきませんでした。
なので、conda環境から作り直しました。
当たり前なのですが、横着してbaseに入れても色々面倒なので、やっぱり新しく仮想環境を作るのが良いですね。


https://www.tensorflow.org/datasets?hl=ja
PlatformIOでUnknownBoard: Unknown board ID 'm5stack-stamps3'が出た場合

PlatformIOでこれが出た時はVSCodeのターミナルで`pio pkg update`を実行してください。プロジェクトの依存関係が古くなってる可能性があります。

### pio pkg updateとは
[pio pkg アップデート — PlatformIO v6.1 ドキュメント](https://docs.platformio.org/en/stable/core/userguide/pkg/cmd_update.html)

プロジェクトの依存関係、PlatformIO Registry、または外部ソースからのカスタム パッケージを更新します。
Unityでエントリーポイントを用意しよう

## はじめに
いきなりですが、Unityにエントリーポイントは存在していません。
たとえば、C言語のmain関数などです。

Unityでは各オブジェクトのAwake関数が先に呼ばれるため、そこで初期化処理を行うことが多いのではないでしょうか？
ですが、複数オブジェクトがある場合Awakeの呼び出し順が制御できないということが発生します。

なので、エントリーポイントに相当するものを、自前で用意していきましょう。

## Awakeのみの場合

```GameManager.cs
using UnityEngine;

public class GameManager : MonoBehaviour
{
    void Awake()
    {
       Debug.Log("最初に呼び出される");
    }
}

```
MonoBehaviourのオブジェクトでエントリーポイントを手軽に作りたい場合は上記のようになります。
きちんとルールを固めれば、これでも問題はないでしょう。

ですが、Awakeの呼び出し順を考える必要があり、少々不安が残ります。

## RuntimeInitializeOnLoadMethodを使用する

```GameManager.cs
using UnityEngine;

public class GameManager
{
    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    private static void OnBeforeSceneLoad()
    {
        Debug.Log("最初に呼び出される");
    }
}

```
RuntimeInitializeOnLoadMethod属性を付けることで、メソッドが呼ばれるタイミングを制御できます。
BeforeSceneLoadを指定すると、Awakeよりも前に実行されます。

しかし、これだと初期化時に必要なプレハブなどのアセットをシリアライズできないので少々不便です。

## シリアライズ可能にする
```GameManager.cs
using UnityEngine;

public class GameManager : MonoBehaviour
{
    public GameObject hogePrefab;

    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    private static void OnBeforeSceneLoad()
    {
        Debug.Log("最初に呼び出される");
    }

    void Awake()
    {
       Debug.Log("OnBeforeSceneLoadの実行後に呼び出される");
    }
}

```

MonoBehaviourを継承することで、必要なアセットやオブジェクトをシリアライズし、参照できます。
また、Awakeなどのイベント関数も使用できます。

## おわりに
これでUnity上でエントリーポイントを用意することができました。
余計な不具合を出さない、また可読性を高めるためにもなるべくRuntimeInitializeOnLoadMethodを使用したほうが良さそうです。

## 参考
https://docs.unity3d.com/ScriptReference/RuntimeInitializeOnLoadMethodAttribute.html
fly.ioにDocker+NextをデプロイしたときにTailwindCSSが効かない件

fly.ioにDocker+NextをデプロイしたときにTailwindCSSが効かないという問題が発生しました。根本的な解決はできなかったのですが一応TailwindCSSが効くという状況にはできたのでその方法を紹介いたします。
NextはAppRouter+TypeScriptを使用しています。

# 結論
CDNを利用するというのが結論です。
具体的には以下のとおり「app/layout.tsx」に追記をしました。
```html
<html lang='en'>
 #追加ここから
  <head>
    <script src='https://cdn.tailwindcss.com'></script>
  </head>
 #追加ここまで
  <body className={inter.className}>
    {children}
  </body>
</html>
```
fly.ioにデプロイしたときにTailwindCSSが効くようになりました。
LaTeXiTで横に見切れる表のサイズを調整する

# 問題

LaTeXiTを使って横に長い表を作ろうとすると、見切れてしまうことがある。
例えば、以下では26まで表示されて欲しいが、24までしか表示されない。
```tex
\begin{tabular}{llllllllllllllllllllllllll}
1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & 13 & 14 & 15 & 16 & 17 & 18 & 19 & 20 & 21 & 22 & 23 & 24 & 25 & 26
\end{tabular}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478399/e4826272-b27c-f890-1eca-d63bd32cf939.png)

# 解決方法
`\resizebox`を使うことで、サイズをいい感じにしてくれる。
プリアンブルに
```tex
\usepackage{graphics}
```
を追加して
```tex
\resizebox{\textwidth}{!}{
  \begin{tabular}{llllllllllllllllllllllllll}
  1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & 13 & 14 & 15 & 16 & 17 & 18 & 19 & 20 & 21 & 22 & 23 & 24 & 25 & 26
  \end{tabular}
}
```
とすると、26まで表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478399/85dcabc0-1b8a-a232-e07e-563bdb70f8a1.png)

# 参考
https://ossyaritoori.hatenablog.com/entry/2018/10/07/Latex_%E8%A1%A8%E7%B5%84%E3%81%BF%E3%81%AE%E3%82%B5%E3%82%A4%E3%82%BA%E3%82%92%E5%BE%AE%E8%AA%BF%E6%95%B4
PythonのImageの扱い（初心者）

# はじめに
現在[CS50’s Introduction to Programming with Python](https://cs50.harvard.edu/python/2022/)に沿ってPythonの学習を進めています。
今回は"Week 6 File I/0"内のProblem Set, "CS50 P-shirt"で必要になったライブラリの使い方を勉強のためにまとめていきます。

# CS50 P-shirt
取り組んでいるProblem Setは[こちら](https://cs50.harvard.edu/python/2022/psets/6/shirt/)になります。
与えられた人形の画像とTシャツの画像を重ね合わせ1つの画像を生成することが課題になります。
画像を利用するためのライブラリとしてPILが挙げられており、必要になるPillowのメソッドをまとめて行きます。

## PIL.Image.open
```python:イメージファイルを開く
PIL.Image.open(fp, mode='r', formats=None)
```
- __fp__ :  開きたい画像ファイルの名前（文字列）、パス（pathlib.Pathオブジェクト）、またはファイルオブジェクト。
- __mode__ : モードです。指定する場合、ここでは必ず"r"という文字列(readの意）。
- __formats__ : 読み込もうとする画像ファイルの形式のリストやタプル。このパラメータを使うと、チェックする形式を絞ることができる。Noneを指定すると、サポートされているすべての形式を試す。サポートされている形式の一覧は、python3 -m PILというコマンドを実行するか、PIL.features.pilinfo()という関数を使って確認できる。
- このメソッドはイメージオブジェクトを返す

## PIL.ImageOps.fit
```python:イメージのリサイズと切り抜き
PIL.ImageOps.fit(image, size, method=Resampling.BICUBIC, bleed=0.0, centering=(0.5, 0.5))
```
- __image__: リサイズと切り抜きをしたい画像
- __size__ : リサイズと切り抜き後の画像のサイズです。幅と高さをピクセル単位で指定。(200, 100)と指定すると、幅200ピクセル、高さ100ピクセルの画像になる。
- __method__ : リサイズするときに使う補間法。補間法とは、画像を拡大や縮小するときに、画素の間の色をどう計算するかという方法。デフォルトでは、BICUBICという補間法が使われる。BICUBICは、画素の周囲16画素（4×4）を考慮して補間。他にも、NEAREST, BILINEAR, LANCZOSなどの補間法がある。
- __bleed__ : 画像の外側から一定の割合だけ切り取ることができる。このパラメータには、0から0.5未満の小数を指定。例えば、0.01と指定すると、画像の外側から1%ずつ切り取られる。デフォルトでは、0となっており、切り取られない。
- __centering__ : 切り抜く位置を調整。このパラメータには、(0.0, 0.0)から(1.0, 1.0)までの範囲の小数の組み合わせを指定。例えば、(0.5, 0.5)と指定すると、中央から切り抜かれる。つまり、幅を切り抜く場合は左右から50%ずつ、高さを切り抜く場合は上下から50%ずつ切り取られる。また、(0.0, 0.0)と指定すると、左上から切り抜かれる。つまり、幅を切り抜く場合は右側から全て、高さを切り抜く場合は下側から全て切り取られる。他にも、(1.0, 0.0)と指定すると、左下から切り抜かれたり、(0.25, 0.75)と指定すると、右上寄りから切り抜かれたりする。
- この関数はイメージオブジェクトを返す

## Image.paste
```python:イメージの貼り付け
Image.paste(im, box=None, mask=None)
```
- __im__ : 貼り付ける画像または色（整数や数値の組み合わせ）
- __box__ : 貼り付ける位置を指定する引数。4つの数値で領域を指定する、2つの数値で左上の座標を指定する、省略するかNoneにするか（左上から貼り付ける）ができる。二番目の引数に画像が指定されていて三番目の引数がない場合は、boxは(0, 0)になり、二番目の引数はマスク画像(貼り付ける部分を制御するための画像）として扱われる。
- __mask__ : マスク画像を指定する引数。Noneの場合は画像が使用されない。
- 貼り付けた画像から生成されたイメージオブジェクトを返す。
注意
画像とマスク貼り付け箇所を指定しなければならないため今回のProblem Setでは下記のような記述になる。(puppet:パペットのイメージオブジェクト、shirt:Tシャツのイメージオブジェクト、貼り付け位置指定無し）
```python:Image.paste
puppet.paste(shirt, shirt)
```

## Image.save
``` python:イメージの保存
Image.save(fp, format=None, **params)
```
- __fp__ : 保存するファイル名（文字列）、パス（pathlib.Pathオブジェクト）、またはファイルオブジェクト。
- __format__ : フォーマットを指定するオプション。省略すると、ファイル名の拡張子からフォーマットを判断。ファイルオブジェクトを使った場合は、必ずこのオプションを使う必要あり。
- __params__ : 書き込みに関する追加の指示を与えるオプション。利用できるオプションは画像形式によって異なる。quality, optimize等。

#　おわりに
``` python 
from PIL import Image, ImageOpt 
```
を忘れないようにしましょう。
認定スクラムマスター(Certified ScrumMaster®（CSM®）)に合格した話

# 概要

認定スクラムマスター(Certified ScrumMaster®（CSM®）)に合格しました。
私の経歴や勉強方法、合格した後の所感を残して、誰かの役に立てれば幸いです。
※ アジャイル,　スクラム開発についての知識はある前提で記載しています。

https://qiita.com/kyawphyonaing/items/8cd30ac818da2c7ce0e0

https://qiita.com/kyawphyonaing/items/8cd30ac818da2c7ce0e0

---

# 私の経歴

* エンジニア歴10年ほど
* プロジェクトリーダー歴3年ほど
* 現場でスクラム開発をしたいが様々な要因によってできていない

---

# スクラムマスターって何をする人？

* スクラムの理論と実践を理解しチーム内外に対してコーティングする
* 開発における障害を取り除き開発チームが円滑に開発できる環境を整える

---

# 認定スクラムマスターってどんな資格?

スクラムマスターの資格として大きく分けて3つほどあります
* CertifiedScrumMaster®（CSM®）
* ProfessionalScrumMaster™
* Registered Scrum Master（RSM）

そのうちのCertifiedScrumMasterはScrum Alliance社の認定資格であり、スクラム関連資格において知名度の高い資格です。
受験言語も日本語と英語が用意されているので受験のハードルは低い
ただし受験費用が16万ほどかかるため、個人で受けるには勇気が必要
私は会社が費用を出してくれたので受験できました

---

# 勉強方法
[SCRUM BOOT CAMP THE BOOK【増補改訂版】 スクラムチームではじめるアジャイル開発](https://www.amazon.co.jp/SCRUM-BOOT-CAMP-BOOK%E3%80%90%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88%E3%80%91-%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%A0%E3%83%81%E3%83%BC%E3%83%A0%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E9%96%8B%E7%99%BA/dp/4798163686/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=&sr=) を2往復ほど読解しました。
スクラム運営で困りそうなことをストーリーにして読ませる感じだったので楽しく勉強できました

また研修の1週間前にScrum Alliance社のスクラムに関する記事を片っ端から一読しました
[アジャイル ビジネス インスティテュート株式会社 - 記事一覧](https://abi-agile.com/new-post/)

---

# 研修

研修は2日間に行われ、座学とワークショップ両方で実施されていきます
ワークショップについては４人体制でチームを組み、プロダクトオーナー、スクラムマスター、デベロッパーの役割を交代しながらゲーム感覚で楽しめる内容でした
オンラインで実施されており [zoom](https://explore.zoom.us/ja/products/meetings/) で顔出しが受験のために必要なので注意
また、研修時には [miro](https://miro.com/ja/) を使用したので少し使い方に慣れておくと便利

---

# 試験

研修終了後、1時間くらいで受験用のURLがメールで送信されてきます
受験にはScrumAllianceのアカウント登録が必要
アカウント登録後すぐに受験することができますが、90日を超えると受験資格を失うので早めの受験がオススメ
また仮に不合格になってしまっても２回目までは無料で再受験できます。3回目から$25ほどかかる

---

# 結果

結果はタイトルにある通り合格です。私は9割ほど正解することができました
試験内容としては研修で受けたことを少し復習すれば問題なく合格できるレベルの難易度でした

---

# 所感

スクラムマスターについて知った時は何をする人なのかよくわからない & プログラムコードなどの明確な成果物もないよくわからない職種のように感じていました。
しかし勉強や研修を進める上でスクラムチーム、特に最近スクラム開発を始める & 始めたいチームにはなくてはならない存在だと思います。
CSMにも上級の資格が存在するので機会があれば受けてみようと思います。
また研修の時にプロダクトオーナーに興味が出てきたので、そちらの資格試験も受けようか考え中...
悩みを解決するアプリ”MeyasuBako”（目安箱）

<h1>本記事について</h1>

スクールの卒業課題で作成しましたオリジナルアプリ、”MeyasuBako”についてご紹介します。

http://meyasubako-app.com/

https://github.com/oguyu2021/organized_brain


![スクリーンショット 2023-09-13 11.55.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468229/47bace57-6030-e447-535d-7dcf10c4d41e.png)

<h1>概要・制作背景</h1>

このアプリは一言で言うと、
日頃の悩みを整理し、相談して解決するアプリです。
まず作成に至った経緯ですが、「悩みを解決する際、同じ悩みを経験した人なら共感してもらえるし、解決する可能性は上がるのでは」と考えたからです。

拘った点としましては、誰でも簡単に使えるシンプルな機能となっています。

<h1>使用方法</h1>

まずはトップページからログインします。
※まだアカウントを作成していない方は新規登録してください。または、新規登録しなくとも、管理者用と閲覧用のゲストログインを用意しています。

![スクリーンショット 2023-09-13 11.56.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468229/02f84d2c-f27a-cc7b-4bf3-e7343ef82889.png)

ログインをすると、投稿の一覧画面が表示され、悩みの新規投稿、詳細、編集、削除、優先度・カテゴリーごとの並び替えを行えます。

![スクリーンショット 2023-09-13 11.59.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468229/824cd17f-4345-676d-2ba8-29ceaba347f2.png)

ちなみに新規投稿でカテゴリー、優先度、公開・非公開の設定ができます。（非公開の状態だと他のユーザーに表示されません）

次に一覧画面下にある、コンテンツ検索についてご説明します。

![スクリーンショット 2023-09-13 12.10.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468229/5e8e060d-2cc6-3d64-d377-965d17e5fad2.png)

ここには調べたいキーワードを入力して右隣の”検索”を押すと、キーワードの同じお悩み投稿をしたユーザーの投稿にヒットします。

![スクリーンショット 2023-09-13 12.12.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468229/17724699-5ab0-b242-e946-a212b47c006d.png)

投稿者のところがリンク表示となっているので、リンクを押すと該当したユーザーとメッセージのやり取りができます。

![スクリーンショット 2023-09-13 12.18.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468229/6189aef1-dac4-f465-bffb-613b2ad87105.png)

またトークを改めて行う際、再度検索してユーザーを表示させるのは面倒なので、一覧画面からトークを継続しているユーザーを”メッセージ一覧”から一覧表示させることができます。

![スクリーンショット 2023-09-13 12.20.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468229/094034f2-f6c4-957c-f8c4-64049f61a55c.png)

<h1>開発環境</h1>

サーバーサイド：Ruby on Rails

フロントサイド：HTML, CSS, Bootstrap

テスト：RSpec

インフラ：AWSEC2

エディタ：VScode

<h1>今後の目標</h1>

インフラ：Docker
フロントサイド：React、Vue.js
バックサイド：各APIの使用
レスポンシブデザイン化（スマホ・タブレット対応）

などに挑戦し、技術力の向上に務めていきたいです。


最後までお読みいただき、ありがとうございました。
controller から template に渡した変数を型補完したい！

# 2行結論

CakePHP は OK
Laravel は blade ディレクティブ使ってると難しい


# CakePHP

vscode で開発していて、テンプレート側でも何とか型補完出来ないかしばらくの間試行錯誤していましたが、 CakePHP ではようやく解決したのでメモ

恥ずかしい話 @var でも変数名を指定できるのを今まで知りませんでした…
言い訳になりますがプロパティ定義時とか変数への代入時とかでしか使ってなかったので


## サンプルコード

index.ctp (v3)、 index.php (v4)

```php
<?php
/**
 * @var \App\Model\Entity\User $user
 */
?>

<!-- User Entity として型補完が効く -->
<?php if ($user->isAdmin()) ?>
    <!-- 省略 -->
<?php endif ?>
```


## 試行錯誤して駄目だった例

このパターンの記述は変数への代入やプロパティ定義でないと駄目なんですね

```php
<?php 
    /** @var \App\Model\Entity\User */
    if ($user->isAdmin()) 
?>
    <!-- 省略 -->
<?php endif ?>
```

```php
<?php
    /** @var \App\Model\Entity\User */
    $user
?>

<?php if ($user->isAdmin()) ?>
    <!-- 省略 -->
<?php endif ?>
```


# Laravel

Laravel では blade ディレクティブに渡される変数などは型補完出来ませんでした
PHPの構文ではないので当然っちゃ当然ですが

## 補完が効かないサンプルコード

```php
{{- <?php でも同様 -}}
@php
/**
 * @var \App\Models\User $user
 */
@endphp

{{– 型補完が効かない –}}
@if ($user->isAdmin())
    {{– 省略 –}}
@endif
```


一応 blade ディレクティブを使用せず CakePHP と同じ書き方なら補完効きましたが…

```php
<?php
/**
 * @var \App\Models\User $user
 */
?>

{{- User モデル として型補完が効くが blade を使う意味を問われる -}}
<?php if ($user->isAdmin()) ?>
    {{– 省略 –}}
<?php endif ?>
```

<br>
<br>

補完してくれる拡張機能も探しましたが見つかりませんでした

PHPStorm だと2017年には対応してますね。うらやましいことです

https://blog.jetbrains.com/phpstorm/2017/02/code-completion-in-laravel-blade-templates/
【AWS】Transit Gatewayを使って閉域網内のオンプレサーバーのインターネット接続について

ドラッグストアシステムのAWSリプレースにおいて、閉域網内でのインターネット通信要件を実現するためにTransit Gatewayを使用した際の設計のポイントや使い方について、以下に記載いたします。

###### ■通信要件の詳細
ドラッグストア様は、AWS移行後の構成として、以下のように設計していますが、
店舗UNO → NTT.comのFlexible InterConnect → private VIF → AWS DirectConnect Gateway → AWS VGW → リプレース後のサーバー（EC2）

店舗UNOに接続されている決済端末は、インターネットへの通信ができる環境が必要という要望がありましたが、当初の設計では閉域網内（専用線）での通信が前提とされており、インターネット接続が含まれていませんでした。

###### ■現状設計の問題点
Private VIFを使用する場合、オンプレミス環境から送信されたインターネット向けのトラフィック（インターネット上のグローバルIPアドレスを宛先IPアドレスとしたパケット）をVGW経由でVPCへルーティングすることは叶いません。
したがって、オンプレミス環境から送信されたインターネット向けのトラフィックを、NATインスタンスまでルーティングすることができないため、NATインスタンスを構築したとしても要件を満たすことは叶いません。

###### ■構成案①
TGW（Transit Gateway）とTransit VIFを使用する方法にて要件を満たすことが可能です。
DXGW（DirectConnect Gateway）とTGWの場合、許可されたプレフィックスにて0.0.0.0/0を設定することで、AWS側からお客様側へ0.0.0.0/0の経路が広報されます。
オンプレミス環境から送信されたインターネット向けのトラフィックをTGW経由でVPCへルーティングし、NAT GatewayまたはNATインスタンス経由でインターネットへルーティングするような設定が可能です。
ただ、元々のPrivate VIFは既に存在しており、それを削除／再作成すると本番環境に影響が及ぶため、新たにTransit VIFとDXGWを作成して対応することにしました。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600067/7b7cdd95-0a43-2f1e-f989-874fe525512a.png)

※通信経路は下記になります。
オンプレミス環境 ---（TransitVIF）--- DXGW --- TGW --- NAT GW（またはNATインスタンス）---IGW --- インターネット

###### ■構成案②
①EC2インスタンス上にVPNサーバ（サードパーティ製のVPNアプライアンス等）兼NATサーバを構築します。
②オンプレミス環境にVPNルータを用意します。
③オンプレミス環境のVPNルータとEC2インスタンス上のVPNサーバのプライベートIPアドレスの間で、VPN接続を確立します。
④オンプレミス環境のネットワークのデフォルトルートを、Direct Connect経由で確立したVPN接続向けに設定します。

オンプレミス端末からインターネット向けのトラフィックは、Direct Connect経由で確立したVPNトンネル内を通り、EC2インスタンス上のVPNサーバに到達します。
EC2インスタンス上のVPNサーバーがSNATを実施した後、トラフィックはインターネット向けに送信される形となります。

※通信経路は下記になります。
オンプレミス端末 --- オンプレミスVPNルータ --- オンプレミスBGPルータ ---（PrivateVIF）---DXGW --- VGW --- EC2 VPNサーバ --- IGW --- インターネット

###### ■まとめ
構成の複雑性や構築・運用・トラブルシューティングの負荷の観点から、Transit VIFを使用した構成がより適していると判断し、最終的に構成案①を採用して進めることにしました。
Google Could Next 2023 キーノートまとめ - build AI 編 -

# Google Could Next 2023 キーノートまとめ

Google Cloud Next 2023 のオープニングキーノートでは、Google Cloudの最新の技術や製品、ビジョンについて多くの発表があった。

初めに、Googleおよび親会社AlphabetのCEP サンダー・ピチャイ氏が登壇し、AIがあらゆる分野、あらゆる業界、あらゆるビジネス機能、そして私たちの生活と働き方を変える大きな変化を生むと語った。

Google検索もまだ発展途上であり、AIを使ったSearch Generative Experience（略してSGE）を使うことで、今後、検索結果の概要を表示してトピックの要点をすばやく理解できるようにしたり、
会話形式で簡単に質問に回答したり、コーディング作業をサポートすることが可能となるそうだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162963/a809a0a3-7dcb-727b-f46b-2aeb08482976.png)

続いて、Google Cloud の CEO トーマス・クリアン氏が登場し、Google Cloud の新サービスを「build AI」、「use AI」、「AI ecosystem」の3軸で発表した。
今回はbuild AI について紹介していく。


## build AI
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162963/40232ee0-62cc-a67d-079e-f76a5cab5831.png)
世界中の顧客と開発者の支援を目的として、AIに最適化されたインフラストラクチャーとAIプラットフォームを使ってAIを作る（build AI）ための、Google Cloudのサービス「Vertex AI」が紹介された。

はじめに、Google Cloud はハイパフォーマンスを提供する優れたエンタープライズインフラストラクチャーだと語り、6つの進化を紹介した。

1. TPU v5e
複雑な AI モデルを低コストでサポート可能なAIプロセッサーのNew Version。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162963/01e92ae9-4d7e-e60a-6850-f8c89b0df297.png)

2. GKE（Goole Kubernetes Engine） Enterprise
こちらは一般提供が開始されており、生産性が45%向上、ソフトウェアの実装時間は70％以上削減されるの述べた。
GPU と TPUによるマルチクラスターの水平スケーリングが可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162963/2d8f7933-5979-ab1b-e6dc-41b97d532e67.png)

3. A3 virtual machines
NVIDIA の最新の H100 高速化 GPU をベースにした A3 仮想マシンの一般提供を発表した。 A3 はA2と比べて 3 倍高速なトレーニングと 2倍のネットワーク帯域幅を提供し、非常に要求の厳しい AI ワークロードで最適だ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162963/fd709f42-b897-9c3f-c77d-f1d384dfa63d.png)

4.　Titanium System
次世代のオフロードアーキテクチャ。これにより、c3vm ブロック ストレージは他のクラウドよりもインスタンスあたり 25% 高い IOPS を実現できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162963/51485472-ec47-9609-722d-52f57006f33f.png)


5.　Google Distributed Cloud の一般提供
独自のデータセンターにインフラストラクチャを必要とする顧客向け。各国の厳格なデータ主権とデータ規制のニーズをサポートする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162963/d353d476-d04a-f609-c709-be05556a42fc.png)

6.　Cross-Cloud Network
すべてのクラウドおよび SaaSにわたって、アプリケーションのセキュアな管理と、高速な接続を可能とする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162963/52f67c29-22b4-6fd9-56f2-437997432437.png)


その後、NVIDIAのCEOのジェンスン・フアン氏が登場し、NVIDIAとGoogleの連携拡大が発表された。
「生成AIはコンピューティングのあらゆるレイヤーと、GoogleとNVIDIA2つの企業に革命をもたらしている」と述べた。続けて、「この最も才能のある2つのコンピューティングチームが力を合わせて生成AIのためのクラウドインフラストラクチャを再構成している」と述べた。

1つめに、AIのトレーニングとデータ処理のために、H100チップから、L4レイヤーまで、プロセッサ、システム、ネットワークやすべてのソフトウェアまでを再構成し、Vertex AI を加速していると話した。

2つめに、NVIDIA の NVIDIA DGX CloudをGoogle Cloud に導入予定だと話した。
NVIDIA DGX Cloud は AIに特化したスーパーコンピューターでGCPに導入されれば、即座に利用可能になる。

3つめは、Vertex AI 、AI モデルとAI ソフトウェア を加速することだと述べた。
GoogleのJaxベースのLLM構築フレームワーク「PaxML」がNVIDIA向けに最適化されるようだ。


# 次回
use AI について紹介する
Diffusion Model のおもしろい技術：DreamBoothについて

DreamBoothとは、対象を特定して画像を生成させる技術です。
まずは下の図のように、対象（犬）の写真を複数枚（色んな角度からの）を用意してモデルに学習させて、
その後はプロンプトによって対象が実際に行ったことがない画像も生成できます。
「getting a haircut」と指定すれば、対象（犬）が髪を切ってるような画像を作れてくれます。
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/d69a0802-aa28-9f95-1264-841f7727e5dc.png)


他にも色々機能があって、例えば下のように対象（犬）と同じ顔になっているパンダ、ライオンの画像など、
こういう複雑なプロンプトを指定しても問題なく生成できます。![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/04bebd04-db4e-169b-78b8-0fe4e28282a0.png)


ネットで探した猫の写真と"猫がバケツにいる"というプロンプトを使って試してみましたが、1枚だけでもかなりきれいな画像ができました。
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/d62cfe12-be95-51d4-a546-e0eb895b774d.jpeg)
![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/45c8ccdf-3873-707b-61b6-363fd47b12a0.jpeg)


興味ある方は下のコードとホームページなどを参考してください。
コード:
https://colab.research.google.com/github/ShivamShrirao/diffusers/blob/main/examples/dreambooth/DreamBooth_Stable_Diffusion.ipynb#scrollTo=wnTMyW41cC1E
ホームページ:
https://dreambooth.github.io/
ApacehのDirectoryディテクティブの設定について

## 環境
Ubuntu20.4 + vagrant
Apache2.4.41

## はじめに

**apache2.conf**の**Directoryディレクティブ**の設定でセキュリティ的な脆弱性を出さないために、どのような設定にするべきかについて書いてみました。

## Directoryディレクティブの見方

apache2.confのデフォルトの設定は次のようになっています。

```/etc/apache2/apache2.conf
<Directory />
	Require all denied 
</Directory>

<Directory /usr/share>
	Require all granted
</Directory>

<Directory /var/www/>
	Require all granted
</Directory>
```

**Require all**の設定で、**denied**は拒否、**granted**は許可の意味となります。

Derectoryデレクティブは上位の設定よりも下位の設定の方が優先になります。一番上の設定でルートを拒否しています。すると、ルート配下の全てのファイルが拒否されてしまうのかといえば、そういったことではありません。下位の方で、/var/wwwを許可にすると、/var/wwwへのアクセスだけが可能になります。一般的なファイヤーウォールの設定の考え方とは逆になります。

## 設定方法について１

デフォルトの設定のままで、/usr/shareと/var/wwwの直下にindex.htmlを置くと、両方が有効になります。/usr/share側は使わないのであれば、こちらの設定は、デフォルトのままで置いておくのではなく、deniedにしておいた方がセキュリティ的にはいいでしょう。

```/etc/apache2/apache2.conf
<Directory /usr/share>
	Require all denied
</Directory>
```

ルートをgrantedにした場合、index.htmlはどこのディレクトリに配置しても動いてしまうことになります。このような設定は基本的にはありえません。

```/etc/apache2/apache2.conf
<Directory />
	Require all granted
</Directory>
```

/var/wwwがApacheの事実上のルートとなります。このディレクトリ配下に、複数のindex.htmlを配置したい場合は、次のようにするといいかと思います。

```/etc/apache2/apache2.conf
<Directory /var/www/hoge1/>
	Require all granted
</Directory>

<Directory /var/www/hoge2/>
	Require all granted
</Directory>
```
つぎのような設定にしても、子ディレクトリにある、hoge1、hoge2は両方とも有効になります。hoge3といった子ディレクトリを後から新規作成した場合、apache2.confの設定は触ることなく有効となりますので注意が必要です。セキュリティ的にはざっくりし過ぎた設定になっているといえるかと思います。

```/etc/apache2/apache2.conf
<Directory /var/www/>
	Require all granted
</Directory>
```

先ほどの説明で、下位にある設定の方が有効になるといいました。つぎのような設定にすると、hoge1、hoge2は共に無効になってしまいます。hoge1、hoge2を有効にしても、親ディレクトリの/var/wwwを無効にしてしまえば、hoge1、hoge2ともに無効になるということです。

```
<Directory /var/www/hoge1/>
	Require all granted
</Directory>

<Directory /var/www/hoge2/>
	Require all granted
</Directory>

<Directory /var/www/>
	Require all denied
</Directory>
```

つぎのように順番を入れ替えれば、hoge1、hoge2はともに有効になります。

```
<Directory /var/www/>
	Require all denied
</Directory>

<Directory /var/www/hoge1/>
	Require all granted
</Directory>

<Directory /var/www/hoge2/>
	Require all granted
</Directory>
```

## 設定方法について２

Directoryディテクティブは、apache2.confに記述しないといけないといった決まりはありません。apache2.confを極力汚したくないのであれば、**/etc/apache2/sites-available**配下に自作のconfファイルを作成して、そこに記述しても有効になります。しかし、そこに作成した場合は、つぎのコマンドを実行して、**/etc/apache2/sites-enabled**にシンボリックリンクを作成する必要があります。実際に参照されるディレクトリは、sites-availableではなく、sites-enabledの方だからです。

```
#sudo a2ensite hoge.conf
```

## 最後に

confファイルを修正したら、Apacheデーモンを再起動して設定を有効にします。

```
#systemctl restart apache2.service
```
ssh-keygen

IBM Cloudで生成したssh keyはopenssh形式であり、
teratemやsshコマンドでそのまま利用できますが、
winscpで利用したい時、一度ssh-keygenコマンドでpem形式に変換してから、putty形式に変換する必要そうです。

- コマンド Converting openssh private key format to pem
ssh-keygen -p -f /private_ssh_key_file_name/ -m pem

- Ref.
https://gist.github.com/artizirk/71d7ae140c58f38e45d84d34f7fcc341
Caused by: org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration$ArtifactResolveException: Could not resolve all files for configuration ':app:debugRuntimeClasspath'. の解決方法


## 解決策


`settings.gradle` に

```settings.gradle
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        maven { url 'https://jitpack.io' }
    }
}
```

と　`maven { url 'https://jitpack.io' }` を追加する。

この際に
`Unexpected tokens (use ';' to separate expressions on the `
と出る場合は、

```settings.gradle
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        maven { url = uri("https://jitpack.io") }
    }
}
```

とする。
Unity：スクリプト上からTextMeshProを変更する

# はじめに
UnityでTextMeshProを作成するとき
3D Object→Text TextMeshPro
UI→Text TextMeshPro
の二種類あって、スクリプト上から色を変更したいときの方法がそれぞれ違うっぽいのでメモ。
サンプルコードはTextMeshProのオブジェクトにアタッチして使うやつ。


# 3D Objectから作成したものにアタッチする時のコード
```Example.cs
using TMPro;
using UnityEngine;

public class Example : MonoBehaviour
{
    void Start()
    {
        //コンポ取得
        TextMeshPro textmeshPro = GetComponent<TextMeshPro>();

        // 現在のカラーを取得
        Color currentColor = textmeshPro.color;

        // 新しいアルファ値を設定
        currentColor.a = 0.5f; // 例として0.5fに設定

        // 設定した新しいカラーを適用
        textmeshPro.color = currentColor;
    }
```

# UIから作成したものにアタッチする時のコード
```Example2.cs
using TMPro;
using UnityEngine;

public class Example2 : MonoBehaviour
{
    private void Start()
    {
        // コンポ取得
        TextMeshProUGUI textMeshPro = GetComponent<TextMeshProUGUI>();

        // 現在のカラーを取得
        Color currentColor = textMeshPro.color;

        // 新しいアルファ値を設定
        currentColor.a = 0.5f; // 例として0.5fに設定

        // 設定した新しいカラーを適用
        textMeshPro.color = currentColor;
    }

}
```

# まとめ

「3D Object」から作ったTextMeshProは
```
GetComponent<TextMeshPro>();
```
「UI」から作ったTextMeshProは
```
GetComponent<TextMeshProUGUI>();
```

ってことみたい。
Privacy Nutrition Label とは？

## Privacy Nutrition Label とは？
```Privacy Nutrition Label```は、アプリによるデータの使用方法についてユーザーに最大限の透明性を提供するように設計されたAppleデバイスの機能です。
*Appleの継続的なプライバシー中心の進化の一環として、2020年にiOS14.3とともに導入されました。*


アプリ開発者は、アプリに使用しているサードパーティパートナーのデータ収集と扱い方に関するすべての情報を開示する必要があります。
この情報は、```Privacy Nutrition Label```に表示され、ユーザーは各アプリのApp Storeページでアクセスできます。

:::note info
名前が示すように、```Privacy Nutrition Label（プライバシー栄養ラベル）```は、包装された食品に見られる「**栄養成分表示ラベル**」のようにデザインされています。
このアイデアは、栄養表示が特定の製品に含まれる内容を素早く正確に把握するのと同じように、ユーザーが自分のデータがどのように使用され、その理由を正確に把握できるようになります。
![Labels.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82835/ac147022-9c81-adbc-a61d-46af43eece92.png)
:::


## Privacy Nutrition Labelのカテゴリとは？
以下の３つの```Privacy Nutrition Label カテゴリ```があります。
* ユーザーの[トラッキング](https://developer.apple.com/jp/app-store/app-privacy-details/#user-tracking)に使用されるデータ（Data Used to Track You）
* ユーザーに関連付けられたデータ（Data Linked to You）
* ユーザーに関連付けられないデータ（Data Not Linked to You）

ユーザーがApp Storeで表示すると、これらの各カテゴリには、開発者によって事前定義されたラベルが入力されています。
***これらのラベルは、以下のものです。***
[連絡先情報、ヘルスケア／フィットネス、財務情報、位置情報、機密情報、連絡先、ユーザーコンテンツ、閲覧履歴、検索履歴、ID、購入、使用状況データ、診断、その他のデータ](https://developer.apple.com/jp/app-store/app-privacy-details/#data-type)

App Storeに提出時、アプリが上記のデータをどのように使用するかを正確かつ包括的にApp Store Connectで回答を選択する必要があります。

![Categories.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82835/80eac860-42ee-365e-6fb5-72e6fdf3747e.png)


**iOS17以降**、開発者がこれを簡単に行うことを目的とした一連の新機能が追加されています。
この新機能は、***サードパーティSDKの署名***と***プライバシーマニフェスト***が含まれており、すべてのデータの収集および使用目的に関する詳細情報が記載されます。

プライバシーマニフェストは、透明性と全体的な「ソフトウェアサプライチェーンの安全性」を高めるためのAppleの最新の取り組みです。

:::note info
Appleには、一般的な用途を明確にするために参照できる[**使用目的と定義**](https://developer.apple.com/jp/app-store/app-privacy-details/#data-type-usage)のリストがあります。
:::


## Privacy Nutrition Label を作成するには？
App Store Connectで公開する準備の際、アプリが収集するデータに関する一連の質問が表示されます。この回答内容で```Privacy Nutrition Label```が作成されます。なお、回答には、サードパーティが収集したすべてのデータも含まれている必要があることに注意してください。

:::note warn
[**開示が任意となるデータタイプ**](https://developer.apple.com/jp/app-store/app-privacy-details/#optional-disclosure)がいくつかあることに注意してください。つまり、すべての基準が満たされている場合は報告する必要はありません。
:::
ロボットアーム製品についてのメモ

ロボットアームのに関するちょうさメモ

# UFACTORY

公式サイト: https://www.ufactory.cc/
公式shop：https://www.ufactory.cc/products/
ダウンロードサイト：https://www.ufactory.cc/download/
Github：https://github.com/xArm-Developer

## 記事

- [ロボットアームを使ってみよう2 xArmStudio/Python](https://note.com/codelight/n/n90d9720e409c)
- 


### Lite 6

#### IO

- Endefector 

電圧：24V

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/6887ec45-6a34-1d6e-b984-a2ee397a4b64.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/756a3ab1-e7c5-2c8e-2820-11bbd4a9816b.png)

- base
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/33fc6aa2-a492-3687-d41d-1d9e1fdc4acb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/c60155c6-a991-fc1a-d57b-8f63e0a7c02e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/ce45bb1c-4f71-2dea-2219-3662d3a99565.png)
正四角錐の体積の公式「2023 福島大学 後期 食農学類【1】」をChatGPTとWolframAlphaとsympyでやってみたい。

**・ChatGPT-3.5先生「おっしゃる通り、......計算が誤っているためです。」？？？**
　**どなたか、解説をお願いします。**

オリジナル 

https://kamelink.com/blog/2023/09/12/9-6-23-hukusimadai-kou-syokunou-1-1/

上と同じです。大学入試数学問題集成 様＞食農学類【1】 テキスト

https://mathexamtest.web.fc2.com/2023/202310141/2023101410200mj.html#top-0211

# ChatGPT-3.5先生へ(間違っています。しかし、出されたsympyは、正しいです.)
入力文
```
辺の長さが全て 1 の四角すいの体積 V を求めなさい．
```
？？？＞したがって、辺の長さがすべて1の四角すいの体積は約0.866です。
```
無理数でお願いします。
```
？？？＞辺の長さが全て1の四角すいの体積は無理数です。正確な値は√2 / 3 です。
```
sympyでお願いします
```
(sympyのソース)ありがとうございました。
私は、ページ後半でpycharmで実行して確認しました。
私は、さらに、調子に乗って
```
実行して下さい。
```
＞私の環境ではコードを直接実行できないため、代わりにコードを提供しました。ただし、...

```
最初計算の　正確な値√2 / 3 と　sympyの結果√2 / 6  結果が違う原因を教えて下さい
```
**＞おっしゃる通り、......計算が誤っているためです。**

# WolframAlphaで

https://ja.wolframalpha.com/input?i=%E6%AD%A3%E5%9B%9B%E8%A7%92%E9%8C%90%E3%81%AE%E4%BD%93%E7%A9%8D

# sympyで(ChatGPT-3.5先生に教えてもらったソースコードで)
もちろん以下の　SymPy Live　Shell　で実行できました。
```python
from sympy import sqrt, Rational

# 辺の長さ
a = 1
b = 1
h = sqrt(2) / 2  # 斜辺の長さ

# 体積を計算
volume = Rational(1, 3) * a * b * h

print(volume)
```
結果
```
sqrt(2)/6
```

# sympyで(数学入試問題 様の方法を参考に)
高さAHを求めましょう．
```python
from sympy import *
a = 1
(BD,CE)=(sqrt(2),sqrt(2))
AB=a
BH=BD/2
AH=sqrt(AB**2-BH**2) 
volume = Rational(1, 3) * a **2 * AH
print("#",BD,CE)
print("#",AH)
print("#",volume)
# sqrt(2) sqrt(2)
# sqrt(2)/2
# sqrt(2)/6
```

# sympyで(いつものスタイルで?)ちょっと違う気もします。
~~**？？？subsを2回やっています。いい方法がありますか？？？**~~
コメントで教えてもらいました。ありがとうございます。
積分関数を思い出す、DOCを調べる必要がなくてイイですね。
ChatGPTで-3.5先生。ありがとうございます。
```python
from sympy import *
var('a,h',real=True)
mySubs1={h:sqrt(a**2-(a*sqrt(2)/2)**2)}
mySubs2={a:1}
V=Rational(1, 3) * a **2  * h
print("#",V)
print("#",V.subs(mySubs1).subs(mySubs2))
# a**2*h/3
# sqrt(2)/6
```
# sympyの実行環境
①私の環境は,pycharmです。
②よく聞くのは、Jupyterです。
③web上で、上記のソースを「SymPy Live shell」に、コピー貼り付けでもできました。
黒背景の右上に、マウスを移動すると、コピーマークが発生します。
???　タブレット環境で、コピー貼り付けが実行できませんでした。???

https://live.sympy.org/

# 参考

以下、いつもの?おすすめです。

https://qiita.com/mrrclb48z/items/75904cdc6e84ecef4d03#%E5%8F%82%E8%80%83wolframalpha-%E9%96%8B%E7%99%BA%E7%89%A9%E8%AA%9E
ChatGPTにエンジニアやプログラマー向けの名言を作ってもらった

ChatGPTにオリジナルの名言を作ってもらった。もしかしたら、何番煎じかもしれないけど調べるのがめんどくさいのでやめました。作ってもらった名言には本当のものもあるのかもしれない。そのへんはAIがやることなので私にはわかりません！

以下適当に羅列します。似てるのもありますが適当に楽しんでください。

- コードは未来のための足跡であり、過去の知識を未来へ継承する手段だ。
- エラーは挫折ではなく、学びの機会だ。最高のエンジニアは常に新しいことを学び、成長し続ける。
- プログラムは詩のようなもの。美しさと効率性のバランスを追求しよう。
- 問題を解決するためにコードを書くとき、まず人間の心を理解することから始めよう。
- コードは私たちの思考を形にする魔法のステッキだ。ただし、魔法使いは常に責任を持たねばならない。
- プログラミングは創造性と論理の美の融合であり、私たちはその芸術家である。
- 最良のコードは自己説明的であり、コメントなしでも理解できる。
- コードを書くときは、未来の自分や他の開発者に優しさを忘れずに。
- コードが動き出す瞬間、魔法のような喜びが生まれる。
- プログラムを書くことは、新しい世界を生み出す冒険だ。
- エラーを解決するプロセスこそが、私たちが成長し、進化する瞬間だ。
- 新しいプロジェクトを始めるとき、未知の未来にワクワクしないエンジニアはいない。
- コードは私たちのアイデアとインスピレーションの実現であり、それに挑戦することは喜びそのものだ。
- 問題に直面するたび、新たなソリューションの発見が、エンジニアの心を躍らせる。
- プログラムは私たちの未来を創る道具であり、その過程は楽しみながら進めよう。
- エンジニアリングの世界は無限の可能性が広がっており、その可能性に胸を膨らませよう。
- エラーは私たちの最良の先生であり、最も厳しい試験官でもある。
- プログラミングは永遠の戦い。コードが動いている間、新しいバグが待ち構えている。
- 完璧なコードは存在しない。ただし、常に完璧を目指すことはエンジニアの宿命だ。
- テストは全てのバグを見つけるわけではなく、見逃したバグが最も痛いものとなる。
- プログラマーは、自分が書いたコードが故障する瞬間に、謙虚さを学びます。
- 最も危険なのは、自信過剰なコード。必ずしも動くわけではない。
- プログラミングの深淵に飛び込むと、時折、自分がどれだけ無力かを思い知らされます。
- ソフトウェアのプロジェクトは、予想以上に時間がかかり、予算を超えることがよくあります。
- 新たなアイデアがコードになる瞬間、未来への扉が開く。
- プログラミングは魔法のようなもの。私たちは魔法使いであり、コンピュータが私たちの杖だ。
- テクノロジーは現実を変える力を持っている。エンジニアはその変革を牽引する役割を果たすのだ。
- コードは私たちの創造性のキャンバスであり、無限の可能性を描く道具だ。
- 新しいプロジェクトは未知の冒険だ。未知の土地を探索する気分で臨もう。
- プログラミングの世界には常に新たな課題と解決策が待っている。それが私たちをワクワクさせる。
- エンジニアリングはイノベーションの源であり、未来への道を切り開くコンパスだ。
- 技術は私たちの力を増幅し、夢を現実にする魔法の鍵だ。
【ChatGPT（Web版）】が日本語化します。


　どうも、カーブミラーです。

　今回は、ニュースです。まだ試験運用中のようですが、ChatGPT（Web版）が日本語化します。

:::note info
本記事は、ChatGPT（Web版）で
確認しました。　　アプリ版は、
日本語化していません。あしからず。
:::

　ログインしたら、
　　日本語でメッセージが
「あなたの言語でChatGPTの早期プレビューを体験してみてください」と
　　　表示されるので、
　　　「アルファに参加する」を
　　　　　OKするだけです。

　プロンプトのサンプルが
　　日本語になったり、
　　　メニューが日本語になったり。

　Custom instructionsが
　　カスタム指示になったりw
***
　これは
　　OpenAIが日本を
　　　重要視しているから？

　日本人ユーザーを
　　さらに獲得したいから？

　しかし、
　　これ、誰もツイートすら
　　　していないのは、なぜ？
　　　　（2023/09/13 08:30現在）

　リリースノートには
　　書かれていませんでしたよ。
***
　どうやら、これ、
　　ブラウザごとに
　　　表示されるみたい。

　はい、実験しました。
　　アカウントを変えても
　　　残っていましたので、
　　　　こりゃ、ブラウザかな？と。

　つまり、
　　Cookieなのでしょう。
***
　ちなみに、
　　アプリ版の方は、
　　　変化なしです。

　どちらかというと、
　　アプリ版こそ、
　　　日本語化すべきだと
　　　　思うのですが。

　まぁ、
　　実験の最中
　　　ということなのでしょうね。

　今回は、
　　ここまで。
***
　同日。追加情報。

　ChatGPT（Web版）の
　　日本語化ですが、
　　　設定の（アルファ）のところで
　　　　言語を変更可能です。
【Laravel】artisanコマンドはアプリケーションのルートディレクトリでしか使えない。

# はじめに
開発途中では気にもしなかったが、Dockerに上げた際にきちんと動いているかな～と、logなどをCUIを使って確認していく中でartisanコマンド叩いてみたら思わぬところで躓いたので書きます。

# 原因
CUI使っていろんなディレクトリを移動していく中で、Laravelのルートディレクトリにいないのにartisanコマンドを打っていたからでした。

# 解決策
artisanコマンドは、Laravelのルートディレクトリにいないと機能しないそうです。
理由はartisanコマンドは様々なタスクを実行するために使用されるため、Laravelプロジェクト内のリソース、設定、データベース、ルートなどにアクセスするためのコンテキストが必要です。プロジェクトのルートディレクトリで実行されることを前提としており、そこから必要な情報にアクセスできるようになっているからとのこと。
[GitHub] PRを閉じる際に対応するIssueもクローズする

# やりたいこと
- GitHubフローを回してるときに、以下のようなことを考えた
  - 「ひとつのIssueに対してひとつのPRが対応するのなら」
  - **「PRを閉じたときに、対応するIssueも閉じればお得では？」**

# 方法
- PRの最初の説明文に以下のようなキーワードを含める

```
close {issue id}
```

- （`close`のほかにもいろいろバリエーションはあるけど、結果は同じ？っぽい）

# 試してみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883146/5e2eafab-e7fd-2941-2224-49dc89115fb3.png)

テスト用のIssueを作成して...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883146/32a56949-cf6a-11cb-5f7b-b6680732653d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883146/dd19ca04-be35-3b4b-d967-07e379b9319c.png)

Issueに対応するブランチを切り...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883146/daaef8a7-9f9d-74df-eafa-adfc91b6a85d.png)

適当にりどみに更新をかけ、PRを作成してみました
ここでメッセージ文を`close #1`としておきます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883146/7f74640e-74da-ead3-31b9-dda11171b76c.png)

プルリクを作成し、マージして...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883146/87be0474-451a-0ec3-654c-1250ad50983f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883146/eba050e7-10d8-2c7d-2af8-bebfaad5efc6.png)

IssueのClosedを見てみると...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883146/ca9c3008-75f1-1412-d0ac-7531afac3150.png)


おー！！！！！！
勝手に閉じてる！！！！！！！！！！！！！！！！！！！１１

# おわりに
明日から使えるライフハックです。ぜひ
Databricksの行フィルターを試してみる

結構心待ちにしていた機能です。

https://qiita.com/taka_yayoi/items/8ec6ec967d6d9fdae0e6

これまでもダイナミックビューで同様のことは実現できていましたが、テーブルに対するビューを定義するので若干取り回しが大変だったのですが、テーブルにフィルターをアタッチする形になるのでフィルターの再利用もしやすくなります。

こちらでは行フィルター(row filter)を試します。

# 準備

事前に`DS`というグループを作成しておき、ユーザーAのみを追加しておきます。

対象のテーブルは`target`とします。以下のように`pickup_zip`などの郵便番号が含まれているテーブルです。ちなみにこちらはNYのタクシーの乗降記録です。
![Screenshot 2023-09-13 at 10.56.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d36e13bc-a4e5-3ee4-ce0e-7d73e97960a1.png)

Sharedクラスターを作成して起動します。シングルユーザークラスターでは本機能は動作しません。

# ユーザーAの作業

```sql
USE main.default;
```

行フィルターの関数を定義します。このフィルターは、テーブルにアクセスするユーザーがグループ`DS`に所属している場合には前レコードを返却しますが、そうではない場合にはzipコードが`10153`のレコードのみを返却します。

```sql
CREATE FUNCTION zip_filter(zip STRING)
RETURN IF(IS_ACCOUNT_GROUP_MEMBER('DS'), true, zip='10153');
```

カタログエクスプローラで関数を確認することができます。
![Screenshot 2023-09-13 at 10.57.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/71ba5575-a30a-6368-bbbb-20d292d6565a.png)

テーブルにフィルターを適用します。

```sql
ALTER TABLE target SET ROW FILTER zip_filter ON (pickup_zip);
```

なお、フィルター適用されているかどうかを確認するにはテーブルに`DESCRIBE EXTENDED`を実行します。

```sql
DESCRIBE EXTENDED target;
```

`Row filter`にどのテーブルのどの列にどのフィルターが適用されているのかが表示されます。
![Screenshot 2023-09-13 at 11.07.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d9f1f86b-47e8-7671-1311-d0630de691d9.png)

テーブル`target`にクエリーを発行するとすべてのレコードが返却されます。
![Screenshot 2023-09-13 at 11.11.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/275b8337-60a2-edb9-6ade-f2ec06f3f2cb.png)


# ユーザーBの作業

ユーザーBはグループ`DS`には属していません。

```sql
SELECT * FROM target;
```

行フィルターが動作して、`pickup_zip`が`10153`のレコードしか返却されなくなっています。
![Screenshot 2023-09-13 at 10.56.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/41822e48-f051-cdc9-d004-99cd73107a07.png)

次は列マスク(column mask)を試してみます。

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
タイムスタンプから時間帯区分の列を作成する(SPSS Modeler データ加工逆引き1-13)

# タイムスタンプから時間帯区分の列を作成する

![スクリーンショット 2023-09-06 9.12.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ee1f4f79-fead-f077-0371-6aebeef157f7.png)

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

・時間帯別の統計量の確認
・時間帯別の需要予測ための前処理

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/raw/main/time_divison.str

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

![スクリーンショット 2023-09-06 9.14.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/33235771-11cb-56f8-616e-50e8ceaf149d.png)

a.対象にするデータは以下の通りです。
![スクリーンショット 2023-09-06 9.15.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d62e8acf-2c44-acb7-c7d9-88c8ff9c6039.png)

#### 名義型で定義する

b.[フィールド作成]ノードを編集します。[派生：]を　[名義型]にして時間帯を定義します。
![スクリーンショット 2023-09-06 9.15.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6f8e6310-680d-47e6-41ba-2d94af88ded2.png)

#### If-Thenの式で定義する

c.[フィールド作成]ノードを編集します。[派生：]を　[CLEM式]にして時間帯を定義します。
![スクリーンショット 2023-09-06 9.16.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/27ec1d87-6240-04f2-f01b-292132114c35.png)

```python:CLEM式

if datetime_hour(E_TS)  >= 4 and datetime_hour(E_TS)   <  8 then "早朝" 
elseif datetime_hour(E_TS)  >= 8 and datetime_hour(E_TS)   <  12 then "午前"
elseif datetime_hour(E_TS)  >= 12 and datetime_hour(E_TS)   <  15 then "午後"
elseif datetime_hour(E_TS)  >= 15 and datetime_hour(E_TS)   <  18 then "夕刻"
elseif datetime_hour(E_TS)  >= 18 and datetime_hour(E_TS)   <  22 then "夜"
else "深夜" endif 

```

[プレビュー]します。

![スクリーンショット 2023-09-06 9.17.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/48480767-1558-6e58-1be3-5ebfa35bac2f.png)



#### 注意事項

名義型での区分作成は、該当がないとデフォルト値になります。

## 4.参考情報

#### 値を任意の閾値でランクに分割する

https://qiita.com/416nishimaki/items/0742e7ad71cf563a6ebf

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

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

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

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
Apple SiliconのMacで、RustでC++コードを使う

タイトルそのままの記事。

# 結論

link-cplusplusを使え。

# 動機
C++コードを経由してロボット用ミドルウェアやロボット用じゃないミドルウェアと連携したかったから。

# この記事を書く動機

libcを使ってリンクする記事が多かったんだけど、それだと
```shell
  = note: Undefined symbols for architecture arm64:
            "std::__1::locale::use_facet(std::__1::locale::id&) const", referenced from:
                std::__1::ctype<char> const& std::__1::use_facet[abi:v15006]<std::__1::ctype<char>>(std::__1::locale const&) in libnerikiri2_value.a(value.o)
以下略
```
みたいなエラーが出てくるので。

# やることの流れ
1. c++のコード (.hと.cpp) を用意する
1. build.rsでコンパイル方法を記述する
1. Cargo.tomlを編集する
    1. build.rsを設定する。
    1. link-cplusplusをdependenciesに加える。
    1. ccをbuild-dependenciesに加える。
1. main.rsから使う。


# 空のプロジェクトを作る
```shell
$  cargo new hello_cpp_rs
```


# C++のコードを用意

## src/hello_cpp/include/hello_cpp/hello.h
```cpp
#pragma once

#ifdef __cplusplus
extern "C" {
#endif

  void hello();
#ifdef __cplusplus

}
#endif
```

## src/hello_cpp/src/hello.cpp
```cpp
#include <iostream>
#include <string>

#include "hello_cpp/hello.h"

void hello(){
  std::cout << "Hello, C++!" << std::endl;
}
```

# build.rsを用意

```rust
extern crate cc;

fn main(){
    println!("cargo:rustc-link-search=native=/usr/local/lib");
    cc::Build::new()
        .cpp(true)
        .warnings(true)
        .flag("-std=c++17")
        .flag("-Wall")
        .flag("-Wextra")
        .flag("-v")
        .flag("-g")
        .file("src/hello_cpp/src/hello.cpp")
        .include("src/hello_cpp/include")
        .compile("libhello_cpp.a");
}
```
.cppをtrueにしておけば-lc++などはいらない


# Cargo.tomlを編集

```toml
[package]
name = "hello_cpp_rs"
version = "0.1.0"
edition = "2021"
build = "build.rs"

[dependencies]
link-cplusplus = "1.0"

[build-dependencies]
cc = { version = "1.0", features = ["parallel"] }
```


# src/main.rsから使う

```rust
extern crate link_cplusplus;

#[link(name = "hello_cpp", kind = "static")]
extern "C" {
  fn hello();
}

fn main() {
  unsafe{
    hello();
  }
}
```

# まとめ
これだけです。cargo runでHello, C++!とでれば成功。



# 参考
https://qiita.com/legokichi/items/27f10811b266918ec56c

https://docs.rs/link-cplusplus/latest/link_cplusplus/
Dockerを起動させたら「Bind for 0.0.0.0:8080 failed: port is already allocated」

Hi, there！今回は簡単なTipsだよ。

さっきAWS内のEC2インスタンスでDockerコンテナを立ち上げたら、

```log
[SAmmys@MyInstance]$ docker-compose up -d

Error response from daemon: driver failed programming external connectivity on endpoint operation (4d238a89bc8c8e9728b854f7fcfbadc176f59234aafa870f7264bfb48970d040): 
Bind for 0.0.0.0:8080 failed: port is already allocated
```

というエラーが出たよ。どうやら、直前にインスタンスが落ちちゃったときの残骸がインスタンスの再起動後も残っちゃって、それが悪さしちゃった感じだね。

最近出たAmazon Linux 2023って旧の Amazon Linux 2 と違って、障害発生時にインスタンスを再起動させると、直前まで動いてたプロセスも復元しようしてくれるんだ。
今回、たまたまそれが裏目に出ちゃった、って感じだね。

実際上記のトラブルは、一旦コンテナを落としてから

```
[SAmmys@MyInstance]$ sudo systemctl restart docker.service
```

でdockerサービス自体を再起動させてから再度compose upさせればOKだよ。

開発機だから今まで何度もインスタンス落としたりしてたけど、今回初めてこんな事象に当たったよ。だから出現頻度としてはレアな方なのかも。

ということで、備忘録レベルの簡単なTipsでした～！
IAM ポリシーって Google アカウントが削除されたらどうなる？

こんにちは、京セラコミュニケーションシステム 石関 (@kccs_daisuke-ishizeki)です。

ある日 Google Cloud の IAM ポリシーに関する以下のような質問をいただきました。

> 会社のアカウントって Google Workspace で管理されているので、Google Cloud プロジェクトの IAM から削除されてもGoogleアカウント自体は存在していますが、Google アカウント自体が削除されたら連動してこの辺りの IAM も削除されるんでしょうか。
> それとも存在しないユーザとして設定自体は残り続けるんでしょうか

🤔
経験則的に削除されていそうな気はするものの、正確な内容はわからないので、ドキュメントベースで調査 & 実験してみました。
この記事ではその内容を紹介します。

:::note warn
本記事は2023年8月ごろに作成しております。引用している内容は執筆時点での最新となります。
:::

## この記事の対象者

- Google アカウント削除時の IAM ポリシーへの影響を知りたい方

## ドキュメントを確認してみる

まずは Google Cloud 公式ドキュメントを確認してみます。

関連しそうな箇所を抜粋しました。

> ユーザー アカウントを既存の ID プロバイダと連携させると、ユーザー アカウントのステータスを同期できます。ID プロバイダからユーザー アカウントを削除すると、Cloud Identity のユーザー ID も削除されます。また、許可ポリシーにより、**ユーザーは Google Cloud リソースにアクセスできなくなります**。

> ユーザーが組織を離れたときに、自動ユーザー プロビジョニングによって Cloud Identity または Google Workspace を ID プロバイダと連携している場合は、**アクセス権の取り消しを自動的に行う**ことができます。

対象のユーザーアカウントはアクセスできなくなるとありますが、IAM ポリシー設定が削除されるのかイマイチはっきりしません。

参照したドキュメントはこちらです。

https://cloud.google.com/docs/security/data-loss-prevention/revoking-user-access?hl=ja#bps-setting-up

視点をちょっと変えて Google Workspace 公式ドキュメントを確認してみます。

[紛らわしいページ](https://support.google.com/a/answer/9468554?hl=ja)も Hit して多少混乱しましたが、別ページに以下の記載を見つけることができました。

> Google Cloud - 削除されたユーザーは Cloud リソースにアクセスできなくなります。そのユーザーに対する Identity and Access Management（IAM）ポリシーの拘束力は、関連付けられたリソースで**最長 30 日間継続**します。ユーザーが Cloud 組織のメンバーでない場合、プロジェクトは孤立状態になります。

最長 30 日間 IAM ポリシーの拘束力が継続され、期間経過後は**拘束力がなくなる**と記述されています。

明示的に削除されるとは記述されていませんが、『拘束力がなくなる = 対象の IAM ポリシーが削除される』と解釈しました。

参照したドキュメントはこちらです。

[組織からユーザーを削除する - Google Workspace 管理者 ヘルプ](https://support.google.com/a/answer/33314?hl=ja)

## 実験

ということで実験してみました。

1. Google アカウントを作成して
2. IAM ポリシーを設定して
![iam_policy_attach.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728315/1c3ec8d5-2448-3ddd-6067-56e25c27d360.png)![iam_policy_before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728315/9ddd1b40-f7fb-7472-4108-d8cc13f7b869.png)
3. Google アカウントを削除する
![google_account_delete.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728315/000d4b59-891b-0387-6742-5c89b6d6ec9b.png)
4. Google アカウント削除直後のプロジェクトの IAM です。
   - IAM ポリシー自体は残っていますが、以下の変化がありました。
     - 対象のプリンシパルに赤線部分の uid が表示されるようになった（一部マスクしています）
     ![iam_policy_after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728315/3f8f12b9-701f-5e84-f7dd-39492cc36b3e.png)
     - タイプのカラムにあるアイコンに斜線が入り、ツールチップを表示すると「削除されたユーザー」となっていました
     ![iam_policy_after2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728315/b336a503-306d-f19b-23b4-eb803f60d74e.png)
5. 20 日経過
   - 予想に反して 4 の状況のまま変化はありませんでした。Google アカウントは削除したあと 20 日経過後に完全削除されるためこのタイミングかなと思っていました。
     ![iam_policy_after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728315/3f8f12b9-701f-5e84-f7dd-39492cc36b3e.png)
6. 30 日経過
   - 削除されました。この実験では最長の 30 日間 IAM ポリシーが継続しました。
     ![iam_policy_after3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728315/8afdc553-322c-5762-1b97-9fc48503153a.png)

## 結論

Google アカウントが削除されたら、連動して一定期間経過後 IAM ポリシーも削除される。
Validation Rules > Implement Best Practices


[Validation Rules > Implement Best Practices](https://trailhead.salesforce.com/content/learn/modules/validation-rules/implement-best-practices)


# We can’t find that the validation rule implements ISNEW.

+ [Validation Rule : Implement Best Practices](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007I5Bs1)

正しい数式でもこのエラーになります。２つのプレイグランドで試しましたが、同じです。


isNewを指定しないと、以下のエラーになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8d032712-cd29-a145-f34b-8811af0d840b.png)

```
AND(
OR(
ISNEW(),
ISCHANGED(Email),
ISCHANGED(Phone)
),
ISBLANK(Email),
ISBLANK(Phone)
)
```

+ [Validation Rules project error](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007IdUQF)

:::note
We have verified this in your org and see that your org has duplicate matching rules in it. Hence it isn't able to insert a lead and the check assumes something is wrong with the validation rule. We have deactivated the duplicate rule on Lead and were able to pass the challenge with your validation rule successfully. Please find the attached screenshot that confirms the same.

織でこれを確認したところ、組織内に重複した一致ルールが存在することがわかりました。したがって、リードを挿入できず、チェックでは検証ルールに何か問題があると想定されます。 Lead の重複ルールを無効化し、検証ルールによるチャレンジに正常に合格することができました。同じことを確認する添付のスクリーンショットを見つけてください。
:::


# We were able to change a Closed case status to Working without the Bypass_Case_Validation_Rules permission

+ [We were able to change a Closed case status to Working without the Bypass_Case_Validation_Rules permission](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007I5cj1)

:::note
Seems like the bypassing is working even without the Bypass_Case_Validation_Rules permission as well. It should let the user update Closed Case only IF they have the custom permission assigned and not otherwise. 

Bypass_Case_Validation_Rules 権限がなくてもバイパスが機能しているようです。ユーザーはカスタム権限が割り当てられている場合にのみクローズケースを更新でき、それ以外の場合は更新できません。
:::

# We were unable to change a Closed case status to Working with the Bypass_Case_Validation_Rules permission.

+ [We were unable to change a Closed case status to Working with the Bypass_Case_Validation_Rules permission.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ep15fSAA)

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

+ [Validation Rule Help](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007I7emN)

```
AND(
NOT(ISBLANK(EngineeringReqNumber__c)),
NOT(ISNUMBER(EngineeringReqNumber__c))
)
```

+ [We were unable to insert a Case with a numeric value Engineering Req Number.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007UvG7t)
+ [Having trouble with this challenge -Create a Case validation rule that requires the Engineering Req Number field to be numeric.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007LUS0ESAX)
XcodeでSwift Package Managerが利用できない

環境
MacOS:12.6.8
XCode:14.2

XcodeのFile->Add Packageを選択。追加画面が出てくる。
SQLSwiftのgitを検索してAdd Packageを押す。
その後、通常であれば追加するpackageの選択画面が出るが、
Failed to resolveとなり、追加ができない。
ログを確認するとInvalid Manifestと記録されており
sdkのframeworkで大量に上がってくる。
この状態でもビルドは出来るし、Importも出来てそう。

Swift Package Managerの設定を色々調べてみるが解消せず。
結局Xcodeを再インストールすることで解決しました。
Gitのアカウント登録が中途半端になってたのだろうか？原因は不明のままでした。