OmniAICreator/Qiita-1.07M huggingface dataset:
若手エンジニア奮闘記①新人が陥りやすいこと

# はじめに

こんにちは！社会人２年目のエンジニア関根と申します！
はじめてのブログ投稿ということで、今回は私が入社してから悩まされた「質問」について、話していきたいと思います。
社会人ならだれでも経験することだと思うので、私の経験から何かつかんでいただければと思います。


## 質問の仕方

私は入社してから３か月の研修を行い、初めての現場が決まり大きな期待と少しの不安を感じていました。そして現場に参画して数日が過ぎ、任されていたタスクの中で、わからないこがありました。質問をしようとしたところ、どのように質問すればいいのか考えてしまい、気づけば数時間たっていました。
そこで私が質問するときに数時間経過した原因と、その解決方法を紹介していきます。


## 原因

1. 質問をするタイミング
わからないことがあると、インターネットや過去の資料などを確認して調べていました。
しかし数時間調べてもわからないことがあり、「作業が進まない」ということがありました。
もっと早く質問していれば、早く理解することができ「作業が進まない」ということは起こらなかったと思います。しかしどこまで調べてから、質問すればいいのかがわかりませんでした。

2. 質問する相手が忙しい
自分で調べていても、わからなかったため有識者に質問をしようとしたところ、打ち合わせをしており、とても忙しそうでした。少し時間過ぎ改めて質問をしようとしたところ、作業をしており、とても忙しそうでした。
そして質問できないまま時間が過ぎてしまい、質問しに行けないまま、1人で焦っていました。

3. 質問するときの文章
社会人になる前は質問をする時に、何も意識せず文章を考えて質問していました。
しかし社会人になり上司や現場の方、お客さんなどに質問するとき、どのように質問すればいいのか考え、文章を「書き出し」→「読み直し」→「修正」→「読み直し」→「修正」・・・を繰り返していました。
質問をする文章を考えるだけで、多くの時間を使ってしまいました。


## 解決方法

1. タスクの期限を確認
わからないことを調べていると、数時間経っていることがあると思います。特に新人の頃は、わからない事を1人で、解決しようとすることが多いと思います。
ですが私の経験上有識者に質問すれば、数分で解決することが多くありました。
なので私はタスクの期限を確認し、１人で調べる時間を決めるようにしました。
新人の頃は調べ方を学ぶために、質問せずに１人で調べるのもいいと思います。
しかし任されたタスクには、必ず期限があります。そこで任されたタスクの期限を確認し、１人で調べる時間を逆算しました。
このようにすることで、１人で調べる時間を明確にすることができます。

2. 気にせず質問する
質問する相手が忙しそうにしていると、質問することをためらってしまいます。しかし、気にせずに質問しましょう。忙しそうというのは、質問する側が勝手に思っていることで、意外とすぐに回答が返ってくることもあります。すぐに時間が取れなければ、空き時間を確保していただくのもいいと思います。
このようにすることで、質問する相手が忙しく、すぐに時間を確保することが難しくても、空き時間を確保していただき質問できます。そして質問する相手の空き時間まで、質問事項の整理や改めて調べる時間として使用できます。

3. 文章の構成を考える
質問するときは、自分の状況を正確に伝えることが大切です。
質問相手は私の状態を正確に理解できていないと思います。
なので私が、「何をしたくて」そのために、「何を行って」その結果、「今どのような状況なのか」を正確に伝えましょう。
このようにすることで、質問相手に自分の状況を理解してもらい、質問に対する回答をいただけると思います。

## まとめ
このように原因に対して私なりに考えて行動したことで解決することができました。
エンジニアとして働いていると、わからないことや知らないことを質問することは、とても多いと思います。私の体験が少しでも役に立てばうれしいです。
[PHP] バージョン比較にはversion_compare()を使おう

## 結論

PHPでバージョン比較をする時は、[version_compare()](https://www.php.net/manual/ja/function.version-compare) を使おう

> version_compare()は、ふたつの "PHP 標準" バージョン 番号文字列を比較します。

## サンプル

### 自前で書く場合

```php
$app_version = '5.3.0';
if ($app_version >= '5.3.0') {
    echo($app_version); // 5.3.0
}
```

こんなふうに書けば自力でバージョン比較できる
・・・けど、

### こんな時に注意⚠️

プレリリース版の`5.3.0-dev` と、`5.3.0` を比較する場合、結果が異なる

```php
$app_version = '5.3.0-dev';
if ($app_version >= '5.3.0') {
    echo($app_version); // 5.3.0-dev
}
```

```php
$app_version = '5.3.0-dev';
if (version_compare($app_version, '5.3.0', '>=')) {
    echo($app_version); // なにも出力されない
}
```

> プレリリース版 (たとえば 5.3.0-dev など) は、それに対応する正式版 (5.3.0) より小さいとみなされます。

結果、PHPの用意している関数を利用したほうが色々やってくれて便利👌
基礎からの新しいストレージ入門 -Azure編-


こんにちは、駆け出しアーキテクトのやまぱんです。
今回はこの本を読んで改めてストレージについて入門して、その上でAzure のことを考えて自分なりにかいてみました。
いままでストレージという観点で体系だって学んだことがなかったので知識の再確認や再構築ができました。

タイトルは思い切りインスパイア？オマージュ？してタイトルつけました。
もし間違ってる点あればコメントでもDMでもチャットでもなんでもよいので教えてください。

* [基礎からの新しいストレージ入門 基本技術から設計・運用管理の実践まで](https://amzn.to/46eeVwB)
![images.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/d974530a-2647-f10c-bd2b-77d898022911.jpeg)

ちなみに本記事の内容は上記の本の最初の方にかかれているストレージの種類あたりの記述に対応します。


## ストレージの種類と Azure での対応
Azure のストレージサービスカットでの Azure ストレージの説明をしているものは結構ありますのでここではあえて、ストレージの種類カットで記載してみます。
（Azure のストレージサービスを網羅してません）

|ストレージ形式|古さ|主な用途|プロトコル|ファイルシステム|速度|Azureでのサービス|
|:-|:-|:-|:-|:-|:-|:-
|ブロックストレージ |古|OSブート領域/DBなど|iSCSIなど|自由|高速|[Managed Disk](https://learn.microsoft.com/ja-jp/azure/virtual-machines/managed-disks-overview)![2023-10-04_17h16_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/86cbf721-15fa-0175-f7b6-dc6506ce8394.png)
|ファイルストレージ |(中間)|ファイル共有|NFS(Linux)やSMB/CIFS(Windows)|ext4/xfsx(Linux)やNTFS(Windows)など、ストレージ依存|中速|[Azure Files](https://learn.microsoft.com/ja-jp/azure/storage/files/storage-files-introduction) = ストレージ アカウントの中の"ファイル共有"![2023-10-04_17h14_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/8339d99d-0780-a5de-efa9-e0b7f546d9de.png)、[Azure NetApp Files](https://learn.microsoft.com/ja-jp/azure/azure-netapp-files/azure-netapp-files-introduction)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/eff24737-ff66-6864-baf7-23675e4354f2.png)
|オブジェクトストレージ|新|写真の保存など|HTTP/HTTPSのみ|NA(概念なし)|低速|[Azure BLOB Storage](https://learn.microsoft.com/ja-jp/azure/storage/BLOBs/storage-BLOBs-introduction)=ストレージ アカウントの中の”コンテナー” ![2023-10-04_17h13_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/29132906-7068-47a5-146a-d9754fda3ef6.png)


**Managed Disk の実態は 下記のリンク先に「ページ"BLOB"」とあるように実態はオブジェクトストレージだが、Azure VM からはブロックストレージのようにみえます。**

* ページ BLOB について-MS Learn
https://learn.microsoft.com/ja-jp/rest/api/storageservices/Understanding-Block-Blobs--Append-Blobs--and-Page-Blobs#about-page-blobs
* サンプル ユース ケース -MS Learn
https://learn.microsoft.com/ja-jp/azure/storage/blobs/storage-blob-pageblob-overview#sample-use-cases


:::note info
* BLOB : Binary Large Object
データベース管理システム（DBMS）が用意している通常のデータ型のフィールドには格納することができない、画像や音声、動画、実行ファイル、圧縮ファイルなど様々な種類のバイナリデータをレコード中に直接格納することができる。
* clob : (参考までに)一方、巨大な不定長の文字データを格納できるデータ型を「CLOB」（Character Large Object）と呼ぶことがある。
:::



## 参考
+ 今回書くきっかけになった本
 [基礎からの新しいストレージ入門 基本技術から設計・運用管理の実践まで](https://amzn.to/46eeVwB)

+  Azure のストレージサービス一覧 (上記の表にはないものもあります。)

https://learn.microsoft.com/ja-jp/azure/storage/common/storage-introduction

+ Azure Storage の論文
ここに Azure のストレージサービスに関する論文があります。
https://azure.microsoft.com/en-us/blog/sosp-paper-windows-azure-storage-a-highly-available-cloud-storage-service-with-strong-consistency/

https://sigops.org/s/conferences/sosp/2011/current/2011-Cascais/printable/11-calder.pdf

↑英語ですが下記で日本語にできます
https://translate.google.com/?hl=ja&sl=en&tl=ja&op=docs
passport.deserializeUser が呼ばれません（初心者です。）

passport.js を使いログイン、ログアウト処理をしています。

ローカルサーバーでは上手くログイン処理ができました。

しかし、別PCでサーバーを立ち上げた所、passport.deserializeUser が呼ばれなくなり、認証、認可処理ができなくなりました。

localhost:3166 と 192.168.1.4:3166 だと cookie のセッションID保存は変わってくるのでしょうか？

宜しくお願い致します。

![スクリーンショット 2023-10-04 144908.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570410/1ee2bd37-8690-37d2-aad0-737fc59a9fe0.png)
![スクリーンショット 2023-10-04 144939.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570410/6f3fa274-1ef5-bc13-2e39-247148f0b284.png)

[app.js]
![スクリーンショット 2023-10-04 174115.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570410/4c337866-f703-c232-f1db-3ff0169cfbfb.png)
![スクリーンショット 2023-10-04 174150.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570410/16508826-40b2-08c0-36c7-6ed2e235f9ea.png)
スクリプトレットとJSTLを使ったスコープの保存とEL式の出力

## スコープとは保存する領域の事
JSP,サーブレットではスコープと呼ばれるデータの保存場所がある。
データといっても、インスタンスのみが保存できるため
int型やdouble型のような基本データ型はラッパークラスとして保存する。

## スコープは４種類ある
スコープには次の４種類が準備されている。
・ ページスコープ
・ リクエストスコープ
・ セッションスコープ
・ アプリケーションスコープ
それぞれ保存できる期間に違いがあるが、ここでは割愛する。

## 各スコープへの保存方法とEL式での出力
~~~jsp:.jsp
<!--◆スクリプトレットを使った保存-->
<!-- ページスコープ -->
  <% pageContext.setAttribute("text1","page scopeに保存1"); %>
<!-- リクエストスコープ -->
  <% request.setAttribute("text1","request scopeに保存1"); %>
<!-- セッションスコープ -->
  <% session.setAttribute("text1","session scopeに保存1"); %>
<!-- アプリケーションスコープ -->
  <% application.setAttribute("text1","application scopeに保存1"); %>

<!--◆JSTLのcoreを使った保存 -->
<!--ページスコープ -->
  <c:set var="text2" value="page scopeにJSTLで保存2" scope= "page"/>
  <c:set var="text2" value="page scopeにJSTLで保存上書き" />
<!--リクエストスコープ -->
  <c:set var="text2" value="request scopeにJSTLで保存2" scope= "request"/>
<!--セッションスコープ -->
  <c:set var="text2" value="session scopeにJSTLで保存2" scope= "session"/>
<!--アプリケーションスコープ -->
  <c:set var="text2" value="application scopeにJSTLで保存2" scope= "application"/>

◆EL式を使った出力<br>
${text1}<br>
${pageScope.text1}<br>
${requestScope.text1}<br>
${sessionScope.text1}<br>
${applicationScope.text1}<br>
<br>
${text2}<br>
${pageScope.text2}<br>
${requestScope.text2}<br>
${sessionScope.text2}<br>
${applicationScope.text2}<br>
~~~
下記が上記コードの出力結果。
~~~:実行結果
page scopeに保存1
page scopeに保存1
request scopeに保存1
session scopeに保存1
application scopeに保存1

page scopeにJSTLで保存上書き
page scopeにJSTLで保存上書き
request scopeにJSTLで保存2
session scopeにJSTLで保存2
application scopeにJSTLで保存2
~~~

### 実行結果の補足
**・JSTLのcoreを使った保存でscopeを省いた場合。**
「JSTLのcoreを使った保存」の「ページスコープ」でscopeを省いても問題なく実行できる。
この時、値はページスコープに保存されていることが分かる。
また、「page scopeにJSTLで保存2」が出力されておらず「page scopeにJSTLで保存上書き」が出力されている。
これより、「JSTLのcoreを使った保存」で同じ「var」を使用すると上書きされることが分かる。

**・EL式の出力でスコープを省いた場合**
EL式の出力はスコープを明示する暗黙オブジェクトを使うことで、どのスコープのデータか指定できる。
スコープを使わない場合、次のスコープの順にオブジェクトを探し、最初に見つかったデータを出力する。
page→request→session→application

### その他補足
**・スクリプトレットの変数をEL式で使う**
スクリプトレットで作成した変数をEL式で使うには、スコープに保存する必要がある。
（上記「スコープとは保存する領域の事」で記載した通り、EL式はスコープ内のデータを扱うため）

**・EL式内の「"文字"」の使い方**
EL式内に文字を入力し、「"」で囲むと、文字(Stringのイメージ)として出力される。
一方で、EL式内にMAPクラス等のキーを指定する場合は${クラス名.["文字"]}と書くことができる。
この時の"文字"は、MAPのキーとして使用される。
単純に文字を出力する場合、、MAPのキーとして使う場合、どちらも「"」で囲んでいるが結果が異なることに注意する。

こちらのページを参考にしました。
http://www.visards.co.jp/java/jstl/jstl05.html
【Go】select 文とは？ - ゴルーチンの制御

# `select`文 - ゴルーチンの制御

Go言語は並行処理を強力にサポートしており、そのための主要なツールとしてゴルーチン（軽量スレッド）とチャネル（ゴルーチン間での通信メカニズム）があります。`select`文は、複数のチャネル操作（送信や受信）の中から、実行可能なものを選択するための制御構造です。

## 基本的な使い方

`select`文は、以下のような形式で使用します：

```go
select {
case msg1 := <-ch1:
    fmt.Println("Received", msg1)
case ch2 <- 2:
    fmt.Println("Sent 2 to ch2")
case msg3, ok := <-ch3:
    if ok {
        fmt.Println("Received", msg3)
    } else {
        fmt.Println("ch3 is closed")
    }
default:
    fmt.Println("No communication")
}
```

上記の例で、以下のことが起こります：

- `msg1 := <-ch1`: `ch1`からの受信を試みます。
- `ch2 <- 2`: `ch2`への送信を試みます。
- `msg3, ok := <-ch3`: `ch3`からの受信を試み、チャネルが閉じられている場合には`ok`が`false`になります。
- `default`: 他のcaseが実行可能でない場合に実行されます。

## 重要なポイント

1. **非ブロッキング**: `select`文は、実行可能なcaseがない場合、即座に`default`ケースを実行します。`default`がない場合、実行可能なcaseが現れるまでブロックされます。
2. **複数のcaseが実行可能な場合**: もし複数のcaseが同時に実行可能だった場合、`select`はランダムにその中の1つを選択して実行します。
3. **タイムアウトの実装**: `select`文は、特定のタイムアウトを持つ操作のために頻繁に使用されます。これは、`time.After`関数と組み合わせることで、操作が一定時間内に完了しない場合のタイムアウトを実装するのに便利です。

例：

```go
select {
case msg := <-ch:
    fmt.Println("Received", msg)
case <-time.After(5 * time.Second):
    fmt.Println("Timeout")
}
```

この例では、`ch`からのメッセージを待つ間に5秒経過すると、"Timeout"というメッセージが出力されます。

# まとめ

`select`文は、ゴルーチンとチャネルを使用するGoプログラムにおいて、複数のチャネル操作の中から1つを選択するための強力なツールです。これを使うことで、非同期の通信やタイムアウトの実装が容易になります。
UbuntuをインストールしたらBitlockerの回復キーを求められる

# はじめに

WindowsのPCにLinux(Ubuntu)をインストールしたのですが、そこでつまづいたのでまとめます
私がみるようになるかと思います

# 問題

以下のバージョンをインストールして起動しました

https://cdimage.ubuntu.com/releases/focal/release/

そして起動したときに青い画面が出て`Bitlockrの復元キー`を入力しろと言われました

# 解決方法

これはデュアルブートで起動しており、Windows側でBitlockerを無効にしていないのが原因でした
しかし、Windowsは使わないのでUbuntuインストール時にWindowsを削除してインストールを選ぶことで解決しました

# おわりに

今回インストールしたPCがWindowsのほうがなぜかログインできない状態できました
それがとても謎でした
SESという業務形態はなぜ良くないのか?



今回はSESの方と同じチームで仕事をして感じたことについてです。
## なぜ問題が発生するのか
 

SESとして働いている方、SESを自分のチームに入れている方、こんにちは。

突然ですが、皆さんはSES労働者の単価をご存じでしょうか。

 

雇用側の会社のマネージャークラスであればご存じかと思いますが、意外と自分自身の単価であっても知らないという方もいるかと思います。

勿論労働者の技量や経験年数なんかでも変動するかと思いますが、今回は一般的な新卒クラスを例に考えていきます。

 

一般的な新卒の方の単価(レート)は、4,000円/1h 程度かと思います。その場合のコストは以下の通りです。

```4000 * 8h * 20day = 640,000yen ```

 

かなりの金額ですね。現代日本では仮に64万円丸っと月給だとしたら、かなり高給な方ではないでしょうか。

それでは次に新卒の方が受け取る給料です。

 ```229,440yen ```

これは大卒の初任給の平均額です。

 

その差額は以下の通りです。

 ```640,000 - 229,440 = 410,560yen ```


なんと410,560円もの金額の差額が発生してしまいました。　この金額は会社の取り分というわけですね。

(実際には賞与であったり備品や会社の運営コストもあるので、410,560円が毎月利益というわけではもちろんないです。)

 

では次に、新卒平均初任給の時給を算出してみましょう。

 ```229,440yen / 8h / 20day = 1,434yen ```

時給1,434円となりました。まだまだ最低賃金の低い日本では時給だけ見れば悪くないのかもしれない金額です。

それでが単価(レート)との差額です。

 

``` 4,000yen - 1,434yen = 2,566yen ```

 

時給換算で2,566円の差がでました。　アルバイトなら二人ぐらい雇える金額ですね。

この差額が開けば開くほど、本質的に良くない点が大きくなっていきます。

 

 ### それでは本題です。

あなたは新規プロダクトのマネージャーです。SES社員をチームに一人雇うことになりました。契約レートは4,000yen/1hです。経験半年の方がジョインしました。　その方は4,000円分の働きをするでしょうか？
 

 ### 答えは No です。

 
なぜなら、SES社員は時給1,434円しかもらっていないからです。

それは4,000円分働いてくれるわけがありませんよね。

本人は常駐先がまさか自分を1h働かせるために4,000円払っているだなんて思ってもいません。

## 解消する方法はあるのか？


ないのが問題だと思います。SESは企業というものもなくてはならない存在なので…

解決するとしたら、SES会社が労働者に対するマージン率をもっと引き上げるしかないと思います…

そしてSES会社の社員は、常駐先が自分が受け取っている給料の金額の倍以上のお金を払っているということを頭の片隅に置いて、できるだけ頑張らなければなりません。

自分が受け取っている給料の分の働きでは、残念ながら費用対効果が薄いということで契約延長にはならないこともあるでしょう…

# andmore...

他にもこんな記事書いてます。

https://qiita.com/SZR/items/1c8a7be4267071f6c295

https://qiita.com/SZR/items/396533c1b1e14489a782

https://qiita.com/SZR/items/f46822b009fa47e1ca53

https://qiita.com/SZR/items/401a1f839723d89bd7f2

https://qiita.com/SZR/items/176586cde17ea0e9828a

https://qiita.com/SZR/items/a000cbaa583dcd2a344b

https://qiita.com/SZR/items/1d8edaf95fa2f5bbe821
nRF9160 で ZIPファイルを解凍する

# 概要
NSC 2.4.1 環境にて、
外部の spi-norフラッシュにLittleFS領域を作成し、
miniz ライブラリを使用して、
LTE経由でダウンロードしたZIPファイルを解凍できることを確認した。

miniz については 以下が参考になる
https://qiita.com/ishihatta/items/0d7e529f7dca3220e1d9

# 注意点
nRF9160の環境では、メモリの確保に k_malloc,k_free などを利用するが、
minizライブラリを使用する場合、realloc も必要になる。

しかし k_realloc は存在しないので、
sys_heap系の関数を利用する必要があった。

k_malloc()で、heap領域を確保して、
その領域を sys_heap_init() で、独自の heap 領域を作成すれば利用できるようになる。

sys_heap_alloc
sys_heap_free
sys_heap_realloc

の３つをつかって、
メモリ管理用の関数を作成して。
miniz ライブラリに渡してあげれば、あとはminizライブラリが処理してくれる。

デフォルトで、以下の関数が使用される。
```
MINIZ_EXPORT void *miniz_def_alloc_func(void *opaque, size_t items, size_t size)
{
    (void)opaque, (void)items, (void)size;
    return MZ_MALLOC(items * size);
}
MINIZ_EXPORT void miniz_def_free_func(void *opaque, void *address)
{
    (void)opaque, (void)address;
    MZ_FREE(address);
}
MINIZ_EXPORT void *miniz_def_realloc_func(void *opaque, void *address, size_t items, size_t size)
{
    (void)opaque, (void)address, (void)items, (void)size;
    return MZ_REALLOC(address, items * size);
}
```


heap を作成しておき、以下のような関数を定義して、
```
MINIZ_EXPORT void *miniz_alloc_func(void *opaque, size_t items, size_t size)
{
    (void)opaque, (void)items, (void)size;
    return sys_heap_alloc(&heap,items * size);
}
MINIZ_EXPORT void miniz_free_func(void *opaque, void *address)
{
    (void)opaque, (void)address;
    return sys_heap_free(&heap,address);
}
MINIZ_EXPORT void *miniz_realloc_func(void *opaque, void *address, size_t items, size_t size)
{
    (void)opaque, (void)address, (void)items, (void)size;
    return sys_heap_realloc(&heap,address,items * size);
}
```

解凍実行時に作成する mz_zip_archive 構造体のメンバに関数を設定しておけば良い。

```
mz_zip_archive zip_archive;

memset(&zip_archive, 0, sizeof(zip_archive));
zip_archive.m_pAlloc = miniz_alloc_func;
zip_archive.m_pFree = miniz_free_func;
zip_archive.m_pRealloc = miniz_realloc_func;
zip_archive.m_pRead = zip_read_func;
```



nRF9160のヒープ領域は、prj.conf で CONFIG_HEAP_MEM_POOL_SIZE で指定する。
スタックサイズは、CONFIG_MAIN_STACK_SIZE を指定しする。

miniz.h に
MZ_ZIP_MAX_IO_BUF_SIZE = 64 * 1024
という記述があるので、
これを調整すれば miniz ライブラリのメモリアロケーションサイズを縮小できるが、
32 * 1024 くらいまでしか縮小できないので注意。
（これより小さくすると解凍に失敗した）

また、ディクショナリーサイズとして
TDEFL_LZ_DICT_SIZE=32768
が宣言されており、
32KiB分のヒープ領域が別途必要になる。
（サイズ変更はできないと考えた方が良い）

単純に考えると６４KiB程度ヒープサイズ必要だが、
ライブラリのヒープ領域の使い方に依存し、
大きめにしておかないと
メモリアロケーションエラーになって解凍に失敗する。

スタックオバーフローになりやすいので、スタックサイズもそれなりに確保しておく必要がある。

# 以上。
Oracle Cloud Infrastructure 2022 Architect Professional(1z0-997-22-JPN)に合格する

## はじめに
職場でバウチャーを頂き、Associateに続いてOracle Cloud Infrastructure 2022 Architect  Professional(1z0-997-22-JPN)資格も取得しました。
勉強方法を記載します。

## Oracle Cloud Infrastructure 2022 Architect  Professional(1z0-997-22-JPN)とは
Associateの次のレベルとして、OCIサービスのより専門的な知識とスキルを持つことを証明するProfessionalレベルの資格です。
Professional認定資格を取得するには、Associateレベルの認定資格を取得している必要があります。

2023/10/04受験時点で２０２２版が日本語対応の最新でしたが、2023版の試験もそろそろ日本語対応するようです。後述のOracle Universityの学習サイトも2023/10/31で2022版が提供終了。２０２３年版が既に提供されています。

以下、試験内容をザックリ。
- Oracle Cloud Infrastructure (OCI)でのソリューションの計画および設計
    - ビジネス要件および技術要件を満たすソリューションをプランおよび設計
    - N層アプリケーション、マイクロサービス、サーバーなしアーキテクチャなどのアーキテクチャ・パターンの作成
    - 高可用性および障害時リカバリを実現する設計スケーラブルでエラスティックなソリューション
- OCIでのデータベースの設計、実装、操作
    - データベースの評価および実装
    - データベースの操作とトラブルシューティング
- ハイブリッド・クラウド・アーキテクチャの設計
    - 高可用性、帯域幅および待機時間の要件を満たすためのハイブリッド・ネットワーク・アーキテクチャの設計および実装
    - マルチクラウド・ソリューション・アーキテクチャの評価
- オンプレミス・ワークロードのOCIへの移行
    - オンプレミス・ワークロードをOCIに移行するための設計戦略
    - データベース移行の実装とトラブルシューティング
- セキュリティおよびコンプライアンスの設計
    - セキュリティおよびガバナンスのためのソリューションの設計、実装および操作
    - コンプライアンス要件を満たすソリューションの設計、実装および操作


## 勉強方法
### Oracle Universityの講義を視聴
 Oracle Universityの講義、[
Japanese: Become OCI Architect (Professional): 2022 日本語](https://mylearn.oracle.com/ou/learning-path/japanese-become-oci-architect-professional-2022-/110906)を視聴しました。

※2023/10/31で2022版は提供終了の為、今後は[
Japanese: Become A OCI Architect Professional (2023) 日本語](https://mylearn.oracle.com/ou/learning-path/japanese-become-a-oci-architect-professional-2023-/125257)に切り替わりそうです。内容は最新にあわせた形になると思いますが、22/23で各項目を見比べてもほとんど変わらないようです。

こちらの「Learn OCI & Try-Hands-on Labs」を視聴しました。
「資格試験準備セミナー」、「練習問題」もありますが、こちらは受講していません。時間に余裕のある方は実施するとよいと思います。

「Learn OCI & Try-Hands-on Labs」は視聴時間も長いですが、参考までに出題された項目を以下に記載します。

1. OCI Architect Associateの復習
    - IAM、特にIAMポリシーの記載の仕方やコンパートメントの特徴について復習するとよいです。
2. HAとDRのためのスケーラブルで柔軟なソリューションの設計
    - 高可用性、障害復旧、ロードバランサーについてよく出題されました。DNSについてはあまり問われなかったです。
3. クラウド・ネイティブ、マイクロサービス、サーバーレス・アーキテクチャ
    - 全体的に出題されました。問題文に”マイクロサービス”とあれば、この辺りのサービスを使うな、などなど。
4. Infrastructure-as-codeの提供
    - こちらはそこまで問われなかったです。
5. Oracle Database Cloud Service(DBCS)
    - オンプレからのDB移行について、ちらほら出題されたので8が重要そうですが、知識として見ておくべきだと思います。
6. Oracle Autonomous Database (ADB)
    - こちらも見ておくべきだと思います。
7. ハイブリッド・クラウド・アーキテクチャの設計
    - OCVSについては全く出題されなかったですが、Microsoft Azureへのアクセスについて何問かありました。
8. オンプレミス・ワークロードのOCIへの移行
    - こちらは全体的に出題されました
9. セキュリティとコンプライアンスの設計
    - 特にWAF(ロードバランサーの準備、WAFポリシー、保護ルール、アクセス制御ルール)と、OS管理は確認すべきです。

またFastConnectなどオンプレ-OCI接続についても、よく学習すべきだと思います。

### Web問題集で練習

こちらは紹介しないですが、ネット上にあるWeb問題集を練習すればより確実に合格できると思います。
極力短時間で合格したいという方はOracle Univaersityの「資格試験準備セミナー」、「練習問題」よりも、こちらの実施をお勧めします。


## 受験
* オンライン試験のみ
* 問題は4つの選択肢から選ぶ形式がほとんど(単一、複数回答も)

## 結果、振り返り
以下振り返りです。
* Associateより問題文も長い為、よく読んで根気強く解いていきました。上記勉強したことは非常に役立ちました。
* また試験時間が120分もあり、解くのに制限時間いっぱいということはなく、見返すことも可能でした。


バッジ、認定証も送られてきます。パチパチパチ👏
OCI認定資格の有効期間は認定資格取得日から2年間とのこと。。
![スクリーンショット 2023-10-04 16.48.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131627/4742f59d-7af5-f4ad-b684-7a0e1bc85121.png)
OpsRamp ワークフローのUtility Service Parserタスクについて

本記事では、OpsRamp ワークフローのUtility ServiceのParserについて説明します。

# 概要
OpsRamp ワークフローのUitility Serviceには、Parserタスクがあります。Parserタスクは、文字列の抽出することが可能です。

# 設定の説明
Parserタスクは、Sercive Taskから設定することができます。
![task.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/f88b9520-35bb-743e-d8c6-6bfcd6cbd687.png)

Serviceに「Utility Service」、Taskに「Parser」を選択します。
![properties.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/0c6916af-5b3a-5a7d-1405-565d4877090f.png)

各プロパティには、以下の意味があります。
Input: 抽出対象の文字列の変数を入力します。
Enter Key: 変数名を定義します。
Operator:
- After : Start Wordに入力した文字列が一致した抽出対象文字列の後の文字列を抽出します。
- Before : End Wordに入力した文字列が一致した抽出対象文字列の前の文字列を抽出します。
- Between : Start WordおよびEnd Wordに入力した文字列が一致した抽出対象文字列の間の文字列を抽出します。
- Pre Pend: Start Wordに入力した文字列を抽出対象文字列の前に追加します。
- Post Pend: End Wordに入力した文字列を抽出対象文字列の後に追加します。

Parserタスクで定義した変数は、\$\<タスク名またはタスクID\>.\<Enter Key\>に定義した変数名>でほかのタスク内で使用することが可能です。


---------------------------------------
[<img width = 250 height = 200 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/111de30a-4d33-aa33-5c7d-83d9015093e6.png">](https://www.vistanet.jp/knowledge-base/)
（Python）スクレイピングの手順を簡単にまとめた

## スクレイピングとは

スクレイピングとはWebサイトからデータを抽出する手法のこと。

そのため、**HTMLの構造を把握して目的のデータのみ抽出する条件を指定**することがスクレイピングの主な作業になります。


### 事前準備

#### インストールするライブラリ
``` python
requests
Beautiful Soup
lxml
```

#### requests
requestsはURLを渡すことで目的のWebページを直接取得できます。

#### Beautiful Soup
取得したWebページを解析して、目的のデータを抽出するライブラリ。
HTMLタグや属性などさまざまな条件を指定できる。

#### XML
パーサー。
プログラミング言語の構文を解析する役割。

## 実践

### Webページのリクエスト

```python
r = request.get(URL)

print(r.txt) #レスポンスの内容
```

requestはもう使わない。


### Beautiful Soupオブジェクトの作成


HTMLを取得できたらパーサーを指定し、BeautifulSoupオブジェクトを作成。
```python
from bs4 import BeautifulSoup
html_doc = """ｈｔｍｌをここに入れる"""
soup = BeautifulSoup(html_doc, "lxml")
```

### 要素の取得
BeautifulSoupオブジェクトを作成できたら要素を取得する。
基本的な方法はタグ名をつなげて書く方法。

```python 
soup.title #titleタグの要素を取得

soup.a #aタグの要素を取得
```

#### find_allメソッドで条件に合う要素をすべて検索

find_allメソッドは指定した条件に一致した要素をすべて取得できる。
```python
soup.find_all(['title', 'a'])
```

ほかにもたくさんのメソッドがあります。
気になる方は以下を参考にして下さい。

## 参考記事
[スクレイピングとは？Webからデータを取得できるBeautiful Soupの使い方](https://valmore.work/how-to-use-beautifulsoup/ "スクレイピングのガイド")
VS2008でx64ビルドできない

古いプロジェクトを触りたいとき、VS2008をインストールした。ビルドするときに、32bitしかない。
構成マネージャーにx64がない、新しいプラットフォーム作成画面でもx64がない。困った。
いろいろ調べて、VS2008をインストールするときにx64のコンパイラをインストールしなかったことが分かった。
下記のように解決した。

VS2008セットアップ → 機能のの追加または削除 → 下記画面で「x64コンパイラおよびツール」をチェック入れて、インストールする。

![VS2008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344598/1bbf29c0-a471-2021-ad9d-957f9b5761ab.png)
Selenium WebDriverを調べたからまとめる


## Selenium WebDriverを調べたからまとめる
まず、
私はPythonしか使えませんので、
Python視点でSelenium WebDriverを解説していきます。

### 準備
・ChromeDriver
・Seleniumライブラリ


### Selenium WebDriverの基本

二段階のステップに分けることができる。

1. HTMLから対象物の要素を見つける

2. 要素を操作する

これが
Selenium WebDriverの基本ステップ。

では順に解説していきます。

### １．要素を見つける
HTMLの中から操作対象のタグを見つけること
つまり、操作したいタグの特徴を見つけることが第一歩

要素を見つけたらメソッドを指定すれば、
クリック、入力などが行える。

#### 要素の検索について
要素の検索方法は複数あり、
一つの要素だけを検索するのならfind_elementメソッド
複数の要素であればfind_elementsメソッドを使う。

#### id属性で検索
id属性は要素をいちいに特定できるので一番おすすめの検索法。

#### class属性で検索
class属性は複数の要素に適用できる。
そのため、
find_elementメソッドで一つの要素で検索する場合は最初に見つかったものが取得できる。

#### タグ名で検索
タグ名でも検索できる。
webページ内のaタグをすべて取得するといった処理はよくある。

#### name属性で検索
name属性でも検索できます。

#### リンクテキストで検索
リンクテキストでも検索可能。
リンク全文を検索対象にするものとリンクテキストの一部を検索する2つの方法がある。

#### XPathで検索
XPathはHTMLの特定の一部を指定できる気泡。
これまで開設したタグの属性で解決できない場合にこのXPathを用いることになる。

XPathを知らない人はこの記事を見てね！
[クローラ作成に必須！XPATHの記法まとめ](https://qiita.com/rllllho/items/cb1187cec0fb17fc650a "XPATHの記法をまとめた記事")


### ２．操作する

要素を取得したら次は操作です。
クリックやテキストフィールド入力が主ですが、他にも役立つ操作があるので見ていきましょう。

#### クリック処理

クリック処理は取得した要素に続けてclickメソッドを指定する。

#### テキストフィールドの入力

テキストフィールドの入力は取得した要素に続けてsend_keysメソッドを指定する。

#### フォームの送信

フォーム送信は送信ボタンをクリックしてもできますが、
フォーム内の要素にsubmitメソッドを指定してもOKです。

フォーム内のDOMをたどってフォーム要素を自動でsubmitします。

#### タグ内の文字列取得

タグ内の文字列はtextプロパティで取得できます。


### 待機処理について

ブラウザ捜査中にページをまたがって操作するときは、
ページの読み込みを待つ必要があります。

待機処理を挟まないとエラーになる原因となります。

そのため、
必ずページ遷移時には待機処理を入れましょう。


#### 明示的な待機処理

明示的な待機処理は、
特定の条件を満たすまで指定数秒待機する処理です。

条件は複数あり、
ページタイトルに指定した文字列が一致するまで待機する条件や、
DOMの状態変化を監視するものもあります。

#### 暗黙的な待機処理
暗黙的な待機処理はもっと簡単で、
指定した数秒待機するだけ。

## 参考にした記事
[Pythonでブラウザ操作を自動化するSelenium WebDriverの使い方](https://valmore.work/how-to-use-selenium-webdriver/
 "Pythonでブラウザ操作を自動化するSelenium WebDriverの使い方")


### おわりに

終わり。

この記事を通して、
Selenium WebDriverの使い方を少しでも理解いただければ幸いです。
あと、フォローされたらもっと頑張ります！
フォローしてくださいな！
【RxJS】ネストされた可変長な非同期処理


## ・概要

最近、以下のようなケースがありました。
・非同期処理1で不定な長さのパラメータを受け取り、その個数だけ非同期処理2を呼ぶ。
・非同期処理3は非同期処理1と並列に（関係なく）呼ばれる。
・後続処理は複数の非同期処理2と非同期処理3がすべて終わった後に行いたい。

そもそも設計見直すべきだとは思うんですが、諸事情によってロジックで吸収する必要があったのでメモ。


## ・コード

```
  /** 配列を返す非同期関数（処理1） */
  getSampleArray(): Observable<string[]> {
    return of(['1', '2', '3']);
  }

  /** 引数を受けて文字列を返す非同期関数（処理2） */
  getSampleEach(s: string): Observable<string> {
    return of('getSampleEach');
  }

  /** 文字列を返す非同期関数（処理3） */
  getSampleSingle(): Observable<string> {
    return of('getSampleSingle');
  }

  /** 全体処理 */
  sample() {
    // Forkjoinで並列化する
    forkJoin({
      arrayResponse: this.getSampleArray().pipe(
        mergeMap((array) => {
          // 並列化対象である getSampleEach の戻りをまとめて返す
          return forkJoin(
            array.map((s) =>
              this.getSampleEach(s).pipe(
                catchError((error) => {
                  return throwError(() => error);
                })
              )
            )
          );
        })
      ),
      // 単体非同期は普通に並べる
      singleResponse: this.getSampleSingle(),
    }).subscribe({
      next: ({ arrayResponse, singleResponse }) => {
        // ここで後続処理
        arrayResponse.forEach((item) => {
          console.log(item);
        });
        console.log(singleResponse);
      },
      error: (e) => {
        console.error('error:', e);
      },
    });
  }
```
ベテランなのにGIT使えない

ベテランなのにGIT使えない人いました。

私です。
でも悪く言わないでください。
今まで使った事がないので仕方がないです。
今までは、サブバージョンとかCSVとかVSSを使っていました。

そんな私が初めてGITを使った開発に参加して、
かなり苦労したというお話です。

仮にサブバージョンですと、
ソース取得→変更→レビュー→コミットというフローになります。
レビュー方法は、ファイルサーバーに変更前と変更後のソースを置いて、
レビュワーにレビュー依頼とパスを連絡します。

指摘があったら、変更後②みたいなフォルダを作って、
再レビュー依頼を繰り返し、完成したソースをコミットします。

もし、コミットする時に他の人が同じソースを修正していたら、
差分比較ツールで手動マージしてからコミットします。
それが当たり前なんです。それを○○年やってきたんです。

長年それでやってきただけに、GITとの違いに戸惑いました。
まず、キーワードの意味がわかりませんでした。
フェッチ、プッシュ、ステージ、リバート、リベース、マージ等々。

下手に操作して元に戻す方法が分からなくなって、
他の人に聞いたら、怒られて。。。それはそれはしんどかったです。

何が言いたかったかというと、知らない事は悪い事ではないので、
大目に見て欲しいいです。

また、自分自身も知らない事がある人に対して、
なんでこんなこと知らないの？という態度は取らないようにしたいです。
rex0220 計算式プラグインによるステータス履歴(テーブル版)

[計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)で、ステータス履歴(テーブル版)を実装してみます。

※Ver.70 EV_INFO の"action"オプション機能で、実装方法を変更

# 概要

テーブル履歴に承認内容を取得します。
[rex0220 計算式プラグインによるステータス履歴](https://qiita.com/rex0220/items/e71ffac9c2ce1e377874)のテーブル版
テーブルなので、ステータス履歴が多くなると計算式の処理時間が長くなる場合があります。

![2023-10-07_14h29_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/664ad2d2-9e54-6f88-485a-98467e3e665f.png)

# アプリフォーム

![2023-10-07_14h33_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/795c8882-f4b4-6db5-061b-75bec2dcf6ae.png)

# 計算式プラグインの設定

![2023-10-07_14h34_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/ccbcc905-4859-7f3b-6f81-51330a2bbd52.png)

- 「循環参照を許可」をチェック
- 日時に、-1 ランク指定
- プロセス管理の最初のステータスに合わせて"未処理"の変更が必要

```.js
// 承認履歴 SUBTABLE
IFS(NOT(ステータス),1,
  EV_INFO("action"),
  COUNTROW(承認履歴)+1,
  COUNTROW(承認履歴)
)

// 承認履歴.日時 DATETIME (rank:-1)
NVL(日時,NOW())

// 承認履歴.承認内容 SINGLE_LINE_TEXT
IFS(日時,承認内容,
  ステータス,EV_INFO("status")&"->"&EV_INFO("nextStatus"),
  "レコード新規作成"
)

// 承認履歴.処理後ステータス SINGLE_LINE_TEXT
IF(日時,
  処理後ステータス,
  NVL(ステータス,"未処理")
)

// 承認履歴.アクション名 SINGLE_LINE_TEXT
IF(日時,アクション名,EV_INFO("action"))

// 承認履歴.承認者 USER_SELECT
IF(日時,
  SEL_CODE(承認者),
  SET_CODE(LOGIN_CODE())
)
```
hotstring を利用して、git bash 操作中に素早く git commit の内容を入力する直前までを入力する - AutoHotkey v2

# はじめに

この記事では、AutoHotkey v2 で hotstring を利用して、git bash 操作中に素早く git commit の内容を入力する直前までを入力するプログラムを学習します。
git commit は、Git で多用します。コミットを素早くするため、Git Bash の利用中にすぐにコミット文を書けるようにします。

## AutoHotkey v1.1 利用者が詰まる要所

v2 では後方互換性は犠牲となっており、v1.1 のために書かれたスクリプトは基本的に動作せず、改修の必要があります。

# 必要な前提知識

AutoHotkey v2 は Windows で動作する、自動化に役立つツールです。

## インストール

### AutoHotkey

[AutoHotkey](https://www.autohotkey.com/) をダウンロードします。このプログラムは v2.0 で書かれているので、ダウンロードページで「Download v2.0」の方をダウンロードし、動作させる Windows 機にインストールします。

### AutoHotkey Plus Plus

VSCode をご利用の方は、「[AutoHotkey Plus Plus](https://marketplace.visualstudio.com/items?itemName=mark-wiemer.vscode-autohotkey-plus-plus)」をインストールしましょう。コーディングが快適になります。

#### コマンド

AHK++を使用すると、キーボードショートカットを使用してスクリプトをコンパイル、デバッグ、および実行できます。選択範囲をスタンドアロン スクリプトとして実行することもできます。

- デバッグ：Ctrl + Alt + F9
- ヘルプを開く:Ctrl + F1
- 実行：Ctrl + F9
- 選択範囲の実行:Ctrl + F8

# 手順

## 実装する内容

「gco[[」と順番に入力すると「git commit -m ""」と入力されるようにします。カーソルの位置を 2 つのダブルクォートの中央に移動します。

## コード

```:info-v2.ahk
::gco[[::
{
    A_Clipboard := 'git commit -m ""'
    Send "+{INSERT}"
    Sleep 100
    Send "{Left}"
}
```

`::gco[[::
{コード}`

- Hotstring は、連続して入力する文字を、「::」で囲います。実行する内容が複数行にわたる場合、中括弧{} で囲います。これがないと、「Error: Hotkey or hotstring is missing its opening brace.」が表示されます。

`A_Clipboard := 'git commit -m ""'`

- クリップボードに「git commit -m ""」を代入します

`Send "+{INSERT}"`

- Send を使って Windows のキー入力を実行します。ダブルクォートの中に、キーを指定します。「+」が「Shift」キー、{INSERT}が「Insert」キーです。このショートカットは「(クリップボードの)貼り付け」です。

`Sleep 100"`

- 0.1 秒(100 ミリ秒)の待機時間を設けます。これがないと、前の行の「貼り付け」が正しく実行されません。

`Send "{Left}"`

- キー操作の「←」を入力して、カーソルを 2 つのダブルクォートの中央に移動します。

# 注意点

キー入力の「貼り付け」からカーソルの左移動に待機時間を設置しないと、プログラムが正しく動作しないことがあります。「Sleep」を活用しましょう。

# 結論

- 「git commit -m ""←」のキー入力を「gco[[」で同じ結果が得られるようになります。
- AutoHotkey をインストールした後に付属する「Ahk2Exe」を使えば、AutoHotkey のプログラムを.exe 化できます。それを利用すれば、AutoHotkey をインストールしていない Windows 機でも hotstring が使えるようになります。
- また、作成した.exe ファイルを「Windows 10 の起動時に自動的に実行するアプリ」として登録しておけば、起動時に自動的に立ち上がり、hotstring が利用可能になります。
AWSとオンプレミスの接続方法／VPN

# AWSとオンプレミスの接続方法1. リモートアクセスVPN
```VPN```とは「Virtual Private Network（バーチャル・プライベート・ネットワーク）」の頭文字を取った略語
一般的なインターネット回線を利用して作られる仮想のプライベートネットワークのことです。

```リモートアクセスVPN```は、拠点に設置したVPNゲートウェイに対し、ユーザー個人がPCやスマートフォンなどから一時的にVPNの経路を確立するもの。

    ・AWS VPN（AWS Client VPN）
AWS VPN（AWS Client VPN）は、アマゾンが提供しているVPNサービスです。
オンプレミスとAWSのリソースを、仮想のVPNトンネルによって接続するだけでなく、PCやスマートフォンなどの端末からAWSのリソースに接続することを可能。

公式ドキュメント

https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/what-is.html


# AWSとオンプレミスの接続方法2. 拠点間VPN
 拠点間VPNは、A拠点とB拠点を接続するVPNのこと.

    ・AWS Site-to-Site VPN
```AWS Site-to-Site VPN``` は、IP Security (IPSec) トンネルを使用して、データセンターまたはブランチオフィスと AWS リソースの間に安全な接続を作成するフルマネージドサービスです。

デフォルトでは、Amazon VPC 内に起動されるインスタンスとユーザー独自の (リモート) ネットワークとの通信はできません。VPC からリモートネットワークへのアクセスを有効にするには、 AWS Site-to-Site VPN (Site-to-Site VPN) 接続を作成し、接続を経由してトラフィックを渡すようにルーティングを設定します。

公式ドキュメント

https://docs.aws.amazon.com/ja_jp/vpn/latest/s2svpn/VPC_VPN.html

# AWSとオンプレミスの接続方法3.閉域ネットワーク接続・専用線接続

    ・AWS Direct Connect
```AWS Direct Connect ```は、お客様の内部ネットワークを AWS Direct Connect ロケーションに、標準のイーサネット光ファイバケーブルを介して接続するサービスです。 ケーブルの一端がお客様のルーターに、他方が AWS Direct Connect のルーターに接続されます。

公式ドキュメント

https://docs.aws.amazon.com/ja_jp/directconnect/latest/UserGuide/Welcome.html

# オンプレミスとクラウドを組み合わせたハイブリッドクラウド
```ハイブリッドクラウド```とは、オンプレミスとクラウドを組合わせた運用形態のことです。

    ・AWS Storage Gateway（ハイブリッドストレージの統合）
```AWS Storage Gateway ```は、事実上無制限のクラウドストレージへのオンプレミスアクセスを提供する一連のハイブリッドクラウドストレージサービスです。

公式ドキュメント

https://docs.aws.amazon.com/ja_jp/storagegateway/

https://aws.amazon.com/jp/storagegateway/features/
.md拡張子って何に使われてるのか

先日Udemy講座で勉強をしてた時に「.md」という拡張子を持つファイルの存在を知ったのでメモついでに記事を書いてみる。

## .md拡張子ってなに？
この拡張子は、マークダウン記法で記述されたテキストファイルに使われるらしい。

::: note info
マークダウン記法とは、端的に言うと超カンタンに書けるHTMLのようなもの。
簡単に書けることがモットーであるため学習コストが低いことが特徴である。
かくいうQiitaもマークダウン記法で記事を書くことが出来る。
:::

マークダウン記法で書かれた.mdファイルは、ビューアーを使うことでQiitaの記事のようなビジュアルで表示することができる。

## いつ使うの？
現時点の主な使いどころはGithubで"キレイな"メモや手順書を作りたいときに使われているっぽい。（readme.txtの代わりにreadme.mdが使われていたりする）

それだけ？と思ったかもしれないが、2023年10月時点で主要なブラウザには拡張機能なしではmdファイルの表示に対応していないので、活用できそうな場面が限られているみたい。

GithubにはWEB上でmdファイルをプレビューする機能があるため、よく使われているのだと思う。

今後ブラウザの標準機能でmdファイルの表示に対応してくれればもっと一般に普及しそうなので、今のうちにマークダウン記法に慣れておきたい。
RealmSwiftのwhereにArrayで結合したQueryを利用する

SwiftはiOS17から[SwiftData](https://developer.apple.com/xcode/swiftdata/)が使えますが、今のプロジェクトはiOS16と決まっているので[Realm](https://github.com/realm/realm-swift)を使っています。
そんなRealmではNSPredicateでの検索は終わりwhereで検索する時代が来たそうです。

よーし試してみるかと、よくあるQueryをappendして結合する昔ながらのQueryを作成しようとしたのですが、マニュアルを読み返してもやり方が不明です。

流石に最近は誰も使わないのか？そんな筈ないやろとRealmのIssueを探すとありました。

[Compound Array of Query<Bool> #7731](https://github.com/realm/realm-swift/issues/7731)

結果としてRealmには実装がないそうです。
そうなると真面目に実装すると冗長なコードになるのが請け合いです。
Issueに投稿した方はサンプルコードも提供いただいてたので試しに動かしてみたのがページの下にあるコードです。

このIssueのコードでは条件がなかった場合の回避方法の記載はありませんでした。
とりあえずデフォルトのクエリをTodoのテキストが空以外を検索として登録しておきました。

![todo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35973/a5b99251-5641-8278-bced-53bcedab4f24.gif)

## サンプルコード
https://gist.github.com/mbotsu/a4c51b1a9b8495e10a025500d00c2e7a
JAG 夏合宿 2023 参加記

　JAG 夏合宿 2023 に参加したので参加記を置いておきます(今更？)。コンテスト中のムーブはチームメンバーのmiscalc君が書いてくれている(→https://miscalc.hatenablog.com/entry/2023/09/21/204953 )ので、自分のことを軽く書きます。

### きっかけ
　某バイトで一緒に働いている人たちの間でJAGの話になって、自分は知らなかったため調べてみて知った。オンサイトの機会はなかなかないのでICPCのチームメンバーに持ちかけてみた。miscalc君も乗り気だったので行ってみようと決意(magsta君は来れなかったけど)。

### 1日目
　チームメンバーが足りていないチームが前に集められて、AtCoderのレートでソートして良い感じにマージした結果、kumakumaさんに加わっていただくことになった。
　この日はあまり調子が良くなかった。戦略はmiscalc君が書いてくれた通り。F問題はFunctional Graphの問題で、JOI典型みたいな感じがするので、こちらが担当すべきだったかもしれない。自分の担当じゃないからと思考を放棄しちゃって、「連結成分が複数だとややこしくならないか？」みたいな変なことを考えていた。あと、G問題もいかついDPにこだわっていたけどメモ化再帰にしてみた方が良かったかも。unordered_mapの定数倍で落ちるとかは気にしなくていいというか、そこで落ちるなら見直すべきはもっと別のところにある場合が多いので。

### 1日目夜
　ABCに出た。最近は競プロをやる機会が少なく、コンテストに出るならある程度の難易度がある問題に当たろうと思っていたため、ABCはE,F辺りから解き始めている。この日もEから解き始めた。Fが丁寧に整理しないとこんがらがりそうなDPだったが何とか通せたので、A~Dの簡単な問題をパパっと通してGを見た。いかにもフローだったが、頂点の繋ぎ方が分からずに終了。フローに強くなりたい。

### 2日目
　昨日とは違いkobaryoさんに加わっていただくことになった。この日は調子が良かった。B問題のFAが取れたのは嬉しい。誰も解いていないと「これはヤバい問題なんじゃないか」と怖がりがちだが、よく考えるとそこまで難しくなかった。
　ついでにF問題も考察の肝になる部分を発案できたので良かった。
　L問題は、近頃「フローに強くなるぞ」ということばかり意識していたので、問題を読んでからずっと二部マッチングみたいに頂点を配置して最小費用流にすることしか頭になかった。しかしこれは別に「二部」マッチングにならなくて、一般マッチングというもっとヤバそうな奴を使わないといけなかったらしい。ここで嘘考察にハマっちゃったのが少し悔しい。

### 2日目夜
　ARCに出た。Bで冷えてる人多すぎだろ～と思っていたが、よく考えると自分は嘘で通したらしい。犯罪者？まあ、Dを終了1分半前に通せたし……(ただ、Bのテストケースが強かったとしたら、バグ取りにハマってDを通す時間はなくなっていたはず。)
　DはSCCを求めて、そのSCCごとにマージして……というのを繰り返す問題で、今までまともに扱ったことのなかったSCCを使いまくった。一度AOJに出したことがあったのでそれを引っ張ってきてなんとか通したが、SCCくらいはライブラリ化しておいた方が良いのかもしれないと思った。

### 3日目
　この日は2人で出ることになった。結果は微妙だったが、これは人数が少ないからというだけでなく、僕の調子が悪かったのもあると思う。
　I問題の括弧列の問題が、実装方法は簡単なくせに思いつきにくくてしんどかった。Eも注目する場所を変えればもう少し簡単な問題に帰着できたらしい。こういうの思いつきたかったな。

### まとめ
　久々に競プロに打ち込んだ。日ごとに調子の良し悪しはあったけど、まだそれなりに戦えそうだ。複数人で協力するのは楽しいし、次のICPCでは国内予選通過まで行きたい。
　あと、競プロやってる人と話したのもかなり久々だった気がする。最近は競プロの界隈からも離れていたので。もっとコミュ力があれば他の方々が話しているところに突撃できたのだと思うが……

　最後に、運営の皆様、春合宿を開催してくださり本当にありがとうございました。
データサイエンティスト（DS）検定の体験記

# 1. データサイエンティスト検定とは

DS検定は一般社団法人データサイエンティスト協会によって主催されている検定です。現時点（2023年10月）では、「これからデータサイエンティストを目指すビジネスパーソン」や「データサイエンティストに興味を持つ大学生や専門学校生」など、`初学者向けの「データサイエンティスト検定™ リテラシーレベル」のみ`が検定対象となっており、データサイエンティストとしてのキャリアをスタートする際に必要な知識があることを証明する試験となっています。本検定の取得により、データサイエンティストに必要なデータサイエンス力・データエンジニアリング力・ビジネス力についてそれぞれ見習いレベルの実務能力や知識を証明することができます。

詳しくはデータサイエンティスト協会のページを参照してください。

https://www.datascientist.or.jp/dscertification/

今回の記事では試験対策や試験を受けた感想等を述べたいと思います。

参考までに、私のバックグラウンドについて簡単に紹介します。私はアカデミアとして長年、物理の研究に携わってきました。研究を通してデータ分析に関してはそれなりの経験を積んでいます。とくにC/C++やPythonをつかったプログラミングは10年以上の経験があります。ただ、今回の試験はプログラミングのスキルが問われているわけではありません。またアカデミアからの転身ということもあり、ビジネス界でのデータ分析がどのようなものかをざっくり知りたいと思い、興味本位で`2023年6月の検定試験`を受けました。

# 2. 試験概要と対策

## 2.1 概要
試験の出題範囲は上記のDS検定ページもしくは下記で紹介する本にあるスキルチェックリストに記載されているとおりですが、主に、
1. データサイエンス分野
2. データエンジニアリング分野
3. ビジネス分野

の3つの分野に分かれています。試験時間は90分で90問ほどの問題が出題されます。

## 2.2 対策
試験対策に3週間（毎日2‐3時間の想定）ほどの時間を割きました。対策をするために以下の2冊の本を購入しました。

- 徹底攻略データサイエンティスト検定問題集[リテラシーレベル]対応 
- 最短突破 データサイエンティスト検定(リテラシーレベル)公式リファレンスブック 第2版

![Screenshot 2023-10-04 111513.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565029/634cf8e7-8091-4434-56f8-dadbe4572efe.png)

これに加え、試験直前の1週間で、黒い本と同じスキルアップAI社の「DS検定アプリ」にも取り組みました。

私の場合はまず問題集（黒い本）からはじめ、どのような問題がでるのかということを感覚的に確かめました。解説がしっかり書かれており、解説を読むだけでも勉強になりました。

- `データサイエンス分野`: 数学や統計学に関してはだいたい知っていましたが、機械学習、とくに自然言語処理の分野において知らない専門用語が多々ありました。
- `データエンジニアリング分野`：これまでデータ分析では、物理実験に適合した独自のデータコンテナーを作成し、解析を行うスタイルだったため、RDBを使う機会はあまりありませんでした。このため、ER図やSQLなどで知らなかったものがありました。一方で、データ分散や暗号方式等についてはとくに新しいことはありませんでした。
- `ビジネス分野`：ここは法律や倫理の話など、想定通り新たに学ぶことが多かったです。一方、プロジェクト推進に関する部分は一般常識的な要素が強いかなと思いました。

黒い本の最後に90問の総仕上げ問題が付録しています。こちらも解説が充実しており、足りない知識を補うよい機会となりました。

黒い本を一通り終えた後に、白い本の模擬問題（ネット上でダウンロードできるものも含めて）を解きました。黒い本と出題傾向の違う問題もあるため、こちらもやっておいてよかったと思いました。解説もあるのですが、解説だけでは不十分で、本編にもどって対象項目を読んで確認するというスタイルで進めました。模擬問題で触れられていない項目も当然あるので、模擬問題を解いたのちに白い本を通しでざっと読みました。

ここまでにだいたい10日ほどかかったと思います。この時点で一通り終えられて安心できた記憶があります。この2冊でカバーしきれていないものまではフォローするつもりがなかったので、あとはこの2冊に載っている内容の定着を目指しました。具体的には、試験直前までにこの2冊を3周しました。最後の1週間でアプリも導入し、とにかく問題数をこなしました。アプリは黒い本と同じ会社が作っただけあって、黒い本の類似問題が多くあったと思いますが、本番試験でアプリにあり黒い本にはないような問題の出題もあったため、アプリもやっておいてよかったと記憶しております。

# 3. 試験本番

本番は試験センターで受験しました。試験日程は予約時点で決まってはいるものの、本番は個別ブースにあるPCで行うため、自分のタイミングで試験を開始できました。試験直後にスコアが確認できます。

本番試験で感じたこととしては、知識系以外の問題（例えばグラフの読み取りなど）もそれなりにあったという印象でした。知識系の問題は知っていれば即答できる場合が多いのに対し、多少の思考を伴う問題では見落としがないか慎重になることもあり、思ったより試験に時間がかかってしまったと思います。とはいえ、90問（厳密には90問でなかったかもしれません）に対し、90分という時間は十分だったと思います。78-80%の正答率が合格ラインだと思うのですが、私の正答率は88%でした。私は15-20分くらい余して退出しました。

# 4. 感想

正直90%はいきたかった気もしますが、`「資格試験は合格することがすべて」`だと思うので、まずは合格点をとれてよかったです。また今回紹介した本2冊＋アプリで対策をすれば、十分に合格点に達することは示せたかなと思います。次回以降（2023年11月以降）の試験の出題傾向が同じとは限りませんが、今回の体験がこれから受験される方の役に立つと嬉しいです。

ちなみに合格認定証とバッチはこんな感じです。
![Screenshot 2023-10-05 220155.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565029/1a1cf6f3-57ca-71cc-4ce1-92489f8fc6e5.png)
【Swift】モーダル画面の下スワイプで画面を閉じる機能を無効にする方法

## はじめに
Modal画面を表示して、下スワイプで画面を閉じると、色々と都合が悪かったので、下スワイプで画面を閉じる機能を無効にしました。
忘れないために、備忘録を残します。

## 実装方法
``` Swift: 
class ModalViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        // ここを追記する
        self.isModalInPresentation = true
    }
}
```
Lightsailを作ってみる③～ スナップショットを取得する

# はじめに
前回以下の記事でLightsailの構築をしましたが、今回はその作成したLightsailのインスタンスのスナップショットの取得について記載したいと思います。
スナップショットの取得についてもLightsailの画面から行えます。

https://qiita.com/Shun_konno/items/b6461594de1cdd7caa87

https://qiita.com/Shun_konno/items/f51ae599b68e0d2d36ea

# スナップショットタブ
Lightsailの画面を開き、スナップショットタブを選択します。
![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375141/fc6bbd98-ff4a-d33a-2260-75c8b3cb8f57.png)

## 手動スナップショットの取得

### スナップショットの作成
「スナップショットの作成」を押下すると作成する名前の入力欄が出てくるので、任意の名前を入力して「作成」を押下します。
![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375141/5f7a6c02-dfff-8416-5172-bfb32cf53ee4.png)

## 自動スナップショットの取得

### スナップショットの作成
「自動スナップショットは無効です」のトグルボタンがあるので、「ON」にします。
![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375141/95fe443a-717e-bf95-cdef-116fdc1f4d90.png)


### スナップショットの作成(確認ダイアログ)
「自動スナップショットを有効にしますか?」の確認ダイアログが表示されるので、確認文を読み問題がなければ、「了解しました」にチェックを入れて、「はい、有効化します」を押下します。
![image5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375141/ae9f9faf-5b46-4b71-ef37-5b53ad4e64c5.png)


### スナップショット時刻の変更
自動スナップショットを有効にした後、スナップショットの時刻を変更できます。
こちらから自動スナップショットを取得する日時を設定できます。
![image6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375141/9bbf2d39-a9f9-4d5a-ac91-ab7b540fe3e7.png)


:::note  warn
自動スナップショットで取得したスナップショットは7日分保持します
8日以降はもっとも古いスナップショットが削除されていきます。
:::

>最新 7 つの自動スナップショットが保存され、最も古いスナップショットが最新のスナップショットに置き換えられます。自動スナップショットを手動スナップショットとしてコピーすることで、保持することもできます。アカウントに保存されたスナップショットのスナップショットストレージ料金が請求されます。

上記から、週次でスナップショットを取得したいのならば、自動スナップショットをLightsailの画面で、手動で保持するようにするしかないみたいです。(日時以外のスナップショット取得のタイミングも設定したい。。。)
自動スナップショットで取得したスナップショットの「…」から、「スナップショットを保持」を選択すると選んだスナップショットが手動スナップショットにコピーされます。

まだ試してはいませんが、「EventBridge」と「Lambda」を組み合わせ、Lightsailのスナップショットを取得するAPIを動かせばもしかしたらできるかもしません。
こちらについては、課題ということで、後々試せればと思ってます。

## スナップショットの料金
スナップショットについてはそれぞれ「0.05USD」/月かかるみたいです。
![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3375141/1a7965d8-7e6c-2221-f984-66d0ccf691f5.png)


https://aws.amazon.com/jp/lightsail/pricing/

**・インスタンスとディスクスナップショット (手動および自動)**

# 終わりに
Lightssailは手軽にスナップショットを取得できました。
画面も比較的、わかりやすくなっており、該当するイベントの「?」を押下するとヘルプが右のサイドに表示され、不明点が解決しやすくなっています。
今後の課題としては、日時で取得しているスナップショットを週次で取れるように変更できるかというところです。
その場合は「自動スナップショット」を一度OFFにして、週次で「Lambda」を動かして「手動スナップショット」を取るようにするのではないかと考えています。
【TypeScript】tscでtsconfig.jsonが無視される問題

# 背景

Expressをインポートしたコードを`tsc --noEmit`で型チェックしようとしたところ、

```
> pnpm tsc --noEmit index.ts
...can only be default-imported using the 'esModuleInterop' flag
```

のエラーが出たため`tsconfig.json`に

```json
"esModuleInterop": true
```

を追加したが、依然としてエラーが解消されなかった。

# 原因

[公式ドキュメント](https://www.typescriptlang.org/docs/handbook/tsconfig-json.html#:~:text=When%20input%20files%20are%20specified%20on%20the%20command%20line%2C%20tsconfig.json%20files%20are%20ignored.)

> When input files are specified on the command line, tsconfig.json files are ignored.
（コマンドラインで入力ファイルを指定するとtsconfig.jsonは無視されます。）

どうして・・・😢

# 解決策１（失敗）

ともかく原因は判明したので、`tsconfig.json`を`--project`オプションで明示的に指定してみます。

```
> pnpm tsc --noEmit --project tsconfig.json index.ts
error TS5042: Option 'project' cannot be mixed with source files on a command line.
```

> Option 'project' cannot be mixed with source files on a command line.
（オプション「project」はソースファイルの指定と同時に使用できません）

無視するから指示してあげたのに、それすら許されない・・・😢？

# 解決策２（成功！だが嬉しくはない）

仕方がないのでコマンドラインで直接オプションを指定しました。

```
> pnpm tsc --noEmit --esModuleInterop index.ts
（エラーなし）
```

成功です（嬉しくはない）。

# 補足

lint-stagedとtscを併用する時に今回のエラーが発生する場合の解決方法はREADME.mdにありました👇
[Example: Run tsc on changes to TypeScript files, but do not pass any filename arguments](https://github.com/okonet/lint-staged#example-run-tsc-on-changes-to-typescript-files-but-do-not-pass-any-filename-arguments)

# まとめ

どうしてこんな面倒な仕様になっているんでしょうか・・・😢？

歴史的経緯などご存知の方がいればぜひコメントください・・・。
【TypeScript】オブジェクトのプロパティ名を引き継いで型だけ上書きした型を作る

# 背景・したいこと

[Zod](https://github.com/colinhacks/zod)で環境変数をパースする型を作りました。

```ts
export type Env = z.infer<typeof Env>

const Env = z.object({
  PORT: z.coerce.number(),
  VAR1: z.string(),
  VAR2: z.boolean()
})
```

この時、型`Env`は以下のようになっています。

```ts
{
  PORT: number;
  VAR1: string;
  VAR2: boolean;
}
```

この型を使って環境変数のテストを書きたくなりましたが、現状の型はカッチリしすぎていてテストになりません。


テスト対象は生の環境変数なので`Node.Process.Env`や`any`として扱っても問題ないのですが、テストを書くためにプロペティ名のチェックくらいは欲しくなりました。


具体的には、プロパティ名はそのままで型だけ`string`に置き換えた

```ts
{
  PORT: string;
  VAR1: string;
  VAR2: string;
}
```

が欲しいです。

## 方法

[Mapped Types](https://www.typescriptlang.org/docs/handbook/2/mapped-types.html)を使って以下のようにします。

```ts
type RawEnv = {[T in keyof Env]: string}
```

これで、型`Env`のプロパティ名はそのままに、型だけ`string`に置き換えた目的の型が手に入りました！

使い勝手の違いを比較するとこんな感じです。

```ts
const env: Env = {
  PORT: 3000,
  VAR1: "foo",
  VAR2: true
}

const rawEnv: RawEnv = {
  PORT: "3000",
  VAR1: "foo",
  VAR2: "true"
}
```

# まとめ
Mapped Types万歳
ホットストリングを利用して、素早く€《ユーロ》を入力する AutoHotkey v2

# はじめに

この記事では、AutoHotkey v2 でホットストリングを利用して、素早く€《ユーロ》を入力するプログラムを作ります。

## AutoHotkey v1.1 利用者が詰まる要所
v2 では後方互換性は犠牲となっており、v1.1 のために書かれたスクリプトは基本的に動作せず、改修の必要があります。
v1.1 のプログラムを修正するために検索すると、[v1.1からv2.0への変更](https://ahkscript.github.io/ja/docs/v2/v2-changes.htm) の記事を何度か見ることになります。削除されたライブラリがあっても焦らず、公式の記事を読みましょう。

# 必要な前提知識
AutoHotkey v2 はWindows で動作する、自動化に役立つツールです。

## インストール
### AutoHotkey
[AutoHotkey](https://www.autohotkey.com/) をダウンロードします。このプログラムは v2.0 で書かれているので、ダウンロードページで「Download v2.0」の方をダウンロードし、動作させる Windows 機にインストールします。

### AutoHotkey Plus Plus
VSCode をご利用の方は、「[AutoHotkey Plus Plus](https://marketplace.visualstudio.com/items?itemName=mark-wiemer.vscode-autohotkey-plus-plus)」をインストールしましょう。コーディングが快適になります。

#### コマンド
AHK++を使用すると、キーボードショートカットを使用してスクリプトをコンパイル、デバッグ、および実行できます。選択範囲をスタンドアロン スクリプトとして実行することもできます。

- デバッグ：Ctrl + Alt + F9
- ヘルプを開く:Ctrl + F1
- 実行：Ctrl + F9
- 選択範囲の実行:Ctrl + F8

# 手順

## 実装する内容
「e[[」と順番に入力すると「€」と入力されるようにします。これはMS-IME などを使って日本語入力中でも動作します。ローマ字入力で「yuro+Enter」を入力するより素早く「€」を入力します。

## コード
```AutoHotkey:info-v2.ahk
#Hotstring * ; hotsting を終了文字無しで発動させる
;ユーロ入力
;ユーロの記号は、ファイルをSJIS で保存すると文字化けするので、ファイルをUTF-8 BOM付きで保存する必要がある。
::e[[::
{
    A_Clipboard := '€' ; クリップボードに「€」を保存する
    Send "+{INSERT}" ; [Shift + Insert] ショートカットで「貼り付け」を実行する
}
```

`::e[[::
{コード}`
+ Hotstring は、連続して入力する文字を、「::」で囲います。実行する内容が複数行にわたる場合、中括弧{} で囲います。これがないと、「Error: Hotkey or hotstring is missing its opening brace.」が表示されます。

`A_Clipboard := '€'`
+ クリップボードに「€」を挿入します
+ 代入演算子は「=」から「:=」に代わりました

`Send "+{INSERT}"`
+ Send を使ってWindows のキー入力を実行します。ダブルクォートの中に、キーを指定します。「+」が「Shift」キー、{INSERT}が「Insert」キーです。このショートカットは「(クリップボードの)貼り付け」です。


# 注意点

v1.1 のhotstging のように、コロンで囲ったキー入力の次の行からコードを書いて、最後にreturn をつけても、Error: Hotkey or hotstring is missing its opening brace.」が表示されます。

```AutoHotkey:info-v2.ahk
;v1.1 のhotstring
::e[[::
; コード
return
```

また、hotstring は、Windows 上のエディタやエクスプローラーでは動作しますが、ブラウザ内のエディタアプリやブログの編集画面では動作しません。

# 結論
+ 入力するキー選びで「e[[」と小カッコ開くを選んだのは、誤字しにくい内容だからです。使いやすいように「e;;」(「;」はキーボードのホームポジションの右手小指)と変えても良いです。
+ 「date[[」と入力してもhotstring は実行されません。
+ 数行の簡単なコードですが、日常利用する常套句を設定しておくと、文章作成やコーディングが早くなります。まずは簡単なコードからAutoHotkey の自動化を作ってみましょう。
DjangoでRedisを使う理由を簡単にまとめた

## DjangoでのRedisの利用

DjangoでRedisを利用されるときは主に以下の目的で利用される。

### １．キャッシング
Redisは、ウェブアプリケーションのパフォーマンス向上に
キャッシュとして使われることが多い。
DBへのクエリ結果とか、検索結果などをキャッシュしておいて、
次回同じデータが必要になったときに高速にアクセスできるようにする。

### ２．セッションストア
Redisは、ユーザーセッションデータを保存するセッションストアとしても使用される。
これにより、ユーザーがウェブサイトにアクセスするたびにその状態を維持することができる。

### ３．メッセージブローカー
Redisは、メッセージブローカーとしても使用され、
アプリケーションの異なる部分や異なるアプリケーション間でメッセージをやりとりするのに役立つ。
これは、リアルタイム機能やバックグラウンドタスクの処理に使用される。


## ChannelsのバックエンドにRedisを使う

これに関しては別の記事で解説しました。
気になる人はそちらもチェックしてみて下さい。
↓
[Django] ChannelsでRedisをバックエンドに設定するには？
[https://qiita.com/kazuki_niiyama/items/03bcbd955a22baa8f465](https://qiita.com/kazuki_niiyama/items/03bcbd955a22baa8f465 "[Django] ChannelsでRedisをバックエンドに設定するには？")

## おわりに

この記事でためになるひとが
一人でもいればいいなと思って書いています。

最近私の記事に、
フォローやいいね、キープなどのアクションが
少しずつ見られるようになってきました！

皆さんの反応が、
とてもうれしいのでまだまだ頑張っていきます。

何卒応援よろしくお願いします。
英語が話せてプログラムも書けるようになったのでより就職が難しくなった件について

## 英語が話せてプログラムも書けるようになったのでより就職が難しくなった件について

最初の記事にも書きましたが、日本を離れて１０年以上、外資系の企業にて外国人と働き、または交渉事などをまとめ、何処に行ってもそれなりに不自由しない英語力を獲得し、さらにロックダウン中から２年あまり、毎日毎晩独学でコードを書き続けたことによって獲得したプログラミングスキルによりウェブアプリなどを自作できるようにまでなった訳ですが、そうして身につけた能力をフルに生かして条件の良い働き口を見つけてこましたろ　と思った時に、そういった能力が身を助けるどころか、よりレッドオーシャンの荒波に我が身を晒すことになったことに気付き、愕然としてこの記事を執筆しています。

### 英語ができることによって競争が激化

例えば、自分は英語も話せて、プログラミングも出来ますよ　となった場合、勿論グローバルな企業にて雇用されることを期待する訳ですが、日本だと日本語が話せる人口はせいぜい１億人で、そこでの勝負になる訳ですが、英語圏だと１７億人あまり。英語を話せると言うことにより、**競争が１７倍以上も跳ね上がってしまう**。
また、プログラミングやコードのスキルとなると、日本人でプログラマー志望は何人いるか分からないが、人口比率０.５％と見積もって50万人くらい。英語圏だと、０.５％でも8500万人くらいのプログラマー連中との競争になる訳である。
また、インドや中国などの、俺はプログラムで成り上がってこますと言うハングリー極まりない連中と命を削った勝負になる訳で、**血の海である**。
じゃあ、日本国内で探せばええやないか　となると思うのですが、それは拙速で、日本国内には日本国内の事情というものがある。
ロックダウンで仕事も貯金も失い、日系企業に幾つかレジュメを送ってみたのですが、まず、日本の企業は年齢をかなり重視するのである。経験よりも年齢。
いつまでも１８歳ではいられない。３０代に日本を飛び出した自分はすでに４０代。そこでハードルが相当に上がってしまっていることに気づいたのである。
また、日本企業って、**弊社はグローバルな人材を　なんていってるけど、あれはあくまでも建前であって、本当の意味でグローバルな人材なんてかなり厄介で使いづらく、海外経験は下手するデメリットにしかならない**。
おっさん「弊社はグローバルでクリエイティブな人材を募集しておるわけだけど、キミは海外に１０年とここに書いとるけど、今から日本の企業に馴染めるんかいな？うちは朝礼もあるし、残業もあるんやで、えっなんて、海外ではうんぬん言われても、ここは日本やさかいな、そもそも40過ぎとかアウトやさかい」
わし「さかい　ころす」
今は一応日系企業の海外支社で働いている訳ですが、やっぱり本社の意思決定や色々な仕事の進め方をみていると、こりゃ無理だわとおもわざるを得ないのである。**日本企業の体質とグローバルは水と油。**
日本にいる時は、英語も出来てプログラムも書けるような人材なら、就職なんて楽勝っしょ　って思ってたのですが、世の中、そんなにアマくありません。

### 日本語は逆にレアスキル

で、気づいたのは、英語を話せる人口は日本語を話せる人口の１５−２０倍もいるわけで、実は海外では日本語を話せます　っていう方がレアスキルなわけである。
勿論、英語と日本語セットでっていう前提ではありますが。
ただ、日本企業がまだまだ日の出を迎えていた時代は、日本語の能力はかなり重宝されたであろうけど、今はほとんど存在感を失ってしまっており、その日本語を海外で生かせるスペースも減ってきている。**今海外で日本といえば、電化製品などではなく、アニメや日本食である。**
また、アプリ開発なんかのIT分野は、物流や生産拠点、サプライチェーンなんかを考えずにすむボーダーレスな分野なのに、**海外のデベロッパーは最初からグローバルにむけて商品開発してるのに比べ、日本のITデベロッパーは、まず日本で　のスタンスで、うまくいけば海外に進出しましょうなんていう、スタートから何万歩も遅れた事をやっている。** で、日本製アプリを海外でローカライズするという尻が頭のニコちゃん状態になっているような有様だ。
先輩デベロッパーの皆さん、そんなスピード感じゃダメですよ。

と言っても、[一番最初の記事](https://qiita.com/monsoonTropicalBird/items/2dc9dd7d31c35f426c5b)に書いたように、プログラミングをしていて英語を話せるメリットはメチャクチャあるし、何よりも人生の景色が４５度くらいだったのが、３６０度くらいに広がるという体験もできるので、出来た方が絶対に良いよとは思います。
それによって、**夢のような良い仕事が手に入るかと言ったら別の話だけどね**　というお話でした。
WordPressのSEO設定／「Yoast SEO」プラグイン

# 「Yoast SEO」プラグイン
1\.「Yoast SEO」プラグインをインストールする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/80786d49-7de4-3129-60ae-a05a7d59a6aa.png)

2\.有効化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/e235e59f-5c2b-bb57-9e2f-98caff8f339f.png)

初めて使用する場合は、「Start first-time configuration（初回設定を開始）」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/a1d12b75-ae07-7ea7-910d-4f9da917685f.png)

3\.SEOデータを最適化
```次へ```　をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/4d8b9f21-de32-290a-781c-abc696bcbd52.png)

4\. サイトの表現を設定
個人サイトの場合には、「個人」を選択し、その下のフィールドにユーザー名を入力します。
企業サイトの場合は、「組織」を選択して、その下のフィールドに企業名を入力します。
```保存して次へ```　をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/9fc2949f-bc16-3f16-f1d0-c68d693839a8.png)

5\. ソーシャルプロフィール情報を入力
SNSアカウント情報を入力します。企業サイトの場合は、企業のSNSアカウントを追加してください。
```保存して次へ```　をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/b94c7e8d-7856-c2ce-53c9-30369e88ac4e.png)
すべてのSNSアカウント情報を入力する必要はありませんが、力を入れているものは追加しておきましょう。

6\. 好みの設定
Yoast SEOによるサイト情報のトラッキングを許可するか、または拒否するかを選択します。
```保存して次へ```　をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/ba1546e2-95c6-22d8-08a3-ff1b9ce611db.png)
必要に応じて、Yoast SEOのニュースレターも購読できます。希望する場合は、ここでメールアドレスを登録する。

7\. 構成を終了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/3b0da82a-e6f3-130f-1d1d-60eb9550a384.png)

設定を終えたら、「または、SEO ダッシュボードに移動します」をクリックして、Yoast SEOの管理画面に移動。

# メタボックス
    ・コンテンツのSEO面での質と読みやすさを分析
    ・コンテンツがGoogleやSNSでどのように動作するかを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/dbef9c30-1032-0c34-eea4-0bb81c3af4a6.png)

1\.SEO
「SEO」タブは、コンテンツが検索エンジンに対してどれだけ最適化されているかを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/2337a582-933d-566d-762b-090bf124339b.png)

2\.可読性

「可読性」タブでは、その名の通り、訪問者にとってのコンテンツの読みやすさが測定され、その結果と改善点の提案が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/84f51987-ff4a-2cb5-7866-0adbb52358b0.png)

3\.可読性
ページタイプ/投稿タイプ を選択できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/44513d3c-f5cd-afff-7676-0520205fd898.png)

4\.ソーシャル
「ソーシャル」タブでは、FacebookやTwitterで共有された場合のコンテンツの見え方を設定することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/b8072093-d0a8-7e24-a723-cd362ccb2dff.png)