OmniAICreator/Qiita-1.07M huggingface dataset:
茶色ですが黄Diffの問題を解けました。

今回、Difficultyが<font color="C0C000">2248</font>の[ABC033 D](https://atcoder.jp/contests/abc033/tasks/abc033_d)を解けました。三角形の種類の判定の問題です。

## コード

``` cpp
#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#include <stdio.h>
using namespace std;

int main() {
  int n, a1 = 0, a2 = 0, a3 = 0;
  scanf("%d", &n);
  int x[2000], y[2000];
  for (int i = 0; i < n; i++)
    scanf("%d %d", &x[i], &y[i]);
  for (int i = 0; i < n - 2; i++)
    for (int j = i + 1; j < n - 1; j++)
      for (int k = j + 1; k < n; k++) {
        int p = x[i] + x[j] + x[k];
        int q = y[i] + y[j] + y[k];
        long long m1 = x[i] * (2 * x[i] - p) + y[i] * (2 * y[i] - q) + x[j] * x[k] + y[j] * y[k];
        long long m2 = x[j] * (2 * x[j] - p) + y[j] * (2 * y[j] - q) + x[k] * x[i] + y[k] * y[i];
        long long m3 = x[k] * (2 * x[k] - p) + y[k] * (2 * y[k] - q) + x[i] * x[j] + y[i] * y[j];
        int s1 = 0, s2 = 0, s3 = 0;
        if (m1 > 0) s1 = 1;
        if (m1 < 0) s1 = -1;
        if (m2 > 0) s2 = 1;
        if (m2 < 0) s2 = -1;
        if (m3 > 0) s3 = 1;
        if (m3 < 0) s3 = -1;
        int s = s1 * s2 * s3;
        if (s > 0) a1++;
        else if (s == 0) a2++;
        else a3++;
      }
  printf("%d %d %d\n", a1, a2, a3);
}
```

最初の3行は高速化するやつです。（よくわからん）調べました。入力を高速化するためscanfを使いました。三角形を全て調べて、それぞれについてどの三角形か判定しました。
解説には、O(N^3)では部分点しか取れないと書いてありましたが、通りました。
Connection could not be established with host mailhog :stream_socket_client(): php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known

テストメールを確認するためにMainhogを使用しましたが、

Connection could not be established with host mailhog :stream_socket_client(): php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known

上記のエラーが発生しました。

結論として、.envファイルを
MAIL_HOST=mailhog > MAIL_HOST=localhost
に変更したらうまくいきました。
　
原因はよくわかりません。
ちなみに、ローカル環境で開発しています。
Vue２でマークダウン記法をHTMLに動的に変換

# Vue２でマークダウン記法をHTMLに動的に変換



## ■マークダウンのパーサーを導入

今回は、以下の理由でmarkedではなく、markdown-it導入した。

- 拡張性が高い
- セキュリティ面を考慮

```bash
npm install markdown-it --save
```



## ■Vue

MarkdownItをインポートしたら、すぐに使える。

renderの他にも、メソッドが用意されている（調べてみてください）

```vue
</template>	
	<p v-html="convertMarkdownToHtml(markdown)"></p>
</template>

<script>
import MarkdownIt from 'markdown-it';

export default {
  methods: {
      convertMarkdownToHtml(markdown) {
          return new MarkdownIt().render(markdown);
      },
  }
};
</script>
```
React チェックボックス実装時に uncontrolled input が出た時の対処

## チェックボックス実装時に uncontrolled input のwarnig が出た
チェックボックスをクリックすると下記の warnig が出た

```
component is changing an uncontrolled input to be controlled. This is likely caused by the value changing from undefined to a defined value, which should not happen. Decide between using a controlled or uncontrolled input element for the lifetime of the component. 
```

## 対象コード
```
 <input
    type='checkbox'
    id={companyId}
    checked={isChecked(companyId)}
    onChange={() => onChangeHandler(companyId)}
/>
```
## 調査

エラー内容をそのままググる。

https://blog.mitsuruog.info/2017/09/react-uncontrolled-input

上記記事などを参考に、State の値が、nullかundefinedになってしまうタイミングがないように state へ初期値をもたせたりしたがNGだった。

少し抽象化すると state null か undefined が入ることがNGなのではなく、input の value へ falsy な値が入ることが問題なのでは、と仮説が出てきた。

## 修正
```
 <input
    type='checkbox'
    id={companyId}
    checked={isChecked(companyId) || false}
    onChange={() => onChangeHandler(companyId)}
/>
```

falsy な値が入らないようにした。

## 感想
- 正直これが正解なのかわからない
- input text のエラーに関しての記事は多くあったが、checkbox に関しての記事を見つけることができず苦労した。
Chromebook使用に当たって

# Chromebookを使用するに当たって行ったことの備忘録
## 1. Chromebookバージョンアップ
届いたPCのバージョンが古いため、最初にやることはChromebookのバージョンアップ

[購入したChromebook](https://support.hp.com/jp-ja/product/hp-chromebook-14c-ca0000-x360-series/32708653/model/34370336/product-info "HP Chromebook")

## 2. Linux開発環境を有効化
開発環境を揃えるため、Linux環境を有効化する

[Linux開発環境の有効化](https://support.google.com/chromebook/answer/9145439?b=hatch-signed-mp-v7keys&visit_id=638185828841205267-591207698&p=chromebook_linuxapps&rd=1 "Linux開発環境の有効化")
その後、ターミナルにて更新を実施
~~~:コマンド
$ sudo apt update
$ sudo apt upgrade -y
~~~


## 3. 各種ツールのインストール・設定
* [Visual Studio Codeのインストール](https://code.visualstudio.com/blogs/2020/12/03/chromebook-get-started "VS Codeインストール")
* GitHubの設定
* [Dockerのインストール・設定](https://docs.docker.com/engine/install/debian/ "Dockerのインストール")
【Swift】数値の各桁の和を計算する方法

```swift
let n = 1234
let sum = String(n).reduce(0) { $0 + Int(String($1))! }
print(sum) // 1,2,3,4の合計 = 10
```
## 解説
数値nを文字列に型変換し、`reduce`で合計を計算する。
```swift
let sum = String(n).reduce(0) { $0 + Int(String($1))! }
```
`$1`には文字列の各文字が、`$0`にはその時点での合計値が入る。
`$1`には`1,2,3,4`がそれぞれ`String.Element`型で入ってくるため、一度`String`に変換した後`Int`に変換している。
Excel VBA（マクロ）でセルの内容を声を変えて読上げ -その２-読上げ内容を音声ファイルに保存

# __Excel VBA（マクロ）でセルの内容を読上げ-その2__

前回に引き続き、Excel VBA（マクロ）で、セルの内容を読上げる方法について書いていきます。
前回は、Haruka以外の声で読上げる方法についてでした。
[Excel VBA（マクロ）でセルの内容を声を変えて読上げ -その1](https://qiita.com/tom-sobue/items/aac051de117a45f9fecf)

動画に埋め込むには、音声ファイルへの書き出しが必要ですので、今回はファイルへの書き出しについてです。

## __読上げ先をファイルにする__
通常は、スピーカーへ向かって読上げるので、これをファイルに出力します。

~~~~diff_VBA
    '声を入れるためのオブジェクト変数
    Dim HarukaVoice, AyumiVoice, SayakaVoice, IchiroVoice, ZirVoice As Object
    'SpeechAPIのSpVoiceおよびSpObjectTokenCategoryの変数
    Dim sapi, cat As Object
    'SpeechAPIのSpFileStreamの変数
    Dim stream AsObject

Sub 録音()
    'File名の変数
    Dim fName As Variant

    'SpeechAPI設定
    Set sapi = CreateObject("SAPI.SpVoice")
    '録音用設定
    Set stream = CreateObject("SAPI.SpFileStream")

    '話し手の設定
    Call voice_object

    'File名設定 デスクトップに「読上げ.wav」で保存
    fName = Environ("UserProfile") & "¥デスクトップ¥読上げ.wav"
    '保存用にファイルを上書きで開く
    stream.Open fName, 3
    '録音先設定
    Set sapi.AudioOutputStream = stream

    '読み手　一郎
    Set sapi.Voice = IchiroVoice
    '現在地の内容を読上げ
    sapi.Speak ActiveCell

    '完了したらファイルを閉じる
    stream.Close
    '録音オブジェクトを解放
    Set stream = Nothing
    'SAPIを解放
    Set sapi = Nothing
End Sub
~~~~

「voice_object」をCallしてますが、前回で記述したPrivate Sub です。
ファイル名設定で、「Environ("UserProfile")」の部分は、Windows環境変数を使うという指示で
「C:¥users¥ユーザー名」が得られます。

## __名前を付けて保存にする__
マクロを修正したり、保存されたファイルを後で移動したりするのは面倒なので、
名前を付けて保存します。

~~~~diff_VBA
Sub 録音()
    'File名の変数
    Dim fName As Variant
    '日付用変数
    Dim today As Date

    'SpeechAPI設定
    Set sapi = CreateObject("SAPI.SpVoice")
    '録音用設定
    Set stream = CreateObject("SAPI.SpFileStream")

    '話し手の設定
    Call voice_object

    '今日
    today = Date
    'ファイル名をyyyymmdd.wavに設定
    fName = Year(today) & Right("0" & Month(today), 2) & Right("0" & Day(today), 2) _
     & ".wav"
    
    '保存先名をダイアログボックスを開いて設定
    fName = Application.GetSaveAsFilename(fName, "音声,*.wav")
    'キャンセルの場合は、終了
    If fName = False Then Exit Sub
    '保存用にファイルを上書きで開く
    stream.Open fName, 3
    '録音先設定
    Set sapi.AudioOutputStream = stream

    '読み手　一郎
    Set sapi.Voice = IchiroVoice
    '現在地の内容を読上げ
    sapi.Speak ActiveCell

    '完了したらファイルを閉じる
    stream.Close
    '録音オブジェクトを解放
    Set stream = Nothing
    'SAPIを解放
    Set sapi = Nothing
End Sub
~~~~

ファイル名は、初期値で今日の日付を「yyyymmdd」で示すことにしています。
初期値のファイル名は、「yyyymmdd.wav」になります。
その後、名前を付けて保存のダイアログボックスを開いて、設定できるようにします。
それが、

    fName = Application.GetSaveAsFilename(fName, "音声,*.wav")

の部分です。
「Application.GetSaveAsFilename()」で、名前を付けて保存のダイアログボックスが開きます。
（）内のfNameが初期値のyyyymmdd.wavで、ダイアログボックスの結果が左のfNameに入ります。
（）内の"音声,*.wav"は、ダイアログボックスで表示するファイルを絞る目的です。

名前を付けて保存のダイアログボックスで、キャンセルが押されると、fNameに「False」が返ってきますので、録音そのものを止めて、終了します。

[その３-スピード、ピッチ（声の音程）、強調の指示方法-へ続く](https://qiita.com/tom-sobue/items/3e02e7569cfbe8a90f12)
Fnction components cannot be given refs. Attempts to access this ref will fail. Did you mean to use React.forwardRef()? が出た 

## 調査
どこでエラーが出力されているのかをコンソールから読み取る。

## 間違えたこと

- ref でエラーが出ていると思って useRef の使用箇所を調査して fowardRef へ書き換えようとした。
    - そのまま間違った解釈でエラーを修正しようとして、ドツボにはまる
    - useRef を使用しているコンポーネントを不使用にしてみるが、エラーが消えない（そりゃそうだ）
    - エラー分を読み直して、解釈の間違いに気付く

## 解決方法
関数を`<Link>`で囲む場合は、fowardRef を使用する必要がある。

[参考記事](https://qiita.com/tak001/items/fb44aefba5d90745d39e)

そもそも今回は、必要がなかったので削除して完了。

## 反省
- 思い込みで突っ走って解決までの時間がかかった。
- エラー詳細まで読むことをしていなかった。
- 何故か解決できるという根拠の無い自信があった。

## 改善
- 自信を持つことはいいが、過信とは別であることを認識する。
- ちゃんと文字を読むこと、読んでも全ては理解できていないということを前提としてエラーに対処する。
Linux 系シェルのコマンドを ChatGPT を使って PowerShell のコマンドに変換する

ChatGPT を使うと Linux 系シェルのコマンドを PowerShell のコマンドに変換するのがとても楽でしたので紹介します。
タイトルは ChatGPT にフォーカスしていますが、元ネタの記事自体がすごく有益なので、ぜひ元ネタの記事を読んでいただければと思います。

## やりたかったこと

`#` がついたブランチ名にシェル上で素早く `git checkout` したい。（ `git switch` 使えよという話は今回は無しでお願いします）

私が現在やっているプロジェクトではブランチ名の先頭に `#チケット番号` のように Redmine のチケット番号を `#` 始まりで記載する必要があります。

これが結構曲者でして、 `#` 始まりだと PowerShell 上ではコメント扱いとなります。なので `git checkout '#11111_hoge'` のように `'` や `"` などでブランチ名を囲ってあげる必要があります。
`'` や `"` などでブランチ名を囲って書こうとすると、今度は Tab キーによるブランチ名の補完が効きません。英単語ならまだしも、チケット番号のように意味のない数字の羅列の手打ちはキツイです。
なので私はマウスでコピペしていました。でもマウスを使っても作業効率は納得いくレベルにはなりませんでした。そもそもマウス無しで操作したくてシェルを使っているので、本末転倒です。

## 解決方法

こちらの Qiita の記事を参考にさせてもらいました。

https://qiita.com/sin_tanaka/items/ca0fdd899e40a1d6716b

fzf というファジーファインダを使いインタラクティブにブランチを切り替えるという手法です。素晴らしいですね！
`#` 始まりのブランチを fzf 経由にした場合、 `''` で囲まなくて良くなるかどうかは謎ですが試してみる価値はありそうです。

さて、記事内で紹介されているコマンドは bash などの Linux 系シェルのコマンドになっています。私の今の開発環境は Windows で、 PowerShell を使っています。そして、 PowerShell のコマンドはほとんど知りません…。 `xargs` の代わりのコマンドを調べるのも面倒くさいです。

ここでやっと ChatGPT に登場してもらいます。
記事で紹介されていたコマンドをぶっこんで、変換してもらいます。

![Git Branch Selection. - Google Chrome 2023-04-21 0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960076/f7dc86f2-8c86-82e9-8c0f-a6954127de31.png)

そして、コマンドをコピペして PowerShell 上で動作させてみたところ意図通りの動作をしていました！もっと効率の良いやり方があるかもしれませんが、とりあえず動けばいいってときはこれで十分です。

あとは自分の好みに fzf の出力をいじって `$PROFILE` にでもコマンド登録してあげれば完成です。

```
# git checkout を fzf を使って行うためのコマンド
function gio($cmdname) {
  git branch | Out-String -Stream | fzf --height 10% --layout=reverse --info=inline | ForEach-Object { $_.Trim() } | ForEach-Object { git checkout $_ }
}
```

`gio` というコマンドで実行できるようにしました。（O は checkOut の Out の部分から取りました。センス無いですがタイプしやすさ重視でこうしました。）これで `#` はじまりのブランチ名も怖くありません。

![2023-05-02 09.20.59.png ‎- フォト 2023.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960076/01c35061-e1c8-c754-0ed4-23dd67dcf548.png)

ChatGPT ありがとう！
KotlinでHelloWorldプログラムを実装してみた

# 概要
KotlinでHelloWorldプログラムを実装してみました。
以下のページを参考にしました。
https://www.tohoho-web.com/ex/kotlin.html#install

# Kotlinをインストール（Ubuntu 22.04 LTS）
```
$ curl -s https://get.sdkman.io | bash
$ source ~/.sdkman/bin/sdkman-init.sh
$ sdk install kotlin
$ sdk install java
$ kotlinc -version
info: kotlinc-jvm 1.8.20 (JRE 17.0.7+7)
```

# HelloWorldプログラムを実装
```hello.kt
fun main() {
    println("Hello, World!")
}
```

# コンパイル＆実行
```
$ kotlinc hello.kt -include-runtime -d hello.jar
$ java -jar hello.jar 
Hello, World!
```

できました。何かの役に立てばと。
LINQ小技メモ

## 概要
LINQで使える小技を忘れない為のチートシート

### foreachでIndexを扱いたい場合のSelect

- 匿名クラスを使用
```C#:Select+foreach
List<string> aryString = new List<string>() { "Test1", "Test2", "Test3" };

foreach(var indexString in aryString.Select((text,index) => new { Text = text, Index = index }))
{
    Console.WriteLine($"Index = {indexString.Index}, Text = {indexString.Text}");
}
```

```TeX:Result
Index = 0, Text = Test1
Index = 1, Text = Test2
Index = 2, Text = Test3
```


- ValueTupleを使用
```C#:Select+foreach
List<string> aryString = new List<string>() { "Test1", "Test2", "Test3" };

foreach(var (text,index) in aryString.Select((text,index) => (text, index)))
{
    Console.WriteLine($"Index = {index}, Text = {text}");
}
```

```TeX:Result
Index = 0, Text = Test1
Index = 1, Text = Test2
Index = 2, Text = Test3
```
Rich text field

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


-------------------
+ [リッチテキストのまとめ](https://qiita.com/Keiji_otsubo/items/05b73385391cdddd0545)

+ [リッチテキスト内に動的レポートへ遷移するリンクを作成したい](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000PkE0ISAV)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7fdb27fe-9f2e-85f4-49c7-58c8efb0240b.png)

:::note
リッチテキストへ「{!$~}」のような形でレコード情報を組み込むことはできないと思います。
カスタムリンクを使用すると可能かと思います
:::

+ [is it possible to render html code in rich text area field](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007CuN8e)

:::note
NOTE We recommend using the toolbar to format your content. The rich text editor provides only a WYSIWYG interface. You can’t edit HTML tags. When you copy content from a web page or another source and paste it into the editor, unsupported tags are removed. Text enclosed in unsupported tags is preserved as plain text. HTML markup counts against the character limit of the field. For more information, see [Rich Text Area Field Limitations.](https://help.salesforce.com/s/articleView?id=sf.fields_rich_text_area_limitations.htm&language=en_US&type=5)

https://help.salesforce.com/s/articleView?id=sf.fields_using_rich_text_area.htm&type=5
:::

+ [「リッチテキストエリアに画像が含まれている場合」という判定がしたい](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007HB05o)

:::note
以下のように　Matcherを使って画像のタグが含まれているかを確認すれば可能みたいです。

Matcher imgMatcher = Pattern.compile( ‘<img(.+?)>’ ).matcher(url);

https://debarunsengupta.medium.com/apex-code-to-display-image-from-a-rich-text-area-field-in-salesforce-63272dc4cce
:::


+ [Re-size image on rich text area field](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T4GCF)

:::note
I also faced the same issue, After much brainstorming and research I found the solution for this problem.

Solution:

1. Create a new field of datatype "Text Area(Long)".
2. Write a Record-Triggered Flow or Apex Trigger to get Html from Rich Text field and Stamp the same Html to New Field by replacing '<img' with '<img style="max-width: 100%;" '
3. Use this New field instead of rich text field.
:::
Tera Termを用いたEC2へのSSH接続時に「認証に失敗しました。再試行してください」と表示されて失敗する

Amazon Linux 2023が2023年3月15日にリリースされました。

これに伴い、Winsdows環境で利用しているTera Termからのssh接続に失敗する場合があります。
Amazon Linux 2023 は Amazon Linux 2と異なり、デフォルトで SSH の ssh-rsa 署名が無効になっています。これに伴い、**接続元のクライアント側は、rsa-sha2-256、rsa-sha2-512プロトコルやed25519 キーを使用した ssh-ed25519**を利用する必要があります。

Tera Termでは 5.0 beta 1 バージョンから、rsa-sha2-256 および rsa-sha2-512プロトコルがサポートされているため、新規バージョンをインストールする必要があります。
※5.0 beta 1 バージョンインストールはこちら
●https://osdn.net/projects/ttssh2/releases/78350

##### 参考：古いTera TermバージョンでAmazon Linux 2023へSSH接続する方法
4.xxxなど、以前のバージョンを使ってると、デフォルトでは接続できない仕様となっていますが、Amazon Linux 2023の設定で、暫定的にssh-rsa を有効にすることでSSH接続が可能となります。

■手順
(1) Tera Term 以外の ssh 接続できるクライアント (Windows の PowerShell など) で接続する。
```
> ssh -i 鍵ファイルのパス OS用の初期ユーザー名@IPアドレス
```

(2) ルート権限に昇格する。
```
# sudo su
```

(3) 暗号化ポリシーを参照する。
```
# update-crypto-policies --show
----------------------------------------------------------
DEFAULT
----------------------------------------------------------
```

(5) 暗号化ポリシーを変更する
```
# update-crypto-policies --set LEGACY
----------------------------------------------------------
Setting system policy to LEGACY
Note: System-wide crypto policies are applied on application start-up.
It is recommended to restart the system for the change of policies
to fully take place.
----------------------------------------------------------
```

(4) 暗号化ポリシーが変更されていることを確認する。
```
# update-crypto-policies --show
----------------------------------------------------------
LEGACY
----------------------------------------------------------
```
(5) OSの再起動を実施する。
```
# shutdown -r now
```

以上の手順でEC2のssh-rsa を有効にすることができ、古いバージョンのTera Termにてpemファイルを用いた従来と同様のアクセスが可能となります。

最新版のTera Termをインストールしてもうまく接続できない場合は補足の方法も是非試してみてください！

# 参考 URL
●https://qiita.com/sugimount-a/items/78b5c02d4c286b7c266b
●https://help.arena.ne.jp/hc/ja/articles/7134065589271
ローカルのubuntuをngrok経由で外部ネットワークから接続する

ngrokを使用して外部ネットワークからローカルPCにログインする。

### ユーザーを作る

ユーザー登録し、認証メールを認証する。

https://dashboard.ngrok.com/


### 環境設定

ngrokの管理サイトからバイナリをインストール。


```

バイナリ展開
sudo tar xvzf ngrok-v3-stable-linux-amd64.tgz

コマンドの場所へ移動
sudo mv ngrok /usr/local/bin/

管理画面に表示されてるauthトークンを入れる
ngrok config add-authtoken hoge

```


### ログイン


```
sshログイン
ssh <YOUR_USERNAME>@0.tcp.jp.ngrok.io -p <your_ngrok_port>

```
DevOps Center リリース環境をプロジェクトに接続できません


# There was an error.Please reload the page or contact your system administrator if the problem persists.

+ [Cannot connect release environment to the project](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PeVaH)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a590a8dc-c30d-ea3b-b943-f68e3db53148.png)

Salesforce にケースをオープンしてもらいましたが、彼らは何とかログを取得し、これは IP 制限が原因であると私に言いました。残念ながら、ビジネスの性質上、Salesforce の IP 範囲全体をホワイトリストに登録することはできません。これにより、他のユーザーへのアクセスが広すぎる可能性があります。 


奇妙なことに、これは私が期待する方法で現れていません。掘り下げた後、セッション設定から「リクエストごとにログインIP範囲を強制する」のチェックを外しましたが、これが（一種の）役に立ちました。[ログイン] ボタンをクリックすると、Salesforce のログイン ページが表示され、すでにログインしているユーザーを選択するか、別のユーザーとしてログインできます。ログインしたら、DevOps Center にアクセス許可を付与しますが、すぐに別のエラーが表示されます。「認証エラーのため、ログインできません。ヘルプについては、Salesforce 管理者にお問い合わせください。」

ただし、今回は、ログインしようとしたユーザーの下に、ログイン履歴にエントリがあり、IP が制限されていることがわかります (これまでは発生していませんでした)。 


「 OAuth 設定を有効にする」にチェックマークを付け、IP 制限を解除することで、接続アプリケーションを拡張しました(接続アプリケーションの下でポリシーを編集します): IP 緩和: IP 制限を緩和しますが、違いはありませんでした。アプリ自体が oAuth を使用しない場合は意味があります。しかし、私はそれが何か違いを生むかどうかを確かめようとしなければなりませんでした. 

 

DevOps Center のトラブルシューティング ガイド ( THIS ONE ) には、これに関するエントリがあり、3 つのソリューションが提供されています。2 番目と 3 番目は私たちのビジネスには受け入れられないため、統合プロファイルを作成して、単一ユーザーのみの IP 制限をバイパスする必要があります。 

 

これについて - 誰かが知っているなら、いくつか質問があります:

1. プロファイルの「すべてのデータの変更」および「すべてのデータへのアクセス」権限は、システムに現在存在するすべてのオブジェクト (カスタムと標準の両方) へのアクセスを自動的に許可しますか? 
2. はいの場合、そのアクセス許可は、将来システムに導入する可能性のある新しいオブジェクトに自動的にロールバックされますか、またはこれを手動で維持する必要がありますか? 
3. この目的には標準プロファイル「Salesforce APIのみのシステム統合」で十分ですか?それとも、このユーザーにはポータルへのアクセスも必要ですか?
4. 最後に - すべてのユーザー (DevOps センターの使用が有効になっている) は、システム内に独自の統合ユーザーを持つ必要がありますか?それとも、同じ統合ユーザーを使用してこれを行うことができますか?
iTerm2 Python APIを使ってみた 〜画面分割＆コマンド実行〜

# 作ったもの

iTerm2の画面を分割して、右側でmanページを表示するスクリプトを作ってみました。

```console
$ iman ls
```

とすると、右側で `ls` のmanを表示し、manを終了すると自動的に右側の画面も閉じます。

# 下準備

iTerm2でPython APIを利用できるようにしておきます。
1. Script > Manage > New Python を選択し、 Basic > Simpleを選択
1. 途中Pythonをダウンロードするか聞かれたので、Yesにしました

参考：
https://qiita.com/yoshiken/items/10747f149bacd836e079

# 書いたスクリプト

```~/Library/Application Support/iTerm2/Scripts/man_with_new_pane.py
#!/usr/bin/env python3.7

import sys
import iterm2

async def main(connection):
    app = await iterm2.async_get_app(connection)

    currentPane = app.current_terminal_window.current_tab.current_session

    arg = ' '.join(sys.argv[1:])

    change = iterm2.LocalWriteOnlyProfile()
    change.set_use_custom_command('Yes')
    change.set_command(f'man {arg}')

    newPane = await currentPane.async_split_pane(vertical=True, profile_customizations=change)

iterm2.run_until_complete(main)
```

下記は `iman` として保存し、`chmod +x` してどこか`$PATH`の通っているディレクトリに置きます。
`3.10.4`の部分は環境によって違うかもしれませんので適宜書き換えてください。
```bash
#!/bin/sh

version="3.10.4"
python="$HOME/Library/Application Support/iTerm2/iterm2env/versions/$version/bin/python3"
script_dir="$HOME/Library/Application Support/iTerm2/Scripts"

"$python" "$script_dir"/man_with_new_pane.py "$@"
```

以上です。試しに `iman ls` としてみてください。

# 所感など

スクリプト起動にちょっともたつきがあります。コマンドを打ってからmanが表示されるまで2秒くらい？仕組み上、仕方のないのかもしれません。
xtermとかだと`-e`で簡単に同じようなことができるのですが（といってもxtermは画面分割でなく新ウィンドウ）、Python APIはそこまで気楽ではないですね。
manに限定せず、引数で指定した任意コマンドを実行するようにしても良かったかもですね（`$ v vim ~/.vimrc`のような感じで）
2023年05月何故かベストアンサーをつけてくれない質問

[2023年5月の質問の中から整理します](https://qiita.com/Keiji_otsubo/items/cb5a8906fc9c1bddd6f5)

# トレイルヘッド

私の回答通りに設定して機能したのに、自分の投稿にベストアンサーをつけている。外国の人には悪いがどうしても協力して仕事をしたいとは思えない。彼らを信じることはできないなぁ。

+ [Why can't I create a new customer account](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000QKdEJSA1)

質問している側のレベルも低下している感じがするなぁ。

+ [Sample Data Import Error - Dreamhouse (Getting Started with Salesforce)](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PehkQ)

+ [Can't install an AppExchange app in my Hands-On Org](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Peu62)

ストカーによる妨害

+ [role hierachy unit](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000QMHwA)
+ [while completing this module "Create Initial Submission Actions" the errors are coming. and also the next step which means "Specify Final Approval and Rejection Actions" .](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000QMZJv)

# 障害

+ [Customer Feedback Surveys for Social Customer Service & LiveMessage not working](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000QL2lD)
Windows ログイン時のPIN認証の複雑さ要件を緩和する方法

## 参考にしたブログ

https://qiita.com/sugasaki/items/ea102c49e50c3976cfc5

ありがとうございます。

## どんなときに？

なんらかの都合でPINを6ケタ以上という複雑さ用件となってしまったとき、桁数を減らすために…


## やり方

1. 管理者権限でレジストリエディターを起動します。
2. レジストリエディターが起動したら、HKEY_LOCAL_MACHINE¥SOFTWARE¥Policies¥Microsoft¥PassportForWork¥PINComplexityキーを開きます(ない場合は作成します)。
3. DWORD値「MinimumPINLength」を作成し、データを「4」に変更します。
4. ＜×＞ボタンをクリックして、レジストリエディターを終了します。
4. OSを再起動します。
4. このあと、PINを変更すると、ちゃんと4ケタPINにできます。

PINに数字を使用できるようにしたい場合は、DWORD値「Digits」を作成し、データを「1」に変更する必要があります。

### 最大長さを決めうちしたいとき

1. レジストリを使う場合は、
1. HKEY_LOCAL_MACHINE¥SOFTWARE¥Policies¥Microsoft¥PassportForWork¥PINComplexityキーに
1. DWORD値「MaximumPINLength」を作成し、データに最大文字数を指定
1. ＜×＞ボタンをクリックして、レジストリエディターを終了します

MaximumPINLength $\le 127$.
Arduino UNOにAdafruit ILI9341をインストール


目的
OLEDのテスト

1.スケッチ
2.ライブラリ
3.ライブラリを
4.ili9341を検索
5.Adafruit ILI9341を選択

![o_cop480.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5e7f0a3f-299c-471f-dd1a-262a4af997a9.jpeg)


![o_cop481.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2dcb6ffa-394d-1fe0-a737-57d00111851e.jpeg)
タワーデフェンスゲーム　Unity タレットアプデ機能　まとめ

# 説明

Unity でタワーデフェンスゲームのクローンを作ってます。
タレットアプデ機能の実装について後で確認しやすくするため、記事のリンクと実装後のUnityの画面(gifアニメ)をまとめます。


# 参考にしたUdemy講座

https://www.udemy.com/course/learn-how-to-create-a-2d-tower-defense-game-in-unity-2020/learn/lecture/23171294#content

# 一覧

## 1/2　35 Dボタンを押すと、タレットのアプデで実行される

![adsafdsfdsa.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/0dfb8b3c-a994-0b8f-e3e4-a8a18c70a6cf.gif)

https://qiita.com/RYA234/items/c861c08378533b145c4c


##  2/2　36 通貨システムの実装

![currency.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/e9e2135a-ad39-8d7e-013b-b141a6a6b708.gif)

https://qiita.com/RYA234/items/ac0c5cb11c3112830840
neosでlogix その126

# 概要
neosでlogixやってみる。
練習問題やってみた。

# 練習問題
websocketで、オウム返しを取得するオブジェクトを作成せよ。

# 方針
- サーバーには、これ使う。

https://qiita.com/ohisama@github/items/37eac3614f9fd1509fb2

- wsアドレス
ws://lacalhost:50002/

- 俺コード

```
{p} = WebSocketConnect pulse, WebsocketClient, "ws://localhost:50002", d
{p, b, c, t} = WebsocketTextMessageSender pulse, WebsocketClient, "hello world!"
{p, t} = WebsocketTextMessageReceiver WebsocketClient
{string} = write a, b

```

# 写真

![2023-05-01 21.33.38.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/5f4b6aa9-5c62-48c0-54bb-2e0b7d1a0a27.jpeg)

# 手順
- devtooltipを装着
- 新規->空のオブジェクトをスポーン
- 追加コンポーネント->network->WebsocketClient
- WebsocketClientのインターフェースを取り出す
- logixtooltipを装着
- ノードブラウザを表示
- network->websocket->WebsocketConnectをスポーン
- network->websocket->WebsocketTextMessageSenderをスポーン
- network->websocket->WebsocketTextMessageReceiverをスポーン
- actions->writeをスポーン
- variables->stringをスポーン
- インターフェースをつなぐ


以上。
todotxtのfutureTasksを有効化する方法

ToDoリストのシンプルなアプリである[`todo.txt-cli`](https://github.com/todotxt/todo.txt-cli/wiki/User-Documentation). 
やっとこさ日付のしきい値=`t:2023-05-03`を反映させることができたので、
ここに情報共有させていただきます。

## まずは、アドオンのインストール

くわしいことは以下のを参照してください。

https://github.com/todotxt/todo.txt-cli/wiki/Creating-and-Installing-Add-ons

将来の指定された時点まで、日付のしきい値 (`t:YYYY-MM-DD`) を含むタスクを非表示にします。

これは、下のようディレクトリをつくることからはじまるみたい。

```
$ mkdir -p ~/.todo.actions.d
```

この場合は futureTasks のため、

```
$ chmod +x ~/.todo.actions.d/futureTasks
```

`todo.cfg`を開いて以下のコードを書いてください。

```
export TODO_ACTIONS_DIR="$HOME/.todo.actions.d"
export TODOTXT_FINAL_FILTER = '$TODO_ACTIONS_DIR/futureTasks'
```

## 注 (1)

wsl2 の場合は、futureTasks スクリプトのbash宣言部分の `python` を `python3` に置き換えてください。

ホームディレクトリのどこかに置いて、.bashrc から入手します。
つぎのコマンドを .bashrcに記入してください。

```
source todo_completion
```

### 注 (2)

`todo.sh` にalias (`t` など) を定義する場合は、明示的に補完も有効にする必要があります (これも `.bashrc` に入れます)。

```
complete -F _todo t
```


このように`.bashrc`ファイルにaliasをdefineてください

```
alias t="~./todo.sh"
```
neosでlogix その125


# 概要
neosでlogixやってみる。
練習問題やってみた。

# 練習問題
レイアウトで	button0、textfield、button1、読み込んだtextの並びで、
textfieldにhelloと、打ち、button1を押すと、読み込んだtextがhelloと変わるオブジェクトを作成せよ。

俺コードで書くと下記。
{a, _, _, _, _, _, _, _, _, _} = ButtonEvents NeosButton
{test.txt.content, ok, ng} = write a textfield.text

# 写真

![2023-05-01 09.45.54.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/f52de1d6-c9da-cc6b-550a-1b7db9da680f.jpeg)

# 手順
- devtooltipを装着
- 新規->空オブジェクトをスポーン
- 新規->オブジェクト->neos ui->buttonをスポーン
- 新規->オブジェクト->neos ui->text fieldをスポーン
- 新規->オブジェクト->neos ui->buttonをスポーン
- ファイルブラウザーを開き、haru.txtをダブルクリックでスポーン
- インスペクターを表示
- logixtooltipを装着
- ４つのオブジェクトを空の下に移動
- buttonのneosbuttonをグラブしてrで、インターフェース表示
- textfieldのtextをグラブしてrで、インターフェース表示
- haru.txtのtextをグラブしてrで、インターフェース表示
- 空オブジェクトをhelloにする
- ノードブラウザを表示
- Interaction->button eventsをスポーン
- actions->writeをスポーン
- インターフェースをつなぐ

以上。
【Prisma】既存 DB からスキーマ定義ファイルを逆に生成する方法

## 概要
Prisma は、リバースエンジニアリングによるスキーマ生成と、マイグレーションファイルによるスキーマ更新の、両方をサポートしている。

通常は、スキーマ定義ファイルからマイグレーションファイルを生成して、DB スキーマを更新するが、逆に既存の DB からスキーマ定義を生成（リバースエンジニアリング）する方法を記載する。

例えば、既存の DB に影響を与えずに、 Prisma を仕様した DB 処理をプロジェクトで書ける様にしたい場合は今回の手順を実行すればよい。

### 前提
`prisma` コマンドをグローバルインストールしていないため、`npx` をつけて利用する。

## 事前準備
※ 既に`schema.prisma`、`.env` があれば、本手順は不要。
Prisma の初期設定コマンドをする。

```bash
npx prisma init
```

## リバースエンジニアリング
以下の２つの手順で実現する。

まず、`.env` の `DATABASE_URL` の接続先が間違いないか確認しておくこと。

### スキーマ定義ファイルの更新
prisma の場合、通常実行すると、スキーマ定義ファイル（`schema.prisma`）を上書きしてしまうため、まずは更新内容をコンソールで確認する。

```bash
npx prisma db pull --print
```

`--print` オプションを付けると、ファイルに書き込まれずコンソールに標準出力される。

正常動作し、内容も問題なければ、スキーマ定義ファイルの更新をする
```bash
npx prisma db pull
```
→ `prisma/schema.prisma` に最新のスキーマ定義が出力される。

### Prisma クライアントツールを更新する
次に、各バックエンド処理で呼び出すモデルに内容を反映させるために、以下のコマンドを実行する。

```bash
npx prisma generate
```

`prisma generate` を実行することで、`node_modules/.prisma/client` が更新される。

以上で、DB 処理が実装可能となる。
2023/5/2主にITとかセキュリティの記事

自宅・帰省先そのWi-Fiは大丈夫？ &#8211; GW中にチェックしておきたい設定とは？【サイバーセキュリティ連盟】(4/30)
https://gunosy.com/articles/eLnzh

｢AIの著作権問題｣がコワい会社員が知るべき基本
弁護士が易しく解説｢著作権侵害になる利用法｣(4/30)
https://toyokeizai.net/articles/-/666047

「トロイの木馬に感染しました」ニセ電話詐欺で佐賀県鳥栖市の70代男性、17万5千円被害(4/30)
https://news.yahoo.co.jp/articles/4b9bd96a2b753b5e9d85ae20ec61462afc589a77?source=rss

中国の「秘密警察」が日本でも活動か　海外の反体制派を監視・脅迫　“自発的な帰国”へ追い込む実態とは【大阪発】(4/30)
https://news.yahoo.co.jp/articles/d87e32081f98cefc4bf88bae25c04cfcc82ee3d3

生成AIなどの利用について、早稲田大学副総長がメッセージ(4/30)
https://univ-journal.jp/221655/

【GW】FBI、空港等でのUSBポートでの充電は避けるべきと周知(4/30)
https://gunosy.com/articles/aKiN4

AI適切利用に「5原則」で合意　G7デジタル相会合が開幕(4/30)
https://news.yahoo.co.jp/articles/911240c881dc6fcdb55bd5f5660bfd943af1ae3f

Ｇ７、ＡＩ利活用の５原則で合意　中露念頭に「民主主義」「人権」(4/29)
https://www.sankei.com/article/20230429-PTMX34ACFRK4NMVTKRWOV26ZSU/?ownedutm_source=owned%20site&ownedutm_medium=referral&ownedutm_campaign=ranking&ownedutm_content=%EF%BC%A7%EF%BC%97%E3%80%81%EF%BC%A1%EF%BC%A9%E5%88%A9%E6%B4%BB%E7%94%A8%E3%81%AE%EF%BC%95%E5%8E%9F%E5%89%87%E3%81%A7%E5%90%88%E6%84%8F%E3%80%80%E4%B8%AD%E9%9C%B2%E5%BF%B5%E9%A0%AD%E3%81%AB%E3%80%8C%E6%B0%91%E4%B8%BB%E4%B8%BB%E7%BE%A9%E3%80%8D%E3%80%8C%E4%BA%BA%E6%A8%A9%E3%80%8D

新興技術に5原則　G7高崎　きょう30日に共同声明(4/30)
https://www.jomo-news.co.jp/articles/-/276824

サイバー攻撃で事業が止まる　喉元迫る3つの脅威
Part1 被害の実態(5/1)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/041900161/041900001/

肝は「5W1H」の情報収集　証拠集めも抜かりなく
Part2 初期対応の勘所(5/1)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/041900161/041900002/

まずは暗号化された範囲を確認　経営層の判断仰いで復旧開始
Part3 シナリオ1：ランサムウエア攻撃(5/1)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/041900161/041900003/

ログ手掛かりに感染端末を特定　周辺端末もまとめて隔離
Part4 シナリオ2：標的型攻撃(5/1)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/041900161/041900004/

持ち出しルートをまずは解明　証拠はパソコンのログにも
Part5 シナリオ3：内部不正(5/1)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/041900161/041900005/

「身代金」はサイバー保険で払えるの？(5/1)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/041800014/041900069/
【覚え書き】Reactで子コンポーネントでのクリックイベントを違う子コンポーネントに渡す方法

## 概要

前回も仕事での備忘録でしたが、今回も仕事で「子コンポーネントでのクリックイベントを違う子コンポーネントに渡す」というタスクがあったので「どうやるんだっけ…」となって上司に教えてもらったのを備忘録として残しておきます。

以下はモーダルと発火させるボタンのコンポーネントを別々に作った例です。


```App.js
import {useState} from "react"
import {Block} from "./block"
import {Dialog} from "./dialog"

export default function App() {
  // モーダル開閉のstate、初期値はfalse
  const [isOpen, setIsOpen] = useState(false)
  // モーダルを開くクリックイベント
  const openClick = () => {
    setIsOpen(true)
  }
　　// モーダルを閉じるクリックイベント
  const closeClick = () => {
    setIsOpen(false)
  }

  return (
    <div className="App">
      <h1>クリックイベント受け渡しテスト</h1>
      <Block openClick={openClick} />
      <Dialog open={isOpen} closeClick={closeClick} />
    </div>
  )
}

```

```block.js

export const Block = (props) => {
  return (
    <div>
      <p>ダイアログを下のボタンで開きます</p>
      <button onClick={props.openClick}>クリック</button>
    </div>
  )
}
```

```dialog.js
export const Dialog = (props) => {
  return (
    <dialog open={props.open}>
      <p>ダイアログが開かれました</p>
      <button onClick={props.closeClick}>閉じる</button>
    </dialog>
  )
}
```

## 説明

Reactでは、コンポーネント同士のデータのやり取りは通常、propsを介して行われます。
しかし、親コンポーネントと子コンポーネントの関係では、子から親にデータを渡すことはできません。（親から渡されたpropsは子コンポーネントでは読み取り専用）

そのため、このような場合には、親コンポーネントを介してデータを渡す必要があります。具体的には、block.jsxでクリックされたイベントを親コンポーネントのApp.jsxで処理し、その結果をstateに保存し、stateをpropsとしてdialog.jsxにstateの変更を渡すことで実現できます。

- 親コンポーネントの `App.js` にモーダル開閉のstateを作成
- `block.js` に「モーダルを開く」クリックイベントをpropsで渡す
- `block.js` でクリックされた内容をstateに保存され、その結果 `setIsOpen` がtrueになる
- trueになった結果が `dailog.jsx` にpropsで渡されモーダルが開く 
- `dialog.js`　に「モーダルを閉じる」クリックイベントもpropsで渡されているので、「閉じる」ボタンでモーダルを閉じる事ができる


## demo


https://codesandbox.io/embed/react-props-test-2by4rr?fontsize=14&hidenavigation=1&theme=dark
Webサーバ

# はじめに
Webサーバについて理解を深めることで，開発環境の構築の際に役に立つ．私が勘違いしていた点などを含めてWebサーバについてまとめる．

# Webサーバの2つの意味
個人でWebサイトやWebアプリを開発する際に，ローカル環境に動作確認を行うためのWebサーバが必要になる．インターネットで環境構築のやり方について調べると，"Webサーバのインストール"という言葉が出てくる．「Webサーバって物理的なものでは？」と思うことがあるが，"Webサーバ"は<font color="Blue">ソフトウェア</font>と<font color="FireBrick">ハードウェア</font>としての意味を持つ．


## ソフトウェアとしてのWebサーバ
Webサーバを構築するための機能を提供するソフトウェアのことで，インストールすることで個人のPCでもWebサーバとしての利用を可能にする．<font color="Blue">ソフトウェア</font>としてのWebサーバは本来は**Webサーバソフトウェア**と呼び，これを略して"Webサーバ"と呼ばれることが多い．

## ハードウェアとしてのWebサーバ
<font color="FireBrick">ハードウェア</font>としてのWebサーバは，前述の"Webサーバソフトウェア"やWebアプリ・サイトのコンポーネントファイル(HTML/CSS，画像など)を格納しているコンピュータのことである．

まとめると，Webサーバは物理的なコンピュータであり，Webサーバソフトウェアはそのコンピュータ上で動作するプログラムであるということができる．


# Webサーバの機能
WebページやWebアプリを提供するWebサーバには，以下のような機能を持つ．ここでは代表的な機能だけで，他にもセキュリティに関する機能も提供する．

### １．リクエストの受信
Webサーバは，HTTPプロトコルに基づいて，パソコンやスマホなどのクライアントからのリクエストを受け取る．リクエストは，WebページやWebアプリを取得するためのもので，Webサーバはそれに応じて適切な応答を生成する．

### ２．静的コンテンツの提供
Webサーバは，WebページのHTMLやCSS，JavaScript，画像などの静的なコンテンツを提供する．これらのコンテンツはWebサーバに保存されており，クライアントからのリクエストに応じて提供される．

### ３．動的コンテンツの生成
Webアプリとして利用可能にする動的なコンテンツを生成することができる．これには，データベースから情報を取得したり，APIを呼び出したり，動的に生成されたHTMLを作成したりすることを含む．

### ４．キャッシュの管理
キャッシュを管理することで，Webサーバの負荷を軽減し，レスポンスタイムを改善することができる．

:::note info
キャッシュとは
最近利用されたものや利用回数が多いリソースを一定期間保存するもので，取得による負担を削減することができる．
:::

### ５．ログの記録
Webサーバが処理するリクエストに関する情報を記録し，Webサーバの動作やパフォーマンスの問題を特定するための情報として利用する．

# Webサーバソフトウェアの種類
Webサーバソフトウェアにはなどさまざまな種類があり，メジャーなものとして以下のものがある．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3133563/932fa661-16c3-39e5-4990-29be8553f8dd.png)

### ・Appatch（アパッチ）
正式名称は「**Apache HTTP Server**」で，世界的に広く使用されているWebサーバソフトウェア．オープンソースソフトウェアであり，誰でもダウンロードすることができる．幅の広い動作環境に対応しており，LinuxやUNIX，WindowsやMac OSなどユーザの環境を選べないという点が特徴を持つ．

### ・Nginx（エンジンエックス）
2004年にリリースされた比較的新しいWebサーバソフトウェア．Apacheと同様で誰でもダウンロードすることができる．静的コンテンツの処理能力の高さ，並列処理性能の高さ，メモリの使用量の少なさという特徴を持っている．

### ・IIS（アイアイエス）
IIS(Internet Information Services)はWindows用のWebサーバソフトウェア．Microsoft社が提供しているためWindowsに特化している．Windowsの画面上でマウスで視覚的に操作できるので，難易度が低く使いやすいという特徴をもつ．
Vuetifyでv-iconの実装部分でエラーを吐いた時の解決例

## 何が起きた？
chatgptにvuetifyでiconを出す方法を聞いたところ、下記のようなソースコードを教えてもらい、実装したところ図のようなエラーを出しました。

```vuejs:chatgptが教えてくれたソースコード
<template>
  <v-icon mdi="mdi-pencil"></v-icon>
</template>
```

エラー文
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/977fb037-def6-1dba-0005-027045fbfced.png)


## 原因
`mdi="mdi-pencil"`ではなく、`icon="mdi-pencil"`が正しい書き方でした。


## 解決方法
以下のようなソースコードに直すことでエラーが解消されました。

```vuejs:正しいソースコード
<template>
  <v-icon icon="mdi-pencil"></v-icon>
</template>
```

## 根拠資料
[公式リファレンスのv-iconのページ](https://vuetifyjs.com/en/components/icons/)
OpenSSL 3.0とNode 18.xの依存関係のせいでハマった

 ## 背景
数年前に構築したrustとvueの開発環境を、また触ってみようと思って動かしてみたら動かなくて困ったときのお話。
主たる原因は、Opensslが2.0->3.0になったことによって、もろもろの依存関係が解決できなくってしまっていた事に依るものである。
ここでは、その解決方法をまとめておく。万人に適用できるかは不明なので悪しからず。

## 環境
* win10のOS上にdocker desktopをインストールし、コンテナを立ち上げている。
* コンテナイメージは、dockerfileを用いてdocker-composeでビルドしている。
* コンテナイメージにはubuntuを使用している。
* ubuntu上に、nodeとrustをインストールし開発環境を構築している。

## 現象
OpensslとNode18間で依存関係が解決できない。（npm run serveできない。yarnでも同様。）

## やったこと

dockerfileの中身を以下変更した。
libssl（２行目）とnode（最後の行）の変更以外は、本題とはあまり関係ありません。

|解決前|解決後|理由|
|-----------|------------|------------|
|ubuntu 21|ubuntu 23|気分|
|libssl-dev|libssl-dev=3.0.8.-1ubuntu1.1|イメージビルド時のapt-getで勝手に更新されたくないため固定|
|rustup install nightly| rustup install nightly-2023-4-25|同上（stablehではないのは開発環境の都合）|
|記述なし|cargo install cargo-check; cargo update|crateの依存関係を解決するため|
|apt-get -y node|curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh \| bash; . ~/.nvm/nvm.sh && nvm install 16.20.0|openssl 3.0とNode 18.xの依存関係を、nodeのバージョンを下げて解決するため|

openssl 3.0とNode 18.xの依存関係を、解決する方法はいくつかありますが、
情報をあさってもイカした方法がなかったので、使えるNodeバージョンを指定するという方法が無難でした。

イカしてない方法：Opensslをダウングレードするとか、nodeで--openssl-legacy-providerをつけるとopenssl3.0の古い暗号モジュールを使えるようにするとか脆弱性に成り得る。


構成管理をしっかりやれば良いだけなんですけどね。。。
Google Colaboratory TA-Lib のエラー 解決法

## Google Colaboratory TA-Lib のエラー
[Google Colaboratory TA-Lib のエラー](https://qiita.com/katafuchix/items/2c7a93579111c423b374) の通り
Google Colaboratory の Python のバージョンが 3.9 にアップグレードされたことに伴うエラーが発生する。

回避できるかもしれない方法。
＊ できない場合もあるので気をつけてください。

## TA-Lib のインストール

```
!wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz
!tar xvzf ta-lib-0.4.0-src.tar.gz
%cd ta-lib
!./configure --prefix=/usr
!make
!make install
!pip install TA-Lib
```

ここまでは問題なく成功する。

## Numpy のアップグレード

エラー内容を見ると numpy に原因がありそうなので・・・アップグレードしてみる

```
!pip install numpy --upgrade
```

`Successfully installed` の結果を確認。

## ランタイムを再起動

TA-Lib, Numpy のインストール後、ランタイムを再起動する。
[メニュー] - [ランタイム] - [ランタイムを再起動]

## 環境変数を設定

```
!echo 'export LD_LIBRARY_PATH=/usr/lib' >> ~/.bashrc
!source ~/.bashrc
```

## TA-Lib が利用可能に

`import talib` でエラーが出ないことを確認

```python
import mplfinance as mpf
import pandas_datareader.data as pdr
import datetime as dt
import talib as ta

code = 3099 # 三越伊勢丹HD
df = pdr.DataReader("{}.JP".format(code), "stooq").sort_index() 
df["ma5"]   = ta.SMA(df["Close"], 5) 
df["ma25"]  = ta.SMA(df["Close"], 25) 
df["ma75"]  = ta.SMA(df["Close"], 75) 


cdf = df[dt.datetime(2021,4,30):dt.datetime(2022,2,20)]
apd = { "MA5": mpf.make_addplot(cdf["ma5"], color="blue"),
         "MA25": mpf.make_addplot(cdf["ma25"], color="green"),
         "MA75": mpf.make_addplot(cdf["ma75"], color="red") }

fig, axes = mpf.plot(cdf, type="candle", figratio=(2,1), addplot=list(apd.values()), returnfig=True)
axes[0].legend([None]*(len(apd)+2))
handles = axes[0].get_legend().legendHandles
axes[0].legend(handles=handles[2:], labels=list(apd.keys()))
fig.show()
```

![スクリーンショット 2023-05-02 1.40.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266239/afb13225-fa16-7f25-d931-ab21cefdfd84.png)
WAC in Azure PortalでAzure外のマシンを管理する（プレビュー）

### はじめに

前回、[Windows Serverを管理する方法を整理](https://qiita.com/k-kimino/items/e2c8c4be39d0f7a32bed)し、Windows Serverを詳細に管理する方法としてWindows Admin Center（WAC）を紹介しました。元々オンプレミスにWindows Admin Centerのゲートウェイを構築し、ゲートウェイに接続することで管理下にある複数または単体のマシンを管理できるという代物だったのですが、WAC in Azure Portalを活用することでVPN不要でAzure Portalからセキュアにサーバーに接続することができてしまいます。ここからは実際の画面を見て理解を深めましょう。
*Azure外のサーバーに対するWAC in Azure Portalは現在プレビュー中です。

### 実際の画面をみる
#### Azure Arcで接続されたマシンに対するWAC in Azure Portalを有効化する

以下の画面からセットアップを開始します。
![enablewacinazure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/8047d248-2f43-6d5d-13db-6594ca0371c9.png)

#### Windows Admin Center Administrator Loginロールを操作ユーザーに割り当てる

管理が必要なユーザーに権限を割り当てます。
![wacinazurerbac.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/04a04d15-d65c-bf9d-149e-1155e23657d9.png)

#### ローカルマシンにAzureから接続する

以下のようにAzureから簡単に接続することができました。
![connectwacinazure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/92c3ce1a-ba77-425d-be5e-3d317c4c62e4.png)

私も知らなくてびっくりしたのですが、2022年8月よりAzure ADベースの認証を使用できるようになっており、ローカル管理者アカウントの資格情報なしでログインできるようになっています。

### まとめ

WAC in Azure PortalでAzure外のマシンを管理する方法をまとめました。とても簡単に構成できるようになっており、Azureによる集中管理が加速しそうです。
注意点は、当たり前ですがAzureとの接続が必要なこと、対象のマシンにWindows Admin Centerがすでに入っている場合、情報が置き換えられ他のマシンを管理する機能が削除されてしまう点が挙げられるかと思います。

### 参考
- [Azure で Windows Admin Center を使用して Azure Arc 対応サーバーを管理する (プレビュー)](https://learn.microsoft.com/Ja-jp/windows-server/manage/windows-admin-center/azure/manage-arc-hybrid-machines?toc=%2Fazure%2Fazure-arc%2Fservers%2Ftoc.json&bc=%2Fazure%2Fazure-arc%2Fservers%2Fbreadcrumb%2Ftoc.json)
- [Manage Arc-enabled Windows Server with Windows Admin Center in the Azure Portal](https://www.thomasmaurer.ch/2022/06/manage-arc-enabled-windows-server-with-windows-admin-center-in-the-azure-portal/)
ECRにdocker pushした時のRetrying EOF

# Error
```
$ docker push aws_account_id.dkr.ecr.region.amazonaws.com/my-repository:tag
The push refers to repository [aws_account_id.dkr.ecr.region.amazonaws.com/my-repository]
************: Retrying in 1 second
************: Retrying in 1 second
************: Retrying in 1 second
************: Retrying in 1 second
************: Retrying in 1 second
************: Retrying in 5 seconds
************: Retrying in 5 seconds
************: Retrying in 5 seconds
************: Retrying in 5 seconds
************: Waiting
EOF
```
# 原因
以前aws cli v2をインストールしたときに設定したconfig関連のdefault情報（~/.aws/config, ~/.aws/credentials）はその当時使用していたAWSアカウントの情報だったが、現在は別のIAMユーザーを使用しているため、アクセスキーやシークレットアクセスキーの情報が違っていた。

# 対策
アクセスキー等を作成していない場合は、以下に沿って作成。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_CreateAccessKey

新しいユーザーの設定
()内は各自のものを記入。defaultのregionやoutput formatはとりあえずap-northeast-1、jsonで良いと思います。（もちろんこれ以外でも可。）
```
$ aws configure --profile (your_profile_name)
AWS Access Key ID [None]: (yours)
AWS Secret Access Key [None]: (yours)
Default region name [None]: ap-northeast-1
Default output format [None]: json
```
gitコマンド

- git init：新しいGitリポジトリを初期化

- git clone：既存のリポジトリをクローン

- git add：変更されたファイルをステージングエリアに追加

- git commit：ステージングエリアに追加された変更をコミット

- git status：リポジトリの状態を表示

- git log：コミット履歴を表示

- git diff：変更内容を比較

- git branch：新しいブランチを作成する、または既存のブランチを一覧表示

- git checkout：ブランチを切り替え

- git merge：ブランチをマージ

- git remote：リモートリポジトリを設定

- git push：リモートリポジトリに変更をプッシュ

- git pull：リモートリポジトリから変更をプル

- git fetch：リモートリポジトリから情報を取得

- git tag：新しいタグを作成する、または既存のタグを一覧表示
【AWS】Amazon CloudFront〜地域制限〜

# はじめに
SAP取得に猛勉強中です。
何度か模擬試験解いてみて、何度も間違っていた内容について知識整理含めて投稿しようと思います。

# 概要
- CloudFrontから配信しているコンテンツについて、特定地域のユーザーからのアクセスを制限することができる。
- 国レベルの制限はもちろん、より細かい制限をすることも可能。
- 設定方法は２通り

# 地域制限方法
## CloudFrontの地域制限
通常CloudFrontは、アクセス元のユーザがどこに居ようと関係なくコンテンツを提供する。
特定の国のユーザーからのアクセス制限したい場合に、この地域制限を使用する。
- 許可された国のリストに含まれている国のユーザ　->　許可
- ブロックリストの禁止国にいるユーザ　->　拒否
拒否した場合は403（Forbidden)が返されるが、カスタムエラーメッセージを設定することも可能。
エラーレスポンスのキャッシュが可能で、キャッシュする時間を指定できる（デフォルト１０秒）

※CloudFrontは、サードパーティのデータベースを使用して、ユーザーのアクセス元を判別する。（GeoIP）
IPアドレスと国のマッピングの正確性は99.8%。

- 地域制限はディストリビューション全体に適用される。
- コンテンツの一部に別の制限を適用したい場合
    - 別々のCloudFrontディストリビューションを作成する
    - [サードパーティの位置情報サービス](#サードパーティの位置情報サービス)を使用する

## サードパーティの位置情報サービス
[CloudFrontの地域制限](#CloudFrontの地域制限)は国レベルでディストリビューション全体に適用される。
地域制限が国境と一致していない場合や、配信するファイルの一部のみアクセスを制限したい場合は、CloudFrontとサードパーティーの位置情報サービスを組み合わせることで、都市・郵便番号・緯度/経度に基づいてアクセス制限が可能。
- 位置情報サービスを使用する場合は、有効期限の日時を指定できるCloudFront署名付きURLの使用を推奨している。オリジンはS3バケットを推奨。
 ->　CloudFrontのオリジンアクセスコントロールを使用することで、ユーザがオリジンへ直接アクセスすることを回避するため。
- ユーザがIPアドレスを位置情報サービスに送信し、レスポンス値を評価してCloudFrontで許可/拒否しているか判別する。
    - 許可された国のリストに含まれている国のユーザ　->　署名付きURLを生成する。
    - ブロックリストの禁止国にいるユーザ　->　拒否
拒否した場合は403（Forbidden)が返されるが、カスタムエラーメッセージを設定することも可能。
エラーレスポンスのキャッシュが可能で、キャッシュする時間を指定できる（デフォルト１０秒）


# 試験対策
間違えやすい回答
- CloudFrontディストリビューションを利用して**オリジンサーバの設定**で地域制限する。
-> オリジンサーバではなく、**エッジロケーション**の機能
- Route53を利用した地理的近接性ルーティングで地域制限する。
-> ユーザとコンテンツの地理的場所に基づいてルーティングするので、地域制限とは用途が違うので間違い。

# 最後に
CloudFrontとLambda@Edgeを組み合わせて地域制限的なことって可能なのか。。。（頑張ればできそう・・・？）


# 参考サイト
https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/georestrictions.html
【Mac】コマンドでApp Storeのアプリケーションを管理する方法

## masコマンドをインストールする
HomeBrewを使用して次のコマンドで`mas`コマンドをインストールします。

```terminal
brew install mas
```

https://github.com/mas-cli/mas

## アプリケーションの一覧を表示する
次のコマンドを実行するとアプリケーションの一覧を取得できます。

```terminal
$ mas list
724472954   Manico              (3.4)
1278508951  Trello              (2.13.10)
1429033973  RunCat              (9.7)
1444383602  GoodNotes           (5.9.103)
803453959   Slack               (4.31.155)
457622435   Yoink               (3.6.84)
1348617240  FirstSeed Calendar  (5.2.1)
720669838   iThoughtsX          (9.3)
1482454543  Twitter             (9.30)
```
## アプリケーションを検索する
次のコマンドでアプリケーションを検索できます。

```terminal
mas search line
  1500855883  CapCut - 動画編集アプリ                           (8.1.1)
   539883307  LINE                                       (7.16.1)
  1310262344  Code of War - オンライン銃撃ゲーム 5v5               (3.18.1)
  1127260935  ウォープラネット オンライン (War Planet)                (5.4.1)
  1137864805  せんしゃ 戦争 戦車 ゲーム - Modern Tanks              (3.60.1)
  1029784963  LINE WORKS – ビジネスチャット                      (3.6.3)
  1441507725  Oka Unarchiver - Unzip ZIP RAR             (2.1.7)
  1335335588  ビデオプレーヤー メディアプレーヤー                         (1.0.7)
   404242044  チェッカー                                      (10.11)
   441968334  SpeakLine – Text to Speech                 (4.2.1)
  1548427467  アメージング ボンバーマン                              (1.3.0)
   434290957  Motion                                     (5.6.3)
  1208322173  翻訳ソフト：写真翻訳機海外英語オンライン                       (5.2)
   424389933  Final Cut Pro                              (10.6.5)
  1471344150  数学のなぞなぞ：IQテスト                              (3.2.4)
   989461317  SwingVision: A.I. Tennis App               (10.1.4)
   977949232  DayGram -１日１行日記 デイグラム                      (4.7.5)
   582635628  Toolbox for Keynote - テンプレート               (7.0.7)
   432850619  FL Studio Mobile                           (4.3.2)
  1565119039  オセロ − オンライン                                (1.1.5)
  1264559899  オンライン麻雀 Maru-Jan App                       (22.1.0)
  1208164242  Flow VPN - 高速グローバルインターネット                  (2.01)
  1450246547  BestZip - Unarchive RAR&7Z&ZIP             (2.5.3)
  1127676902  アニメ画像に変換する君                                (4.2)
  1258500140  ScreenNote                                 (4.1)
```

## アプリケーションをインストールする
次のコマンドでアプリケーションをインストールできます。

```terminal
mas install <app_id>
```

以下のように実行するとLINEがインストールされます。

```terminal
$ mas install 539883307
==> Installed LINE
```

## アプリケーションを更新する
次のコマンドを実行すると更新可能なアプリケーションの一覧を取得できます。

```terminal
mas outdated
```

次のコマンドを実行することで更新可能なアプリケーションをすべて更新します。

```terminal
mas upgrade
```

特定のアプリケーションのみ更新する場合には次のように実行します。

```terminal
mas upgrade <app_id>
```

## アプリケーションをアンインストールする
次のコマンドを実行することでアプリケーションをアンインストールできます。

```terminal
mas uninstall <app_id>
```

上記のコマンドはエラーになってしまい、アンインストールはできません。
以下のページをご参照ください。

https://github.com/mas-cli/mas/issues/313
Cent OSでAWS CDKを構築するまでのメモ


# Cent OSでAWS CDKに必要なものをインストールするまでのメモ
qiitaの様々な記事を参考にしてきて、とても感謝しており、
私も誰かの参考になればと思い、初めて記事を投稿します。

【前提条件】
OS:Cent OS
TypeScript用途

主な手順は以下サイトを参考にしました。
>AWS-CDK使ってみた件
https://qiita.com/iam_nk/items/d4ef076e88f8687950cd

## AWS CLI をインストール
```
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
```
>AWS CLI の最新バージョンをインストールまたは更新します
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html

## 認証情報設定
AWS コンソール画面からIAM→セキュリティ情報→アクセスキーより
コマンドラインインターフェイス(CLI)用のアクセスキーを作成し、
アクセスキー（AWS Access Key ID:） シークレットアクセスキー（AWS Secret Access Key：）を取得

awsconfigureコマンドより以下を入力
AWS Access Key ID : アクセスキー
AWS Secret Access Key : シークレットアクセスキー
Default region name [None]: ap-northeast-1  （東京リージョン）←自宅からの距離や使用するサービスによりリージョンを変更する。
Default output format [None]: json

## node.js、およびnpmのインストール
AWS CDKで初期化した際に以下サイトのようなエラーが出てしまう可能性があるため、
nodebrewをインストールし、node.jsのバージョン管理をしやすくする。

>Node.js環境で発生する”npm WARN EBADENGINE Unsupported engine”を解決したい
https://dev.classmethod.jp/articles/resolve-npm-warn-ebadengine-unsupported-engine-that-occurs-in-npm-environment/


```
brew install nodebrew
nodebrew -v
npm install -g npm@7.24.0
```

>node.jsのversionを管理するためにnodebrewを利用する
https://qiita.com/sinmetal/items/154e81823f386279b33c

>NodebrewでNodeをインストールする
https://qiita.com/mame_daifuku/items/373daf5f49ee585ea498
javascriptの外部ファイルの読み込む

# 外部ファイルの接続
```assets.rb
.
.
.
Rails.application.config.assets.precompile += %w( *.js )
```
```
rake restart
```
# 読み込みたいHTMLファイルに書き込む
```
  <%= javascript_include_tag "hogehoge.js" %>
```
これで成功か？

# Sprockets::Rails::Helper::AssetNotPrecompiledError in *********
Showing /Users/**********/*****/*****/app/views/*******/*****.html.erb where line #6 raised:

Asset `hogehoge.js` was not declared to be precompiled in production.
Declare links to your assets in `app/assets/config/manifest.js`.

  //= link hogehoge.js

and restart your server

```
//= link hogehoge.js
```
これを`app/assets/config/manifest.js`に入力すればいいのか。

これで成功した。
# 出典
https://papael14.com/ruby-on-rails-javascript/

# 感想
これで外部ファイルから読み込むことができた。
しかし
他の方法も知りたい。
scriptタグから外部ファイルを読み込むことができなかったからだ。
【SwiftUI】'〇〇' initializer is inaccessible due to 'private' protection level

# はじめに
次のような`SecondView`を作って、`ContentView`からアクセスしようとしました。
```swift:SecondView.swift
struct SecondView: View {
    private var title = "Greeting"
    var text: String
    
    var body: some View {
        VStack {
            Text(title)
            Text(text)
        }
    }
}
```
`title`はSecondViewでしか使わないし、`private`修飾子を付けてました。
すると、`ContentView`の方でエラー。

```swift:ContentView.swift
struct ContentView: View {
    var body: some View {
        VStack {
            SecondView(text: "Hello")
            //'SecondView' initializer is inaccessible due to 'private' protection level
        }
        .padding()
    }
}
```
...???
# 結論
Memberwise Initializerによって`ContentView`から`private var`にアクセスしてしまっているので、自分でInitializerを作る

# Memberwise Initializer
エラーの意味は、「`private`レベルの変数があるので初期化子(イニシャライザ)にアクセスできません」といったもの。
`ContentView.swift`の方にあった
>`SecondView(text: "Hello")`

は、Memberwise Initializerというイニシャライザでstruct(SecondView)を初期化しています。
Memberwise Initializerは、自分で`init`を設定しなかった場合に、struct の持つプロパティを**全て**初期化してくれるものです。
この「全て」が重要で、今回Memberwise Initializerで初期化しようとしたのは`SecondView`の`text`だけではありません。すでに`"Greeting"`という初期値が設定されている`private title`も同時に初期化しています。
例えばこんなこともできます。
```swift
struct Person {
    var name: String
    var age = 18
}

let janeDoe = Person(name: "Jane Doe", age: 20)
```
この場合、`janeDoe`というインスタンスは、`name`が"Jane Doe"、`age`が20として初期化されます。

つまり今回のエラーは、「`title`を初期化しようとしたけど、アクセス範囲が`private`だったからできなかった」ということですね。
アクセス範囲については以下の記事を参照ください。
[【Swift】アクセス修飾子【リファクタリング】
](https://qiita.com/mogeko6347/items/a6d9c8fcd446bbe7de09
)

ちなみに、classにはMemberwise Initializerは存在しません。classはstructと違い継承機能があり、親クラスのプロパティが追加されるとそれを初期化に反映しないといけなくなるからです。詳しくは以下の記事を参照ください。
https://www.hackingwithswift.com/quick-start/understanding-swift/why-dont-swift-classes-have-a-memberwise-initializer

# 解決策
自分で`init`を設定すればMemberwise Initializerは機能しなくなるのでエラーが消えます。
```swift:SecondView.swift
struct SecondView: View {
    private var title = "Greeting"
    var text: String
    init(text: String) {
        self.text = text
    }

    var body: some View {
        VStack {
            Text(title)
            Text(text)
        }
    }
}
```
`SecondView`内で定義したInitializerなら`private`にもアクセスできるので、以下のような書き方もできます。
```swift:SecondView.swift
struct SecondView: View {
    private var title: String
    var text: String
    init(text: String) {
        self.text = text
        self.title = "Greeting"
    }

    var body: some View {
        VStack {
            Text(title)
            Text(text)
        }
    }
}
```
# 終わりに
以下の記事も参考にさせていただきました。
https://software.small-desk.com/development/2022/04/19/swift-explain-struct-initializer/
https://qiita.com/jinyogi/items/c1a7e29f086f206602bd