OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonのクラスのselfの使い方とは？ロボットに例えて解説！

Pythonの「`self`」は、クラスの中で **「自分自身」** を指し示す特別なキーワードです。  

もし、友達に「自分の名前を言って！」と聞いたら、普通は「僕の名前は○○です」と答えますよね？この **「僕」や「私」** にあたるのが、Pythonの「`self`」なんです。  

## クラスとは？ロボットに例えてみよう！
Pythonでは、クラス（class）を使って「オブジェクト（もの）」を作ります。これを ロボット に例えてみましょう！

### 🛠 クラスとオブジェクトの関係
- クラス → 設計図（ロボットの設計図のようなもの）
- オブジェクト → 実際に作られたロボット（設計図から作られたもの）
- 「self」 → それぞれのロボットの識別番号（自分がどのロボットかを区別するための名札）

例えば、同じ「ロボットの設計図」から何体もロボットを作ったとしても、
それぞれのロボットには 「どのロボットなのか？」 を区別する必要がありますよね？

:::note info
Pythonでは、クラスの中でデータ（例えば名前や動作回数）を保持するときに、
「これは 自分のロボットのデータ だよ！」と区別するために「self」を使うんです。
:::


## 実際のコードを見てみよう！  

例えば、「ロボット」を作るクラスを考えてみます。  

```python
class Robot:
    def __init__(self, name, model):
        self.name = name  # 自分の名前（名札）
        self.model = model  # 自分の型番

    def introduce(self):
        print(f"こんにちは！私はロボット「{self.name}」、型番「{self.model}」です！")
```

## 🚀ロボットを作ってみる  

このクラスを使って、2体のロボットを作ってみます。  

```python
robot1 = Robot("アイボ", "AIBO-1000")  
robot2 = Robot("ペッパー", "PEPPER-2000")  

robot1.introduce()  # → こんにちは！私はロボット「アイボ」、型番「AIBO-1000」です！
robot2.introduce()  # → こんにちは！私はロボット「ペッパー」、型番「PEPPER-2000」です！
```

💡 **ポイント**  
ロボットが複数いると、それぞれのロボットの名前や型番を区別する必要があります。
例えば、robot1 は「アイボ」、robot2 は「ペッパー」ですが、
「self.name」がなければ、ロボット自身が 「どのロボットの名前なのか？」 を理解できなくなります。

:::note info
robot1と robot2は同じ「ロボットの設計図」から作られたけど、  
  「`self`」のおかげで、 **アイボとペッパーが別のロボット** だと区別できる！ 
:::


## 「self」がないとどうなる？  

もし「`self`」を使わなかったら…？  

```python
class Robot:
    def __init__(name, model):  # ← selfがない！
        name = name  # 誰の名前かわからない！
        model = model

    def introduce():
        print(f"こんにちは！私は{name}、型番「{model}」です！")  # エラー発生！
```

このコードを実行すると、エラーになってしまいます。  

:::note warn
ロボットに名前を設定しても、Pythonは 「誰の名前？」 と混乱してしまい、エラーが出ます。
:::

##  「self」の役割を3つにまとめる！  

### 1. 自分のものを識別するためのラベル 
 `self.name` は **「このロボットの名前だよ！」** という意味。  
     
### 2. クラス内のデータを保持できる  
例えば、`self.model` に型番を保存しておけば、どこでも使える。  

### 3. クラスのメソッド（関数）からデータにアクセスする 
`self` があれば、他のメソッド（関数）でも **「自分のデータ」** を使える。  

---

## もう少し複雑にした例  

ロボットに「歩く機能」を追加してみます！  

```python
class Robot:
    def __init__(self, name):
        self.name = name
        self.steps = 0  # 自分の歩数を記録

    def walk(self):
        self.steps += 1  # 自分の歩数を増やす
        print(f"{self.name}は歩きました！現在の歩数: {self.steps}")
```

---

### ロボットを動かしてみる！  

```python
robot1 = Robot("アシモ")

robot1.walk()  # → アシモは歩きました！現在の歩数: 1
robot1.walk()  # → アシモは歩きました！現在の歩数: 2
```

💡 **ここでも「self」が重要！**  
`self.steps` を使うことで、「どのロボットが何歩歩いたのか」をちゃんと記録できます。  

もし「`self`」がなかったら、歩数のデータがどのロボットのものかわからなくなっちゃいます！  

---

## まとめ：Pythonの「self」をマスターしよう！

### 「self」を使う理由：  
- 自分のデータ（変数）を他と区別する  
- クラスのメソッド（関数）で、データにアクセスするため  
- 自分自身の情報を保持し、別のオブジェクトと混ざらないようにする  

---

「`self`」を理解すると、Pythonのクラスが **もっと自由に使える** ようになりますよ！  
Pythonプログラミングを楽しんでください！
【機能検証】Luma AI Ray2をプレイグラウンドで触ってみた

いつも記事を読んでいただきありがとうございます！
モブエンジニア（[@mob-engineer](https://qiita.com/mob_engineer))です！

2025.01.24のアップデートで**Amazon BedrockでLuma AI Rayが利用可能**になったとのことですので、機能検証のためにSoraと比較して見た記事を執筆しました。

初学者でもサクッと読めるように平易な表現で執筆しておりますので、お気軽に読んでいただければ幸いです。

:::note info
性能評価、定量評価に関しては行っておりません。
あくまで、1ユーザとして感じた感想を執筆しております
:::

# 目次
- アップデート情報
- BedrockでLuma AI Rayを利用する
- まとめ

## アップデート情報

公式ブログには以下の通り説明がなされています。

#### アップデート情報

https://aws.amazon.com/about-aws/whats-new/2025/01/luma-ais-ray2-visual-ai-model-amazon-bedrock/

>Luma AI の新しいビデオ生成 AI 基盤モデル (FM) Ray2 が Amazon Bedrock で利用可能になりました。AWS は、Luma AI の完全マネージド型モデルを提供する最初で唯一のクラウドプロバイダーであり、AWS サービスを使用する開発者や企業の創造的可能性を広げます。
Luma Ray2 は、滑らかで自然な動きでリアルなビジュアルを作成できる大規模なビデオ生成モデルです。Amazon Bedrock の Luma Ray2 を使用すると、シームレスなアニメーション、超リアルなディテール、自然言語プロンプトによる論理的なイベントシーケンスを備えた制作準備が整ったビデオクリップを生成できるため、技術的なプロンプトエンジニアリングが不要になります。Ray2 は現在、540p と 720p の解像度で 5 秒と 9 秒のビデオ生成をサポートしており、さまざまなプロフェッショナルなクリエイティブアプリケーションに最適なモデルとなっています。コンテンツ作成、エンターテイメント、広告、メディアのユースケースに Ray2 ビデオ生成を使用することで、コンセプトから実行までのクリエイティブプロセスを合理化できます。コンテンツ作成者は、製品のプロモーションやストーリーテリング用のビデオクリップをすばやく生成できます。製品チームは、コンセプトを迅速に視覚化し、市場テスト用のビデオモックアップを作成できます。制作スタジオでは、事前視覚化を作成し、リアルな背景を生成し、特殊効果シーケンスの初期バージョンを作成できます。

なお、執筆時点ではオレゴンリージョンのみでの利用可能だそうです。
## BedrockでLuma AI Rayを利用する

モデルアクセスを許可することでバックグラウンド（Image/Video）から利用することが可能です。

設定画面として以下のとおりです。

![Luma画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/b3d2b890-820c-1f7e-7b20-c4d80f194487.png)

動画生成に関するパラメータ（画素数）を設定することができるようです。
プロンプトにメッセージを入力し、**実行**ボタンを押下すると5分ほどで動画生成されます。

プロンプトメッセージは**都内のシステム会社でバリバリ働いているエンジニアの動画**にしてみました。

動画生成中は以下画面が表示されます。

![Luma画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/11ed3e92-ad44-aacf-39a6-5ab1513148be.png)

進行中からステータスが変わらないため、**Show History**を見ると失敗していました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/6952b20b-dfbe-e7bb-aac8-fc139f681a4d.png)

もう一度再作成してみてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/722358fa-8fba-1d10-bfec-4ac200904916.png)

再度Failedとなってしまいました。
リリースしたばかりなので、不安定な状況なのかもしれません。
再度チャレンジしてみたいと思います。

## まとめ

本当はSoraと比較してどのような違いがあるかを調べてみたかったですが、Luma AI Rayを通じて動画生成が行えなかったため、もう少し時間がたってからチャレンジしてみたいと思いました。

そのうえで、**アクセプト比率、ループ有無や画質を選択できる**のはGoodポイントだと思いました。

個人的に、**企業向け宣材動画（採用、会社説明など）のアイデア出し**や**プロジェクト構想の可視化ツール**として利用できるイメージはありました。

ざっくりとした記事ですが、最後まで読んでいただきありがとうございました！

## 追記

以下ブログを見ると**プロンプトを英語**にすることで対応できるようですね。

https://t.co/huB0nHzKbP

プロンプトを英訳（A video of a highly motivated engineer working hard at a system company in Tokyo.）して実行したところ問題なく生成できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/d2494ac7-1f6e-a298-8cdb-a4315639f56c.png)

動画生成自体はSoraと同じくらいの時間で生成できるので、使いづらさは感じませんでした。

:::note alert
利用料金が割高なので、やたらとプロンプト実行すると知らぬ間に高額課金してしまう恐れがあるので注意が必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/53088c1a-28db-cfbd-78ab-bcbaea2b23a9.png)
:::

プロンプト実行時は**英語で実行**しましょう！
CCP4をLinux環境にインストールする 

# CCP4とは？
CCP4は、主にタンパク質結晶構造解析を行うためのソフトウェアスイートです。生物学的分子（タンパク質、DNA、RNAなど）の構造を決定する研究で広く利用されています。

このソフトウェアは、X線結晶構造解析やクライオ電子顕微鏡（cryo-EM）データの解析、分子モデリングなど、多くのタスクを支援するためのツールを提供しています。
https://www.ccp4.ac.uk/

# Linuxでのインストール方法
CCP4はGUI環境で使用されることが主であることもあり、CUI環境での公式のinstallation instructionの説明が乏しいため、自分は下記の手法でインストールしました。
（下記の実行にともなう環境破壊の責任は負えません！自己責任でお願いします。）

```bash:bash
cd
mkdir ccp4
cd ccp4
wget "https://www.ccp4.ac.uk/download/download_file.php?os=linux&pkg=ccp4-shelx-arp-x86_64&sid=cd9c4866448ce83e5770f9c486d7cdc29be283f7" -O ccp4-shelx-arp-x86_64.tar.gz
tar -xvzf ccp4-9.0.005-shelx-arpwarp-linux64.tar.gz 
cd ccp4-9
sudo ccp4-9/BINARY.setup 
```

# 環境変数をbash起動時に追加する
以下の内容を.bashrcに追記
```bash:.bashrc
# CCP4 setup script
if [ -f $HOME/ccp4/ccp4-9/bin/ccp4.setup-sh ]; then
    source $HOME/ccp4/ccp4-9/bin/ccp4.setup-sh
fi
```

# インストール確認
```bash:bash
pisa
```
と入力し、ヘルプの文面が出力されれば成功
■ 5-1.ブラックボックステスト技法：”同値分割法”について

# <font color="#00bfff">■ 同値分割法とは？</font>

ブラックボックステストで使用されるテスト設計技法の一つで、

テスト対象の入力値や出力値を、
性質や挙動が同じだとみなせる範囲（同値クラス）に分割し、
各クラスから代表的な値を選んでテストを行う方法です

<INS>この技法は、テストケースを効率的に設計し、網羅性を高めるために使用されます</INS>
<br>
# ・<font color="#00bfff">特徴</font>
　-> <font color="#66cdaa">効率的なテスト</font>
 同じクラス内の値は同じ処理が行われると仮定される為、
全ての値をテストする必要がなくクラスごとに代表値を1つ選べば十分です
<br>  
　-> <font color="#66cdaa">網羅性の向上</font>：
 異なる同値クラスをカバーすることで、全体的なテストの網羅性を高められます
<br>
# ・<font color="#00bfff">同値クラスの種類</font>

　-> <font color="#66cdaa">有効同値クラス</font>：正常動作を期待する入力値の範囲
　　　　　　　　　　[例] 入力が1～100の範囲の場合、「1～100」が有効同値クラス
<br>
　-> <font color="#66cdaa">無効同値クラス</font>：異常動作を誘発する入力値の範囲

　　　　　　　　　　[例] 入力が1～100の場合、「0以下」や「101以上」が無効同値クラス
<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873920/214e48cd-5141-faa0-b967-a65629fcdd4b.png)
<br>
# <font color="#00bfff">【例】</font>
ショッピングサイトにて、商品の購入数量に制限を設けている場合：

仕様：
・購入数量は「1～100」の範囲内で入力可能
・購入数量が「1～100」の場合は、カートに追加が可能
・購入数量が「0以下」または「101以上」の場合はエラーメッセージを表示

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873920/f9b8dbd4-9e0a-a338-75e2-b9083af10f2d.png)
<br>
# ・<font color="#00bfff">利点／欠点</font></INS>

■ <font color="#FF99FF">利点</font>
・テストケースの効率化：代表値を選ぶことで、テストケースの数を削減できる
・網羅性の向上：有効・無効クラスを網羅的にテストすることが可能
・重要なケースを見落とすリスクが減る
・設計の明確化：<INS>1.仕様を整理しやすく</INS>、<INS>2.仕様の不明点も発見しやすい</INS>

　■ <font color="#66cdaa">仕様を整理しやすい</font>：

　・システムの仕様をもとに、
　　入力データの有効(期待される動作)／無効(エラー処理対象)範囲を明確に定義できる
  
　・入力値を整理する過程で、
　　どの条件がカバーされていないかや、同じ条件が重複しているかを発見しやすくなる
  
　・各同値クラスから代表値を1つ選べばよい為、テストケースが無駄なく効果的に設計可能
　
　■ <font color="#66cdaa">仕様の不明点を発見しやすい</font>

　・"有効範囲と無効範囲の境界が明確でない"場合、
 　　どの値が有効なのか仕様書に書かれていないケースが発見できる
　　（境界条件の曖昧さの発見）
  
　　例:「1～100の数値が有効」と記載されているが、境界値である0や101の扱いが不明確

　・無効な入力に対するエラーメッセージや処理が記載されていない場合が発見できる
　　（例外条件の不足の発見）
<br>
■ <font color="#FF99FF">欠点</font>
・境界値に弱い：境界付近のテストが不足しやすい
・分割の難しさ：正しい同値クラスの分割が難しい場合がある
・網羅性の限界：クラス内の特殊ケースを見逃す可能性がある

※他の技法（例：境界値分析）と併用すると効果が高まります

# ・<font color="#00bfff">まとめ</font></INS>
<br>
同値分割法は、テストの効率性、網羅性、設計の明確化など多くのメリットを持ち、

特に仕様が明確で入力範囲が広い場合に効果を発揮します

他の技法（境界値分析など）と組み合わせて活用することで、
より高品質なテスト設計が可能となります
<br>

<INS><font color="###ff00ff">「■ テスト技法：境界値分割」へ続く</font></INS>
https://qiita.com/aokimakiko/items/12da8b3ecf64415c7046
GitHub Actions備忘録：Goファイルに変更があった場合のみジョブを実行するように設定を修正してみた

## はじめに
GitHub Actions を利用した CI/CD パイプラインの設定では、効率的なジョブトリガーの設計が重要です。

:::note warn
**特に、`main` ブランチへのすべてのプッシュでワークフローをトリガーする設定では、不要なジョブが実行され、リソースの浪費や実行時間の増加につながることがあります。**
:::

本記事では、特定のファイルやディレクトリに変更があった場合のみワークフローをトリガーする方法を中心に、無駄を省き、効率的な運用を実現するための設定方法について解説します。

## 少し困っていたこと

以下の設定では、`main` ブランチに対するすべての変更（ファイルの種類や内容に関係なく）でワークフローがトリガーされます。

```yaml
on:
  push:
    branches:
      - main
```

そのため、不要なトリガーが発生し、この先、ちょっとした変更を加えただけで、全てが実行されて少しだけストレスでした

### 問題点：全ての変更でトリガーされる

この設定では、`main` ブランチに対するすべての変更（ファイルの種類や内容に関係なく）でワークフローがトリガーされます。その結果、以下の問題が発生する可能性があります：

#### 問題点

1. **非効率なリソース消費**  
   - 不必要なジョブ実行により、GitHub Actions の実行時間や料金が浪費されます。

2. **無関係な変更でも実行される**  
   - 例えば、ドキュメントやREADMEファイルの変更でもジョブが実行され、効率が低下します。

3. **ジョブの実行が遅くなる**  
   - 不要な実行が増え、並列実行数の制限に達することで、重要なジョブの実行が遅れる可能性があります。

4. **ビルド・デプロイの無駄**  
   - アプリケーションに関係のない変更（例: ドキュメント更新など）でもDockerイメージのビルドやECRへのプッシュが行われ、無駄なリソース利用が発生します。

## 変更前の.github/workflows/main.ymlのファイルについて

```yaml
name: Push to ECR

on:
  push:
    branches:
      - main

jobs:
  build-and-push:
    runs-on: ubuntu-latest

    steps:
      # リポジトリのクローン
      - name: Checkout code
        uses: actions/checkout@v3

・・・（省略）
```

- **設定内容**  
  `main` ブランチへのすべてのプッシュイベントでワークフローがトリガーされる設定。

- **動作**  
  ファイルの種類や内容に関係なく、すべての変更でジョブが実行される。

## 変更後の.github/workflows/main.ymlのファイルについて

```yaml
name: Push to ECR

on:
  push:
    branches:
      - main
    paths:
      - '**/*.go' # Goファイルに変更があった場合のみ実行

jobs:
  build-and-push:
    runs-on: ubuntu-latest

    steps:
      # リポジトリのクローン
      - name: Checkout code
        uses: actions/checkout@v3

・・・（省略）
```

- **`paths` オプションの追加**  
  特定のファイルパターン（`**/*.go`）が指定されました。

- **動作の変更**  
  `main` ブランチへのプッシュ時に **Goファイル（`.go`）** に変更がある場合のみワークフローがトリガーされるようになりました。

## 変更後の設定について
上記のように変更する前は、テスト用のHTMLファイルを作成すると、すべての場合でGitHub Actionsがトリガーされていました。

![Screenshot 2025-01-24 at 9.14.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/9a4e1c24-566f-bd40-2027-f28fb69e7a02.png)

しかし、今回の設定変更によって、`main.go` ファイルの変更時のみGitHub Actionsがトリガーされるようになり、正しく設定が反映されていることを確認できました。

## まとめ
ここまでお読みいただき、ありがとうございました！***今回の実装は簡単でしたが、このような細かい配慮が非常に重要であると改めて実感しました。***

:::note
***インフラのコード化に向けた第一歩として、非常に重要なポイントです。この内容をまとめることで、より深い理解を得ることができました。***
:::

この記事が、誰かの技術的な支えになれば嬉しいです！
rex0220 データ生成プラグイン 項目タイプ別設定例

[データ生成プラグイン](https://qiita.com/rex0220/items/8e760adbfd69b9416b2d)での項目タイプ別設定例です。

# 概要

データ生成プラグインでは、レコード生成先の項目タイプにあわせて、計算式の関数を指定する必要があります。
ユーザー選択項目やチェックボックス項目などは、複数の選択値を設定できる項目タイプは、下記のような SEL_CODE, ARRAY 関数の指定が必要です。

- ユーザー選択：　SEL_CODE(ユーザー選択)
- 組織選択：　SEL_CODE(組織選択)
- グループ選択：　SEL_CODE(グループ選択)
- チェックボックス： ARRAY(チェックボックス)
- 複数選択： ARRAY(複数選択)

※フィールドコードと項目タイプが同じ項目の場合、プラグイン設定画面で「自動設定」をクリックして、必要な計算式を自動設定することもできます。

![2025-01-24_08h53_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/78b1c0cf-5679-54e2-9f10-3cbdf7842b5d.png)

# データ生成プラグイン設定

![2025-01-24_08h50_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/f81af498-e501-362f-e83e-521cd92ef634.png)

- 対象アプリ条件：　レコードを識別するため元レコード番号を指定

![2025-01-24_09h04_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/142339ca-fbdc-74e9-2ab2-23dd5f0acec9.png)

- 設定項目

「自動設定」をクリックすると、フィールドコードと項目タイプが同じ項目の場合、必要な計算式を自動設定します。

※日付項目や日時項目は、DATE_FORMAT 関数が自動設定されますが、現在はDATE_FORMAT 関数を指定しなくも問題ありません。
日付：「DATE_FORMAT(日付)」、または「日付」のどちらでもOKです。

元レコード番号、識別IDなどは、個別に設定する必要があります。


![2025-01-24_08h50_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/ee8cb9d2-ffbc-9e91-908f-8fdfd3d6b432.png)

- 「自動設定」の設定例

![2025-01-24_09h14_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/bea5be32-42dd-bfb0-5f24-03754a25adbb.png)
これで解決！Cloud Pub/Sub サブスクリプションが作成できない│Google Cloud

皆さん、こんにちは。
VPC Service Controls のサービス境界があるプロジェクトでCloud Run 関数を 実行する Cloud Pub/Sub サブスクリプションを作成するときに問題が起こったので共有します。

## 環境
VPC Service Controlsに保護されているプロジェクト※で、以下のリソースを作成します。
※プロジェクトで使用するサービスすべて制限付きサービスに含めている状態です。ここで取り上げていないサービスもあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/1c24f6f2-94ff-39d6-0864-cfceb9f16425.png)
処理はざっくりこんな感じです。
Cloud Logging から特定の文字列が出力された場合に Cloud Pub/Sub トピックにメッセージを送信する。
Cloud Pub/Sub サブスクリプションからCloud Run 関数がメッセージを受信する。
Cloud Run 関数が BigQuery に SQL を実行する。

## 事象
Push エンドポイントの Cloud Pub/Sub サブスクリプションが作成できないです。
[保存]を押下すると「アクセスが拒否されました」と出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/ef694f3d-6485-b870-8bcb-a741d21d3af6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/58024cdd-a862-9729-4798-e19c0284ff2f.png)

## 原因
[VPC Service Controls](https://cloud.google.com/vpc-service-controls/docs/supported-products?hl=ja#table_pubsub)の制限事項 に該当していることが問題でした。
Cloud Run 関数のURLである cloudfunctions.net が自動で割り当てられますが、これがカスタムドメインとして扱われてしまいます。
該当部分を引用します。
```ruby:qiita.rb
push エンドポイントがデフォルトの run.app URL 
または Workflows の実行で Cloud Run サービスに設定されていない限り、
新しい push サブスクリプションを作成できません（カスタム ドメインは機能しません）。
Cloud Run とのインテグレーションの詳細については、VPC Service Controls の使用をご覧ください。
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/020b4d5b-71c9-b9ae-7f76-a29f3b9255fe.png)

## 解決策
Cloud Run 関数を使用しているので、裏で Cloud Run が作成されています。
Cloud Run の URL(run.appで終わるURL)を使用すれば、制限事項に該当しなくなるため、それを使用します。
Cloud Run 関数のページに表示されるURLではなく…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/4cc624e3-3818-7649-5edf-5be11233bfa2.png)

Cloud Run のページに表示されるURLの隣にある **「！」** を押下すると右ペインが表示されるので、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/34d34d1e-526b-2436-024e-ce56392901b1.png)

右ペインに表示されている３つの中で **run.app で終わるURLを Cloud Pub/Sub サブスクリプション** に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/7bcc6d17-6fcc-a4b5-8526-be5e005da11b.png)

run.app のURLでCloud Pub/Sub サブスクリプションを作成すると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/850c3df0-b475-cd69-8039-793a711f2a2a.png)

 **無事作成できました！** 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/e82dcd60-02b0-9eb3-147e-785efa898629.png)

## おわりに
初期構築時には VPC Service Controls を一番最後に作成することが多いため、気づきませんでした…。
構築済みの環境に新しいリソース作成することもあるので、面倒ですが初期構築時からVPC Service Controlsを作成しておくものだなと思いました…！

話には関係ないですが、Cloud Run 関数じゃなくて、やっぱりCloud Functionsって呼びたい！！
Bool?型条件分岐のベストプラクティス(Swift)


Bool?型の変数で条件分岐を行うパターンはよく登場しますが、イマイチ現場ごとに正しいやり方は定まってなさそうです。
なのでよく使われる手法を紹介しつつ、新たな手法も提唱します。

## 1.王道の手法
シンプルに??でアンラップするやり方です。
``` Swift
let hoge: Bool? = true
if hoge ?? false {
    fuga()
}
```
trueで動作する場合はいいですが、反転させたい時はかなり醜いコードになります。
``` Swift
let hoge: Bool? = true
if !(hoge ?? true) {
    fuga()
}
```
## 2.アンラップしない手法
何故か宗教上の理由で嫌う人が多い手法です。
オプショナルであると明示されないのが嫌われる要因でしょうか。
false発火でも変わらず書けるので個人的には一番わかりやすいと思います。
``` Swift
let hoge: Bool? = true
if hoge == true {
    fuga()
}
if hoge == false {
    piyo()
}
```
## 3.extensionを利用する手法
一つ目の手法の反転だけが特に酷いので、それを改善できる手法です。
Boolには元々toggle()関数があるため可読性は落ちないと思っています。
``` Swift
let hoge: Bool? = true
if hoge?.toggled ?? false {
    fuga()
}

extension Bool {
    var toggled: Bool {
        return !self
    }
}
```
反転演算子`!`はそもそもオプショナルと相性悪いので、この手法を利用しないにしてもこのextensionは作る価値があるかと思います。
``` Swift
// nilならfalseに、そうでないなら反転させたい時。
// 二つは同じ演算結果だが後者の方が直感的にわかりやすい。
let hoge1 = !(fuga?.isPiyo ?? true)
let hoge2 = fuga?.isPiyo.toggled ?? false
```
## まとめ
結局のところ好みによると思うので、チーム開発なら皆が納得する落とし所を探す形になるかと思います。
個人的には2のやり方を採用したいですが、他の言語に普段触れてる人からするとアレルギー反応が出るようで難しいところです。
Javaで「テキストフィールド内でのテキストの水平位置(左詰、中央、右詰)を設定する」の動作を確認してみた。

# 概要

Javaで「テキストフィールド内でのテキストの水平位置(左詰、中央、右詰)を設定する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/tutorial/jtextfield/index7.html

# 実装

以下のファイルを作成しました。

```JSample7_1.java
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JPanel;
import java.awt.Container;
import java.awt.BorderLayout;

class JSample7_1 extends JFrame{
  public static void main(String args[]){
    JSample7_1 frame = new JSample7_1("MyTitle");
    frame.setVisible(true);
  }

  JSample7_1(String title){
    setTitle(title);
    setBounds(100, 100, 600, 400);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JTextField text1 = new JTextField("Hello", 40);
    JTextField text2 = new JTextField("Hello", 40);
    text2.setHorizontalAlignment(JTextField.CENTER);
    JTextField text3 = new JTextField("Hello", 40);
    text3.setHorizontalAlignment(JTextField.RIGHT);

    JPanel p = new JPanel();
    p.add(text1);
    p.add(text2);
    p.add(text3);

    Container contentPane = getContentPane();
    contentPane.add(p, BorderLayout.CENTER);
  }
}
```

以下のコマンドを実行しました。

```
$ javac JSample7_1.java 
$ java JSample7_1 
```

実行結果は以下の通りでした。

![Screenshot from 2025-01-24 08-44-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/6c92f9a6-ce5b-5ac9-b539-daf75ee48d34.png)

# まとめ

何かの役に立てばと。
CVSSメモ

**CVSS**（Common Vulnerability Scoring System）は、ソフトウェアやシステムの**脆弱性（セキュリティホール）**の深刻度を評価・数値化するための標準的なフレームワークです。これにより、脆弱性に対する優先度や対応方針を決定しやすくなります。

---

### **CVSSの概要**
1. **目的**  
   - 脆弱性の危険性を一貫した基準で評価し、共通のスコアを用いてその重要性を比較できるようにする。
   - IT管理者やセキュリティ担当者が脆弱性に対する対応優先度を決定するのに役立つ。

2. **スコア範囲**  
   CVSSスコアは**0.0〜10.0**の範囲で表され、数値が高いほど深刻度が高いことを示します。
   - **0.0**: 脅威なし
   - **0.1〜3.9**: 低（Low）
   - **4.0〜6.9**: 中（Medium）
   - **7.0〜8.9**: 高（High）
   - **9.0〜10.0**: 緊急（Critical）

3. **バージョン**  
   現在の最新バージョンは**CVSS v3.1**（2023年時点）。以前のバージョン（v2など）よりも詳細な評価が可能です。

---

### **CVSSの評価基準**
CVSSスコアは以下の3つのメトリックグループで構成されます：

#### **1. 基本評価基準（Base Metrics）**  
脆弱性そのものの特性を評価する項目で、スコアの基礎となります。
- **攻撃方法（Attack Vector, AV）**  
  攻撃が可能な範囲（例: ネットワーク、ローカル）。
- **攻撃複雑度（Attack Complexity, AC）**  
  攻撃を成功させる難しさ（例: 簡単か複雑か）。
- **必要認証（Privileges Required, PR）**  
  攻撃に必要な権限（例: 認証不要、管理者権限必要など）。
- **影響（Confidentiality, Integrity, Availability, CIA）**  
  機密性、完全性、可用性に与える影響。

#### **2. 時間評価基準（Temporal Metrics）**  
脆弱性に関する追加情報や状況に基づく項目。
- 例: 修正プログラムの有無、攻撃コードの利用可能性など。

#### **3. 環境評価基準（Environmental Metrics）**  
脆弱性が特定のシステムや環境に与える影響を評価する項目。

---

### **CVSSの活用例**
1. **脆弱性の優先順位付け**  
   - CVSSスコアが高い脆弱性を優先的に修正する。
2. **セキュリティポリシー策定**  
   - 組織のセキュリティ対応基準（例: CVSS 7.0以上を即時対応）を設定。
3. **脆弱性管理ツール**  
   - Nessus、QualysなどのツールがCVSSスコアを活用して脆弱性を評価。

---

### **CVSSを提供する主な機関**
- **NVD（National Vulnerability Database）**  
  米国国立標準技術研究所（NIST）が運営する脆弱性データベースで、CVSSスコアを公開しています。

---

CVSSスコアを活用することで、脆弱性に効率的に対応できる体制を整えられます。必要に応じてスコア計算の具体例を説明することも可能です！
Session ManagerでVSCODEを使う

```bash
sudo dnf install -y git

git -v

sudo dnf install curl git

git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.0


vim ~/.bashrc

# .bashrcの最下行に以下2行を追記
# . "$HOME/.asdf/asdf.sh"
# . "$HOME/.asdf/completions/asdf.bash"

source ~/.bashrc

asdf version

# Node.js のインストールに必要な OS のパッケージをインストール
sudo dnf install -y python3 gcc-c++ make python3-pip

# asdf の Node.js プラグインをインストール
asdf plugin add nodejs

# 作業ディレクトリにasdfの設定ファイルを作成
# .tool-versionsファイルができ
asdf local nodejs 20.16.0

# asdfのインストール
# warnなど出るが無視
asdf install

node -v
```

## asdfの主な機能と役割



## .tool-versionsの主な機能と役割

.tool-versions ファイルは、バージョン管理ツールである asdf に関連する設定ファイル。

ツールのバージョンを指定
.tool-versions ファイルに記載することで、プロジェクトごとやシステム全体で利用するツールのバージョンを統一できます。

プロジェクト固有の設定
.tool-versions ファイルをプロジェクトのルートディレクトリに配置すると、そのプロジェクトでのみ適用されるバージョンを指定可能です。

グローバル設定
ホームディレクトリ（~/.tool-versions）に配置すると、システム全体のデフォルトバージョンとして機能します。
日本のエンジニアよ、技術スタックのチェックリスト共有はやめろ

### 日本のソフトウェアエンジニアリングコミュニティの皆さんへ

エンジニアリングは、単なるチェックリストではありません。システムを深く理解し、その制約を把握する学問です。ここ数年、日本のソフトウェアコミュニティの技術ブログを拝見する中で、少し気になる点があります。

それは、日本と海外との技術的なギャップが広がっているように見えるだけでなく、技術的な議論や知識の共有が十分に行われていないことです。

私が過去15年間で多くのプロジェクトを開発してきた中で、技術的な意思決定は常に長期的な影響を伴うものでした。特定のデータベースやプログラミング言語を選ぶことは、単にタスクを完了させるためのチェック項目ではありません。それは、エコシステムの成熟度、パフォーマンスと開発者体験のバランス、そして最悪のケースまでを慎重に分析した結果でした。

当時のドキュメントは、「〇〇言語と△△データベースを使いました」という記録ではなく、なぜそのアプローチが、より高速かもしれないが予測しづらい他の方法よりも、私たちの状況に最適だったのかを詳細に説明したものでした。

しかし、最近の日本のエンジニアリングブログでは、複雑なアーキテクチャの決定が、単なる技術の選択に簡略化されているように感じます。TypeScriptは、コンパイル時の安全性と実行時のパフォーマンスのトレードオフを考慮した結果ではなく、ただの選択肢の一つになっています。Reactも、状態管理やレンダリング最適化を深く検討した上での選択ではなく、なんとなく使われているように見えます。

なぜこれが問題なのでしょうか？それは、エンジニアリングの判断力は、深い技術的思考に触れることでしか育たないからです。私が初めて画像圧縮の実装を学んだ時（2008年、20歳）、他のエンジニアが使った技術をそのまま真似するのではなく、彼らがなぜその技術を選んだのか、どのような制約があったのか、他の選択肢と比較してどうだったのか、そして、そのアプローチのどこに問題があったのかを徹底的に調べました。

この経験を通じて、新しい技術的な課題に直面した時に、どう判断すれば良いかの基準ができました。

現状のように、技術ブログが単なるツールリストのようになっていると、エンジニアの判断力を育む妨げになります。まるで、ソフトウェア開発が、システムを理解するのではなく、適切なツールを選ぶことだけが重要であるかのように誤解させてしまいます。その結果、既存のパターンは実装できるものの、新しい問題に対して自分で解決策を考え出すことが苦手なエンジニアが増えてしまうでしょう。

技術的なコミュニケーションでは、「何を使ったか」だけでなく、「なぜそれを選んだのか」を伝えることが重要です。もしあなたがプロジェクトでTypeScriptを選んだのなら、それは具体的にどのような問題を解決するためでしたか？パフォーマンス面でどのような妥協をしたのですか？その選択が適切だったと、どうやって検証したのですか？実装中にどのような課題に直面しましたか？これらの情報は、ただ「TypeScriptを使いました」という事実よりも、はるかに価値があります。

同様に、アーキテクチャの決定についても、その背景や制約を説明する必要があります。「マイクロサービスを使っています」と言うだけでは不十分です。具体的にどのようなスケーリングの問題に直面し、データ整合性についてどのようなトレードオフを受け入れ、運用上の複雑さをどのように管理しているのか、そして、その選択があなたの状況にとって最適だったと、どうやって検証したのかを説明してください。

これは、単に長い文章を書くことではありません。技術的な意思決定の背景にある考えを深く掘り下げ、それを共有することです。技術的な意思決定を説明する際に、その理由を省略してしまうと、他のエンジニアがより良い判断力を養う機会を奪ってしまうことになります。

海外のソフトウェアコミュニティでは、このような深い技術コミュニケーションが活発に行われており、その価値は証明されています。エンジニアたちは、パフォーマンス最適化、アーキテクチャの決定、システム障害に関する詳細な分析を積極的に共有しています。このような情報共有が、コミュニティ全体の技術力を底上げする原動力になっているのです。

私たちは、ソフトウェアエンジニアリングを単なるツールの選択として捉えるのではなく、複雑なシステムを理解し、管理する学問として捉え直す必要があります。そのためには、技術的な意思決定について、どのように考え、どのように記録するかを変える必要があります。ツールの選択に隠れるのではなく、システムが持つ根本的なトレードオフに真摯に向き合うべきです。

私たちの目標は、完璧なコードや完璧な意思決定ではありません。私たちが目指すべきは、理解しやすく、保守しやすく、そして進化させることができるシステムを構築することです。そのためには、何を構築しているのかだけでなく、なぜそのように構築しているのかを理解する必要があります。その理解を、コミュニティで共有しましょう。

忘れないでください。エンジニアリングの洞察は、パターンを真似ることからではなく、トレードオフと制約を理解することから生まれます。その洞察を、積極的に共有しましょう。
OMCB033D(818,整数)

https://onlinemathcontest.com/contests/omcb033/tasks/11978

$a≧5b>0$より$ab≧5b^2$なので、
　$5b^2≦105000$
　$b^2≦21000$
　$b≦\sqrt{21000}<145$
になります。
また、$105000$の素因数分解は、
　$105000=2^3×3×5^4×7$
です。

素因数毎のべき乗で順に見ていきます。
・$3^0,5^0,7^0$の場合
　$b=\lbrace1,2,4,8\rbrace$が条件を満たします。
・$3^0,5^1,7^0$の場合
　$b=\lbrace5,10,20,40\rbrace$が条件を満たします。
・$3^0,5^2,7^0$の場合
　$b=\lbrace25,50,100\rbrace$が条件を満たします。
・$3^0,5^3,7^0$の場合
　$b=\lbrace125\rbrace$が条件を満たします。
・$3^0,5^4,7^0$の場合
　$b=\lbrace\rbrace$が条件を満たします。(条件を満たすものなし)
まとめると、$3^0,7^0$の場合
　$b=\lbrace1,2,4,5,8,10,20,25,40,50,100,125\rbrace$の$12$通りです。

続いて、$3$と$7$のべき乗を変えて見ていきます。
・$3=1,7=0$の場合
　$\lbrace3,6,12,15,24,30,60,75,120\rbrace$の$9$通りです。
・$3=0,7=1$の場合
　$\lbrace7,14,28,35,56,70,140\rbrace$の$7$通りです。
・$3=1,7=1$の場合
　$\lbrace21,42,84,105\rbrace$の$4$通りです。

したがって、解は、$12+9+7+4=32$通りです。
［ServiceNow］環境構築4 プラグインを導入

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

今回の自分が関わったときに使用したプラグインを記載する

# プラグイン
- Filter navigatorで、pluginsと検索
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/d55a147a-48d1-8d9e-3926-26f377cd3f46.png)
- Pluginsを押下
- Pluginを管理する画面に遷移する
## I18N: Japanese Translations 日本語翻訳
- 検索フォームに「*japanese」と検索
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/fb58386f-7af2-424f-ac48-4ef464ae6404.png)
- インストールして、個人インスタンスのホーム画面に戻る
- 設定ボタンを押下
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/c3c93e52-fa93-46fa-8fa6-0a70b4a51868.png)
- 言語で日本語を選択
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/4994e7c0-f2b7-7782-1a12-fbaedb14297a.png)
- メニューなどが日本語に変更される

## Customer Service
- 検索フォームに「com.sn_customerservice」と検索
- Customer Serviceプラグインが表示されるためインストールする
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/08281fd0-cc54-96be-2038-162a438ad837.png)

### Customer Serviceプラグインについて
- Customer Service Management (CSM) モジュール（モジュールとはメニューのこと）を有効化するための機能を提供している
- Customer Service Management (CSM) モジュール
    - 顧客サポート業務を管理するための特化した機能が利用可能である
    - 顧客からの問い合わせ（ケース）や、問題解決を追跡するためのプロセスを支援する
        - ユーザーが問い合わせをしたい→ポータル画面から問い合わせ
- CSMプラグインで利用可能な機能
    - ケース管理: 顧客からの問い合わせや苦情を管理し、対応状況を追跡
    - アカウント管理: 顧客（企業や個人）の情報を記録
        - アカウントテーブル
        - 連絡先テーブル
    - インタラクション管理: 顧客とのやり取り（電話、メール、チャットなど）を統合
    - ナレッジ管理: FAQやガイドラインを顧客やエージェント向けに提供
    - カスタマーポータル: 顧客が自分で問い合わせを確認・解決できるセルフサービスポータル
        - 「/csm」などの外部ページ
- アプリケーションピッカーのへんこう
    - ホーム画面で、「Application Picker」を押下
    - スクロールボタンを３回押すと、Customer Serviceのアプリケーションが表示される
    - Customer Serviceを選択
    ![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/9be26bd1-5e78-cc81-f2c3-2dfff7e6cb2b.png)


- ※Customer Serviceについては今後も解説していく
［ServiceNow］環境構築３ Application PickerとUpdate Set Pickerを表示する

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

# はじめに
- ServiceNowを操作する上で、常にどの環境で作業しているか把握するべきなのでこの２つは出しておいたほうがよい
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/f4bf7d50-98aa-9b78-55bc-d55dbff4f8a5.png)

# 表示方法
- 画面右上の２つの選択リストを表示する
- 設定ボタンを押下
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/c07eaf7c-5e21-08c4-0d53-844652cae0fb.png)
- DeveloperメニューのApplication PickerとUpdate Set PickerをONにする
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/71b2dcf3-951f-6263-8e7e-9d2d7462e8cc.png)

# Application Picker (アプリケーションピッカー)
- 右側のもの
- 目的: 現在作業しているアプリケーションスコープを選択するための機能
- 役割
    - グローバルスコープやカスタムアプリケーションを切り替える
    - 作業内容をどのアプリケーションに紐づけるかを指定する
- 例
    - グローバルスコープ (Global)
    - カスタムアプリケーション (例: "My Custom App")
- なぜApplication Pickerを変更する必要があるか
    - アプリケーションスコープごとのデータや設定を分離するため
        - ServiceNowでは、アプリケーションスコープごとに設定やデータが分離されている
        - 間違ったスコープで作業すると、想定外のテーブルやスクリプトが変更され、別のアプリケーションに影響を与える可能性がある
    - 適切なスコープでカスタマイズや開発を行うため
        - 新しいカスタムアプリケーションを作成するときや、既存のアプリケーションを修正するときには、そのアプリケーションスコープを選択する必要がある
    - デプロイやアップデートを安全に管理するため
        - スコープを分けることで、アプリケーション間の依存関係や不具合のリスクを低減する
        - カスタマイズや新機能を簡単に他のインスタンスへ移行できるようになる
- どういうときに使うか
    - カスタムアプリケーションを開発する場合
        - 自分のアプリケーションを作成し、スクリプト、テーブル、モジュールなどを追加したいときに、対応するスコープを選択する
        - 例: My Custom App スコープで新しいテーブルやUIポリシーを作成する
    - グローバルスコープでの作業が必要な場合
        - 全体的な設定や共通リソース（例: システムプロパティやナレッジベース）を変更する場合は、Global スコープに切り替える
        - 他のアプリケーションの機能をカスタマイズする場合
        - 他のアプリケーション（例: ITSM、CSM、HR）を拡張する場合に、そのアプリケーションのスコープを選択して作業する
    - 既存のアプリケーションを調査・修正する場合
        - 他の開発者が作成したアプリケーションをメンテナンスしたり、バグを修正するときに利用
    - 特定のスコープでのデバッグやテスト
        - テスト環境で特定スコープの機能が正常に動作しているか確認する際にもスコープを切り替える


# Update Set Picker (アップデートセットピッカー)
- 左側のもの
- 目的: 現在アクティブなアップデートセットを選択するための機能
- 役割
    - カスタマイズや変更内容を記録し、他のインスタンスに移行できるようにする
    - アップデートセットを切り替えることで、変更のトラッキングや分類が可能
- 例
    - Default（デフォルトアップデートセット）
    - Custom Update Set（カスタムアップデートセット）
Rubyエンジニア必見！Goでつまずきやすいポイントを実例で徹底解説

## はじめに
RubyエンジニアがGoを学ぶ際、「こんなはずじゃなかった」と感じる瞬間が多々あります。  
RubyとGoは哲学も設計思想も異なるため、同じタスクを実現するにも書き方やアプローチが大きく変わります。  
本記事では、RubyとGoの具体的なコード例を比較しながら、どのように異なるかを解説します。解決策は置いておき、純粋に「つまずきポイント」を紹介します。


## 1. 型宣言の必要性
Rubyでは型を意識する必要がありませんが、Goでは型を明示する必要があります。これが書き始めのハードルになることも。

### Ruby 
```ruby
def add(a, b)  
  a + b  
end  

result = add(1, "2") # 実行時エラー  
```
### Go  
```go
func add(a int, b int) int {  
  return a + b  
}  

// コンパイルエラー: "2"は文字列でintにできない  
result := add(1, "2")  
```

## 2. クラスがない
Rubyではクラスを使った設計が基本ですが、Goにはクラスがありません。構造体で代替する設計思想に戸惑うことが多いです。

### Ruby  
```ruby
class User  
  attr_accessor :name  

  def initialize(name)  
    @name = name  
  end  

  def greet  
    "Hello, #{@name}!"  
  end  
end  

user = User.new("Alice")  
puts user.greet  
```
### Go  
```go
type User struct {  
  Name string  
}  

func (u User) Greet() string {  
  return "Hello, " + u.Name + "!"  
}  

user := User{Name: "Alice"}  
fmt.Println(user.Greet())  
```

## 3. パッケージとファイル構造の厳格さ
Rubyでは`require`で好きな場所からコードを呼び出せますが、Goではパッケージ構造が厳密です。

### Ruby  
```ruby:main.rb
require './utils'  

puts Utils.say_hello  
```
```ruby:utils.rb  
module Utils  
  def self.say_hello  
    "Hello from Utils"  
  end  
end  
```
  
### Go  

```go:main.go
package main  

import (  
  "fmt"  
  "myapp/utils"  
)  

func main() {  
  fmt.Println(utils.SayHello())  
}  
```
```go:utils/utils.go  
package utils  

func SayHello() string {  
  return "Hello from Utils"  
}  
```

## 4. エラーハンドリングの煩雑さ
Rubyでは`begin-rescue`構文でエラーを簡単に処理できますが、Goではエラーチェックが明示的です。

  
### Ruby 
```ruby
begin  
  result = 1 / 0  
rescue ZeroDivisionError => e  
  puts "Error: #{e.message}"  
end  
```
### Go  
```go
result, err := divide(1, 0)  
if err != nil {  
  fmt.Println("Error:", err)  
}  

func divide(a, b int) (int, error) {  
  if b == 0 {  
    return 0, errors.New("division by zero")  
  }  
  return a / b, nil  
}  
```  

## おわりに
RubyとGoはどちらも強力な言語ですが、その違いによりエンジニアは新しい視点を得ることができます。本記事の具体例が、Rubyエンジニアの皆さんにとってGoの学習のヒントとなれば幸いです。
［ServiceNow］環境構築２ 旧バージョンに変更

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

# 前提知識
- ServiceNowの「Polaris」
    - San Diegoリリースで導入された新しいユーザーインターフェース「Next Experience UI」のコードネーム
    - 改善箇所の一部
        - UI刷新：モダンで直感的なデザイン
        - ナビゲーション強化：統一されたグローバルメニュー
        - テーマカスタマイズ：ダークモード対応・個別設定可
        - パフォーマンス向上：動作がスムーズに
        - アクセシビリティ強化：キーボード操作・スクリーンリーダー対応

- sys_properties テーブル
    - ServiceNowのシステムプロパティ（設定値）を管理するテーブル
    - erviceNowの動作をカスタマイズしたり、特定の機能の挙動を変更したりするために使用される

# 変更方法
- Filter navigatorで「sys_properties.list」と検索
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/c42c7d87-3f9e-1f1e-524a-c413eab75ddd.png)
- 検索条件でpolarisの設定を絞ります
    - Name フォールドを「*polaris」で絞る
    - Type フィールドを、「=true | false」で絞る
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/68a5851f-3714-ba36-1e77-b76ce1b7429f.png)
- Valueフィールドの値をすべてFalseにする
- Valueフィールドのセル？を押下し「Shift」＋「↓」で複数選択
- セルをダブルクリックして値をfalseに変更して「チェック」ボタンを押下
- 変更される
### 参考
- 新
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/4251242f-1eba-2c11-4e9c-20ad17d3c8c3.png)
- 旧
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/6f9c2873-d296-32fc-b84a-62964eeb3635.png)
［ServiceNow］環境構築１ 個人インスタンスを作成

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

# 個人インスタンスを作成

- 「ServiceNow Developer」とWebで検索
    - https://developer.servicenow.com/
- アカウントを作成してください
- 個人インスタンスを作成してください
- Start Buildingを押してください
- 個人インスタンスが開かれます
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/9d6b7e96-8416-7de3-7649-e0633f284c3c.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/2e14fb47-8f2d-dc32-6080-7ceb036340d9.png)
※こちらバージョンを下げています
requestAnimationFrameや イベント間引き (throttle/debounce)について

- **requestAnimationFrame** とは、ブラウザが最適なタイミング（モニターのリフレッシュレート等に合わせた描画タイミング）で呼び出すコールバックを登録する仕組みです。リアルタイム性が求められるアニメーションや頻繁な画面再描画を行う際に、単純に `setTimeout` や `mousemove` のたびに再描画するよりパフォーマンスが向上しやすい利点があります。  
- **イベント間引き (throttle / debounce)** とは、マウス移動やスクロールなど高頻度で発火するイベントを、そのまま処理し続けると負荷が高いので、一定のルールで間引きするテクニックです。  
  - **throttle**: 一定時間内に複数回イベントが発生しても、最初の1回だけ処理し、その後は無視する or 次回実行まで待つ。  
  - **debounce**: あるイベントが連続で発生する場合、最後の1回だけや、しばらく間が空いたところで処理する。  

---

## requestAnimationFrame とは

- ブラウザには `window.requestAnimationFrame(callback)` という関数があり、連続したアニメーション描画の際に `callback` を呼び出してくれます。  
- 従来は `setTimeout` や `setInterval` を使って 16ms くらいの間隔でアニメーションを行う手法が使われていましたが、`requestAnimationFrame` を使うとブラウザのリフレッシュタイミングに合わせて効率よくコールバックが実行されます。  
- コード例（マウス移動などではなく、単純にアニメーションする例）:  

```js
// アニメーションしたいオブジェクトの位置
let x = 0;

// アニメーションループ関数
function animate() {
  // 何らかの描画処理
  const elem = document.getElementById('box');
  elem.style.transform = `translateX(${x}px)`;
  
  // 値を更新して次フレーム
  x += 1;
  requestAnimationFrame(animate);
}

// 実行開始
requestAnimationFrame(animate);
```

- 上記のように、ループの最後で再度 `requestAnimationFrame(animate)` を呼ぶことで連続したアニメーションを実行できます。  

### ドラッグなどへの応用
- マウス移動のたびに `chart.invalidate()` を呼ぶと処理が激しくなる場合があります。そこでマウス位置を更新しつつ、実際の再描画は `requestAnimationFrame` 内でまとめて行う、といった手法がよく使われます。

---

## イベント間引き (throttle / debounce) とは

### throttle（スロットル）
- 一定時間（例: 100ms）ごとに、1回だけイベント処理する方法。  
- 例えばマウス移動が毎秒 100 回あっても、100ms ごとに 1 回しか処理しないので、最大で毎秒 10 回に抑えられる。  
- 例:

```js
function throttle(func, limit) {
  let inThrottle = false;
  return function(...args) {
    if (!inThrottle) {
      func.apply(this, args);
      inThrottle = true;
      setTimeout(() => inThrottle = false, limit);
    }
  };
}

// 使い方
window.addEventListener('scroll', throttle(function() {
  console.log('スクロールイベント処理！');
}, 200));
```

### debounce（デバウンス）
- イベントが止んでから一定時間後に 1 回だけ実行する方法。  
- 例えばテキスト入力中にイベントが連続発火しても、入力完了してから 300ms 後に処理する、といった使い方をする。  
- 例:

```js
function debounce(func, wait) {
  let timeout;
  return function(...args) {
    clearTimeout(timeout);
    timeout = setTimeout(() => func.apply(this, args), wait);
  };
}

// 使い方
const onResize = debounce(function() {
  console.log('リサイズ完了後に処理！');
}, 300);

window.addEventListener('resize', onResize);
```

---

## まとめ
- **requestAnimationFrame** はアニメーションや頻繁な再描画を効率よく行うための仕組み。  
- **イベント間引き (throttle / debounce)** は大量発生するイベントを抑制し、パフォーマンスを確保したいときに使う手法。  
- グラフのドラッグやスクロールなど、イベントが非常に高頻度で発生するケースでは、これらの仕組みを組み合わせると動作が滑らかになり、CPU 負荷も低減できます。
［ServiceNow］ITIL(アイティル)について

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

# ITIL（アイティル）とは
- ServiceNowのITILとは、サービスのマネジメントにおいて様々な企業の成功事例をもとに体系化したガイドラインである
- Information Technology Infrastructure Libraryの略

# ITILのメリット
- もともとExcelなどで個別で作成された業務管理をシステム化したいとき、ServiceNow製品を使うメリットとしてITILがある
- 個別で作られた業務フローは、不要な業務やタスクも多い
- ServiceNowが作成したITILは多くの企業の成功事例をもとに計算された業務フローである
- ベストプラクティスのITILに準拠することで、世界基準の業務管理を導入できる点がメリット
- システム化＋業務フロー改善ができる
# 蛇足
- 本屋に行ったらITILについての書籍が多くありびっくりした



# 参考
https://www.lmis.jp/casestudy/column/about-itil
【電脳少女プログラミング2088 ─壊レタ君を再構築─】「カジノ」をやってみた。

paizaの新作プログラミングゲーム【電脳少女プログラミング2088 ─壊レタ君を再構築─】[「カジノ」（paizaランク：D相当）](https://ppg.paiza.jp/denno2088/areas/12)をやってみました。
- - -
###### 問題
https://ppg.paiza.jp/denno2088/challenges/denno2088_c_d_02
- - -
###### 方針
1. 整数$a$, $b$, $c$を受け取ります
1. $1\times a+5\times b+10\times c$を出力します
	- 「$1\times$」は不要
	- $a\times 1+b\times 5+c\times 10$と書くと算数では減点されるらしい…
- - -
###### C
```c
#include <stdio.h>

int main() {
	int a, b, c;
	scanf("%d", &a);
	scanf("%d", &b);
	scanf("%d", &c);
	printf("%d\n", a + 5 * b + 10 * c);
	return 0;
}
```
- - -
###### C++
```cpp
#include <iostream>
using namespace std;

int main() {
	int a, b, c;
	cin >> a >> b >> c;
	cout << a + 5 * b + 10 * c << endl;
	return 0;
}
```
- - -
###### C#
```cs
using System;

class Program
{
	public static void Main()
	{
		int a = int.Parse(Console.ReadLine());
		int b = int.Parse(Console.ReadLine());
		int c = int.Parse(Console.ReadLine());
		Console.WriteLine(a + 5 * b + 10 * c);
	}
}
```
- - -
###### Go
```go
package main
import "fmt"

func main() {
	var a, b, c int
	fmt.Scan(&a)
	fmt.Scan(&b)
	fmt.Scan(&c)
	fmt.Println(a + 5 * b + 10 * c)
}
```
- - -
###### Java
```java
import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		int b = sc.nextInt();
		int c = sc.nextInt();
		sc.close();
		System.out.println(a + 5 * b + 10 * c);
	}
}
```
- - -
###### JavaScript
```js
const [a, b, c] = require("fs").readFileSync("/dev/stdin", "utf8").split('\n').map(Number);
console.log(a + 5 * b + 10 * c);
```
- - -
###### Kotlin
```kotlin
import java.util.*

fun main() {
	val sc = Scanner(System.`in`)
	val a = sc.nextInt()
	val b = sc.nextInt()
	val c = sc.nextInt()
	sc.close()
	println(a + 5 * b + 10 * c)
}
```
- - -
###### PHP
```php
<?php
	$a = intval(fgets(STDIN));
	$b = intval(fgets(STDIN));
	$c = intval(fgets(STDIN));
	echo $a + 5 * $b + 10 * $c, PHP_EOL;
?>
```
- - -
###### Perl
```pl
my $a = int(<STDIN>);
my $b = int(<STDIN>);
my $c = int(<STDIN>);
print $a + 5 * $b + 10 * $c, $/;
```
- - -
###### Python3
```py
a = int(input())
b = int(input())
c = int(input())
print(a + 5 * b + 10 * c)
```
- - -
###### Ruby
```rb
a = gets.to_i
b = gets.to_i
c = gets.to_i
p a + 5 * b + 10 * c
```
- - -
###### Scala
```scala
import scala.io.StdIn._

object Main extends App{
	val a = readInt()
	val b = readInt()
	val c = readInt()
	println(a + 5 * b + 10 * c)
}
```
- - -
###### Swift
```swift
let a = Int(readLine()!)!
let b = Int(readLine()!)!
let c = Int(readLine()!)!
print(a + 5 * b + 10 * c)
```
デシジョンテスト

## はじめに
テストについて、まったく勉強したことがありませんでした。
そのため、最近本を読み始め、自分用の備忘録と練習も兼ねて、記事を書こうと思いました。
[【この1冊でよくわかる】 ソフトウェアテストの教科書 [増補改訂 第2版]](https://www.amazon.co.jp/%E3%80%90%E3%81%93%E3%81%AE1%E5%86%8A%E3%81%A7%E3%82%88%E3%81%8F%E3%82%8F%E3%81%8B%E3%82%8B%E3%80%91-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82-%E7%AC%AC2%E7%89%88-%E5%B8%83%E6%96%BD/dp/481560875X) を参考に記載します。

## この記事の目的
デシジョンテストについて記載します。
毎回本を読み返すのが手間なので、ざっと手順を記載しておきます。
ですので、思い出せればOK、やり方がなんとなくわかればOK、というクオリティで記載します。
しかし前述の通り、テストについての知識がほとんどないので、誤りがあればご指摘いただけますと幸いです。

## デシジョンテーブルテストとは
複数の条件によって決まるソフトウェアの動作を一覧できる表を用いて行うテストのことです。
この説明ではよくわからないので、サンプルを下記に記載します。

以下は、楽天の会員ランクの条件です。
<table>
  <thead>
    <tr>
      <th>ランク</th> <th>条件</th>
    </tr>
  </thead>
  <tr>
    <td> レギュラー </td> <td>条件なし</td>
  </tr>
  <tr>
    <td> シルバー </td> <td>過去6ヶ月で200ポイント以上、かつ2回以上ポイントを獲得</td>
  </tr>
  <tr>
    <td> ゴールド </td> <td>過去6ヶ月で700ポイント以上、かつ7回以上ポイントを獲得</td>
  </tr>
  <tr>
    <td> プラチナ </td> <td>過去6ヶ月で2,000ポイント以上、かつ15回以上ポイントを獲得</td>
  </tr>
  <tr>
    <td> ダイヤモンド </td> <td>過去6ヶ月で4,000ポイント以上、かつ30回以上ポイントを獲得、かつ楽天カードを保有
</td>
  </tr>
</table>

これに対して、以下のようなデシジョンテストが作成されるイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677145/852ebfc9-b810-e739-794e-8a2df20982a2.png)

## デシジョンテーブルを見やすくする
楽天会員のランク分けでも、こんな表になるので、条件が増えたらと思うとゾッとします。
ですので、以下の観点でデシジョンテーブルを見やすくしたいと思います。
1. 矛盾している条件はないか
1. 表を簡略化できないか
1. 関連性が弱い条件はないか

実際に、楽天カードの例でやってみます。

### 矛盾している条件
こちらは事前に省略していますが、「199ポイント以下、かつ200ポイント以上」を満たすことはないので、省略可能ということになります。

### 関連性が弱い条件
まずこちらを見たいと思います。
「楽天カードを保有」という条件は、ダイアモンドランクにしか影響を与えません。
ですので、こちらの表を分割しようと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677145/9af58869-ebdf-a8ea-6e5e-0b53e9fd9b4a.png)

### 表を簡略化する
例えば、199ポイント以下はその後の条件「何回ポイントを獲得したか」「楽天カードを保有しているか」に関わらず、すべてレギュラーです。
こういう「なんでもいい条件」はまとめてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677145/58a77859-9de1-90e7-3389-912dd6dbb381.png)

### 別の書き方
ルールを Y/N の二択で書いてきました。
しかし、これを条件で書くことも可能です。
イメージは下記のようになります。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677145/02b9eb7a-1334-9574-9dbe-0b80fb9cfac5.png)

この時、「2と3」および「4と5」は、「楽天カードを保有しているか」という条件に関わらず同じ結果です。
そのため、まとめることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677145/e8528db9-1f16-4142-e858-f686ac8b22f2.png)

これを全ケースですると、テストケースの数は激減します。

## まとめ
以上が、デシジョンテストを作成する大まかな手順です。
これだとテスト漏れが少なそうなので、余力がある時に実務の傍らで練習したいと思います。
OCI Cloud Free Tier をもぎ取れ その11

# 概要
OCI Cloud Free Tierを取得してみた。
ubuntuに wordpressをインストールした。
codepenを投稿してみた。

# 手順
管理画面を開く。
ブラウザでhttp://****/wp-admin/　を開く。
投稿 新規投稿を追加をクリック
カスタムHTMLを追加し

```

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="PwYERPO" data-pen-title="circuitjs" data-user="ohisama" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ohisama/pen/PwYERPO">
  circuitjs</a> by ohisama (<a href="https://codepen.io/ohisama">@ohisama</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://public.codepenassets.com/embed/index.js"></script>

``` 
公開する。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/11aca42b-3900-35a7-3056-1c79ed10a7c1.png)


以上。
レスポンシブ検索広告の見出しを固定するには

# レスポンシブ検索広告

こんにちは、所属企業で広告運用を担当している鈴木です。

Google検索広告では現在、あらかじめ設定した複数の見出しと説明文が、検索に合わせて自動で組み合わせとなる
レスポンシブ検索広告を使用するのが主流となっています。

ただそのままでは、見出しを常に会社名やブランド名、商品名にしておきたい場合に
固定することができないという問題が発生することになります。

今回は、レスポンシブ検索広告で見出しを固定する方法を書いていきたいと思います。

## 見出しを固定するには

![スクリーンショット 2025-01-10 124304.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/be8b3524-7064-e119-d39e-df3202caf46b.png)

Google広告管理画面にログイン後、左メニュー「キャンペーン」をクリックし、広告作成画面を開きます。

「広告見出し」で、固定したい見出しにカーソルを置くとピンのマークが表示されるので、クリックします。

画像のように見出し固定は、位置を選択することができるようになっています。
固定したい位置を決め、「位置○にのみ表示」を選択して設定完了です。

### 推奨はされていない

このように、常に表示したいワードがある場合は見出しを固定することができるのですが、
そもそも、検索に合わせて形を変化させ最適化を目指すレスポンシブ検索広告では、固定することは推奨されていません。

固定することがパフォーマンスの低下につながるケースもあるため、サービスや商品に合わせて慎重に選択し、
広告を作成していく必要があると思います。

広告作成を考える際にはぜひ参考にしてみてください。

以上、鈴木でした。
CodePipelineの結果をChatbotを使ってSlackに通知してみた ～AWS100本ノック～ 23/100

# はじめに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/f037096d-d5fe-d9af-50f6-74dc33e9cbaa.png)


みなさん、AWSで通知をSlackに送りたい場合はどんなやり方で行っていますか？
LambdaでSlack APIを実行して通知したりすることも出来ますが、AWS Chatbotというサービスを使えば簡単に実現できるようです。

## AWS Chatbotとは？
AWS ChatbotとはAmazon Chime、Microsoft Teams、SlackチャンネルでAWS用のChatOpsを簡単に設定するエージェントです。
運用イベントやセキュリティに関する検出結果などの通知を、チーム全体が確認するチャットルームで受け取ることができます。

# 今回のゴール
みなさん、CI/CDでCodePipelineを利用すると思いますが、パイプラインが正常に終了したかいちいちAWSコンソールで確認するのは手間だと思ったことはありませんか？
そこで、今回はCI/CDで使われるCodePipelineの実行結果をChatbotを利用して、Slackに通知してみようと思います。
なお、通知を行うSlackチャンネルと、CodePipelineは事前に作ってある前提で進めさせていただきます:bow:


# やってみた
では、実際に作ってみます！

## Chatbotの設定

まず、Chatbotの設定を行います。

### ワークスペースの作成
`新しいクライアントを設定`をクリックし、クライアントして`Slack`を選択します。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/00a74e7f-17e5-3620-f2e4-81c65d7fadb0.png)


![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/c2f68a27-3036-6b6c-b094-81f71875e782.png)

ワークスペースのURLを聞かれるので、ご利用のワークスペースURLを入力して、`続行する`をクリックし、Slackへログインします。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/4040f237-5149-45d9-f44e-9f97cc3f40ad.png)

無事にログインができ、ChatbotがSlackへ投稿する許可をすると、ChatbotにSlackワークスペースが作られます。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/c691fd6a-53bf-52ff-950e-949347879445.png)

### チャンネルの設定
次に、どのチャンネルに投稿するか設定するため、`新しいチャンネルを設定`をクリックします。

任意の設定名を入力し、Slackチャンネルのリストから投稿するチャンネルを選択します。
それ以外はデフォルト値でOKなので、`設定`をクリックします。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/aec90fda-9e80-c27f-7292-91524a1e8aeb.png)

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/7ce69693-6794-9893-9c5e-af298b305d9e.png)

これでChatbotの準備は完了です！思った以上に簡単でした :smile: 

## CodePipelineの設定

次に、CodePipelineの通知設定を行うので、`設定`>`通知ルールの作成`をクリックします。
任意の通知名を入力し、詳細タイプを選択します。
今回は、パイプラインの結果(成功、失敗など)だけ通知出来ればいいので、`通知をトリガーするトリガーイベント`として、`Pipeline execution`の全てにチェックします。
`ターゲット`に先ほど作成したChatbotワークスペースを選択します。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/0e0ad693-06f3-c52c-7b8d-8b51c4958d35.png)


![2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/12690ea5-b46f-fdfb-5f41-b0f27ac4af20.png)



## 通知を見てみる
設定が完了したので、最後にCodePipelineを動かして通知されるか確かめてみましょう！
下の画像は成功した場合ですが、以下のように開始と成功のメッセージがSlackに通知されればOKです:v:
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/ea6232eb-008a-ffa3-a919-0ae454649d2e.png)



# おわりに
今回は、CodePipelineの結果をChatbotを使ってSlackに通知してみました！
CodePipelineに関わらず何かしらのイベントをSlackに通知したいケースは多々あると思いますので、そんな時はChatbotを利用していきましょう！
OCI Cloud Free Tier をもぎ取れ その10

# 概要
OCI Cloud Free Tierを取得してみた。
ubuntuに wordpressをインストールした。
three.jsを投稿してみた。

# 手順
管理画面を開く。
ブラウザでhttp://****/wp-admin/　を開く。
投稿 新規投稿を追加をクリック
カスタムHTMLを追加し
```
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://unpkg.com/three@0.124.0/build/three.js"></script>
<script src="https://unpkg.com/three@0.124.0/examples/js/controls/DragControls"></script>
<script src="https://unpkg.com/three@0.124.0/examples/js/controls/OrbitControls.js"></script>
<div id="koko"></div>
<script>
let scene, 
    camera, 
    light,
    renderer;
renderer = new THREE.WebGLRenderer({ 
	  antialias: true 
});
renderer.setSize(400, 400);
var conk = document.getElementById('koko');
conk.appendChild(renderer.domElement);
scene = new THREE.Scene();
scene.background = new THREE.Color(0xbfd1e5);
camera = new THREE.PerspectiveCamera(45, 400 / 400, 1, 1000);
camera.position.set(0, 0, 200);
scene.add(camera);
light = new THREE.AmbientLight(0xFFFFFF);
scene.add(light);
const size = 70;
const geometry = new THREE.BoxGeometry(size, size, size);
const material = new THREE.MeshNormalMaterial()
const box = new THREE.Mesh(geometry, material);
scene.add(box);
renderer.render(scene, camera);
var raycaster = new THREE.Raycaster();
var controls = new THREE.OrbitControls(camera, renderer.domElement);
controls.update();
renderer.domElement.addEventListener('click', function(e) {
  var raymouse = new THREE.Vector2();
	raymouse.x = (e.offsetX / 400) * 2 - 1;
	raymouse.y = -(e.offsetY / 400) * 2 + 1;
	raycaster.setFromCamera(raymouse, camera);
	var intersects = raycaster.intersectObjects(scene.children);
	if (intersects.length > 0)
	{
		const material0 = new THREE.LineBasicMaterial({ 
  	  color: 0xff0000 
    })
    const points = new Array()
    points.push(intersects[0].point)
    points.push(new THREE.Vector3(50, -50, 40))
    const geometry0 = new THREE.BufferGeometry().setFromPoints(points)
    const line = new THREE.Line(geometry0, material0)
    scene.add(line)
    renderer.render(scene, camera);
    }
})
function tick() {
	requestAnimationFrame(tick);
	//box.rotation.x += 0.03;
	//box.rotation.y -= 0.02;
	renderer.render(scene, camera);
	controls.update();
}
tick();
```
公開する。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/60b8a5fe-2e62-2e67-c8dd-06632ed1006e.png)


以上。
OCI Cloud Free Tier をもぎ取れ その9

# 概要
OCI Cloud Free Tierを取得してみた。
ubuntuに wordpressをインストールした。
javascriptを投稿してみた。

# 手順

## 管理画面を開く。
ブラウザでhttp://****/wp-admin/　を開く。
投稿 新規投稿を追加をクリック
カスタムHTMLを追加し

```
<script>
	alert("ok");
</script>

```
公開する。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c312c49e-56f2-05bc-ac82-59d4303af306.png)


以上。