OmniAICreator/Qiita-1.07M huggingface dataset:
lightning record page の問題


+ [I am not able to enter Enhanced case layout under label while creating lightning record page .It is showing the error 'This field is required ' even after entering the label and giving object as case.Today is certification maintenance due date please help](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007bLHxo)


別のデバイスからだと修正できたことを考えるとブラウザの問題、キャッシュかもしれません。

:::note
I had tried several tines in my laptop and it didn't work. When i edited the lightning record page name and api name by logging in through my phone it worked.😊👍

ラップトップでいくつかの歯を試しましたが、うまくいきませんでした。携帯電話からログインして Lightning Record ページ名と API 名を編集すると、うまくいきました
:::


+ [duplicate value found: FlexiPageId duplicates value on record with id: 0M27j000000Sii5](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000HjeXW)

# エラー

+ [Lightningページを保存しようとすると「コンポーネント「項目セクション」の表示条件「0」が無効です。」とエラーが出ます。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007clmga)

:::note
同じエラーに直面して解決しました。

項目セクションの表示条件に設定してる選択リスト項目の値変更が原因でした。

例

選択リスト項目「商談タイプ」に値「Aタイプ」「Bタイプ」の2種があって、それぞれで表示条件を設定した
↓
値「Aタイプ」を「Cタイプ」に変更した
↓
項目セクションの表示条件が不可能な設定状況だからエラーが出た
↓
表示条件を値「Cタイプ」に変更したら保存できた。

項目セクションの表示条件に関係する項目を直近で変更してないかご確認ください。
:::
Fedora39でminikube - インストールと起動(2)

[Fedora39でminikube - インストールと起動(1)](https://qiita.com/intrajp/items/f7a463a79a3d8e9634f4)からの続きです。

ここで、docker info は次のようになっています。

```BASH
@fedora:~$ docker info
Client:
 Context:    rootless
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc., v0.13.1)
  compose: Docker Compose (Docker Inc., v2.26.1)

Server:
 Containers: 12
  Running: 0
  Paused: 0
  Stopped: 12
 Images: 4
 Server Version: 20.10.21
 Storage Driver: btrfs
  Build Version: Btrfs v5.10.1 
  Library Version: 102
 Logging Driver: json-file
 Cgroup Driver: systemd
 Cgroup Version: 2
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 1c90a442489720eec95342e1789ee8a5e1b9536f
 runc version: v1.1.4-0-g5fd4c4d1
 init version: de40ad0
 Security Options:
  seccomp
   Profile: default
  rootless
  cgroupns
 Kernel Version: 6.8.4-200.fc39.x86_64
 Operating System: Fedora Linux 39 (Workstation Edition)
 OSType: linux
 Architecture: x86_64
 CPUs: 12
 Total Memory: 31.18GiB
 Name: fedora
 ID: 4MY5:2QGI:4SMT:QVLJ:QBEW:EIFL:M62R:J5BU:NQVG:SMV6:377Q:24RH
 Docker Root Dir: /home/<USER>/.local/share/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false
 Product License: Community Engine

WARNING: No cpuset support
```
Docker Root Dirです。
```BASH
fedora:~@ ls ~/.local/share/docker
btrfs  buildkit  containerd  containers  image  network  plugins  runtimes  swarm  tmp  trust  volumes
```

[Fedora39でminikube - クラスタと連携(1)](https://qiita.com/intrajp/items/c0a20a3256b739f5c22a)に続く
「巻き上げ」の誤解 ~function編~【JS】

# はじめに

先日、以下の記事にて`var` `const` `let`を対象とした巻き上げについて調べました。

https://qiita.com/kohki_takatama/items/0aeb419bda555f8c240e

すると`function`でも同様の現象が見られると教えていただきました。
今まで疑問だった、`function f() {}`と`const f = () => {}`の違いのひとつらしいです。検証してみましょう。

# 期待する挙動

## 1. `const`を使うと、期待するエラーを示す
`function`を定義する際、`const`を使うと正常にエラー（`ReferenceError: Cannot access before initialization`）を吐くが、`const`を使わないと`undefined`を示す。

つまり、
```js
f()
const f = function () {
  console.log('const_function!')
}
```

はエラーを吐くが、

```js
f()
function f() {
  console.log('function!')
}
```
これは`undefined`を示す

## 2. アロー関数でも代入でも挙動が変わらない

今回の論点において、以下の2つの挙動が変わらないこと（どちらも`ReferenceError: Cannot access 'cf' before initialization`を返す）
```js
f()
const f = function () {
  console.log('const_function!')
}
```

```js
f()
const f = () => {
  console.log('const_allow_function!)
}
```

# 検証結果

<font color="LimeGreen">ほぼ期待通り</font>でした。

（具体的な検証手順は後に示します）

1. `const`を使うと、期待するエラーを示す
→期待通り、`const`を使用すると`ReferenceError: Cannot access 'f' before initialization`を返しました。
期待と違ったのは、`const`を使用しないケースです。`undefined`を示すのではなく、正常に`function f`が動作しました。

2. アロー関数でも代入でも挙動が変わらない
→期待通り、`const`を使用する2パターンでは、どちらも`ReferenceError: Cannot access 'f' before initialization`を示しました。

# 検証手順

## 1. `const`を使うと、期待するエラーを示す

まず、以下のコードを実行し、一般的な記法での挙動を確認しました。
```js
f()

function f() {
  console.log('function!');
}
```
出力
```
function!
```

`undefined`を期待していましたが、なんと普通に動作しました。
それ定義してるの、未来の話なんだけど・・・と、タイムスリップしてる気分。

次に、以下のコードを実行し、`const`を使用したケースの挙動を確認しました。
```js
cf()

const cf = function() {
  console.log('const_function!')
}
```
出力
```
cf()
^

ReferenceError: Cannot access 'cf' before initialization
```

こちらは期待通り、`ReferenceError...before initialization`を吐いてくれました。

最後に、以上の2つを並べて実行してみました。

```js
f()

function f() {
  console.log('function!');
}

cf()

const cf = function() {
  console.log('const_function!')
}
```
出力
```
function!
/home/runner/testtdz/hoisting_of_function.js:7
cf()
^

ReferenceError: Cannot access 'cf' before initialization
```

`f()`の結果である`function!`が出力された後、`cf()`のエラーである`ReferenceError...before initialization`が表示されていますね。

# 2. アロー関数でも代入でも挙動が変わらない

先程検証していない「アローバージョン」を実行してみました。
```js
caf()

const caf = () => {
  console.log('const_allow_function!');
}
```
出力
```
caf()
^

ReferenceError: Cannot access 'caf' before initialization
```

予想通り、アローバージョンでも`ReferenceError...before initialization`を出力しました。
やったね。

# おわりに

以上、`function`の巻き上げについての仮説・結果・検証方法でした。

長年の疑問だった`const f = () => {}`と`function() {}`の明確な違いがあったのは個人的大発見です。
やはりアロー・・・アローはすべてを解決する・・・！


さて、次は何を書こうかしら・・・
秋月の1.3インチカラー液晶で遊ぶ(ST7789V2)(StampS3)(K-15560)(キャラクタ表示)


ＡＴＭ０１３０Ｂ３使用フルカラー液晶コントロールキット
[AE-ATM0130B3]
通販コード　K-15560
発売日　2020/11/12

ST7789 ST7789V ST7789V2

ATM0130B3


https://qiita.com/caa45040/items/3c57c159be0fd0f7a718


https://qiita.com/caa45040/items/8935036eab45af3b08d0


目的
ST7789その互換機の標準的なライブラリになっている
Adafruit ST7735　+ Adafruit GFXのインストール で
文字列を表示して遊ぶ



![o_coq036.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/adbf1b29-d43e-60b4-f54b-0e91c6b11e56.jpeg)

![o_coq034.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c556d060-57aa-0edf-ab67-1d933e8b5555.jpeg)

![o_coq037.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0f9d5da7-1744-cb4e-4c93-d6454311a92f.jpeg)



```c++


//spi_st7789_M5S3_1


//ヘッダーファイル
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>


//定義
#define TFT_CS    1
#define TFT_RST   3
#define TFT_DC    5
#define TFT_MOSI  7
#define TFT_SCLK  9

Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);


//初期化
void setup() {

  //240x240の液晶を使用する。
  tft.init(240, 240);           // Init ST7789 240x240

}//setup


//メインループ
void loop() {

  // 画面表示をクリア
  tft.fillScreen(ST77XX_BLACK);

  // テキストサイズを設定
  tft.setTextSize(3);
  // テキスト色を設定
  tft.setTextColor(ST77XX_WHITE);
  // テキストの開始位置を設定
  tft.setCursor(0, 10);


  // 1行目に46を表示
  tft.println("StampS3");


  delay(1000); //1秒待つ

}//loop


```
2024/4/15主にITとかセキュリティの記事

使用していないドメインを勝手に名乗ってメールを送信されるのを防ぐためのDNS設定まとめ(4/13)
https://gigazine.net/news/20240413-dns-settings-avoid-email-spoofing/

意思決定をサポートしてくれるベンダーをいかに選別するか(4/13)
https://dhbr.diamond.jp/articles/-/10329

Anthropicの研究論文：LLMが訓練された安全策を回避する「脱獄」技術の発表　「今のうちに取り組むべき課題」(4/13)
https://ledge.ai/articles/anthropic_many_shot_jailbreaking

XZ Utilsにバックドアを仕込んだ謎の人物「Jia Tan」の正体とは？ 専門家たちの推理(4/13)
https://wired.jp/article/jia-tan-xz-backdoor/

【特殊詐欺】「サイト利用料」「情報セキュリティNPO法人」騙る　80万円だまし取られる被害【新潟】(4/13)
https://www.uxtv.jp/ux-news/%E3%80%90%E7%89%B9%E6%AE%8A%E8%A9%90%E6%AC%BA%E3%80%91%E3%80%8C%E3%82%B5%E3%82%A4%E3%83%88%E5%88%A9%E7%94%A8%E6%96%99%E3%80%8D%E3%80%8C%E6%83%85%E5%A0%B1%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86/

「河野大臣は北欧に学べ」マイナ保険証利用率わずか5％「政府への不信」が低迷の原因、専門家が指摘(4/13)
https://smart-flash.jp/sociopolitics/281809/1/1/

「立て替えたサイト利用料払って」ご注意を！新潟上越市中郷区の60代男性が計80万円の詐欺被害　ＮＰＯや警視庁を名乗る男からも相次ぎ入金指示(4/13)
https://www.niigata-nippo.co.jp/articles/-/389612

本物そっくりのサイトに接続させ個人情報を盗み取る…フィッシング詐欺にご用心【教えて！相談員さん】(4/13)
https://www.fukuishimbun.co.jp/articles/-/2015630

国内118宿泊施設に被害　「ブッキング」に不正アクセス(4/13)
https://news.livedoor.com/article/detail/26223708/

共有サーバーから誤って削除したデータは復元できる？注意点から対処法まで解説(4/12)
https://cybersecurity-jp.com/contents/data-security/3029/

“不審なメール”にご用心　「電気代」や「水道料金」を要求　だまされないためには(4/12)
https://news.ntv.co.jp/category/society/50868979e3c04773a100010493fba6ed

省庁・自治体からのメールで「支払はVプリカ」だったら要注意！
フィッシング詐欺で悪用されがち「Vプリカ」ってなに？(4/13)
https://ascii.jp/elem/000/004/193/4193803/
https://ascii.jp/elem/000/004/193/4193803/?rss

交通網へのサイバー攻撃に対処、技術悪用防止　G7交通相(4/13)
https://www.nikkei.com/article/DGXZQOUA12BYM0S4A410C2000000/

日本の太陽光発電所にファーウェイ製機器か　青山繁晴議員「内部告発あった」(4/13)
https://www.epochtimes.jp/2024/04/216885.html

マイナンバー“憲法違反”訴訟 最高裁 上告退け石川住民敗訴(4/12)
https://www3.nhk.or.jp/news/html/20240412/k10014420341000.html

Ｇ７交通相会合が閉幕　サプライチェーン強靭化へ作業部会を設立(4/13)
https://www.sankei.com/article/20240413-ZEX6VEZREJIVLGXGNUCDY5TJV4/

米、ハマスに制裁　ＥＵと協調　「攻撃能力を阻害」(4/13)
https://jp.reuters.com/world/mideast/CNZUO3DMIJLNJO5UALRW6PZZJY-2024-04-12/

ＨＯＹＡ障害、一部復旧＝「ＪＩＮＳ」販売再開、正常化に時間(4/12)
https://sp.m.jiji.com/article/show/3211486
https://news.livedoor.com/article/detail/26219759/

【図解】HOYA障害、一部復旧＝「JINS」販売再開、正常化に時間(4/12)
https://news.yahoo.co.jp/articles/1c81af60bbc2105e9c62a82bfb582c0cf76b6fa7

HOYA、めがねレンズの出荷を一部再開　不正アクセスによるシステム障害から「一部が回復」(4/12)
https://news.goo.ne.jp/article/itmedia_news/business/itmedia_news-20240412_179.html

JINS、全ての眼鏡レンズの販売再開　13日から(4/12)
https://www.nikkei.com/nkd/industry/article/?DisplayType=1&n_m_code=024&ng=DGXZQOUC126FZ0S4A410C2000000

仕事や転職について(4/13)
https://blogs.itmedia.co.jp/satou55_makoto/2024/04/post_13.html?ref=rss
Azure Arc-enabled serversの3月アップデートまとめ

# はじめに
4/3に行われたアダプティブクラウドコミュニティコールよりAzure Arc Enabled Servers関連のアップデートを紹介します。レコーディングは以下で公開されています。

https://www.youtube.com/watch?v=owggYf4SZMQ&list=PLZuSmETs0xIaKJAgANkDuspTO4HG3y_xs&index=10

# Arc Jumpstartのアップデート
- 新シナリオ: Azure Arc-enabled servers上でRun commandを使用したPowerShellおよびShell scriptsの実行
- HCIBoxの2402ビルドのサポート
- HCIBoxのAustralia East, West Europeリージョンサポート
- Arc-enabled data servicesの月例リリース
- バグ修正
- Arc Architecture Posters and Diagrams(APD)
- Microsoft Build 2024と次の3ヶ月はBuildも合わせて多くのアップデートがあり要チェック

詳細は以下のページからも確認することが可能。

https://arcjumpstart.com/release_notes

# Arc-enabled serversのアップデート
- 新機能
    - 拡張機能をリスト、削除するコマンドの追加
    - 拡張機能のインストールや検証時にタイムアウト時間で失敗しないようにCPUの制限をカスタマイズ可能に
- Run commandがパブリックプレビュー
- Windows Server SummitでのArc Serverのセッション
    - [Cloud operation for Windows Server through Azure Arc](https://www.youtube.com/watch?v=uhYXnbGRoLg&list=PLjt5SKzX1iI-AFJVDZDXcVnwlMexav57F&index=26)
    - [Automate on-premises Windows Server from the cloud using Azure Arc](https://www.youtube.com/watch?v=hGULH4ZnNAk&list=PLjt5SKzX1iI-AFJVDZDXcVnwlMexav57F&index=37)
- ARM64 VMsのディストリビューションやシナリオをシェアしてほしい。フィードバックをロードマップ検討に活用
- フィードバック
    - Azure Arcを活用したCopilot-Enhancedな拡張機能のオンボーディングとトラブルシューティング
    - フィードバックフォームは[こちら](https://forms.office.com/pages/responsepage.aspx?id=v4j5cvGGr0GRqy180BHbRxD4glT-xqJPjKvmwQiCiExUQ1FLTzJQUFM4V1IyRjNMWkxEVzJCTE0ySi4u&fswReload=1&fswNavStart=1713119974984)

# まとめ
Arc JumpstartとArc-enabled serversについての3月アップデートをまとめました。Azure Arcを使用することでCopilot for Azureによってアシストされたオンボーディング、管理、トラブルシューティングが可能になります。一方でどれくらい使えるのかはまだ手探りな部分があるのでアダプティブクラウドのコミュニティのアップデートをチェックしたり、フィードバックを提供することで、より便利な使い方を探索することができそうです。
Azure service principal メモ

# サービスプリンシパルを利用するazコマンド
```
az login --service-principal --username <azureClientId> --tenant <azureTenantId> --password <azureClientSecret>
```
## service-principalとは
特定のAzureリソースにアクセスするためのセキュリティID

## 認証と認可
認証：サービスプリンシパルのIDを使用し、AADに認証を行う
IDは(クライアントIDとクライアントシークレットまたは証明書)

認可：認証が成功すると、AADはアクセストークンを発行し、アクセストークンを使用しリソースグループやその他のAzureリソースに対してアクセスを行える
また、このアクセストークンにはサービスプリンシパルがアクセスできるリソースと権限の情報が含まれる

## アクセス
認証と認可が下りたため、リソースグループへアクセスできるということになります
また、このようなアクセス制御をRBAC(ロールベースアクセス制御)と呼ぶ

>Azure ロールベースのアクセス制御 (Azure RBAC) は、Azure のリソースに対するアクセスを管理するために使用する承認システムです。
https://learn.microsoft.com/ja-jp/azure/role-based-access-control/role-assignments-portal

例えば、アプリケーションがリソースグループ内のVMにアクセスさせたいと場合、ロールに役割を持たせ、認可を最小限に持たせることで、セキュリティが担保できる
また、サービスプリンシパルにも様々機能があるため、都合がよい

https://learn.microsoft.com/ja-jp/azure/container-registry/container-registry-auth-service-principal

https://tech-lab.sios.jp/archives/23371

https://licensecounter.jp/engineer-voice/blog/articles/20200918_azure_rbac.html

https://qiita.com/RyomaTaniyama/items/6bd3fd0506345a5f8de4
回文素数の出力（Haskellのほぼワンライナー実装）

こんにちは｜こんばんは。カエルのアイコンで活動しております @kyamaz :frog: です。

## はじめに
本稿は、「回文素数（[palindromic prime](https://ja.wikipedia.org/wiki/%E5%9B%9E%E6%96%87%E7%B4%A0%E6%95%B0)）」を出力する処理を、Haskellを使ってワンライナーで実装するネタ的[^0]なShortエントリーです。

# 回文素数とは

『回文数』とは、上から読んでも下から読んでも同じ数字のことを言います。その中で素数のものを『回文素数』と呼びます。なお、回文素数が無数に存在するかどうかは未解決問題です。現在見つかっている最大の回文素数は最近でも更新されており、Top20を紹介しているサイトの[Palindrome](https://t5k.org/top20/page.php?id=53)のページに掲載されております。2024年1月に更新された数は、$2000007$ 桁の素数

$10^{2000007} - 10^{1127194} - 10^{872812} - 1	$

だそうです。また、ベルフェゴール素数（Belphegor's prime）

$1000000000000066600000000000001$ $(= 10^{30} + 666 × 10^{14} + 1)$

という特別な名称をもつ少し悪魔っぽい回文素数もあります。

## 回文素数を生成する

### 素数列を生成する

さて、テーマとしては素数を扱いますので、Haskellで素数列の生成をワンライナーで生成します。GHCiのプロンプトから対話形式で試していきましょう。

```Haskell:
ghci> p=2:3:5:5#p;m#(a:b:x)=[n|n<-[a^2..b^2-2],(mod (n+1) 6)*(mod (n-1) 6)==0,gcd n m<2]++(m*b)#(b:x)
 ```
### 回文素数を出力する

`p`が素数列ですので`p`を使って、その中から回文素数の条件をもつものを次のように`filter`関数を使ってリスト`pp`を記述します。

```Haskell:
ghci> pp = filter (((==) <*> reverse) . show) p
 ```

回文素数列`pp`は、次のようにすればインタラクティブに表示できます。

```Haskell:
ghci> pp
[2,3,5,7,11,101,131,151,181,191,313,353,373,383,727,757,787,797,919,929,...,98689,...
```

遅延評価で次々と表示されますので、適当なところで、`Ctrl-C`で処理を止めましょう。また、$98689$ 以下の範囲で出力するには、次のように指定すると良いでしょう。

```Haskell:
ghci> takeWhile (98689>=) pp
[2,3,5,7,11,101,131,151,181,191,313,353,373,383,727,757,787,797,919,929,10301,10501,10601,11311,11411,12421,12721,12821,13331,13831,13931,14341,14741,15451,15551,16061,16361,16561,16661,17471,17971,18181,18481,19391,19891,19991,30103,30203,30403,30703,30803,31013,31513,32323,32423,33533,34543,34843,35053,35153,35353,35753,36263,36563,37273,37573,38083,38183,38783,39293,70207,70507,70607,71317,71917,72227,72727,73037,73237,73637,74047,74747,75557,76367,76667,77377,77477,77977,78487,78787,78887,79397,79697,79997,90709,91019,93139,93239,93739,94049,94349,94649,94849,94949,95959,96269,96469,96769,97379,97579,97879,98389,98689]
```

ここで $98689$ 以下を指定していますが、５桁の最大の回文素数をあらかじめ知っているから具体的に指定できております。ここを`(100000>)`と指定すれば、５桁の回文素数の最大値を知らなくても動作します。この実装では、$100000$ を超えた値が確定すると処理が終了します。しかし、$11$以降の偶数桁の回文素数は存在しないためさらに１桁多い７桁の回文素数まで処理が進まないと、プロセスが終了しません。この点は注意する必要があります。


## おわりに
ご一読いただきまして有り難うございます。

最後に、本稿を記載するために検証したHaskell環境を記しておきます。お手元の環境で検証する際に動作が異なる場合などは、参考になるかもしれません。
<details><summary>本稿の環境</summary>

本稿のために使用した環境は以下となります。
macOS: Sonoma 14.4 (chip: Apple M1)
GHCup: 0.1.22.0
GHC: 9.6.4
</details>

（●）（●） Happy Hacking!
/""　＿＿""＼

[^0]: 「ネタ的」とは、多くの方にほとんど役には立たないであろうという意図です。
Git Rebaseの活用法

**Git rebase** は、Git の強力なツールの一つで、コミット履歴を整理するのに役立ちます。特に、プロジェクトでクリーンなコミット履歴を維持することが重要な場合に便利です。この記事では、Git rebase の基本的な使い方と、実際のワークフローでの活用方法を説明します。

### Git Rebaseの基本

Git rebase は、ブランチのベースを移動または「リベース」することで、マージよりもクリーンな履歴を作成します。具体的には、指定したブランチのコミットを一時的に取り除き、現在のブランチの先頭に再適用します。

### 活用例1: フィーチャーブランチの更新

開発中にメインブランチ（例えば **`main`**）が更新された場合、自分のフィーチャーブランチ（例えば **`feature`**）に最新の変更を取り入れたいことがあります。この場合、rebase を使用して **`feature`** ブランチを最新の **`main`** ブランチに再ベースすることが推奨されます。

```bash
bashCopy code
# main ブランチに切り替え
git checkout main

# リモートの変更を取得
git pull origin main

# feature ブランチに切り替え
git checkout feature

# feature ブランチを main ブランチの最新状態にリベース
git rebase main

```

この操作により、**`feature`** ブランチの変更が **`main`** ブランチの最新の変更の上に適用され、マージコンフリクトを解決しやすくなります。

### 活用例2: コミット履歴の整理

開発中に多くの修正や小さな変更をコミットとして積み重ねていくと、履歴が乱雑になることがあります。ここで rebase のインタラクティブモードを利用して、コミット履歴をクリーンに保つことができます。

```bash
bashCopy code
# 最近の5件のコミットを整理する
git rebase -i HEAD~5

```

このコマンドを実行するとエディタが開き、「pick」、「squash」、「fixup」などのオプションを使ってコミットを統合したり、メッセージを編集したりすることができます。

### 注意点

- Rebase の操作は既存のコミット履歴を改変するため、共有されているブランチでの使用は避け、個人のローカルブランチやチーム内での合意がある場合に限られます。
- コンフリクトが発生した場合は、それを解決してから **`git rebase --continue`** を実行する必要があります。

Git rebase は、使いこなすと非常に強力なツールです。上記の活用法を参考にしながら、より効果的なバージョン管理を行ってください。

関連記事

https://qiita.com/sunstripe2011/items/0b611f6e8a480024dd33

https://qiita.com/sunstripe2011/items/38524ed65851d6d4e52b

https://qiita.com/sunstripe2011/items/75b7ad40e9b5af99a91e

https://qiita.com/sunstripe2011/items/19df6655b6703e4aaaed

https://qiita.com/sunstripe2011/items/30f46a7bf451c1a85c2b

https://qiita.com/sunstripe2011/items/53ae4184d021e927b3f3

https://qiita.com/sunstripe2011/items/23ed20b0bb6ab60ff2d1
Linux標準教科書のコマンドを打って遊んでみる：Linux未経験者がWindows内環境でできること②

### きっかけ
卒業した専門学校も職歴も開発系で、インフラ周りはほとんど触ったことはありませんが
LPI-Japan様のオープンコミュニティに参加させて頂いているので、せっかくなのでやってみようと思ったことです。
今回はLinuxの標準教科書を見ながらいろいろなコマンドを試してみようと思います。

### mkdir

```
mkdir ディレクトリ名
```
で、ディレクトリを作成できます。
インストールしただけのWSLにはファイルも何もないので、まずはファイルを作ってみました。
(Linux標準教科書 44ページ)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533750/3b7a1001-4f03-cb5f-998f-fb420d7c6d70.png)

### ls

```
ls [オプション][ファイル]
```
で、ファイルの一覧を取得できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533750/efe79cf9-4ab2-7c76-c138-2680b992ae9e.png)

先程作成したファイルが表示されています。

(Linux標準教科書 33ページ)

#### lsのオプション -t

```
ls -t
```
で、ファイルの一覧を最終更新時間の順にソートして出力してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533750/a103b8ce-fd16-000f-b151-f98a68da8692.png)

「testfolder」より後に作成された「testfolder2」が、-tオプションを使うと先に出力されることがわかります。
(Linux標準教科書 33ページ)

以上です。ここまで読んで頂きありがとうございました。
[Swift] CGRect 配列を定数で初期化する

## CGRect 配列を定数で初期化するには？

```swift
var redRect:[CGRect] = [CGRect(x:517, y:366, width:97, height:111),
                        CGRect(x:517, y:366, width:97, height:111)]
```

検索したけど、誰も書いていなかったので。
Pythonで「ディレクトリに含まれるファイルとディレクトリの一覧を取得する(pathlibモジュール)」の動作を確認してみた

# 概要

Pythonで「ディレクトリに含まれるファイルとディレクトリの一覧を取得する(pathlibモジュール)」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/python/file/index6.html

# 実装

以下のファイルを作成しました。
```sample1.py
import pathlib

p = pathlib.Path('./test/')
for i in p.iterdir():
  print(i)
```
```sample2.py
import pathlib

p = pathlib.Path('./test/')
for i in p.iterdir():
  if i.is_file():
    print('[F]:' + str(i))
  else:
    print('[D]:' + str(i))
```

以下のコマンドを実行しました。
```
$ mkdir -p test/doc
$ mkdir -p test/img
$ touch test/address.txt
$ touch test/name.txt
$ python3 sample1.py 
test/address.txt
test/img
test/name.txt
test/doc
$ python3 sample2.py 
[F]:test/address.txt
[D]:test/img
[F]:test/name.txt
[D]:test/doc
```

# まとめ

何かの役に立てばと。
apacheにlaravelとcomposerを入れていく

# 初めに
サーバー関係の構築ができたのでlaravelを入れてブラウザで表示していきたいと思います。

# 環境情報
macOS Sonoma 14.4.1
CentoOS Stream X_86_64
Apache/2.4.57
composer version 2.7.2
Laravel Installer 5.7.1

# 解説
## composerのインストール

composerのインストール完了
```
# dnf install --enablerepo=remi composer
```

## laravelのインストール

/var/www/htmlに移動
```
cd /var/www/html
```
なかったらmkdirで作ってください。

laravelのインストール
```
# composer global require laravel/installer
```
~~laravelプロジェクトを作成~~
```
# composer create-project laravel/laravel プロジェクト名
```
上のコマンドじゃなくて

```
laravel new プロジェクト名
```
でlaravelのプロジェクトをつくることができるとご指摘いただきました。

virtual hostを設定する

/etc/httpd/vhost.dに移動する

```
cd /etc/httpd/vhost.d
```
laratest.confを作成する

```
vi laratest.conf
```

```laratest.conf
<VirtualHost *:80>
  DocumentRoot /var/www/html/プロジェクト名/public
  ServerName test.lalatest.com
</VirtualHost>
```

httpd.confを変更する
/etc/httpd/confに移動する
```
cd /etc/httpd/conf
```
httpd.confを編集する
```
vi httpd.conf
```

```httpd.conf
最終行に追加↓
include /etc/httpd/vhost.d/*conf
```

apacheのテスト画面を非表示にするには
~~/etc/httpd/conf.d/に移動~~
```
cd /etc/httpd/conf.d
```
~~welcome.confを編集~~
```
rm welcome.conf
```
~~全ての行に#をつけて~~
```
systemctl start httpd
```
welcome.confを完全に削除してください。
でapacheを再起動したら
ログファイルが開けないみたいなlaravelの画面が出てくると思います。


## エラー対処方法
エラー名
```
The stream or file "/var/www/html/laravel/storage/logs/laravel.log" could not be opened in append mode: Failed to open stream: Permission denied
```

https://qiita.com/apricotcomic/items/c102bafbe6dd482dbc89

この記事を参考にエラーを解決してみてください。

それでも無理なら
```
chmod -R 777 laravel/storage
```
で解決できると思います。

こんなエラーもでてくるかもしれないので、
```
SQLSTATE[HY000]: General error: 8 attempt to write a readonly database
```
```
chmod -R 777 laravel/database
```

で解決できると思います。
長かったですね。お疲れ様でした。

# 終わりに
何回もlaravelを動かすのに失敗していたのですが、改めてやってみるとしっかりできるようになってきました。
laravelプロジェクトを動かせたので次はgit cloneしたものでやってみましょう

# 参考文献
https://qiita.com/yukachin0414/items/bb2f54f59564919be6c7

https://qiita.com/apricotcomic/items/c102bafbe6dd482dbc89

とても参考になりました。
ありがとうございます!
【非エンジニア向け】RAGを使ったChatBotを3行で実装して実務で使う

## はじめに
初投稿になります。
私は戦略コンサル→マーケターという経歴のビジネスサイドの人間です。普段はエクセルでデータ分析をしたり、たまにPythonを触ったりしています。

この記事では私のような非エンジニアのビジネスサイドの人間でも、実務で「簡単に」「素早く」RAG(Retrieval-Augmented Generation)を使いこなす方法をまとめています。

具体的には、GoogleColab＋langchainで実質3行で実装する方法を載せています。
[noteに事例](https://note.com/zuki2/n/nbe9fc86c3dce)も載せています。

## やりたい事
|名前|性別|年齢|
|---|---|---|
|田中|男性|25|
|山田|女性|35|
|・・・|・・・|・・・|

上記のようなデータを分析する際に、PandasやSQLのややこしいコードを書かずに、自然言語でデータ分析を実行できるようにします。

__現状：ややこしいコードを書く必要がある↓__
```rag.sql
grouped_df = df.groupby('性別')['年齢'].mean()
filtered_df = df[(df['性別'] == '女性') & (df['年齢'] >= 30)]
```
__やりたい事：日本語で直接指示ができる↓__
```
性別ごとの平均年齢を教えて
30歳以上の女性を列挙して
```

## アプローチ
流れは以下です。
1. AIに自然言語で指示をする（例： 性別ごとの平均年齢を教えて）
2. AIがSQLに変換する（例： df.groupby('性別')['年齢'].mean()）
3. AIがSQLを実行し、回答を返答する（例： 男性：31歳、女性26歳）

>参考：NRI　用語解説一覧 RAG
>https://www.nri.com/jp/knowledge/glossary/lst/alphabet/rag
![img01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3770170/f0b589b1-ee55-e504-701c-f3feb94db2b5.jpeg)

実装は、Google Colaboratory(https://colab.research.google.com/) 上に行います。
肝心のRAGは最もメジャーなOSSのlangchain（https://www.langchain.com/） を使用します。
langchainは、自然言語をSQLに変換して実行するまでの処理を全て実行するようなライブラリです。対象のデータは、データベースやエクセル、ベクトルデータベース（PDF等をDB化したもの）など幅広く対応しています。

## 実装
+ OpenAI APIを使用するため、APIキーの取得を行う必要があります
（参考：https://qiita.com/Isaka-code/items/b50983796636503b44c5）
+ langchainのコードの詳細は公式ドキュメントを参照ください
（https://python.langchain.com/docs/integrations/toolkits/pandas/）
+ 今回はcsvをdataframeにした後、RAGをしています

```
!pip install openai
!pip install langchain
!pip install langchain-openai
!pip install langchain_experimental
```
```rag.py
import os
import pandas as pd
from langchain.agents.agent_types import AgentType
from langchain_experimental.agents.agent_toolkits import create_pandas_dataframe_agent
from langchain_openai import OpenAI

os.environ['OPENAI_API_KEY'] = "自分のAPIキーを入力"

# サンプルデータとしてタイタニックのデータセットを読み込ませる。（任意のcsvなどに変更する）
df = pd.read_csv(
    "https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv"
)

# エージェントを立ち上げる
agent = create_pandas_dataframe_agent(OpenAI(temperature=0), df, verbose=True)

# 質問を投げ、回答を得る
rep = agent.invoke("性別ごとの平均年齢を日本語で教えて")
print(rep["output"])
```
```
回答：
女性の平均年齢は27.92歳、男性の平均年齢は30.73歳です。
```
>langchainのPandas Dataframeのドキュメント
>https://python.langchain.com/docs/integrations/toolkits/pandas/

## まとめ
シンプルですが、csvの部分を任意のファイルに変更するだけで実務ですぐに使用可能なRAGのシステムになります。
また、実装したコードはライブラリのインポートを除くと実質以下の3行になります。
```rag.py
# サンプルデータとしてタイタニックのデータセットを読み込ませる。（任意のcsvなどに変更する）
df = pd.read_csv("https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv")

# エージェントを立ち上げる
agent = create_pandas_dataframe_agent(OpenAI(temperature=0), df, verbose=True)

# 質問を投げ、回答を得る
print(agent.invoke("性別ごとの平均年齢を日本語で教えて"))
```

## 終わりに
2024年4月からアウトプットのためにQiitaとnoteを始めました。「フォロー」や「いいね」頂けると励みになります！

https://qiita.com/zukki2

https://note.com/zuki2
【React】遅延読み込みの際にsuspenseで表示されるコンポーネントを切り替える

# 初めに
コンポーネントの読み込み中には、ロード中ということがユーザに伝わるような表示をさせておきたいです。
本記事ではReact の Suspense を使用し非同期にコンポーネントを読み込みを際に、読み込み前と後で表示コンポーネントを変える方法について記載します。



# 目次
[1.環境](#環境)
[2.Suspenseの書き方](#Suspenseの書き方)
[3.ソース](#ソース)
[4.実行結果](#実行結果)

# 環境
- react：18.2
- vite：5.2


# Suspenseについて

Suspenseの書き方は次のようになります。
非同期処理の状態に応じて表示するコンポーネントを変える処理を記述する必要がなく、宣言的に書けるのは便利です。
詳細は下記リンクのドキュメントになります。

```tsx
<Suspense fallback={<Loading />}>
  <SomeComponent />
</Suspense>
```
- `<Loading />`：読み込みが完了するまで表示されるコンポーネント
- `<SomeComponent />`：読み込み後に表示されるコンポーネント


https://react.dev/reference/react/Suspense


# ソース
以下が全体のソースになります。
`setTimeout`で意図的に遅延を発生させ、非同期処理の完了前は「Loading...」の文字列、完了後には「3秒経ちました」の文字列を表示させています。

### ◆全体のソース

```tsx:App.tsx
import React, { Suspense } from 'react';
import './App.css'

// 遅延
const fetchData = () => {
  return new Promise<string>(resolve => {
    setTimeout(() => resolve('3秒経ちました'), 3000);
  });
};

// 遅延されたデータを読み込むコンポーネント
const DataComponent = React.lazy(
  () => fetchData().then(
    (data) => ({ default: () => <div>{data}</div> }))
);

const App = () => {
  return (
    <div>
      <h1>Hello React Suspense!</h1>
      <Suspense fallback={<div>Loading...</div>}>
        <DataComponent />
      </Suspense>
    </div>
  );
};

export default App;
```

### ◆詳細

以下の`fetchData`関数においては、非同期の処理を行いsetTimeout が3秒後にコールバック関数を実行するように設定しています。

```tsx
const fetchData = () => {
  return new Promise<string>(resolve => {
    setTimeout(() => resolve('3秒経ちました'), 3000);
  });
};
```

以下の`DataComponent`コンポーネントでは、`React.lazy`を使用しコンポーネントの遅延読み込みを行っています。
`fetchData`関数の非同期処理完了後に、コンポーネントを定義しています。

```tsx
const DataComponent = React.lazy(
    () => fetchData().then((data) => ({ default: () => <div>{data}</div> }))
);
```

`Suspense`の`fallback`プロパティには、読み込みが終わるまで表示されるコンポーネントを指定しておきます。
非同期処理が終わりコンポーネントが読み込まれると`DataComponent `が表示されます。
```tsx
const App = () => {
  return (
    <div>
      <h1>Hello React Suspense!</h1>
      <Suspense fallback={<div>Loading...</div>}>
        <DataComponent />
      </Suspense>
    </div>
  );
};
```


# 実行結果
`npm run dev`で実際に画面上の動作を確認してみます。
レンダリング時は「Loading...」の文言、その後に「3秒経ちました」の文言に代わっている事が確認できます。

![react_suspense_m.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/50e87415-1870-da11-20c4-b0455751767d.gif)
JavaのPriorityQueueではまった（間違った順序で要素を返すように見えた）話

# 結論：優先度が適用された順序で取得するには、poll()やpeek()を使いましょう

それ以外のメソッドを使うと、順序が保証されません。
* iterator() →×
* toArray() →×
* toString() →×

* poll() →○
* peek() →○

参考:[https://docs.oracle.com/javase/jp/8/docs/api/java/util/PriorityQueue.html](https://docs.oracle.com/javase/jp/8/docs/api/java/util/PriorityQueue.html)


## 悪い例
```java:bad_example1.java
import java.util.*;

int[] data = new int[]{10,1,1000,100,10000};
PriorityQueue<Integer> pq = new PriorityQueue<>();
for(int i = 0; i < data.length; i++) {
  pq.add(data[i]);
}
System.out.println(pq);  //toString()が適用される
Iterator<Integer> itr = pq.iterator();
while(itr.hasNext()) {
  System.out.println(itr.next());
}
```
**出力結果:順序が保証されない**（環境によって結果が異なる）
[10,1000,1,10000,100]
10
1000
1
10000
100

## 良い例
```java:good_example1.java
import java.util.*;

int[] data = new int[]{10,1,1000,100,10000};
PriorityQueue<Integer> pq = new PriorityQueue<>();
for(int i = 0; i < data.length; i++) {
  pq.add(data[i]);
}
while(!pq.isEmpty()) {
  System.out.println(pq.poll());
}
```
**出力結果:順序が保証される**
1
10
100
1000
10000

### 余談
[AtCoder](https://atcoder.jp)のコンテストに参加している時に、手元では動作するのに提出するとWAになり混乱。デバッグしてみると、最初「PriorityQueue が間違った順序で要素を返す」ように見えましたが、よくよく調べてみると上記の仕様でした(^^;
pam(su)の設定あれこれ

## suの制限
色々調べた感じ，pamを用いることでsu先の制限，su実行元の制限ができる様子．
pamは下記ファイルを修正することで諸々の制御を実施することができる．
　/etc/pam.d/su


* su先の制限
```:書き方
#userAになろうとした場合拒否する．
auth required pam_succeed_if.so use_uid user != userA
```

* su実行元の制限
```:書き方
#groupAに所属しているユーザがsuを実行した場合拒否する．
auth required pam_succeed_if.so use_uid user notingroup groupA
```

## suのよくある制御方法
su実行元の制御は上記方法も使えるようだが，wheelグループを用いてsuの制御を実施するのが世間一般のよくある制御の様子．
```:書き方
#wheelに所属していないユーザがsuを実行した場合拒否する．
auth required pam_wheel.so use_uid
```

## suの制御時のパスワード有無
上記までに記載した方法では，拒否対象のsuでもパスワードを聞かれるような仕様になっている．
これはrequiredというcontrol方法を採用しているからである．
ここをrequisiteにすることによってパスワードを聞かれずに拒否することができるようになる．
```:書き方
#userAになろうとした場合，パスワードを聞かずに拒否する．
auth requisite pam_succeed_if.so use_uid user != userA
```

## 最後に
いろいろ情報を記載しましたが，pamの制御はかなり危険なので（suが使えなくなったりしてマシンをいじれなくなる可能性がある）試験機などで検証してから設定をするようにしてください．
最近気になったトピック：2024/04/14

## 強いエンジニアのなり方
https://speakerdeck.com/soudai/grow-one-day-each-day
- フィードバックループの本質は内省と実行
- 具体的経験→内省的観察→抽象的概念化→積極的実践
- 昨日の自分に誇れる今日の自分になろう

ふりかえりカンファレンスの内容にも通じるものがあった
昨日より今日！毎日意識していきたい

## スクラムガイドのスプリントレトロスペクティブを改めて読みかえしてみた
https://speakerdeck.com/mackey0225/re-reading-the-sprint-retrospective-section-in-the-scrum-guide
- ふりかえりカンファレンスのLT
- 名言多めだった

もう１回スクラムガイド読み返そう...

## 単体テストを書かない技術
https://speakerdeck.com/o0h/how-not-to-write-unit-tests
- 「名は体を表す」ようにコードを書く
- 単体テストは「本質」に意識を向ける
- 本質の探求を怠らない

読みながらめちゃめちゃ首を縦に振っていた...
こういうコードが書きたいんだよなァ

## イベント駆動コンテンツ
https://koriym.github.io/blog/2024/04/03/event-driven-content/
- PHPerKaigiのRecapと補足
- 不易流行を見極め、不易を積み上げる話

高みを見た感がある、これをスッと理解できるようになりたい

## AI時代のユーザ体験は「AAAA」モデルで考えよう
https://note.com/dory111111/n/n03eac77e5197
- OOCで言及されてた
- AIらしいUXを考える際の設計フレームワーク

一般的なシステムや機能の開発でもこのFWを軸に考えると良さそうな気がした

## privateメソッドのテストって書かない方がいいんだっけ？
https://speakerdeck.com/asumikam/private-methods-test
- どんなテストが「良い」テスト？
- テストコードとプロダクトコードの距離感
- 何が正しくて何かが正しくないかを認識することが大事

最近向き合うことが多い「なんかおかしいテスト」の言語化がされてた
おすすめコンテンツ助かる

## テスト駆動開発の定義
https://t-wada.hatenablog.jp/entry/canon-tdd-by-kent-beck
- テスト駆動開発の定義
- インターフェイス分離の原則
- TDDのワークフロー
- 日本で誤解されているTDDはなんと呼ぶのか？
  - 自動テスト
  - 開発者テスト
  - テストファーストプログラミング

何度か読み返したい
[fukabori.fmのepisode114](https://fukabori.fm/episode/114)を合わせて聞くと理解が捗った
ReactでFirestoreのドキュメントを取得する

# Firebaseのドキュメント取得
個人開発でドキュメントの取得の仕組みがいまいちピンとこないまま使っているので自分用としてまとめてみることにしました。

## 初めに
初学者のため、誤りや拙い点があるかと思います。明らかな間違いがあるときにはコメントをいただけると嬉しいです。

## ドキュメントとは？
Firestoreで使用する、データベースの"ようなもの"です。

実際にはDB操作する時と勝手がかなり異なり、ドキュメントというファイルにJSON配列のようなデータが格納されているイメージが近しいかと思います。
ファイルの中にファイルを格納することができるので、ネストを深くすることも可能です。

>Cloud Firestore は NoSQL ドキュメント指向データベースです。SQL データベースとは違い、テーブルや行はありません。代わりに、データは「ドキュメント」に格納し、それが「コレクション」にまとめられます。

https://firebase.google.com/docs/firestore/data-model?hl=ja

## 参考コード
以下は書籍に関する登録内容をドキュメントから取得するコードです。ステップバイステップで処理の内容を説明していきます。

```
    const [books, setBooks] = useState<Book[]>([]);

    const fetchBooks = async () => {
      try {
        // データベースからbooksコレクションのデータを取得
        const q = query(collection(db, "books"));
        // ドキュメントを非同期で取得
        const querySnapshot = await getDocs(q);
        // 取得したドキュメント配列をオブジェクトに変換
        const booksData: Book[] = querySnapshot.docs.map((doc) => ({
          ...(doc.data() as Book),
          id: doc.id,
        }));
        setBooks(booksData);
        await fetchUsers(booksData);
      } catch (err) {
        setError("データの取得中にエラーが発生しました。");
      } finally {
        setLoading(false);
      }
    };

```

## ドキュメントの取得方法

### Firestore に特有の関数

`query`:特定の条件を満たすデータをデータベースから取得するためのクエリを構築する際に使用
`collection`:データベース内の特定のコレクションにアクセスするための参照を作成するために使用
`docs`:複数のドキュメントを取得
`doc`:ひとつのドキュメントを取得

### 処理の流れ

1. `const q = query(collection(db, "books"));` ではコレクション名がbooksに一致するクエリを呼び出す
1. `const querySnapshot = await getDocs(q);` にて呼び出したコレクション内のドキュメントを呼び出す
1. `querySnapshot.docs`は、Firestoreのクエリにマッチしたすべてのドキュメントを含む状態。ドキュメントはネストを含む配列形式になっているので、`map()`メソッドを使用して新しい配列に変換
1. 各ドキュメントをスプレッド演算子を使用してこのオブジェクトのプロパティを新しいオブジェクトにコピー、`id: doc.id`でドキュメントのIDを新しいオブジェクトに追加
1. `map()`メソッド は各ドキュメントから新しいオブジェクトを生成し、これらのオブジェクトからなる新しい配列（`booksData`）を返す
1. `setBooks(booksData);`で書籍データを更新

## 取り出した情報の画面表示
以下のコードで更新した`books`を展開できます。

```
    <div className="py-8 m-auto w-11/12">
      <h1 className="text-center font-bold text-xl">みんなの積み上げ</h1>
      {books.map((book) => (
        <div
          key={book.id}
          className="book-item flex items-center border-2 m-4 p-4"
        >
          <img
            className="rounded-full w-32 h-32 object-cover mr-4"
            src={users[book.userId]?.photoURL}
            alt={users[book.userId]?.displayName || "プロファイル画像"}
          />
          <div className="flex flex-col gap-2">
            <h2 className="font-bold">{users[book.userId]?.displayName}</h2>
            <p className="font-bold">{book.name}</p>
            <p>読了日: {book.date}</p>
          </div>
        </div>
      ))}
    </div>

```

## 最後に
こう見ると結構独特な書き方だな〜と思いました。SQLをしっかり使えるようになりたいので、バックも自分で作れるように頑張ります。
ディレクトリには何がある？

# はじめに
Linuxサーバで作業中に「ここには何があるんじゃろ？」となることがありますよね。そんなときは``ls``コマンド。

# ``ls``コマンドとは
``ls``コマンドはlistの略で、ディレクトリ内のファイルやディレクトリの一覧を表示するためのコマンドです。ファイルを指定すればファイルの情報を表示します。ファイルやディレクトリを指定しなければカレントディレクトリ(今自分がいるディレクトリ)にあるファイル、ディレクトリを一覧表示します。

# よく使うオプション``-l``
ほとんどセットで使うくらいよく使われるオプションが``-l``でしょう。``ls -l``を実行することでファイルやディレクトリの詳細情報を表示します。所有者、所有グループ、サイズ、更新日時などが表示されます。

# よく使うオプション``-h``
``-h``オプションを付けることでサイズを人が読みやすい形式で表示します。例えば、1K、2M、3Gなどです。

# 見えないものも見えるオプション``-a``
隠しファイル(ファイル名がドットから始まるファイル)も確認したいなら``-a``。

# さいごに
``ls``コマンドには並び順を変えるオプションなど色々なオプションがあります。作業をより効率的にするために役立ちそうなオプションを探してみてください。オプションを組み合わせて便利にしていきましょう。Linux技術の習得はより価値あるエンジニアになる一つの選択肢です。40歳超えて知識0からでもLinuCレベル3コンプリートして活躍できるのだから。そう、約半世紀ずっーーーーーと引きこもりで地球から一歩も出ていない石ころでも。

LinuCとは

https://linuc.org/about/01.html
タイトルバーに選択数表示を追加

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412809/620664ae-f299-7e47-9d46-1de0acdcc020.png)
[動画](https://www.youtube.com/watch?v=YWMg5oKnkE0)

C:\Users\ユーザー名\Documents\maya\scripts
に
~~~kohakuNekotarou_MayaWindowTitleChenge.mel
// 時間差をおいてタイトルを変更しないと上手くいかないので遅延用
global proc kohakuNekotarou_MayaWindowTitleChengeIdle(){
    string $text = `window -q -t kohakuNekotarouShowSelectionInTitle`;
    $text += " " + `kohakuNekotarou_dR_updateCounter`;
    window -e -t $text MayaWindow;
}

// scriptJob(idleEvent)を作製用
global proc kohakuNekotarou_MayaWindowTitleChengeSelection(){
// 時間差をおいてタイトルを変更しないと上手くいかないので遅延させる
    scriptJob
        -p "kohakuNekotarouShowSelectionInTitle"
        -ie "kohakuNekotarou_MayaWindowTitleChengeIdle"
        -ro true // 一回実行されると削除
        ;
}

// メインウィンドウのタイトルに選択数を表示
global proc kohakuNekotarou_MayaWindowTitleChenge(){

    // 実行されている場合は削除
    if(`window -ex kohakuNekotarouShowSelectionInTitle`){
        deleteUI kohakuNekotarouShowSelectionInTitle;
        return;
    }

    // ShowSelectionInTitle用Window
    window kohakuNekotarouShowSelectionInTitle;
    showSelectionInTitle "kohakuNekotarouShowSelectionInTitle";

    // 選択が変更された時用
    scriptJob
         -p "kohakuNekotarouShowSelectionInTitle"
         -e "SelectionChanged" "kohakuNekotarou_MayaWindowTitleChengeSelection"
         ;
}
~~~
の内容を
kohakuNekotarou_MayaWindowTitleChenge.mel
の名前で保存。

C:\Program Files\Autodesk\Maya（バージョン）\scripts\others
にあるdrInit.melからモデリングツールキットの選択数を表示する
dR_updateCounterプロシージャを拝借して
上記のmelファイルの最上部に追加。
　
~~~
// Don't need to update if the Modeling Toolkit panel is not visible
if(!`workspaceControl -q -vis NEXDockControl`) {
    return;
}
~~~
を削除。
　

text -e -label 〇〇〇
の行を
return 〇〇〇;
に変更。

~~~
return;
~~~
だけの行は削除。
　
プロシージャがstringを返すように
~~~
global proc string kohakuNekotarou_dR_updateCounter()
~~~
に変更。

kohakuNekotarou_MayaWindowTitleChenge
コマンドでON、OFF切り替え。
【Flutter】pub.devに公開した自作packageを更新する方法

## はじめに
[pub.dev](https://pub.dev/)に公開したpackageのアップグレード方法について書かれた記事があまりないみたいなので、ざっくりまとめてみました。
僕がpub.devに公開した自作package「[focused_area_ocr_flutter](https://pub.dev/packages/focused_area_ocr_flutter)」の更新を~~生贄~~ 事例にpackageの更新方法をご紹介します。
自作packageであるfocused_area_ocr_flutterの公開については、以前執筆した[OCRのFlutterパッケージfocused_area_ocr_flutterを自作&公開してみた](https://blog.shinonome.io/focused-area-ocr-flutter/)という記事にまとめてあります。

## 手順
### 1. packageに変更を加える
まず、packageのソースコード等に変更を加えます。
今回、僕はクラスやフィールドにドキュメントコメントを追加しました。

### 2. pubspec.yamlのversionを更新
次に、pubspec.yamlにあるversionを更新します。
僕は今回が初めての更新であり、更新前のversionが0.0.1だったため、0.0.2に変更しました。

### 3. CHANGELOG.mdの更新
CHANGELOG.mdに今回の更新に関する概要を記述します。
今回、僕は以下のようにCHANGELOG.mdを更新しました。
```md
## 0.0.2

* Add documentation to classes and members.

## 0.0.1

* initial release.

```

### 4. dart pub publish --dry-runの実行
後はpackageの公開と同じ手順でpackageを更新することができます。
下記のコマンドを実行してpackage公開前の最終チェックを実施します。
このコマンドの実行により、公開するpackageのレイアウト規則に反していないか、余分なファイルが含まれていないかを確認することができます。
```
$ dart pub publish --dry-run
```

### 5. dart pub publishの実行
ここまでできたら、いよいよpackageの更新内容をpub.devにpublishします。
こちらもpackageの公開時と同様、以下のコマンドを実行します。
```
$ dart pub publish
```
コマンド実行後、`Do you want to publish focused_area_ocr_flutter 0.0.2 to https://pub.dev (y/N)?`と聞かれるので、`y`と回答します。
その後、以下のような表示があれば、packageの更新完了です！
```
Uploading... (2.8s)
Successfully uploaded https://pub.dev/packages/focused_area_ocr_flutter version 0.0.2, it may take up-to 10 minutes before the new version is available.
```

## 更新後のpub.dev
以下のように、version0.0.1→0.0.2の更新に成功しました。
![スクリーンショット 2024-04-14 22.56.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017091/a42433f0-06d9-3c4a-a3f0-91dc6a261199.png)
※更新直後はPENDING状態になるため、packageのPUB POINTSがしばらくの間0表記になります。

## 参考
- https://dart.dev/tools/pub/publishing
個人開発者がGoogle Cloudの環境構築でお財布を守るために最初にすべきこと

# 初めに
自分は2年くらい業務でGCP(今はGoogle Cloudですね)を使っていたのですが、友達が個人開発でGoogle Cloud使いたいから手伝ってとのことで、久々にコンソール触りたいなーと思ったので環境構築を手伝うことにしました。友達のクレジットカードが紐づいた環境なので自分の環境以上に課金やセキュリティに対して注意しなくてはなりません。~~課金だけでなく友情も爆発してしまいかねませんので~~
今回は最初期から構築するということで個人開発者向けにお財布や環境を守るうえでの最初にやったほうがよい課金のセーフティ的な設定をまとめていきたいと思います。企業で検証環境管理している人にも参考になるかと思いますので是非最後まで見てもらえると嬉しいです！

# 前提
- Google Cloudのプロジェクトを作成していること
- 課金アカウントを作成していること(クレジットカードの紐づけできていること)

# その1 予算アラートとメール通知を設定しよう
https://cloud.google.com/billing/docs/how-to/budgets?hl=ja

まずは予算アラートを設定し、メール通知を設定しましょう。予算額を設定し必要なメールアドレスの設定をすれば予算に対する閾値でメールが届くようになります。デフォルトでは設定した予算に対し、50%,90%,100%でアラートメールが届くようになりますが、個人開発で予期せぬ課金がされていることは避けなければいけないので、自分は25%,50%...など少し細かく設定しようと思います。
この設定では課金額が予算額を超えてもメールが届くだけで課金が止められないので、次は一定の金額になったらプロジェクトの課金が停止する設定をしましょう！


# その2 一定の金額になったらプロジェクトが停止するようにする
https://cloud.google.com/billing/docs/how-to/notify?hl=ja#cap_disable_billing_to_stop_usage

プロジェクトと課金アカウントの紐づけを強制的に解除することで課金を停止させることができます。その1で設定した予算にはPubSubと連携できる機能があるので、予算100%に到達したらPubSubとcloudFunctionで上記公式ページ中のコードをデプロイし、課金の強制停止の自動化を行うことができます。ただし強制停止すると一部リソースが削除されてしまう可能性があったり、インスタンスが正常に停止されない可能性があるなどで注意が必要です。バックアップやIaC等でリソースの再現性を高めておくと吉だと思います。
一度予算を低めに設定して課金が止まるのか必ずテストしておきましょう！万が一ツールが動かない→課金爆発は絶対に避けなければなりません。

※開発中のサービスを公開する場合、課金が止まる=サービス断につながるので、リリース後に関してはこの設定は非推奨です。あくまで予算が厳しく一時的に止めても問題ない検証用の環境などを想定しています。リリースするタイミングでprod用のプロジェクト立ててリリースすればややこしいことにはならないかもですね

## 余談
このスクリプト、自分の企業で使っている従業員用の検証環境でも入れたんですけど、GKEやSQLつけっぱなし→気づいたら課金されまってる！みたいなシチュエーションをある程度回避できるのでおすすめですね。
また、PubSubでなくてもcloudFunctionがキックできれば問題ないので、例えば課金情報をBigQueryにExportした上で、schedulerで1日ごとにcloudFunctionをキック。cloudFunction内でBigQueryクエリ叩いてプロジェクトA・B・Cの合計課金額が10万超えたら3つのプロジェクト停止する。なんて応用も効いたりします！

https://cloud.google.com/billing/docs/how-to/export-data-bigquery?hl=ja


# その3 手動で課金の有効化・無効化を行ってみる
https://cloud.google.com/billing/docs/how-to/modify-project?hl=ja#enable_billing_for_a_project

その2で行ったプロジェクトの自動停止をテストした後は、課金の有効化についても試してみましょう。基本的に課金アカウントの紐づけを再度有効化をするだけですが、万が一復元期間ギリギリで間に合わなかった！なんて事故を起こさないためにも一度確認しておくことをおすすめします。また、無効化についても仕事が忙しい間だけ個人開発をお休みする、なんてときにもチマチマした不要な課金が走らなくなるのでこちらも一度試しておくと良いと思います。
ちなみに、強制停止したプロジェクトの復元可能期間は30日です。復活させたい場合は30日以内に課金の有効化を行いましょう！

https://cloud.google.com/resource-manager/docs/creating-managing-projects?hl=ja#restoring_a_project


# まとめ
クラウドサービスは無料枠があるので工夫次第でかなり安く扱えて便利ですが、インスタンスの停止忘れなど思わないところで料金がかかりがちです。予算アラートと課金の上限さえ設定できてしまえばそれ以上は課金が走らなくなるので、ある程度お財布を気にせず安心して使えるようになると思います！

それでは良いクラウドライフを！
なぜmemchrやmemcmpではunsigned charにキャストするのか

42に入学してから最初の課題であるLibftというやつの予習をしていた際に、unsigned charを理解する必要があったため備忘録も兼ねて整理。

#### 3種類のchar
・char (-128~127 / 0~255)(←範囲はコンパイラによって異なる)
・signed char (-128~127)
・unsigned char (0~255)
（参考：https://qiita.com/mizcii/items/a5adb7a56b1c4a31951a）

memchrを実装する際にマニュアルを確認したところ、どうも与えられた文字をunsigned char型にキャストしてから行うらしい。なぜなのか？ 
発端はたったそれだけのことだったのだけれどこれが予想以上に深かった。
~~~c
void* memchr(const void* s, int c, size_t n);
~~~
![memchr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3769598/e37b87eb-e689-a4f1-f700-d3bd3d2ef346.png)


### Q. memchrやmemcmpはどうしてunsigned charなのか
### A. unsigned charの方が処理しやすいから。

charに移る前に、まずint型の話から。
int型の変数1つあたりの大きさは4バイト、つまり32ビット。（1バイト＝8ビット）
ここでint型の最大値、最小値を思い出す。
-2147483648 ~ 2147483647 (piscine中に覚えてしまった)
実はこれは2の31乗と関係がある。
2の31乗は2147483648。
31乗、32ビット。
これを2進数で表すと10000000 00000000 00000000 00000000
ちょうど32桁。
（ビットについてはまだどこか別の記事でまとめます。もし読んでいる人の中でビット列について曖昧な方がいらっしゃったら、とりあえず今は「ビット列はint型に代入されている10進数の値を2進数に変換して格納しているもの｟最終的に機械側が1と0だけを区別して処理していくため2進数｠」という理解で大丈夫だと思います）

ここで疑問。
intの最大値は2147483647
つまり01111111 11111111 11111111 11111111
 **一番左側のビット（最上位ビット）が空く。ここは空いていていいのか？**
答えはシンプルで、最上位ビットは**値の符号を判定しているところ。**
つまり、**最上位ビットが0のときは正の値で、1のときは負の値**、ということになる。
例：
~~~c
01111111 11111111 11111111 11111111 // 2147483647
	
00000000 00000000 00000000 00000001 // 1
00000000 00000000 00000000 00000000 // 0
11111111 11111111 11111111 11111111 // -1
	
10000000 00000000 00000000 00000000 // -2147483648
~~~

負の数の時は、**最上位ビット以外のビット列を反転（0を1にして1を0にする）したのもに1を足したあと、それに-1を掛ける**、という処理で値を取得できる。
例：　-1だったら
11111111 11111111 11111111 11111111 
→最上位ビット以外を反転：　10000000 00000000 00000000 00000000
→最上位ビット以降は全部0なので0、そこに1を足して1
→マイナスを掛けて-1

というような処理を機械が行っている。

signed char, unsigned charの場合も同様。
どちらも一つ辺り1バイトの大きさなので、例えば’a’は97という値に変換されるので
~~~c
01100001
~~~
というようになる。
そして異なるのが、最上位ビットの扱い。
Asciiコードに対応している文字は0~127、つまり00000000 ~ 011111111なので最上位ビットは特に関係ないのだが、signed charは最上位ビットを符号判定用のものとして処理する（だから範囲が-128~127）のに対してunsigned charは最上位ビットを値変換用のものとして扱う（だから範囲が0~255）。
例えば、10011110だったらsigned charだと-98に変換されてunsigned charだと158に変換される。

そして、機械的にはunsigned charの方が正の数と負の数で異なる処理をする～というようなややこしいことをしなくていいのでありがたいからmemchrやmemcmpはunsigned charにキャストしてから行っている、、、、

という理解。

（※あくまでc言語初学者が自分が調べた範囲内の知識で書いているだけですので、修正点・事実と異なる点などございましたら教えて頂けますと幸いです）

以上！
【Next.js】名前付きエクスポートをダイナミックインポートする方法

名前付きエスクポートをダイナミックインポートするには以下のように記述します。

```jsx:components/hello.jsx
'use client'
 
export function Hello() {
  return <p>Hello!</p>
}

```

```jsx:app/page.jsx
import dynamic from 'next/dynamic'
 
const Hello = dynamic(() =>
  import('../components/hello').then((module) => mod.Hello)
)

// ...

```

上記で`Error: Cannot access .then on the server. You cannot dot into a client module from a server component. You can only pass the imported name through.`というエラーが発生する場合には以下のように記述します。

```jsx:
import dynamic from 'next/dynamic'
 
const Hello = dynamic(async () => {
  const { Hello } = await import('../components/hello')
  return { default: Hello }
)

```
【Flutter】4/8~4/14でPrivacy Manifests対応したサードパーティSDK

Flutterで4/8~4/14に、Privacy Manifests対応したサードバーティSDKの一部を紹介をします.

# flutter_local_notifications: v17.0.1
v16.3.1+1で追加されてたと思いますが、4/13(土)に変更が加わったそうです。

![スクリーンショット 2024-04-14 23.08.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670224/63beac3e-9106-8c4a-8285-2e1caab43aed.png)
https://pub.dev/packages/flutter_local_notifications/changelog#1701

# fluttertoast: v8.2.5
4/14(日)に対応されたようです。
[#489](https://github.com/ponnamkarthik/FlutterToast/pull/489/files)にて対応されています。
![スクリーンショット 2024-04-15 10.18.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670224/2dade525-5d60-8cf3-4153-3894ba0b76e6.png)
https://pub.dev/packages/fluttertoast/changelog

# [flutter/packagesのアップデート](https://github.com/flutter/packages/pull/6355)

## url_launcher: v6.2.6
4/11(木)に対応されたようです。

![スクリーンショット 2024-04-14 23.10.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670224/2445623d-642d-3d88-af55-7f6a6058eb13.png)
https://pub.dev/packages/url_launcher/changelog#626

## image_picker: v1.0.8
4/11(木)に対応されたようです。

![スクリーンショット 2024-04-14 23.16.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670224/1cb0ee75-f814-d747-3963-4e0118642589.png)
https://pub.dev/packages/image_picker/changelog#108

## path_provider: v2.1.3
4/11(木)に対応されたようです。

![スクリーンショット 2024-04-14 23.19.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670224/04649f2b-8491-c73d-2b1c-74e135e55119.png)
https://pub.dev/packages/path_provider/changelog#213

## shared_preferences: v2.2.3
4/11(木)に対応されたようです。

![スクリーンショット 2024-04-14 23.22.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670224/8dbc3831-256d-7153-fe5b-79845860c894.png)
https://pub.dev/packages/shared_preferences/changelog#223

## video_player: v2.8.6
4/11(木)に対応されたようです。

![スクリーンショット 2024-04-14 23.28.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670224/e698848e-4565-b7ce-d5e6-830f1e9c1608.png)
https://pub.dev/packages/video_player/changelog#286
タスク管理アプリ作成②　〜ユーザー登録・ログイン機能〜

### はじめに

前回の作業↓
https://qiita.com/kuro_maru/items/aec4c1ac2911fe829f59
こちらの続きです。
今回は、laravel bleezeを使用してユーザー登録・ログイン機能を作成していきます。

### ユーザー登録機能・ログイン機能
※以下記事の方法と一緒でlaravelbleezeを使用して作成しました。
https://qiita.com/kuro_maru/items/0b67edaf32230f91ae81

:::note warn
laravel 11.xになってから、デフォルトのDBが"MySQL"→"SQLite"に変更されていた。
:::
今回、Dockerコンテナ内のDBにMySQLを作成し参照できるように設定を行う際に、いくつか変更点があったので以下にメモ📝

```config/database.php
// デフォルトのDBをSQLiteからMySQLへ変更
'default' => env('DB_CONNECTION', 'mysql'),
```
.envファイルの編集とdocker-compose.ymlファイルの作成を行う。
※config/database.phpファイルは、.envファイルを参照するので、上記の箇所以外のMySQLへの設定は.envファイルで行う

```
// laravel blesezeを導入
composer require laravel/breeze --dev

// laravel bleezeをインストール
php artisan breeze:install
```
`php artisan breeze:install`コマンドで、viewやその他の設定が選択できるようになってました。

```
// 依存関係のインストール(npmかyarnか)
npm install
yarn install

npm run dev
yarn run dev
```

```
// マイグレーションを作成
php artisan migrate
```

:::note alert
上記のマイグレーション作成コマンドで、ファイルの作成はされるのですがうまく読み込まれず、手動で作成したマイグレーションファイルを削除し、
php artisan migrate:reset
⇩
php artisan make:migration create_任意のテーブル名_table
⇩
php artisan migrate
※ここで、バイト数に関するエラーが複数出るので修正・再度実行
⇩
php artisan migrate:fresh
※設定を反映
:::
このように動作させるまで、苦戦しましたが上記を行うことでMySQLを参照しなんとか問題なく動作するところまではいきました。
手動で削除し、再作成しなくてもいい方法はあると感じます・・。

:::note warn
SQLiteでは、上記のエラーは出ず、実行コマンドもスルスル通り動作していたので、こだわりがなければデフォルトのSQLiteのが早いかも？
何故SQLにするとバイト数オーバーに関するエラーが出るのかはまだ調査できていません。
:::

![スクリーンショット 2024-04-14 23.39.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513569/92d66482-f94c-d408-37ef-0b00cd6a16cb.png)

これで、とりあえずユーザー登録・ログイン機能は作成できました。
※MySQLのバイト数オーバーに関するエラーは調査次第、また更新します。
[小ネタ]Ctrl + Alt + Del は人体にも使える

# はじめに
最近 [Ctrl + Alt + Del](https://e-words.jp/w/Ctrl-_Alt-_Delete.html) してますか？

・・・

こっちです。偶然見つけました。

https://www.youtube.com/watch?v=f34lY4nn1Qc

# 人体にも使える Ctrl + Alt + Del
ネタ感ありますが、IT に携わる方なら馴染みあると思いますし、良いこと言ってるので書き留めておきます。


* Control Yourself
* Alter Your Thoughts
* Delete Negativity

日本語にするとこんな感じでしょうか。

* [自制する、己に克つ](https://ejje.weblio.jp/content/control+oneself#google_vignette)
* [考えを柔軟に変える](https://eow.alc.co.jp/search?q=alter)
* [後ろ向きな姿勢、消極性の排除](https://eow.alc.co.jp/search?q=negativity)


これらは幸福論にもよく出てくる内容ですね。

https://ja.wikipedia.org/wiki/%E5%B9%B8%E7%A6%8F%E8%AB%96

https://diamond.jp/articles/-/206461

https://www.nhk.or.jp/meicho/famousbook/70_kofukuron/guestcolumn.html

心が疲れているな。ハングしてる気がする。と思ったら是非自身を `Ctrl + Alt + Del` してみてください。幸福に近づくのではないでしょうか。
※疲れた時は、再起動(眠る)のが一番だとは思います。

# おわりに
最後まで見ていただき、ありがとうございます。
少しでも読んでいただいた方の役に立てたら幸いです。


週一で投稿目指しています。もし何かリアクションをしてくれるとやる気が出るので、次週は投稿することを約束します。今のところ約束は履行されています（投稿なかった週はリアクションが前週になかったのだからと正当化して休んでます:grimacing:）
お前らは、「現実をモデリングする」が出来ていない。

# はじめに
**現実をモデリング**することがよくないという話をよく聞きます。
たとえば、商品というモデルは、複雑な構造になりがちです。目的を見失い、非効率なシステムになってしまう可能性があるからです。

# 本当「現実をモデリング」をしてたのか？
商品の注文を受け在庫を確認し発送するという仕組みがあったとします。

### DX前
![DX前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703178/ce87ba4e-4743-06b6-8398-e5ea19eb1385.png)

今回これをDXかしようということになりました。
### DX後
![DX後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703178/ce6e0ac6-d1a5-01fd-81f6-54149a4714b4.png)

DX化により青線の内側がシステム化されました。

# 「システムに置き換わる現実」をモデリングする
「現実をモデリング」としてするべきは、システムに置き換わる事務のお姉さんであり、各種帳票です。システムの外にある現実をモデル化しようとするからおかしくなってしまうのです。

このように、**現実をモデリング**すると破綻してしてしまうのは、そもそもモデリングしようとするモノ自体が間違っているため、どんどん崩壊していくんだと思います。

#### 本当の意味で現実をモデリングすることが重要なんではないかと(´・ω・`)