OmniAICreator/Qiita-1.07M huggingface dataset:
「私の」今の会社でのキャリアパス

## はじめに
これは「私の」キャリアパスです。
どうすれば**今の会社で**より評価され、給料を上げられるかを考えました。

なのでシンデレラストーリーのように短期間で年収1000万円超え！とかそういうものではありません。
※もちろん私に特別すごい才能がある訳でもないです。

ほとんどの人には参考にならないかもしれないですが、良かったら見てください…！

## 私について
新卒入社で入り、ずっとSEをしております。今年7年目です。
基本的には開発がメインで、その他には開発したサービスの販促活動などを行っています。

## 会社について
従業員数：かなり多い
平均年齢：45歳

自分で言うのも変ですが、いわゆる大きい企業に就職しています。
年齢層がやや高めなこともあり、入社9年目くらいまでは若手と呼ばれます。（少し恥ずかしい…）

また会社の評価基準は以下の5つから成り立ちます。
1. 年次
2. 個人業績
3. 高度資格を有していること
4. 大規模な案件にPM/PLとして携わり、成功に収めていること
5. 定期的に発信活動を行っていること

基本的には年次が上がれば勝手に給料も上がりますが、
**若くして評価されたいとなると2～5の項目を頑張る**必要があります。

## どうすれば会社で評価されるか？
ここからが本題です。

### 現状の課題
自分の率直な意見を言うと、
**今のままでは周りの方と比べてあまり評価されない**のではないかと思っています。

といいますのも、私の部署では「**年次が高い方がPM/PLを行い、若手が開発を行う**」という傾向にあり、
現状、大きい案件をメイン担当で任せられることが滅多にないからです。

また、そもそも大きい案件が私の部署に回ってくることが少なく、**大規模案件でのメイン担当の取り合い**になってしまう状況もネックです。

もちろん経験のある方がマネジメントを行い、経験の浅いSEが開発やテストなどを行うのはプロジェクトの進め方としてはごく自然で当たり前なことですが、
このままだと評価項目の「4. 大規模な案件にPM/PLとして携わり、成功に収めていること」を達成するのにあまりにも時間がかかってしまいます。

### 自分の長所

若手の私が年次が高い方と比べて評価されるべき点もあります。
それは「**資格**」と「**発信活動**」です。

私の部署では目標として「**半期に1つ資格を取る**」ことが掲げられていて、
私は必ず毎期資格取得してきました。

というのも勉強自体は嫌いではないですし、当時は家庭も持っていなかったので、
何かしら**毎日1時間は試験勉強**を行っていました。
その結果、入社4,5年目で「応用情報」や「データベーススペシャリスト」に合格することが出来ました。

逆に**年次が高い方は家庭などの理由で自由時間が少なく**資格取得は行っていませんでした。
また発信活動についても同じ理由で、私の方が行えています。
※あくまで私の部署内の話で、年次が高い方でも研鑽を行っているSEは世の中に大勢います。

### 今後の方針
上記の内容を評価項目に照らし合わせると、このような結果になりました。

1. 年次　→　×
2. 個人業績　→　△（同期では良いが年次が高い方と比べると低い）
3. 高度資格を有していること　→　〇
4. 大規模な案件にPM/PLとして携わり、成功に収めていること　→　×
5. 定期的に発信活動を行っていること　→　〇

今のところ**2勝2敗1分け**ですね。（勝率とは？って感じですね）

評価を上げるには負け数を少なくしたいです。
年次はどうしようもないので「**大規模案件でのPM/PL**」を「**勝ち**」にする方法を考えていきます。

## 大規模案件でのPM/PLを獲得する方法
年次が高い方を押しのけて、PM/PLになるには「**実績作り**」「**専門性**」「**肩書**」の3つが重要になってくると思います。

### 実績作り
まずは「実績作り」です。PM/PLの経験が少ないことには呼ばれません。
今までは開発メインでしたが、PM/PLもできるように二刀流になります。
※ビジネス用語で言うと、π型人材に当てはまりますかね。

ただ「初心者からのスタート」だとは思っていません。
今まで開発メンバーとしてPMの仕事を見ていましたし、**開発者ならではの目線でお客様にプラスαの提案**が出来るはずです。
なので小・中規模の案件にはどんどん参画して経験を積み、プロジェクトを成功させていきたいです。

### 専門性
例えば、スマホアプリ開発の案件があった際にPM/PLとして抜擢されやすいのは、「過去にスマホアプリ開発案件に携わっていた人」なはずです。
こういう風に**自分の経験や強みを生かしてプロジェクトに参画**できるように、試したことのない技術の検証や習得は日頃から行っていきたいです。

また当たり前ではありますが、プロジェクトはネットワークやDB、アプリ開発など**様々な要素から構成されている**ため、PM/PLを行う立場として「**自分が得意なことを伸ばす**」だけでなく「**自分が出来ることを増やす（オールラウンダーになる）**」ように足りない技術を吸収していきたいです。

### 肩書
「実績」でも肩書は付きますが、もう一つ「資格」でも肩書を付けられると考えています。

なぜなら**PM/PL初心者でもIPAの「プロジェクトマネージャ」試験に合格**さえしてしまえば、客観的に見ると「**高度IT人材**」に位置付けられるようになるからです。

先述の通り、私の部署では資格取得に前向きな方は少ないので、ここが差をつけるチャンスだと思っています。
自分の中で資格は**勉強時間さえかければ合格できる**ものなので、プライベートの時間を有効活用して試験に合格できるように勉強していきたいです。
※PM/PLとして実務経験を積んだ後に「PMP」試験にも挑戦する所存です。

## 最後に
自分のキャリアパスに関する考えや方針が正しいかどうかは分かりませんが、
Qiitaで原稿を書いていくうちに思考が整理され、目指す先がハッキリとした気がします。
（あと投稿することで後に引けない状況を作り出すことも出来ました）

また今秋のプロジェクトマネージャ試験の結果が出たら報告したいと思います。
良い結果が出せるように頑張ります！
ほぼ未経験でもChatGPTを使えばプログラムを作れるのか④～プログラミングほぼ未経験者の挑戦～：アルゴリズム3

今回は『アルゴリズムの設計』の『1.問題の理解と分析』の『4.データの分析』からスタート


![図1：図7再掲.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500101/68afdd19-00c4-b191-66c5-1d15feb5b013.png)
アルゴリズムの設計①図7再掲

指標を見つける？

これってプログラムを作る前に必要な物なの？

![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500101/c4baa37c-1411-bc34-e0fc-cccad22d89b9.png)
図2

どうしてこの情報がプログラムを作る前に必要な情報なのか、全然分からない。

そういえば平出社長の動画で、全部が正しい情報ではないよって言ってたような・・・

これもそうなのかな？

![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500101/5558b5f1-ac84-24cc-3143-190a87417ee2.png)
図3

行う必要はありません？！
念のためしっかり確認しておこう。

![図4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500101/0bf870b6-5c1c-be36-658a-fa5ad77e1ab6.png)
図4
データの分析いらない・・・？

もう一度確認

![図5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500101/218823b5-9911-901a-1e9d-903ab8795844.png)
図5

結局、いるの？

いらないって言ったり、いるって言ったりどっちか分からん。

個人的には必要ない気がしている。

それこそ図4で回答してくれたことが正しいと思うのだけど。

こんな問題、平出社長にメッセージ送って聞いたら10秒で解決するんだよ・・・

技術的な質問はダメっていうルールを作ったから、聞けない。

でも聞いてしまいたい

プログラムを作る前にデータの分析って必要ですか？ってメッセージ送ってしまいたい！

しまいたいよ！！！

でも私が作ったルールのせいで聞けない・・・

涙を飲んでもう一度ChatGPTに聞いてみた。

![図6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500101/db2e4c66-e4f0-173c-91e1-bfe512ac3a9b.png)
図6

もう心が折れた

池田はしばらくゲームの世界へ旅に出ます。

探さないでください。

データの分析：未解決！！！

所用時間：6時間（3日にわたって）
cookieについてまとめ

# はじめに
インターネットを利用する上で度々目にするcookieは、WEBサイトを作成する上で非常に重要になる知識なのでここにまとめます

## cookieとは

クッキーは、ウェブサイトがユーザーのPCやスマホに保存する小さなテキスト情報のことを指します。テキストにはユーザーがそのサイトで何をしたか、どんな情報を入力したかなどが書かれています。

例えば、ユーザーがインターネットでショッピングをして、いくつかの商品をカートに入れた後にそのままサイトを閉じたとします。数時間後にそのサイトを再開したとき、カートの中には前に入れた商品がまだ残っていました。これは保存しておいたクッキー（小さなテキスト）を読み取ることでカートの中身を再度出力し直した結果になります。

ただし、クッキーに保存できる情報には限りがあり、重要な情報（例えばパスワード）をクッキーに保存することは推奨されません。また、ユーザーのプライバシーを尊重するために、クッキーを使う前にユーザーから許可を得ることが必要な場合もあります。

## cookieはどこに保存されるのか？

cookieはクライアント（ユーザーのブラウザ）の一部として、ユーザーのローカル環境に保存されます。具体的には、ブラウザがクッキーをファイルまたはメモリ内の特定の場所に保存します。

### 保存先：macOS  Google Chromeの場合
```
/Users/{ユーザー名}/Library/Application Support/Google/Chrome/Default/Cookies
```
#### cookieの見本
```css
Name: myCookie
Value: 12345
Domain: example.com
Path: /
Expires: Sat, 01 Jan 2023 00:00:00 GMT
Secure: false
HttpOnly: true
SameSite: Strict
```

### cookieはサーバーリクエストで自動送信される

ブラウザ（ローカル）に保存されたcookieは、ブラウザがサーバーにリクエストを送信する際に`いくつかの例外を除けば`自動的に送信されます。

### cookieが自動送信されない例外
- クッキーが有効期限切れ
クッキーに有効期限が設定されていて、期限が切れている場合、ブラウザはそのクッキーを送信しません。
- セキュア属性が設定されている
セキュア属性が設定されているクッキーは、HTTPSプロトコルを使用して通信する場合にのみ送信されます。HTTPプロトコルを使用する場合は、そのクッキーは送信されません。
- SameSite属性がStrictまたはLaxに設定されている
SameSite属性がStrictまたはLaxに設定されているクッキーは、クロスサイトリクエスト時に制限される場合があります。

#### クロスサイトリクエスト
クロスサイトリクエストは、異なるオリジン（ドメイン）間でのリクエストのことを指します。
例えば、ユーザーが信頼している銀行のウェブサイトを開いているときに、別のタブで攻撃者が作成した悪意のあるウェブサイトを開いてしまった場合、攻撃者のウェブサイトから銀行のウェブサイトに対して入力されたリクエストが送信される可能性があります。これによって、攻撃者はあなたのアカウント情報や機密データを取得することができ、これはクロスサイトリクエストフォージェリ（CSRF）」と呼ばれます。

## cookieは紐づいたリクエスト先にのみ送信される
cookieは基本的に「cookieの保存を命令したサーバーと同じサーバー」にしか送信されません。cookieはリクエストと一緒にサーバーへ自動送信されますが、保存されているすべてのcookieを無差別に送信するわけではありません。リクエストが特定のドメインやパスに対して行われる場合、そのドメインやパスに関連付けられたクッキーだけを送信します。他のサイトやドメインに関連付けられたクッキーは、そのリクエストには含まれません。

## ウェブサイトごとにクッキー作成が作成される

ウェブサイトは目的や機能に応じて、複数のクッキーを作成することがあります。たとえば、ログイン状態の管理やパーソナライズされた設定の保存には、複数のクッキーが使用されることがあります。

例えばユーザーが2つのサイトにアクセスした場合、それぞれのサイトは以下のようにクッキーを作成する可能性があります

- Amazon
ログイン状態を維持する、過去の注文や購入履歴
- youtube
ログイン状態を維持する、動画の再生状態や視聴履歴の管理

## cookieは必ず作成されるわけではない
cookieは個人情報の漏洩につながる危険性もあることから、セキュリティ対策として以下のようにクッキーが制限されている可能性があります
- **ブラウザのクッキーの無効化**
ユーザーがブラウザの設定でクッキーの受け入れを無効にしている場合、クッキーは作成されません
- **プライバシーモードの使用**
ブラウザがプライバシーモードで実行されている場合、クッキーは一時的に保存されず、セッション終了時に削除されることがあります。

## まとめ
クッキーはウェブサイトがユーザーのデバイスに保存する小さなテキスト情報で、ウェブサイトのパーソナライズや状態の維持に使用されます。クッキーは自動的にサーバーリクエストと共に送信され、特定のドメインやパスに関連付けられます。また、ウェブサイトごとに複数のクッキーが作成されることがあります。クッキーの利用にはプライバシーとセキュリティの配慮が重要です。
便利！Markdown形式でブログ記事を書こう！～覚えておくべき4つのルール～

記事を書くとき、Markdown形式で書くと、記事を書きながらある程度の見た目を整えることができて、非常に便利です。実際に、私が運営する[「ぬるぺでぃあ」](https://miuradonuts.com/)内の記事やQiitaの記事などは、最初からMardown形式で書かれています。

※見た目もほとんどそのまま、特に整えたりすることもありません。

ここではMarkdown形式で記事を書くにあたって、再頻出の項目に絞って書き方の解説を行います。この書き方をマスターして、少しでも楽に見栄えよく記事が書けるようになれば…と思います！

- 見出しの書き方
- 箇条書き（リスト形式）の書き方
- 画像の埋め込み方
- リンクの記載の仕方


## 見出しの書き方

覚えるべき構文は…`「#」と「半角スペース」を使う`ことだけ。

過去の記事[「【読み物】ふつうの会社員がNFTを発行し始めたワケ」](https://qiita.com/Rekt-Order/items/8f2e4de013359311e681)は、Markdown形式を使って、こんな風に書かれています。

※左がMarkdown形式、右がプレビュー形式です。
![スクリーンショット 2023-06-27 123353.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/313036ca-d647-9f0a-c8eb-1a131420e224.jpeg)

「# テスト」：見出し１の形式で「テスト」
「## テスト」：見出し２の形式で「テスト」
「### テスト」：見出し３の形式で「テスト」
「#### テスト」：見出し４の形式で「テスト」
「##### テスト」：見出し５の形式で「テスト」
「###### テスト」：見出し６の形式で「テスト」

## 箇条書き（リスト形式）の書き方

覚えるべき構文は…`「-」と「半角スペース」を使う`ことだけ。

過去の記事[「多機能！Coinviseで出来る事〜プロフィール作成編〜」](https://qiita.com/Rekt-Order/items/80492fa2d12c410c4f47)は、Markdown形式を使って、こんな風に書かれています。

※左がMarkdown形式、右がプレビュー形式です。
![スクリーンショット 2023-06-27 123943.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/5193b040-bc0e-7735-f540-13d7a19b1b2c.jpeg)

「- テスト」：「・テスト」

「- テスト　　　「・テスト
　  - テスト」：　　◦ テスト」

## 画像の埋め込み方

覚えるべき構文は…　`![](画像のURLリンク)`　だけ

例えば、OpenSeaの画像を埋め込みたい場合。

OpenSeaの画像の右上「View Orginal Media」から、画像のURLリンクを確認することができます。

![スクリーンショット 2023-06-27 134349.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/93daadc4-8e70-5a26-f24f-fc7badc08aab.jpeg)


※「OpenSeaの画像を保存するには…？」と考える方もいると思いますが、この方法で表示した画像を右クリックで保存も可能です。

## リンクの記載の仕方

覚えるべき構文は…　`![テキスト](URLリンク)`　だけ

過去の記事[「HTMLをレンダリングしたNFTの作成方法」](https://qiita.com/Rekt-Order/items/102ccd5ae789263600a1)は、Markdown形式を使って、こんな風に書かれています。

![スクリーンショット 2023-06-27 135356.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/8d343d5b-0acd-fe26-6a81-89cc23ee66be.jpeg)

慣れてくると、リンクの設定はこれで書いた方が圧倒的に早いです。

以上、便利なMardown形式の使い方でした。他にも便利な書き方や表現方法がたくさんありますので、ぜひ、Markdownの書き方に慣れ親しんでみてください。

この記事は、著者が運営するメディア「ぬるぺでぃあ」でも読むことができます（記事は[コチラ](https://miuradonuts.com/2023/06/27/note/)）
![](https://miuradonuts.com/wp-content/uploads/2023/06/ヘッダーエリア画像作成.png)
クロスリージョン参照（CDK）

# 概要
従来CDKでクロスリージョン参照といえば、[cdk-remote-stack](https://github.com/pahud/cdk-remote-stack)を使用する事が主流でしたが、どうやらCDK 2.50.0以降からCDKネイティブでクロスリージョンのリソース受け渡し（スタック間参照）が可能になったとの事（もっと早く知っていれば...）

# サンプルコード
以下のサンプルコードは、"ap-northeast-1"のCloudFrontスタックから"us-east-1"のWebACLのARNを参照する例です。

## bin/main.ts

```typescript:bin/main.ts
#!/usr/bin/env node

import 'source-map-support/register';
import * as cdk from 'aws-cdk-lib';
import { Environment } from 'aws-cdk-lib';
import { WebACLStack } from '../lib/WebACL/WebACLStack';
import { CloudFrontStack } from '../lib/CloudFront/CloudFrontStack';

if (process.env['NODE_ENV'] == null || process.env['NODE_ENV'] === '') {
    throw new Error('NODE_ENV is not set');
}
if (process.env['AWS_PROFILE'] == null || process.env['AWS_PROFILE'] === '') {
    throw new Error('AWS_PROFILE is not set');
}

const app = new cdk.App();

const env: Environment = {
    account: '<AWSアカウント番号>',
    region: 'ap-northeast-1',
};

const webAcl = new WebACLStack(app, {
    env: {
        ...env,
        region: 'us-east-1',
    },
    crossRegionReferences: true, // クロスリージョン参照を有効化
});

new CloudFrontStack(app, {
    env: env,
    webAclArn: webAcl.outputs.webAclArn, // WebACLのARNを渡す
    crossRegionReferences: true, // クロスリージョン参照を有効化
});
```

関連する2つのスタック両方に「crossRegionReferences: true」を1行追加させるだけで、簡単にクロスリージョン参照をさせる事が出来ました。
**※裏側でAWS Lambdaとパラメータストアのリソースが自動で作成される模様。**


WebACLStack.tsに依存してしまうのは少し残念な所ではありますが、クロスリージョン参照がこんな簡単に実装出来るなら痛くも痒くもありません。
プログラミング始めました

# プログラミング始めました
<br>
やってみたいことがあるので、プログラミングを始めました:sparkles:  

やってみたいことは
自分のウェブサイトを作り、そこで自分の作品（画像、動画など）を公開することです。
ウェブサイトはスマホやタブレットからも見ることができるようにしたいです。
自分好みにかわいくしたいので、ロゴや文字、背景の色などを自分で調節したいです。

2023年6月末現在の情報↓
今やろうとしていること
html、css、php、javascriptなどを利用してウェブサイトを作る
Wordpressを導入して、レンタルサーバーを借りてウェブサイトを運営する

:star2:今できること
・adobe illustratorでロゴやパターンの作成（ベクターイラスト）
・Photoshop,procreateなどを用いたイラストの作成編集（ラスターイラスト）
・単純なhtmlの記述

:star2:今練習中のこと
・HTML
・CSS

:star2:これからできるようになりたいこと
（自分の望むウェブサイトを運営するため）
・HTML、CSSの上達
・PHPの利用（必要時）
・javascriptの利用（必要時）

:keyboard:開発環境
・windows10
・VSCを使用

まだわからないことだらけですが、よろしくお願いします。
モチベ継続＆備忘録として記録していこうと思います。
[Windows][Vagrant] /usr/bin/env: ‘ruby\r’: No such file or directory 解決法




# 起こったこと

Vagrant でWindows 上にVM 立てて
開発環境を利用している場合、

異なるOS間での プロジェクト のファイル共有をするため
改行コードなどの問題で
以下のような問題が起こることがある
( 特に、Windows Host側で gitを使用すると 自動で改行コード変換される機能のため `git stash` などすると発生

Rails サーバーが立ち上がらない..
```
$ bin/rails server
/usr/bin/env: ‘ruby\r’: No such file or directory
```


# 原因

VM使用のため
異なるOS間での プロジェクト のファイル共有をしているため
改行コードなどの問題で
上手くファイルを読み取れていないよう..


# 解決法

改行コードを変換する

`unix2doc` を利用
```
$ sudo yum install uni2doc
$ dos2unix bin/*
dos2unix: converting file bin/rails to Unix format...
...
```
->
実行できた


# 以後対策

そして

Windows HOST側の git の変換も止めておく..

```
git config --global core.autocrlf false
```
IAM Identity Centerの紹介（AWS）

## 1. スイッチロールで子アカウントの切り替えから卒業しよう
スイッチロールで子アカウントの切り替えをしているのは面倒です。AWSは直近の5件しか表示してくれないので、時々面倒になることがある。そこで登場するのがIAM Identity Centerです。

## 2. IAM Identity Centerって何？
IAM Identity Centerは昔、IAM Single Sign-Onって言われていたサービスで、複数のAWSアカウントにシングルサインオン（一つのアカウントにログインすることで複数の他のサービスにログインできるようになる機能のこと）で簡単に行き来できるようになるサービスです。IAM Identity Centerは、シングルサインオンの認証スキームを使用してユーザーが一度のサインインで複数のアプリケーションとウェブサイトにアクセスできるようにするものです。

IAM Identity Centerでは、ワークフォースユーザーやグループを作成するか、既存のユーザーやグループのセットを自身のアイデンティティソースから接続して同期し、すべてのAWSアカウントとアプリケーションで使用することができます。また、SAML 2.0アプリケーションへのシングルサインオンアクセスをワークフォースユーザーに許可し、一度に複数のAWSアカウント全体でIAM権限を一元的に管理することも可能です。

ただし、IAM Identity Centerの設定はルートユーザーからはできません。そのため、企業が子アカウントしか持っていない場合は、まずルートアカウントを取得する必要があります。（撃沈）

## 3. IAM Identity Centerの設定方法
以下に、IAM Identity Centerの設定方法を説明します。

AWS Management Consoleにログインします。
サービスメニューから「IAM Identity Center」を選択します。
ワークフォースユーザーを作成するか、既存のユーザーやグループのセットを自身のアイデンティティソースから接続して同期します。
必要に応じてワークフォースユーザーにSAML 2.0アプリケーションへのシングルサインオンアクセスを許可します。
複数のAWSアカウント全体でIAM権限を一元的に管理する設定を行います。
設定が完了すれば、ワークフォースユーザーはAWSアクセスポータルを通じて割り当てられたすべてのAWSアカウントとクラウドアプリケーションにワンクリックでアクセスできます。

## 4. まとめ
IAM Identity Centerは、一度のログインで複数のAWSアカウントとアプリケーションにアクセスできるようにするシングルサインオンの認証スキームを提供します。これにより、ユーザーは簡単に複数のAWSアカウント間を移動することができ、一元的なIAM権限管理を実現することができます。
【Salesforce認定資格】Salesforce Certified Administratorの受験結果

※本記事は2020年12月に受験した「Salesforce Certified Administrator」の振り返りを記載しています。

## はじめに
Salesforce Certified Administratorを受験しました。
初めてのSalesforce認定資格の受験だったので、Webassessorの登録を行う等の作業があったり、試験会場への行き方に不安があったり、色々と不安要素がありましたが、~~10分で着くところを30分くらい彷徨いましたが~~なんとか辿り着くことができて無事に受験できました。

## 試験結果
結果は __「合格」__ でした。
試験に関しては時間に余裕があったので、3回程見直しをしました。
問題にマークができるので、1度目は早めに流して解いておき、悩んでも良い時間を確保できてから悩む問題に取り組むという方法で進めました。

| 受験料 | 試験時間 | 設問数 | 合格ライン | | 受験日 | 正答率 | 所要時間 |
| :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: |
| 20,000円 | 90分 | 60問 | 65% | | 2020/12/04 | 86.55% | 59分 |

内訳を見ると、ユーザの設定や活動の管理の理解度が低いので、しっかりと復習する必要がありそうです。

| 試験内容 | 内訳 | 設問数 | | 正答率 |
| :-- | :-: | :-: | :-: | :-: |
| 組織の設定 | 3% | 1.8問 | | 100% |
| ユーザの設定 | 7% | 4.2問 | | 50% |
| セキュリティとアクセス | 13% | 7.8問 | | 75% |
| 標準オブジェクトとカスタムオブジェクト | 14% | 8.4問 | | 100% |
| 営業アプリケーションとマーケティングアプリケーション | 14% | 8.4問 | | 75% |
| サービスアプリケーションとサポートアプリケーション | 13% | 7.8問 | | 100% |
| 活動の管理 | 3% | 1.8問 | | 50% |
| データの管理 | 10% | 6.0問 | | 100% |
| 分析 - レポートとダッシュボード | 10% | 6.0問 | | 83% |
| ワークフロー/プロセスの自動化 | 8% | 4.8問 | | 100% |
| デスクトップとモバイルの管理 | 3% | 1.8問 | | 100% |
| AppExchange | 2% | 1.2問 | | 100% |

![Salesforce_Certified_Administrator_01_テスト結果詳細.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3285411/019c6664-43ce-a4c0-04fa-36c4999665fe.png)

## 学習方法
学習期間は全体を通して2ヶ月程度で、前半の1ヶ月間は[Trailhead](https://trailhead.salesforce.com/ja/today)を中心に学習を進め、後半の1ヶ月間はウェビナー受講や実機での確認に費やしました。また、[公式のドキュメント](https://help.salesforce.com/s/)は隙間時間に読み漁りました。

https://trailhead.salesforce.com/ja/users/welcome4/trailmixes/prepare-for-your-salesforce-administrator-credential

https://trailhead.salesforce.com/ja/users/nmin000/trailmixes/adminlex

研修期間で学習時間をとりやすかったため、平日は1日あたり10時間、休日は1日あたり12時間くらい学習していました。

## 学習の意識付け
暗記が苦手なので最小限に抑えられるように、単体の機能を覚えるよりも連続した流れを覚える学習を行いました。例えば、

- ページレイアウトの割り当てのページだけ覚えれば、「ユーザに見える項目を出し分けるにはプロファイルを分けるかレコードタイプを分けるかだ」ということを覚えなくても導ける
- 主従関係は必須項目だけ覚えれば、「参照関係から主従関係への変更は参照関係に値が入っている必要がある」ということを覚えなくても導ける

というような形で覚える意識をしていました。
特に、Trailhead等の学習では散々の言葉や機能が頭に入ってくるため、できる限り実機を触って流れを覚える必要がありました。
JavaScriptで計算問題を解くためのチートシート

# 概要
- 練習がてらJavaScript(Node.js)でプログラミングの計算問題を解きたい。
- データがファイルで読み込むタイプの時でも対応できるようにしている
- 自分のためのチートシートでしたが、公開します。

# チートシート

## ＜基本＞

### 1. 文字列→配列(分割)
```javascript
const input = "A,B,C,D";
const array = input.split(",");
console.log(array);
// →["A", "B", "C", "D"]
```
### 2. 配列→文字列(結合)
```javascript
const array = ["A", "B", "C", "D"];
const text = array.join("");
console.log(text);
// → ABCD
```

### 3. 配列の文字列を全てNumberに
```javascript
const array = ["1", "2", "3", "4"];
const arrrayNum = array.map((x) => Number(x));
console.log(arrrayNum);
// → [1, 2, 3, 4]
```

### 4. 配列のNumberの和
```javascript
const array = [1, 2, 3, 4];
const sum = .reduce((a, b)=> a + b);
console.log(sum);
// → 10
```

### 5. 配列の重複をなくす
```javascript
const array = [1, 2, 3, 4, 4, 3, 5];
const set = new Set(array);
const setArr = Array.from(set);
console.log(setArr);
// → [1, 2, 3, 4, 5]
```

### 6. 配列に追加する
```javascript
const array = [1, 2, 3, 4, 5];
array.push(6)
console.log(array);
// → [1, 2, 3, 4, 5, 6]
```

### 7. 配列を逆順にする
```javascript
const array = [1, 2, 3, 4, 5];
const reverse = array.reverse();
console.log(reverse);
// → [5, 4, 3, 2, 1]
```

### 8. 配列をソートする
```javascript
const array = [4, 2, 1, 3, 5];
const reverse = array.sort();
console.log(reverse);
// → [1, 2, 3, 4, 5]
```

### 9. デカすぎて正しく計算できない数値対応
```javascript
const bigNum = BigInt(10000000000000000000000);
const twiceNum = bigNum * BigInt(2);
console.log(twiceNum);
// → 20000000000000000000000n
// ※BigIntの結果には語尾にnがつく
```

https://qiita.com/okumurakengo/items/a5cf08e764b6dfd7bf85


### 9. ファイルのインポート
```javascript
const fs = require("fs");
const input = fs.readFileSync("（パス名）/01.txt", "utf-8");  // csvも可能
```

## ＜応用＞

※**＜基本＞**の内容を使ったらできることです。

### 1. 各位の和
```javascript
const num = Number(123); // BigInt()も可能
const sum = num.toString().split("").map(x=>Number(x)).reduce((a, b)=> a + b);
console.log(sum);
// → 10
```

### 2. 回文数
```javascript
const num = 12345;
const sum = Number(num.toString().split("").reverse().join("")); // BigInt()も可能
console.log(sum);
// → 54321
```

### 3. 任意の位の値取得
```javascript
const num = 12345;
// 100の位
const hyaku_no_kurai = Number(num.toString().split("")[2])
console.log(hyaku_no_kurai);
// → 3
```

### 4. 改行データを配列に分割
```javascript
const txt = `ABC
DEF
GHI`;
const array = txt.split("\n")
console.log(array);
// → ['ABC', 'DEF', 'GHI']
```

### 5. 改行データを一行にする
```javascript
const txt = `ABC
DEF
GHI`;
// 正規表現で全ての改行をマッチさせ、""に置き換える
const oneLine = txt.replace(/\n/g, "") 
console.log(oneLine);
// → 'ABCDEFGHI'
```


以上（適宜更新していきます）
GoogleColaboratory上でSeleniumを使用してスクリーンショットを撮ると文字化けする

# 結論
日本語のフォントがインストールされていないことが原因のようです。
日本語のフォントをインストールすることで解決できます。

# 実際に起きたことを再現
GoogleColaboratory上でSeleniumを使用し、Webページのスクリーンショットを撮ったところ、画像のような文字化けが起こりました。
文字化けが起こさないようにできないか、調査しました。
```.py
# webdriverのimportや他のoptionのコードは割愛
with webdriver.Chrome("chromedriver", options = options) as driver:
    driver.get('https://www.google.co.jp/?hl=ja')
    driver.save_screenshot('screenshot.png')
```
![screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071987/24da23fd-b72a-aed4-121b-a5a788f217ec.png)

# 調査
下記の記事が参考になります。

https://prograshi.com/language/python/prevent-garbled-characters-when-capturing-with-selenium-on-ec2/

日本語フォントがColaboratoryには備わっていないことが原因のようです。

# 調査を踏まえた対策
下記のコマンドをselenium実行前に実行しておきます。
```
!apt-get install fonts-ipaexfont-gothic fonts-ipaexfont-mincho
```
参考記事の対処法と異なるのはcolaboratoryではyumが使用できないためです。
代わりにapt-getを使用して日本語フォントをインストールします。

これで前述のコードを実行すると文字化けが無くなります。

![screenshot (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071987/d22e56d1-fc3f-bcc0-6eac-a3cd8b93e49e.png)

# 補足
以前に私が投稿した記事。Google Colaboratoryでseleniumインストールするコマンドに、日本語フォントをインストールするコマンドを付けると忘れなくていいかもしれないです。

https://qiita.com/76r6qo698/items/cfea95c6b77ddaae518d

```
%%shell
# Ubuntu no longer distributes chromium-browser outside of snap
#
# Proposed solution: https://askubuntu.com/questions/1204571/how-to-install-chromium-without-snap

# Add debian buster
cat > /etc/apt/sources.list.d/debian.list <<'EOF'
deb [arch=amd64 signed-by=/usr/share/keyrings/debian-buster.gpg] http://deb.debian.org/debian buster main
deb [arch=amd64 signed-by=/usr/share/keyrings/debian-buster-updates.gpg] http://deb.debian.org/debian buster-updates main
deb [arch=amd64 signed-by=/usr/share/keyrings/debian-security-buster.gpg] http://deb.debian.org/debian-security buster/updates main
EOF

# Add keys
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys DCC9EFBF77E11517
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 648ACFD622F3D138
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 112695A0E562B32A

apt-key export 77E11517 | gpg --dearmour -o /usr/share/keyrings/debian-buster.gpg
apt-key export 22F3D138 | gpg --dearmour -o /usr/share/keyrings/debian-buster-updates.gpg
apt-key export E562B32A | gpg --dearmour -o /usr/share/keyrings/debian-security-buster.gpg

# Prefer debian repo for chromium* packages only
# Note the double-blank lines between entries
cat > /etc/apt/preferences.d/chromium.pref << 'EOF'
Package: *
Pin: release a=eoan
Pin-Priority: 500


Package: *
Pin: origin "deb.debian.org"
Pin-Priority: 300


Package: chromium*
Pin: origin "deb.debian.org"
Pin-Priority: 700
EOF

# Install chromium and chromium-driver
apt-get update
apt-get install chromium chromium-driver

# Install selenium
pip install selenium

# 日本語フォントをインストール
apt-get install fonts-ipaexfont-gothic fonts-ipaexfont-mincho
```

以上です。

# 参考

https://prograshi.com/language/python/prevent-garbled-characters-when-capturing-with-selenium-on-ec2/
Ansible Inventoryをテスト先への接続に使用するServerspecの例

備忘

# 要件


Ansible管理ノードに導入されたServerspecを用いて、Ansible Playbookから管理対象ノードに対するテストを行う要件があるとする。

また、Ansibleは管理対象ノードへの接続情報を含むインベントリーを既に持っているとする。

# localhostを対象とするインベントリー ⇒ △
Serverspecを実行するのはローカルノードの為、対象が localhostのインベントリーを利用したAnsible Playbook実行、あるいは, hosts: localhost とした Playbook実行が考えられる。
しかしながら、この場合、Serverspec用のテスト対象ノードへの接続情報は別途管理が必要となってしまい、2重管理となる。




# 管理対象ノードに対するインベントリーとローカル実行の組み合わせ ⇒ ○

それよりは、既に存在する管理対象ノードへの接続情報を含むインベントリーを利用して、情報の重複管理をさけた方がスマート。
リモートホストに対するインベントリーを使用していても、delegate_to: localhostによりローカルノード上でタスクを実行することが可能。

# 例




Ansible管理ノードに導入されたServerspecにより、Ansibleのインベントリー等における接続情報を利用して、管理対象ノードでのテストを行う場合、以下のように連携可能。

## Playbookの例

```yaml
---
- name: Execute Serverspec tests
  hosts: all                          # <= ここではlocalhostとしない
  gather_facts: false

  tasks:
    - name: Run Serverspec test
      delegate_to: localhost          # <= ここでlocalhostとする
      environment:
        TARGET_HOST: "{{ ansible_host }}"            # <= ansibleが認識している接続情報を連携
        USER: "{{ ansible_user }}"                   # <= ansibleが認識している接続情報を連携
        SSH_KEY: "{{ ansible_private_key_file }}"    # <= ansibleが認識している接続情報を連携
        SSH_PORT: "{{ ansible_port }}"               # <= ansibleが認識している接続情報を連携
      command: rspec /path/to/my_spec.rb
```

テスト対象ノードへの接続情報は環境変数としてServerspecに連携
delegate_to: localhostとしても、ansible_host, ansible_userなどは本来の接続先のまま。

https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_delegation.html

Note
The ansible_host variable and other connection variables, if present, reflects information about the host a task is delegated to, not the inventory_hostname.




## Testの例
```ruby:/path/to/my_spec.rb
require 'spec_helper'

set :backend, :ssh
set :host, ENV['TARGET_HOST']                                                    # <= Ansibleにおける接続情報を取り込み
set :ssh_options, user: ENV['USER'], keys: ENV['SSH_KEY'], port: ENV['SSH_PORT'] # <= Ansibleにおける接続情報を取り込み


describe package('httpd'), :if => os[:family] == 'redhat' do
  it { should be_installed }
end

describe service('httpd'), :if => os[:family] == 'redhat' do
  it { should be_enabled }
  it { should be_running }
end

describe port(80), :if => os[:family] == 'redhat' do
  it { should be_listening }
end

```

環境変数として受け取ったテスト対象ノードへの接続情報を利用
ChatGPT API + Function Callingで学習データ不要のカテゴリ推定

# ChatGPT API の Function Calling機能

OpenAIが提供しているChatGPT APIに、Function Calling機能が実装されました。

https://openai.com/blog/function-calling-and-other-api-updates

説明によると、Function Callingは、他のAPIとの連携を想定して、その（json）フォーマットのパラメータを入力テキストから推定してくれる、というものであるとされています。しかし、エンジニアリング・テキスト処理の観点からみると、あるフォーマットを与えると、それに即したいくつかの変数をChatGPT APIが返してくれるという、出力の形式が安定するというところにこそ、この機能の大きな価値があるように思えます。

今までのChatGPTでは、（APIを使ったとしても）出力される文字列の形式を指定することはできませんでした。プロンプトの工夫によって、多くの場合にこちらが返してほしい形式で出力されるようにする様々なノウハウが考案されてきましたが（いわゆるプロンプト・エンジニアリングの一部）、ChatGPTが本質的には大規模言語モデル（LLM）である以上、それが行っているのはあくまで次に来る文字列の推定であり、確率的な挙動を排除することはできませんでした。この点、（恐らくOpenAIが開発したChatGPTの外側の機能によって）定形出力が可能になったことで、後続のシステムに繋げる安定性が格段に向上しました。

# 学習データ不要のカテゴリ推定

前置きが長くなってしまいましたが、Function Calling機能の中でも enum という型を利用することで指定した文字列の中から出力することができ、これを利用してカテゴリ推定機能の作成が可能です。

``` categorize.py
import openai

openai.api_key = YOUR_API_KEY

schema = {
    "type": "object",
    "properties": {
        "mode": {
            "type": "string",
            "enum": ["国内", "国際", "経済", "エンタメ", "スポーツ", "IT", "科学", "地域"],
            "description": "ニュースが属するカテゴリ",
        },
    },
    "required": ["mode"]
}

completion = openai.ChatCompletion.create(
    model="gpt-3.5-turbo-0613",
    messages=[
        {"role": "user", "content": "ニュース:国交省、航空局長を戒告処分"}
    ],
    functions=[
        {
            "name": "categorize_news",
            "description": "ニュースのカテゴリを推定",
            "parameters": schema
        }
    ],
    function_call={"name": "categorize_news"},
    temperature=0.9,
)

print(completion.choices[0].message.function_call.arguments)
```

出力
```
{
  "mode": "国内"
}
```

簡単なサンプルとして、Yahoo!ニューストピックスの見出し（タイトル）から、そのトピックスのカテゴリを推定する推定器を作成してみました。"messages"の"content"にタイトルを入力すると、"schema"中の"enum"に列挙した文字列の中からそれらしいものを推定してくれます。

通常こういったカテゴリ推定器を作成するにはデータ（コーパス）が大量に必要だったり、独自のカテゴリ（ラベル）を定義したい場合には人手でアノテーションしていく必要がありますが、ChatGPT APIに投げることでデータ不要でこうした機能を作成することができました。しかも、"enum"で列挙したラベルについて特に補足説明はありませんが、ChatGPTがその文字を読み取って、「いい感じに」分類してくれていることになかなか驚かされます。

今回は手軽にカテゴリ推定器を作る方法の紹介のため、厳密な精度検証は行いませんが、最後にいくつかの入力・推定カテゴリ・正解カテゴリの例を記載します。**学習データ不要**でこれだけ簡単に、かつどんなカテゴリにも適用できてしまう（少なくとも機能としては）という自由度の高さを考えても、悪くない性能なのではないかと思いますがいかがでしょう。

|  トピックスタイトル  |  推定カテゴリ  |  正解カテゴリ  |
| ---- | ---- | ---- |
|  国交省、航空局長を戒告処分  |  国内  |  国内  |
|  スウェーデンのNATO加盟 協議へ  |  国際  |  国際  |
|  退職者は戦力 人手不足に企業活路  |  経済  | 経済  |
|  モバイルSuicaの障害 原因明かす  |  IT  |  IT  |
|  日中に熱が蓄積 夜の熱中症に注意  |  国内  |  科学  |
|  トラックにはねられ2人死傷 千葉  |  国内  |  地域  |
|  大谷「三塁打王」も射程圏内に  |  スポーツ  |  スポーツ  |
|  モー娘。新メンバーにファン歓声  |  エンタメ  |  エンタメ  |

お気付きの点がありましたらコメントにてよろしくお願いします。
NetBSDでもmpg123

久しぶりにNetBSD/star(10.99.4)をビルドして再インストールしてmpg123を実行してみました。devmapの構造体が変更されていたので、一行だけ修正しました。ターゲットモジュールにはUSBポートが二つあるので、一つはHDをつけて、一つにUSB DAC(PCM2704)を接続しました。

```
[     3.789760] uaudio0 at uhub0 port 2 configuration 1 interface 0
[     3.789760] uaudio0: Burr-Brown from TI (0x08bb) USB Audio DAC (0x2704), rev 1.10/1.00, addr 2
[     3.799754] uaudio0: audio rev 1.00
[     3.799754] audio0 at uaudio0: playback
[     3.799754] audio0: slinear_le:16 2ch 48000Hz, blk 11520 bytes (60ms) for playback
```

mpg123をビルドしようとしたのですが、configureが固まったりcoreを吐いたりしたので、10.0のpkgをインストールしました。

10.0_BETAで再インストールして試してみましたが、ときどき音飛びしますがJazz Sakuraが再生できました。

audioctlでサンプリングレートなどは確認できるのですが、mpg123が設定してくれるようです。

CPU負荷は35%くらいです。armv4なんで重いです。
hazama base 使い方

# はじめに

hazama baseを利用することで簡単にNFTの作成が可能となります。
一連の流れを覚書として残しておきます。


# hazama base

https://hazbase.com/


# 手順

## 1.プロジェクトを作成
![スクリーンショット 2023-06-19 17.18.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/ac09ffe8-3ce9-2a82-bf91-d0c90958f8b6.png)

## 2.deploy
![スクリーンショット 2023-06-19 17.19.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/604b2868-8676-8ea5-8d46-29d05aec3da8.png)

## 3.新しいコントラクトを作成
![スクリーンショット 2023-06-19 17.20.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/b1a32fe1-c5ac-917b-bd06-2b8303d6ed29.png)

## 4.コントラクトの種類を選ぶ
![スクリーンショット 2023-06-19 17.21.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/16208f44-d3ec-6ae2-bc57-a632a326d6e5.png)

## 5.コントラクト名を作る
![スクリーンショット 2023-06-19 17.21.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/604a9370-982d-4729-e6f5-00b49affa395.png)

## 6.シンボルを入力
![スクリーンショット 2023-06-19 17.21.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/36873d10-a7a7-5000-60d2-564a43f53596.png)

## 7.deploy
![スクリーンショット 2023-06-19 17.21.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/b045a3a7-2a13-7796-ee16-3debe5bf6295.png)

## 8.NFTの発行
![スクリーンショット 2023-06-19 17.23.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/c9ef39e8-5247-b504-21fe-8259afadaea6.png)

## 9.NFTの詳細
![スクリーンショット 2023-06-19 17.24.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/5d726fdf-7f64-371a-0e19-f326e860d925.png)

## 10.NFTの作成完了
![スクリーンショット 2023-06-19 17.25.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/6def6e08-2e42-cfba-832c-1f32269ba728.png)

## 11.配布枚数を設定
![スクリーンショット 2023-06-19 17.25.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/b0532a27-2383-b68c-27ca-75b9bdff67cf.png)


# OpenSeaとの連携

Polygonネットワークで作成した場合、OpenSeaなどからもNFTを確認することができます。

(NFT-mp4)
https://opensea.io/ja/assets/matic/0x78BA7A58c77E122DAADe5130B5E416830089CA45/0

(SBT-mp4)
https://opensea.io/ja/assets/matic/0x5288ea3447b36648C54391F5442A133dA12E9BbF/0

(SBT-gltf)
https://opensea.io/ja/assets/matic/0x5288ea3447b36648C54391F5442A133dA12E9BbF/1

![IMG_2770.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/ef2aea83-40f7-a739-132e-dad094b2ced0.png)
![IMG_2769.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/5b11434e-9a03-2d47-acc7-4604797f593c.png)
自分のキャリアの今までとこれから

初めてキャンペーンに参加します。
面白いコンテンツの提供に自信はありませんが、せっかくなのでやってみようと思います。
この記事は私の社会人経験の振り返りとなりますので、「こんな人もいるんだな」と思っていただければ幸いです。

また、ここでいうエンジニアは「言語問わずコードを書く人」を総称しています。

# 私について
32歳です。
大学までバリバリ文系しており、あまり仕事につながらないような分野をやっていました。
C言語の初心者向けの授業も受けましたが単位をとることに精一杯で、身についたかというと怪しいところです。

## なんでエンジニアになったの？
面接がほとほと苦手だったため就活でつまづき、秋ごろに通年採用していた今の企業にたどり着きました。
ありがとう御社。ありがとう通年採用。
営業職で採用されましたが半年で音を上げ、自分の希望で企画職に異動させてもらったのにパッとせず、3年目からエンジニア職となりました。

**教えられたセールストークに納得できず、顧客の気持ちに寄り添うこともできぬ、哀れで醜い、かわいげもない3年目だ！お前に私を救えるか！**


# エンジニアになった私
エンジニアといっても文系未経験なので、HTMLでの文言の修正からやらせてもらいました。
企画職の後半では、顧客からの要望を取りまとめてエンジニアやデザイナーに依頼を出す仲介役をやっていました。
最初はすべてお願いしていましたが、仕事に慣れてくると「これは自分でできることじゃないか？」とエンジニアに任せず自分でコードを直していたので、その程度の導入でした。

なので、基礎もへったくれもない、我流で覚えていきました。
HTML、CSS、Javascriptを業務を通して学び、断片的な知識というか木を見て森を見ずな状態での業務が続きました。怖いですね。~~私も書いてて怖いです。~~
その後PHPが加わりました。
担当エンジニアとして打ち合わせにも参加させていただきましたが、当時は知ってる用語のほうが少なくて難しかったです。

当時自分のキャリアどう考えていたかというと、そもそも、仕事することで精いっぱいだったのでキャリアは気にしていませんでした。ですがおそらくニュースで言われる「管理職になりたくない若者」ではありませんでした。私は本質的に「自分が認めてない人の指示は聞きたくない」というワガママを持っていたため、かなり先輩たちに食って掛かっていたと思われます。
今新卒の自分が部下になったら自分も嫌ですね。

初めて役職がついたあたりから組織図に興味を持ちました。当時の役職はかなり人が滞留していたので、「このダンゴ状態から頭一つ抜けたい」と親に話したことを覚えています。
自分個人のキャリアっていうより、この組織で生き残ることを考え出したのかもしれないです。

# それから5年後
先輩の退職や先輩後輩との衝突などを乗り越え、部の人数が多くなり課が細分化したタイミングで自分が課のリーダーとなりました。
このときは管理職というよりはテックリードとしての憧れがありました。「自分がリーダーとして全部わからにゃならん」「自分が一番っょっょエンジニアだもん＞＜」と息巻いており、あまり部下に活躍してほしくないとすら思っていました。情報工学を学んだ子が下にいたこともプレッシャーとして大きかったと思います。
このあたりでも衝突は避けられず結構部下は不満が溜まっていたのだと思います。別れもありました。
当時の心境はこちらでも語っております。
https://note.com/rmrmnrm/n/n65188a159363

# そこからまた2年後
ここからまあまあまた少し大人になりました。
私はテックリードでなく、管理職の道を選んでいます。
私が新卒入社したときの上司と同じ役職です。やっぱり仕事に対する解像度というか、見える景色は大きく変わりました。

若いときに馬鹿にしていた自己啓発本やビジネス書を何冊も買うようになりました。
自分の席だけでなく、執務室全体を眺めるようになりました。
ぶつかる先の先輩という存在がいなくなり、部下を諭すことが増えました。

コードを書かないわけではありませんが、案件はちゃんと（？）部下にお願いできるようになりました。
まだ案件を一任することに若干の抵抗がありますが、実際みんな協力して回してくれているので結果的に良好と思われます。
自分自身そのものは変わってませんが、仕事を、事業をまわすために必要なことを幅広くやるようになりました。
仕事が人をつくるとはよく言ったものですね。

# 振り返って

結局、エンジニアになるにも、管理職になるにも、やりたいことが人一倍あるか、負けん気があるかだと思います。
会社の中で使う側使われる側がいるとして、使う側というのは席は限られていて、そこに座り続けるには自我と周囲の期待の天秤を持ち続けながらも前進していかなければなりません。
プログラマ35歳定年説に抗うためにも、上流工程やマネジメントを学んでいかないといけないと思います。
勉強したくないとか、新しいことを吸収したくない、いわゆる向上心を持ち続けられないならこの仕事は勧められないです。

いろんな方が入社して、退職していくのを見てきました。
私はたまたま上司先輩に恵まれ仕事に恵まれここまでやってこれたと思います。
エンジニアを目指している方に何か伝えるとするなら、**理想を仕事に押し付けちゃいけないよ**ということでしょうか。あなたの理想のプログラミングやPMはこの世にいません（過激）。

会社の歯車になりたくないとか若い頃は思っていましたが、結局既存の組織に加入するってことは歯車になるってことなんですよね…
わざわざかませてもらう歯車から、中継する歯車になって、なくてはならない歯車になるんです。
よりよい歯車であり続けるために、油をさしてメンテしていきましょうね。
EC2 Instance Connect を使ったEC2への接続方法を調べてみた

# はじめに
今月アップデートがあり、EC2 Instance Connect でプライベートIPアドレスを使用したSSH、RDP接続が可能になりました。
2023年5月までは、パブリックIPアドレスが必須でしたが、プライベートIPアドレスも使えるようになったのはうれしいですね。

今回は、このEC2 Instance Connect のパブリックIPとプライベートIPのそれぞれの接続方法の違いを調べたので、まとめます。

https://aws.amazon.com/jp/about-aws/whats-new/2023/06/amazon-ec2-instance-connect-ssh-rdp-public-ip-address/


以下の記事を参考にさせていただきました。
詳しい内容はこちらをみていただくといいと思います。

https://kacfg.com/aws-ec2-instance-connect/ 

https://dev.classmethod.jp/articles/update-ec2-instance-connect-endpoint/

https://dev.classmethod.jp/articles/how-to-connect-rds-instance-via-eic-endpoint/

https://dev.classmethod.jp/articles/compare-eic-endpoint-and-session-manager/



# EC2 Instance Connectの概要
EC2 Instance Connectは、パブリック/プライベートIPアドレスを使用してEC2インスタンスにSSH、RDP接続することをサポートするサービスです。

現在はIPv4のみサポートされています。

また、EC2 Instance Connect自体は無料で利用可能です。

## パブリックIPを利用したEC2 Instance Connect
パブリックIPを利用する場合、コンソール画面からIAMベースによる認証でEC2にSSH接続可能です。
Instance MetadataにSSH公開鍵が格納されるので、それを使用してセキュアに接続ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115411/b7642388-8187-dcf9-4394-cab223443327.png)


## プライベートIPを利用したEC2 Instance Connect
プライベートIPを利用する場合、ユーザーVPC内にEC2 Instance Connect Endpointを作成することで、
「AWS外部→EC2 Instance Connect Endpoint Service → EC2 Instance Connect Endpoint → 対象EC2インスタンス」
の経路で接続可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115411/9f037fac-08cd-d073-bc55-d415abe7003e.png)

## EC2 Instance Connect EndpointとSession Managerの違い
EC2 Instance Connect  Endpointによる接続が、Session Managerと何が違うのか、気になったため、ざっくりですがまとめてみました。

### AZ障害への対応可否
* EC2 Instance Connect Endpoint は、 1つのVPCに１つしか作成できないため、作成したサブネットにAZ障害が起きると利用できなくなります。
* Session Managerでは、複数のサブネットにVPCエンドポイントが作成できるため、AZ障害に対応可能です。

### 必要なエージェント
* EC2 Instance Connect Endpoint を利用するには、EC2 Instance Connect パッケージがEC2 インスタンスにインストールされている必要があります。
* Session Manager を利用するには、AWS Systems Manager エージェント (SSM Agent）がEC2 インスタンスにインストールされている必要があります。

### 最大セッション時間
* EC2 Instance Connect Endpoint：最大1時間
* Session Manager：最大24時間

## EC2以外にEC2 Instance Connect Endpointを利用して接続することができる
EC2 Instance Connect Endpointは、EC2だけでなく、VPCからIPv4で到達可能なサービスにも接続可能です。

例として、RDSへの接続方法を紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115411/49408457-8e27-d615-eb6d-299c5b0ce161.png)


RDSへの接続方法については、こちらの記事にもまとめています。

https://qiita.com/utsunomiya_ff/items/1d441a08bb63b9f7cf06

→2023/6/28に宛先のポート番号はTCP 22、TCP 3389のみとなったため、EC2以外は利用できなくなりました。



# おわりに

EC2への接続にはいつもSession ManagerやFleet Managerを利用しているので、今後はEC2 Instance Connectも使ってみようと思います。
【ChatGPT無】、説明いらないよ。結果だけ欲しいの！

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

　どうも、カーブミラーです。

　今回は、
　　いろいろとやってきて、
　　　とても邪魔に感じる
　　　　解説とか説明を
　　　　　カットします。

　解説や説明は、
　　場合によっては、
　　　とてもありがたいものです。
　　　　それが必要な場合もあります。

　でも、
　　何度も、やり取りを
　　　繰り返していると、
　　　　出力に時間が掛かるから
　　　　　その分だけ、
　　　　　　仕事（私事）の時間が
　　　　　　　奪われてしまいます。
***
　そこで、
　　解説や説明をカットして、
　　　出力時間を短縮しましょう。

　まぁ、
　　どこまで
　　　有効かはわかりませんが。

　次の二文を試してください。
「**前後の説明は不要です。結果のみを必要としています。**」

　以下に
　　使用例を示します。

>５人分のサンプルデータ（姓名、性別、年齢）をマークダウン記法のテーブルで表示して欲しい。
>
>前後の説明は不要です。
結果のみを必要としています。



結果です。（←これは自筆）
| 姓名       | 性別  | 年齢 |
| ---------- | ---- | ---- |
| 田中 太郎  | 男性 | 25   |
| 山田 花子  | 女性 | 30   |
| 鈴木 一郎  | 男性 | 40   |
| 佐藤 美咲  | 女性 | 22   |
| 伊藤 健太  | 男性 | 35   |


***
　解説や説明が
　　なくなるだけで、
　　　出力に時間が掛からなくなり
　　　　結果だけが現れるため、
　　　　　仕事（私事）が捗るはず。

　さらに、
　　嘘吐きの出現が
　　　結果のみになるため、
　　　　ファクトチェックも
　　　　　結果だけで済みます。

　多くの解説や説明は
　　ありがたいですけど、
　　　長々とされると、
　　　　人間は集中力が散漫と
　　　　　なりやすいです。
　　　　　　苛つきやすく
　　　　　　　なりますし。

　結果だけに
　　集中できれば、
　　　人間は、能力を
　　　　発揮しやすくなり、
　　　　　その分、思考能力の
　　　　　　低下を防げます。

　それは、
　　脳の疲労を
　　　軽減することにも
　　　　役立ちます。

　仕事（私事）の捗りと
　　疲労軽減で、
　　　適度な休憩を取りつつ、
　　　　お仕事（私事）を
　　　　　頑張ってください。
【Django】'AnonymousUser' object is not iterableエラーが発生してしまった時の対処法

## はじめに
[非同期通信でイイね機能を実装してみた](https://qiita.com/ponponmaru1012/items/c3e3a981c343d06f46ed)の記事で開発を進めていたところ、非ログインユーザーでArticleDetailViewへリクエストした際に、ブラウザ側で**AnonymousUser object is not iterable**エラーが発生してしまった。そこで、この記事では'AnonymousUser' object is not iterableエラーの原因と対処法についてまとめます。

## 'AnonymousUser' object is not iterableエラー
これは未ログインユーザーによるリクエスト処理が正常に行われない時に発生するエラーです。もう少し掘り下げると、このAnonymousUserはUserモデルのインスタンスとして扱うことができず、例えばUserモデルで定義したカラム属性などは扱うことができません。

## 対処法
改めて元々のコードを見てみます。
```views.py
class ArticleDetailView(generic.DetailView):
    model = Article
    template_name = 'article_detail.html'

    def get_context_data(self, **kwargs): #ユーザが既にイイねしているかどうかの判断
        context = super().get_context_data(**kwargs)
        
        like_for_article_count = self.object.likeforarticle_set.count()
        #記事に対するイイね数
        context['like_for_article_count'] = like_for_article_count

        #ユーザがイイねしているかどうか
        if self.object.likeforarticle_set.filter(user=self.request.user).exists():
            context['is_user_liked_for_article'] = True
        else:
            context['is_user_liked_for_article'] = False

        return context

```

ここで、問題となっているポイントは`.filter(user=self.request.user)`の部分です。request.userがAnonymousUserである場合、ここの部分で問題が発生してしまいます。

AnonymousUserであるかどうかの判別方法は`ユーザー.id`がNoneであるかどうかで判別することができます。そのため、get_context_dataメソッドを下記のように修正することで対処できました。

```views.py
def get_context_data(self, **kwargs): #ユーザが既にイイねしているかどうかの判断
        context = super().get_context_data(**kwargs)
        
        like_for_article_count = self.object.likeforarticle_set.count()
        #記事に対するイイね数
        context['like_for_article_count'] = like_for_article_count

        #非ログインユーザーの場合
        if self.request.user.id is None:
            context['is_user_liked_for_article'] = False
        #ログインユーザがイイねしているかどうか
        elif self.object.likeforarticle_set.filter(user=self.request.user).exists():
            context['is_user_liked_for_article'] = True
        else:
            context['is_user_liked_for_article'] = False

        return context
```
Eclipseのリファクタリング機能を使用して、メソッドのパラメータを追加する方法

## Eclipseのリファクタリング機能を使用して、メソッドのパラメータを追加する方法

- **パラメータを追加したいメソッドを開く**

- **コンテキストメニューを表示**
パラメータを追加したい場所でカーソルを置く
Windows：Alt + Shift + C キー
Mac：Control + Shift + C キー
→コンテキストメニューが表示される

- **コンテキストメニュー >「リファクタリング（Refactor）」を選択**

- **リファクタリングメニュー >「パラメータの追加（Change Method Signature）」を選択**

- **新しいパラメータの型と名前を指定**
パラメータの追加ダイアログが表示される
→必要に応じてデフォルト値や修飾子などのオプションも設定できる

- **パラメータの設定が完了したら、OKを押す**



*****

Eclipseは自動的にメソッドの定義と呼び出し箇所を修正し、新しいパラメータを追加する
コードの変更を簡単に行い、関連する箇所を一括で更新することができる
WordPressで特定のカテゴリーのみ記事ページからリダイレクトされてしまう問題

## WordPress特定のカテゴリー記事にて意図しないリダイレクトが発生していた。
これは私自身が経験した、WordPressにおける特定の条件下での不具合になります。

ある日、記事一覧ページより記事リンクをクリックすると、その記事一覧ページに飛ばされてしまった。このサイトはカテゴリーが複数あり、全ての一覧ページではなく、特定の一覧ページのみこの現象が発生していた。
確認すると、`｛記事ページ｝→｛一覧ページ｝`にリダイレクトされてしまっている。特にリダイレクト設定をした記憶がなく、`htaccess`、プラグインの`Redirection`にはリダイレクト設定はされていなかった。
記事一覧周りのコードは触っておらず、リンク先の表示は正常なものだった。
パーマリンク構造は`{ドメイン}/{カテゴリースラッグ}/{記事ID}`にしていた。

## 原因はアップロードした画像ファイル名だった
ローカル環境にてプラグインを無効化、キャッシュクリア、コードの確認など試せるものは全て試したところ。問題のあるカテゴリーページに遷移しようとすると。なぜかメディアに登録されている画像に飛んでしまった。なぜなのか原因はわからなかったが、おそらくこの画像が悪さをしていると考えデータベース上からメディアを削除しキャッシュクリアすると、なんと直った。

先ほどの原因のメディアを見てみると。画像ファイル名がカテゴリースラッグ名と一致してしまっている。
メディアを選択し、右下にある「さらに詳細を編集」より各メディアページに入る。右上の表示オプションをクリックし「スラッグ」にチェックを入れるとスラッグが表示されるが、アップロードした際のファイル名がここに入ってしまうことにより、カテゴリースラッグと一致してしまいWordPress標準機能の自動リダイレクト設定により遷移先がおかしくなっていた。

画像ファイル自体は削除する必要が無く、スラッグ自体を変更すれば問題はありません。

## 意外と気付けないスラッグの落とし穴
スラッグの重複により、遷移先がリダイレクトされてしまう現象は一度起こるとなかなか気付けない不具合でした。記事のみ委託をしているサイトなどは思わぬ落とし穴に引っかかってしまうかもしれません。

固定ページ、カテゴリー、メディアなど各所で作成されるスラッグは重複すると`{スラッグ名}-2`など後ろに数字が付いていくのは同じセクション内のみで、他は共有してくれません。

特定の記事のみで不本意なリダイレクトが発生してしまったら、まずはスラッグの重複を疑いましょう！
SPSS CADSアンインストール（Windows）

SPSS CADSをアンインストールします。

# CADSのアンインストール
まず、CADSを停止します。
Liberty版の場合は以下をコマンドプロンプトで実行して停止します。

c:\Program Files\IBM\SPSS\Deployment\8.4\Server\bin\stopServer.bat

```
C:\Users\Administrator>"C:\Program Files\IBM\SPSS\Deployment\8.4\Server\bin\stopServer.bat"
サーバー cdsServer を停止中です。
サーバー cdsServer は停止しました。
```

次に、IBM Installation Managerを起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/5fd6f7f4-a2b7-976a-4156-6538898bc228.png)


アンインストールを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/d3e343b8-fe75-6847-4932-e0c5d2f6fee5.png)

パッケージのアンインストールで「IBM SPSS Collaboration and Depoyment Services」にチェックをいれます。「IBM SPSS Collaboration and Depoyment Services -Essentials for Python」などのオプションもあれば、一緒にチェックを付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/38ebdd06-ab30-775a-3211-46b6bd355a3e.png)

「アンインストール」で削除していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/6211c142-268a-a195-2ce5-c0784c006e99.png)

# Db2のアンインストール
レポジトリとしてDb2を使った場合はDb2もアンインストールしておきます。

まずDb2を停止します。
Db2のコマンドウィンドウを管理者権限で起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/622fc28a-a8c3-e610-52f4-6a1396a7d600.png)

db2stop force
で停止します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/64d9ab7c-f32e-98a1-9112-ce84783d9d92.png)

Windowsの「アプリと機能」からDb2を「アンインストール」します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f030fa7c-29f4-a7e6-4c80-eff683cd6795.png)

# Modeler Serverのアンインストール
Modeler Serverも不要な場合はアンインストールしておきます。

まずModeler Serverを停止します。
Windowsの「サービス」から「IBM Modeler Server XX」を選び、右クリックで停止します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/b5aff0d5-8c52-3d9e-f943-2bacb39c1e89.png)


Windowsの「アプリと機能」からModeler Serverを「アンインストール」します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/81044a2c-688e-785e-dc2c-9915a231c471.png)

# その他のアンインストール
その他、
- IBM SPSS Collaboration and Depoyment Services Deployment Manger
- IBM SPSS Data Access Pack
- IBM SPSS Modeler Batch
も不要な場合は、Windowsの「アプリと機能」からアンインストールしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/2bc1bf82-c6da-56c5-bdef-4a562d073e0d.png)
SonarQubeってなに

## SonarQube
:::note
ソフトウェアの品質管理とコード品質向上を支援するオープンソースのプラットフォーム
静的コード解析、コードカバレッジの計測、重複コードの検出などの機能を提供
ソフトウェアプロジェクトの品質を監視・評価する
:::
## SonarQube機能

- **静的コード解析**
さまざまな静的コード解析ルールを使用してソースコードをスキャン
コーディング規約の遵守や潜在的なバグ、セキュリティ上の問題などを検出する

- **コードカバレッジ**
テストスイートの実行結果からコードカバレッジを計測
どの程度のコードがテストされているかを可視化

- **重複コードの検出**
ソースコード内の重複した部分を特定
効率的なコードリファクタリングをサポート

- **コードメトリクス**
ソースコードのメトリクス（行数、ファンクション数、クラスの複雑性など）を計測し、可視化
→プロジェクトのコードベースの理解や改善のための情報を提供

- **インタラクティブなダッシュボード**
プロジェクトの品質の概要やトレンドを可視化するダッシュボードを提供
ダッシュボードを使用してソフトウェアの品質に関する情報を把握し、改善策を検討できる

*****
**さまざまなプログラミング言語に対応
個別のプラグインや拡張機能を使用して統合できる
CI/CDツールとの連携も可能
ソフトウェア開発プロセスに組み込んで継続的な品質管理ができる**
git commitのメッセージを複数行いれる方法

Gitのコミットメッセージを複数行にする方法はいくつかある

- 複数の -m オプションを使用する方法

```sql
git commit -m "First line of the commit message" -m "Second line of the commit message"
```
- テキストエディタを開いて複数行のメッセージを入力する方法

```sql
git commit
```
このコマンドを実行すると、既定のテキストエディタが開く
エディタで複数行のメッセージを入力、保存して終了

- コミットメッセージを直接ファイルに書き込む方法

```r
git commit -F filename.txt
```
filename.txt には、複数行のメッセージを含むテキストファイルのパスを指定

:::note
複数行のメッセージを入力する際は、各行の先頭には適切なプレフィックスを追加するのがよい
EX)
 fix, feat, docs
:::
【PostgreSQL】CROSS JOINを試してみた

## 環境
CentOS7
PostgreSQL 11.18

## 試してみた
まずはそれぞれのテーブルにあるデータを確認しておこうっと。
``` sql
-- products
postgres=# select * from products;
  name  | price |     etc      
--------+-------+--------------
 りんご |   150 | 青森産
 メロン |  3000 | 北海道産
 ぶどう |   300 | 
 みかん |    80 | 
 梨     |   300 | 
 バナナ |   250 | フィリピン産
(6 行)

-- orders
postgres=# select * from orders;
  name  |  farm_name   | arrival_date | order_num 
--------+--------------+--------------+-----------
 りんご | 津軽ファーム | 2012-07-31   |        26
 みかん | みかん園     | 2012-07-31   |        16
 みかん | 紀州果樹園   | 2012-07-31   |        12
 ぶどう | 津軽ファーム | 2012-07-31   |         8
 梨     | 梨園         | 2012-07-31   |        14
 メロン | メロン農園   | 2012-07-31   |        13
(6 行)
```

それぞれ6行ずつデータが入っていた。
まずはfrom句での交差結合だ。

``` sql
postgres=# select * from products, orders;
  name  | price |     etc      |  name  |  farm_name   | arrival_date | order_num 
--------+-------+--------------+--------+--------------+--------------+-----------
 りんご |   150 | 青森産       | りんご | 津軽ファーム | 2012-07-31   |        26
 りんご |   150 | 青森産       | みかん | みかん園     | 2012-07-31   |        16
 りんご |   150 | 青森産       | みかん | 紀州果樹園   | 2012-07-31   |        12
(中略)
 バナナ |   250 | フィリピン産 | ぶどう | 津軽ファーム | 2012-07-31   |         8
 バナナ |   250 | フィリピン産 | 梨     | 梨園         | 2012-07-31   |        14
 バナナ |   250 | フィリピン産 | メロン | メロン農園   | 2012-07-31   |        13
(36 行)
```

`products`のりんごに対して、`orders`のりんご、みかん、みかん、ぶどう〜と結合していくのか。
`CROSS JOIN`を使っても同じように取得できるぞ。

``` sql
postgres=# select * from products cross join orders;
  name  | price |     etc      |  name  |  farm_name   | arrival_date | order_num 
--------+-------+--------------+--------+--------------+--------------+-----------
 りんご |   150 | 青森産       | りんご | 津軽ファーム | 2012-07-31   |        26
 りんご |   150 | 青森産       | みかん | みかん園     | 2012-07-31   |        16
(中略)
 バナナ |   250 | フィリピン産 | ぶどう | 津軽ファーム | 2012-07-31   |         8
 バナナ |   250 | フィリピン産 | 梨     | 梨園         | 2012-07-31   |        14
 バナナ |   250 | フィリピン産 | メロン | メロン農園   | 2012-07-31   |        13
(36 行)
```

外部結合よりも正直シンプルだからわかりやすいね。
ただ、使い所はいまいち思いつかない。

## 参考
https://oss-db.jp/dojo/dojo_info_06
Slack の slash command を利用し PagerDuty の Incident を作成する


## はじめに

PagerDuty の trigger を手動で行いたいというニーズが生じました。
Slack の slash command を使うと簡単に PagerDuty の incident を作成出来ます。
この記事はその方法をまとめました。

## 準備

PagerDuty と Slack の連携設定が終わっていることを確認してください。

設定が終わっていない方は以下記事を参考に設定してください。

https://support.pagerduty.com/docs/slack-integration-guide

https://slack.com/apps/A1FKYAUUX-pagerduty

## Incident を作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55950/cc9b0bef-02cb-20bb-1334-877ad23a886d.png)

Slack の text field に `/pd trigger` と入力し、 Enter 等で 送信してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55950/0bcf4c5b-ac14-0582-426f-bbc6f2ab5e15.png)

以下を入力し 「Create」 を Submit します

| 項目             | 内容                     | 例                              |
| :--------------- | :----------------------- | :------------------------------ |
| Impacted Service | 対象サービスを選択       | Qiita であれば Qiita 等         |
| Title            | 何が発生しているかを入力 | ○○ を利用したログインが失敗する |

- Impacted Service は PagerDuty の Service 設定によって異なります。何を選択すれば良いか迷う方は普段から PagerDuty を利用している方に確認してください
- Title は PagerDuty の Incident を受け取った人が一番最初に確認します。 On call 対象者の設定次第ですが、PagerDuty から電話がかかってくる際に読み上げられます 読み上げに使う言語は英語です。可能であれば英語で入力すると電話連絡を受けた方が対応有無の判断を速く行うことが出来ます

Assign To (担当者選択) や Priority (優先度), Description は必要に応じて記入すると良いでしょう。
迷ったら未選択、未入力で良いと私は考えます。 Incident が発生していることをいち早く担当者に伝えることが重要です。

## References

https://qiita.com/ymotomu/items/04afd0da5f0bf0863727

https://support.pagerduty.com/docs/slack-integration-guide

https://slack.com/apps/A1FKYAUUX-pagerduty

https://www.youtube.com/watch?v=4zc83gxCg2o
Swift5でバージョンとビルド情報を取得する

アプリ関連の文字列を1か所にまとめたSwift5用の```AppInfo```という構造体（struct）を用意する。

## AppInfoの構造体（struct）
```swift:AppInfo.swift
struct AppInfo {
    var appName : String {
        return readFromInfoPlist(withKey: "CFBundleName") ?? "(unknown app name)"
    }

    var appDisplayName : String {
        return readFromInfoPlist(withKey: "CFBundleDisplayName") ?? "(unknown app displayname)"
    }

    var version : String {
        return readFromInfoPlist(withKey: "CFBundleShortVersionString") ?? "(unknown app version)"
    }

    var build : String {
        return readFromInfoPlist(withKey: "CFBundleVersion") ?? "(unknown build number)"
    }

    var minimumOSVersion : String {
        return readFromInfoPlist(withKey: "MinimumOSVersion") ?? "(unknown minimum OSVersion)"
    }

    var copyrightNotice : String {
        return readFromInfoPlist(withKey: "NSHumanReadableCopyright") ?? "(unknown copyright notice)"
    }

    var bundleIdentifier : String {
        return readFromInfoPlist(withKey: "CFBundleIdentifier") ?? "(unknown bundle identifier)"
    }

    // Info.plistへの参照をDictionaryとして保持
    private let infoPlistDictionary = Bundle.main.infoDictionary

    /// info.Plistから関連する値 (文字列型)を取得
    private func readFromInfoPlist(withKey key: String) -> String? {
        return infoPlistDictionary?[key] as? String
    }
}


```

## こんな感じで使えます
```swift
        let appInfo = AppInfo()
        print(appInfo.appName)
        print(appInfo.appDisplayName)
        print(appInfo.version)
```

## 参考
https://stackoverflow.com/a/60363400
OpenVPNでのクライアントのIP固定化

OpenVPNでクライアントIPを固定化する際に下記記事を参考にした際にnetshでエラーが発生したため改善策をメモ

# 参考記事
https://qiita.com/11ohina017/items/c286d49519d2ff1fa2b8
https://lab4ict.com/system/archives/4787
# 原因
ifconfig-pushの2つ目の引数がサブネットマスクを指定しないといけないため
# 実行環境
- server
Ubuntu 20.04.5 LTS
OpenVPN 2.4.7 x86_64-pc-linux-gnu
- client
windows 10 Pro 22H2 
vpnuxClient 3.1.8559.12288
# 設定内容
- クライアント別の設定を有効にする
~~~
vi /etc/openvpn/server.conf
    #クライアント別設定ディレクトリの指定
    client-config-dir ccd
~~~
- クライアント設定の追加
~~~
vi /etc/openvpn/ccd/[クライアント名]
    #固定IPの指定　10.8.0.X 255.255.255.0
    ifconfig-push [割り振りたいIP] [サブネットマスク]
~~~
必要であればほかのクライアントも設定を行う
- サービスの再起動
~~~
service openvpn restart
~~~
ターミナル操作

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/9f45a53e-63a1-0aeb-c35a-2dd9af680062.png)
１：ターミナル
ターミナルは、PCに命令をすることができるアプリケーションです。

環境構築を実行するには CLI というアプリケーションが必要となります。MacにデフォルトでインストールされているCLIが ターミナル です。

 CLI（command-line interface）シーエルアイ（コマンドラインインターフェース）
CLIとは、キーボードからコマンドと呼ばれる文字を打ち込んでコンピュータを操作する仕組みのことです。

 GUI（graphical user interface）ジーユーアイ（グラフィカル ユーザー インターフェース）
GUIとは、CLIとは対照的に、マウスやトラックパッドから画面（グラフィック）を通してコンピュータを操作する仕組みのことです。

２：ターミナルを使う理由　
　先ほど、マウスなどを使った直感的に操作をすることができるGUIと、ターミナルのようにコマンドを使って操作するCLIがあると説明しました。

　GUIとCLIでは CLIの方が行える操作の数が圧倒的に多いためです。

　GUIのように全ての操作をグラフィカルに表現していては画面がメニューやボタンで溢れかえり、かえって分かりづらくなってしまうため、普段行わない操作についてはボタンが無かったり、そもそも簡単に操作できては危険なものであれば操作できないものである場合が多いです。