OmniAICreator/Qiita-1.07M huggingface dataset:
Meta Horizon Workroomsでデイリースクラムしてみた！未来の働き方を体験レポート

# **1. はじめに**

こんにちは！

私は会社の技術研究を行う組織に所属しており、その中でも**XR**や**メタバース**、**空間コンピューティング**といった分野を研究しています。「自分たちの業務に最新技術を取り入れて、実際の体験から可能性を探る」ため、今回は**Meta Horizon Workrooms**を使って毎朝のデイリースクラムを実施しました。

この記事では、その体験を共有しながら、セットアップ方法や利用時の気づき、メリット・課題を詳しくお伝えします！「Horizon Workroomsってどんな感じ？」「実際の仕事に使えるの？」といった疑問にお答えする内容になっていますので、ぜひ最後まで読んでみてください。

---

# **2. Meta Horizon Workroomsとは？**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944959/c898e408-720f-01a1-cfdd-eab347196069.png)


**Meta Horizon Workrooms**は、VR空間でチームのコラボレーションを可能にするツールです。Meta（旧Facebook）が提供しており、**Meta Quest 3**などのVRヘッドセットを活用することで、仮想空間でのミーティングが行えます。

- **特徴：**
    - **アバターのリアルな動き**：ヘッドセットのトラッキングで、話している相手のアバターが自然に動く。
    - **空間音声**：アバターの位置によって、声がどこから聞こえるかが変わる。
    - **バーチャルデスク環境**：PC画面の共有が可能。
    - **没入感**：まるで同じ部屋にいるような感覚を得られる。
- **他のツール（ZoomやTeamsなど）との違い**
    Workroomsの最大の違いは、視覚や聴覚に働きかける**没入感**です。会議が「ただの画面越しの会話」から、「同じ空間での対話」に変わります。
    

---

# **3. セットアップの流れ**

- **必要なもの：**
    - Meta Quest3（または他の対応デバイス）
    - Horizon Workroomsアプリ
    - Meta Quest Remote Desktopアプリ
- **インストール方法や初期設定の手順：**
    1. Meta Quest3でMeta Horizon Workroomsのインストール
    2. PCでMeta Quest Remote Desktopのインストール
    https://www.meta.com/ja-jp/help/quest/articles/horizon/getting-started-in-horizon-workrooms/use-computer-in-VR-workrooms
    
    3. PCとMeta Quest3のペアリング
    4. デスクの設定
    5. 会議室の作成

---

# **4. 実際に使ってみた気づき**

![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944959/332492e1-c4c9-0a7c-b52d-9e2c279f5b5c.png)


ルームに入ると設定したデスク部分のみパススルーになりPCのキーボードを確認できるようになります。目の前に仮想ディスプレイが表示され、PCのキーボード、マウスで操作可能です。

実際にWorkroomsを使ってみると、仮想空間ならではのメリットや課題が見えてきました。

- **良い点：**
    - ネットワーク環境にもよるがキーボードやマウスの遅延も少なく、快適に作業ができる。
    - いつもと違う環境での作業は新鮮で楽しい！
- **課題：**
    - 仮想ディスプレイが一画面のため作業スペースとして長時間利用には向いていない
    - ネットワーク環境の影響を受けやすく、通信環境がよくないとキーボードやマウス操作のラグが発生する。
- **デイリースクラムでの効果：**
    - 他のオンラインミーティングと違い、自分が話している人のアバターの方を向くとアバターも同じように動くので話し手としては話しやすくなった。
    - ボディランゲージを使えるという点で、言いたいことが相手に伝わりやすくなった。
    - アバターがいるということが原因かは不明だがデイリースクラムの前後に雑談をすることが増えた。
- **チームメンバーの感想：**
    - WorkRooms を使うと、会議により集中できる気がする。
        - PC の操作がしにくいので、他の作業に手を出しづらい
        - 周囲を見渡すと他の参加者や PC の共有画面が視界に入り、バーチャル空間に没入できることが良いと感じる。
        - パススルー（現実世界を取り込む表示モード）よりも、完全にバーチャルな空間のほうが余計なノイズがなく、集中しやすい印象を受けた。

---

# **5. 他のシチュエーションでの活用可能性**

今回Meta Horizon Workroomsでデイリースクラムを実施して気づいたこととして通常のオンライン会議よりも会話における**心理的安全性が高まった**と感じました。そのことから、**多くのアイデアを出す必要がある場面やブレインストーミング**で、こういったバーチャル空間でのコミュニケーションツールを使うことで活発に意見が出やすくなるのではないかと感じました。

また、**上司との1on1**で使うことで普段よりもカジュアルな場になりお互いに本音を話せるようになると思いました。

---

# **6. まとめ**

今回、Meta Horizon Workroomsを使ってデイリーミーティングを実施したことで、バーチャル空間での会議が持つ可能性を強く実感しました。アバターを通じたボディランゲージや、臨場感のあるコミュニケーションが、通常のオンライン会議では得られない新たな価値を提供してくれました。

特に、心理的安全性が向上し、会話がスムーズになる点や雑談が増えるといった効果は、リモートワークの課題である「疎外感」や「コミュニケーション不足」を解消するヒントとなるかもしれません。一方で、仮想ディスプレイの限界やネットワーク環境への依存といった課題もあるため、全ての業務に適しているわけではありませんが、適切な用途を見極めれば、大きな効果を発揮するツールだと感じました。

メタバースやVR技術がどのように働き方を変革していくのか、引き続き注目していきたいです。

---

# **7. 参考リンク**

- Horizon Workrooms公式サイトのリンク
    
    https://forwork.meta.com/jp/horizon-workrooms/


（※投稿内容は個人の意見であり、所属組織の公式見解ではありません。）
DOMとは？ツリー構造とAPIの両面から理解する

# 1. はじめに
DOMやDOM操作という言葉を耳にするたび、
「DOMってなんとなくイメージはついているけど、自分の言葉で説明できないな」
「DOMを操作するって具体的にどういう行為のことを指しているのだろう？」
と、曖昧な理解のまま聞き流してしまっていました。

DOMが何を指しているのか、DOM操作とは何なのか、について説明できるようになるため、DOMについてまとめます。

#  2. DOMとは
DOMとは  **ドキュメントオブジェクトモデル (Document Object Model)**  の略です。


DOMとは何か調べてみると、
「Webページの要素やコンテンツをツリー構造で表現したデータモデルのこと」
「HTMLやXMLドキュメントなどのマークアップ言語を、JavaScriptなどのプログラミング言語からアクセスできるようにするためのAPI（アプリケーションプログラミングインターフェース）」
というような説明が出てきます。

ツリー構造のモデル？API？どっちなんだろう？？
と混乱してしまったのですが、DOMという言葉は、この2つの意味を含んでいるということです。

:::note warn
以下、「モデルとしてのDOM」と「APIとしてのDOM」に分けて説明しますが、両者を合わせてDOMという概念であり、厳密に分けられているものではありません
:::

## 2-1. モデルとしてのDOM
モデルとしてのDOMとは、HTMLやXMLのドキュメントをオブジェクトとして扱うデータモデルです。
ドキュメントをどういう構造にして、どう操作するのかを定義したものです。

モデルとしてのDOMは、ドキュメントを操作するためにドキュメントを**ツリー構造（階層構造）として表現する**と定義しています。
このツリー構造を**DOMツリー**と呼びます。

このDOMの仕様自体は、概念として定義されているため実体はありません。
実際のブラウザは、**この仕様に基づいてDOMツリーをメモリ上に構築**します。

例えば、以下のようなHTMLドキュメントがあります。

```html
<html>
  <head>
    <title>DOMとは？</title>
  </head>
  <body>
    <h1>Hello, DOM!</h1>
    <p>これはDOMの説明です。</p>
  </body>
</html>
```

これは以下のようなツリー構造（DOMツリー）で表現されます。

```
Document
│
├── <html>
│   ├── <head>
│   │   ├── <title> → "DOMとは？"
│   ├── <body>
│       ├── <h1> → "Hello, DOM!"
│       ├── <p> → "これはDOMの説明です。"
```

ツリー構造について、詳しくは以下の記事を参考にしてください。

https://udemy.benesse.co.jp/development/dom.html#:~:text=%E8%AC%9B%E5%BA%A7%E3%82%92%E6%8E%A2%E3%81%99%20%EF%BC%9E-,DOM%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%A8%E3%81%AF%EF%BC%9F%E3%83%84%E3%83%AA%E3%83%BC%E6%A7%8B%E9%80%A0%EF%BC%88%E9%9A%8E%E5%B1%A4%E6%A7%8B%E9%80%A0%EF%BC%89,-DOM%E3%81%AF%E3%80%81HTML


つまり、ドキュメントをツリー構造（階層構造）として表現するという定義も含め、
ドキュメントを操作できるようにするためのモデルをDOMと言います。
この文脈で使用されるのが、モデルとしてのDOMです。

## 2-2. APIとしてのDOM
APIとしてのDOMは、HTMLやXMLのドキュメントとJavaScriptなどのプログラミング言語を接続するという文脈で使用されます。

DOM APIはDOMツリーを操作するためのプログラムインターフェースであり、JavaScript などのプログラムからDOMツリーを操作するためのメソッドやプロパティを提供するということです。


:::note info
APIとは、ソフトウェアやアプリケーションを繋ぐインターフェース（接点）のこと。
つまり、DOM APIによってプログラムがDOMツリーを操作できるようになる。
:::

よく使用されるAPIについては以下を参照してください。

https://developer.mozilla.org/ja/docs/Web/API/Document_Object_Model/Introduction#:~:text=increased%20border%22%3B-,DOM%20%E3%81%AE%E4%B8%AD%E3%81%A7%E6%A0%B8%E3%81%A8%E3%81%AA%E3%82%8B%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%82%A4%E3%82%B9,-%E3%81%93%E3%81%AE%E7%AF%80%E3%81%A7%E3%81%AF%E3%80%81%20DOM


# 3. DOM操作とは
「DOMを操作する」とは、ブラウザがメモリ上に保持しているDOMツリーを、JavaScriptなどのプログラミング言語で変更・追加・削除することを意味します。
つまり、HTMLやXMLの構造や内容を、プログラムによって変更することです。

具体的には、以下のような内容がDOM操作に該当します。

・HTML要素を取得する（例:\<p>の内容を取得）
・HTML要素を作成する（例: \<div> を新しく作る）
・HTML要素を追加・削除する（例: \<ul> に \<li> を追加）
・HTML要素の内容を変更する（例:\<h1> のテキストを変更）
・HTML要素のスタイルを変更する（例: \<p> の色を赤にする）


**DOMを操作するため**に、JavaScript などのプログラムから**DOM APIを使用**します。
DOM操作でよく使用されるメソッドについては以下を参照してください。

https://qiita.com/nobu19119516/items/befa18f7f187f3621819

# 4. 最後に

「DOM」という言葉が様々な文脈で使用されているため、その違いを認識できておらず、曖昧な理解のまま放置してしまっていました。
今回アウトプットするために時間をかけて様々な情報を見たことで、やっと自分の言葉で説明できるようになり、その過程で新しい知識も得ることができました。
諦めずに時間をかけてインプットとアウトプットを繰り返し、理解を深めていきたいと思います。

最後までお読みいただきありがとうございました！
【Rails】has_secure_passwordの性質

## はじめに

こんにちは。アメリカで独学でエンジニアを目指している者です。現在は Rails チュートリアルを使って学習を進める中で、`has_secure_password` のテスト時の扱いについて調べました。以下に、テストで使用する際の注意点をまとめています。

## has_secure_passwordの注意点

Rails の `has_secure_password` を使用したモデルをテストするときには、いくつか押さえておきたいポイントがあります。特に、テスト環境と本番環境の挙動の違いを理解しておくとスムーズです。

##  `password` と `password_confirmation` の扱い

通常、アプリケーション内でユーザーを新規作成する際には、`password` と `password_confirmation` を渡すだけで自動的にハッシュ化され、`password_digest` カラムに保存されます。しかしテスト環境では、バリデーションやコールバックの動きが本番と異なる場合があるため、注意が必要です。

## Fixture を使う場合

### `password_digest` を事前に用意する必要

Rails のフィクスチャを用いてユーザーを登録する場合、通常のコールバックによるハッシュ化処理は実行されません。そのため、**あらかじめハッシュ化したパスワード**を `password_digest` に代入する必要があります。

```ruby
class User < ApplicationRecord 
  def User.digest(string)
    cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost
    BCrypt::Password.create(string, cost: cost)
  end
end
```

```yaml
# users.yml
michael:
  name: "Michael"
  email: "michael@example.com"
  password_digest: <%= User.digest("password") %>
```

このように ERB を使って `User.digest("password")` を呼び出すことで、事前にハッシュ値を生成し、フィクスチャに埋め込むことができます。


### ログインを想定する

以下のような統合テストを用いることで、実際のログイン機能が正しく動作しているかを確認できます。

```ruby
require "test_helper"

class UsersLoginTest < ActionDispatch::IntegrationTest

  def setup
    @user = users(:michael) # fixture/user.ymlで定義したmichaelのレコードを取得
  end

  test "login with valid information" do
    post login_path, params: { session: { email: @user.email, password: 'password'} }
    assert_redirected_to @user
    follow_redirect!
    assert_template 'users/show'
    assert_select "a[href=?]", login_path, count: 0
    assert_select "a[href=?]", logout_path
    assert_select "a[href=?]", user_path(@user)
  end
end
```

- `post login_path, params: ...` によりログインフォームからのリクエストをシミュレートします。
- フィクスチャから読み込んだユーザー（`@user`）に対し、平文パスワードを渡して認証し、成功時はユーザーの詳細画面にリダイレクトされるかをテストします。
- `assert_select`によるリンクの有無の確認で、ログイン状態であることを検証します。

## テスト速度に関する考慮

`has_secure_password`は内部的にbcryptを利用するため、テストの回数が多いほどパスワードのハッシュ化で時間がかかる可能性があります。テスト速度を意識する場合は、本番環境よりもコストを下げる設定が有効です。
`User.digest`ではそれが考慮されたコードになっています

```ruby
# config/environments/test.rb
Rails.application.configure do
  # bcryptのコストを下げる
  ActiveModel::SecurePassword.min_cost = true
end
```

## まとめ

1. テストでは`password`と`password_confirmation`を正しく指定する。
2. Fixtureを使う場合は**あらかじめハッシュ化された**パスワードを`password_digest`に登録する必要がある。
3. ログイン処理のテストでは、正しいメールアドレスとパスワードを送信し、リダイレクトやリンクの表示などを確認する。
4. テスト速度を意識する場合は`ActiveModel::SecurePassword.min_cost`の設定を利用する。
JSTQB Foundation Level のシラバスで図にできそうなものをまとめてみた

## ◽️はじめに
先日JSTQBのFoundation Level試験に合格しました。試験に出題されるシラバスは図がなくテキストのみなので、振り返りふくめ直感的に理解したく図にまとめてみました。これから試験に挑戦される方の参考になれば幸いです。

## ◽️先に体験記
- 対象のシラバス：V4.0
    - 試験1週間前に誤ってV3.1で学習してたことに気づき、慌てて差分を勉強しました...
- 勉強時間：およそ30時間
    - 3時間×10日ほどでシラバス2周と模擬問題を解く時間は足りました
    - 最初から正しいシラバスを利用してたらもう少し模擬問題に時間を費やせたかなと思います...
- 使用した教材：
    - JSTQB配布の[シラバス](https://jstqb.jp/syllabus.html#syllabus_coreadvanced)
    - [テス友](https://www.qbook.jp/info-testomo/)（アプリ）
    - [スクエアリングサービス　スクエア・テイスタ](http://squaring.jp/EC03-FL/00-index.jsp)
- モチベーションの維持：
    1日の勉強の終わりに「テス友」などで全章の模擬問題を解いていきます。最初の数日は後の章を勉強してないまま問題を解くので点は低いですが、勉強するごとに正解率は上がっていくのでモチベーションの向上に繋がりました
    また、この今回初めてAIエージェントを利用しながら学習を進めたのですが個人的にすごく捗ったのでおすすめです。例えば「ウォークスルーとインスペクションってどう使い分けるの？」→「じゃあ〇〇な場面ではウォークスルー。△△な場面ではインスペクションって使い方がいい？」のように自分の言葉で質問と確認ができるので理解しやすいです。ただ稀に間違った例を出したりするのでシラバスと見比べながら進めると良いです
- 試験を受けた感想：
    模擬問題は無料のサービスしか使いませんでしたが、個人的にはテス友の問題が実戦に近かったです。ただ、他の体験者の方の意見でも見受けられますがテス友の問題より少し捻ったり、踏み込んだ問題だったなという印象でした。スクエアリングサービスの問題はまだ最新のシラバスに対応してなさそうではありますが、こちらも理解が深まるのでやってみて損はないかなと思います

## ◽️本題
シラバスの中で図にした方が理解しやすそうだなーと思ったものをまとめました。これを見ればOKというわけではないですが、理解の促進につながれば幸いです。

### テスト活動とタスク（と各活動に紐づくテストウェア）

![テスト活動とタスク.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/768277/50e28651-06da-2c34-44cc-0bb209a61910.png)

### テストレベル

![テストレベル1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/768277/988aadb4-5310-49b8-524b-c0c04191c460.png)


### テストの四象限

![テストの四象限.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/768277/f94cd4eb-8009-f532-8fe7-760bd611c707.png)

## ◽️おわりに
既に図説されてる方たくさんいらっしゃいますので、図で理解する方が楽な方はぜひ検索してみてください！私も引き続き上位試験をうけようと思ってるので、これから試験を受けられる方一緒に頑張りましょう！
AWS Builders card会主催レポ

## はじめに

re:invent2024でAWS BuildersCardをゲットしたので、前回は参加者側だったAWS BuilderCards会を主催しました！

前回の記事はこちら↓

https://qiita.com/am_i-12/items/a5b90db2ba372418f163

## AWS BuilderCardsとは
以下の説明によれば、AWSのベストプラクティスや、Well-architected Architectureを、楽しみながら学べるゲームのようです！


> AWS BuilderCards は、Amazon Web Services が提供するクラウドサービスや、サービスを組み合わせたアーキテクチャを学べるカードゲームです。
>
> サービスを組み合わせてアーキテクチャを構成する思想は、ビルディングブロックと呼ばれます。AWS BuilderCards を通じて AWS が提供している数多くのサービスを組み合わせて「可用性が高く」、「柔軟性があり」、「拡張性のある」、「セキュリティが適用された」システムを作り上げる Well-Architected なアーキテクチャを学ぶことができます。

通常版とAI拡張版は2~4人、Resiliernce版は4人でのゲームが推奨されています。

引用元↓

https://aws.amazon.com/jp/builders-flash/202405/japanese-builder-cards/

## 開催概要

前回できなかった拡張版にチャレンジしました！

#### 場所
会社の会議室

#### 参加者
チームメンバー 3人

#### 流れ
- ルール説明
- 1回戦　AWS BuilderCards 通常版
- 2回戦　AWS BuilderCards AI拡張版
- 3回戦　AWS BuilderCards Resilience 版

ルール説明に使わせてもらったシートはこちら↓

https://x.com/98lerr/status/1763890092173922495 

## カード紹介

- ポイントが多く獲得できて人気だったCloudwatchカードやAWS configカード
![IMG_3712.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851817/69e9a190-f32c-d035-5ab9-8e014973e48d.jpeg)
<br>

- 単体では効果が薄い、EC2 autoscalingやFargate
![IMG_3713.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851817/8e91843d-449c-edb7-d4c2-f766f421f99e.jpeg)
<br>

- AI系のカードは比較的少ないポイントで買えるため、人気でした
![IMG_3714.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851817/b8e7d27f-adcd-f4aa-b912-ec62913b570b.jpeg)
<br>

- 一回効果使ったら、捨てなければいけないカード。夕陽のマークはカードを捨てることを意味する。
![0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851817/df8617d6-0ecb-9088-456d-05b9c80edc28.jpeg)


## 感想

とっても面白かったです！あっという間に2時間が経ちました。
AI拡張版とResilience版は購入ポイントが低かったので、既存のデッキと組み合わせて、持ちカードに加えやすかったです。

全ての拡張版にS3カードが入ってて、場がS3過多になっている瞬間があって面白かったです。
![0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851817/f9876852-f197-1753-c5f1-2bb33021a2fe.jpeg)

一緒にゲームをしたのは、チームメンバーだったのですが、皆AWSを業務で使っているのでカードの効果や、カードと実サービスの親和性について話が弾んで楽しかったです。

今回は通常版ルールの中で、カードを足して行いましたが、AI拡張版とResilience版でもオリジナルゲームがありそうだったので、今度はそれもやってみたいと思いました。

![IMG_3716.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851817/aab3d36a-f8e9-dd75-bc82-1692545b4df0.jpeg)

以上です。ありがとうございました。
【VBA】Excelの関数に入っているファイル名を削除するVBAマクロ

# はじめに
Excelの関数に入っているファイル名を削除する必要があるため、調査とテストマクロを実装した結果、パフォーマンスの良いマクロを実装できたので、本記事にします。

## 調査した経緯
マクロファイルと納品ファイルを別ファイルにしています。
集計結果をマクロファイルから納品ファイルにコピーする際、関数を使っているため、関数内にマクロファイルのファイル名がファイル名参照に残っていました。マクロファイル、納品ファイル、双方参照するデータシートが同じ名前で存在するため、マクロファイルを関数から取り除く必要があるため。

## 実装したソースコード
実装したソースコードは下記になります

```VBA
'関数に入っているファイル名を取り除く処理

Sub remove_test2()
    'ワークブック変数の定義
    Dim wb1 As Workbook
    'ワークシート変数の定義
    Dim ws1, ws2 As Worksheet
    '開始行、最終行の変数定義
    Dim first_row_num, last_row_num As Long
    'カウント変数の定義
    Dim i As Long
    '修正前の関数の入った変数定義
    Dim value As String
    '修正後の関数の入った変数定義
    Dim result As String
    'マクロファイル名の変数定義
    Dim modefy_file As String
    'データファイルの変数定義
    Dim file_name As String
    'セルのデータ班の変数定義
    Dim cell As Range
    
    file_name = "C:\chargeability\コピー先関数データ.xlsx"
    modefy_file = "関数ファイル名取り除きテスト.xlsm"
    Set wb1 = Workbooks.Open(file_name)
    Set ws1 = wb1.Worksheets("Sheet1")
    Set ws2 = ThisWorkbook.Worksheets("社員データ")
    
    first_row_num = 3
    last_row_num = ws1.Cells(Rows.Count, 2).End(xlUp).Row
    
    '開始行から最終行まで関数の中にファイル名が入っていれば取り除く処理
    For Each cell In ws1.UsedRange
        If cell.HasFormula Then
            cell.Formula = Replace(cell.Formula, "[" & modefy_file & "]", "")
        End If
    Next cell
    'ファイル名の保存
    wb1.Save
    
    'ワークブック、ワークシート変数を除去
    Set ws1 = Nothing
    Set ws2 = Nothing
    Set wb1 = Nothing
  
    
End Sub
```

## ポイント
```
'ワークシート内の全てのセルをループする。
For Each cell In ws1.UsedRange
        'セルが数式を持っていれば、数式からマクロファイル名を取り除く
        If cell.HasFormula Then
            cell.Formula = Replace(cell.Formula, "[" & modefy_file & "]", "")
        End If
    Next cell
```

セルの中に数式(関数)が含まれていれば、数式(関数)にあるマクロファイル名を取り除きます。

# 最後に
少しでもお役に立てると幸いです。
Metasploit frameworkのRPMをDNFでインストールするメモ

一発で出てこなかったのでメモです

Fedora40で確認済み

```bash
sudo dnf config-manager --add-repo http://rpm.metasploit.com/
sudo dnf install metasploit-framework
```

libcrypt.so.1 が足りなかったので libxcrypt-compat をインストール
```bash
sudo dnf install libxcrypt-compat
```

/opt/metasploit-framework 配下にインストールされるので PATHも通す
```bash
#初回だけ実行
echo 'export PATH="$PATH:/opt/metasploit-framework/bin"' >> ~/.bash_profile
source ~/.bash_profile
msfdb init 
```

msfconsoleを実行
利用するlisten port/fileに応じて sudo 
```bash
msfconsole
```
mysql起動後数日経ってログインしたら失敗した

## 概要
mysqlのインストール&デーモン起動まで行って満足してしまい、10日ほど経って初期パスワードによりログインしようとしたところ、なんと入れない...！
(初期パスワードは/var/log/mysqld.logに吐かれている)

初期パスワードの有効期限が数日で切れるというポリシーも見当たらないし困ったなぁということで、パスワードリセットでなんとか対処しました。
同じような事象に遭遇された方いらっしゃいますでしょうか(というかすぐにパスワード変更をしておくべきでした)。

## 対処コマンド
mysqldを一旦止めて
```bash
$ systemctl stop mysqld
```
一時的にパスワード無しで全権限に触れるよう下記オプションを設定
```bash
$ systemctl set-environment MYSQLD_OPTS="--skip-grant-tables"
```
mysqldを起動し、パスワードを再設定しました
```bash
$ systemctl start mysqld
$ mysql -u root
```
```sql
mysql> FLUSH PRIVILEGES;
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';
```

なお、設定完了後はmysqld停止→変数"MYSQLD_OPTS"を空にし直す→mysqld起動を行っています

```bash
$ systemctl set-environment MYSQLD_OPTS=""
```

## 参考
https://dev.mysql.com/doc/refman/8.4/en/resetting-permissions.html
WindowsにVSCodeとGit Bashを入れてGitHubに繋ぐまで

# Windowsでの環境構築

最近**Windows PCで開発環境を整える**機会があったので、備忘録としてまとめておく。
（今まではMacやLinuxなどの環境で作業することが多かった）
ここでは**WindowsにVSCodeとGit Bashを入れ、GitHubにssh接続するまでの手順**をまとめる。


# 1. Visual Studio Code (VSCode)を入れる

まずはエディタとしてVSCodeを入れていく。
VSCodeはMicrosoftによる高性能なエディタで、統合開発環境(IDE)のように使うこともできる。
エディタやIDEにはいろんな種類があるが、自分の場合は機械学習モデルの構築が目的なので、デファクトスタンダードとなっているVSCodeを選んだ。
Windowsの場合は[VSCode公式サイト](https://code.visualstudio.com/)からダウンロードする。

![スクリーンショット 2025-02-06 075556.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547532/7bf90b96-c553-0abc-d538-f502bff9fd9c.png)

ダウンロード後、PCにインストールして開けばすぐに使えるようになる。

# 2. Git Bashを入れる

VSCodeからターミナルを開いてコマンドを実行できるが、デフォルトのシェルはPower Shellとなっている。
よりLinux likeな環境でgitコマンドを使いたいので、Git Bashを導入する。

こちらも公式サイトから[Git for Windows](https://git-scm.com/downloads)をダウンロードする。

![スクリーンショット 2025-02-06 080001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547532/0bdd0fdf-f409-9bb0-bbaf-2c2cc337c7e1.png)


インストール時のチェックボックスは基本的にはデフォルト設定でOK。
途中で「Git Bashをデフォルトのターミナルにするか」といったオプションがあるので、チェックを入れる。
インストール後にVSCodeのターミナルを開くと、PowerShellやCommandPromptに加えて、**Git Bashを選べるようになっている**はず。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547532/e786ef98-9f0b-47b6-8d8d-fabe866ceb6e.png" width="450">



# 3. SSH接続用のkeyを生成
次にGitHubとの接続を行う。
`https`と`ssh`と二つ接続方式があるが、ここではsshの方針にする。
特定のGitHubのリポジトリをクローンするために、まずはSSHキーを設定する。

ターミナル（Git Bash）を開き、以下のコマンドを実行。

```bash
$ ssh-keygen -t ed25519 -C "your_email@example.com"
```
メールアドレスは各自のものを入力。
途中で **「Enter file in which to save the key」** と聞かれるが、そのままEnter。
（デフォルトで ~/.ssh/id_ed25519 に保存される）
作成された鍵を確認する。

```bash
$ ls ~/.ssh
```

`id_ed25519`（秘密鍵）と `id_ed25519.pub`（公開鍵）があればOK。

:::note info
**Ed25519ってなに？**
現在推奨されるSSH鍵のアルゴリズム。
RSAよりも強力で短い鍵長などの特徴がある。
参考：https://zenn.dev/kohno/articles/cd33239bf12e5f
:::


# 4. GitHubにSSHキーを登録
次に、GitHubの設定ページでSSHキーを登録する。

GitHubにログインし、
右上のアイコン`Settings`
左のメニューから→ `Access` → `New SSH Key` を順番にクリック

![スクリーンショット 2025-02-06 083853.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547532/4a9bb5ed-249f-dc97-90df-097fdbaad8ca.png)

タイトルに"My PC" など適当な名前をつけ、先ほどの公開鍵（`~/.ssh/id_ed25519.pub`）の中身をコピペする。


次に、local環境でSSHエージェントにキーを登録する。
ターミナルから以下を実行。

```bash
$ eval "$(ssh-agent -s)"
$ ssh-add ~/.ssh/id_ed25519
```
登録されたことを確認する。
```bash
$ ssh-add -l
```
`id_ed25519`が表示されていればOK。

# 5. GitHubへの接続テスト

ここまでくればもう後はGitHubに繋ぐだけ。

```
$ ssh -T git@github.com
```

GitHub Enterpriseなどで独自ドメインを使っている場合は`git@github.com`の部分を適宜書き換える。
成功すると以下のようなメッセージが表示される。
```bash
Hi your-username! You've successfully authenticated, but GitHub does not provide shell access.
```

これでSSH接続は完了。

# 6. GitHubのリポジトリをクローン
実際にリポジトリをcloneしてみる。
cloneしたいリポジトリのCodeからSSHのURLをコピーする。
（例: git@github.com:your-organization/your-repo.git）

```bash
$ git clone git@github.com:your-organization/your-repo.git
```

クローンが成功すれば完了。
これでVSCodeでコードを書きつつ、CLIでGitHubに繋げるようになった。
RailsでPDFを作成する Ferrum で Ferrum::ProcessTimeoutError がでたときに疑うこと

Ferrum gem は Rails で PDF を作成する便利 Gem です。Chromium で動作します。
しかし、手元の環境（WSL2）では問題なく動作したのですが Ubuntu Server では動作せず以下のエラーが発生しはまったので対策を共有します。

> Ferrum::ProcessTimeoutError (Browser did not produce websocket url within 10 seconds, try to increase `:process_timeout`. See https://github.com/rubycdp/ferrum#customization):

## 環境

- Rails 7.0.2.2
- ferrum 0.16
    - https://github.com/rubycdp/ferrum
- Ubuntu 22.04.4 LTS
- Chromium 132.0.6834.110

## 結論

以下のコマンドで非rootユーザーでもログインしていなくてもサービスを実行するようにしておくと動作します。

```
sudo loginctl enable-linger アプリ実行ユーザ
```

このコマンドの help は Enable linger state of one or more users です。

## 背景

いろいろ設定が標準的ではないのですが設定など共有しておきます。
Rails内では以下のように browser を設定していた。

```ruby
    browser = Ferrum::Browser.new(
      browser_path: '/usr/bin/chromium-browser',
      browser_options: { 'no-sandbox': nil }
    )
```

`sudo apt install chromium-chromedriver` でインストールします。

しかし、ためしに chromium-browser を実行するとこんなメッセージが出て実行されません。

```sh
$ chromium-chromedriver --version
/user.slice/user-2.slice/session-12345.scope is not a snap cgroup
```

id 2 はアプリ実行ユーザに su するまえの別ユーザです。以下のようにすると動作します。

```
$ sudo loginctl enable-linger deploy

$ chromium-chromedriver --version
/usr/bin/chromium-browser: 12: xdg-settings: not found
Chromium 132.0.6834.110 snap
```

ちょっとこのへんの背景の権限まわりの理解が浅いままできょうしゅくですが、Ferrum や Chromium のサイト（ https://www.chromium.org/Home/ )では標準的なインストール・利用方法がなくはまり、Ferrum のエラーメッセージから原因特定に手間取ったため、どなたかの参考になればと共有します。

なにか根本的な勘違いをしているなどあればお知らせください。

あとで検索すると、こんなQAもありました。

https://askubuntu.com/questions/1444787/unable-to-launch-the-chromium-browser-via-puppeteer-on-ubuntu-22-04-after-a-rebo
【C#】変数の命名規則

# 前提
- ###  PasCalCase(パスカルケース)
###### 各単語の最初を大文字にする
ex) Myclass,GetUserName 等
- ###  camelCase(キャメルケース)
###### 最初の単語は小文字、以降の単語の頭を大文字にする
ex) myVariable,getUserName 等
ラクダに見える(らしい)
- ### アンダースコアは基本的に使わない
###### 例外あり
ex) プライベートフィールド、定数 等

# 各要素の命名規則
### クラス・インターフェース・列挙型
- ###### クラス名・構造体名 → PascalCase
ex) UserManager,ProductData 等
- ###### インターフェース名 → PascalCase + "I" プレフィックス
ex) IUserRepository,ILogger 等
- ###### 列挙型(enum) → PascalCase
ex) OrderStatus 等

:::note info
列挙メンバーもPascalcase
ex) pending,Shipped 等
:::
### メソッド
- ###### PascalCase
ex) GetUserName(),CalculateTotal() 等
- ###### 動詞 + 名詞の組み合わせが一般的
ex)LoadData(),UpdateRecord() 等

### 変数・フィールド
###### ローカル変数・パブリックフィールド
- ###### camelCase
ex) userName,totalAmount 等
###### プライベートフィールド
- ###### camelCase + _プレフィックス
ex) _connectionString,_userCount 等

### プロパティ
- ###### PascalCase
ex) Username,TotalAmount 等
- ###### Getter/Setterを使うことを考慮
ex) public string UserName {get; set; } 等

### 定数
- ###### すべて大文字 + アンダースコア
ex) MAX_COUNT,DEFAULT_TIMEOUT 等

### 名前空間
- ###### 企業名・プロジェクト名 + 機能単体
ex) CompanyName.ProjectName.Modulname 等

他にもあればコメントにてご教示ください。
追記します。

# 避けた方がいい命名例
### :x: 悪い例 ⇔ :white_check_mark: 良い例

:x: var x; ⇔ :white_check_mark: var userName;
:x: voidFUNC(); ⇔ :white_check_mark: void CalculateTotal();
:x: int tmp; ⇔ :white_check_mark: int retryCount;
:x: class myclass ⇔ :white_check_mark: class MyClass
:x: string STR_USER ⇔ :white_check_mark: string userName;
CentOS7でyumが使えない💦

### 概要
CentOS7をビルドして「とりあえずyum updateしとこかぁ。。」と実行したら躓くやつ💦※2025/2/6時点

### バックアップ
```
cp -ip /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
```

### ファイルの中身を全部削除
```
sed -i -e 'd' /etc/yum.repos.d/CentOS-Base.repo
```

### 使えるリポジトリ先URLが記載された内容をブッ込む！
```
cat <<EOL >> /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
baseurl=http://vault.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#released updates
[updates]
name=CentOS-$releasever - Updates
baseurl=http://vault.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
baseurl=http://vault.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
baseurl=http://vault.centos.org/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
EOL
```

### テスト
```
yum update
```
Microsoft365 管理センターから試用版ライセンスの期間を延長する

# はじめに
M365管理センターで試用版をお使い中の方向けの記事です
M365管理センターの操作手順を残します。
2025/02時点の画面スクリーンショットです
延長は1回のみです

# 手順

1. Microsoft 365管理センターにログイン、[課金情報]、[お使いの製品]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/7d4050c6-b5da-5d21-af03-454e0b601061.png)

2. 対象の製品名を選択。ここでは[Microsoft 365 Business Premium 試用版]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/f535296f-e49e-2360-da62-04212522d76c.png)

:::note info
試用版の有効期限が近いものはこの様にアラートが表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/01b1df5c-ff12-80c8-a419-d32a2b792c3f.png)
:::

　3.[終了日を延長]を選択
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/011a6083-ae26-9453-2f61-0a3b6a1946c2.png)
　
 4.この画面になれば無事に処理ができています。前の画面で次回期限日を確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/baa0e5bf-57b2-6d15-e479-91385631d8b4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/9a6617fe-bfd7-b6fe-0c79-14f138b3e6a9.png)

:::note warn
この有効期限を切れると課金が発生します。
試用版の利用を終わらせたい方はキャンセルを実施しましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579825/b1886784-5644-a94d-d2cc-14126416312d.png)

:::
PGスタイルシリーズ：これからの引数の話をしよう


関数の引数が大量になってしまうこと、ありませんか？

----
## 引数の性質
- だんだん増えていきがち（特にロジックが複雑な場合）
- 作っているときには増えていることのデメリットを意識しにくい

----
## 多すぎる引数の問題点
- 書きにくい
- それ以上に、読みにくい
- 正しく呼び出すのが難しくなる
  これが最も深刻。特に同じ型の引数が増えると順番が分からなくなる

----
## 大原則
- 順番に依存する処理は読みにくい
- 名前付けを優先する
  例えば、配列よりハッシュを採用

----
## 引数の性質
- 多くのPG言語で、引数は名前なしで呼び出せる
  → 関数を呼び出しているコードを見て、引数の意味を知ることができない
- 一方で、引数の名前を指定して関数を呼び出せる言語も多く存在する

----
## どう対策するか
- 引数を減らす：関数が大きすぎないか？と考える
- 名前でアクセスできるようにする
  同じ型の引数が多くなる場合に特に有用

```C#
public void DoOperation(a string, b string, c string, d string...)
{
   ...
}
```

```C#
public class DoOperationArgs
{
    public string A { get; set; }
    public string B { get; set; }
    public string C { get; set; }
    ...
}
public void DoOperation(args DoOperationArgs)
{
    ...
}
```

----
## 最後に
- 順番より名前
  これに尽きる
GitHub にコードを 2 回目以降 push する手順

# 変更されたファイルの確認
```
git status
```
→ 変更されたファイルが赤字 で表示されるので、どのファイルが更新されたのかを確認する。

# 変更を Git に追加
```
git add .
```
→ すべての変更を Git に追加（ステージング）
```
# 特定のファイルだけ追加する場合は、
git add ファイル名
```

# コミット（変更内容を記録）
```
git commit -m "変更内容を記録"
```
→ 変更内容を記録（「〇〇を修正」の部分は適宜変更）

# GitHub に push
```
git push origin main
```
→ リモートリポジトリ（GitHub）に変更を反映
世界一流から自分の仕事のやり方をレベルアップさせたい話

## はじめに
新年となり少し時間ができた時。エンジニアと切っては切れないドキュメントを読む。という作業が苦手な自分。
今年は文字を読む習慣をつけよう！と思い立ったら即やってみたくなり、本屋に出かけ気になる本を読んでみました。今年もよりよいエンジニアライフのため頑張るぞ〜！

## 読んだ本
今回読ませていただいた本はこちら↓

https://www.amazon.co.jp/%E4%B8%96%E7%95%8C%E4%B8%80%E6%B5%81%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E6%80%9D%E8%80%83%E6%B3%95-%E7%89%9B%E5%B0%BE-%E5%89%9B/dp/4163917683


## 概要
”圧倒的な生産性を生むスキル！”と題し、自称三流エンジニアである著者が実際にアメリカのマイクロソフト社で一流エンジニアから学んだ「思考法」（マインドセット）を紹介しています。一流、といっても同じ人間。では何が違うんだろう？という問いかけから


書籍目次はこのような感じです。
>第1章　世界一流エンジニアは何が違うのだろう？ 
　　　　-生産性の高さの秘密-
第2章　アメリカで見つけたマインドセット 
　　　　-日本にいるときは気づかなかったこと-
第3章　脳に余裕を生む情報整理・記憶術 
　　　　-ガチで才能のある同僚-
第4章　コミュニケーションの極意 
　　　　-伝え方・聞き方・ディスカッション-
第5章　生産性を高めるチームビルディング 
　　　　-「サーバントリーダーシップ」「自己組織型チーム」へ-
第6章　仕事と人生の質を高める生活習慣術
　　　　-「タイムボックス」制から身体づくりまで-
第7章　AI時代をどう生き残るのか？
　　　　-変化に即応する力と脱「批判文化」のすすめ-


## 学んだこと

章立てで考え方や行動について記載されていますが、今回は自分自身が使えそう、実践できそう、できたら一流になれるかも、と思った内容について備忘録も兼ねながら記載していきます。

---

### 脳内デバッグ

- 闇雲な試行錯誤はダメってこと。
- 不具合の原因を仮説として立て、それを確認する作業を行う。
- 先入観や経験に囚われず、冷静に切り分けを行うことが重要。

:::note info
私自身、不具合探究がすごく苦手で、原因は何かって考えた時に、あれもこれもって考えられるからそれを一つ一つ潰すように考えて時間をかけても結局単純なミスが原因なことが多い。
事前に切り分けの方針を立てることで、効率的に問題解決ができるようになりそう。
その整理をはじめは文字や絵に起こして、だんだんと脳内で整理できるようにしたい
:::

---

### どんな人でも基礎は大事

- できる人は最初からできてたわけじゃない、できるようになるまで基礎を知っていて、技術を自分のものにしている。
- 本当の理解とは、調べなくても実装できること。
- 分かったつもりにならず、一つずつ丁寧にコードを追うことが重要。

:::note info
ChatGPTに聞いて実装できたとしても、まだ本当に理解したとは言えない（ぐさり）。
調べなくても書けるコードを増やすことが、効率アップに繋がる。どの世界でも基礎が大事だってこと。
ただ業務を行なっていくと、実用をすぐに求められがち、ここは意識してドキュメント読んだり、スキップしないで1行ずつ読み込んだりしたい。
:::
---

### やることを一つに決める

- ほんとに重要な一つをピックアップする。そして決めたことへの時間を固定して、取り組む。
- マルチタスクは集中力を削ぐので、まずタスクを"完了"させる。
- 自分の時間を確保することが大切。

:::note info
自分は目の前に起きたことへすぐ目が行き、ちょこっとずつ進めがち。
タスク"完了"の達成感を味わいながら、整理整頓する。
タスクの管理方法も何がベストか、見極める。
またこの先、会議や教育などで他の人の時間が増えた場合でも、自分の時間をブロックする意識を持つ。
:::
---

### 学びのシェア

- 共有は具体的な状況よりも、学びやその意見、感想を伝える。
- チーム全体の財産になるのは「考え方」や「工夫の仕方」。

:::note info
自分も情報を共有する際、学びや考え方にフォーカスするようにしたい。こういう考え方から選択した理由を意識する。
そして物事への選択も過程と理由を意識し、共有する。
もちろん、新しいことへのチャレンジも忘れずに（そうしないと共有も何もない）
:::
---

### 技術のアウトプット

- 人に読んでもらう、説明できる記事を書くのは良いこと。
- 思い出すことが1番な記憶の定着に繋がるからこそ、説明できることは一つのチェックポイント。

:::note info
（やっててよかった、ぜひみんなも記事書こう☺️）
今までもいろいろアウトプットをしてきたが、もっと意識的に説明できるレベルまで理解を深めるようにしたい。
:::
---

### 短い会話

短時間のコミュニケーションの重要視。
「ちょっといい？」と聞くだけ。短時間だからこそ、簡潔に、簡単に相談する。
音声の方が、情報量も多くレスポンスも早い。細かなニュアンスの違いも気づける。

:::note info
特にリモートワークの場合の生産力を高めるための一つの方法だと感じた。
「聞きやすい雰囲気作り」も重要。"する/される"関係の構築から始めていく。
:::
---

### 良い仕事には良い身体
- 健康は仕事のパフォーマンスに直結する。
- 睡眠や適度な休憩（ディスプレイから離れること）が大切。

:::note info
エンジニアはなぜか筋トレが好きな人が多い（自分がやるかどうかは別として）。
リモートワークで常に座っている身、特に意識しなきゃと思い続けている。
個人的には早起きはやる気と時間の使い方がうまくできる気がするので、おすすめ。
:::

## おわりに
今回は書籍を通じて、学んだこと感じたことを記事にしました。共感と学びを同時に受けれて、面白い感覚でした。
ただ、考え方や思考は、私自身がアメリカンだなぁって思うくらい日本社会全体の常識とは異なるため、末端の自分がどうこうしても仕方ないことも多かった。その考えを知っていて、許容できるなんて、、と思っている自分もその仲間だよな、と考えさせられました。
今回の記事を通じてもっと詳しく知りたい！と思ってくれたらぜひ読んでみてくださいねー！
WindowsにPHP 8をインストールする手順

この記事では、Windows環境にPHP 8をインストールする手順を解説します。  
主にコマンドラインでの利用を想定していますが、必要に応じてApacheとの連携方法も紹介します。

## 1. Visual C++ 再頒布可能パッケージのインストール

PHP 8の動作には、Visual C++ 2015-2019 再頒布可能パッケージが必要です。  
以下のリンクからダウンロードしてインストールしてください。

- [Visual C++ 再頒布可能パッケージのダウンロード](https://aka.ms/vs/16/release/vc_redist.x64.exe)

## 2. PHP 8のダウンロード

PHP公式サイトから、最新のPHP 8のバージョンをダウンロードします。  
「VS16 x64 Thread Safe」のZIPファイルを選択してください。

- [PHP for Windows: Downloads](https://windows.php.net/download)

## 3. PHPの配置

ダウンロードしたZIPファイルを解凍し、任意のディレクトリに配置します。  
例えば、`C:\php`などです。

### 拡張モジュールの有効化（必要に応じて）

`php.ini` に以下の設定を追加またはコメントアウトを解除します。
※`php.ini` が無い場合は、`php.ini-development` を複製して作成します。

```ini
extension_dir = "C:/php/ext"
extension=mbstring
extension=gd
```

## 5. 環境変数の設定

PHPをコマンドラインから利用できるようにするため、環境変数 `Path` にPHPのディレクトリ（例: `C:\php`）を追加します。  
これにより、コマンドプロンプトやPowerShellから `php` コマンドを直接実行できるようになります。

## 6. 動作確認

コマンドプロンプトやPowerShellを開き、以下のコマンドを実行してPHPのバージョン情報が表示されるか確認します。

```sh
php -v
```

正常にインストールされていれば、PHPのバージョン情報が表示されます。

## 7. （オプション）Apacheとの連携

Apacheを使用してPHPを動作させる場合、`httpd.conf` に以下の設定を追加します。

```apache
LoadModule php_module "C:/php/php8apache2_4.dll"
PHPIniDir "C:/php/"
AddHandler application/x-httpd-php .php
```

設定後、Apacheを再起動してください。  
その後、`phpinfo();` 関数を使用して動作確認を行うと良いでしょう。
個人的な備忘録：本番環境で runserver を使いそうになり、一度立ち止まって開発環境との使い分けを整理してみた

## はじめに

Django を開発する際に、手軽にアプリケーションを動作確認できる `runserver` コマンドは非常に便利です。  

:::note alert
**しかし、これはあくまで **開発用の簡易サーバー** であり、本番環境での運用には適していません。**
:::

本記事では、`runserver` の使い方と、本番環境で推奨される **WSGI サーバー（Gunicorn など）** との違いについて解説します。

## 書こうと思ったきっかけ

Django で開発を始めたばかりの頃、`runserver` をそのまま本番環境でも使おうとしてしまったことがありました。  

:::note warn
***しかし、**パフォーマンスが低く、外部アクセスに対するセキュリティも脆弱** で、実際の運用には適さないことを知りました。***
:::

この経験から、**開発環境と本番環境で適切なサーバーを使い分けることの重要性** を学び、改めて整理しておきたいと思いました。

## Django の `runserver` コマンドと本番・開発での使い分け

### 1. Django の runserver コマンドとは？

Django には **開発用の軽量な Web サーバー** が組み込まれており、`runserver` コマンドを実行するだけでローカル環境でアプリケーションを起動できます。

**基本的な使い方**

```sh
python manage.py runserver
```

デフォルトでは、[http://127.0.0.1:8000/](http://127.0.0.1:8000/) でサーバーが起動します。

**ポートを変更する**

```sh
python manage.py runserver 8080
```

これにより、[http://127.0.0.1:8080/](http://127.0.0.1:8080/) で起動できます。

**IP アドレスを指定する**

```sh
python manage.py runserver 0.0.0.0:8000
```

これを指定すると、外部のデバイス（同じネットワーク内の PC やスマートフォン）からもアクセスできます。

### 2. 開発環境 (runserver) と本番環境 (gunicorn など) の違い

Django の `runserver` は **開発用の簡易サーバー** であり、本番環境での使用は推奨されていません。  

本番環境では `gunicorn` や `uWSGI` などの **WSGIサーバー** を使用し、`Nginx` や `Apache` と組み合わせて運用します。

:::note alert
**Django の `runserver` は **開発用の簡易サーバー** であり、本番環境での使用は推奨されていません。**
:::

本番環境では `gunicorn` や `uWSGI` などの **WSGIサーバー** を使用し、`Nginx` や `Apache` と組み合わせて運用します。

- **runserver（開発環境）の特徴**
  - シンプルで設定不要  
  - コードの変更を即時反映（ホットリロード）  
  - デバッグツール（`DEBUG = True`）が有効  
  - パフォーマンスが低い（シングルスレッド / シングルプロセス）  
  - セキュリティが弱い（本番環境向けの対策なし）  

- **本番環境（gunicorn や uWSGI）の特徴**
  - 複数プロセス・スレッド対応で高パフォーマンス  
  - `Nginx` や `Apache` と組み合わせて負荷分散が可能  
  - セキュリティ対策（リバースプロキシ、HTTPS対応）  
  - 設定やデプロイの手順が `runserver` よりも複雑  

### 3. 本番環境での Django サーバーの構成
本番環境では、WSGI サーバー + リバースプロキシ の構成を取ります。

#### **一般的な構成**

```markdown
クライアント（ユーザーのブラウザ）
        ↓
Nginx（リバースプロキシ、静的ファイル配信）
        ↓
Gunicorn / uWSGI（WSGIアプリケーションサーバー）
        ↓
Django アプリ（ビジネスロジック）
        ↓
PostgreSQL / MySQL（データベース）
```

#### **Gunicorn を使った Django の起動**

本番環境では `gunicorn` を使うのが一般的です。

**Gunicorn のインストール**

```sh
pip install gunicorn
```

**Django アプリを Gunicorn で起動**

```sh
gunicorn myproject.wsgi:application --bind 0.0.0.0:8000
```

**プロセスを複数並列実行する**

```sh
gunicorn myproject.wsgi:application --workers 3 --bind 0.0.0.0:8000
```

→ これで 3 つのプロセスが並列にリクエストを処理できます。

## まとめ

- `runserver` は **開発用の簡易サーバー** であり、本番環境での使用は推奨されない。  
- 本番環境では `gunicorn` や `uWSGI` を使用し、`Nginx` や `Apache` などと組み合わせるのが一般的。  
- **WSGI サーバーを利用することで、パフォーマンス向上・セキュリティ強化が可能。**  
- **開発と本番環境の違いを理解し、適切な構成を選択することが重要。**  

Django アプリを **安全かつ効率的に運用** するために、**開発と本番環境の違いを意識したサーバーの使い分け** を実践しましょう。
【NetSuite開発者必見！】ユーザーイベントスクリプトからユーザーイベントスクリプトを呼び出せない！？①

こんにちは。Oracle NetSuiteパートナー EvangSolの湯浅です。
今回は、弊社エンジニアが直面した、ユーザーイベントスクリプト（User Event Script：以下UE）に関する事象について、発生原因と対応策をご紹介いたします。

事象 – NetSuiteの「UEからUE」の呼び出しができない？
「UEからUEを呼び出したいのに動かない…」
---
NetSuiteで開発を行う際に「UEから別のUEを呼び出したいが、想定通りに動作しない」と悩んだことはありませんか？弊社エンジニアもまさにこの仕組みを実現するために頭を悩ませました。
たとえば、以下のようなシナリオです。
1. 請求書を保存するとき、カスタムフィールドに自動計算した値を設定するUEを実装
1. 注文書が保存されたとき、自動で請求書を作成するUEを実装（afterSubmit）
1. 2のUEを実行後に、1のUEが実行されることを想定していたが、①のUEが実行されず、結果的にデータの不整合が発生

実はNetSuiteの仕様上、UE同士を直接呼び出すことはできないため、どれだけコードを書いても「UE → UE」の動作を実現するのは不可能だったのです。いったいなぜなのでしょうか？

原因と対応策
---
### なぜ呼び出せないのか？

NetSuiteでは、UE同士を直接呼び出せない仕様としている理由について、SuiteAnswerにいくつか挙げられています。
（参考文書：SuiteAnswers Answer ID：81081「User Event Script to Trigger Another User Event Script Using Suitelet With SuiteScript 2.0」）
- 無限ループの防止
スクリプト同士が相互に呼び出せると、無限ループが発生し、システム全体のパフォーマンスが深刻に低下する恐れがあるため。
- パフォーマンスへの影響
UEから別のUEを直接呼び出すと、処理負荷が増し、タイムアウトやパフォーマンス低下を招きやすくなるため。

### どうすれば実現できるのか？
では「UEからUEを呼び出せないなら、どうすればいいの？」という課題に対して調べたところ、以下の対応策が有効であることがわかりました。
- 対応策1. スケジュールドスクリプトを使う（最も王道！）
- 対応策2. RESTletを活用する（即時性が必要ならコレ！）
- 対応策3. Suiteletを利用する（リアルタイム処理＋ユーザーコンテキストの継承）
- 対応策4. ワークフローを活用する（ノーコードで解決！）

<br>
<br>
いかがだったでしょうか。今回はNetSuiteのUEからUEを呼び出せない事象の概要についてご紹介しました。次回は、より具体的な対応内容や処理方法などをご紹介させていただきます。ぜひ次回もご覧ください。

参考情報
---
NetSuite スクリプト（SuiteScript）は、NetSuite のカスタマイズと自動化のための JavaScript ベースのスクリプト開発環境です。SuiteScript には以下の種類があります。

**SuiteScript の種類**
1. **Client Script** - ユーザーのブラウザ上で動作するスクリプト（例：フォームのバリデーション）
1. **User Event Script** - レコードの作成・更新・削除時にトリガーされるスクリプト
1. **Suitelet** - カスタム UI や API を作成するためのスクリプト
1. **Scheduled Script** - 指定したスケジュールで実行されるバッチ処理スクリプト
1. **Map/Reduce Script** - 大量データの処理に適したスクリプト
1. **RESTlet** - REST API を作成するためのスクリプト
1. **Portlet Script** - ダッシュボード用のカスタムポートレットを作成
条件式の基礎学習（if文について）

# Javaのif文について

Javaで条件分岐を行う際に使用されるのが **if文** です。

プログラムの中で、特定の条件を満たす場合にのみ特定の処理を実行したいときに使われます。

今回は、基本的なif文の使い方を説明します。

---
### 1. if 文の基本構造
if 文の基本構造は次の通りです。
>```java
>if (条件式) {
>    // 条件が真（true）のときに実行される処理
>}
>```
**構成要素：**
- `if`:このキーワードで条件分岐を始めます
- `(条件式)`: 条件式の部分はtrueまたはfalseを評価する式を入れます。条件式がtrueの場合のみ続く処理が実行されます
- `{}`: 中括弧の中に、条件が満たされた場合に実行される処理を書きます

**例：**
>```java
>int num = 10;
>
>if (num > 5) {
>    System.out.println("numは5より大きいです");
>}
>```
この例では、変数`num`が5より大きいかどうかをチェックしています。`num`の値が5より大きい場合にだけ、「numは5より大きいです」と表示されます。
- `num`の値が10なので、この条件は`true`となり、メッセージが表示されます
- もし`num`が5以下の場合、`true`ではなく`false`になるため、何も表示されません

---
### 2. if-else 文
次に、条件が満たされない（つまり、`false`）場合にも別の処理を実行したい場合、else 文を使います。

else 文は、`if`の条件が`false`であったときに実行される処理を記述します。

**構文：**
>```java
>if (条件式) {
>    // 条件が真（true）の場合の処理
>} else {
>    // 条件が偽（false）の場合の処理
>}
>```
**例：**
>```java
>int num = 3;
>
>if (num > 5) {
>    System.out.println("numは5より大きいです");
>} else {
>    System.out.println("numは5以下です");
>}
>```
この例では、num の値が5より大きければ if の中の処理が実行され、それ以外の場合は`else`の中の処理が実行されます。
- `num`の値は3なので、この条件は`false`となり、`else`の処理が実行されて「numは5以下です」と表示されます

---
### 3. if-「else if」-else文
複数の条件をチェックしたい場合には、`else if`文を使います。

`else if`を使うことで、最初の`if`が`false`の場合にさらに別の条件をチェックし、その条件に応じて処理を分けることができます。

**構文：**
>```java
>if (条件式1) {
>    // 条件式1が真（true）の場合の処理
>} else if (条件式2) {
>    // 条件式2が真（true）の場合の処理
>} else {
>    // すべての条件が偽（false）の場合の処理
>}
>```
**例：**
>```java
>int num = 7;
>
>if (num > 10) {
>    System.out.println("numは10より大きいです");
>} else if (num > 5) {
>    System.out.println("numは5より大きいですが、10以下です");
>} else {
>    System.out.println("numは5以下です");
>}
>```
この例では、`num`の値が7なので、最初の`if`条件`(num > 10)`は`false`になりますが、`else if`条件`(num > 5)`が`true`となり、対応する処理が実行されて「numは5より大きいですが、10以下です」と表示されます。

---

### まとめ
Javaのif文は、プログラムの条件分岐を実現するために欠かせない機能です。

基本的な構文から複雑な条件の組み合わせまで、使いこなせるようになると、より柔軟なプログラムを作成できるようになります。

まずはシンプルな例から練習して、徐々に複雑な条件分岐に挑戦してみてください。
Python でリスト情報に基づいてファイルをコピーする

リストに記載されているファイルのみ別ディレクトリへコピーする。

# 環境
- Windows 10 Enterprise 22H2
- Python 3.12.6

# サンプル

```
  .
  ├── from/
  │    ├── foo.xxx
  │    ├── bar.xxx
  │    ├── baz.xxx
  │    └── qux.xxx
  ├── input/
  │    └── list.csv
  ├── to/
  └── copy.py
```

ディレクトリ `from` 内にコピー元となるファイル
ディレクトリ `input` 内にコピー対象を指定する CSV ファイル
がそれぞれ配置されていること。

```csv:list.csv
foo.xxx
baz.xxx
qux.xxx
```
ファイル `bar.xxx` 以外をディレクトリ `to` へコピーする例。

```python:copy.py
import csv
import shutil
from pathlib import Path

with open('input/list.csv', encoding='utf_8') as file:
  reader = csv.reader(file)
  for row in reader:
    if Path('from/' + row[0]).is_file():
      shutil.copyfile('from/' + row[0], 'to/' + row[0])
    else:
      print(row[0])
```
個人的備忘録：マルチコンテナの設計・運用に関するベストプラクティスと管理方法を体系的に整理してみた

## はじめに
近年、コンテナ技術の普及により、システム開発の効率が大幅に向上しました。

:::note warn
**特に、マルチコンテナアプリケーションは、拡張性や管理のしやすさから多くの場面で採用されています。**
:::

本記事では、その基本概念やメリット、管理方法について解説します。

## 書こうと思ったきっかけ
実際に開発を進める中で、1つのコンテナにすべてを詰め込むと管理が大変になり、スケールもしづらいと感じました。

マルチコンテナ構成にすることで、役割ごとに分けて運用でき、環境の違いによる問題も減らせると実感したので、改めて整理してみようと思いました。

## マルチコンテナアプリケーションとは？

マルチコンテナアプリケーションとは、**複数のコンテナを協調して動作させるアプリケーション** のことです。  

各コンテナは特定の役割を持ち、互いに通信しながらシステム全体として機能します。

例えば、Web アプリケーションでは次のような構成が考えられます。

- **Web サーバーコンテナ**（例: Nginx, Apache）
- **アプリケーションコンテナ**（例: Flask, Node.js, Ruby on Rails）
- **データベースコンテナ**（例: MySQL, PostgreSQL, MongoDB）
- **キャッシュコンテナ**（例: Redis, Memcached）
- **メッセージキューコンテナ**（例: RabbitMQ, Kafka）

:::note info
***このように、各コンポーネントを独立したコンテナとして運用することで、**スケーラビリティやメンテナンス性の向上** を図ることができます。***
:::

### マルチコンテナのメリット

**スケーラビリティ**  
- 必要に応じて特定のコンテナだけをスケールアップ/ダウンできる。  
- 例えば、負荷が高いときに Web サーバーコンテナのみを増やすことが可能。

**モジュール化**  
- 各コンテナが独立して動作するため、メンテナンスが容易。  
- アプリケーションの一部を修正しても、他の部分に影響を与えにくい。

**可搬性**  
- 異なる環境（開発、ステージング、本番）でも同じコンテナを使用できる。  
- 環境の違いによる問題を最小限に抑えられる。

**リソースの最適化**  
- 各コンテナが必要なリソースだけを使用し、不要なものを削減できる。

## マルチコンテナアプリの管理方法

マルチコンテナアプリケーションを管理するためには、**コンテナオーケストレーションツール** を活用するのが一般的です。

### Docker Compose
- `docker-compose.yml` を使って **複数のコンテナを定義し、一括管理** する。
- **開発やテスト環境** でよく使われる。

**例: Flask + MySQL のマルチコンテナアプリ**
```yaml
version: '3'
services:
  web:
    image: python:3.9
    container_name: flask_app
    working_dir: /app
    volumes:
      - .:/app
    ports:
      - "5000:5000"
    command: python app.py
    depends_on:
      - db

  db:
    image: mysql:5.7
    container_name: mysql_db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: mydb
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    ports:
      - "3306:3306"
```

## マルチコンテナアプリの代表的なアーキテクチャ

**2層アーキテクチャ**  
- **アプリケーション + データベース** のシンプルな構成  
- **例:** Flask + PostgreSQL  

**3層アーキテクチャ**  
- **フロントエンド、バックエンド、データベースに分かれる**  
- **例:** React（フロントエンド）+ Django（API サーバー）+ MySQL  

**マイクロサービスアーキテクチャ**  
- **各サービスが独立したコンテナで動作し、API で通信**  
- **例:** User サービス、Order サービス、Payment サービスをそれぞれコンテナ化  

## まとめ

マルチコンテナアプリケーションは、**現代の Web システム開発において欠かせない技術** です。

- **マルチコンテナアプリ** は、複数のコンテナが協調して動作するアプリケーション  
- **スケーラブルでモジュール化され、環境に依存せず実行可能**  
- **Docker Compose は開発・テスト向け、Kubernetes は本番環境向け**  
- **3層アーキテクチャやマイクロサービスなど、用途に応じた構成を選択可能**  

どのようなアーキテクチャを選択するかは、**プロジェクトの規模や要件に応じて決めることが重要** です。
《アルゴリズムを学ぶ》1.リスト

# Overview
基本中の基本。リストの操作をまとめました。
[1.リストの基本](#1-リストの基本)
[2.リストの基本操作](#2-リストの基本操作)
[3.リストの探索と並べ替え](#3-リストの探索と並べ替え)
[4.効率的なリスト操作](#4-効率的なリスト操作)
[5.典型問題を解いてみる](#5-典型問題を解いてみる)

# 1. リストの基本
### リストの定義
```python
my_list = [1, 2, 3, 4, 5]
```

### リストの要素アクセス（インデックスを使う）
```python
my_list[0]  # 1
my_list[-1] # 5（最後の要素）
```

### リストのスライス
```python
my_list[1:4]  # [2, 3, 4]（1番目から3番目の要素を取得）
my_list[:3]   # [1, 2, 3]（最初から2番目まで）
my_list[::2]  # [1, 3, 5]（2つおき）
```

# 2. リストの基本操作
### リストの要素の追加
```python
my_list.append(6)    # 末尾に追加
my_list.insert(2, 99) # 2番目の位置に99を挿入
```

### リストの要素の削除
```python
my_list.pop()        # 末尾の要素を削除
my_list.pop(2)       # 2番目の要素を削除
my_list.remove(99)   # 値が99の要素を削除
```

### リストの更新
```python
my_list[1] = 100  # 2番目の要素を100に変更
```

### リストの結合
```python
new_list = my_list + [7, 8, 9]  # 新しいリストを作る
my_list.extend([7, 8, 9])       # 既存のリストを拡張
```

# 3. リストの探索と並べ替え
### リスト内の検索
```python
print(3 in my_list)  # True（3が含まれるか）
print(my_list.index(3))  # 3の位置を取得
```

### リストのソート
```python
my_list.sort()        # 昇順ソート
my_list.sort(reverse=True)  # 降順ソート
sorted_list = sorted(my_list)  # 新しいソート済みリストを作る
```

# 4. 効率的なリスト操作
### リスト内包表記
```python
squares = [x**2 for x in range(10)]  # [0, 1, 4, ..., 81]
evens = [x for x in my_list if x % 2 == 0]  # 偶数のみ取得
```

### リストの最大・最小・合計
```python
max(my_list)  # 最大値
min(my_list)  # 最小値
sum(my_list)  # 合計
```

# 5. 典型問題を解いてみる
### 例題1: 入出力の練習
**問題：2つの整数を入力し、それらの積が偶数なら「Even」、奇数なら「Odd」と出力する。**
> [参考：ABC086A - Product](https://atcoder.jp/contests/abc086/tasks/abc086_a)
<details><summary> 回答　</summary>

```Python
a, b = map(int, input().split())  # スペース区切りの整数入力
print("Even" if (a * b) % 2 == 0 else "Odd")
```
</details>

### 例題2: リストの合計
**問題: 長さNの整数リストが与えられるので、すべての合計を求める。**
> [参考：ABC087B - Coins](https://atcoder.jp/contests/abc086/tasks/abc087_b)
<details><summary> 回答　</summary>

```Python
A = int(input())  # 500円の枚数
B = int(input())  # 100円の枚数
C = int(input())  # 50円の枚数
X = int(input())  # 作るべき金額

count = 0
for a in range(A + 1):
    for b in range(B + 1):
        for c in range(C + 1):
            if 500 * a + 100 * b + 50 * c == X:
                count += 1
print(count)
```
</details>

### 例題3: 特定の要素のカウント
**問題: 3桁の0と1の文字列が与えられ、1の個数を数える。**
> [参考：ABC081A - Placing Marbles](https://atcoder.jp/contests/abc086/tasks/abc081_a)
<details><summary> 回答　</summary>

```Python
s = input()  # "101" のような文字列
print(s.count("1"))
```
</details>

### 例題4. リストの検索
**問題: 身長X以上の人が何人いるかを数える。**
> [参考：ABC142B - Roller Coaster](https://atcoder.jp/contests/abc086/tasks/abc142_b)
<details><summary> 回答　</summary>

```Python
N, X = map(int, input().split())
H = list(map(int, input().split()))  # 身長リスト
print(len([h for h in H if h >= X]))  # X以上の人の数
```
</details>

### 例題5. リストの並び替え
**問題: N枚のカードがあり、AliceとBobが交互にカードを取る。大きいカードから順にAliceが取る。AliceとBobの点数差を求める。**
> [参考：ABC088B - Card Game for Two](https://atcoder.jp/contests/abc086/tasks/abc088_b)

<details><summary> 回答　</summary>

```Python
N = int(input())
A = list(map(int, input().split()))  # カードのリスト

A.sort(reverse=True)  # 降順ソート
alice = sum(A[::2])  # 奇数番目（Aliceが取る）
bob = sum(A[1::2])  # 偶数番目（Bobが取る）

print(alice - bob)  # 点数差
```
</details>
CSM：ケース管理３：ケース管理で使用されるテーブルについて［ServiceNow］

※この記事はServiceNow初心者が学習用のために記載した記事です。内容について誤っている場合がございます。不足点などございましたらコメントいただけますと幸いです。


# ケース管理で使用するテーブル

| テーブル名 | テーブル ID (name) | 説明 | 追加プラグイン |
|-----------|---------------------|---------------------------------|----------------------|
| ケース | sn_customerservice_case | 顧客からの問い合わせや問題（ケース）を管理するメインテーブル | CSM プラグイン (com.sn_customerservice) |
| アカウント | customer_account | 顧客の会社情報（法人・組織単位）を管理 | CSM プラグイン (com.sn_customerservice) |
| コンタクト | customer_contact | 顧客の担当者（個人単位）を管理 | CSM プラグイン (com.sn_customerservice) |
| 契約 | sn_customerservice_contract | 顧客との契約情報を管理 | CSM プラグイン (com.sn_customerservice) |
| SLA | contract_sla | ケースのサービスレベルアグリーメント（SLA）を管理 | SLA プラグイン (com.snc.sla) |
| ナレッジ | kb_knowledge | ナレッジ記事を管理し、エージェントや顧客が活用可能 | ナレッジ管理 (com.snc.knowledge_management) |
| ケースアクティビティ | sn_customerservice_case_activity | ケースに関連するやり取りや履歴を記録 | CSM プラグイン (com.sn_customerservice) |
| ケースタスク | sn_customerservice_case_task | ケース内の個別タスク（サブタスク）を管理 | CSM プラグイン (com.sn_customerservice) |
- ※SLA（Service Level Agreement）とは？
    - サービス提供者と利用者（顧客）との間で合意されたサービス品質の基準 のこと


# 主要テーブルの関係図
- sn_customerservice_case（ケース） が 中心 となり、顧客情報 (customer_account, customer_contact) や SLA (contract_sla)、ナレッジ (kb_knowledge) などのテーブルと連携
- ケースタスク (sn_customerservice_case_task) は、1つのケース (sn_customerservice_case) に紐づく サブタスク を管理
- 契約 (sn_customerservice_contract) や SLA (contract_sla) は、ケースの優先度や対応期限を決定するのに使用

# ServiceNow ケース管理 ER 図（テキスト表現）

sn_customerservice_case (ケース)  
├── 1:N ── customer_account (アカウント)  
├── 1:N ── customer_contact (コンタクト)  
├── 1:N ── sn_customerservice_case_task (ケースタスク)  
├── 1:N ── sn_customerservice_case_activity (ケースアクティビティ)  
├── 1:N ── contract_sla (SLA)  
│   ├── 1:1 ── task_sla (タスク SLA)  
└── M:N ── kb_knowledge (ナレッジ)
メンション(Chatter)



+ [コニュニティーでのChatterのメンション](https://qiita.com/Keiji_otsubo/items/2c2edfea0d4fdfb11b66)

# フローでの例

+ [空白又はID=担当なしだった場合にはメンションに含まれないようにというのは 一つの数式リソースで表現可能でしょうか。 ](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KD3YC)


# メンションできない

+ [not able to mention/Particular contact in chatter from case object](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007eqjvT)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d44fff50-b338-7d42-d596-457d85c39a60.png)

:::note
I think I figured it out by myself. 

RCA:

After looking at that Particular contact, I found that That Contact was not enabled as Customer in org. after enabling, I was able to mention it.


:::


+ [Chatter Mention in Flow not working](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cmXjC)


:::note
Here's the solution I found: This allows post onto triggering record and mentions owner if tagged in text template.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/91f49120-9769-6256-c1ef-094704d88da8.png)

:::note
私が見つけた解決策は次のとおりです: これにより、トリガー レコードへの投稿が可能になり、テキスト テンプレートにタグ付けされている場合は所有者にメンションできるようになります。
:::

# フローを使った例

+ [取引先のレコードから特定のchatterグループに投稿されたことをトリガとして、その取引先のレコード内の項目を埋め込んだテンプレートを使用して特定の宛先（chatterグループの所有者）にメールを送りたいと考えています。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007erOny)

:::note
以下に複数の取引先責任者にメンションする方法が解説されています。 

これを少し改造して、空白又はID=担当なしだった場合には、テキスト変数に追加しないような決定要素を作れば可能ではないでしょうか？ 

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

>ループと決定要素を使えば良いのですね。 作りなおしたところ希望通りの挙動ができました。
［ServiceNow］インストールされているプラグインを確認

※この記事はServiceNow初心者が学習用のために記載した記事です。内容について誤っている場合がございます。不足点などございましたらコメントいただけますと幸いです。


# ServiceNowで有効化されているプラグインを確認する方法
方法 1: プラグイン一覧画面から確認
「All」メニュー で Plugins を検索
[System Definition] > [Plugins] を開く
フィルターを使用し、「Active is true」 で絞り込むと有効化済みのプラグインが表示される
how to change cli php ver. on xserver

# Summary
To install latest Laravel ver.11 on xserver, I needed to switch php cli ver. to the latest
(at least to cli ver8.2). Here are some tips what I found.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160387/1631ae5f-3b8b-3184-abb7-adfab45d60d2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160387/f0d7baf7-598a-c259-6287-b75e7258de47.png)

# Points
 Symbolic Link needs to select the absolute path(/opt/php-8.2.22/bin/php)
# Steps 

1. Check php path by `ls -la`, basically it will be on /opt/php...
`rwxrwxrwx  1 root root          27  9月  3 10:45  php-fcgi8.2 -> /opt/php-8.2.2/bin/php`
2. Set that symbolic link `ln -s /opt/php-8.2.2/bin/php $HOME/bin/php`
3.  `.vi ~/.bash_profile`
3. Change `PATH=$PATH:$HOME/bin to PATH=$HOME/bin:$PATH`
3. Execute `source ~/.bash_profile`
3. Run php -v to check new version.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160387/55bd6b41-90eb-0ff7-8da5-10be5725e3ce.png)
6. Run `laravel new <ProjectName>` to install latest laravel. now it worked.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160387/932f9cef-1ef8-7f2a-2007-5eb8578c88b6.png)


# Failure
 I set the sybolic link below but it failed because it was not the resource file.
```
ln -s /usr/bin/php-8.2 $HOME/bin/php
```

Correct link is
```
ln -s /opt/php-8.2.22/bin/php $HOME/bin/php
```

# Tips
IF already existed the symbolic link, do below to unlink.
```
unlink /home/<username>/bin/php
```
Edge Communications　という取引先がない？　トレイルヘッド



+ [Can't find "Edge Communications" account for adding flow](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000FvP9j)

:::note
it seems that the hands-on org I'd been using was one that I'd previously used for Analytics and the data load for that had blown away Edge Communications. I swapped to another Org and found Edge Communications, so I was able to complete the module successfully. 

:::

+ [【未解決】On the Customer Account Page, make sure that that the ‘Prospect Rating’ field has been set to ‘Required’.](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KCMwR)