OmniAICreator/Qiita-1.07M huggingface dataset:
Unity開発における開発データ管理備忘録

# Unityのデータ管理について
自分は現状、SSD256GBという少ない容量で、
HDD1TBを開発データ管理場所としてうまく活用吸う必要があった。
しかしHDDは非常に低速であり、データ保存はいいとしても開発をするには非常にストレスであった。
そこで
### 開発はSSD、開発が停止したらHDDにしようと考えた

# 実現方法
GitHubとSource Treeを活用する。
環境構築は他の記事を参考にしてください。
(たぶんこれ遠回りな方法です。)
## 1.Cドライブ(=SSD)上にUnityProjectを作成
Cドライブ上で開発をまず行う、そこではSource Treeの設定をしっかりと行い、
GitHubにリモートリポジトリも用意しておく。（後に利用する。）
## 2.開発が停止したら、Dドライブ(=HDD)にデータを移動する。
切り取りなりドラッグアンドドロップなりでDドライブ上にプロジェクトデータを移動する。
そうするとSource Treeを使えなくなる（あくまでもCドライブ上のプロジェクトで）
そうしたらSource TreeでDドライブの管理をできるようにする。
`New Tab`→`Create`ですぐに作成できる。

これ以上開発しないのなら基本これでOK.
ちょっとだけ変えたいとかならDドライブ上で修正して、Source Treeを使ってcommit,pushすればよい。

## ex.再度開発を行いたい場合
この2Stepでは一度Dドライブ上に退避したら、次は非常に低速な環境で開発を行わなければならない、
そこでGitHub上のデータをCloneする。
Source Treeを開いて、
`New Tab`→`Clone`
GitHubのリンクとか貼って、保存先も設定したらクローンする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536729/2343e281-697e-a315-6ac1-73437584b6fd.png)
自分の保存先はこんな感じ。
そしたら最新の状態(任意の状態)にチェックアウト(sourceTreeで)したらOK.
新しいBranch作ったらPullしてね。
そしたらUnityHubから開けるようになる。
初めまして！Aquilaと申します

私たちチームは2023年大会からRCJ(ロボカップジュニア)に参加しているチームです。
※2018年頃に活動しているAquilaとは別のチームです。私たちが2代目となります。

チームの情報は主にtwitter(X)で投稿していますが、まとまった記事が書ける時はこちらに投稿していきたいと思います。

もし良ければtwitter(X)の方のフォローお願い致します！！
URLはこちら↓
https://x.com/aquila_rcj?s=21
【卒業課題】【個人開発】子供のお手伝い習慣化アプリケーション　”やるゾウ”　🐘

## はじめに

はじめまして、@numashiと言います。　30代あるあるの「このままで自分はいいのか？？」現象になり子ども4人もいながら急遽仕事を辞めて、4ヶ月間プログラミングオンラインスクール「ディープロ」で学んできたというのが今の所の状況です。絶賛就職活動中です。　

今回の記事は卒業課題で作成した”やるゾウ”のご紹介です。このWEBアプリケーションは”子どものお手伝いを楽しく習慣化”することを目的としたものになっています。　~~だってお手伝いしてくれないんだもん~~  
やるなら楽しくがモットー。

https://yaruzou.jp/

【URL】　https://yaruzou.jp/

【GitHub】　https://github.com/monnichi1209/yaruzou

【Twitter】　https://twitter.com/monnichi1209
 ~~私は、𝕏ではなくTwitter派~~
## なぜ、やるゾウを製作したのか？　

![スクリーンショット 2023-09-04 10.42.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3128136/5f2a6faf-8b94-cbf4-99ad-ba77c18774b2.png)

子どもにお手伝いをしてもらいたい。しかし、「お手伝いして！」「洗濯畳む言ったでしょ！」「TV見てないでやって！」・・・お手伝いを頼む方が逆に疲れて、自分でやった方が早いからついつい私がやってしまう。　~~お手伝いお願いして、結局やらずに妻がやることになるパターンが一番あかんやつ~~

今まで様々なお手伝いパターンをやりました。「褒めまくりでモチベUP☺️お手伝い」「お駄賃渡すよ💰お手伝い」「仏の如く温かく見守る👼お手伝い」「とにかく厳しく指導😡お手伝い」・・・。どれもうまくいかずでしたが、唯一動くのはやっぱり「お駄賃渡すよ💰お手伝い」でした。現金万歳。

あと、お手伝いをお願いして困ることが、「誰が何のお手伝いをやったのか問題」「お手伝いのお駄賃上げたか問題」「お手伝いのやり方が全員違う問題」　　私自身もタオルの畳み方覚えるのに何年かかったことか・・・😇（畳み方何でもいいやん派）

そんなこんなで、卒業課題を製作する時期になった時に「他人の悩みより、自分自身の悩みを解決するものを開発した方が熱も入るよ！」とのRubyセミナーやディープロの先輩方の言葉を思い出し「よし、子どものお手伝い管理アプリケーションを開発しよう！」となりました。

## 開発言語
- Ruby: 3.0.1
- Rails: 6.1.7.4
- PostgreSQL: 14.8

## 使い方

ログインすると、初めに”親子選択ページ”になりますので初めは”パパママ”をお選びください。

![スクリーンショット 2023-09-04 14.12.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3128136/0fc08b8d-e55a-b74c-83af-9c92132e4785.png)

保護者ダッシュボードに遷移しますので、次は、”子どもを追加”をクリックして追加して下さい。現時点では名前のみ登録が可能です。

あとは、保護者ダッシュボードに戻りますので、”お手伝いを追加”をクリックし登録して下さい。お手伝いは”タスク名””詳細””期限””報酬”となります。

![スクリーンショット 2023-09-04 14.23.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3128136/58b5c56c-da8d-b6ba-b22f-1c1c9a521c08.png)


保護者ダッシュボードでは「こども一覧」「子供それぞれの所持ポイントやお手伝いの内容確認」「お手伝いの検索機能」「交換できる報酬の確認」となっております。

ここからはメインの子どもが実際に操作するページになります。小学校1年生が我が家にいますので、基本はひらがなです。

![スクリーンショット 2023-09-04 14.22.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3128136/9d4cf070-daa0-4e2a-d667-628af278d30f.png)


簡単な流れを説明しますと
①”てつだう”では、パパママが登録したお手伝いを選びます（これをする！）
②”やってる”では、お手伝いが終わったら”おわった”やっぱりお手伝いをやめる時は”やめる”を選択します。
③”ごほうび”では、自分の所持ポイントを確認しながら設定されているご褒美と交換ができます。

具体的な中身は是非”やるゾウ”をご利用してみて下さい。

https://yaruzou.jp/

## 力を入れたポイント
・子どもでも使えるか？わかりやすいか？喜んでくれるか？と子供目線で考えました。
・保護者の方も使いやすく、あまり普段からWEBアプリケーションを利用しない方でもわかるように簡素化しました。

## 反省点
・GitHubのissueをたてたが、ほぼ利用しなかった。
・提出期限が迫り、ほぼほぼmasterにgit add等しており、ダメ、絶対と猛反省。

## 今後実装したいこと
・獲得したポイント数や、継続日数により獲得ができる「デジタルバッチ機能」
・お手伝いのやり方を動画で確認ができる「動画投稿機能」
・ユーザーがご褒美を設定できる機能

## 最後に
最後までご覧いただきありがとうございます。この4ヶ月間様々なことがあり、最後の方では挫折しそうになりましたがこれもスクールの皆さんであったり、家族の支えがあったから無事に卒業ができたと考えています。　まだまだ未熟ですがWEBエンジニアとして家族を養えるくらいには成長していきたいです。　　さて、次は何を開発しようかな・・・。
URLセーフなBase64エンコーディングとデコーディングとは

Base64エンコーディングした文字列をURLパラメータで送信を求められることがあります。Base64エンコーディングされた文字列にはURLに含められない`+` 、`/`、`=`が含まれるため、**URLセーフ**　に変換が必要です。

## Base64エンコーディングとは

データを **64種類の文字** (アルファベット大文字小文字、0から9の数字)と`+`、 `/`、`=`の記号のみを使って変換する方式。メールの添付ファイル送信などに使われます。

## javascriptの場合

```js
const encoded = btoa("String to be encoded")
    .replace(/=/g, "")
    .replace(/\+/g, "-")
    .replace(/\//g, "_");
```

javascriptの場合は `btoa` でBase64エンコーディングした後、`+`を`-`に、`/`を`_`に変換し、末尾の`=`は削除します。

デコードする場合は逆の操作をします。

```js
const decoded = atob(encoded
    .replace(/-/g, "+")
    .replace(/_/g, "/"));
```

## Pythonの場合

```py
import base64

encoded = base64.urlsafe_b64encode("String to be encoded").decode('utf-8').replace('=', '')
```

pythonの場合、`base64.urlsafe_b64encode`が使えますが、`=`の削除はマニュアルで行います。
備忘録代わり

これから業務でNuxt3,Vue3,React,Next.jsなどなどを使っていく上で、調べた内容やキャッチアップした内容を備忘録代わりに残していきます。

基本自分のためですが、誰かの参考になりますと幸いです。

よろしくお願いいたします。
【JSTQB ALTM】シラバスまとめ（第2章）

<iframe src="https://www.slideshare.net/slideshow/embed_code/key/C1WeTXA80sm7Xj?hostedIn=slideshare&page=upload" width="476" height="400" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>

::: note warn
【注意】
筆者（私）独自の解釈・理解をまとめた資料のため、誤りがある可能性があることにご留意ください
読メモ　ファンダメンタルズテクニカルマーケティング


概要:
webマーケティングにおいて昨今のテクニカルマーケティング（消費者嗜好チューニングされた自動広告をイメージすると良い）が全て上手いことやってくれるかというとそうではない。
ファンダメンタルズマーケティングを知ったうえで手法の一つとしてテクニカルマーケティングを活用しないと、効率よく消費者購買に結びつく広告を展開できない。

①ファンダメンタルズ
「誰に」「何を」「どんな風に」アピールするか考える。マーケティングの基礎。「何を」を適切に導き出すところがマーケッターの腕の見せ所。

「誰に」:ユーザー起点でどんな悩みを抱える人か、これまでの経緯を起点に考える。商品起点で、商品とユーザーの距離から考える。「誰に」伝えたいかで全く異なる「何を」「どんな風に」が決まる。
※商品広告の場合は読み物広告と異なりペルソナ条件全てに当てはまらないと購買に至らないためペルソナに中注意。

「何を」:USP。お得感や他社との比較で特筆すべきところをアピール点にする。商品を買う人とサシで話してどんな魅力が伝われば買いそうか聞く。

「どんな風に」:受け手の状態を気にして考える。どのページを見ている状態でどんなキャッチコピーに反応しやすいか。広告媒体と商品イメージの相互作用も考える。文章媒体の場合、最初の一文が大事+否定→喚起の文章構成だといい。とにかく一行目二行目。LPのエモーションリレーも意識。一言違うだけで効果が簡単に倍になるのがWEB広告。

テクニカルマーケティングの台頭で「誰に」のチューニング精度が上がったが、「何を」「どのように」はまだ不十分。アドテクの最初の方向性を考え適切な最大展開点に舵を切るのは人間の役目ということ。変な最適化されないように。


②テクニカル
※色々あるけどテクニカルの部分はクリエイティブ自動生成で可能では？と思ったりした。

ABテスト：2つの広告のクリック率や購入率を比べる。デザイン、アピール点、言い回し、でテストして仮説を立証する。クリック数などはクライテリアを決める。

チューニングの方法:到達点を決めてから広告をチューニングすること。売上などのKPIがあって、到達可能か判断し初めてチューニングやクリエイティブの精度向上に取り掛かる。

SEO：Googleの上位表示の仕組みのアップデートといたちごっこになりやすいのであまり重要視しなくていい。いい会社、いい商品、を生み出すことのほうが結果的に有効。

顧客生涯生産価値LTV：利益=LTV×粗利-獲得単価
で広告の有効性を評価する。LTVが顧客ごとの計算をサマったものであることは言うまでもないが、商品ごと、広告ごと、キャンペーン、それぞれ細かく区分して収益性を分析する。獲得件数の期待値、LTV期待値、をかけ合わせ、予算と比べて広告展開する。広告打ちすぎて獲得単価が高くなるのもだめ。

広告入札：表示したとき、クリックしたとき、購入したとき、それぞれの広告費用の形態がある。メディア側も広告主も最適な入札形態と入札金額を選択したい。広告主は期待されるクリック数と購入率の期待値から、入札金額の最大を決める。メディア側は、メディアの質が落ちないように、有益な情報となるように広告主を選定する。


③まとめ
キャリアのこと、常に最先端を追うこと、自分の希少価値の作り方（ある分野で1/100、別の分野で1/100だと希少価値1/100000的な）、が最後に綴られていた。マーケッターは5年もあればセンス依存でスキル差がなくなるらしい。ITやると良いと書いてあったので嬉しかった。

ブランドではなくプロダクトで売れる時代。ナショナルブランドもプロダクト品質の維持向上ありき。黒字特化を狙い、安易にプロダクトの幅や知名度を高めてランニングコストに疲弊されないことも戦略である。

棲み分けを具現化しよう、企業のソリューションクリエイティブを作れる人になろう。

終わり。
Databricks REST APIによる機械学習モデルのステージ変更のリクエストと承認

Databricksでは、[MLflowモデルレジストリ](https://docs.databricks.com/ja/machine-learning/manage-model-lifecycle/workspace-model-registry.html)を用いてモデルのステージ(None、Staging、Production、Archived)を変更することができます。これによって、モデルの現在の状態を管理することができます。

- None: なんでもない
- Staging: テスト中
- Production: 本番運用中
- Archived: お蔵入り

GUIでは承認依頼を上げることは知っていたのですが、さてPythonからはできたんだっけ？となりましたので調べてみました。[MLflow API](https://www.mlflow.org/docs/latest/rest-api.html#transition-modelversion-stage)にはありませんでしたが、Databricks REST API経由でできました。

# 準備

DatabricksからREST APIを呼び出すので、[こちら](https://community.databricks.com/t5/data-engineering/how-can-i-make-databricks-api-calls-from-notebook/td-p/25313)を参考にREST APIのエンドポイントURLとトークンを取得します。

```py
databricksURL = dbutils.notebook.entry_point.getDbutils().notebook().getContext().apiUrl().getOrElse(None)
myToken = dbutils.notebook.entry_point.getDbutils().notebook().getContext().apiToken().getOrElse(None)
```

# モデルステージのリクエスト

エンドポイント`/api/2.0/mlflow/transition-requests/create`をコールします。

```py
import requests
 
header = {'Authorization': 'Bearer {}'.format(myToken)}
endpoint = '/api/2.0/mlflow/transition-requests/create'
payload = """{
"name": "wine_quality_takaakiyayoidatabrickscom",
"version": "30",
"stage": "Staging",
"comment": "このバージョンはすばらしいです！"
}
"""
 
resp = requests.post(
  databricksURL + endpoint,
  data=payload.encode("utf-8"),
  headers=header
)
```

```py
resp.text
```
```json
{
    "request": {
        "creation_timestamp": 1693805509130,
        "user_id": "takaaki.yayoi@databricks.com",
        "activity_type": "REQUESTED_TRANSITION",
        "comment": "このバージョンはすばらしいです！",
        "to_stage": "Staging"
    }
}
```

リクエストが作成されました。
![Screenshot 2023-09-04 at 14.25.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/176aedb4-56b2-367e-d5a3-9a6717a63038.png)

# モデルステージの承認

エンドポイント`/api/2.0/mlflow/transition-requests/approve`をコールします。

```py
header = {'Authorization': 'Bearer {}'.format(myToken)}
endpoint = '/api/2.0/mlflow/transition-requests/approve'
payload = """{
"name": "wine_quality_takaakiyayoidatabrickscom",
"version": "30",
"stage": "Staging",
"archive_existing_versions": true,
"comment": "OKです。"
}
"""
 
resp = requests.post(
  databricksURL + endpoint,
  data=payload.encode("utf-8"),
  headers=header
)
```

```json
{
    "activity": {
        "creation_timestamp": 1693805598456,
        "user_id": "takaaki.yayoi@databricks.com",
        "activity_type": "APPROVED_REQUEST",
        "comment": "OKです。",
        "last_updated_timestamp": 1693805598456,
        "from_stage": "None",
        "to_stage": "Staging",
        "id": ""
    }
}
```

承認されてステージが変更されました。
![Screenshot 2023-09-04 at 14.33.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4328483a-1f88-0859-6aad-39371ff59c71.png)

これらのやりとりもすべて記録されています。
![Screenshot 2023-09-04 at 14.33.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/625a8fb7-7f6a-133b-c76b-7ee6c4963349.png)

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
WinMergeでcsvのテーブル表示とテキスト表示を切り替え

# 概要

2つのcsvの差分をとると下記のようにテーブル表示してくれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/9db58e5b-3c09-d989-3fdd-ae22999ef9b2.png)

でも、あえて下記のようにテキストとしての差分表示にしたい場合もある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/8473a352-bb5e-d72a-4a93-0dbab884bc8f.png)

2種類の表示を切り替えたい。

# やり方

1. ファイル
1. 形式を指定して再比較
1. テキスト or テーブル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/d7716d56-4f58-1f01-fa80-1a49c1e0cbfc.png)

# 参考サイトさん

https://plaza.rakuten.co.jp/ulala13/diary/202007300000/

# バージョン

Microsoft Windows [Version 10.0.19045.3393]
WinMerge Version 2.16.28.4
Gitで変更を無視しているファイルをリストアップするコマンド

すでにGitリポジトリに追加されているファイルの変更をコミットしたくない場合、`git update-index --assume-unchanged`などのコマンドで無視できるそうです。
以下の記事を参考にしました。

https://qiita.com/usamik26/items/56d0d3ba7a1300625f92

その`git update-index`で無視しているファイルをリストアップするコマンドです。

```shell
git ls-files -v | sed -n 's/^\([a-zS]\)/\1/p'
```

同記事中でも解説されていますが、リポジトリに未追加のファイルの場合は`.git/info/exclude`というファイルを作成して`.gitignore`と同じようにファイルを記述します。
2023年9月 AIOps 定点観測

# 概要
AIOps の動向や学習のため、Google で AIOps を検索した結果を記録している記事です。

# 2023年9月4日の検索結果 (リスティング広告)

![20230904_AIOps_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/bc57b08c-da71-b586-325c-dfee3e0d99db.png)

* PureStorage
* IBM
* Splunk
* Dynatrace

今月も PureStorage がトップです。 IBM と Splunk が続いています。3位と4位の入れ替えはありましたが、上記4社の顔触れは先月と同じです。

先月の結果はこちら --> [2023年8月 AIOps 定点観測](https://qiita.com/mkodera/items/72997da3ac59965b46a7)

# 2023年9月4日の検索結果 (広告以外)

![20230904_AIOps_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/878a7a53-b80f-05cf-cb70-073179a52e10.png)

* HPE
* Splunk
* 日立製作所
* IBM
* ServiceNow

広告以外では HPE が強調スニペットでトップに表示されています。 その後に Splunk、日立が続いています。3位と4位の入れ替えはありましたが、上記5社の顔触れは先月と全く同じです。

先月の結果はこちら --> [2023年8月 AIOps 定点観測](https://qiita.com/mkodera/items/72997da3ac59965b46a7)
MacからGitHubへSSH接続出来るようにする設定方法

新しく働き始めた会社のPCのセットアップをしているのだが、
PC新規立ち上げが久々過ぎてGitHubのSSH設定方法を忘れかけてるので備忘録。

```zsh
% git clone git@github.com:${account name}/${repository name}.git
Cloning into '${repository name}'...
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

## 前提

* GitHubに登録していること。
* Mac OS 13.5.1 Ventura (22G90)

### 認証キーの作成

※ここではパスフレーズ無しで`github_id_rsa`という名前を指定して作成しています。

```zsh
% cd ~/.ssh
% ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/mitsuaki.ihara/.ssh/id_rsa): github_id_rsa
Enter passphrase (empty for no passphrase): ${空でエンター}
Enter same passphrase again: ${空でエンター}
Your identification has been saved in github_id_rsa
Your public key has been saved in github_id_rsa.pub
```

### 公開鍵をGitHubにアップする

公開鍵の中身をクリップボードにコピーする。

```zsh
% pbcopy < ~/.ssh/github_id_rsa.pub
```

[SSH keys](https://github.com/settings/ssh)から`New SSH Key`をタップし、下記を入力

* Title:${どのPCか分かりやすくなる鍵の名前推奨}
* Key type:Authentication Key
* Key:${コピーした公開鍵}

### 接続確認

作成した鍵情報を指定しつつGitHubに接続する。

```zsh
% ssh -T git@github.com -i ~/.ssh/github_id_rsa
Hi mitsuaki1229! You've successfully authenticated, but GitHub does not provide shell access.
```

### コンフィグの作成

鍵情報を指定しないとデフォルトの鍵情報を見に行ってしまうため、GitHubに接続する際の情報を指定する。

```zsh
% touch ~/.ssh/config
% vim ~/.ssh/config
```

下記を追記

```config
Host github github.com
  HostName github.com
  IdentityFile ~/.ssh/github_id_rsa
  User git
```

キー指定無しで接続出来ることを確認。

```zsh
% ssh -T git@github.com
Hi mitsuaki1229! You've successfully authenticated, but GitHub does not provide shell access.
```

### リポジトリのクローン

クローンの実施。

```shell
% git clone git@github.com:${account name}/${repository name}.git
```

## 参考

https://qiita.com/shizuma/items/2b2f873a0034839e47ce
スッキリわかるJava入門 第３版を読んでみて- part17 -例外[前編]

# はじめに
こんにちは　◤●ㅅ●◥ﾉ
今回は例外について学びました！
長いので前後編に分けてまとめてます！


## 第１７章　例外[前編]
プログラム開発では実行時に想定外の事態が発生する可能性を考慮しておく必要があります
Javaにはこの想定外の事態に対処できる機能が備わっています
このしくみを学ぶことでどのような状況でも安定して動くプログラム開発を目指しましょう

### 1.エラーの種類と対応策
:star: <font color="#ff4d4d">**不具合のないプログラムを目指す**</font>
動くコードは書けて当たり前、不具合対策がプログラマの腕の見せ所である。

※プログラムが想定通りに動かないこと...不具合

#### 不具合は大体この３種類
##### 1.<font color="#ff4d4d">**文法エラー(syntax error)**</font>
内容：
　文法の誤りによりコンパイルに失敗する、最も単純なエラー
　例：セミコロンのつけ忘れなど

解決方法：
　コンパイラが指摘したコードの箇所を修正する

##### 2.<font color="#ff4d4d">**実行時エラー(runtime error)**</font>
内容：
　実行している最中に何らかの異常事態が発生し、動作が継続できなくなるエラー
　文法では問題なく、実行はできるが実行中にエラー表示がされ強制終了する
　例：範囲外要素へのアクセス、0での割り算など

解決方法：
　あらかじめ「エラーが発生した時の対応策」を記述しておく

##### 3.<font color="#ff4d4d">**論理エラー(logic error)**</font>
内容：
　文法に問題はなく、強制終了もしないがプログラムの実行結果が想定していた内容と違う
　一番やっかいなやつ👿
　例：計算の結果が違う 5+3=53　みたいな

解決方法：
　原因箇所を自力で探してコードの箇所を修正する

　⇩

１、３は開発時にテストを行うことで本番の発生を予防できるもの
しかし２の実行時エラーは「プログラム実行中に想定外の事態の発生」で起きてしまう

　⇩

「想定外の事態」... __例外的状況(例外)__ という

例外的状況　例：
・パソコンのメモリが足りなくなる
・存在すべきファイルが見つからない
・nullが入っている変数を利用しようとした　　など

上記の共通点...プログラマが例外的状況の発生を予防できない

　⇩
このような例外的状況に備えて対策し、実際に実施すること... __例外処理__

### 2.例外処理の流れ
Javaには例外処理専用の文法としくみが備わっている
下記を参考⇩

```
try{
 FrileWriter fw = new FileWriter("data.txt");
 fw.write("hello!");
 fw.close();
 //本来の処理

}catch(IOException e){
 System.out.println("エラーです。中断します。");
 //例外処理
}
```
Javaでの例外処理にはtryとcatchという２つのブロックを使用する __(try-catch文)__

通常：
　実行されるのはtryブロックのみ
例外状況が発生：
　catchブロックに移行する

:pencil2:  Javaにおける例外処理の基本パターン
```
try{
 通常実行される文
}catch(...){
 例外発生時に実行される文
}
```

### 3.例外クラスとその種類
:thinking:catchの後の(IOException)は何者か？

:grinning:Javaは発生した例外を区別できるようにそれぞれの例外状況を表すクラスが準備されている

#### :star: 例外の種類
##### 1.<font color="#ff4d4d">**Error系例外**</font>
内容：
　回復の見込みがない致命的な状況
キャッチの強制：
　try-catch文でキャッチする必要はない
##### 2.<font color="#ff4d4d">**Exception系例外**</font>
内容：
　その発生を十分に想定して対処を考える必要がある例外的状況
キャッチの強制：
　対処を考える必要がある例外的状況のため、
　try-catch文でキャッチしないとコンパイルエラーになる
##### 3.<font color="#ff4d4d">**RuntimeException系例外**</font>
内容：
　必ずしも常に発生を想定すべきとまでは言えない例外的状況
キャッチの強制：
　try-catch文でキャッチするかは任意

※__チェック例外__
　Exception系例外の別名
　例外発生時の対策が用意されているかコンパイル時にチェックされるため
<br>
##### 発生する例外の調べ方
どのメソッドを呼び出したらどんな例外が発生する可能性があるか
　→APIリファレンスに掲載されている

Exception系の例外が発生する場合
　→引数リストの後に「frhows 例外クラス名」が表記される

### 4.例外の発生と例外インスタンス
:thinking:(IOException e)のeは何者か？
```
try{
⋮	
}catch(IOException e){
 System.out.println("エラーです。中断します。");
}
```
:smiley:例外状況の詳細情報が詰め込まれたIOExceptionインスタンスを変数eに代入している
　→catchでは変数eに格納された情報を取り出し、適切なエラー処理をしている

##### 例外インスタンスの利用
例外インスタンスに格納されている詳細情報はその例外の種類によって異なる
しかし、すべての例外に持っている情報が２つある
![スクリーンショット 2023-09-01 17.41.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336192/f86f84e5-92af-da8c-6c57-355b48b803b0.png)

スタックトレース
「JVMがプログラムのメソッドをどのような順序で呼び出し、どこで例外が発生したか」という経緯が記録された情報のこと

## まとめ
プログラムが想定通りに動かなくなる不具合について対策することがプログラマの腕の見せ所
不具合には文法エラー、実行時エラー、論理エラーの３種類があり文法エラーと論理エラーはテストで対策ができるが、実行時エラーはできないため例外処理という対策を行う
Javaでの例外処理にはtryとcatchという２つのブロックを使用する
Javaは発生した例外を区別できるようにそれぞれの例外状況を表すクラスが準備されている

想定外の動作をした時にどのようなことが起きているのかその種類や原因という例外の基礎的な部分を学べたと思います。次の後半ではもう少し具体的な部分をやっていくと思います。

今回もありがとうございました！
ではまた〜　◤●ㅅ●◥ﾉ"
【随時更新】AWS クラウドプラティショナーに出てくる用語

- オンプレミス
    - サーバー、ネットワーク機器、ソフトウェアを自社で保有、運用、管理する形態
- クラウド
    - インターネットなどのネットワーク越しにサーバー、ストレージなどのITリソースやアプリケーションソフトウェアなどを利用できること
- AWS
    - Amazonが提供しているクラウドコンピューティングサービス
    - 代表的なサービス
        - EC2　仮想サーバーの提供
        - RDS　データベースの提供
- 従量課金制
    - サービスの利用量に応じて請求する料金が変化する課金方式
- 責任共有モデル
    - AWSと利用者間のセキュリティやコンプライアンスの責任の所在を示したもの
- サイジング
    - 運用するシステムやサービスの規模に合ったリソースぞ見積もること、あるいは用意しておくこと
- 俊敏性
    - 素早くITリソースを用意すること
- スケーラビリティ
    - システムの拡張性のこと
    - 必要に応じて運用中のシステムを拡張、縮小すること
- 水平スケーリング
    - リソースの台数を増減させることでシステム全体のスペックを調整すること
- 水長スケーリング
    - リソースのスペックを変更することでシステム全体のスペックを調整すること
- 疎結合
    - システム間の結びつきや関係性が弱く、個々のシステムの独立性が高いこと
- Design for Failure
    -  障害が発生することを前提にシステム設計をする考え方
-  並列化
    -  複数のリソースを用意して、同時に複数の処理を実行すること
-  規模の経済
    -  事業規模が大きくなればなるほど、単位当たりのコストが小さくなること
- リージョン
    - クラウドサービスのAWS所在地
    - 日本では東京と大阪にある
- アベイラビリティゾーン（AZ）
    - 1つのAWSリージョン内でそれぞれ気に離され、冗長的な電力源、ネットワーク、接続機能を備えている1つ以上のデータセンターのこと

# 参考
  - https://youtube.com/watch?v=wSYBk6PCfyw&si=RjyIdAFylSH1v2CD
人に質問するときのテンプレートっぽい何か

**質問の目的:**
[質問の背後にある目的や目標を明確に述べてください。]

**関連情報:**
[質問に関連する背景情報やコンテキストを提供してください。]

**質問の詳細:**
[具体的な質問を明確に記述してください。できるだけ詳細に、どのような問題や疑念があるのか説明してください。]

**試したこと:**
[質問に先立ち、自分で試した解決策やアプローチについて述べてください。]

**問題点:**
[試したことの結果、何がうまくいかなかったのか、どのような問題が残っているのか説明してください。]

**具体的な要望:**
[先輩に対する具体的な要望やアシストを記述してください。]

**締めの言葉:**
[感謝の意を表す締めの言葉を添えて、丁寧なコミュニケーションを心がけましょう。]


上記を考えてから質問することにより、相手が答えやすくなりますし、自分でも整理ができるのでおすすめです。
Force.com サイトと site.com の違いは?

+ [Difference between force.com site and site.com?](https://salesforce.stackexchange.com/questions/23252/difference-between-force-com-site-and-site-com)


#  Force.com サイト

+ orce.com サイトは、認証済み Web サイトと公開 Web サイト (つまり、従来のポータル製品) の両方をサポートします。
+ すべての Enterprise Edition (またはそれ以降) および開発者組織に含まれます。
+ Visualforce、JavaScript、CSS を使用したカスタム ページのサポート。
+ 主な対象読者は、上記の言語に精通した開発者ユーザーです。
+ すべての Force.com オブジェクトにアクセスできます。

+ [Force.com サイトの制限を管理する](https://help.salesforce.com/s/articleView?id=000385779&type=1)

# Site.com

+ [Site.com](https://help.salesforce.com/s/articleView?id=sf.siteforce_overview.htm&type=5)

+ 以前は「Siteforce」と呼ばれていました。
+ プロビジョニングされた (有料の) 製品です。
+ Site.com はコーディングが必要ないため、技術者以外の管理者を対象としています。
+ CMS のドラッグ アンド ドロップのサポート。
+ HTML、CSS、JavaScript を使用したカスタムコーディングが可能です。
+ 誰がサイトに投稿および公開できるかについてのセキュリティ モデルが含まれています。
+ Chatter は、フロントエンド Web サイトでは利用できませんが、コンテンツの投稿に関してはサポートされています。

# Salesforce サイト

+ [Salesforce サイト](https://help.salesforce.com/s/articleView?id=sf.sites_overview.htm&type=5)

Salesforce 組織には、パートナー、ソリューション、商品、ユーザ、アイデア、その他のビジネスデータに関する貴重の情報があります。この情報の一部は、組織外のユーザに有用ですが、適切なアクセス権および権限を持つユーザのみが情報を参照および使用できます。以前は、このデータを一般公開できるようにするために、Web サーバを設定し、カスタム Web ページ (JSP、PHP など) を作成、サイトと組織で API インテグレーションを実行する必要がありました。また、Web フォームを使用して情報を収集する場合、データ検証を実行するよう、ページをプログラムする必要がありました。

Salesforce サイトを使用すると、こうした操作が必要なくなります。Salesforce サイトでは、公開 Web サイトとアプリケーションを作成できます。それらは Salesforce 組織と直接統合されるため、ユーザがログインする場合にユーザ名やパスワードは必要ありません。選択したブランド URL を使用して組織に保存された情報を公開することができます。サイトのページが、会社のブランドの外観と一致するようにできます。サイトは Lightning プラットフォームサーバでホストされているため、データインテグレーションに関する問題はありません。また、サイトがネイティブの Visualforce ページに作成されるため、収集された情報のデータ検証は自動的に実行されます。関連付けたポータルに対し、ユーザが公開サイトからシームレスに登録したりログインしたりできるようにします。

+ [Force.com Sites Terms of Use (and Order Form Addendum)](https://c1.sfdcstatic.com/content/dam/web/en_us/www/documents/legal/Agreements/product-specific-terms/forcedotcom-sites-tou.pdf)

次の例では、サイトを使用できるいくつかの方法について説明します。

+ アイデアサイトを作成 — サイトを使用して、会社、サービス商品に関するアイデアを共有および票決するための公開コミュニティフォーラムをホストします。アイデア Web サイトは、サイトを使用して公開できます。
+ サポート FAQ を公開 — 顧客がそれらの問題のソリューションを検索できる公開 Web サイトに関する情報を提供します。
+ ストアロケータツールを作成 — 顧客がエリア内の添付を検索できる公開ツールをポータルに追加します。
+ 従業員ディレクトリを公開 — IP アドレスで制限されるサイトを作成し、従業員ディレクトリを会社のイントラネットに追加します。
+ 社員募集 Web サイトを作成 — 公開サイトにジョブを投稿して、訪問者がアプリケーションを登録し、オンラインを再開できるようにします。
+ 商品のカタログを公開 — 公開 Web サイトの会社の全商品を、組織から動的に引き出されたモデル番号、現在の価格、商品画像と共に一覧表示します。


+ [Salesforce サイトの使用状況と請求](https://help.salesforce.com/s/articleView?id=sf.sites_limits.htm&type=5)

Salesforce サイトの使用状況は、1 か月および 1 日あたりの割り当てで管理されます。これらの割り当てを理解することが、サイトの成功の鍵となります。

# 関連資料

+ [エクスペリエンスクラウドリソース](https://help.salesforce.com/s/articleView?id=sf.networks_resources.htm&type=5)
+ [コミュニティ、Salesforce サイト (旧 Force.com サイト) におけるゲストユーザの利用について](https://help.salesforce.com/s/articleView?id=000393318&type=1)
GASでSlackの設定管理【Vol.2 チャンネル一覧取得】

# 背景
Slackを全社導入し、増えてくるユーザ。それと、チャンネルも。。。
そうなってくると必然的に管理しないといけないよね。。。
ページングなしで、一覧でアカウントを見れるものないかな〜

ないなら、どうする？ そう！ **作っちゃおう！**

# やったこと
* GAS（GoogleAppScript）でSlackのチャンネルを取得
* チャンネル情報の書き出し

# GAS（GoogleAppScript）でSlackのチャンネルを取得
対象のエンドポイント`/api/conversations.list`
※詳しくは[こちら](https://api.slack.com/methods/conversations.list)

:::note warn 
任意のパラメータについて
* exclude_archived
    * アーカイブ済みのチャンネルを除くか　※デフォルトは`false`
* limit
    * 1度に取得する件数　※デフォルトは`100`
* types 
    * 取得対象を以下の中から設定可能　※デフォルトは`public_channel`
        * public_channel
        * private_channel
        * mpim
        * im
    * 複数の場合は、カンマ区切りで。
:::

```javascript
  const token = "{Slackのトークン}";
  let options = {
    "method": "get",
    "contentType": "application/x-www-form-urlencoded",
    "payload": {
      "token": token,
      "limit": 1000,
      "types": types,
      "cursor": cursor
    }
  }
  let url = 'https://slack.com/api/conversations.list';
  let response = UrlFetchApp.fetch(url, options);
  let jsonResponse = JSON.parse(response);
  console.log(jsonResponse);
```

# チャンネル情報の書き出し
以下の情報がレスポンスとして取得可能
```javascript
    {
            "id": "C012AB3CD",
            "name": "general",
            "is_channel": true,
            "is_group": false,
            "is_im": false,
            "created": 1449252889,
            "creator": "U012A3CDE",
            "is_archived": false,
            "is_general": true,
            "unlinked": 0,
            "name_normalized": "general",
            "is_shared": false,
            "is_ext_shared": false,
            "is_org_shared": false,
            "pending_shared": [],
            "is_pending_ext_shared": false,
            "is_member": true,
            "is_private": false,
            "is_mpim": false,
            "updated": 1678229664302,
            "topic": {
                "value": "Company-wide announcements and work-based matters",
                "creator": "",
                "last_set": 0
            },
            "purpose": {
                "value": "This channel is for team-wide communication and announcements. All team members are in this channel.",
                "creator": "",
                "last_set": 0
            },
            "previous_names": [],
            "num_members": 4
        },
```

# 最後に
GASでめんどくさいを自動化してハッピーライフ✨

# 参考
[GASとは](https://developers.google.com/apps-script)
[Slackのチャンネル一覧取得](https://api.slack.com/methods/conversations.list)
Githubにプッシュしようとするとエラーを吐く問題を解決する

今まではGithubにpushするときにエラーになれば-fオプションをつけてpushしてGithubの方をローカルにすべて合わせるみたいなことしてましたが、そろそろちゃんとした解決策を探ろうと思った。

（本番環境でやるのは怖いので、実験用に`test_repository`というディレクトリをWindowsのデスクトップに作成して実験。）
# 状況
1. ローカルレポジトリを初期化
2. Githubのサイトでレポジトリを作成
3. Githubのサイト上でREADME.MDを編集
4. 以下のコマンド（Githubでレポジトリを新しく作ったときに表示される画面に書いてあるコマンド）を`test_repository`というディレクトリで実行。
```
git remote add origin https://github.com/u-hossy/test_repository.git
git branch -M main
git push -u origin main
```

そうすると、3行目のコマンドを実行した段階で以下のようなエラーが発生する。

```
error: failed to push some refs to 'https://github.com/u-hossy/test_repository.git'
```

またVScodeでpushしようとすると以下のようなエラーとなる。
![](https://storage.googleapis.com/zenn-user-upload/c5aeb6eaae34-20230827.png)


## 3行のコマンドが意味すること
```
git remote add origin https://github.com/u-hossy/test_repository.git
```
リモートレポジトリ名をoriginとして、`test_repository`を登録するコマンド。

```
git branch -M main
```
現在のブランチの名前を`main`に強制的に変更する（-Mオプションによるもの）

```
git push -u origin main
```
これは`origin`というリモートレポジトリの`main`というブランチにpushするということを指示したコマンド。ちなみに`-u`はこのリモートレポジトリのブランチを上流ブランチに設定する（デフォルトに設定するみたいなこと）というコマンドで、これをつけておけば次回からは`git push`だけで実行しても問題ない。

# 原因
ローカルとリモートでそれぞれにバージョンがあること。これらを統合させないと行けない。

# 解決策
```
git pull --allow-unrelated-histories origin main
```
このコマンドを実行する。そうするとコミットとかが普通にできるようになる。

## コマンドの解説
`git pull origin main`はリモート（パソコン上で`origin`と命名してあるレポジトリの`main`というブランチ）から情報をローカルに持ってくるコマンド。これだけだど以下のエラー発生した。
```
From https://github.com/u-hossy/test_repository
 * branch            main       -> FETCH_HEAD
fatal: refusing to merge unrelated histories
```
このエラーはローカルとリモートのブランチが共通していないことにより起こるものなので、`--allow-unrelated-histories`オプションを付け、別々のブランチを統合してあげるとうまくいく。
GASでSlackの設定管理【Vol.1 ユーザ一覧取得】

# 背景
Slackを全社導入し、増えてくるユーザ。
そうなってくると必然的に管理しないといけないよね。。。
ページングなしで、一覧でアカウントを見れるものないかな〜

ないなら、どうする？ そう！ **作っちゃおう！**

# やったこと
* GAS（GoogleAppScript）でSlackのユーザを取得
* ユーザ情報の書き出し

# GAS（GoogleAppScript）でSlackのユーザを取得
対象のエンドポイント`/api/users.list`
※詳しくは[こちら](https://api.slack.com/methods/users.list)

```javascript
  const token = "{Slackのトークン}";
  let options = {
    "method": "get",
    "contentType": "application/x-www-form-urlencoded",
    "payload": {
      "token": token
    }
  }
  const url = 'https://slack.com/api/users.list';
  let response = UrlFetchApp.fetch(url, options);
  let jsonResponse = JSON.parse(response);
  console.log(jsonResponse.members);
```

# ユーザ情報の書き出し
以下の情報がレスポンスとして取得可能
```javascript
        {
            "id": "W012A3CDE",
            "team_id": "T012AB3C4",
            "name": "spengler",
            "deleted": false,
            "color": "9f69e7",
            "real_name": "spengler",
            "tz": "America/Los_Angeles",
            "tz_label": "Pacific Daylight Time",
            "tz_offset": -25200,
            "profile": {
                "avatar_hash": "ge3b51ca72de",
                "status_text": "Print is dead",
                "status_emoji": ":books:",
                "real_name": "Egon Spengler",
                "display_name": "spengler",
                "real_name_normalized": "Egon Spengler",
                "display_name_normalized": "spengler",
                "email": "spengler@ghostbusters.example.com",
                "image_24": "https://.../avatar/e3b51ca72dee4ef87916ae2b9240df50.jpg",
                "image_32": "https://.../avatar/e3b51ca72dee4ef87916ae2b9240df50.jpg",
                "image_48": "https://.../avatar/e3b51ca72dee4ef87916ae2b9240df50.jpg",
                "image_72": "https://.../avatar/e3b51ca72dee4ef87916ae2b9240df50.jpg",
                "image_192": "https://.../avatar/e3b51ca72dee4ef87916ae2b9240df50.jpg",
                "image_512": "https://.../avatar/e3b51ca72dee4ef87916ae2b9240df50.jpg",
                "team": "T012AB3C4"
            },
            "is_admin": true,
            "is_owner": false,
            "is_primary_owner": false,
            "is_restricted": false,
            "is_ultra_restricted": false,
            "is_bot": false,
            "updated": 1502138686,
            "is_app_user": false,
            "has_2fa": false
        },
```
# おまけ
* Slackのユーザって論理削除だとレスポンスを見て初めてしった。
* real_nameとユーザIDを一覧管理しておくと何かと便利
    * GASでメッセージ送る時のメンション作成はユーザIDが必要
    * チャンネルに一気にユーザを追加するとき、real_nameの列をコピペすれば一発

# 最後に
GASでめんどくさいを自動化してハッピーライフ✨

# 参考
[GASとは](https://developers.google.com/apps-script)
[Slackのユーザ一覧取得](https://api.slack.com/methods/users.list)
LAMP環境: Linux、Apache、MySQL、PHPを活用したウェブ開発の基礎

# LAMP環境: Linux、Apache、MySQL、PHPを活用したウェブ開発の基礎

## 概要

LAMP環境は、ウェブアプリケーションの開発とホスティングに使用される非常に人気のあるテクノロジースタックです。この記事では、LAMP環境の各コンポーネント（Linux、Apache、MySQL、PHP）について詳細に説明し、それらを使用してウェブアプリケーションを開発するための基本的なステップを紹介します。

## LAMP環境とは？

LAMPはLinux、Apache、MySQL、PHPの頭文字を取ったもので、これらの要素を組み合わせてウェブアプリケーションを開発および実行するための完璧な組み合わせです。それぞれのコンポーネントの役割について詳しく見ていきましょう。

### 1. Linux (L)

Linuxはオープンソースのオペレーティングシステムで、安定性、セキュリティ、カスタマイズ性に優れています。ウェブサーバーとしてLinuxを選ぶことで、高い信頼性と柔軟性を得ることができます。一般的なLinuxディストリビューションにはUbuntu、CentOS、Debianなどがあります。

### 2. Apache (A)

Apacheは、LAMP環境のウェブサーバーコンポーネントです。HTTPリクエストを受け取り、ウェブサイトやアプリケーションのコンテンツをブラウザに送信します。Apacheは高度なカスタマイズが可能で、多くのモジュールをサポートしています。

### 3. MySQL (またはMariaDB) (M)

MySQLはリレーショナルデータベース管理システム（RDBMS）で、データの永続的な保存と取得を可能にします。MariaDBはMySQLの互換性のある代替データベースシステムで、選択肢の一つです。これらのデータベースシステムを使用することで、アプリケーションのデータを効率的に管理できます。

### 4. PHP (またはPerlまたはPython) (P)

PHPはサーバーサイドのスクリプト言語で、ウェブアプリケーションのロジックを実行し、データベースとの相互作用を可能にします。PHPは広く使用されており、ウェブ開発者にとって非常に人気があります。しかし、必要に応じてPerlやPythonなどの他のプログラミング言語も選択できます。

## LAMP環境を使用したウェブアプリケーション開発の基本ステップ

1. **Linuxのセットアップ**: 適切なLinuxディストリビューションを選び、サーバーをセットアップします。SSHを使用してリモートアクセスできるように構成します。

2. **Apacheのインストールと設定**: Apacheウェブサーバーをインストールし、設定ファイルをカスタマイズしてウェブサイトのルートディレクトリやバーチャルホストを設定します。

3. **MySQLまたはMariaDBのインストールとデータベースの設計**: データベースをインストールし、必要なデータベースとテーブルを設計します。ユーザーアカウントやアクセス権限も適切に設定します。

4. **PHPの開発**: ウェブアプリケーションのロジックをPHPで開発します。この際、MySQLとの連携を考慮してデータベースクエリを実装します。

5. **ウェブアプリケーションのテスト**: 開発したアプリケーションをテストし、バグを修正します。

6. **ウェブアプリケーションのデプロイ**: アプリケーションを本番環境にデプロイし、ウェブサーバーとデータベースを接続します。

7. **セキュリティの強化**: セキュリティ対策を施し、データベースへの不正アクセスやウェブアプリケーションの脆弱性を防ぎます。

8. **監視とメンテナンス**: サーバーとアプリケーションの監視を設定し、定期的なメンテナンスを実施して運用を維持します。

これらの基本ステップを踏むことで、LAMP環境を使用したウェブアプリケーションの開発と運用が可能となります。LAMPはオープンソースのテクノロジースタックであるため、コミュニティからのサポートも豊富であり、広範なリソースが利用可能です。ウェブ開発者として、LAMP環境を理解し活用することは非常に役立つスキルです。

次回は、詳しい構築方法などを説明していこうと思います。
パッチングについての返歌

こちらの記事[『Linuxを再起動することなくカーネルにパッチを当てる「ライブパッチ」の技術的な仕組みと、その種類とは［PR］』](https://www.publickey1.jp/blog/23/linuxpr_2.html)がとても面白かったのですが、疑問があったので少し調べてみました。

この記事はPRではありません。また、問題がありましたら削除するので遠慮なくおっしゃってください。

# TL;DR

- 起動したままのLinuxにセキュリティパッチを当てる方法として、「テンポラリパッチング」と「パーシステントパッチング」がある
- テンポラリパッチングは、セキュリティパッチを迅速に当てられるが、どうしても内部メモリがごちゃごちゃしてきてしまうので、しばらくしたら再起動が必要
- パーシステントパッチングは、いくつかのアップデートをまとめたライブパッチであり、セキュリティ的にテンポラリパッチングには劣るが、再起動の頻度が圧倒的に下がる

# まずは記事のおさらい

普通に記事を読んでいただきたいのですが、Linuxのライブパッチに関する責任を負ってくれる会社のPR記事です。
ライブパッチというのは、Linuxのアップデートの際に再起動を必要としないパッチ当ての技術のことです。
これ以上の情報は、記事に委ねます。

技術的に細かいLinuxの知識が必要ですし、会社が普通の開発に力を注ぐためには、アップデートは専門家に任せた方がいいと感じました。

# テンポラリパッチングについて

サーバ稼働しているサービスは、あまりダウンタイムを作りたくないですよね。そこで、「内容をメモリに読み込んで」「見る番地を切り変えて」「パッチを瞬時に適用して」「永続的な環境にパッチの内容を書き込む」という方法で、再起動させずにパッチを適用させます（と理解しましたが、、）

こちらやべーセキュリティパッチを再起動なしで当てられる方法です。ですが、こういうことを繰り返しているとどんなサーバでもメモリがごっちゃになってしまいます。なので、何かのタイミングで再起動が必要です。

# パーシステントパッチングについて

やべーセキュリティパッチはすぐに当てないといけないですが、そこそこのアップデートをまとめて適用することで、メモリをあんまりごちゃごちゃさせずとも、稼働させながらパッチをあてることができます。滅多に再起動させなくてもよくなります。

# モチベーション

PR記事は「パーシステントパッチング最高！！」という記事でしたが、テンポラリパッチングはどうして存在しているんだろう？と気になったので、調べてみました。

# おわりに

やべーセキュリティリスクに晒されているサーバはあります。こちら、そのへんの兼ね合いでどちらのパッチングを採用するかみたらいいと思います。
サービスとしては、ダウンタイム、メンテナンスは少ないに越したことはないです。あと、安全性も見ていったらいいかなと思います。今、誰も悪くないコンピュータのトラブルにおける、ユーザのお気持ちが辛いことありますから。。。
【Salesforce】ページレイアウトに表示している「添付ファイル」が使用できない

# 問題

ページレイアウトの関連リストに表示している「添付ファイル」が使用できない。

# 解決策

「添付ファイル」ではなく「ファイル」を使用する。

＜ヘルプ＞
「添付ファイル」関連リストは従来の Saleaforce Classic機能。
Lightning Experience では不可。

# 参考リンク

[[メモ＆添付ファイル] 関連リストの [新規メモ] および [ファイルをアップロード] ボタンに関する変更
](https://help.salesforce.com/s/articleView?id=000385730&type=1)
【Salesforce】グローバルアクションの新規行動、新規TODOを作成時、ファイルを添付したい

# 問題

グローバルアクションの新規行動、新規TODOを作成時、ファイルを添付したい。

# 解決策

無い。
Classicだったら対応できるがLightningでは無い。

＜ヘルプ＞
行動または ToDo の作成時に行動または ToDo に添付ファイルを追加
Lightning Experience では、行動または ToDo に添付ファイルを追加する前に、それらを作成して保存する必要があります。
Salesforce Classic では、行動または ToDo を作成している間に添付ファイルを追加できます。

# 参考リンク

[▼生産性機能: Lightning Experience で使用できない機能とその新機能](https://help.salesforce.com/s/articleView?id=sf.lex_gaps_limitations_productivity.htm&type=5)
【Salesforce】ToDoオブジェクトでChatterを表示したい

# 問題

行動オブジェクトのLightning レコードページでは「Chatter」コンポーネントが表示されているのに、ToDoオブジェクトのLightning レコードページでは「Chatter」コンポーネントが表示されない。

# 解決策

設定
↓
フィード追跡
↓
TODOオブジェクトの「フィード追跡の有効化」

で表示可能。
【IBM Security Verify】 強化されたパスワードポリシーについて

# はじめに
IBM Security Verifyの2023年8月の新機能で、パスワードポリシーが強化されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/9b319017-8d2d-4d4f-55ce-bbbe8a5cbea3.png)


# 1.拡張されたパスワードポリシーについて

パスワードポリシーに含まれる、パスワード・ストレングスの設定が追加されました。
- 英字の大文字/小文字の最小数の指定可能。
- 数字、特殊文字の最小数をそれぞれ指定可能
- 連続する反復文字の制限を指定可能

# 2.設定例
パスワード長14桁、英字の大文字/小文字、数字、特殊文字を含み、連続する反復文字の利用を制限する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/b4be7ef8-58f0-5561-e1a7-51e08f59101f.png)

パスワード変更画面に表示されるパスワードルール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/e153c9cd-aa85-f918-4c13-cc342e4eb74f.png)

```
パスワードの最小長は 14 文字です。
パスワードには 2 文字以上の英字を含める必要があります。
パスワードには 2 文字以上の数字および特殊文字を含める必要があります。
パスワードには、連続して繰り返される同じ文字の 1 個を超えるインスタンスを含めることはできません。
パスワードには、少なくとも 1 個の小文字 (a..z) を含める必要があります。
パスワードには、少なくとも 1 個の大文字 (A..Z) を含める必要があります。
パスワードには、少なくとも 1 個の数字 (0..9) を含める必要があります。
パスワードには、少なくとも 1 個の特殊文字を含める必要があります。 特殊文字は、アルファベットの大文字または小文字ではなく、数字でもありません。
```

# 最後に
2023年8月新機能の1つであるパスワード機能拡張についてご紹介させて頂きました。

# 参考
- https://www.ibm.com/docs/ja/security-verify?topic=overview-whats-new
- https://www.ibm.com/docs/ja/security-verify?topic=passwords-managing-password-policies
Core plot

Core Plotを使用してXcodeのStoryboardでUNIX時刻と温度のグラフを描画する方法について、詳細な手順を説明します。

1. **CocoaPodsを使用してCore Plotをインストール**：

   まず、CocoaPodsを使用してCore Plotライブラリをプロジェクトにインストールします。プロジェクトのルートディレクトリで`Podfile`という名前のファイルを作成または編集し、以下の行を追加します：

   ```ruby
   pod 'CorePlot'
   ```

   ターミナルでプロジェクトのディレクトリに移動し、次のコマンドを実行してライブラリをインストールします：

   ```bash
   pod install
   ```

2. **StoryboardでCPTGraphHostingViewを配置**：

   Storyboard上にUIView（CPTGraphHostingView）を配置します。このUIViewは、Core Plotのグラフを描画するためのコンテナとして使用します。UIViewのサイズと配置を調整します。

3. **ViewControllerにCore Plotを追加**：

   今度は、ViewControllerにCore Plotを統合します。ViewControllerのSwiftファイルを開き、Core Plotをインポートします：

   ```swift
   import CorePlot
   ```

4. **UIViewとグラフの関連付け**：

   Storyboard上のCPTGraphHostingViewをViewControllerに関連付けます。IBOutletを使用して接続し、グラフを描画するためのプロパティとして指定します。例えば：

   ```swift
   @IBOutlet weak var graphView: CPTGraphHostingView!
   ```

5. **データの準備**：

   UNIX時刻と温度のデータを取得または準備します。データは日付情報を含む必要があります。このデータをグラフに表示するためのデータポイントとして使用します。

6. **グラフの描画**：

   グラフを描画するために、以下のコードを追加します：

   ```swift
   // グラフを作成
   let graph = CPTXYGraph(frame: CGRect.zero)

   // プロットスペースを作成
   let plotSpace = graph.defaultPlotSpace as? CPTXYPlotSpace

   // データソースを設定
   let dataSource = YourCorePlotDataSource(dataPoints: dataPoints) // YourCorePlotDataSourceは後で作成します
   graph.addPlot(dataSource)

   // グラフをホスティングビューに設定
   graphView.hostedGraph = graph
   ```

   ここで、`dataPoints`はデータポイントの配列で、各データポイントはUNIX時刻と温度を含みます。

7. **データソースの作成**：

   Core Plotにデータを提供するために、カスタムデータソースを作成します。このデータソースは`CPTPlotDataSource`プロトコルを実装します。具体的な実装は次の通りです：

   ```swift
   class YourCorePlotDataSource: NSObject, CPTPlotDataSource {
       var dataPoints: [(x: Double, y: Double)]

       init(dataPoints: [(x: Double, y: Double)]) {
           self.dataPoints = dataPoints
       }

       func numberOfRecords(for plot: CPTPlot) -> UInt {
           return UInt(dataPoints.count)
       }

       func number(for plot: CPTPlot, field fieldEnum: UInt, record idx: UInt) -> Any? {
           let dataPoint = dataPoints[Int(idx)]
           if fieldEnum == UInt(CPTScatterPlotField.X.rawValue) {
               return dataPoint.x as NSNumber
           } else {
               return dataPoint.y as NSNumber
           }
       }
   }
   ```

   これで、データポイントを提供し、プロットをカスタマイズする準備が整いました。

これらの手順に従うと、Core Plotを使用してUNIX時刻と温度のグラフを描画し、日付がわかるように表示できます。 Core Plotの詳細なカスタマイズについては、Core Plotの公式ドキュメンテーションやサンプルコードを参照してください。
Customize the User Interface for a Travel Approval App


+ [Customize the User Interface for a Travel Approval App](https://trailhead.salesforce.com/content/learn/projects/customize-the-user-interface-for-a-travel-approval-app)

# Create and Customize a List View

+ [In the Open Out of State Travel Requests list view, we can't find a filter that excludes travel requests with 'Status' either 'Approved' or 'Rejected'.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007H8HmH)

:::note
Made changes in API name now it's working.

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

+ [Step not yet complete in Travel Approval App](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007H8HmH)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4e653832-0952-ec02-68a8-ba52c982c8f3.png)


:::note
Found the error, the Status field API name was a mismatch. After fixing this I was able to complete the challenge. 
:::
Laravelで、リレーション先のテーブルの条件で検索する

## Laravelで、リレーション先のテーブルの条件で検索するには、大きく分けて2パターンある。
①クエリビルダを使う
②Eloquentを使う

クエリビルダを使う方法は、直感的にわかりやすいが、joinを使ってテーブルを結合してから検索文を書くので、コードが冗長になるので、ここではEloquentを使った書き方のみ書く。

## EloquentのwhereHas()を使って、リレーション先で条件検索
```index.php
$query = Article::query();
$penname = $request->penname;
$query->with(['profile'])->whereHas('profile', function ($q) use ($penname) {
   $q->where('profiles.penname', 'like', '%' . $penname. '%');
});
```

第一引数にリレーションメソッド名を書き、第二引数にコールバック関数を書く。
コールバック関数内で、条件検索文を書く。

with()は、リレーション先を明示するために必要。
DevOps Center　プロモーション


+ [Devops センター - ステージングから本番へのプロモーション](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Jg4C1SAJ)

Devops センターの研究では、本番環境として開発者組織を使用し、各状態のパイプラインに多数のスクラッチ組織を使用しました。残念ながら、スクラッチ組織の定義には、開発者組織 (別名本番) にはない機能が含まれていました。したがって、作業項目はステージングに向けてプロモートされ、正常に実行されますが、運用環境にない機能によるメタデータの欠落により、本番へのステージングは​​失敗します。

これで別のパイプラインを作成できるようになりましたが、すべてをプロモート解除して git リポジトリをクリーンな状態に戻し、運用環境に存在しない機能を含まないこの状態から新しいパイプラインを開始したい場合はどうすればよいでしょうか?

DevOps Center で昇格を解除することはできません。また、プロモートをやり直して、プロモートしたくないものを削除することもできません。

変更を促進するには、新しい作業項目を作成する必要があります。あなたの場合、新しいスクラッチ組織構成ファイルがプッシュされ、問題が解決されます。

+ [プロモーションの停止: 手動で上書きしますか?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007DuDoe)

Github リポジトリは正常にマージされましたが、ターゲット環境へのデプロイメントは失敗しました。便宜上、最終的には変更セットを使用してコンポーネントをデプロイしました。基本的にすべてがデプロイされているため（つまり、作業ブランチがメイントランクとマージされ、すべてのコンポーネントがターゲット環境にインストールされている）、正しいステータスを反映するために作業項目を「ステージング」列から「実稼働」列に単純に移動する方法はありますか？さまざまなカスタム オブジェクト (つまり、作業項目、作業項目のプロモート、展開結果、非同期操作結果) を調べたり、さまざまなカスタム フィールド (つまり、完全展開、操作) を更新しようとしましたが、うまくいきませんでした。

停滞しているプロモーション
https://help.salesforce.com/s/articleView?id=sf.devops_center_promotion_stalled.htm&type=5

+ [ReportType failed to deploy due to Cannot modify managed object: entity=CrtLayoutSection, component=null, state=MANAGED_INSTALLED - sections](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007F5vl3)

作業項目をパイプラインの最初のステージにプロモートすると、次のエラーが発生します。

試行錯誤の結果、DevOps Center でのプロモーションおよびプル操作で特定の個別のメタデータ ファイルを無視するための .forceignore ファイルの構文を理解することができました。

プロモーション/デプロイ中にファイルを無視するには、私の成功した構文は **/reportTypes/npo02__Households_and_Donations.reportType-meta.xml でした。

DevOps センターの作業項目内でプル操作中にファイルを無視するには、成功した構文は次のとおりです。 

*.reportType/npo02__Households_and_Donations.reportType-meta.xml

DevOps Center から .forceignore ファイルを更新でき、無視するメタデータ ファイルをリストから選択できると便利です。
Journey Builderのまとめ

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)



+ [SF Data entry source journey builder FAILURE](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PeTe7)
+ [SFMCのジャーニービルダーで未送信の原因の調べ方](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007F51piSAB)
+ [【未解決】SF Data entry source journey builder FAILURE](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PeTe7)

+ [api to delete marketing cloud journeys](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007W6X9E)

:::note
Deletes a journey by ID or key. When deleting last version of a journey, check if the journey is associated with a tag and unassociated the tag using the deleteTags resource.

https://developer.salesforce.com/docs/marketing/marketing-cloud/guide/deleteInteractionById.html
:::
TypeScriptが難しいと感じたので、改めて整理してみた！

# TypeScriptは、難しくない？
私は、フロントエンドエンジニアを目指すものです。
今まで、JavaScriptを中心に学習しており、ReactやNextについても現在開発を進めています。
その中で、「エラーが発生することなく動作すること」を目標として実装してきたTypeScriptですが、やはり根本的な理解のレベルを上げることが、開発スピードやクオリティを上げるために必要だと考え、改めて調べてみました。
とはいえ、自分の中では以前のレベルより「一段階」上がったと感じたので、自分のためにも、同じような境遇の方にもまとめることにしました。
※とはいえ、まだ十分に理解しきっている状態ではないため、誤った解釈などございましたら、ご指摘いただけますと幸いです。

## 大枠を捉えてみた！
参考にさせていただきました記事はこちら↓

https://reffect.co.jp/react/react-typescript-event/#button%E8%A6%81%E7%B4%A0%E3%81%8B%E3%82%89%E3%81%AE%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88

あとは、ChatGPTさんにもご協力いただき、私なりの解釈でまとめていきます。

### 目的と対象
|No| 名称 | 対象 | 代表的なキーワード | 
|:-:|:-|:-:|:-:|
|1|変数の宣言時に型指定する  | 変数  |  ` :number ` `:string` | 
|2|関数のパラメータと戻り値に型指定する |  戻り値 |  ` :number ` ` :string `|   |
|3|インターフェースや型エイリアスを使用する  |  オブジェクト |  `<>` `as` |   
|4|ジェネリクスを使用する  |  特定の型に依存しない関数・クラス | `<T>`  | 
|5|型ガードを使用する  | 関数内  | `typeof` `instansof`  | 
|6|非null/undefinedアサーションを使用する  |  `null`や`undefind` |  `!` | 

### 具体的なコード例
自分なりに使いそうなシーンのコード例を記載してみます。

```typescript:1. 変数の宣言時に型指定をする
// 数値型の変数
let age: number = 30;

// 文字列型の変数
let name: string = "John";

// 配列型の変数
let numbers: number[] = [1, 2, 3];

// オブジェクト型の変数
let person: { name: string, age: number } = { name: "Alice", age: 25 };
```


```typescript:2. 関数のパラメータと戻り値に型指定する
//引数にも型指定ができる
//引数の()の後が戻り値に対する型指定になる
function add(x: number, y: number): number {
    return x + y;
}
```
```typescript:3. インターフェースや型エイリアスを使用する
//interfaceで宣言
interface Person {
    name: string;
    age: number;
}

//typeで宣言
type Point = {
    x: number;
    y: number;
};

let person: Person = { name: "Bob", age: 28 };
let point: Point = { x: 10, y: 20 };

```

```typescript:4. ジェネリクスを使用する
function identity<T>(arg: T): T {
    return arg;
}

let result: string = identity("Hello, TypeScript!");
let value: number = identity(42);
```

```typescript:5. 型ガードを使用する
//typeof
function isString(value: any): value is string {
    return typeof value === "string";
}

function processValue(value: any) {
    if (isString(value)) {
        // valueはstring型に絞り込まれた
        console.log(value.length);
    } else {
        console.log("Not a string");
    }
}

//in
interface Tweet {
  likedCount: number
}
interface User {
  name: string
}

const getData = (input: Tweet | User) => {
  if ('likedCount' in input) {
    return `いいね数: ${input.likedCount}`
  } else {
    return `ユーザー名: ${input.name}`
  }
}

const tweet: Tweet = {
  likedCount: 100
}
console.log(getData(tweet))
// 'いいね数: 100'

const user: User = {
  name: 'Taro'
}
console.log(getData(user))
// 'ユーザー名: Taro'
```


```typescript:6. 非null/undefinedアサーションを使用する
//変数がnullまたはundefinedではないことを確認するために使用する

let value: string | null = getNullableValue();
let length: number = value!.length; // 非null/undefinedアサーションを使用
```

## まとめ
私は、上記の記事やソースコードにより、以前よりすこ〜しだけ理解が深まったと感じています。
まだまだ知識を深めている最中ですので、本や教材のようにわかりやすくなかったかもしれませんが、私の知識向上とともに更新していきたいと思っております。

38歳でフロントエンジニアを目指す私としては、まだまだ険しい道のりになりそうですが、必ずものにしてみせたいと情熱を燃やしております！
ChatGPTによって描かれる未来とAI開発の変遷

## はじめに
最近(少し前から)話題を聞くようになった「ChatGPT」。
それがどういったものなのか、どうすればうまく使えるのかを整理したく、表題の講演の視聴にあたった。

## 講演
『ChatGPTによって描かれる未来とAI開発の変遷』日本マイクロソフト株式会社　蒲生 弘郷氏（2023年4月21日）
日本MicrosoftによるChatGPTに関する講演。YouTubeで公開されており、無料で視聴できる。

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

## 概要

講演の概要を以下に記す。


### GPTとは
学習データ、プロンプト、文脈を用いて次に現れる単語の確立分布を生成(予測)する。
(例)天下統一を果たした織田...
　　→ 「信長」「信忠」などという単語が続くだろうと予測
　　　 最も確率が高いと判断した「信長」を出力する


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1282600/2169589c-75a1-2f65-5977-174c78922c42.png)

GPTを用いたサービスはすでに多く存在している。有名なものでは「ChatGPT」。高度なチャット応答を実現している。
Microsoftの製品でもどんどんGPTの導入を進めている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1282600/3472d873-5869-595a-3313-85c4d046feb4.png)


### GPTは嘘をつくのか
嘘をつくというのは不正確。
「十分な学習データや参考情報を与えなければ、正確な回答ができない」というのが正しい表現。

「嘘をつく」というイメージはChatGPTが応答する奇怪な文章からだろうが、それは学習データの中に情報がないからである。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1282600/ed79811a-62a6-6e93-15ce-c309bc5cd327.png)

### 過去問を利用
利用といってもひたすら過去問を解くだけ。基本情報技術者は過去問に類似、もしくは同じ問題が出題されることも多いため、合格を目指すのであれば過去問を解くのが最も効果のある勉強方法であるように感じる。

https://www.fe-siken.com/fekakomon.php

### プロンプトのコツ
GPTから良い回答を得るためには質の高いプロンプトが必要であるという。
ではどのようにすれば良いプロンプトが組めるのか。

##### Prompt Processing
漠然としたプロンプトだと、回答も漠然としたものとなる。より具体的に状況を提示すれば、より精度の高い回答が得られる。
そのため、ユーザーから具体的な情報を受けるためのアイディアを組み込む必要がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1282600/338b0873-64b8-c81c-6f3f-d8002042f6f0.png)

##### Few-shot Learning
プロンプト例や解答例をあらかじめ提示することでよい回答が返ってくる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1282600/b99ce96f-112a-d3f5-0814-c531c81b3532.png)

##### Chain of Thought
「段階的に記述して」と指示するで精度があがる。
人と同じで、段階的に考えさせることで順序だてて推論するようになる性質がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1282600/0f3165c9-8af2-7aae-41c9-430683607a4a.png)


##### Self Consisterncy
「仮説を３つ列挙してから」などと加えることで回答の制度が高くなる。
Chain of Thoughtと同じ原理で、上げた仮説が自らの推論の材料となるため。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1282600/59bb3217-01bc-76cd-b6b1-51feff1e9b02.png)


##### Recursively Criticizes and improves
GPTにGPT自身の出力を吟味させ、修正を繰り返させる。
特にコード生成などで有効な手法。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1282600/08f31d48-5017-de68-1e0b-90597fdfc753.png)


### GPTで描かれる未来
GPTの浸透はステップを踏みながら徐々にサービスを進化させていく。

0：高度な文章生成
1：ソース提示だけでなく、情報収集して回答
2：自然言語によってコンピュータと対話可能に
3：目的を示すだけで、勝手に達成

将来的に、GPTが人間とコミュニケーションを取りながら、あらゆるサービスと繋がり、自分で思考し目標を達成するように。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1282600/f735ed66-5c92-db35-b6b9-4106a6da4c96.png)

### 所感
ChatGPTの流行を受けてどのようなものなのかについて学んだ。
そもそも基盤となっているGPTという技術があり、それはどのように活用していくべきかについてを知ることができた。
今後、ChatGPTを使用したり、言語モデルを利用する場合には、今回の講演の内容は非常に参考になるものであると感じる。

また、AIの使用には人間側からの指示が大切なものとなる。AIがすべての作業を担当できるようになるのではなく人間とAIの共存する未来を描くことが大事であり、その共存の仕方を考えていく必要があると感じた。
【海外イベント紹介】Quantifying the Value of Modern Web Development

Netlifyのプロダクト・マネージャーMike Chirokas氏が、Jamstackを採用することのメリットを数値化し、その検証結果をオンデマンドセッションで語ってくれました。

今回はその内容をご紹介します:loudspeaker:
>**目次**
モダンなWeb開発
生産性とパフォーマンス
サイト開発の日数：90％削減
開発者の工数：20％削減
サイト訪問者数：10%増加
コンバージョン率：8%増加
コスト削減
スピーディーなサイト移行
まとめ

## モダンなWeb開発
Jamstack開発した場合に得られるメリットは、主に2つあります。

・開発のスピードが速い
・サイトのスピード速い

しかも、その速さには安定性があります。安定した速さからは、余剰の時間が生まれます。会社や顧客にとって、ひいては会社スタッフの家族にとっても良いことと言えるでしょう。

たとえば、Drupalのアップデートについて心配しながらプライベートな時間を過ごす必要もないのです。

## 生産性とパフォーマンス
Netlifyを使用したJamstack開発と、従来型の開発。
生産性とパフォーマンスを数値化したデータを見比べてみましょう。

Fortune 100に名を連ねる、ある企業に調査協力してもらいました。
毎年50ものWebサイトを立ち上げている企業です。

## サイト開発の日数：90％削減
従来型のNetlifyを使用しない方法では22日間に渡るプロセスが必要でした。
しかし、Netlifyを使用するようになってから、これがわずか2日に削減されました。
開発用サーバー・検証用の仕組みを作らなくて良いこと、開発者がリモートで働けることなどの要素が関係しています。

## 開発者の工数：20％削減

なぜ工数が削減されるのでしょうか。

1. 開発者間のコラボレーションがスムーズ
WordPressでは、設定に小細工をする必要があったり、開発者ごとに環境を用意するのにも時間がかります。
Netlifyでは同じステージング環境が使えるため、だれかが加えた変更が開発者間ですぐに確認することができます。

2. 誰でもパブリッシュできる
Netlifyでは、コンテンツ製作者やマーケティング担当者が自分でヘッドレスCMSに記事を投稿することができ、直ちに反映されます。

3. DevOpsチームが要らない
従来型のシステムでは、「エラーが発生した」「動きが遅い」といった場合に対応するDevOpsチームを必要とします。
Netlifyではそうしたチームが不要です。

## サイト訪問者数：10%増加

Googleの各種ツールには「ページ・エクスペリエンス」という指標があります。Webサイトの訪問者がインタラクトする際の快適さを表すものです。
この指標に基づいて、Netlifyの顧客サイトを調べてみました。

すると・・・

Core Web Vitalsやモバイル対応など、Googleの指標が大幅に改善。
下の図の棒グラフは、Netlifyを使用しているサイトの実績です。
![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1242415/20a5ec28-80b3-0c3a-dcc1-f96fc349e9fa.png)

Lighthouseのスコアが、**モバイルでは63、デスクトップでは35**ほどアップしています。
このことが、サイトの訪問者数の増加に繋がっていることがわかります。

## コンバージョン率：8%増加
![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1242415/2e9b5d79-d497-fcf8-a9a9-237d5d139aa4.png)

上の図を見てください。
4週間に渡り、37のサイトから3000万セッションのデータを分析したものです。
結果、リテール分野のサイトでは8.4%、旅行関係のサイトでは10.1%のコンバージョン率の増加が確認できました。

また、パンマクミラン社のサイトでは、従来の仕組みからのデカップリングを実現することで、コンバージョン率が25％も増加しました。
さらに、ゼンハイザー社のサイトに至っては、137％ものコンバージョン率増加を達成しています。

もちろん、デザインのアップデートなど別の要因も加味してのことですが、それでもこれは見逃せない数字です。

## コスト削減
コストに関しても削減できる実例をご紹介します。
パンマクミラン社では、Netlifyに移行することでAzureに使っていたコストを半減することができました。

様々な技術者を雇うのではなく、JavaScriptの開発者だけで用が足りるのもポイントです。
システムのアップグレードに必要なコストを40％程度までは削減できる見込みです。

## スピーディーなサイト移行
![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1242415/b3d28795-06b2-17ed-8f32-afebeb8a85a9.png)

上の図は、ゼンハイザー社のサイト移行スケジュールです。
かなり大型の複雑な仕組みにも関わらず、わずか**11週間で移行**。
Jamstackの優位性をはっきりと示しています。

## まとめ
今回のセッションでは、具体的な根拠のある数字を挙げて、モダンなWeb開発手法のアドバンテージが紹介されていました。

割と漠然と語られることの多いJamstackの優位性ですが、具体的に示すことができる根拠として役立つのではないでしょうか。

コンバージョン率やサイト訪問者数などの指標は10％程度と、驚くほどの増加率ではありません、かえって信頼性の高い現実的な率であると感じます。

サイトが速くロードされるようにしたり、モバイルに対応したりするだけで、1割程度は確実に改善できることがわかる、心強いデータです。

改めて、Jamstackの優位性をはっきりと示すセッションでした！

最後まで読んでくださり、ありがとうございました:bow_tone1:

株式会社ヒューマンサイエンスは、他社にはない、「ドキュメント制作のノウハウ」×「最新のWeb開発技術（Jamstack）」を用いて、Webコンテンツとプラットフォームのソリューションをご提供します。

関心がある方は、ぜひこちらまでお問い合わせください！
株式会社ヒューマンサイエンス
https://www.science.co.jp/document/jamstack.html

本文書の出典元：https://www.youtube.com/watch?v=BXNIhwwiYa0&t=456