OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】素人が素因数分解のアルゴリズムを作ってみた

## 素人が素因数分解のアルゴリズムを作ってみた
　タイトル通りです。知識をそこまで持たない私が何かしらアルゴリズムを作ろうとし、対象にしたのが素因数分解でした。
　このアルゴリズムを作るにあたって私は、訓練のためなるべく情報を収集しないというルールを課しています。つまり、この記事のアルゴリズムは最適化や効率よりも理解しやすさに重きを置いているわけです。
　そういうわけなので、実用性のある素因数分解のアルゴリズムを探している方はwikipediaや他の記事を参考にすることをおすすめします。あくまでこの記事は初心者でもフローが理解できる素因数分解のアルゴリズムを紹介するといった趣旨です。
　また、アルゴリズムを作ることが目標だったので、特にこれを改良するというつもりもありません。動かない場合はアレですが、そうでない指摘はご容赦を。

 ## さっそくコードを載せる
 ~~~python:prime.py
 import math

def calcPrime(n:int) -> [int]:
    p=[1 for i in range(n+1)]
    p[0],p[1]=0,0
    k=2
    while k<=n:
        if p[k]==1:
            q=k*2
            while q<=n:
                p[q]=0
                q+=k
        k+=1
    return p

def disaN(n:int) -> [int]:
    p=calcPrime(n)
    m=int(math.log(n)/math.log(2))
    q=[0 for i in range(m)]
    i=2
    n0=n
    while i<=n0:
        if p[i]==1 and n%i==0:
            for j in range(m):
                if q[j]==0:
                    q[j]=i
                    break
            n//=i
            if n%i!=0:i+=1
            if q[-1]!=0:break
        else:i+=1
    q=[i for i in q if i!=0]
    return q
 ~~~

### 結果
~~~python:prime.py
if __name__=="__main__":
    print(disaN(77777))
~~~
~~~
[7, 41, 271]
~~~
　五桁くらいなら結構早いです。

### 収集"してしまった"情報
　私はなるべく情報を集めないようにしていましたが、ある問題を解決するために一つだけ調べてしまったことがありました。それは「ある整数の持つ素因数の個数をおさえられる値」です。一応この情報がなくとも`append`メソッドを使えば実装ができたのですが、`append`メソッドの処理は重いのでなるべく使いたくありませんでした。`append`を使った場合であれば情報収集なしでも実装でき、それでも動くはずなのでノーカン……にはなりませんよね……。

## アルゴリズムの解説
　まず、`calcPrime`という関数の中にはエラトステネスのふるい方式で素数を求めるというアルゴリズムが定義されています。これは`n`を引数として渡すと`n`までの素数を全部見つけ、`n+1`の長さのリストを作り、インデックスが素数になっている要素を`1`に、インデックスが素数でない要素を`0`にして出力する関数です。

>ちなみに、エラトステネスのふるい式素数探索は昔に手法を覚えていたので調べずに実装できました。

　次に、`disaN`という関数も引数`n`を取りますが、これは素因数分解したい数のことです。`disaN`では最初に`calcPrime`を呼び出し、素因数分解するための素数を集めます。
　素数が集まったら`2`(一番最初の素因数)から`n`(素因数分解したい数)までの素数に対してループ処理がされます。ここで行われる処理はいわゆる試し割り法的なもので、`n`が割り切れる素数を見つけたら`n`をその素数で整数除算し、素数をリストに保存。`n`は割られたまま次のループへ進みます。ただし`2^2=4`のように同じ素因数を持つ数があるため、次も同じ素数で割り切れそうだったら素数を変えずにブロック先頭へ戻らなければなりません。この処理が必要なために`for`ではなく`while`を使いました。
　最終的に、その数がもてる素因数の個数の限界まで素因数が見つかるか、最後の素数の判定が終わるとループを抜け、その時点で見つかった素因数をリスト化したものが返されます。

## 応用
　このアルゴリズムを利用することで、最大公約数や最小公倍数を求めるアルゴリズムも作ることができます。方法は二つの整数に対して素因数分解をし、その結果得られる二つのリストの共通部分と和集合をとる、というものです。ただ、正直この方法はめちゃくちゃ非効率です。真っ先に試した私が言うのも何ですが、このやり方はやらない方がいいでしょう。
gsutil コマンドを使用したオブジェクトのダウンロード

少し前に、業務で「gsutil」を用いてGCSに格納されているオブジェクトのダウンロードを行いました。

そこでダウンロード時に使用した「cp」コマンドについて、忘れないうちにオプションも含めて記してみます。

## オブジェクトのダウンロード（cp）
オブジェクトのダウンロードは「cp」コマンドを用いて実行します。
```
gsutil cp gs://[BUCKET_NAME]/[OBJECT_NAME] .
```
末尾の「.」は、コマンドを実行したディレクトリにダウンロードすることを表しています。
「.」がない場合はエラーとなるので、注意が必要です。
（指定したディレクトリへダウンロードを行う場合については後述します。）

## オプション
### 並列実行 （-m）
「-m」オプションは並列実行を表します。
「-m」を付帯すると、実施する操作を並列で実行できるため、パフォーマンスが大幅に向上します。
```
gsutil -m cp gs://[BUCKET_NAME]/[OBJECT_NAME] .
```
### 再帰実行 （-r）
「-r」オプションは、再帰実行を表します。
下記は、[OBJECT_NAME]配下で再帰的に実行する例です。
```
gsutil cp -r gs://[BUCKET_NAME]/[OBJECT_NAME] .
```
### ダウンロード箇所の指定
コマンドを実行する場合にダウンロード箇所を指定する場合、下記のように記載します。
例：「C:\hogehoge\xxxx」にダウンロードする場合
```
gsutil cp -r gs://[BUCKET_NAME]/[OBJECT_NAME] C:\hogehoge\xxxx
```

【参考】
https://cloud.google.com/storage/docs/gsutil?hl=ja
忘備録：ネットワーク解析・nmapの復習

◇-Pnコマンドはping通信を行わず通信ができる

試しに192.168.21.161 ユーザー/パスワード：userq1
・普通にやったら防御される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/35fc0272-9b16-967f-5a20-d4313300795f.png)

・オプションを付けてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/b6173949-0011-3849-f738-f573ca591baf.png)

サーバーに接続してみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/906669d4-05ac-f199-9992-fe4855e6eae2.png)

◇-pでポートの番号を明確にしないと表示されない場合がある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/4b7e9329-d6f4-3904-4cb4-7a9d6327fa82.png)

◇-sVでソフト名とバージョンが分かる
・オプションなし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/4c950657-2100-568a-d222-16e487f5ae04.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/46da4e56-65ea-d5c4-d055-1ac478d837e6.png)
・オプションを付けてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/37addb1f-8dd7-3f05-bb4b-7a96ef871441.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/7769d0a3-6e38-9a45-b5d5-84732b56ffad.png)

◇nmapをかけながらWiresharkを見てみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/f495bc06-4f8a-ab35-7964-eddb7f6039fc.png)
Wiresharkの通信状況が見える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/00af911a-718c-53ee-674e-1e1a68387a84.png)

ポート番号2043を調べてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477527/15f2ddfc-259c-e134-bfde-2aab53ebe928.png)
ABC377-Dは主客転倒とスタックを使えば尺取じゃなくても解けるよという話

https://atcoder.jp/contests/abc377/tasks/abc377_d

　ABC377-D、めちゃくちゃ難しかったですね。私（水）は Unrated で事後参加でしたが、本番だったらワンチャン解けなかったかもしれません。尺取法が想定解でしたが、別解を考えたのでその整理。

　結論から言うと、主客転倒したあとスタックで情報を整理すれば幾何解法ができるよ、という話ですが、順を追って説明します。

# まずシミュレーション

　まず愚直シミュレーションをします。以下、文中の $l,r$ を $x,y$ と表記します。
 
　シンプルな例として、

 ```
 2 7
 3 3
 5 6
 ```

　というものを考えてみます。題意を満たす $(x,y)$ の組み合わせは $(1,1),(1,2),(2,1),(4,4),(4,5),(5,5),(6,6),(6,7),(7,7)$ の $9$ 通りです。これを、$x,y$ 平面上にプロットすると以下のようになります。

```
0 0 0 0 0 1 1
0 0 0 0 0 1 -
0 0 0 1 1 - -
0 0 0 1 - - -
0 0 0 - - - -
1 1 - - - - -
1 - - - - - -
```
　ある `0` に対して、自身を含む左上にある領域はすべて `0` になるという考察が得られます。

# 主客転倒

　論理的推論が強い人にとってはシミュレーションするまでもないかもしれませんが、題意の条件、

- すべての $1 \leq n \leq i$ に対して、$(x,y)$ は $(L_i,R_i)$ を完全には含まない

　は、主客転倒すると、以下のように言い換えられます。

- ある $(L_i,R_i)$ について、それを完全に含むような $(x,y)$ はすべてアウトとなる

　これを $xy$ 平面上での話に言い換えると、ある $(L_i,R_i)$ 点が与えられた時、自身を含む左上にある領域はすべて `0` になる、ということになります。

　$y$ を固定して考えると「今までにでてきたすべての $L_i$ について最大のものよりも右のものが OK」と言い換えられ、公式解説で言っていることはこれになります。

　この「最大の $L_i$」を求めるのが実装上のキモとなりますが、これは、

- 事前計算してメモ（公式解法）
- セグ木
- $(R_i,L_i)$ のペアをソートして二分探索

　などの方法が考えられます。

# スタックで階段状にする

　$xy$ 平面を眺めていると、`0` で囲まれた領域は階段状になっていることがわかります。こういう時は、スタックを使うと上手くいきそうです。（より複雑な問題として、[ヒストグラム内の最大長方形](https://qiita.com/kuuso1/items/318d42cd089a49eeb332) などがあります）

　$(R_i,L_i)$ をソートして、$L_i$ が単調減少になるように圧縮していきます。別に単調増加でも単調減少でもいいのですが、なんとなく単調減少の方が好きなので。

　最初に番兵としてデカイ値を置いておいて、「スタックの末尾が自分以下の場合は、`pop` する」という操作を繰り返した後で `push` するようにすれば、操作後のスタックは必ず単調減少になります。

　上の例に対して、以上のような圧縮を行うと、以下のようなスタックが得られます。

```
st = (5,6) (3,3)
```

　この階段がなす面積はシミュレーションにより線形時間で求められます。この例なら、$2 \times 5 + 3 \times 3 = 19$ です。

 ```
0 0 0 0 0 1 1
0 0 0 0 0 1 -
0 0 0 1 1 - -
0 0 0 1 - - -
0 0 0 - - - -
1 1 - - - - -
1 - - - - - -
```

　階段の内側は「ダメな候補」ですので、全体の候補である $_8 C _2 = 28$ からこれをひいた $9$ が答えです。

　これだと、単調減少になるように圧縮される様子がよくわからないので、より複雑な例である、本文のサンプル $3$ に対して同様の圧縮を行った経過も示します。

```
st = (14,20)
st = (14,20) (5,19)
st = (14,20) (11,13)
st = (14,20) (11,13) (8,12)
st = (14,20) (11,13) (8,12) (4,11)
st = (14,20) (11,13) (8,12) (4,11) (1,6)
```

　$(5,19)$ が圧縮の過程で押しつぶされてた結果、階段状になっています。後は、このスタックをシミュレーションすれば（ダメな候補の）面積は簡単に算出できます。

# 実装例（Python）

https://atcoder.jp/contests/abc377/submissions/59306389
生成AIの業務利用ガイドラインを作成するうえでの参考資料

## はじめに
生成AIは、テキスト生成、画像生成、データ分析など、ビジネスの幅広い場面で使用され始めています。しかし、その利用にはデータのセキュリティ、プライバシー、法令遵守などの課題が伴います。こうした課題に対応するために、業務利用ガイドラインを整備する企業が増えています。本記事では、生成AIの業務利用ガイドラインを作成する際に役に立った参考資料を3つ紹介していきます。

## 生成AIガイドライン資料リスト
### 1.　日本ディープラーニング協会（生成AIの利用ガイドライン）
日本ディープラーニング協会（JDLA）の公式ホームページには利用ガイドラインのひな形が公開されており、【（例）会社】といった箇所を適切に変更するだけでガイドラインを作成できるようになっています。また、JDLAは日本国内でのAI分野における最先端の研究や技術を反映しており、最新情報に基づきガイドラインが随時アップデートされています。
JDLAのガイドラインは定款や規約を作成するのに向いていますので、ぜひご活用ください。

https://www.jdla.org/document/#ai-guideline

### 2.　東京都デジタルサービス局（生成AI利活用ガイドライン）
東京都のガイドラインは、公共機関としての信頼性・透明性を重視した内容で構成されています。そのため、企業においてもステークホルダーや顧客への信頼性を確保するための基準や考え方を参考にしやすく、信頼性の高いガイドライン策定が可能です。
また、実用例やリスク回避のための具体的なポイントが含まれており、グラフィカルなデザインでわかりやすく構成されているため、生成AIの利用頻度が少ない方にも理解しやすい内容になっています。

https://www.digitalservice.metro.tokyo.lg.jp/documents/d/digitalservice/ai_guideline

### 3.　東京都デジタルサービス局（文章生成AI活用事例集）
東京都デジタルサービス局のこちらの文章生成AI活用事例集も生成AIのガイドラインを作成する上で非常に参考になります。この資料では、さまざまな場面を想定した34の活用事例が紹介されており、適切なプロンプトの作成方法についても解説が付いています。これを参考に実用例やNG例を用意することで、ガイドラインを読む人々が正しく生成AIを効果的かつ適切に活用できるようになります。

https://www.digitalservice.metro.tokyo.lg.jp/documents/d/digitalservice/ai_prompt
【CSS】ブロック要素を中央を基準に左(右)にずらす

真ん中を基準に、左または右に要素を配置したかったので調べてみました。

このブロック要素を動かすとします。
```html
<div class="block">BLOCK</div>
```

## positionを使う

一度中央に寄せた要素をposition:relative;で基準位置を真ん中にしてから移動させる。

```CSS
/****** 要素に青い背景と白文字の装飾しています ******/
.block {
  height: 50px;
  width: 100px;
  background-color: blue;
  color: white;
  margin: 0 auto; /* 中央に配置 */
  position: relative; /* 現在の位置を基準にする */
  left: 100px; /* 右に100px移動 */
}
```

## transformを使う

CSSの関数。変形とか回転ができる。translateXで横軸移動を指定。

```CSS
/****** 要素に青い背景と白文字の装飾しています ******/
.block {
  height: 50px;
  width: 100px;
  background-color: blue;
  color: white;
  margin: 0 auto; /* 中央に配置 */
  transform: translateX(100px); /* 右に100px移動 */
}
```

## flexboxなら
親要素でdisplay:flex;とjustify-content:center;が指定されていればmarginの指定でも可能。
ただし、要素を移動させるtransform、positionと違い、marginは要素の余白を追加するというプロパティなので、margin-left: 100px;と指定しても100px移動するわけではないので注意。

また、flexboxで中央指定してあるとき、transformとpositionも利用可能。

## まとめ
flexboxを使用せず縦並びなどの時に使えます。
見積もりが高くなるのはなぜ？

# 見積もりが高くなるのはなぜ？

見積もりの話題は、開発に関わるすべての人にとって避けられないテーマです。
特に、「思ったより高い！」と言われると、エンジニアもプロジェクトマネージャー（PM）もどう対応するか頭を悩ませることが多いですよね。 
この記事では、見積もりが高くなる理由と、それが避けられない背景について書きました。

## 1. 高くなる理由って、何？

まず、見積もりが高くなる具体的な理由をいくつか挙げます。

### 未知の仕様や追加要求への対応
要件がふわふわしているプロジェクトでは、リスクや不確定な仕様に対処するため、バッファを設ける必要があります。
見積もりの際に、要件が全て決まっていない場合、追加仕様に対応するための予備工数が必要です。
このため、見積もりが膨らむことは避けられません。

### 技術的なリスクや難易度の高さ
新しい技術や未経験の領域での開発は、技術的なリスクが伴います。
技術的リスクが高い場合、チームのスキルセットと照らし合わせ、リスクをカバーする時間と予算が必要になるのです。
また、クライアントが簡単に出来ると思っていても、技術難易度が高いものがあったりもします。

### アクセス数の考慮
フロントエンドだけの案件であれば、CDN等でさばけるので良いのですが、バックエンドが絡むようなシステムであれば
サーバはピークを考慮すると何台ぐらいいるのか？
スペックは？
データベースへの負荷は？
などなど、アクセス数が分からないとリスクを考慮する必要があるため、高スペックなもので見積もりをすることになります。



### 依存関係の多さ
他のシステムとの連携やサードパーティAPIの利用が多いプロジェクトは、動作確認や統合テストにかかる時間も長くなりがちです。
こうした依存関係も見積もりが高くなる要因の一つです。

## 2. 高くなる説明が難しい！

見積もりが高くなる理由を、技術的背景がない方に理解してもらうことは難しいです。特に、以下の点で説明が難しくなるケースが多いです。
　
### 見えないコストを伝えにくい
エンジニアリングの世界では、品質や保守性、テストカバレッジといった「見えない価値」に費やすコストが多いです。
短期的には目に見えないため、なぜコストがかかるのかを伝えるのが難しいことがあります。

### 不確定要素が多い
不確定要素が多いプロジェクトでは、見積もりがざっくりとしたものにならざるを得ません。
こうした背景を伝えようとしても、「本当にそんなリスクがあるのか？」と疑われるケースもあります。

### 過去の実績や経験に基づく見積もり
見積もりが高くなる理由として、過去の経験に基づくことも少なくありません。
過去の類似プロジェクトでトラブルや追加対応があった場合、それを反映するために余分な工数を見積もることが多いです。
ただし、これは経験則であり、理解してもらうのが難しい部分もあります。

## 3. 見積もりが高くても納得してもらうためには

高い見積もりについて理解を得るには、単に数字を伝えるだけでなく、その背景や価値を伝える必要があります。

### 技術的負債を避けることの重要性
低コストで無理に開発を進めると、技術的負債が蓄積します。これが将来的に高額な修正コストを生むことを、具体例を交えて伝えると、価値を感じてもらいやすいです。

### リスクとコストの関係を図で説明
視覚的な資料を使って、リスクがどうコストに影響するかを説明すると、理解が進みやすいです。たとえば、リスクが増えるほどコストも増加する関係を図にすると、相手が見積もりの意図を把握しやすくなります。

### 工数削減の方法を具体的に示す
「もしコストを削減するなら、どの部分の機能を削る必要があるか」を具体的に示すことで、見積もりが高くなる理由を相手に納得してもらうことができます。


## 最後に
見積もりはプロジェクトの成否を左右する重要なステップです。
妥協したりしないようにしましょう。
vbaマクロでDTOを作成する

```
Sub GenerateJavaDTO()
    ' 変数の定義
    Dim className As String
    Dim row As Integer
    Dim dataType As String
    Dim variableName As String
    Dim javaCode As String
    Dim annotations As String
    Dim pathSeparator As String
    Dim outputFolder As String
    Dim filePath As String
    
    ' パスセパレータを取得
    pathSeparator = Application.pathSeparator
    
    ' クラス名をセルA1から取得
    className = Range("A1").Value
    
    ' アノテーションを設定（必要に応じて変更してください）
    annotations = "@Getter" & vbCrLf & "@Setter" & vbCrLf
    
    ' クラス宣言の開始
    javaCode = annotations & "public class " & className & " {" & vbCrLf
    
    ' 行の初期化
    row = 2
    
    ' 型と変数名をセルから読み取ってフィールドを生成
    Do While Not IsEmpty(Cells(row, 1))
        dataType = Cells(row, 1).Value
        variableName = Cells(row, 2).Value
        
        ' フィールドの宣言を追加
        javaCode = javaCode & vbTab & "private " & dataType & " " & variableName & ";" & vbCrLf
        
        row = row + 1
    Loop
    
    ' クラスの終了
    javaCode = javaCode & "}"
    
    ' 出力先のフォルダを取得
    If ThisWorkbook.Path <> "" Then
        ' ブックが保存されている場合、そのパスを使用
        outputFolder = ThisWorkbook.Path
        filePath = outputFolder & pathSeparator & className & ".java"
    Else
        ' ブックが保存されていない場合、保存先を選択
        #If Mac Then
            ' Mac環境ではGetSaveAsFilenameを使用
            filePath = Application.GetSaveAsFilename(InitialFileName:=className & ".java", _
                                                     FileFilter:="Java Files (*.java), *.java")
            ' キャンセルされた場合
            If filePath = "False" Then
                MsgBox "操作がキャンセルされました。"
                Exit Sub
            End If
        #Else
            ' Windows環境ではFileDialogを使用
            With Application.FileDialog(msoFileDialogFolderPicker)
                .Title = "出力先フォルダを選択してください"
                .AllowMultiSelect = False
                If .Show = -1 Then ' フォルダが選択された場合
                    outputFolder = .SelectedItems(1)
                    filePath = outputFolder & pathSeparator & className & ".java"
                Else
                    MsgBox "操作がキャンセルされました。"
                    Exit Sub
                End If
            End With
        #End If
    End If
    
    ' ファイルに書き込み
    Dim fileNum As Integer
    fileNum = FreeFile
    
    Open filePath For Output As #fileNum
    Print #fileNum, javaCode
    Close #fileNum
    
    ' ユーザーに完了を通知
    MsgBox "Java DTOクラスファイルが作成されました: " & filePath
End Sub
```

A1セル　クラス名
A2セル　型
B2セル　変数名
自作生成AI作成の道➀～概要ちょっと理解編～

自分が見返す用で作りました
素人です。
本をみながらやってみてるので、後々知識が増えたら改変するかも？

## 公開された大規模言語モデル
- Llama
- Llama2
- OpenCALM
- Japanese StableLM Alpha
とかあるらしい...

## 気になる単語

### ファインチューニング
**訓練済みのモデルを自分の用途に合わせて調整すること**...らしい

動くことができる車を自分のこだわりの部分だけパーツをアップグレードするイメージなのかな...（エンジンだけお高いやつにしたりとか）

般化と特化みたいな関係なのかな？


### RAG
**LLMによるテキスト生成に外部情報の検索機能を付けること**
私たちがやってるインターネット検索みたいなことを自動でしてくれるイメージ

自分の中ではRAGのイメージは以下の通り
- - -
**RAGなし**・・・生成AIは与えられた資料から返事をする

**RAGあり**・・・生成AIは与えられた資料を参照し、ない場合は検索してくれる
- - - 
RAGがあるほうがちょっと便利？

なぜ自分で生成AIを作るのか（素人のちょ～勝手なイメージ）
-
自分の場合は単純な興味だったが、一般的には以下のケースが考えられるのでは？

**会社ネコA
「生成AI使ってみたいけど、web通じてだと機密情報を入れられないし、ちょっと怖いな...」**

**会社ネコB
「自分たちが欲しい分野の情報だけ正確で深い内容を返してくれるとより便利よねぇ」**

**社畜犬C
「ならローカルで作ればいいんじゃない？」**
⇩
いざつくろう

**限界社会人D
「LLMは公開されてますからそれ使えばおもちゃ程度のチャットボットは作れますね...」
「あとはファインチューニングして、我々の利用したい形にカスタマイズして...」
「必要であれば外部情報を検索してくれるRAGを入れちゃえばあらかた使えるものになるのでは？」**

※ここら辺の会話は脳死で書いた適当なイメージです。
※あとさっき覚えた単語使ってみたかった

次→https://qiita.com/siruba_fall/private/20521f255ace17b692b7
Webアプリケーション開発での処理速度改善について

# はじめに
こんにちはプログラマー2年目の塚田と申します。

現在はWebアプリケーション開発に携わらせて頂いております。
開発後の確認段階ではありますが、発見したバグの中に処理速度についての不具合がありました。
何秒以内に画面に反映したい。とか何秒以内にこの処理を終わらせたい。とかです。
今回はその処理速度について私が行った解決策を書いてみます。

# 出力するログのレベルを落とす
ログとはユーザが行った操作やエラーを見れる便利なものですが、出力が多すぎるとパフォーマンスに影響を及ぼします。
今回の処理速度も不必要なログ出力が原因でした。
ただし、丸ごと消してしまうのも避けたい。。。
そんな時に活用できるのがログレベル。実行環境に合わせて出力を許可する場合と拒否する場合に区別してくれるものです。必要なときにのみログを出力することで処理速度改善に繋げることができました。

# DBへの問い合わせを最小限に
「検索」「登録」「削除」「変更」処理等、様々な場面でDBに問い合わせることがあると思います。ただし、DBに問い合わせるためにアプリケーションはさまざまな手順を踏む必要があり、回数が多いとその分だけ処理も遅くなりがちです。
できるだけ少ない回数で多くのデータをまとめることができれば、DBとのやり取りが減るため、機能の応答速度が向上し、処理速度改善につなげられます。


# おわりに
今回は「処理速度について」のお話でした。
今後も自分が体験したこと、そこから学んだ事を書いていこうと考えております。

以上、塚田でした。
JavaScriptでキーボード操作によるイベントハンドラ

# はじめに
こんにちはプログラマー2年目の塚田と申します。
今回はJavaScriptでキーボード操作によるイベントハンドラについて触れる機会があったので記事にしてみます。

# キーイベントについて
JavaScriptで使えるキーイベントは主に以下のような種類があります。
・keydown　-> キーが押されたとき
・keyup　　-> キーを話したとき
・keypress　-> 文字を入力可能なキーを押したとき

# 文字列指定によるハンドリング
event.keyプロパティを使用することでキーそのものの文字列を指定することができます。
以下の例は"Enterキー"を押したときに発火するイベントです。
まず***EventListener***を使い、特定のキー押下時のイベントをキャッチします。その中にif分で***event.key***プロパティから"Enter"を指定し、押された時の処理を記述します。
```
document.addEventLister('keydown',function(event){
    if(event.key === 'Enter'){
        //ここに処理を記述する
    }
})
```
このように記述することで文字列指定によるハンドリングが可能となります。

# キーコードを利用するハンドリング
こちらは上記のやり方とは違い、キーコードを使用してのハンドリングになります。
キーコードとはキーボードの各キーに割り当てられた数値の事です。
この数値を指定することで特定のキーのハンドリングが可能となります。
同じように"Enterキー"を押したときに発火するイベントを拾います。

```
document.addEventLister('keydown',function(event){
    if(event.keyCode === 13){
        //ここに処理を記述する
    }
})
```
書き方はほぼ文字列指定と変わりありませんが、
今回は***event.keyCode***プロパティを使用しています。
__event.keyCode === 13__　 ->　このように記述することで、
キーコード**13**の"Enterキー"を指定することが可能になります。

# おわりに
今回は「JavaScriptでキーボード操作によるイベントハンドラ」についてでした。皆さんも触る機会がありましたら是非参考にしていただけると幸いです。

以上、塚田でした。
パソコンをウイルスに感染させないように

こんにちは。大野です。

## 初めに
以前私が書いた記事ではWindows10のサポートが終了するという記事を書きました。サポートが終了したOSでは以降で説明するウイルスについてももちろん感染の確立が増加します。早めにWindows11への切り替えをおすすめします。

今回はそんなウイルスについてです。ウイルスもいろいろなものがありますが、大きく分けて説明することで少しでも興味を持ってもらい、皆さんが意識して被害を受けないようにしていきたいと思い簡単に説明していきます。

## ワーム型ウイルス
ワーム型ウイルスは自己増殖しながら、他のデバイスへ感染を拡げるのが目的の不正プログラムです。メールやネットワークに接続されているだけで感染する場合もあり、感染力が強いのが特徴です。感染するとパソコンが重くなるなどの症状が出ます。代表的なものとして、LOVELETTER、Slammer、MyDoomなどが有名です。

## トロイの木馬型ウイルス
トロイの木馬型ウイルスは、ほかのシステムやファイルに感染しないウイルスです。正規のアプリに偽装してユーザーがインストールすることで侵入します。パスワードやファイルの削除や個人情報流出などが主な被害事例です。代表的なものとしては、Emotet、Twitoorなどがあります。

## マクロ型ウイルス
マクロ型ウイルスは、オフィスソフトなどで利用できるマクロ機能を悪用して感染するウイルスです。メールに添付されたファイルを開くことで感染します。代表例のMelissaは、感染したパソコンからメールを大量に送信し、何人もの受信者が何の疑いもなく自ら添付ファイルを開くことで被害が拡散しました。

## ファイル感染型ウイルス
ファイル感染型ウイルスは、実行形式のファイルに付着しているウイルスです。ファイルサイズなどが変わることなどで発見しやすく、感染したことが判りやすいと言われています。代表例のPE_EXPIROは不正なJavaアプレットを介してPCに侵入し、情報収集機能を備えたウイルスでした。

## 最後に
以上、多くのウイルスが上記で上げたもののどれかに該当すると思います。そして、誰でも被害に合う可能性を有しています。感染経路を知っておくことで少しでも感染の可能性を下げていきましょう。

以上、大野でした。
ヘルプデスク業務にて学んだこと

こんにちは、お疲れ様です。
普段ヘルプデスク業務をしている水野と申します。

以前電話対応・ユーザ対応をするにあたって大切にしていることを
記載させていただいたのですが、その時とは別の内容について記載していこうと思います。
# 相手の目線に立つ
相手の目線に立つというのは、当たり前のことではあるのですが、
実践すると難しいことの内の１つだと思います。

「iPhoneの音量を上げるボタンってどれですか」なんて会話が生まれる相手に対して
「手順書の〇〇ページに記載があるのでそちらをご確認ください」では、まず解消に至りません。
相手の目線に立った回答をするには
会話をする中で相手がどこまでなら理解できるかを推し量りつつ、
何をしたくて、何が分からないかを聞き取り、回答をの伝え方まで考える必要があります。

上記の内容を「相手の目線に立つ」という言葉１つで分かった気になっていたので、
着任当初は痛い目をいたのを覚えています…

# 優先順位をつける
先の項目に続いて、記載することが恥ずかしいくらい当たり前なことですね。

ただし着任当初、自分は受け付けた順に対応を進めてしまう、もしくは、
問い合わせ受付時のユーザーの温度感に振り回されていました。

しかし問い合わせの内容によっては、
別部署を照会先として案内すべきケース、対応しないとユーザが仕事すらできないケース、困ってはいないが興味本位での照会してきたケース等様々な問い合わせがあり、
上記の例でいうと最後のケースは朝一に来た問い合わせであったとしても、
当日の夕方に回答しても問題無いような内容です。

しかし優先順位を考えないと焦っている人を待たせることになり、
最悪の場合クレームや、当たり散らかされることになりかねません。

自分のメンタルを守るためにも、仕事の優先順位はよく考える必要があります。

# おわりに
今回記載したことは一般的に見ても当たり前な内容だと思います。
自分も学生の頃からわかっていたことではあったのですが
実際に業務にあたって身をもって理解したことで、
今まで「分かっていたつもりになっていた」ことに気付くことができました。

技術的な内容ではありませんでしたが、エンジニアの方も業務を遂行する中で
自分の中で認識の変化等がないか、ふと自分の業務を振り返ってみていただけたらと思います。

以上、水野でした。
laravelでsail upしてlocalhostにアクセスしてもubuntuのデフォルト画面...【不具合対応】

## はじめに

laravelをいつも通り作って
```
./vendor/bin/sail up -d
```

よし、コンテナ立ち上がった！
```
npm run dev　（reactを使用）
```

よしよし！
localhostアクセスしてみよう！



なんじゃこりゃ。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832683/d9883bee-dc9c-e6ff-50d7-45dba6ac015e.png)
※ubuntuのデフォルト画面

 　
あれ、127.0.0.1だと表示される。。。
ならいいけど。
127.0.0.1でなぜ？


## 現象の正体

　
通常、localhost:80がsailで設定されているが
ポート80が別で使われていてsailが使えない状態になると
表示させたい画面が現れず、Ubuntuのデフォルト画面（自分の場合は）が現れるそう。。。

エラーで「ポート使われています。」とかXAMPPで教えてくれるのに・・・。


### またlocalhostとviteの設定がうまい食っていなくても起こる。
```
export default defineConfig({
  server: {
    host: '0.0.0.0', // ここでデフォルトホストを0.0.0.0に設定
    port: 5175       // 必要ならデフォルトのポートも指定
  }
})
```
上記のコードのようにhostを'0.0.0.0'で設定することでアクセスできる。
※別のエラーの処置の際記事でhost:trueにするとあったので変更したら。汗


## 対処
　
Laravelであればymlファイルのポートを変えるでもいいですが
サーバーを一旦止めてしまうのが手かと。
wsl環境で以下のコマンド
```
sudo systemctl stop apache2
```
　
僕の場合、どこで、何で、サーバーを立ちあげている目途が立たなかったので
そのような場合は上記のコマンドで解決できます！

では一旦コンテナを壊してもう一度セイルアップ！！
```
./vendor/bin/sail down
./vendor/bin/sail up -d
npm run dev (react vueなど動かしている人)
```


localhostアクセス！！
作ったものが映った！！
ParserScript 1.0と2.0の違い

:::note warn
現在、ParserScriptは非推奨です。
:::
　ParserScriptは1.0と2.0では全く違います。
　今回はその違いを二つ書きます（使えるコマンドが増えたことはノーカウント）。
# コードの長さ
　実はParserScriptは1.0と2.0でコードの書く量が全く違います。
　例えばBNFで
```bnf
<letter> ::= [ "a" ]
```
は、バージョン1.0では結果を格納するリストの長さを±0にするときは
```prs
CALL LETTER
AST LETTER
    RECORD
    MATCH "a"
    MATCH?
        DOWN NOW
        # 1.0でもDOWNPUSHを使えたが、二つ目に書くバージョン2.0だけが持つ機能がないため使えない
    END
    NOMATCH?
        BREAK
    END
LAST
```
と書いていたのですが、バージョン2.0で
```prs
CALL LETTER
AST LETTER
    VRECORD ""
    MATCH "a"
    DOWNPUSH
LAST
```
と、書けるようになりました。ちなみに、コードを書いていると頻繁にVRECORDとDOWNPUSHを使います。
# 解析できる文字列
　二つ目の違いはバージョン2.0ではパースする文字列の先読みができるところです。実は、バージョン2.0では結果を格納するリストにパースする文字列を格納するようになっています。つまりは、

$M1 = (V1, S1, P1)$
$M2 = (V2, S2, P2)$

$M2$を`BREAK`などで消すとパースする文字列は$M2$の$P2$ではなくその前の$M1$の$P1$になる

これにより、文字列を先に見て、フラグを立てたり、折ったりして先読みをし、バージョン1.0ではできないものまでパースできます。この時にVRECORDとDOWNPUSHの組み合わせが有利にはたらきます。
# 終わりに
　今回はParserScript 1.0と2.0での違いを紹介しました。ParserScriptは本当は自作言語作成のために作っています。でもまあ、それに取り掛かるのはバージョン3.0ができた時ですけどね。
OpenThaiLLM-Prebuilt-7Bは「แม่อย่าเก็บไว้คนเดียว」をどうトークナイズするのか

「[OpenThaiLLM-Prebuilt-7B](https://huggingface.co/nectec/OpenThaiLLM-Prebuilt-7B)」が[NECTECからリリースされた](https://medium.com/nectec/openthaillm-prebuilt-release-f1b0e22be6a5)ので、トークナイザを試してみることにした。

```
>>> from transformers import AutoTokenizer
>>> tkz=AutoTokenizer.from_pretrained("nectec/OpenThaiLLM-Prebuilt-7B")
>>> print(tkz.convert_ids_to_tokens(tkz("แม่อย่าเก็บไว้คนเดียว")["input_ids"]))
['à¹ģà¸¡', 'à¹Īà¸Ńà¸¢', 'à¹Īà¸²', 'à¹Ģà¸ģ', 'à¹ĩà¸ļ', 'à¹Ħà¸§', 'à¹ī', 'à¸Ħà¸Ļ', 'à¹Ģà¸Ķ', 'à¸µà¸¢à¸§']
```

「[แม่อย่าเก็บไว้คนเดียว](https://qiita.com/KoichiYasuoka/items/851bbe0299f43c7eb4e9)」をトークナイズしてみたが、マズイ気がする。`decode`してみよう。

```
>>> for t in tkz("แม่อย่าเก็บไว้คนเดียว")["input_ids"]:
...   print(" ",tkz.decode(t))
...
  แม
  ่อย
  ่า
  เก
  ็บ
  ไว
  ้
  คน
  เด
  ียว
```

ううう、「[Meta-Llama-3.1-8B](https://huggingface.co/meta-llama/Meta-Llama-3.1-8B)」と[全く同じパターン](https://qiita.com/KoichiYasuoka/items/7b25777e970c521860ca)で、単語の切れ目が「แม่」「อย่า」「เก็บ」「ไว้」「คน」「เดียว」になっていない。マトモに切れているのは「คน」くらいで、残りはボロボロだ。タイ文字クラスター(คลัสเตอร์อักษรไทย)も完全に無視してトークナイズしているし、これでどうやってタイ語を処理すればいいんだろ。
【JavaScript】reduceを浅く理解した

# はじめに
こんにちは、shutamoです。

JSを勉強中に出てきたのでちょいとメモしておきます。


# いったい何？

配列に対して使う関数。
繰り返し処理ができる。

# 試してみる
```javascript:test.js
         const array =[1,2,3,4,5];
         const total = array.reduce((prev,current) =>{
             return prev + current;
         });
         console.log(total);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741258/d7185df1-716f-5db7-ed28-96111983796f.png)
はい～

# 何が起きているのか

最初prevに1、currentに2が入ってきます。
で、returnで3が返ってきますよね？そしたらprevに3が入るんです。

次にprevが3、currentが3になります。
で6になってreturnされたものがprevに入ります。

でprevが6、currentが4...

最後currentが5になったら終わりです。
ほんで15がtotalになるわけですね。
OSPF - Area Filtering

## Operating Environment
OS : Windows 11
VM : VMware® Workstation
Software：CML 2.7.2
Hardware：N/A

## Network Topology
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923257/37310411-64dc-23cf-b8ab-e65c52806cbc.png)

## Why should you use area filtering whlie there is alreagy filtering with summarization?
### If you need to 172.16.2.0/24 be present in area 0 but removed in area 34, you can not make it using filtering with summarization.
#### R3's OSPF routes before area filtering
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923257/a4c91629-1401-edfc-fcd1-203679361e77.png)
#### R4's OSPF routes before area filtering
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923257/947119d5-b340-aced-c514-5efcc6f83bc5.png)

:::note warn
Sorry about that assign a wrong hostname, it should be R4. 
:::

## Beacause ABRs with summarization filtering will transform Type 1 LSAs to Type 3 LSAs, so R3 won't transform 172.16.2.0/24 Type 3 summary LSAs to other areas' ones. Even we give it a try to configure summarization filtering in R3, it won't work.
### Configure filtering with summarization in R3
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923257/d7b75a42-6674-cdbe-8cce-7119cf4f87fc.png)
### Confirm configuration in show run output
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923257/bb5b8a19-b7c1-7c05-c935-cab0a01ea83d.png)
### There is no routes summarization in R4's routing table.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923257/28284234-02e5-8b75-a487-67533bbb965a.png)

## Area filtering configuration and confirmation
### Since Area Filtering can filter inbond and outbound LSAs, so Let's make 172.16.1.0/24 romoved in area 0, make 172.16.2.0/24 be present in area 0 and romoved in area 34.

##### Area Filtering Configuration in R2
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923257/79ce26cb-2db3-a0e2-6ad1-6bc648615b89.png)
#### R3 - 172.16.1.0/24 removed in area 0
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923257/5893e963-3b43-a1fa-ad44-35e7f575443d.png)
##### Area Filtering Configuration in R3
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923257/efb9457d-325b-b6ae-e57f-06d89f6ae708.png)
#### R4 - 172.16.2.0/24 removed in area 34
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923257/8c22fe34-23b6-b3e6-8226-78d70c2876ea.png)
期限、切ってますか 

## 1. はじめに
仕事を振られたとき、
「いつまでにやりますか？」
この質問に即答できない場合、あなたはこのタスクをやる気がないです。
　
あなたが上司だったら、部下に仕事を渡すときに期限をきる。
あなたが部下だったら、振られた仕事に自分で期限をきる。

期限、きってますか。
　

## 2. 期限設定の重要性とは？

### 1. **優先順位の明確化**
あたりまえですが、期限をきらないとタスクがいつまでに完了しなければならないかが分かりません。
仕事の優先順位もつけられません。
仕事の依頼をするとき、依頼されたとき、期限を切りましょう。

### 2. **仕事に緊張感がうまれる**
期限があることでタスクに対する緊張感が生まれます。
「あと〇日で終わらせなければ」という意識が、どうやってやるかを考えるきっかけになり、あなたの脳みそをフル回転させます。

### 3. **進捗確認と管理**
期限を設定することで、進捗が予定通りかどうかを上司やプロジェクトメンバーが確認しやすくなります。
途中で調整が必要な場合、早い段階で発見できないとリカバリも出来ませんから。
先手を打たないと後でシヌ！

## 3. 期限設定のコツ

### 1. **SMARTな期限を設定する**
特に重要なのが、「具体的 (Specific)、測定可能 (Measurable)、達成可能 (Achievable)、関連性のある (Relevant)、期限を持つ (Time-bound)」というSMARTな基準を意識することです。  
例：「次のミーティングまでに」よりも「来週金曜日の17時までに資料を提出する」と具体的にすることで、タスクの進行がイメージしやすくなります。

### 2. **なるべく細かくタスクを分割し、小さな期限を設定する**
大きなタスクには小さな期限を設けることも効果的です。
例えば、3か月後が期限のプロジェクトであっても、1週間ごとのマイルストーンを設定すると進行状況が可視化され、修正が容易になります。
弊社ではタスクを2時間単位で実行可能なレベルまで分割しているメンバーもいます。

### 3. **「バッファ」を確保する**
予想外の事態は必ず発生します。絶対。
あらかじめ余裕をもったバッファ期間を設定しておきましょう。

### 4. **パーキンソンの法則**
「仕事の量は、完成のために与えられた時間をすべて満たすまで膨張する」
期限を切らないと、そのタスクの実行時間は膨らみ続けます。

## 4. まとめ
「明日やろうは馬鹿野郎」
期限きったらやりとげましょうね。
Excel マクロ・VBA 困ったとき用(更新ver2.0)

# 履歴
実施したことを残していく
業務で困った際の参考にできることも理想とする
- 20241031(更新ver1.0):値の検索までを投稿
- 20241117(更新ver1.1):Outlookメール抽出マクロ(未完成)の追加
- 20250609(更新ver2.0):使用頻度の高いコード早見へ変更

# 変数の型
- 文字列型
``As String``
- 整数型
``As Long``
- 論理型
``As Boolean``

# よく使うコード
- 最終行の取得　※1
``Dim lastRow As Long``
``lastRow = Cells(Rows.Count, "列番号を入力").End(xlUp).Row``

- ある条件まで処理を続けたい
(A列に「情報」というワードが入力してあるとする。「情報」の1つ下のセルから繰り返し文を実行したい場合に「情報」が入力してあるセルの行番号を取得する)
````
Sub test()

Dim i As Long
Dim kiten As Long

    i = 1
    
    Do Until Cells(i, 1).Value = "情報"
    i = i + 1
    Loop
    
    kiten = i
    MsgBox kiten 'A列の「情報」が入力してある行番号が出力される
    
End Sub
````
【Ansible】 ansible-vault とは

# ansible-vault とは

ansible-vault は、 Ansible の Playbook の内容を暗号化・復号化するためのコマンドです。

# 利用場面

サーバー設定を行う Ansible Playbook の中身には、データベース接続時のパスワードや SSH の秘密鍵など、秘匿しておきたい情報もたいてい含まれています。
こういった公開すべきでない情報については、 ansible-vault を用いて暗号化しておきましょう。

# 暗号化

ファイルを暗号化するには、 ansible-vault encrypt を使います。
以下は、ローカルから対象サーバーにコピーする SSH 秘密鍵ファイルを暗号化する例です。

```yaml:task の一部抜粋
- name: copy ssh key
  copy: src=home/foobar/id_rsa dest=/home/foobar/.ssh/id_rsa owner=foobar group=foobar mode=0600
```

```shell:ansible-vault による暗号化
$ ansible-vault encrypt roles/server01/files/home/foobar/ssh/id_rsa
New Vault password: 
Confirm New Vault password: 
Encryption successful
$
```

こうやって暗号化した状態で Playbook 一式を保存します。

# 復号化

一方、復号化する場合は、 ansible-vault decrypt を使います。

```shell:ansible-vault による復号化
$ ansible-vault decrypt roles/server01/files/home/foobar/ssh/id_rsa
Vault password: 
Decryption successful
```
# Playbook の実行

Playbook を実行するときは、 --vault-password-file オプションか、 --ask-vault-pass オプションをつけます。つけないと、以下のように ansible-vault で暗号化したファイルが復号化できず、エラーとなります。

```
TASK [server01 : copy ssh key] ********************************************
fatal: [server01]: FAILED! => {"msg": "A vault password or secret must be specified to decrypt /home/foobar/ansible/roles/server01/files/home/foovar/id_rsa"}
```

--vault-password-file オプションの場合は、 `--vault-password-file=~/.vault-password` といったようにパスワードを記述したファイルのパスを指定します。

```shell:--vault-password-file の例
$ ansible-playbook -i aws_ec2.yml server01.yml --ask-vault-pass=~/.vault-password
```

--ask-vault-pass オプションの場合は、 Playbook 実行時に対話的にパスワードを入力します。

```shell:--ask-vault-pass の例
$ ansible-playbook -i aws_ec2.yml server01.yml --ask-vault-pass
Vault password:
```

# グッドプラクティス

パスワードなどの暗号化したい変数を一つの変数ファイルにまとめてタスクの初めの方で (always タグを付けて) 必ず読み込むようにするとよいでしょう。

```yaml:tasks/main.yml の冒頭
---
- include_vars: secret.yml  # パスワードなど暗号化したい変数をまとめた変数ファイル
  tags:
    - always
```
WEBデザイン　HTML/CSS基礎


 ・1.  下記のhref="の後の「.」は逆に入力すると反映ができないので省く

  <link rel="stylesheet" href="./css/reset.css">
  <link rel="stylesheet" href="./css/style.css">

「.」を省いたhtmlの書き方

      <link rel="stylesheet" href="css/reset.css">
      <link rel="stylesheet" href="css/style.css">

2.  HTML５の下記urlからコピペーしReset.cssにコピペをしたが、スペルの訂正があった。

/*
html5doctor.com Reset Stylesheet
v1.6.1
Last Updated: 2010-09-17
Author: Richard Clark - http://richclarkdesign.com
Twitter: @rich_clark
*/

スペルチェックした結果、
Stylesheet→Style.cssに修正

修正した一部分は以下の通り
/*
html5doctor.com Reset Style.css
v1.6.1
Last Updated: 2010-09-17
Author: Richard Clark - http://richclarkdesign.com
Twitter: @rich_clark
*/
参照URL:https://html5doctor.com/html-5-reset-stylesheet/

3.　Googleフォント「Noto sans JP」
の「Regular」と「Bold」を選択して「linkタグ」が今のサイトにはなかったので、下記urlから「Get code embed」をした。

参照URL:https://fonts.google.com/selection?query=Noto+sans+JP

4.　htmlのブロックの構造は「ボックスモデル」という仕組みになっている。
それは、内側から外側に向かって「padding」「,border」,「margin」

これを人間に例えると、
marginは隣人との距離
borderは衣服
paddingは脂肪
面白い発想だ。

class名を指定するときは、クラス名の前に必ず「.（ピリオド）」をつけること。
ピリオドを忘れてしまうとCSSの記述が反映されないので気をつけよう。

【3】オリジナル解説文
・
【4】言語化してみての気づき（任意）
・Githubを使って残してみようと思う。
・Githubデビューしてみた。難しいイメージがあったが、やってみたら、意外に簡単だった。
https://github.com/Tomoko8Sept/WEB-Design/issues/1#issue-2626691103
[Swift] gpt-4-vision-previewモデルが使えない。

[MacPaw/OpenAI](https://github.com/MacPaw/OpenAI/tree/843e087929aa806adb611dbca93f9a4a7f28be04?tab=readme-ov-file#completions) を参考にgpt-4-vision-previewモデルを使ったアプリの開発を進めていたところ、以下のエラーが出た。

![スクリーンショット 2024-10-29 16.17.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784072/157ffcd1-3e49-7c53-f8a0-2d9d6fc9b4f3.png)


```
Error during image analysis: APIErrorResponse(error: OpenAI.APIError(message: "The model gpt-4-vision-preview has been deprecated, learn more here: https://platform.openai.com/docs/deprecations", type: "invalid_request_error", param: nil, code: Optional("model_not_found")))
```

[OpenAIのプラットフォーム](https://platform.openai.com/docs/deprecations)によると、
>On June 6th, 2024, we notified developers using gpt-4-32k and gpt-4-vision-preview of their upcoming deprecations in one year and six months respectively. As of June 17, 2024, only existing users of these models will be able to continue using them.

とのこと。
モデルをgpt-4oに変更したら解決できた。
初心者プログラミングバイト生活九日目【うおーーー最高】

今日はねーすごい気分が良くてね。まぁと言うのもシーンが作成できたんだよね。てどうやって作成できたかって言うとその今あるプログラムを見ながらパソコンのメモメモアプリに関数とかどういう順番でどういう順番で呼び出されたり繰り返されたりとかするんかっていうのをメモにまとめたらまぁもうかなり頭がすっきりして理解できたっていう感じ。まぁまだまだだと思うけどね。

でもあのシーンができて、でもいざビルドして焼いたんだけどなんか画面が映らなくてまぁちょっとさすがにちょっといろいろ調べたけど、もう解決できんくて正社員の方に聞いて原因は何個かあったんだけどまぁ1番大きな原因は普通にプログラムのミスがまずあってそれ+その後改善した後にもう1個出てきた問題がメモリーの領域が足らずにその上書きしちゃっててそれが原因やったね。まぁあのその子供用のさぁおもちゃのパットやからさぁあぁメモリを限られとって安いの使ってるから使ってるっていうかそのまま予算があれやからだから、それが原因で写ってなくて BGMがすごいね。メモリとったからBGMをロードするのやめてそしたらねきれいになったでの後まぁゲーム作ったりしてやっとったんやけど途中でなんかなんか画像が全部ぐちゃぐちゃになってね。これなんでかなぁと思っていろいろ試したけどまぁもうそのバイトの時間がもう会社が終わる時間って言うのとまぁ俺が腹減ったからって言うのでまぁ一旦やめにしたんやけどまぁ今のところ多分あれなんじゃないかなと思ってて、あのそのやっぱりメモリメモリが足りてないんじゃないかなぁと思ってるわけですわね。まぁとにかくね。今日はねーなんかすごいスッキリしたというかなんか嬉しかったというか心が映ったって言う。まぁ最終的にはその正社員の方のね、力をお力を借りてっていうことなんだったんだけど、まぁまままままぁでも嬉しかったね。でもゲームできてミニゲームなんだけど、簡単な内容そのおもちゃのパットは加速度差がついてでゲットアクセレレーションXとか書いて加速度を取得できるんだけど、それ使ってプレイヤーを横に動かす横横板だけを動かして画面左の真ん中らへんに砲台があって、そこから玉が出るよね上からアイテムが落ちてきて、プレイヤーはそのアイテムを回収するんだけど、たまにボムが落ちてきて、そのボムは包材を膨大から出る玉で打ち落とすみたいで、その画面をタップしたら出るで、画像を表示して時間の変数時間変数で横に動かして画面の端座標があるから、xが556 50になったら表示を消してスリープ状態にしてそしたらもっかいタップできるようにしてって言うフラグフラグ使ってね。タップさせてまたスリープをオフにして表示させてタイマーで動かす。毎回初期化するって感じかなでもね、プログラミング下手なんか知らんけど、簡単タイマーが6個位あってなタイマーそんなあっていいのかなあみたいな思ったりもするけどまぁいいかそんな感じかな終わり。
後輩との接し方について考えてみる。

## 後輩との接し方について考えてみる
今参画しているプロジェクトで、後輩(×年齢 〇立場)にレクチャーすることが増えてきて、もっと後輩とうまく接する方法がないかな～と思っている今日この頃です。

そこで皆さんが、日々実践している後輩との接し方について教えてください。
逆に後輩の立場でこれは嫌だな～っていう接し方があれば是非m(_ _"m)

自分としては、以下を心掛けるようにしています。
- ゆっくり話す
- ちょっと声は高め
- コードレビューの際に、良い点を１つでも挙げる
- 断定的な言い方はできるだけしない
- チャットで絵文字を使うようにする
.gitignoreの書き方

<!-- gitignoreの書き方 -->

## はじめに

gitを使う上で割と大事な.gitignoreについての覚書です。

## .gitignoreとは

``.gitignore``は、ローカルのディレクトリには含まれているが、Gitのリポジトリに複みたくないファイルやディレクトリを指定するためのファイルです。

これを適切に設定することによって、以下のようなファイルをリポジトリに含める必要がなくなり、何かと便利です。

- ``.env``ファイルなど、トークンやAPIキー、パスワードなどの機密情報を含むファイル
- ローカルで生成されるキャッシュファイルやログファイル
- メモなど、開発者個人の作業ファイル
- 開発中のため、まだリポジトリに上げるべきではないファイル

## 書き方

``.gitignore``は、リポジトリのルートディレクトリに配置します。この名前でファイルを作成し、以下のように無視したいファイルやディレクトリを記述します。

### コメント

``#``で始まる行はコメントとして扱われます。

```python
# これはコメントです
```

### ファイル

無視したいファイル名を指定します。``.gitignore``の場所からの相対パスで指定します。

```python
# .envファイルを無視
.env
# /bots/test.pyを無視
/bots/test.py
```

### ディレクトリ

ディレクトリを指定する場合は、``/``で終わるようにします。これも同様に``.gitignore``の場所からの相対パスで指定します。

```python
# cacheディレクトリを無視
cache/
/bots/cache/
```

### ワイルドカード

``*``などのワイルドカードを使うことができます。

```python
# .txtファイルを無視
*.txt
# test_から始まるファイルを無視
test_*
```

以下のような応用があります。

#### 全ディレクトリ内の特定ファイルの無視

```python
# 全ディレクトリ内の.logファイルを無視
**/*.log
```

#### 全ディレクトリ内の特定ディレクトリの無視

```python
# 全ディレクトリ内のcacheディレクトリを無視
**/cache/**
```

### 特定のパターンを無視しない

``!``を使うことで、特定のパターンを無視しないようにすることができます。

```python
# tempディレクトリの中のmain.pyファイルは無視しない
!/temp/main.py
```

## 注意

元々リモートリポジトリに上がっているファイルを``.gitignore``に追加しても、リモートリポジトリには影響しません。``.gitignore``に追加したファイルは、新たに追加されるファイルに対してのみ有効です。

そういう時は、一回リモートリポジトリから削除してから、``.gitignore``に無視したいファイル名を追加し、再度プッシュしてください。

## まとめ

``.gitignore``を適切に使うことで、よりよいGitライフを送りましょう。

## 参考

[【Python/Git】pycacheをgit ignoreする #初心者 - Qiita](https://qiita.com/konbraphat51/items/4602ebcfcdb6e03c16bd)

[.gitignore の書き方](https://qiita.com/inabe49/items/16ee3d9d1ce68daa9fff)
MacのTeamsからアカウント情報を削除する

# Microsoft　Teams for Macからアカウント情報を削除する

## はじめに
MacのTeamsで使用していないアカウントの情報がいつまでも表示され困っていませんか？

## How to fix
1.Teamsを修了する
2.キーチェーンアクセス.appを開く
3.キーチェーンアクセスの設定を開く
4.「デフォルトキーチェーンをリセット...」をクリック
![スクリーンショット 2024-10-31 20.17.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1072912/57f914d6-928e-a6f7-2e4a-837499214fdc.png)
5.再度Teamsを起動して情報が削除されていることを確認する
![スクリーンショット 2024-10-31 20.18.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1072912/0e32582b-dced-7a18-3717-664cdfa1136a.png)

## 注意事項
TeamsだけでなくExcelやWordをはじめ、SlackやTouchIDの情報などの基本的に全てのログイン情報が削除されます
DICOM画像をPythonで可視化しようとしたら一工夫必要だった話

# はじめに

最近、DICOMのファイルを機械学習する必要があって色々調べていたらPythonでは簡単に読み込むライブラリがあるとのことでした。
Pillowを使うと画面に表示ができるのですが、そこから少し加工しようと思ってOpenCVに入れるとなんかおかしい...

これは、そんなライブラリでやりたいことができるようになるまでの物語である。

# 使用環境

- Python 3.10.x
- pydicom 2.4.4
- Pillow(PIL) 9.0.1
- OpenCV(cv2) 4.10.0

# 使用データ

日本放射線技術学会画像部会のデータを使用します。

http://imgcom.jsrt.or.jp/download/

# 一般的なやり方

ネットで検索すると以下の方法が紹介されていました。

```py:
import pydicom
from matplotlib import pyplot as plt

ds = pydicom.read_file("JPCLN0xx.dcm")
img = ds.pixel_array

plt.imshow(img, cmap='gray')
plt.show()
```
![Unknown.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114240/5531b5ca-85f7-f00d-3e22-2cff77a9a361.png)

できた。

これを画像データとして使用するには、以下の手順でファイルに保存して再読み込みします。

```py:
plt.imsave('JPCLN0xx.jpg', img, cmap='gray')
```

できたけど、なんだかちょっと嫌な気がする。

# OpenCVで使えるようにしてみる

## とりあえず読み込む

画像データをOpenCVに読み込ませて表示させてみる

```py:
import cv2
from PIL import Image as im 
from IPython.display import display, Image

_, buf = cv2.imencode(".jpg", img)
dat = Image(data=buf.tobytes())
display(dat)
```
![Unknown2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114240/d0e22d9b-2546-11a4-9fd0-af68fd4b30b4.png)

...真っ白。

## 少しデータを見てみる

パラメータの最大値を確認

```py:
mx = 0.0
for x in range(img.shape[0]):
    for y in range(img.shape[1]):
        if mx < img[x, y]:
            mx = img[x, y]

print(mx)
```

出力結果は

```
4095
```

これが原因っぽい。

## 考察

通常パソコンで使用される色の階調は0〜255だけど、DICOMでは0〜4095となっているみたい。
なので、4096階調を256階調に変換してやればいいのかもしれない。

## データを加工してみる

imgの全ての値を4096で割って256をかけてみます。

```py:
img2 = img / (mx + 1) * 256.0

import cv2
from PIL import Image as im 
from IPython.display import display, Image

_, buf = cv2.imencode(".jpg", img2)
dat = Image(data=buf.tobytes())
display(dat)
```
![Unknown3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114240/06490521-9c58-2d6c-7de1-63fd88f75b9a.png)

できた！

この画像を使ってアノテーション作業を行なって、実際の処理は元の4096階調を使うようにして機械学習させればいいかも！

別にmatplotlibでもできるけどね、これまで作ってきたスクリプトがOpenCVを使っているのでそれと同じようにできれば楽かな〜って感じでした。
terraform plan で JSON に発生した差分 `whitespace changes` の話

EventBridge Scheduler で Lambda に渡すパラメーターを設定している時[^1]に、terraform plan で JSON に差分が発生しました。

出た差分はこんな感じ。真ん中の方に `whitespace changes` って書いてあるやつです。

[^1]: 実際には [tfmigrate](https://github.com/minamijoyo/tfmigrate) を使って import するために `tfmigrate plan` したとき

```
$ terraform plan
（省略）
Terraform will perform the following actions:
  
  # module.hoge.aws_scheduler_schedule.hoge_schedule will be updated in-place
  ~ resource "aws_scheduler_schedule" "hoge_schedule" {
        id                           = "default/hoge"
        name                         = "hoge"
        # (5 unchanged attributes hidden)

      ~ target {
          ~ input    = jsonencode( # whitespace changes
                {
                    scheduled_time   = "<aws.scheduler.scheduled-time>"
                }
            )
            # (2 unchanged attributes hidden)

            # (2 unchanged blocks hidden)
        }

        # (1 unchanged block hidden)
    }

Plan: 0 to add, 1 to change, 0 to destroy.
```

これを差分が出ないように修正した話です。

## 試したけどうまくいかなかったこと

`whitespace changes` なので、JSON に空白が多かったり少なかったりするのが問題かと思ったのですが、差分には具体的にどこがいけないか表示されていないので試行錯誤しました。

- `jsonencode` で囲ってみたり、heredoc で書いてみたり
    - `jsonencode` は `<` `>` のエスケープがあるので、それも影響していそう
    - [jsonencode - Functions - Configuration Language | Terraform | HashiCorp Developer](https://developer.hashicorp.com/terraform/language/functions/jsonencode)
- AWS Console で JSON にスペース入れたり消したり
    - `terraform console` で `jsonencode` した結果などを参考に元のJSONを変更
    - 結局 plan しても `whitespace changes` としか表示されなかったので断念

```terraform:普通に定義
resource "aws_scheduler_schedule" "hoge_schedule" {
    （省略）
    input = {
      scheduled_time = "<aws.scheduler.scheduled-time>"
    }
  }
}
```

```terraform:jsonencode使用
resource "aws_scheduler_schedule" "hoge_schedule" {
    （省略）
    input = jsonencode({
      scheduled_time = "<aws.scheduler.scheduled-time>"
    })
  }
}
```

```terraform:heredoc
resource "aws_scheduler_schedule" "hoge_schedule" {
    （省略）
    input    = <<-JSON
      {
        "scheduled_time": "<aws.scheduler.scheduled-time>"
      }
    JSON
  }
}
```

## 最終的にどうやって解決したか

AWS CLI で取得した文字列と同じものを設定しました。
（terraform plan の差分は、terraform 内部で AWS の API を使って取得したものと比較したものなので、それをみると良い、というアドバイスをいただきました。）

```
$ aws scheduler get-schedule --name hoge_schedule
（省略）
"Input": "{\"scheduled_time\":\"<aws.scheduler.scheduled-time>\"}",
```

`"{\"scheduled_time\":\"<aws.scheduler.scheduled-time>\"}"` が出てきたので、それを指定する。

```terraform
resource "aws_scheduler_schedule" "hoge_schedule" {
    （省略）
    input    = "{\"scheduled_time\":\"<aws.scheduler.scheduled-time>\"}"
  }
}
```

この状態で再び plan したら差分がなくなりました。

# おわりに

Terraform 難しいですね、

まだ Terraform に入門したばかりなので、毎日いろいろなエラーに翻弄されています。
少しずつ対処方法を覚えて、いつか Terraform マスターになりたいです。
シェルスクリプトを素早く再実行しても、一定時間は再実行されないようにする方法

## はじめに

シェルの設定ファイルの時間がかかる初期化処理を、シェルを起動するたびにやらないで欲しいと思って作ったものです。

## 実装コード

個人的趣味で、POSIX で標準化された範囲の機能だけで実装しています。

```sh
: > current.time
if [ ! -e next.time ] || find current.time -newer next.time | grep -q .; then

  # ここに処理を書く
  echo "do something"

  touch -d "$(TZ=UTC-00:05 date +%Y-%m-%dT%H:%M:%SZ)" next.time
fi
```

こちらは POSIX.1-2024 で新たに標準化された `[ ... -nt ... ]` を使って実装したコードです。`-nt` はほとんど（すべて？）の POSIX シェルで実装済みのはずです。

```sh
: > current.time
if [ ! -e next.time ] || [ current.time -nt next.time ]; then

  # ここに処理を書く
  echo "do something"

  touch -d "$(TZ=UTC-00:05 date +%Y-%m-%dT%H:%M:%SZ)" next.time
fi
```

簡潔に書けたと思いますが、どうやらこの方法では **24 時間まで**しか指定できないようです。それ以上のことをやる場合は、以下を併用かな？

https://qiita.com/ko1nksm/items/e61728f863c1b2bc829d

**追記** ああ、いや、ファイルのタイムスタンプを使う代わりに、Unixタイムをファイルに保存して比較したほうが簡単そうですね。

## さいごに

あんまりテストはしていません。

以上
あるイベントで怪しい組織に誘われそうになった話

## はじめに
今回の話は、注意喚起を促すものです。
イベントやその紹介者、組織を批判するものではありません。
様々な意見や考えがある中で、私には合わなそうだったのでお断りしたという話です。
以上の点から、当該イベントや組織については伏せさせていただきます。

誘われたら断りづらい人、周囲に流されやすいタイプの方々の参考になればと思います。

## イベントについて
私が参加した動機は、良い気づきやきっかけ人と繋がりたいと考えているからです。
友人からの紹介であるエンジニアイベントに参加させていただきました。
6つのテーブルにお酒や軽食など立食形式で会話していました。
人数は30名ほどです。
モダンな空間でとても居心地が良かったです。
他のよくある主催企業の紹介やLT登壇などはなく、終始懇親会でした。

友人に挨拶しつつ普段の会話やエンジニアトークで盛り上がりました！

## ある人とのきっかけ
あるテーブルでいつも通り自己紹介した時、ある人(以下、仲介者)と話しました。
仲介者は普段クラブでDJをしてるらしい。
その時は、「クラブ音響はPC使ってたからその繋がりかな」程度に感じていました。
Web開発の勉強や転職の苦労話など親身に聞いてくれました。
おそらくこのあたりから、目をつけられていたんだと思います。

## イベント終盤
イベントが終わりに近づいた際、親しくなった人と連絡先(XやLineなど)を交換しました。
イベント終わりが告げられ、帰り支度をしていたときに仲介者が寄ってきました。
「イベントは楽しめたか？」とか「良い出会いはあったか？」等々話しました。
最後に仲介者とLine交換してこの場を後にしました。

## その後、Line連絡が…
仲介者からあるイベント参加の連絡がきました。
そのイベントはエンジニア関係ではなく、街コンの参加連絡でした。
あるWebページを紹介され都合がつく日程から参加申し込みしてほしいと言われました。
その時は独身でしたので時期が合えば参加してもいいかな程度に考えていました。

しかし相手から来週すぐの参加を要求され、その誘いはお断りしました。
やり過ごす猶予を与えず、仲介者は「その次の日程は？」と誘いが止まりません。
しつこいので無視していたら、1ヶ月先の日程で予約したと連絡してきました。
相手に悪いと考え合意してしまいましたが、おそらく常套手段でしょう。

## Webサイトについて
申し込みしたWebサイトですが、気になる点が３つほどありました。
1. google等でサイト名検索しても出てこない
1. 規約・注意事項・プライバシーポリシーなど運営側の記載がない
1. WebサイトのSSL認証局がLet's Encrypt

また参加フォームに生年月日の入力があったので、個人情報を取られてるかもしれません。

特に２が気になっていて、会社の所在地・代表者名・電話番号など一切ありません。

## お断りの連絡
当日は参加してみようと考えていたのですが、急な仕事があり辞退しました。
その後は日程が決まり次第連絡するといった感じで収まりました。

## 気づき・教訓
- イベントで知り合った人には気を付ける
    親しくなったとしても正体や狙いがわからない人は注意する
    特に人が良くて当たり障りない人は危険…かも

    とはいえ、こればかりは最適解はないので感覚を信じるしかないです
    本当にいい人もいるので。というかいい人がほとんどです！ 
- 転職・副業・お金の話は慎重に
    この手の話は怪しい組織の呼び水になる可能性があります
    うまい話には裏があるものです
- 相手からの頻度の高い連絡には危ない
    相手と打ち解けてない仲で高頻度な連絡はありません（仕事は別ですが）
    裏があると考えていいでしょう

## 最後に
ほとんどのイベントは楽しく様々な人と繋がれるとても良い空間です。
ネット社会においてリアルな顔を感じられることは素晴らしいです。

その一方で怪しい組織に誘いこむ人がいるのも事実です。
この話題を片隅に残しつつ、イベントを盛り上げ楽しみましょう！
MySQL で膨大データを扱ってて、PC の容量が圧迫しだしたら MySQL のバイナリログを疑え

# はじめに

気づいたら自分の PC の空き容量が 10 GB しかないことに気づきました。
特に何かデカいファイルをダウンロードしたとか、たくさんのなソフトをダウンロードしたとかいう記憶は無かったのですが、めちゃめちゃ容量が圧迫されていました。

その時に対応した内容の備忘録です。

# 結論

オチとしては最近顧客対応で 15 GB ほどのダンプファイルを出し入れしてたからたくさんたまったようです。
消したら 70 GB 空きました、、、！

バイナリログとは、MySQL サーバーインスタンスで行われたデータ変更に関する情報を含む、一連のログファイルのことで、データの出し入れしているだけで溜まっていくようです。

# 対応したこと

### 1. バイナリログの確認

以下を実行します。

```sql
SHOW MASTER LOGS;
```

![バイナリログ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2369683/73007839-b933-40d9-2d99-79d581ece874.png)

直接見に行くことも出来ます。なんと 70 GB ほどある模様、、

![バイナリログ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2369683/d035dfab-9665-704e-4347-9f7c0fba5ec0.png)

### 2. バイナリログの削除

以下を実行します。
※ to は、指定した binlog 以前のファイルを削除する、という意味です。

```sql
PURGE MASTER LOGS TO 'binlog.000115';;
```

![バイナリログ削除.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2369683/0591b7d7-443d-79b6-618e-dc3a6e3381d8.png)

### 3. 確認

もう一度以下を実行して確認します。

```sql
SHOW MASTER LOGS;
```
指定した部分がきれいに削除されています。

![削除後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2369683/3e4b3ea4-7d90-2a4e-c2f4-359f05452e63.png)

容量もたくさん空きました！！！

![空いた.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2369683/899b7ccd-7d7f-6c9d-b9b2-bdbbfcef6920.png)


# さいごに

MySQL に膨大なデータの出し入れをしているときに、PC の容量が圧迫しだしたら MySQL のバイナリログ疑いましょう！

[参考記事](https://qiita.com/Brutus/items/5244685a2b5e6b7d2a54)
WireMockでさまざまな障害パターンをシミュレーションする

# はじめに

どうも、来年から社会人エンジニアになるNMSです。

モックするAPIの障害が起因の例外を正しく処理できるかテストしたいときに、WireMockを使えば簡単に実現できたので、自分用のメモとして記録しておきたいと思います。

以下は、WireMockをstandalone JARで実行し、スタブをHTTP経由で設定する場合のJSONで例を示しています。
スタブの設定方法自体は記載しないので、そこも知りたい方は[公式ドキュメント](https://wiremock.org/docs/stubbing/)、または他の方の記事をご覧ください。

# 障害パターン

## レスポンスの遅延・タイムアウト

`fixedDelayMilliseconds`に遅延させたいミリ秒数を設定するだけ。

```json
{
    "request": {
        "method": "GET",
        "url": "/timeout"
    },
    "response": {
        "status": 200,
        "fixedDelayMilliseconds": 60000
    }
}
```

## コネクションの切断・閉鎖

`"fault"`に`"MALFORMED_RESPONSE_CHUNK"`を設定するだけ。

```json
{
    "request": {
        "method": "GET",
        "url": "/connection_closed"
    },
    "response": {
        "status": 200,
        "fault": "MALFORMED_RESPONSE_CHUNK"
    }
}
```

## 未応答・応答失敗

`"fault"`に`"EMPTY_RESPONSE"`を設定するだけ。

```json
{
    "request": {
        "method": "GET",
        "url": "/no_http_response"
    },
    "response": {
        "status": 200,
        "fault": "EMPTY_RESPONSE"
    }
}
```

## SSLハンドシェイク失敗

JSONの設定は必要ない。無効なサーバ証明書を使ってHTTPSを有効にする。

1. 無効なサーバ証明書を作成

    ※keytoolを使用した場合

    ```bash
    keytool -genkeypair -alias invalid-cert -keyalg RSA -keysize 2048 -validity 1 -keystore invalid-keystore.jks -storepass password -keypass password -dname "CN=Invalid, OU=Invalid, O=Invalid, L=Invalid, S=Invalid, C=XX"
    ```

1. 作成した証明書を使って、HTTPSを有効にしたWireMockを実行

    ```bash
    java -jar wiremock-standalone-3.9.1.jar --port 4401 --https-port 8443 --https-keystore ./invalid-keystore.jks
    ```

# おまけ：解析に失敗するレスポンスヘッダー

`Content-Type`に無効なseparator「`:`」とかを入れると、ParseExpceptionが原因のIlligalArgumentExceptionが投げられる。

```json
{
    "request": {
        "method": "GET",
        "url": "/invalid_header"
    },
    "response": {
        "status": 200,
        "body": "test",
        "headers": {
            "Content-Type": "text/plain; charset:UTF-8"
        }
    }
}
```

# あとがき

最後までご覧いただきありがとうございました。
少しでも良い・役に立ったと感じていただけましたら、いいねしていただけますと幸いです。

# 参考

- [Run an API Mock Server as a Standalone Process | WireMock](https://wiremock.org/docs/standalone/java-jar/)
- [Simulating faults in API behavior | WireMock](https://wiremock.org/docs/simulating-faults/)
【体験記】ウェブデザイン技能検定3級に合格しました（2021年11月受験）

# はじめに
　かなり前（2021年11月受験）ですが…[ウェブデザイン技能検定](https://www.webdesign.gr.jp/)の3級に合格したので、備忘録を残します。

:warning:こちらは社内にて2022年11月頃に公開したメモを少しだけ修正した記事です。

## この検定をどこで知ったの？
　弊社の部で使用しているSlackに投稿された「受験し合格しました！」というエンジニアの投稿を見て。

## なんで受けたの？
　HTML・CSSは、以前から趣味で、また当時携わっていた案件で実装しており経験はあります。が、そのとき得た知識は、脳内に雑に保管していた状態でした。なので、検定合格への勉強を通して **得た知識の整理整頓** をしようと思い。
　また、前述「この検定をどこで知ったの？」に登場したエンジニアの投稿に「WEBでは数少ない国家検定」「開発におけるUI面強化ができると思い」とも記載があり興味が沸きました。

## :bulb:こんな方にオススメ
- HTML・CSSを勉強したい人（3級は基礎レベルなので、勉強のきっかけに良いかも）
- HTML・CSSに触れたことがある人（3級は基礎レベルなので、少しでも経験したことのある人なら取りやすいかも。自分は業務で使っていたので、知識の整理に丁度良かったです）
- 手軽に国家検定が欲しい人（人によっては簡単に取れる国家検定、という感触）

# :calendar:ざっくりと！スケジュール（コメント付）

 **①受験申請（試験当日の約40日前まで）** 
「インターネット受検申請」または「郵送による受検申請」を行う。
▼「インターネット受検申請」の例
・公式webサイトから事前登録を行う（本人確認書類提出アリ。私は運転免許証を使用しました）
・決済を行う（入金完了後に「入金確認のお知らせ」といった題のメールが届くはず…会社への受験費用申請時にはコチラを使用しました）

 **↓** 
 **②試験当日** 
会場に行って、会場のPCで受けます。
・学科：マークシート方式。
・実技：解きたい問題をいくつか選び、会場に用意されているPCで実施。

 **↓** 
 **③合格発表（試験当日から約1か月後）** 
サイトでも合格受験番号の発表がありますが（高校受験を思い出しました）、
郵送で合格証書が届きます（こちらも会社への受験費用申請時に使用しました）。合格証書が何かの賞状のような立派さで少しビックリしましたがうれしかったです。

 **↓** 
 **④会社に受験費用申請**
申請できそうならぜひ忘れずに！ 
添付資料として使用したのは、上記でも軽く触れていましたが下記2点です。
・入金完了後に届いた「入金確認のお知らせ」といった題のメール…PDF形式に変換。受験費の証明のため。
・合格証書…スキャンしPDF形式に。合格したことの証明のため。

# どんな勉強をしたの？
　3級は基礎レベルということもあり難しくないというか…人によっては「普段の業務で得た知識や経験」を整理し、試験に向けて少し知識を補う程度で問題ないかと思います。

## :pencil2:学科
　まずは、公式HPで手に入れることのできる**過去問を1回分解いてみましょう** ！
　合格ボーダーは70点なのですが、業務での経験がある人なら人によっては満点取れるはず。ただ、私は普段「他エンジニアや過去の自分のコードを~~パクって~~観察してコーディングする派」であまり覚えるタイプでないこともあり、60点でした。なので、
- 公式、またはググると見つかる過去問を複数回分解く
- 過去問で間違えた個所をお試しコーディング

ということをして足りない知識を補い、覚えました。
　これでも足りない場合は、なにか参考書などを購入しても良いかもしれません。が、3級レベルならあまり必要ないのでは、という感触でした。

## :keyboard:実技
　**Youtubeに（公式ではないですが）解説動画がある**ので、人によってはそれを見るだけで十分だと思います。見るときのポイントは、主に下記の2点になるかと。
- 回答形式：どういう形式で回答するのか（使えるツールは？提出方法は？）
- 知識：問題を解くにあたって足りない知識はないか？

　動画でも言及されていることがありますが、実技の問題は毎回ほぼ変わらないようです。私も、実際に試験を受けて「これ、動画で見たやつ！」という感想を持ちました。進●ゼミ的な。
　また、3級ということもあり問われる内容自体は難しくないので、回答方法を間違えて点を取れず…ということは絶対に避けたいところ。知識面に自信のある方でも、動画を見て当日の回答方法含めた自分の動きをイメージしておくことは有効なのではと思います。
　もし知識面に不安がある場合は、公式HPに実技に関しても過去問的なモノが転がっていたはずなので、それを利用するのも良さそうです。

# おわりに（雑感）
　何度も書いてしまっていますが…3級は基礎レベルということもあり、問われる内容自体は難しくはないです。加えて、実技の問題は毎回ほぼ変わらないようなので、**落ちるとしたら学科の点数不足が原因になりそう**です。
　過去問が公式にも複数、また個人サイトにも転がっているので勉強しやすい印象。興味のある方はぜひ気楽にチャレンジしてみてください！

## オマケ：この検定、役に立ちそう？
　この検定だけ、しかも3級では役立てるのは難しいかもです／(^o^)＼
　**HTMLやCSSに興味はあるんだな、基礎知識はあるんだなということは伝わる**と思いますが…なんせかなり基礎的なので、3級レベルだと「HTML・CSSできます」アピールには活用しにくいと思います。