OmniAICreator/Qiita-1.07M huggingface dataset:
Azure Data Factory のメタデータ駆動のコピータスクの個別のアクティビティにて再試行の設定を実施する方法

## 概要

 クラウドシステムにおいては一時的な障害が発生することから再試行のロジックが求められるており、Azure Data Factory のメタデータ駆動のコピータスクにおいても同様に再試行の設定を実施することをおすすめします。本記事では設定すべき個別のアクティビティの再試行の設定を行う手順を紹介します。

## 実施手順

### 1. `MetadataDrivenCopyTask_xxx_TopLevel`パイプラインの`GetSumOfObjectsToCopy`アクティビティ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/9bd04e0f-01bb-cb62-b73b-bcdc40821842.png)

### 2. `MetadataDrivenCopyTask_xxx_MiddleLevel`パイプラインの`GetObjectsPerGroupToCopy`アクティビティ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/eb358291-de45-9169-91eb-62dbbfb1977e.png)

### 3. `MetadataDrivenCopyTask_xxx_BottomLevel`パイプラインの`DefaultFullLoadOneObject`アクティビティ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b2ee84ef-316d-9aa4-4adf-05cd8cf8f6cb.png)

### 4. `MetadataDrivenCopyTask_xxx_BottomLevel`パイプラインの`GetMaxWatermarkValue`アクティビティ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/9f8c1b71-3d6e-6eb1-15e1-ac94d530f106.png)

### 5. `MetadataDrivenCopyTask_xxx_BottomLevel`パイプラインの`DeltaLoadOneObject`アクティビティ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/8d8b2ab7-0532-5b77-a7b7-802f7dedd832.png)

### 6. `MetadataDrivenCopyTask_xxx_BottomLevel`パイプラインの`UpdateWatermarkColumnValue`アクティビティ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/87689de2-309a-f9bb-6edf-dfeb5b87dc2d.png)
Excel VBA,マクロ　セルへ書き出し

やってみたシリーズ　Excel
いつものごとく報告。

![スクリーンショット 2024-06-05 180839.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/cf0d6264-d277-0f52-97cb-d12712736d02.png)
最初
![スクリーンショット 2024-06-05 181213.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/2f0cf831-2445-1185-80c3-4de527deb518.png)
イメージ1クリック
![スクリーンショット 2024-06-05 181344.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/711a70d5-9ada-e5f7-eeb2-05f90d004b7c.png)
マクロ起動・１最終
![スクリーンショット 2024-06-05 181438.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/89cdf4c4-4e83-1820-067b-8b7e9ebf26e0.png)
マクロ2起動・最終
![スクリーンショット 2024-06-05 181900.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/f896d7cd-5cf0-e2ef-2a8f-ca2a19529b10.png)
オブジェクト、ツリー
![スクリーンショット 2024-06-05 181647.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/9cf17211-aee6-83a2-7357-0016045726dc.png)
ソース
```VBA
Rem Attribute VBA_ModuleType=VBAModule
Option VBASupport 1
' REM  *****  BASIC  *****
Sub Main
MsgBox "Hello"
Dim me_hello As String
me_hello = "Welcome "
MsgBox "Hello " & me_hello
Worksheets("Sheet1").Activate  'it ok.
Dim me_it As String
me_it = Range("B1").Value
MsgBox "Hello " & me_hello & me_it & " it World!"

	 Dim my_Seet_11 As Integer
     On Error GoTo age_error
	 	my_Seet_11 = Range("B2").Value
	 
	If my_Seet_11 < 20 Then
		Range("C3").Value = "Yangu"
	ElseIf my_Seet_11 < 55 Then
		Range("C3").Value = "Midol"
	Else
		Range("C3").Value = "Beteran"
	End If	
	 Range("A3").Value = "Welcome"
	 Range("B3").Value = me_it

  	GoTo me_end
  	age_error:
		MsgBox "数字でお願いします。"
		 Range("B2").Value = 10
  	me_end:
		'It end		
End Sub


Sub Macro1

	 MsgBox "it ok !!"
	 Range("A3").Value = ""
	 Range("B3").Value = ""
	 Range("C3").Value = "under stand!"

End Sub

Sub Macro2

End Sub
```
この中の IntegerにStringを代入してError検査をするところが、Error発生がありません。
On Error GoTo age_error
	 	my_Seet_11 = Range("B2").Value
後は、過去の報告の繰り返しになる操作なので、記載は省略しました。

以上、よろしくお願いいたします。
ハッカーがゼロデイサイバー攻撃で高名なTikTokアカウントをハイジャック

![Something went wrong]()
悪意のある者が最近、大企業や著名人のハイプロファイルなTikTokアカウントをハッキングし、TikTokのダイレクトメッセージ機能に存在するゼロデイ脆弱性を悪用しました。このTikTokのゼロデイ脆弱性により、被害者が何かをダウンロードしたりリンクをクリックしたりする必要なく、ハッカーがアカウントを制御することができました。

ゼロデイ脆弱性とは何かを知らない人のために説明すると、それはソフトウェアに存在するメーカー自身が知らないセキュリティホールのことです。ハッカーがこの脆弱性を狙う主な理由は、脆弱性に対するパッチや公開情報が存在しないためです。

このTikTokのゼロデイ脆弱性は、CNN、ソニー、パリス・ヒルトンのアカウントに影響を与え、乗っ取られました。

Semaphorによると、先週最初に妥協されたのはCNNのアカウントでした。その後、同様のサイバー攻撃がソニーとパリス・ヒルトンのアカウントを標的にしました。さらに悪用されるのを防ぐために、TikTokはこれらのアカウントをオフラインにしました。

TikTokのゼロデイ脆弱性はどのように発生したのか？
この事件を最初に報じたForbesによると、ハッカーは単に悪意のあるダイレクトメッセージを開くだけでアカウントを妥協させました。ファイルをダウンロードしたりリンクをクリックしたりする必要がなく、攻撃が簡単に実行でき、検出が難しいことが指摘されました。

TikTokのセキュリティチームを率いるアレックス・ハウレクはForbesに対し、「当社のセキュリティチームは、複数のブランドや著名人のアカウントを標的にした潜在的な悪用を認識しています。この攻撃を止めるための対策を講じ、今後の発生を防ぐために取り組んでいます。必要に応じて、影響を受けたアカウントの所有者と直接連絡を取り、アクセスを復元するために作業しています」と述べました。

TikTokはまた、妥協されたアカウントは少数であると通知しましたが、具体的な数字や脆弱性の詳細は完全に修正されるまで公表しませんでした。

過去のセキュリティ問題
TikTokがセキュリティ問題に直面したのはこれが初めてではありません。2022年8月、MicrosoftはTikTokのAndroidアプリに、ハッカーがワンタップでアカウントを乗っ取ることができる脆弱性を発見しました。TikTokは、攻撃者がユーザーの個人情報を盗んだり、プライバシー保護を回避したり、ユーザーのビデオを操作したりできるその他のセキュリティバグも修正しました。

別の例では、AppleはSafariやその他のウェブアプリを実行するWebKitのバグを修正するためのソフトウェアアップデートをリリースしました。このバグにより、影響を受けたデバイスで悪意のあるコードが実行される可能性がありました。AppleはこれをiPhone、iPad、Mac、Apple TVを含むすべてのデバイスで迅速に修正しました。

2023年中頃、TikTokはデータ保護法の複数の違反により、情報コミッショナー事務局（ICO）から1270万ポンドの罰金を科されました。これには、2020年に130万人以上の13歳未満の子供が保護者の同意なしにプラットフォームを使用することを許可したことが含まれます。これは、TikTokの利用規約に反しています。

ICOの調査により、TikTokが推定140万人の英国の13歳未満の子供がアカウントを作成し、プラットフォームを使用することを許可していたことが判明しました。これは、ユーザーが少なくとも13歳である必要があるという規則に反しています。

その結果、13歳未満の子供に情報社会サービスを提供する組織に対するUKデータ保護法の要件に従い、保護者や後見人の適切な同意や認可なしに子供のデータを不法に処理していました。

さらに、TikTokは特に子供

に対して、データの収集、使用、共有方法について明確で理解しやすい情報を提供することに失敗しました。この透明性の欠如により、ユーザーはプラットフォームとの関わりについて十分な情報を得た上で選択を行うことが困難になりました。 
続きを読む https://thecyberexpress.com/tiktok-zero-day-vulnerability/
VBA、この機能を実装してくれ！

# はじめに
私は業務でVBAを使ったマクロ開発する機会があるのですが、こんな機能が欲しいよ～というネタ満載記事です。

## 配列の要素数を取得する関数が仕様にない！
仕様にないので自分で作りました。

## 配列の要素数を取得するVBAマクロ

```
'配列の要素数を計算する関数
Function elem_count(ByVal max_elem As Integer, min_elem As Integer)
    Dim elem_sum As Integer
    elem_sum = max_elem - min_elem + 1
    elem_count = elem_sum
End Function
```
配列の要素数を取得する関数を実装してください、Microsoftさん

## 文字列の中に変数が組み込めない
ほんと苦労している、めんどくさい出力結果を結合演算子(&だったり+だったり)、関数(JoinやMid)でつなげたくないんです。

# 最後に
Microsoftさん、Office製品にPython実装してください!
(ベータ版あるけど)
誰かの技術記事をパクって投稿しろ

# はじめに

**誰かの書いた記事をそのままパクって投稿してもよい**

これは私がよくQiitaにアウトプットをするノウハウについて教えるときに驚かれる発言です。「パクる」と聞くとやってはいけないこととイメージするはずです。

技術記事においての「パクる」という行為は**誰かを救うことにつながります**

今回は「内容をパクって投稿する」というのが有効な状況とその理由を紹介していきます。
この内容を理解して実践することができれば、技術記事を投稿するハードルはさらに下がりアウトプットの習慣化につながるはずです。

# エラーを解決できた時を考える

プログラミングをしているとエラーに遭遇するのは日常茶飯
そこでネットを調べて最終的にQiitaをみて解決した経験は多くあるはずです。

**では質問です**

>10分かけてネットを調べた結果、遭遇したエラーと全く同じエラーについて書かれた記事があり、解決方法を試しら無事解決しました。このエラーについて記事を投稿したほうが良いでしょうか？

私は[プログラミングコーチングJISOU](https://projisou.jp)というサービスを運営しており、アウトプットについて多くの人に教えてきました。
その中でこの質問は定番で、聞くのですが9割の方が「**しない**」と答えます。

<font color="red">**答えは同じ内容でも記事を書くべきです**</font>

この記事を読んでいる方は、タイトルからも予想はできていたと思います。
では、なぜ記事にすべきなのでしょうか？

# 10分調べたなら同じ記事を書くべき理由

ここでのポイントは**10分調べた**というところにあります。
私は10分以上調べる行為をしたら絶対にエラーと解決方法を投稿するようにしています。

記事を投稿する理由はいくつかありますが

<font color="red">**自分と同じエラーに遭遇する人は世界中には誰か1人いて、その人が調べるのに使う10分を自分の記事をみることで救うことができる**</font>

これが大切です。エンジニアは助け合いの文化があります。
OSSは無料で誰でも利用できます。エンジニアは無償で誰かのために助けることが当たり前のように行われているのです。

**アウトプットも自分のためではなく、他人のためにすべきなのです**

ここまでの内容をしると**10分調べて解決した**ということは、**最初にネットで調べたキーワードでは記事がヒットしなかった**といいかえることができます。

調べるキーワードも多くの場合同じようなキーワードですることが多く、10分書けないと見つからない記事というのは「タイトル」がふさわしくないことが考えられます。

<font color="red">**あなたが調べた検索キーワードでヒットするようなタイトルをつけて同じ内容で技術記事を投稿することには価値があるのです**</font>

# そもそも記事を書くべき内容とは

技術的な内容は正直なところQiitaを利用しなくても公式ドキュメントをみればだいたいは解決できます。技術であれば基本的に公式ドキュメント(1次情報)にのっているはずです。つまりQiitaの記事はほぼ確実に2,3次情報になるのです

そもそもなぜQiitaやZennなどに技術記事をあげることがよいのでしょうか？

**エラー解決を早くできる**

というのが大きいです。エラーの内容をタイトルにして、そのエラーを解決ための方法をピンポイントで書いていることで、エラーに困った人はすぐに解決が可能です。

<font color="red">**「誰かの時間を救う」ということが技術記事においての大きな価値なのです。**</font>

ここを意識できるようになると他人のためにアウトプットができるようになり、どんなエラーでも「誰かの宝」と思えるようになりアウトプットが習慣化します。

# おわりに

今回は「記事をパクって投稿すべき理由」について紹介しました
アウトプットをなんとなくしている人が多いですが、なぜ自分がアウトプットしているのかという理由をハッキリさせることによってアウトプットの習慣化することにつながります。

ぜひともこの考え方を意識してアウトプットをしてみてください

ここまで読んでいただけた方はいいねとストックよろしくお願いします。
@Sicut_study をフォローいただけるととてもうれしく思います。

また明日の記事でお会いしましょう！

# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
実践的なカリキュラムで、あなたのエンジニアとしてのキャリアを最短で飛躍させましょう！
興味のある方は、ぜひホームページからお気軽にカウンセリングをお申し込みください！
▼▼▼

https://projisou.jp
GitHub Copilot、Visual Assist、IntelliSenseが同時にサジェスチョンしないようにする

### 概要

GitHub CopilotとVisual Assistを同時使用しているのですが、デフォルト設定のままではキーアサインが被るなどの問題でうまく使えなかったので、必要な設定をまとめました。

### GitHub CopilotとVisual Assistの共存の試み

例えば、以下ではGitHub Copilotは「bDirty = true;」、Visual Assistは「bool」をサジェスチョンしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66160/fa464a81-2618-24d5-f52d-12afc602ba2e.png)

どちらのプラグインもTabキーをサジェスチョンの採用にアサインしているので困ったことになります。この例ではTabキーを押すとVisual Assistが勝ち、GitHub Copilotのサジェスチョンを受け入れることができません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66160/8e5a61e9-feef-f7f9-aa7c-b035f1979b32.png)

この場合は、Visual Assistの受け入れキーをEnterに設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66160/7411947d-f894-e40e-051b-c551641294ad.png)

GitHub Copilotの受け入れはTabキー、Visual Assistの受け入れはEnterになり、キーアサイン的には共存できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66160/ad462756-f7b6-6fb8-53c0-d570e1c15f72.png)

### GitHub Copilotの複数行サジェスチョンがVisual Assistに隠される

解決したようにみえますが、GitHub Copilotが複数行のサジェスチョンを行った時、Visual Assistのサジェスチョンがそれを隠してしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66160/ead45d78-a200-76aa-bc56-ef90de5a18c3.png)

Visual Assistがサジェスチョンをしないように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66160/54763fce-6a45-f646-8e8c-140bc3ad5e20.png)

### GitHub CopilotがIntelliSenseに影響されないようにする

Visual Assistのサジェスチョンを切ると、今度はIntelliSenseとGitHub Copilotが同時にサジェスチョンを行うようになります。先程のVisual Assistの場合と異なり両者は連動しているように見えますが、IntelliSenseが間に入ることで欲しくない結果に誘導されることがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66160/0f73e882-c050-9df0-c8f5-473426f27596.png)

以下からIntelliSenseを切ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66160/e60cce1a-d13b-2b40-7b08-9c6ead80974d.png)
HTTP Error 500.35 - ANCM Multiple In-Process Applications in same Process が出たときの解消法

# 概要

少し古めのASP.NET Coreアプリケーションをデプロイしたときに、エラーで起動できませんでした。

# エラー内容

```
HTTP Error 500.35 - ANCM Multiple In-Process Applications in same Process
Common solutions to this issue:
Select a different application pool to create another in-process application.
Troubleshooting steps:
Check the system event log for error messages
Enable logging the application process' stdout messages
Attach a debugger to the application process and inspect
For more information visit: https://go.microsoft.com/fwlink/?LinkID=2028526
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7886/67c8a14e-08ab-af7f-35bf-706b28494589.png)

# 解消方法

- [HTTP Error 500.35 - ANCM Multiple In-Process Applications in same Process ASP.NET Core 3](https://stackoverflow.com/questions/58246822/http-error-500-35-ancm-multiple-in-process-applications-in-same-process-asp-ne)
  - .vsディレクトリを消しても直りませんでした
  - `applicationhost.config`ファイルは生成されませんでした
  - Azure Web Appsでのアプリケーションプール設定が上手く見つけられなかったので試していません
  - ***`web.config`を修正する：上手くいきました***

## `web.config`の修正結果

```diff_xml
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
-        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
+        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
       </handlers>
      <aspNetCore processPath="dotnet" arguments=".\test-app.dll" stdoutLogEnabled="false" stdoutLogFile="\\?\%home%\LogFiles\stdout" hostingModel="inprocess" />
    </system.webServer>
  </location>
</configuration>
```

# 雑感

今回は急ぎだったので、まずは修正できてよかった。
ただ、根本的な原因が全く理解できていないので、あとで調査する。

以上。
[Flutter] MediaQuery or FractionallySizedBox レスポンシブ対応について

# 概要

MediaQuery と FractionallySizedBox はどちらも Flutter においてレイアウトを管理するためのウィジェットですが、それぞれの目的と使用方法は異なります。以下にそれぞれの違いと使用例を残します。

# MediaQueryとは
画面のサイズやデバイスの特性に関する情報を取得するためのウィジェットです。レイアウトを調整するために、デバイスの画面サイズ、画面の向き、デバイスのピクセル密度などを取得できます。これにより、異なるデバイスや画面サイズに対してレスポンシブなデザインを実現することが可能です。

###  使用例

以下は、MediaQuery を使用して画面の幅を取得し、それに基づいてウィジェットのサイズを調整する例です。

```dart
import 'package:flutter/material.dart';

class MyResponsiveWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final screenWidth = MediaQuery.of(context).size.width;

    return Container(
      width: screenWidth * 0.5, // 画面幅の50%に設定
      height: 200,
      color: Colors.blue,
      child: Center(
        child: Text('Responsive Widget'),
      ),
    );
  }
}
```

# FractionallySizedBoxとは
親のサイズに対する割合で自身のサイズを設定するためのウィジェットです。指定された幅と高さの割合に基づいて、ウィジェットのサイズを調整します。このウィジェットは、親のサイズが変動する場合に、そのサイズに依存してWidgetのサイズを調整したい場合に便利です。

### 使用例
以下はFractionallySizedBoxを使用して親ウィジェットの幅の50%、高さの25%にサイズを設定する例です。
```dart
import 'package:flutter/material.dart';

class MyFractionalWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.red,
      width: 300,  // 親ウィジェットの幅
      height: 300, // 親ウィジェットの高さ
      child: FractionallySizedBox(
        widthFactor: 0.5,  // 親の幅の50%
        heightFactor: 0.25, // 親の高さの25%
        child: Container(
          color: Colors.blue,
          child: Center(
            child: Text('Fractional Widget'),
          ),
        ),
      ),
    );
  }
}

```

# 比較してみた
### MediaQueryを使った場合

```dart
Container(
  width: MediaQuery.of(context).size.width * 0.5,
  height: MediaQuery.of(context).size.height * 0.5,
  color: Colors.blue,
);
```

用途：デバイスや画面の情報を取得するために使用。
利点：画面の幅、高さ、ピクセル密度、向きなど、さまざまな情報を提供。
デメリット：サイズ設定のコードが冗長になりがち。


### FractionallySizedBoxを使った場合

```dart
FractionallySizedBox(
  widthFactor: 0.5,  // 親の幅の50%
  heightFactor: 0.5, // 親の高さの50%
  child: Container(color: Colors.blue),
);
```
用途：親ウィジェットのサイズに対する相対的なサイズ設定。
利点：コードがシンプルで直感的、動的なレイアウト変更に対応、レスポンシブデザインのサポート、コードの可読性と保守性の向上。
デメリット：親ウィジェットのサイズに依存するため、デバイス全体の情報を取得するのには適していない。

また、FractionallySizedBoxはconstを使用できるため、コンパイル時定数としてインスタンス化できるという利点があります。これにより、パフォーマンスが向上しアプリケーションのメモリ効率が良くなります。

# まとめ
FractionallySizedBox は静的なレイアウト構築や、親のサイズに応じた相対的なレイアウト設定において非常に便利であり、特にパフォーマンスとメモリ効率を重視する場合に優れています。一方で、デバイス情報に依存するレイアウトには MediaQuery が必要です。

## 参考リンク
https://api.flutter.dev/flutter/widgets/FractionallySizedBox-class.html

https://api.flutter.dev/flutter/widgets/MediaQuery-class.html
【Docker】古いDocker imageを使用した時にパッケージが見つからない

# はじめに

古いDocker imageを使用する際に、apt-getでインストールしたいパッケージが見つからない時の打開策について、既出の方法ですが備忘録として残します。

# 概要

- 古いバージョンのPHP-apache の Docker imageでコンテナを作成したい
- Dockerfile の RUN で apt-get install しようとするとパッケージが見つからない
- Debian のバージョンが古くDocker imageで依存関係がサポートされていないため、アーカイブから参照するように設定する

# 古いバージョンのPHP-apache の Docker imageでコンテナを作成したい

下記の内容でDocker fileを作成

```dockerfile
FROM php:5-apache

RUN apt-get update && apt-get install -y vim
```

# Dockerfile の RUN で apt-get install しようとするとパッケージが見つからない

build しようとすると下記のエラーが表示されます。

```
Err http://security.debian.org jessie/updates/main amd64 packages 404 not found
Err http://security.debian.org jessie-updates main amd64 packages 404 not found
Err http://security.debian.org jessie/main amd64 packages 404 not found
```

# Debian のバージョンが古くDocker imageで依存関係がサポートされていないため、アーカイブから参照する

これは Docker image のバージョンが古くサポートが終了していることが原因のため、インストールしたいパッケージをアーカイブから参照する必要があります。

具体的には Dockerfile の RUN に

```dockerfile
FROM php:5-apache

RUN echo "deb http://archive.debian.org/debian/ jessie main" > /etc/apt/sources.list \
    && echo "deb http://archive.debian.org/debian-security jessie/updates main" >> /etc/apt/sources.list \
    # 上2行を追加
    && apt-get update && apt-get install -y vim
```

コンテナ内にある /etc/apt/sources.list に書いてある情報を基にリソースを参照しているため、そこに追記してあげます。

メインの問題はこれで解決しますが、 実際に上記の内容で vim をインストールするには、コマンドのオプションに```--force-yes```をつけてあげる必要があります。

# 余談

Debianのコードネームはトイストーリーのキャラが由来みたいです。
Javaで「do..while文を使った繰り返し処理」の動作を確認してみた

# 概要

Javaで「do..while文を使った繰り返し処理」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/for/index7.html

# 実装

以下のファイルを作成しました。
```JSample7_1.java
import java.util.Random;

class JSample7_1{
  public static void main(String[] args){
    int num;
    Random rand = new Random();

    System.out.println("6が出たら終わりです");

    do{
      num = rand.nextInt(6) + 1;
      System.out.println("no = " + num);
    }while (num != 6);
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample7_1.java 
$ java JSample7_1 
6が出たら終わりです
no = 5
no = 2
no = 4
no = 5
no = 2
no = 6
```

# まとめ

何かの役に立てばと。
Node-RED MCU Edition用の画像表示ノードを作ってみた

# はじめに

Node-RED MCU EditionはMCU用のノードが少なく、Node-RED Dashboardで日本語を表示する方法と合わせて画像を表示する方法を調査していました。
Node-RED DashboardはModdableのPiuモジュールを使用しており、日本語を表示するにはフォントファイルを用意すれば実現できることがわかりました。

(Dashboardで日本語表示できるようにした経緯はこちら)

https://qiita.com/kitazaki/items/a59fad56db2d6ec99ee0

Piuで画像を表示するには、manifest.jsonで事前にリソース情報(画像)を定義する必要があり、サイネージ用途でデバイスに表示する(画像を切り替える)のは難しいと考えていました。

https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/piu/piu.md#image-object

# Moddable SDKのサンプルプログラム

Moddable SDKのサンプルプログラムの中を調査しているときに、CommodettoとPocoというグラフィックライブラリ・レンダリングエンジンを使用してJPEG/PNGをディスプレイに表示するプログラムを見つけました。

https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/commodetto/commodetto.md

examples/commodetto/jpeghttp
と
examples/commodetto/pngdisplay
がプログラムで、ブログ記事でも紹介されていることを確認しました。

https://moddable.com/blog/pngdisplay/

# Moddable SDKのサンプルプログラムをNode-RED MCU Editionのノードへ移植する

Node-RED MCU Editionのサードパーティノードを作成するノウハウは過去の補足書を参考にしました。

https://techbookfest.org/product/46zXPBxGAEdcF5zcxK5MD1

https://norahack-led.booth.pm/items/5721173

最初にJPEG画像をデバイス(シミュレーター)に表示することができました。

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/242f31cd-e207-12ef-b541-7f5084a15096.jpeg)

PNG画像の表示は少し苦労しました(必要なライブラリやモジュールが足りず、シミュレータでエラーが表示されました)が、JPEGと同じように表示することができました。

![flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/30ca243a-7667-ef9c-3939-fbed9b18b5d4.png)

![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/ec4e2d01-6735-d7e0-006f-e72e07eb8f1a.png)

npmとNode-REDノードライブラリに登録しましたので、ぜひご利用ください！

https://www.npmjs.com/package/@kitazaki/node-red-contrib-mcu-display-image

https://flows.nodered.org/node/@kitazaki/node-red-contrib-mcu-display-image

https://github.com/kitazaki/node-red-contrib-mcu-display-image

# デバイスでPNG画像を表示できない (2024年6月8日追記)

シミュレーターではPNG画像の表示は問題ありませんが、実際にデバイスで表示させようとすると、メモリ不足やzlibライブラリの初期化でエラーが表示されます。

![____________________________2024-06-06_20.16.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/732eaffa-c72f-0b99-f384-9f035e3eeb06.png)

![____________________________2024-06-06_20.42.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/3904e884-ada4-30f8-940a-e978b62f3727.png)

JPEG画像でもサイズによってデバイスでは表示できない場合があることがわかりました。

Moddable SDKのGitHubでissueを上げたところ、zlibライブラリの初期化には画像ファイルのサイズによらず、ある程度のメモリ容量が必要であることがわかりました。

https://github.com/Moddable-OpenSource/moddable/issues/1353

PSRAM(8MB)を積んだデバイス(M5Stack Core2、など)では問題なく表示されることを確認しました。

![m5core2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/06ce6364-5785-6345-3ffd-6062d9a7aa6e.jpeg)

![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/9a31d81e-3302-ac15-357b-199b943a109e.jpeg)

デバイスで画像を表示する場合はJPEGをおすすめします。PNG画像を使用する場合はお気をつけください！
eglot-booster

## 導入のきっかけ
eglotってVsCodeのlspと比較して遅すぎませんか？（clangdはそれほどでもないけど、特にtypescript-language-serverはコードのパースに時間がかかりすぎる）。
eglot-boosterの導入でだいぶん改善されました。ロースペックな環境で仕事をしているほど改善を実感できると思います。
## ステップ１ emacs-lsp-boosterのインストール
まずは[emacs-lsp-booster](https://github.com/blahgeek/emacs-lsp-booster)をインストールします。
- Arch系ならyay、FreeBSDならpkgでインストール
- LinuxMintの場合、releaseのページからバイナリをダウンロード
    - ぼくの環境では`~/.local/bin/`に置いた場合、eglot-boosterが見つけてくれなかったので、`/usr/bin/emacs-lsp-booster`にリンクを作成しました
## ステップ２ eglot-boosterのインストールと設定
次に[eglot-booster](https://github.com/jdtsmith/eglot-booster)を導入します。
- READMEの指示に従って`M-x package-vc-install`を起動し、`https://github.com/jdtsmith/eglot-booster`をペーストしてパッケージを導入
- init.elに下記を追加
```
(use-package eglot-booster
	:after eglot
	:config	(eglot-booster-mode))
```
## 結果
- 特にTypeScriptでeglotの動作の改善が見られました
- 昨日アップグレードしたFreeBSD 14.1でも問題なく動作しています
- emacs-lsp-booster自体はとてもメモリーフレンドリーです
![スクリーンショット_2024-06-05_11-16-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385798/7d36c1c8-51ab-8913-4f9c-6521bc03f8cc.png)
M5Stackでアナログ入力するメモ

M5Stackでアナログ入力(analogRead)するとき用のメモです。

## 配線
3ピンの可変抵抗などを想定して配線する。~~抵抗10KΩを使用する~~入力pinは36に設定。
![スクリーンショット 2024-06-05 18.04.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191122/ae968b1d-ee26-3515-4592-84d26d506f73.png)
上図の抵抗はいりませんでした。


## Arduino IDE
0〜4095で値が取れる。```analogReadMilliVolts()```という関数もあるらしい。

```C++
#include <M5Stack.h>

void setup() {
  M5.begin();
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setTextColor(WHITE, BLACK);
  M5.lcd.setTextSize(2);  
  M5.Lcd.println("analogRead pin36");
  pinMode(36, INPUT);
}

void loop() {
  int val = analogRead(36);  //0~4095
  M5.Lcd.setCursor(10, 50);
  M5.Lcd.print("value : ");
  M5.Lcd.print(val);
  M5.Lcd.print("     ");
}

```

## UIFLOW
``` WIDTH_10BIT```で取得できる値を0〜1023に設定。
![スクリーンショット 2024-06-05 17.44.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191122/95c43c08-adf1-37c9-6259-da41a1792661.png)
AWS ECSにデプロイしたRailsが、特定のページでシャットダウンした際の対応まとめ。mini_racerのセグメンテーション違反

## 先に結論

JSランタイムのGemのmini_racerが何故かAWS ECS(Fargate)の環境下でセグメンテーション違反を起こし、Rails全体をクラッシュさせていた。
mini_racerを使わずに、nodejsを使うことで回避した。

## 症状
- 特定のページでいきなりPumaが落ちる
- AWSのECS環境でのみ落ちて、ローカルだと再現しない
    - Fargate(Dockerコンテナ)を利用


## ログ
ログの最新はこのような記載…何が原因かもよくわからずにいきなりpumaが落ちていることが分かる。
```
2024-06-03T08:14:48.983Z	7fbb3194d000-7fbb3194e000 r--p 00029000 103:00 567812 /lib/x86_64-linux-gnu/ld-2.31.so
2024-06-03T08:14:48.983Z	7fbb3194e000-7fbb3194f000 rw-p 0002a000 103:00 567812 /lib/x86_64-linux-gnu/ld-2.31.so
2024-06-03T08:14:48.983Z	7fbb3194f000-7fbb31950000 rw-p 00000000 00:00 0
2024-06-03T08:14:48.983Z	7fff19abe000-7fff1a4bd000 rw-p 00000000 00:00 0 [stack]
2024-06-03T08:14:48.983Z	7fff1a55e000-7fff1a562000 r--p 00000000 00:00 0 [vvar]
2024-06-03T08:14:48.983Z	7fff1a562000-7fff1a564000 r-xp 00000000 00:00 0 [vdso]
2024-06-03T08:14:48.983Z	ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
2024-06-03T08:14:49.857Z	bin/start_server.sh: line 24: 38 Aborted (core dumped) RAILS_ENV=${RAILS_ENV} bundle exec pumactl -F config/puma.rb start
```

エラーログを相当遡ると遡ると、mini_racerのセグメンテーション違反で落ちていることが分かる。
```
2024-06-03T08:14:48.776Z	/usr/local/bundle/gems/mini_racer-0.12.0/lib/mini_racer.rb:228: [BUG] Segmentation fault at 0x00007fbb2c828008
2024-06-03T08:14:48.776Z	ruby 3.0.5p211 (2022-11-24 revision ba5cf0f7c5) [x86_64-linux]
2024-06-03T08:14:48.776Z	-- Control frame information -----------------------------------------------
2024-06-03T08:14:48.776Z	c:0146 p:---- s:0924 e:000923 CFUNC :eval_unsafe
2024-06-03T08:14:48.776Z	c:0145 p:0010 s:0918 e:000917 BLOCK /usr/local/bundle/gems/mini_racer-0.12.0/lib/mini_racer.rb:228
2024-06-03T08:14:48.776Z	c:0144 p:0010 s:0915 e:000914 METHOD /usr/local/bundle/gems/mini_racer-0.12.0/lib/mini_racer.rb:348
```

なるほど、なにかしらのJSが動くページで落ちていた様子。

## 対応
mini_racerの使用を取りやめ、nodejsをランタイムとして利用。
ExecJSが勝手にnodejsを認識してくれるため、特に設定変更せずに載せ替えが可能。

具体的には…
- Gemfileからmini_racerを削除
- Dockerコンテナ生成時に処理される、DockerFileでnodejsをインストールするコマンドを追記
```:例
RUN apt-get install -y nodejs
```
をして、再度コンテナを上げ直したら問題なく起動した。
OpsRamp - SNMPTrap をアラートとして取り込む方法について

本記事では、OpsRamp で SNMPTrap をアラートとして取り込む方法について説明します。

# 概要
OpsRamp では、サーバーやネットワーク機器から OpsRamp Gateway に対して SNMPTrap を送信することによってアラートとして OpsRamp SaaS に取り込むことができます。

# 設定方法
Setup > Monitoring > SNMP Traps Configuration から設定することが可能です。

![snmptrap-config2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/68b1ec8b-0492-d34c-0b4b-932571c12de7.png)

**OIDs** セクションでは、取り込むまたは取り込まない SNMPTrap OID を設定します。入力した OID 配下すべてが対象となります。

:::note warn
Exclude および Include は、併用することはできません。 
:::

**Devices** セクションでは、SNMPTrap を受け付ける送信するデバイスの対象を設定します。
| 項目 | 設定 |
|:-:|:-:|
| Receive traps from all devices. | すべてのデバイスからの SNMPTrap を受け付けます。 |
| Receive traps from specified device groups only. | 指定されたデバイスグループに属するデバイスからの SNMPTrap のみを受け付けます。 |
| Receive traps from specified devices only. | 指定されたデバイスからの SNMPTrap のみを受け付けます。 |
| Discard traps from specific IP addresses. | 指定した IP アドレスからの SNMPTrap は受け付けません。 |

---------------------------------------
[<img width = 250 height = 200 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/111de30a-4d33-aa33-5c7d-83d9015093e6.png">](https://www.vistanet.jp/knowledge-base/)
Heroku - Authenticatorアプリログイン切れてMFA検証で詰む


注意：無知、ケアレスミス多めの人間による記事

Androidにて、Herokuの認証用にインストールしていたいわゆる二段階認証アプリ（正式名称はMFA検証）が、アプリ削除していてログインができなくなってしまった(使用していないアプリを一括アンインストールする機能で消してしまったっぽい)。

https://devcenter.heroku.com/ja/articles/salesforceauthenticator

ポートフォリオ用に契約していたDBの値段、いくらだっけ...?と思いログインしようとしたところ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666726/a29ff760-055f-860a-094e-ae0843beb18d.png)

この画面、しかし来るはずの通知が来ない。
調べたところ、直接Herokuサポートチームにメールするのがよさそう。

https://note.com/ricooooooopin/n/nb7b05134d423

※注意点として、Herokuにログインしているメールアドレスからヘルプメールを送信すること
でないと、「[Heroku Support] Unknown account」という件名で
「Herokuの知らないメールアドレスからメールを送りましたね？(要約)」というメールが届くので再度登録しているメールアドレスで出直すことに

文面はこちら

    (困っている内容、今回だと認証アプリのログインが切れてMFA検証ができない)
    
    ・gitとherokuのメールアドレス(git logでHerokuからのデプロイ情報を見ると、メールアドレスがgitとherokuで違っていた(落ち着いたら統一しよう...))
    ・githubアカウント名
    ・接続された GitHub リポジトリ名(git logで出てきた内容に記載)
    ・デプロイされたアプリケーションの名前
    ・各アプリケーションの最新のコミット SHA とデプロイメント日

必要な情報の確認方法は以下の通りです

    $ cd (プロジェクトファイルのあるディレクトリ)

    $ git log

すると、コミット情報が出てくるので、githubアカウント情報などをコピペします。

時間に余裕を持ちましょう。日本時間で真夜中ぐらいからHerokuサポートチームさんは動いてくださいます。
>Heroku の営業時間は、米国の祝日を除く月曜日から金曜日の午前 9 時から午後 9 時（東部標準時）です。(自動返信メールより引用)

また、不足情報もあると思ったほうがいいのでメールは頻繁に確認します。
人に動いてもらっている以上、それなりの緊張感があります。

なお、気になったDBのねだんですが、一番安いプランを契約した記憶があるので値段は月5ドル。円高なので月額 780.72 円(2024年6月5日　17:22時点)

なお、今日の失敗を繰り返さないためにも適当に入れたアプリの記憶がなくても「消したらまずいな」というのはわかるようにしておきます。

アプリ名を編集するプラグインにて、わかりやすいようにAuthenticatorに 予め Herokuと記入した(Oppo Reno7Aで初めて見た機能なのでできない人はアプリアイコン・アプリ名 表示カスタム専用のアプリを入れたりしよう)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666726/3c405e99-c967-90e3-9d1b-c7f9b27e44f0.png)

初期アプリ名はAuthenticator、Herokuのアプリということがわかればいいので雑に記載。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666726/9974fd19-cbfd-47c5-5917-50ed6cf034ae.png)

追記

アカウントが復旧できました(午後18時ごろに追加情報を送ってくださいというメールが来ました)。なお、ログインできない以上、調べられる情報は少ないのだが(スクリーンショットを取っておいたほうがいい)課金していたので請求先の郵便番号があってよかった。

で、無事ログインできたので使える追加認証の方法をいくつか追加。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666726/e1d14b6a-b861-1b1b-f059-0ad86022b564.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666726/aeed8e44-8308-e2d1-5973-41b5218016db.png)

ずっと下触って「あれ？Authenticator...Authenticator(メガネメガネ...)」となってましたが普通に上の「Salesforce Authenticator」から端末を再設定。

ついでに、もう改修・プッシュする予定がないのでリカバリーコードもローカルのプロジェクトファイルにぶち込みました(セキュリティ上この方法がいいのかはわからないです、たぶんよくありません )。
firefox拡張機能で英文を読む

## なにこれ？

既に知ってる人も多いと思いますが、拡張機能の「Simple Translate」を使って、英文をその場で簡単に翻訳して読もう、という記事です。
これを使えば、大体の文章が読めるようになります。

拡張機能を使うとこんな感じ　-->
![Screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634654/247ad207-5db1-532b-927d-2ac2dc5daa20.png)

## 使い方

1. アドオンから [Simple Translate](https://addons.mozilla.org/ja/firefox/addon/simple-translate/) を入れる
2. target languageを日本語に設定
3. display translation panelにチェック

基本設定は以上です。
show translation candidatesも有効にすると、単語を指定したときに複数の翻訳結果を表示してくれます。

適当な英文を見つけて選択すると、上のように翻訳が表示されるはずです。
これを使えば、今まで意味不明で翻訳する気にもならなかった英文から情報が得られやすくなります。
デメリットとして、原文を読むのが非常にめんどくさくなります。
早く言語の壁が無くなってほしいですね。
Power Automateでnullの取り扱いが変わりました。

Power Automateでnullの取り扱いが変わり、一部フローでエラーが出ました。
仕様が変更されたのは2024/5/10以降です。

変数の設定で空白文字を入れるために「""」と入力していた2か所、片方は文字列として扱ったので「""」が表示されます。もう一つはメールアドレスの設定だったので、わざわざエスケープがついて「%"%"」が入り、メールアドレスとして認識されずエラーになりました。

変数の設定で空白にする場合は関数の「null」を入れてください。
vbsの作法 その79

# 概要
vbsの作法、調べてみた。
vbsで、Officeの25桁のプロダクトIDを取得する方法、見つけた。


# 参考にしたページ

https://gist.github.com/gcch/692a5166c9c0fa47f08b0c50a06b2872



以上。
Visual StudioでUnreal Engineを使う時Error Listで不要なIntelliSenseエラーが通知されるのを止めたい

### 概要

Unreal Engineを使った開発中にコンパイルエラーを出すと、デフォルトでは開発に不要なエラーまで一緒に表示され、その都度思考を妨げられてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66160/5128136c-abcd-f99f-1215-9cddd0121c3b.png)

### 解決法１：IntelliSenseエラーを表示しない

不要なエラーは、IntelliSenseによるエラーです。

以下プルダウンメニューを「Build Only」に設定すると、IltelliSenseエラーを除外し、ビルドエラーのみ表示されるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66160/fb285c52-a0e4-518e-5d4b-a3d162c3d299.png)

### 解決法２：Error Listタブを自動で開かない

Error Listタブそのものが不要であれば、それを自動で開かないように設定します。

メニューの Tools -> Options からOptionsウィンドウを開き、Projects and Solutions -> General -> Always show Error List if build finishes with errors を切ります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66160/0de71e10-57d4-6687-4c5b-c68b30df6bb2.png)

するとビルドに失敗した場合、ビルドのOutputログがそのまま表示され続けるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66160/f8630981-2ffe-2384-58a5-71a6c4602131.png)
javaとtypescriptの開発3日目

前回からToDoアプリケーションを作成しました。
ブラウザ表示は簡素なものとなっていますが、サーバーからCRUPを行うAPIを実行できるようになっているので満足しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631649/7dd124f0-7f14-3d9c-d0f9-915788ee25d3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631649/bacca9ca-8cbe-be03-d160-94139d8d5404.png)


最終的にこのようなディレクトリ構造になりました。
後学のために各ファイルの役割をメモも併せて記載するとこうなります。

my-java-ts-project/
├── demo/                  # バックエンド (Spring Boot)
│   ├── Dockerfile         # Dockerイメージをビルドするための設定ファイル
│   ├── pom.xml            # プロジェクトの依存関係を管理するMaven設定ファイル
│   ├── mvnw               
│   ├── .mvn/              
│   └── src/               
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── example/
│       │   │           └── demo/
│       │   │               ├── DemoApplication.java    # Spring Bootアプリケーションのエントリーポイント
│       │   │               ├── Task.java               # タスクエンティティクラス
│       │   │               ├── TaskController.java     # タスクコントローラークラス (APIエンドポイント)
│       │   │               └── TaskRepository.java     # タスクリポジトリ
│       │   └── resources/
│       │       └── application.properties             # Spring Bootアプリケーションの設定ファイル
│       └── test/
│           └── java/
├── my-app/                # フロントエンド (React)
│   ├── Dockerfile         
│   ├── package.json       # プロジェクトの依存関係を管理するファイル
│   ├── package-lock.json  # 依存関係の固定ファイル
│   ├── public/            # 公開リソース（HTMLファイルなど）
│   └── src/               # ソースコード
│       ├── index.tsx      # アプリケーションのエントリーポイント
│       ├── App.tsx        # アプリケーションのメインコンポーネント
│       ├── api/
│       │   └── tasks.ts   # タスクのAPI通信を管理するファイル
│       ├── components/
│       │   ├── TaskForm.tsx   # 新しいタスクを追加するフォームコンポーネント
│       │   └── TaskList.tsx   # タスクリストを表示するコンポーネント
│       ├── types.ts           # 共通の型定義ファイル
│       └── index.css      # アプリケーションのスタイルシート
├── mysql/                 # MySQL設定
│   ├── my.cnf             # MySQLの設定ファイル
│   └── init.sql           # データベース初期化スクリプト
└── docker-compose.yml     # 複数のDockerコンテナを管理するための設定ファイル

一旦はこのディレクトリ構成を基準に別アプリの作成や、見た目の修正を行っていこうと思います。
Xcodeのクソデカ シミュレーターインストールをマシにする

ニッポンニンゲンという動物は見栄を張ってクソ高いiPhoneを買うのが大好きです。そしてアップル社はApp Storeからの収益を手放さないためにウェブアプリの普及を妨害しています。するといつかはその圧力に屈してiOS用にアプリを作らないといけないことになります。
iOS用にアプリを開発するにあたって、しかたなくマッキントッシュのマシンを使わされることになりますが、残念ながらマッキントッシュは開発者向けマシンではないため、開発者のUXは軽視されています。

今回はアップル社によるクソ開発者体験の1つである、Xcodeのシミュレーターのインストールをマシにする方法をまとめます。
まずXcodeがクソデカなのでクソみたいにインストールに時間を要しますが、さらに実際にiOS用にアプリを開発するためにはiOS用のシミュレーターをインストールしないといけません。しかしこのシミュレーターの追加パッケージの容量が7GB以上もあるため、安定したネットワーク回線がないとインストールに失敗します。しかもインストールに失敗すると途中からダウンロードを再開してくれません。何度も最初からやり直す必要があります。

# ランタイムを別途インストールする

がんばってネット検索すると、実はシミュレーターのランタイムは開発者用のウェブサイトからダウンロードすることも可能だとわかります([公式ドキュメント](https://developer.apple.com/documentation/xcode/installing-additional-simulator-runtimes#Install-and-manage-Simulator-runtimes-from-the-command-line))。
ただ、ダウンロードページはログインしないと閲覧できません。ダウンロード用URLをコピーしてもそのままでは使えないのです。

# curlでダウンロードをマシにする

さて、ブラウザーからダウンロードしたら結局一緒です。7GBのクソデカファイルを安定してダウンロードする回線が必要になります。
UbuntuのOSイメージとかだったら3GBくらいでも公式にtorrentが用意されています。そういう当たり前のUX設計ができる会社になれるといいね！

仕方ないのでcurlコマンドを使いましょう。curlコマンドにはダウンロードを中断しても途中から再開する機能があります。マッキントッシュはいち早くマウスを取り入れたパソコンとしてのクソみたいなプライドがあってGUIばっかりゴリ押ししてきますが、やっぱりCLIは便利です。
もちろん、上述の通りログインしないとダウンロードできないという嫌がらせがされていますから、それを突破する必要があります。

# ダウンロード用のコマンドを取得する

Google Chromeを開いてください。開発者ツールを開いた状態で[ダウンロードページ](https://developer.apple.com/download/all/?q=Simulator%20Runtime)にログインし、必要なシミュレーターランタイムをダウンロードします。
保存用プロンプトが表示されたらキャンセルして構いません。これで開発者ツールの「Network」タブにdmgファイルのダウンロード履歴が表示されました。該当の項目を右クリックして「Copy -> Copy as cURL」を選択しましょう。以下のような内容がコピーされます。

```bash
curl 'https://download.developer.apple.com/Developer_Tools/iOS_17.5_Simulator_Runtime/iOS_17.5_Simulator_Runtime.dmg' \
  -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7' \
  -H 'Accept-Language: ja,en-US;q=0.9,en;q=0.8' \
  -H 'Connection: keep-alive' \
  -H 'Cookie: XID=xxxx; ......'
  ...
  ...
  -H 'sec-ch-ua-platform: "Linux"'
```

ここに保存時のファイル名 `--output <FILE>` と中断時の再開用オプション `-C -` をつけます。

```bash
curl -C - 'https://download.developer.apple.com/Developer_Tools/iOS_17.5_Simulator_Runtime/iOS_17.5_Simulator_Runtime.dmg' \
  --output ios17.dmg \
  -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7' \
  -H 'Accept-Language: ja,en-US;q=0.9,en;q=0.8' \
  -H 'Connection: keep-alive' \
  -H 'Cookie: XID=xxxx; ......'
  ...
  ...
  -H 'sec-ch-ua-platform: "Linux"'
```

途中でネットワークが遮断されてもまた同じコマンドを再実行するだけです。前回の続きからダウンロードしてくれます。

# ダウンロードしたランタイムファイルを使ってインストール

あとは公式ドキュメントに書いてあるとおり、以下のようにシミュレーターをインストールすれば完了です🎉

```bash
$ xcrun simctl runtime add "~/Downloads/watchOS 9 beta Simulator ios17.dmg"
```
新卒エンジニアのためのLinux基礎講座：概念からコマンドまで

## はじめに

新卒エンジニアの皆さん、Linuxの世界へようこそ！
学生時代にLinuxをたくさん触る機会が無かった方も多いのではないでしょうか？
この記事では、Linuxの基本的な概念とコマンドについて解説します。これを読めば、Linuxのディレクトリ構造や基本的なコマンド、設定ファイルについて理解できるようになります。
また、ローカル環境で気軽にコマンドを試せるよう、Windows上でLinuxコマンドを実行するためのWSL（Windows Subsystem for Linux）の設定方法も紹介します。

## WSLのインストールと設定

まず、Windows上でLinuxを使うためにWSLをインストールしましょう。
もしすでにLinuxのお試し環境がある場合はスキップして問題ないです。

### 手順

1. **PowerShellを管理者権限で開く**:
    - スタートメニューを開き、`PowerShell`を検索し、右クリックして「管理者として実行」を選択します。

2. **WSLを有効化する**:
    ```powershell
    wsl --install
    ```

3. **PCを再起動する**:
    - インストールが完了したら、PCを再起動します。

4. **Linuxディストリビューションを選択してインストールする**:
    - Microsoft Storeを開き、お好みのLinuxディストリビューション（例：Ubuntu）を検索してインストールします。

5. **インストールしたLinuxを起動する**:
    - スタートメニューからインストールしたLinuxディストリビューションを開き、初期設定（ユーザー名とパスワードの設定）を行います。

これで、Windows上でLinuxのコマンドを実行できるようになります。

## ディレクトリ構造

まず大まかなディレクトリ構造を理解しておくとコマンドの覚えも早いです。
Linuxのディレクトリ構造は階層的で、ルートディレクトリ `/` を起点とします。主なディレクトリは以下の通りです：

- `/bin` : 基本的なコマンドのバイナリファイルが格納されています。
- `/etc` : システム設定ファイルが格納されています。
- `/home` : 各ユーザーのホームディレクトリが格納されています。
- `/var` : ログファイルや一時ファイルが格納されています。

後に解説する`ls`と`cd`コマンドを使って自身の環境のディレクトリ構造を確認してみてください。

## 用語解説

- **ルートディレクトリ**：すべてのディレクトリの親となる `/` ディレクトリ。
- **カレントディレクトリ**：現在操作を行っているディレクトリ。`pwd` コマンドで確認できます。

## ディレクトリやファイル操作の基本コマンド

### ユースケース：プロジェクトのディレクトリとファイルの管理

以下では、Ubuntuを使用してプロジェクトのディレクトリやファイルを管理する具体的なユースケースを解説します。
実際にコマンドを打って動作を確認してみてください。

#### 1. ディレクトリの作成

新しいプロジェクトを開始するために、ディレクトリを作成します。

```bash
mkdir my_project
```

#### 2. ディレクトリの移動

作成したディレクトリに移動します。

```bash
cd my_project
```

#### 3. ファイルの作成

プロジェクトに必要なファイルを作成します。例えば、READMEファイルやスクリプトファイルなどです。

```bash
touch README.md script.sh
```

#### 4. ファイルの一覧表示

現在のディレクトリ内のファイルとディレクトリを確認します。

```bash
ls
```

#### 5. ファイルのコピー

テンプレートファイルをコピーして新しいファイルを作成します。

```bash
cp script.sh script_backup.sh
```

#### 6. ファイルの移動と名前変更

間違って作成したファイル名を変更します。

```bash
mv script_backup.sh script_old.sh
```

#### 7. ファイルの削除

不要なファイルを削除します。

```bash
rm script_old.sh
```

#### 8. サブディレクトリの作成と移動

プロジェクトの構造を整理するために、サブディレクトリを作成します。

```bash
mkdir src
cd src
```

## Linux特有の設定ファイルとその役割

- **`.bashrc`**：シェルの初期化ファイル。エイリアスや環境変数の設定に使用されます。
- **`/etc/fstab`**：ファイルシステムのマウント情報を設定するファイル。
- **`/etc/hosts`**：ホスト名とIPアドレスの対応を設定するファイル。

## ファイル編集の際のバックアップとお作法

ファイルを編集する際は、必ずバックアップを取りましょう。例えば、`example.txt` を編集する前に以下のようにバックアップを取ります：

```bash
cp example.txt example.txt.bak
```

また、編集中にミスをしてもバックアップがあれば元に戻せます。適切なファイルパーミッションの設定や、作業後のクリーンアップも重要です。

## まとめ

この記事では、Linuxの基本的なディレクトリ構造、用語、コマンド、設定ファイルについて解説しました。また、WSLを使ってWindows上でLinuxを実行する方法についても紹介しました。
新卒エンジニアの皆さんがこれらの基本を理解する助けになれたら嬉しいです。

これからも一緒に学んでいきましょう！
AsciiDocで設計書は果たして現実的なのか

# はじめに

最近、設計書をAsciiDocで書いてGitで管理することに挑戦しよう！という現場に行き会いました。
Gitで管理できないバイナリファイルつまり（つまりOffice系）はもう嫌だ！という動機で、AsciiDoc万歳の流れに乗った形なのですが、これは、このまま進んでいいのか？と思う点があったので、思い出しながら記事にするものです。

AsciiDocで検索すると「Gitで管理できて万歳！」みたいな情報ばっかり見たので、アンチテーゼとして公開したい気持ちもあります。

 # AsciiDocの利点はわかっているのだけど
 「軽い」とか「複数人で同時に編集できる」とか「簡単にきれいな文書ができる」とか。
 いろいろ見かけました。「壊れない」とかね。
 とはいえ、やはり1番の理由は「Gitで管理できる」これなのかなぁと思います。

 Excelの問題をAsciiDocは解決する！なのかなと。

 # AsciiDocには難点もいろいろ
 
 列挙してみます。
  - 表現はレンダリングエンジンに依存する
    マークダウンと違って記法に方言がないとはいえ、編集エディタ(VSCodeとか)と、Gitホスティングアプリ(Gitlabとか)と、PDF化した状態で、表現がぜんぜん違う。方言はないはずですが、文字色を変えても、エディタでは見えて、PDFでは見えない、みたいな問題もあったり。(直し方はあるんでしょうけど・・・)
  - ファイル構成が肥大化しがち(画像やcsvなど差し込みたいので)
  - お客さまウケがよくない、むしろ嫌がられる
  - 表が書きにくい
  - フロー(mermaid)やUMLも、便利だけど、いざ編集したいとなったら読解が大変
  - 吹き出しでコメントをつけたり、ちょっとした(Excelなら簡単にできた)ことができない

要するに、ExcelでできることがAsciiDocだとできない！！！のです。

# このまま進んでいいのだろうか？

で、タイトルの疑問に至ります。
上位互換というか、Excelでできることを全部できたうえで、さらにGitでも管理できて軽くて、だったら、問題ないと思うんです。
でも、Officeの設計書とAsciiDoc設計書は機能をトレードオフしている。
そうなると、あとはメリデメを比較してどっちをとる？という話になると思うんですね。

それは現場とステークホルダーの判断になるのでしょうけど、
少なくとも私個人はOfficeを推したいです。

 # AsciiDocで作る設計書の世界って？

「Gitで管理できて万歳！」みたいな意見をちらほら見るんです。
もう設計書はこれで書きたい！みたいな。
でも、じゃあ、実際ほんとにやってるプロジェクトってどれだけあるんだろう？
と、軽く調べてみたところ、すごい大御所的なやつが見つかりました。
設計書ではないのですが、[ProGit v2](https://git-scm.com/book/ja/v2)がAsciiDocでした。  
ソースコードも[こちら](https://github.com/progit/progit2)で公開されています。

そうです。ソースコードです。これはもうソースコードだと思うんです。
ソースコードの設計書をソースコードで書く的な世界です。
 
 「AsciiDocで設計書をつくる」を選択するなら、設計書の概念を根本から捉えなおすくらいの気構えがないといけないような気がします。


 なんだか、全体にちょっとボヤキっぽくてすみません。
 以上でした。
【神ツール】JSONデータをそのままぶち込むだけでTypeScriptの型を美しく返してくれる"JSON to TypeScript"

# なんだこれ？ただの神ツールか？
バリバリ現役エンジニアの方はご存じかもしれませんが、TypeScript初心者には是非知ってもらいたい神ツール。

その名も **「JSON to TypeScript」**

https://transform.tools/json-to-typescript

# 何が凄いのかを説明する
以前、記事にした初学者向けのReactアプリを開発しながら学べる社内研修用のアプリで、ポケモンAPIを使用した神経衰弱ゲームアプリを開発しました。

その時に、まあ画像がどこにあるかわからない。
とりあえず、POSTMANでapi叩いて中に入るとこんな感じ。

ポケモンAPI
https://pokeapi.co/api/v2/pokemon?limit=30

![スクリーンショット_060224_032754_PM.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492127/71454147-88a2-9428-9040-0485b5b5ce16.jpeg)

```
{
    "count": 1302,
    "next": "https://pokeapi.co/api/v2/pokemon?offset=30&limit=30",
    "previous": null,
    "results": [
        {
            "name": "bulbasaur",
            "url": "https://pokeapi.co/api/v2/pokemon/1/"
        },
        {
            "name": "ivysaur",
            "url": "https://pokeapi.co/api/v2/pokemon/2/"
        },
        {
            "name": "venusaur",
            "url": "https://pokeapi.co/api/v2/pokemon/3/"
        },
        {
            "name": "charmander",
            "url": "https://pokeapi.co/api/v2/pokemon/4/"
        },
        {
            "name": "charmeleon",
            "url": "https://pokeapi.co/api/v2/pokemon/5/"
        },
        
        以下、省略......
       
    ]
}
```

とりあえず最初のポケモンのURLを確認するとコレ
![スクリーンショット_060224_033038_PM.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492127/35d1fcd8-226b-9d5a-216b-8952e8e5901e.jpeg)

一応調べてみると`OfficialArtwork.front_default`という箇所が画像に該当するらしい。

そこで、神ツール[**JSON to TypeScript**](https://transform.tools/json-to-typescript)の登場です。

上記の大量の文字列をそのままコピペして貼り付けます。すると....
![スクリーンショット_060224_033958_PM.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492127/504b2567-60ca-ae70-1273-902270a74bed.jpeg)

あとはキーワードを検索して該当箇所を探すと発見できるので、ここから上の階層を辿ってコードに記載すれば取得できるという感じ
![スクリーンショット_060224_035126_PM.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492127/e8cd0d84-39eb-d88f-276a-37947ca41fad.jpeg)

実際に使用したコード
```typescript
const pokemonPromises = results.map(async (pokemon: any) => {
  const res = await axios.get(pokemon.url);
  return {
    name: pokemon.name,
    image: res.data.sprites.other['official-artwork'].front_default || '画像がありません'
  };
});
```

# まとめ

ツールの紹介なので短い記事になりましたが、型を使用しないにしても目的のdataが探しやすいし、もちろん型を使いたい時には最高のツールになるので、是非、初学者にこそ使用して欲しい神ツールの紹介でした。
Intel iMac (Sonoma 14.5) でChrome, Safari, Firefoxの三人ともクラッシュした話

# 何もしてないのに壊れましたー

2024/6/4あたりから、Amazonや楽天のサイトを見たChrome, Safari, Firefoxの三名が揃って豪快に終了するという事態に見舞われました。環境はIntel iMac(Sonoma 14.5)、ブラウザは全て最新版。

Appleのサーポトの方が、「iMac上に別なアカウントを作って、そこでやっても落ちますか？」とのことだったので、やってみたところ落ちず。ひとまずそちらで作業する、ということで一旦Closeとさせて頂きました。

# てことは個人の環境に問題があり？

SafariのクラッシュレポートではTextToSpeach周りで落ちている、Firefoxはローカルフォントの読込で落ちる、Chromeはクラッシュレポートなしという状況。

Safariのクラッシュレポートを見ると、どうも10行目にあるTextToSpeech周りで落ちているようです。流石純正アプリのクラッシュレポートは詳しい。

```
Thread 0 Crashed::  Dispatch queue: create-voices-avspeech
0   libsystem_kernel.dylib        	    0x7ff81574714a __pthread_kill + 10
1   libsystem_pthread.dylib       	    0x7ff81577febd pthread_kill + 262
2   libsystem_c.dylib             	    0x7ff8156a5a79 abort + 126
3   libc++abi.dylib               	    0x7ff815738922 abort_message + 241
4   libc++abi.dylib               	    0x7ff81572b12a demangling_terminate_handler() + 266
5   libobjc.A.dylib               	    0x7ff8153c800a _objc_terminate() + 96
6   libc++abi.dylib               	    0x7ff815737d7b std::__terminate(void (*)()) + 6
7   libc++abi.dylib               	    0x7ff815737d36 std::terminate() + 54
8   libdispatch.dylib             	    0x7ff8155dedd0 _dispatch_client_callout + 28
9   libdispatch.dylib             	    0x7ff8155ebd3c _dispatch_lane_barrier_sync_invoke_and_complete + 60
10  TextToSpeech                  	    0x7ff9292b2417 0x7ff929292000 + 132119
11  TextToSpeech                  	    0x7ff9292b22b3 0x7ff929292000 + 131763
12  WebCore                       	    0x7ff916e83ad7 WebCore::PlatformSpeechSynthesizer::initializeVoiceList() + 119
13  WebCore                       	    0x7ff918af28f8 WebCore::PlatformSpeechSynthesizer::voiceList() const + 24
・・・
```

「システム設定->アクセシビリティ->読み上げコンテンツ」を表示すると、あれま。
![スクリーンショット 2024-06-05 12.55.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188685/ce37398f-a89d-eb35-6aa9-e03f2a98838f.png)

設定ファイルがどれか見当を付けるため、新アカウントで読み上げコンテンツの設定を変更して、~/Library/Preferences 以下で直近に更新されたファイルを探します。すると

```
com.apple.SpeakSelection.plist
```

が怪しい。

# 成敗！
そこで元のアカウントで、
```
~/Library/Preferences/com.apple.SpeakSelection.plist
```
をデスクトップに待避。

再度 「システム設定->アクセシビリティ->読み上げコンテンツ」で表示すると上記設定エラーは解消、.plistファイルも無事に再作成されていました。

半日経ってもAmazonや楽天をはじめ色々サイトを回ってもクラッシュしないので、どうやらこれで直ったようです。やれやれだぜ。

# ホントに何もしていないの？

こんなとこピンポイントで触るわきゃねーだろ！、と思うのですが、何かはやったんでしょうね。
サーバー構築とは？メリット・種類・注意点について解説

![サーバー構築とは？メリット・種類・注意点について解説.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3544821/d3ad86b0-54d5-e805-2ada-f59289fd2274.png)

「サーバーを自社で構築する方法は？」「自社でサーバーを構築できる？」「外注化してサーバーを構築することは可能？費用を節約したい！」など、サーバー構築に関する悩みはよくあります。ここではサーバー構築について解説します。

<h2>サーバーとは

サーバーは、Webサイト閲覧時に重要な役割を果たします。URLを入力し、Enterを押すと、Webブラウザがサーバーにリクエストを送信します。サーバーはその要求に応じて、Webサイトのデータを提供します。その結果、ユーザーはWebサイトを閲覧できます。つまり、サーバーがなければ、Webサイトは閲覧できないのです。

<h2>サーバーの種類について

Webサービスを立ち上げる際に必要なサーバーは、レンタルサーバー、クラウドサーバー、VPSサーバー、専用サーバーの4種類です。

<h3>レンタルサーバー

既存のサーバーを利用し、自分で構築する手間を省くことができます。

<h3>クラウドサーバー

オンライン環境でいつでもアクセス可能で、コストやメンテナンスの利便性、セキュリティが向上します。

<h3>VPSサーバー

物理的なサーバーを複数のユーザーで共有し、専用サーバーと同様の作業が可能です。

<h3>専用サーバー

サーバーを一台独占し、スペックやセキュリティ面で優れていますが、費用や初期設定には時間がかかります。

<h2>サーバーを構築する方法

Webサーバーの場合、まずhttpサーバーをインストールし、Webコンテンツを配置します。次に、ファイルをSFTPでアップロードし、権限を変更してアクセスを可能にします。ドメインを取得し、PHPとデータベースをインストールします。最後にファイアウォールを設定し、WordPressをインストールします。

クラウドサーバーの場合、まずネットワーク設計図を作成し、必要なリソースを見積もります。次にリソースに従ってサーバーを設定し、ログインして起動します。最後に、管理画面で問題なく稼働しているか確認します。

<h2>サーバー構築のポイントについて

サーバー構築のポイントは以下の通りです。

<h3>目的別のサーバー選定

事業の目的に合わせて適切なスペックのサーバーを選びましょう。スペックが低すぎると将来的な拡大に対応できず、高すぎると経費を圧迫します。

<h3>セキュリティ性

サーバー攻撃からデータを保護するために、セキュリティ対策を十分に考慮しましょう。外部からのアクセスを制限することが重要です。

<h2>信頼性の高いサービス業者を選ぶ

信頼性の高いサービス業者を選定することで、サービス提供における安定性を確保しましょう。

<h3>十分な容量やスペックを持つサーバーを使う

価格だけでなく、必要なスペックや容量を考慮してサーバーを選びましょう。十分なリソースを持つことで、サービスの安定性を保つことができます。

<h2>サーバー構築代行のサービス内容

サーバー構築代行のサービス内容は以下の通りです。

<h3>状況をヒアリング

お客様の要望や現在の環境をヒアリングし、作業事項を確定します。見積もりを行い、納得ができればサービスの申し込みに進みます。

<h3>導入（サーバー構築）

申し込みが完了後、サーバー構築を行います。作業完了後に動作確認を行い、要望に沿ったスペックやアプリケーションの動作を確認します。

<h3>運用支援

サーバー構築後も日々の運用をサポートします。監視サーバーによる監視を行い、不具合発生時には事前に協議した対応手順に従って復旧を試みます。

<h3>まとめ

この記事で説明してきた内容をまとめると以下のとおりです。
・サーバーの種類
・サーバー構築の具体的な手順
・サーバー構築のポイントについて
・サーバー構築の依頼の流れについて

サーバー構築は重大な工程であるため、確実に行う必要があります。サーバー構築を専門的に行なっている企業にサーバー構築を外注化すれば、安全確実なサーバー構築を実現させることができるでしょう。

株式会社エイチビーラボでは、ベトナムに特化したオフショア開発サービスを提供しております。サーバー構築には豊富な実績があります。クラウドやITインフラ、システム関連でお困りの方は、ぜひお気軽にお問い合わせください。ご相談から、開発、運用まで親身にサポートいたします。

詳しくは下記の記事もご参照ください。
➡ <a href="https://hblab.co.jp/blog/server-construction/">サーバー構築とは？メリット・種類・注意点について解説 - HBLAB JSC</a>
[PHP] ある連想配列の一部だけキー付きで取り出して新たな連想配列に移す

ChatGPTさんに教えてもらいました。
覚え書き用ですが参考になりましたら幸いです。

## ある連想配列

例えばこういう連想配列があるとします。
``` sample.php
$arr1 = [
     'a' => $a,
     'b' => $b,
     'c' => $c,
     'd' => $d
 ];
 ```

 この配列の一部だけ利用して、新たな連想配列として定義したい場合のやり方です。

 ## 新たな連想配列
 この形に定義したいとします。
  ``` sample.php
$arr2 = [
     'b' => $b,
     'c' => $c
];
```
 ## やり方

 array_intersect_key関数を使用します。

 ``` sample.php
    $arr2 = array_intersect_key($arr1, array_flip(['b', 'c']));
 ```

###### $arr1とarray_flip(['b', 'c'])の両方のキーを比較し、重複するキー（'b'と'c'）のみを含む新しい配列を作成します。
 これにより、$arr1から'b'と'c'に対応する要素を取得することができます。
メモ

今日わかったことをとりあえず書き出しただけ

### yarn build
ビルドしてくれる

### serve -s client/dist
サーバを動かす

↑
netlify.tomlに書いてあったものを実行したが関係なさそう…
本当はgithubのreadMEに書いてある手順で実行すればできた

To start a server, go into the project folder and install dependencies/run start command:

cd SkyOffice or 'my-folder-name'
yarn && yarn start
To start a client, go into the client folder and install dependencies/run start command:

cd SkyOffice/client or 'my-folder-name/client'
yarn && yarn dev

### エラー

以下のエラーが出た

>npm ERR! gyp ERR! cwd C:\Users\rnbmx\Documents\GitHub\SkyOffice\node_modules\bcrypt
npm ERR! gyp ERR! node -v v18.17.1
npm ERR! gyp ERR! node-gyp -v v9.3.1
npm ERR! gyp ERR! not ok
npm ERR! node-pre-gyp ERR! build error
npm ERR! node-pre-gyp ERR! stack Error: Failed to execute 'C:\Program Files\nodejs\node.exe C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\bin\node-gyp.js configure --fallback-to-build --module=C:\Users\rnbmx\Documents\GitHub\SkyOffice\node_modules\bcrypt\lib\binding\napi-v3\bcrypt_lib.node --module_name=bcrypt_lib --module_path=C:\Users\rnbmx\Documents\GitHub\SkyOffice\node_modules\bcrypt\lib\binding\napi-v3 --napi_version=9 --node_abi_napi=napi --napi_build_version=3 --node_napi_label=napi-v3' (1)
npm ERR! node-pre-gyp ERR! stack     at ChildProcess.<anonymous> (C:\Users\rnbmx\Documents\GitHub\SkyOffice\node_modules\@mapbox\node-pre-gyp\lib\util\compile.js:89:23)
npm ERR! node-pre-gyp ERR! stack     at ChildProcess.emit (node:events:514:28)
npm ERR! node-pre-gyp ERR! stack     at maybeClose (node:internal/child_process:1091:16)
npm ERR! node-pre-gyp ERR! stack     at ChildProcess._handle.onexit (node:internal/child_process:302:5)
npm ERR! node-pre-gyp ERR! System Windows_NT 10.0.22621
npm ERR! node-pre-gyp ERR! command "C:\\Program Files\\nodejs\\node.exe" "C:\\Users\\rnbmx\\Documents\\GitHub\\SkyOffice\\node_modules\\@mapbox\\node-pre-gyp\\bin\\node-pre-gyp" "install" "--fallback-to-build"
npm ERR! node-pre-gyp ERR! cwd C:\Users\rnbmx\Documents\GitHub\SkyOffice\node_modules\bcrypt
npm ERR! node-pre-gyp ERR! node -v v18.17.1
npm ERR! node-pre-gyp ERR! node-pre-gyp -v v1.0.9
npm ERR! node-pre-gyp ERR! not ok
npm ERR! A complete log of this run can be found in: C:\Users\rnbmx\AppData\Local\npm-cache\_logs\2024-06-05T05_17_05_552Z-debug-0.log

インストールできてなかっただけだった

``` bcryptのインストール
npm install bcrypt
```

ローカルホストで動かせたけどまだ他のPCからはアクセスできない
【laravel】isDirtyとwasChangedの違い

**取得したEloquentモデルに変更があったか**を判定したいとき、どのときにどっちを使えばいいかよく忘れてしまうのでメモ

## 最初に結論

* DBに反映する前 - `isDirty`
* DBに反映した後 - `wasChanged`

## isDirty

Eloquentモデルが取得されてから値を変更したとき、**DBに反映する前まではtrueを返し、DBに反映された後はfalseを返す**

```DBに反映する前まではtrue.php
use App\Models\User;
 
$user = User::create([
    'first_name' => 'Taylor',
    'last_name' => 'Otwell',
    'title' => 'Developer',
]);
 
$user->title = 'Painter';
 
$user->isDirty(); // titleの値が変わっているのでtrue
 
$user->save(); // ここでDBに保存
 
$user->isDirty(); // 以降はfalseを返す
```

## wasChanged

Eloquentモデルが取得されてから値を変更したとき、**DBに反映する前まではfalseを返し、DBに反映された後はtrueを返す**

```DBに反映された後からtrue.php
use App\Models\User;
 
$user = User::create([
    'first_name' => 'Taylor',
    'last_name' => 'Otwell',
    'title' => 'Developer',
]);
 
$user->title = 'Painter';
 
$user->wasChanged(); // まだDBに反映していないのでfalse
 
$user->save(); // ここでDBに保存
 
$user->wasChanged(); // 保存したのでtrueを返すようになる
```

## 参考

https://laravel.com/docs/11.x/eloquent#examining-attribute-changes