OmniAICreator/Qiita-1.07M huggingface dataset:
【回想】プログラミング未経験の私が苦労したこと

## はじめに
　はじめまして！2022年4月よりIT企業に入社した新卒の者です。
　今回私の初投稿ということで、入社して初めてプログラミングに触れた私が苦労したことや行った対処方法について、プログラミング未経験者（言語Java）の目線でご紹介していきたいと思います。

## 簡単な自己紹介
- 年齢：23歳
- 大学での専攻：国際政策学、ソーシャルビジネス
- プログラミング経験：ほぼ皆無（コンピュータ演習の授業で少しだけHTMLを学びました）
- 趣味：一人旅、キングダムにハマってます（アニメも漫画も両方！）
- 得意なこと：外国語（英語・ロシア語）、運動全般、ペン回し、タイピング

## 入社してから
　実は、私自身何か新しいことに挑戦することが好きだったのでIT企業に入社直後、私の心境としては、「全くITに関することは分からないけれど、何か面白そう！」という感じで、とにかく新鮮でワクワクした感情が強かったです。上記の自己紹介にも記載いたしましたが、大学時代は「国際政策学」というITと全く関係のない分野を学んでいたので、完全にゼロスタートでした（笑）

　実際に技術研修が始まり、言語はJavaを中心に学んでおりました。いざ学んでみるととにかく専門用語だらけで、「自分の理解」と「講義のスピード」が全く追い付かず苦労しました、、、「変数と引数の違いって？」「型？」「コンソール？」「コンパイル？」「デバッグ？」「リポジトリ？」などなど。挙げたらキリがありません。まさに「ナニソレオイシイノ」状態でした。特に「引数」に関しては最初「（いんすう）」と読んでいたレベルです（笑）

　しかし、一番私が苦しめられたのが「エラーメッセージ」でした。実際にどうやってエラーメッセージと向き合っていったかについて詳しく紹介していきたいと思います。

## Error messages really got on my nerves,,,(とにかくエラー文にイライラしてた、、、）
　エラーメッセージの多さには本当に苦労しました。「こんなにエラー出てくるのか～、、」と（笑）。エラー処理をしていく中で、特にエラー解消の妨げとなったことはエラー文の英語が読めてしまったことでした（海外経験もあったので英語は得意な方です）。

「え？何言ってんの？英語読めたら有利じゃん！」って思われるかもしれませんが、意味が全てわかってしまうからこそ、最初から最後までエラー文を読んでしまい時間がかかってしまったり、英語を直訳して余計意味が分からなくなってしまったりといったことがありました。特に研修期間中はあまりにイライラしすぎてPCの電源を切りたくなった時もありました（笑）。


## 自分なりに行った対処法
　ものすごく基本的なことかもしれませんが、実際に普段行っているエラーの対処法を以下にまとめました。

### 〇 まずエラーステータスを確認する
　400か403か404か500か？（よく起こしがちなエラーステータス） 
　
### 〇 小さな仮説を立てる
　例）「not present」って書かれてるから、書き漏れがあるのでは？

### 〇 Caused by 以下の文をコピペ→検索
  だいたい似たようなエラーを起こした人の記事を読み、参考にする

### 〇 人に聞く
　最後はもうこれに尽きます。臆せず聞きましょう！
　（私の場合、15~20分悩んでダメだったら質問するようにしています）

## 振り返ってみて気づいたこと
### 1. 何度も同じエラーを起こす
　特に私が起こしたエラーをご紹介します。以下3つです。

- 単純なタイプミス（変数名など）
- 引数が間違っている
- 型が違う

　私はタイプミスが非常に多く、単純なタイプミスだけでなく「余計な半角スペースがあった」「大文字小文字」などが原因で、よくエラーを起こしていました。

　引数や型については概念の理解が甘く、「それっぽくテキトー」に書いてしまっていたことがありました。このとき改めて、概念理解の重要性を痛感させられました。。。

### 2. 質問の仕方が何より重要
　分からないことが多い中、自分で調べて解決できたことが私自身あまり多くありませんでした。自分で解決できないと発覚した際に、「これはもう誰かに質問するしかない！」となったのですが、最初のころ、私の質問の仕方はかなりBadでした。。。例えば、「エラー出てしまったのですが、どうしたらいいですか？」や「対処法がわかりません、教えてください。」などなど。まさに丸投げ状態でした。

　では、どんな質問ならgoodなのか？自分なりに改善したのが、「○○をしたくて、今ここのコードを触っていてエラーが発生しました。」「Caused by にエラー文がこう書かれているので、対処法はこの箇所を修正すべきでしょうか？」などとより具体的に質問し、『自分がどこまでわかっているのか』を明確にすることで、質問された相手も答えやすいはずだ！ということに気づきました。

### 3. ある程度、言語の概念を理解しておいた方がいい
　お恥ずかしながら、研修中に講義の理解が追い付かなかったときは「○○を行うときは、こういうものなんだ！」という風に、かなり暗記に近い状態になっていました。

 Java SE Bronze（1Z0-818-JPN）の資格取得に向けて勉強してから、研修では理解できていなかった部分やフワっとした理解で終わっていた部分を所々発見できました。例えば、「継承とインターフェースの違い」「オーバーロードとオーバーライドの使い分け」「コンストラクタのルール」などなど。（つい先日私もJava SE Bronze（1Z0-818-JPN）を受験し、得点率85％（合格基準60％）取れました！！Yay!）資格取得によって、自信がつくだけでなく言語の根本的な理解につながるので、資格勉強はぜひオススメです。

# 最後に
　今回は、プログラミング経験ゼロスタートの私がエラー処理の向き合い方についてまとめました。だいぶエラー処理が一人でこなせるようになってきました。しかしながら、まだまだ悪戦苦闘中の身で、できないことも多いので他の方にヘルプをお願いすることもあります。予期せぬエラーが起こっても、しっかりと向き合い冷静に対処し、自らのスキルアップに向けて努力していこうと思います。この記事が多くの方に、特に私と同じようにプログラミング初心者の方にとって参考になれば幸いです。長々とした私の投稿を最後まで読んでくださりありがとうございました。
Mac+MAMPでEC-Cube4のデバッグが重すぎる対処

EC-cube4の開発・修正の学習のため、MAMPでローカルにテスト環境を作成。

端末はM1 macbook pro (2022年現在ではハイスペックな部類）

webサーバ　：　MAMPのApache
DBサーバ： MAMPのMySQL

EC-Cube公式サイトからダウンロードして開いたところ、本番モードでは我慢できる程度の重さだった。

わたしは普段、Laravel+デバッグバー+Xdebugという環境で案件の修正を行っており、Symphony内蔵のEC-Cube4にも似たようなものがないかとググったところ

.envの

```
APP_ENV=dev
APP_DEBUG=0
```

を

```
APP_ENV=prd
APP_DEBUG=1
```

にするだけでデバッグバーが出るとの事でした。
へー、Laravelだとデバッグバー出すのに外部ライブラリ入れて設定ファイル変更して・・って初回の準備が面倒だったのに、symfonyは標準装備なんだ。便利〜と喜びました。

が、実際にこの設定にすると超ウルトラ激重でPHPが耐えきれずで500エラー（時間切れ）で落ちました。

結論はXdebugとの相性でした。
php.iniでXdebugをコメントアウトするとデバッグバーを表示してもまあ、なんとか動くようになりました。
それでも結構重たいですが。

面倒くさすぎますが、Xdebugを使う時とデバッグバー使う時でphp.ini切り替え＋MAMPの再起動をやるしかなさそうです。

現状無料のMAMPにバーチャルホスト立てて複数案件を並行作業していますが、そろそろMAMPプロ買ってphp.iniを分けられるようにしないとしんどいかもしれない。
これくらいなら sed -e とかでスクリプト書けばいいかもしれないけど。
org.apache.commons.httpclient.RedirectException:Maximum redirects (100) exceeded 

Apexでの開発中でなく以下の操作で発生しています。おそらく障害でしょう。

access the Refresh Data menu using the Trailhead Data Manager.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5dc3fcef-1271-6d18-c172-185f3454275c.png)

+ [Error: Data Refresh through Trailhead Data Management](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000HEKxVSAX)
+ [Hi Trailblazers please assist am doing CRM Analytics Apps Basics building an app i have done all the prerequisites but when i go to data manager it gives an error org.apache.commons.httpclient.RedirectException:Maximum redirects (100) exceeded please help](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000HEXtqSAH)
+ [Unable to download "quota.csv" to Refresh CRM Analytics Data with the Trailhead Data Manager](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000ISlDeSAL)
+ [Cannot update the DTC Data file for the CRMA trailhead exercises.](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000J5P78SAF)
Amazon Provided DNS (Amazon Route 53 Resolver) とは

## 勉強前イメージ

AWSのDNS？route53とは違うの？

## 調査

### Amazon Provided DNS とは

VPCを使用する際にDNSサーバを指定しなければVPCにデフォルトで用意されるDNSのサーバを使っています。
以前はAmazon Provided DNSと呼ばれていましたが
現在はAmazon Route 53 Resolverと呼ばれるみたいです。
VPC内の名前解決を行うために使用されます。

第4オクテッドに+2した値が入ります。
例えばVPCが「10.0.0.0/16」であれば「10.0.0.2/32」のIPアドレスを持ちます。
このDNSサーバがフォワーダー(中継)とフルサービスリゾルバ(クライアントに応答を返す)の役割をします。

使用する際は以下を確認してください

- VPC : DNS解決 → 有効
- DHCPオプションセット : ドメインネームサーバ AmazonProvidedDNS になってること

![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/3232b126-7fe9-7299-b38c-b70ea15316ee.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/2ad2b3b0-c809-0fad-b7f3-881b1c729618.png)

## 勉強後イメージ

デフォルトでついてたとか知らなかった・・・
あまり考えたこともなかったな

## 参考

- [VPCデフォルトのDNSサーバへの通信はSecurity GroupのOutboundルールで制御できないことを確認してみた](https://dev.classmethod.jp/articles/security-group-outbound-rule-cannot-filter-traffic-to-amazon-dns-server/)
- [【AWS】VPCの「Route53 Resolver」について](http://www.code-magagine.com/?p=12803)
Amazon VPC traffic mirroring とは

## 勉強前イメージ

トラフィックミラーリングできるの？

## 調査

### Amazon VPC traffic mirroring とは

AWSのリソースに対して来たトラフィックを別のENIやNLBに複製して流すことが出来ます。
VPCの機能でスケールも可能です。

### Amazon VPC traffic mirroring のメリット

- ネットワークやセキュリティ上の異常を検出

あるリソースに対して来たトラフィックを検出ツールに流すことが出来ます。
それによって迅速に攻撃を検出して対応ができます。

- 問題のトラブルシューティング

リリース前のテストなどの目的で
実際に来ているアクセスをミラーリングして事前にアプリケーションで確認ができます。
リリース前に実際のトラフィックでテストをすることでリリース時の障害を防ぐことが出来ます。

### 用語

- ミラーターゲット

複製先のリソースを指定します。
その際にターゲットはENIとNLB、ゲートウェイロードバランサーのエンドポイントを指定できます。
EC2などに流したい場合はENIを指定してそれをアタッチすることが出来ます。

- ミラーフィルター

ミラーリングするトラフィックの中身を指定します。
インバウンド、アウトバウンドを指定してから、詳細のプロトコルやポート送信元IPなど細かに設定ができます。

- ミラーセッション

ミラーソース(ミラーリングする元のトラフィック)とミラーターゲットを指定してミラーリングをさせます。
この際にミラーフィルターも指定します。

## 勉強後イメージ

ミラーリングできるんだ！！！
実際のアクセス流せたら嬉しいのになぁってときでも使えるってことね。
これは後でミラーリングさせてみたい。

## 参考

- [最新 – VPC トラフィックミラーリング – ネットワークトラフィックを捉えて検査する](https://aws.amazon.com/jp/blogs/news/new-vpc-traffic-mirroring/)
- [トラフィックミラーリングを使用しネットワークトラフィックをキャプチャ](https://protocol.nekono.tokyo/2021/05/24/%E3%83%88%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%83%9F%E3%83%A9%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF/)
- [【ハンズオン】VPCトラフィクミラーリングを使ってEC2にログインせずにパケットキャプチャする方法を学ぼう#AWSSummit](https://dev.classmethod.jp/articles/how-to-capture-packets-outside-ec2-with-vpc-traffic-mirroring/)
WPFでコントロールの周りに同じ幅でドロップシャドウ(影)を付ける方法

# はじめに
本記事は、筆者が実現しようとしてハマった「WPFでコントロールの周りに同じ幅でドロップシャドウ(影)を付ける方法」をまとめます。

# WPFでコントロールの周りに同じ幅でドロップシャドウ(影)を付ける方法

以下の画像のようなに周辺に同じ幅でドロップシャドウ(影)が付いたボタンコントロールを作ることを考えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452292/debc20a9-d534-590f-bfca-9d964e434120.png)
これを実現するには、以下のようなxamlの記載が必要です。
```xml
<Window x:Class="DropShadowSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" Height="100" Width="200">
    <Grid>
        <Button VerticalAlignment="Center" HorizontalAlignment="Center" Content="Button">
            <Button.Effect>
                <!-- ドロップシャドウを付けるためのエフェクト -->
                <DropShadowEffect BlurRadius="5" ShadowDepth="0"/>
            </Button.Effect>
        </Button>
    </Grid>
</Window>
```
ポイントは[ShadowDepthプロパティ](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.media.effects.dropshadoweffect.shadowdepth?view=windowsdesktop-6.0#system-windows-media-effects-dropshadoweffect-shadowdepth)を0にしていることです。ShadowDepthプロパティを0にすることでコントロールの真上から光が当たっているように影ができ、周辺に同じ幅の影ができます。ShadowDepthプロパティの規定値は5であるため、周辺に同じ幅で影を作る際には、明示的にShadowDepthプロパティを0に設定する必要があります。
なるほどわからんDDD ~値オブジェクトの不変性ってなんなんだ~

## はじめに

本記事は、『ドメイン駆動設計(DDD)』について少し勉強し始めた筆者が学ぶ中で「わからん！」→「なるほど！」と思ったことを書いたものです。

間違っていたらそっと教えていただけると幸いです。

## 値オブジェクトって何なんだ

DDDを学び始めると、まず「**値オブジェクト**」と「**エンティティ**」という聞きなれない単語にぶち当たると思います。

値オブジェクトには、以下の特徴があります。
- 不変である
- 交換可能
- IDがない(属性の値が同一なら同一)

エンティティには、以下の特徴があります。
- 可変である
- 属性の値が同一でも別のオブジェクト
- IDがある

「エンティティ」は何となくわかるような気がします。
ユーザーIDで区別できるWebサービスのユーザーとか、社員番号で区別できる社員など、とあるユニークな要素で個々を区別できて、その他の属性(名前とかアイコンとか年齢とか)が変わったり全く同じ属性を持つものが他にあったりしても同一性を保証できるもの、というイメージです。

しかし、値オブジェクトがよくわかりませんでした。

**「値なのに、不変ってどういうこと？」**
**「x=1で定義した後にx=2にするのは、値の変更じゃないの？」**
**「変数をreadonlyにする、みたいな？　でもそれだと使いにくくない？」**

## 値を「変える」のではなく、値を「交換する」

**「値が不変である」** とは、**「x=1のときに、xに2を代入してはならない」** ということではありません。
**「x=1のときに、『1=2』とすることでx=2にしてはならない」** ということなのです。

>**「変数をreadonlyにする、みたいな？　でもそれだと使いにくくない？」**

一度定義した値オブジェクトは破棄する時まで一切値が変更できません！となると、当然使いにくいです。
しかし、値は不変です。1という値に「お前は今日から2だよ」と言ったって2にはなりません。1は1のまま未来永劫不変であり、2は2のまま未来永劫不変です。

しかし、値オブジェクトの特徴には **「交換可能である」** というものがあります。
つまり、値自体は不変ですが、値を**変えたいものに「交換」** することはできます。

1=2にはなりませんが、xという入れ物に入っている1をポイして、代わりに2を入れる(**代入する**)ことでxの値の変更(x=2)を実現できるのです。

そして、**値オブジェクトとして定義したオブジェクトは、この「交換」操作以外で値を変更してはなりません**。

値オブジェクトはシステム固有の値を表すものです。たとえ複雑な振る舞いを持っていようと扱いは"1"や"2"と同じ「値」なのです。

たとえば、とあるシステムがステータスとして「実行中」という値を持っていたとします。
ステータスを変更したいときは、ステータス = "停止" のように、「停止」という値を代入すると思います。
ここで、「実行中」ステータスそのものを「停止」ステータスに書き換えることでステータスを変更してはならないのです。
「実行中」「停止」は値、つまり不変のものとして定義されています。だからこそ、「『実行中』だからシステム動いてるのね」、「『停止』だから今メンテしていいのね」とステータスを信用し、安心して使うことができます。

これがもし、「実行中」の意味が「停止」に変わることがあるとしたら、「『実行中』だからシステム動いて……なくない！？」ってなりますよね。

## まとめ
「値が変わらない」というのは、「変数の中身が変わらない」のではなく、「値そのものの持つ意味が変わらない」ということなのかなと思いました。
「変数の中身が変わってるなら値変わってるじゃん！　x=1の後にx=2したら、xは2になるじゃん！」と思っていましたが、変数と値の理解がごちゃごちゃになっていたんですね。

## 参考書籍
『ドメイン駆動設計入門(成瀬 允宣 著)』
YakiUdonNN 〜ご注文はVRChatでPyTorchを書くことですか？〜（構想）

注意: これはあくまでノリで構想したものであり、実装される保証はありません。 

# YakiUdonNNとは  
VRChat内で積み木のようにモデルを組み、PyTorchモデルにエクスポートするツールです。  
このツールを使うことで視覚的にモデルを作成することが可能になり、より多くのぶいちゃ民に
機械学習（NN関係のみ）を布教できるようになります。
  
## ベースとなる技術  
[VRChat上で動的にシェーダを組める`Graphilia`というツール](https://booth.pm/ja/items/3879571)を参考に作っていこうと思います。

## 名称の由来
Torch🔥Udon Neural Network の略称です。  
Torch &rarr; 松明 &rarr; 炎 &rarr; 焼く &rarr; やきうどん！  
という流れです。  
VRChat上で実装するのでもちろんUdonを用います。  



# 開発フェーズ  
やきうどんは理想が高いです。なのでフェーズを分けて着実に開発していきます。

## 1st, "Layers"  
最初はただレイヤーの名称を書いた箱を用意するだけです。これだけでも人に説明するのに役立ちます。  
各レイヤー間の繋がりや関係は [QvPenというVRChat上で空中にかけるペン](https://booth.pm/ja/items/1555789)を用いて記述します。一番最初なのでこれくらい簡単にします。  

懸念としては、レイヤーブロックのスポーン数でどれだけ重くなるかですね。 

- イメージ画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528087/9e62f6c9-aed1-8807-2930-4d53fb445bff.png)


## 2nd, "Flows"
[1stフェーズ](#1st,-"Layers")で実装したブロックを今度はつなげられるようにします。Graphiliaのような形がベストです。実装頑張ります。 

- イメージ画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528087/b784d931-bb1d-522f-5740-507438ef30f3.png)


## 3rd, "Hyper Parameters"
ここまで作ってきて、まだレイヤーのハイパーパラメータ(`kernel_size`や`in_features`など）を調整することができません。なので、実装します。調整したパラメータはグローバルに同期するようにしましょう。   
- イメージ画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528087/56d29577-928e-d61a-c95f-e382acc323f4.png)



## 4th, "Run"
第3フェーズまででおそらく実装したレイヤーの数によってはいくつかモデルを組めるようになったのではないでしょうか。ここでそのモデルを**PyTorchを使用した際のモデル形式で**エクスポートします。と言ってもローカル環境に.pyファイルを生成するだけですが。こんなファイルを生成したいですね。  
```py  
"""
This files was generated by `Yaki Udon NN v0.0.0`!
"""

import torch
import torch.nn as nn
import yakiudon.nn as yknn

class Model(nn.Module):
    def __init__(self):
        super().__init__():
        self.layer1 = nn.Linear(100,200)
        self.layer2 = yknn.Reshape((200,), (20,10))

    def forward(self, x):
        h = x
        h = self.layer1(h)
        h = self.layer2(h)
        o = h
        return o
```  

そしてMNIST分類問題でも解くテンプレートノートブックを作成して、そこのレイヤー定義の部分をこの生成されたファイルで置き換えれば良いのです！  

# 最後に
とりあえず構想だけまとめたので、実装するかは怪しいです。強化学習とかでよくシミュレーターを扱うのでVRChatなどのメタバース環境とAIは深い関係を持つことになりそうです。そうなると思いますし、機械学習は知能の真髄に迫るメチャクチャ面白い分野なので多くの人に関心を持っていただけるようにしたい限りです。
インフラエンジニアこそ、技術ブログを公開しよう！

# この記事で書くこと

技術ブログを書くと色々いいことがあるよということを書きます。
普段コードをガリガリ書く開発エンジニアの方にも読んでいただきたいですが、インフラエンジニアのような普段コードを書かないエンジニアの方に特に見てほしいことを書きます。

# 私(投稿者)について

- 社会人エンジニアデビュー(社会人歴=エンジニア歴)
- ずっとインフラエンジニア (エンジニア歴=インフラエンジニア歴)
- コードはほとんど書かない(たまにshellとかpythonとか簡単なスクリプトを作る程度)
- 普段やっていること
    - AWSの設計/構築/運用
    - NewRelicやDatadogを利用した監視の設計/導入


# 技術ブログ書くのってめんどくさいよね

技術ブログを作成して公開するのはとても面倒臭いです。。。
自分の頭にあることを整理して、言語化するにはかなりの労力が必要です。。。

しかし、その手間に見合うメリットがあると思います！
私が思う、インフラエンジニアが技術ブログを公開するメリットを紹介していきます！

# インフラエンジニアが技術ブログを公開するメリット

## スキルの証明になる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/33eb3211-a4a5-3a36-a0c6-37d6a1f61596.png)

普段コードをガリガリ書くエンジニアであれば、自分が書いたコードをGitなどのレポジトリに保存し、それを公開することでスキルの証明ができます。エンジニアの採用面接でも、Gitを見せろということがありますよね。

ではインフラエンジニアなど普段コードを書かないエンジニアはどうやってスキルを証明するか？
自分の成果物を公開していないとスキルの証明が難しいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/4d5b156a-ef0c-006f-0872-ae826218da1d.png)

自分が業務でやったこと/学んだこと/やらかしたことを技術ブログで公開しましょう！
構築した際の記録や手順、ハマったことの調査記録や解決手段、ポストモーテムなどなんでも良いと思います。
そのアウトプットの積み重ねがスキルの証明になります！

(機密情報の取り扱いには十分注意しましょう)

## 備忘になる

当たり前の話ですが、アウトプットすることは備忘になります。
ここで注意事項があります。それは**未来の自分は他人**であるということです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/ca72475d-e677-5eae-53f5-ba95d696f598.png)

皆さんご経験がないでしょうか？
チャチャっと自分用に雑にメモをして、それを数ヶ月後に見ると「????」状態になることが。

自分のやったことを技術ブログとして公開するということは、他人に見られるという前提で書くことになります。そうすると自ずと丁寧さ/わかりやすさを意識して書くことになります。

他人に見られても良いくらい丁寧に書いたものは、将来の自分(=他人)が見ても理解できるものになっているでしょう。


## 理解度がわかる

一見理解していると思っていたことでも、ブログに書くために言語化しようとしてみたらなかなかできないことがあります。

**言語化できない=理解できていない**です。

読んでわかった気になっていることも、いざブログに書き出してみようとして初めて自分の理解が曖昧だったと気づくことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/1d27fa70-f3e1-478e-1695-349ac471dcb9.png)

理解できていないことはインプットしましょう！アウトプットできるようになるまで！

## 自分の誤りに気づける

(理解度の話に似てますが...)

誤った知識を公開していれば、(多分)指摘という名のまさかりが飛んできます。
ショックを受けますが、自分の誤りに気づけるチャンスです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/611ae481-d2c7-e218-2283-5d2ee66f889a.png)

そして、誤っていたところは必ずインプットし直して、修正しましょう！

「インプット → アウトプット → まさかり → インプット → インプット .....」といったサイクルを経て、自分の知識を確かなものにしていくことができると思います！

## 認知/信頼してもらえる

技術ブログをコンスタントに公開している人は、「お！この人またブログ書いているな！」と社内外で認知してもらいやすくなります。そして、それが誰かの助けになれば、信頼を得ることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/c4de93c4-20a4-ef19-ae20-1f7162841d74.png)

数年前、転職活動中に、私が投稿したQittaの記事を過去に読んだことのある方が面接官になり、選考が有利に進んだ経験があります。

技術ブログを公開すると他の人から認知/信頼されて、それが思わぬ形となって自分の助けになります！

# 最後に

インフラエンジニアが技術ブログを公開すると、以下のメリットがある
- スキルの証明になる
- 備忘になる
- 理解度がわかる
- 自分の誤りに気づける
- 認知/信頼してもらえる

もちろん上記はインフラエンジニア以外の全てのエンジニアが当てはまることだと思っています。
私がインフラエンジニアなので、他のインフラエンジニアの方にも技術ブログを公開する良さについて理解して欲しいと思い、記事にこのようなタイトルをつけさせていただきました。

これを見て、一人でも多くの方が技術ブログを公開するようになっていただけると幸いです！
Cloud Storage for Firebaseで、bucketごとにセキュリティルールを割り当てる

Firebaseを使ったサービスに関して、サービスによっては複数bucketを使いたい場合があります。デフォルトだと単一bucketしかセキュリティルールを割り当てられないのですが、.firebasercおよびfirebase.jsonの設定により対応できました。ここにその方法を記載します。

<!-- more -->

## 全体方針
以下の方針を満たすよう、設定を行います。

- 開発環境/本番環境向けプロジェクトごとにセキュリティルールを割り当てるようにする
  - 開発環境デプロイ時に、本番環境のbucketのルールを書き換えないようにするため(逆も同様)

![複数bucketへのセキュリティルール付与 構成例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1967276/ca1f9be0-2f0c-52f5-03b4-2c814158d2ad.png)
複数bucketへのセキュリティルール付与 構成例

## 1. デプロイターゲットの定義

以下のコマンドを実行し、開発環境/本番環境ごとにデプロイターゲットを定義します。デプロイターゲット名は任意の名前でOKです。

```bash
function create_storage_deploy_targets () {
  projectId=$1

  firebase use $projectId

# 開発環境のbucketごとにデプロイターゲットを追加する
# firebase target:apply storage デプロイターゲット名 bucket名

  firebase target:apply storage buckets_appspot_com ${projectId}.appspot.com
  firebase target:apply storage buckets_foo ${projectId}_foo
  firebase target:apply storage buckets_bar ${projectId}_bar
}

create_storage_deploy_targets (開発環境のプロジェクトID)
create_storage_deploy_targets (本番環境のプロジェクトID)
```

上記を実行すると、以下の様に.firebasercが更新されます。
(開発環境=some_dev, 本番環境=some_productionとして記載しています)

```json
{
  "projects": {
    "default": "some_dev"
  },
  "targets": {
    "some_dev": {
      "storage": {
        "buckets_appspot_com": [
          "some_dev.appspot.com"
        ],
        "buckets_foo": [
          "some_dev_foo"
        ],
        "buckets_bar": [
          "some_dev_bar"
        ]
      }
    },
    "some_production": {
      "storage": {
        "buckets_appspot_com": [
          "some_production.appspot.com"
        ],
        "buckets_foo": [
          "some_production_foo"
        ],
        "buckets_bar": [
          "some_production_bar"
        ]
      }
    }
  }
}
```


- 開発環境(some_dev)にデプロイするときは以下bucketが対象になる
  - buckets_appspot_comターゲット: some_dev.appspot.comバケット
  - buckets_fooターゲット: some_dev_fooバケット
  - buckets_barターゲット: some_dev_barバケット
- 本番環境(some_production)にデプロイするときは以下bucketが対象になる
  - buckets_appspot_comターゲット: some_production.appspot.comバケット
  - buckets_fooターゲット: some_production_fooバケット
  - buckets_barターゲット: some_production_barバケット

## 2. デプロイターゲットごとのセキュリティルール割り当て
ターゲットごとに設定をfirebase.jsonに追記します。デプロイターゲットごとに、どのセキュリティルールを割り当てるかを記載します。

**実例**

```json
{
  "storage": [
    {
      "target": "buckets_appspot_com",
      "rules": "storage_appspot_com.rules"
    },
    {
      "target": "buckets_foo",
      "rules": "storage_foo.rules"
    },
    {
      "target": "buckets_bar",
      "rules": "storage_bar.rules"
    }
  ],
}
```

以上により、デプロイ時に各バケットに対してセキュリティルールが適用されます。
プロジェクトごとに対象バケットを切り分けているので、意図せず別の環境にセキュリティルールは適用されません。

- - - 

株式会社ピリカでは、我々と共に、大きく、 深刻で、とびきり面白いポイ捨てごみ問題の解決を一緒に取り組んでくださる方を募集しています。

現在、エンジニアを積極採用中です！！

ご興味がございましたら、ぜひ採用ページをご覧ください！

https://corp.pirika.org/recruit/
GithubからGitpodを開く

## 結論

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/39cae3d8-dbfb-947f-b665-9993909823c0.png)

FirefoxやChromeのエクステンションがあり、これを追加することで、GithubのページにもGitpodへのリンクを表示できるようになる。

Firefox用拡張

https://addons.mozilla.org/ja/firefox/addon/gitpod/

Chrome用拡張

https://chrome.google.com/webstore/detail/gitpod-always-ready-to-co/dodmmooeoklaejobgleioelladacbeki

## Gitlab

GitlabはデフォルトでGitpodと連携されており、WebIDEでGitpodを選ぶことができる。

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/25451dfe-8fe3-126c-8000-51011b3b9964.png)](https://docs.gitlab.com/ee/integration/gitpod.html)

Githubはマイクロソフト傘下のサービスで、[Github Codespace](https://github.co.jp/features/codespaces)を展開しており、3rdパーティのIDEへの接続は今後もあまり改善されないかもしれない。
RPAを導入した後について考えてみる

RPAのコンセプトとして少ない投資で大きな成果というのがあると思うんですが、
RPAの場合、システム開発によってシステム提供する場合にはなかった運用コストというのがあるように感じています。
これに関しては現場で小規模なロボットを自作して活用する場合は影に隠れてしまって出てこない部分なのではと思うのですが、
RPAの開発を行って提供するような部署が規模の大きなロボットを作成する場合、抱えているロボットの規模と数が影響して表に出てきてしまうと思います。
実際にロボットを導入した後の話について少々書いてみます。
# RPAの動作安定性について
しばしば、RPAのロボットとシステム開発で作成したアプリケーションに同等の動作安定性があるかのように思い違いをしているケースがあります。
RPAの場合、本来は人が操作する為に作成されたインターフェイスをソフトウエアに操作させる関係でアプリケーションと同じ安定性を保証する事は出来ません。
人が操作するという部分は、人が目で見て判断し、画面を操作するという部分になりますが、人の場合はその時に行っている作業以外の情報が横やりを入れてきても良しなに対処できます。
ロボットにそれが出来るかというと100%の対応は不可能です。
たとえば、あるツールを実行して作業完了のダイアログが表示されるのを待ち合せているとします。
表示されたダイアログのOKボタンを押してダイアログを消し、ツールを終了させる流れの場合にダイアログが表示された直後、そのダイアログの上にバックグラウンドで動作しているソフトウエアのポップアップが重なったとします。
ロボットはダイアログのOKボタンの位置をクリックしますが、上にポップアップが重なっている場合にクリックは空振りします。
ダイアログが消えるのを待っているステップでいつまでたってもダイアログが消えないので待ち合わせのタイムアウトでエラーになり、ツールは閉じる事が出来ずに残ります。
ポップアップが一定時間で閉じるタイプの場合は後で確認した時には消えているので何が原因でタイムアウトが起きたのかはわからない事になります。
起こりうる事態にすべて対応する事は事実上不可能なのでどうしても失敗する可能性が出てきます。
要因は一定ではないので起こらない時は全く発生せず、発生する時は立て続けに発生します。
RPAによる自動化に関してはRPAでエラーが発生した場合に人間が対応する事が出来るようにしておく必要があり、
そのリスクは常に存在し続けます。
RPAの場合、ネットワークの状態による遅延やPCの動作負荷による表示タイミングの変化によって最初は問題なく動いていた物が突然エラーを出して動かなくなるケースがアプリケーションに比べて多いのです。
# RPAの不安定さが生む運用コスト
現場で作成した規模が小さなロボットの場合は、
作った本人が使っているような場合も多いので動作中に失敗してもすぐにリカバリーできているので表に出てきにくいのですが、
開発部署が作成した規模の大きなロボットに関しては利用者側で全部を理解しているわけではない為、
利用者側だけで判断する事が難しく、開発部署に対して問い合わせる事になります。
この問い合わせに対する対応はアプリケーションを提供している場合に比べると遥かに多いというのが実感です。
ロボットをリリースするとこの問い合わせが不定期に発生します。
RPAの問い合わせに関しては実際に処理を実行した結果発生しているという状況の為、即時の対応が求められることがほとんどです。
原因の調査から始まって必要に応じてロボットの調整（タイムアウト時間の調整等々）や運用上の注意事項の連絡etc...
存外時間を取られるケースが多いのです。こうした運用コストはリリースするロボット数が増えれば増える程、増大します。
# 運用側で考慮しておく必要があるコスト
RPAが持つ仕組み上の制限から発生する不安定さは、運用する側にも影響を与えます。
通常、業務用のツールとしてリリースされたアプリケーションはネットワークの影響やサーバーのリソースなどの要因を除いて安定して動作するのが普通です。
この場合、動作に失敗して中途半端な状態でツールが終了してしまうようなケースはあまりないのでリカバリー作業を人間が行う必要はほとんどありません。
RPAの場合は画面の操作時に他のアプリケーションによる想定外の割り込み等があれば、簡単に失敗します。
それこそ、処理の途中の終了待ちで空振りしてしまった等の現象で途中まで処理された状態で終わってしまうケースは割と多いのです。
こうした人手によるリカバリー作業は、運が悪いと何回も連続で発生する可能性があります。
うまく動いて当たり前という感覚で運用していると現実のギャップで苦情が出るケースもあります。
現場にリリースする際にきちんと説明しておかないとRPAを入れなければよかったという話になりかねないので注意が必要です。
# 運用コストも考慮に入れた上での適応計画
RPAは作成した後にかかる運用コストも馬鹿になりません。
稼働しているロボットの数が少ないうちは内部で吸収していた物がリリースされたロボットが増えていくにしたがって吸収しきれなくなってきます。自動化を進めていくとロボットの稼働数が増加するのは当たり前の話ですからそれに伴って発生する運用コストの部分も考慮入れて自動化をどう進めていくかを検討すべきです。
作成した後もコストがかかるのだという認識を持ちましょう。
GitHub App Token

# Github actionsでpersonal access tokenではなくチームでの利用を加味した運用に変える
github actionを使っていて他のリポジトリへイベント通知させるためには、token 情報を設定する必要があります。

GitHub のpersonal access tokenを発行する方法でもいいとは思うのですが、チームでの開発には適さないかと。（個人それぞれのpersonal token を発行して運用するのは少し乱暴な気がする。）

チーム開発でsecrets.GITHUB_TOKENの権限の範囲を超えて何か作業したい時、personal tokenでは、時間制限があったり、少しめんどくさいなと思うことがあります。

そこでGiHub App Tokenが良さげということで調べみようと思います。
github Appsをチーム開発用のリポジトリ配下に作成する。

目標としてはPersonal Access TOKEN に依存せずにsecrets.GITHUB_TOKEN の権限を越えてgithubを操作できるになること

そもそもオーガナイゼーションについて理解していないのでそこから理解しようと思います
# Organizationとは
組織管理下にリポジトリをおけるようにするための仕組み
もし仮に個人アカウントのリポジトリを使っていると、もしメンバーが組織から外れたりしたらリポジトリのオーナーを映したりもしくは参加メンバーを付け替えたりととにかく面倒になってしまう。

### オーガナイゼーションでできることは
* リポジトリの作成管理
* メンバーの追加削除
* チームの作成管理

チームはオーガナイゼーションのメンバーをグルーピングする機能でチーム単位で管理したり権限付与ができる

無料でどこまで出来るのか
プランとしては以下の通り

* 無料プラン
* チームプラン
* エンタープライズ向け

#### 無料では
* 公開非公開のリポジトリを無制限に作れる
* セキュリティとバージョンの自動更新
* 2000時間 github Action を使える

#### チームプランでは
* 無料版に含まれるもの全てに加えて
* github code スペースへのアクセス
* プルリクエストにおける複数のレビュアー
* github actions が3000時間になる

初めのうちはとりあえず無料プランで作ってしまっても大丈夫なんじゃないか？という見解です。

Personal Access Token は学習コストが低くて便利だが、組織でメンテナンスをしていく場合は後の運用コストのほうが高くなるため、GitHub Apps を用いてメンテナンスするほうが中長期的に見て運用コストは下がる。


https://docs.github.com/ja/github-ae@latest/developers/apps/building-github-apps/creating-a-github-app

https://zenn.dev/suzutan/articles/how-to-use-github-apps-token-in-github-actions

https://github.com/marketplace/actions/github-app-token
Wireshark(tshark)で自動的に記録を取得する

## Wiresharkで継続して記録を取りたい
…がいちいち画面に張り付いているわけにもいかないのでcronとかで取りあえず取ってみる。

容量も大きいので１時間おきにファイルを作成してその後圧縮保管する。
１日おきくらいにデータを他所に移すことで継続してデータを取れるようにする。

### 環境
* Rocky Linux release 9.1 (Blue Onyx)
* TShark (Wireshark) 3.4.10
* gzip 1.12

### パッケージインストール
```shell_session
dnf install wireshark-cli
```

### 動作テスト
```shell_session
/usr/bin/tshark -D
Running as user "root" and group "root". This could be dangerous.
1. enp2s0
2. enp0s31f6
3. lo (Loopback)
4. any
5. bluetooth-monitor
6. nflog
7. nfqueue
8. usbmon0
9. usbmon1
10. usbmon2
11. ciscodump (Cisco remote capture)
12. sshdump (SSH remote capture)
13. udpdump (UDP Listener remote capture)

/usr/bin/tshark -i <取りたいインタフェース> -w "<格納場所とファイル名>" -a duration:<取りたい秒数>
```

### 動作が確認できたらcronに登録
```shell_session
#正時から1時間とる、ログを取り直すのに1時間で停止
0 */1 * * * root /usr/bin/tshark -i <取りたいインタフェース> -w "/<格納場所>/$(date +\%Y-\%m-\%d_\%H-\%M).log" -a duration:3599
```
【VS Code】拡張機能のエクスポートコマンド

# コマンド
インストールコマンドの形式でファイルに出力する。

```shell:
# 出力
＄ code --list-extensions | xargs -L 1 echo code --install-extension > extensions_list.txt

# 確認
$ cat extensions_list.txt
code --install-extension 42Crunch.vscode-openapi
code --install-extension aaron-bond.better-comments
code --install-extension adpyke.vscode-sql-formatter
code --install-extension adrianwilczynski.terminal-commands
code --install-extension aeschli.vscode-css-formatter
code --install-extension albert.TabOut
code --install-extension alefragnani.Bookmarks
code --install-extension alefragnani.project-manager
...
```

# 参考
https://www.hide10.com/archives/32354
C# enum(列挙型)からのint（整数）、string（文字列）への変換

## 0.0 はじめに
C#の列挙型enum（イーナム）はswitch文などでとても活躍しますが、実はデフォルトで各定数に対して0(ゼロ)から順番に整数値が付けられています。
ちなみにこの数値は **=100** のように自分で設定することができます。
また、列挙型enumの各定数を文字列として使うこともできます。
これらの使い方を説明します。






## 1.0 enumの整数や文字列の使い方
下記スクリプト内のStart関数を見てください。
数値にするには(int)でキャスト、文字列にするにはToString()を使います。



```C# Test.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    // enumの定義
    enum Num {
        ZERO, // = 0
        ONE, // = 1
        TWO, // = 2
        SOME = 100,
    }

    Num num = Num.ONE;

    private void Start() {
        Debug.Log("NUM.ZEROのenum型は " + Num.ZERO + " です");
        Debug.Log("NUM.ONEの数字は" + (int)Num.ONE + " です");
        Debug.Log("NUM.TWOの文字は" + Num.TWO.ToString() + " です");
        Debug.Log("Num.SOMEの数字は" + (int)Num.SOME + " です");
    }
}
```





実行するとこのような感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/4cd95576-cd5c-d8b2-cc89-0edd8bfcd28c.png)










## 2.0 整数や文字列からのenumへの変換方法
下記スクリプト内のStart関数を見てください。
Enumを使いますので頭にusing System;の追加が必要です。





```C# Test.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System; // 追加

public class Test : MonoBehaviour
{
    // enumの定義
    enum Num {
        ZERO, // = 0
        ONE, // = 1
        TWO, // = 2
        SOME = 100,
    }

    Num num = Num.ONE;

    private void Start() {
        Debug.Log("整数100をeunm型Numに変換すると " + (Num)Enum.ToObject(typeof(Num), 100) + " です");
        Debug.Log("文字ZEROをeunm型Numに変換すると " + (Num)Enum.Parse(typeof(Num), "ZERO") + " です");
    }
}
```






実行するとこのような感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/794e7e2e-0be1-95d5-4b81-16daf7ba9b96.png)
Dockerで手っ取り早くpostgresを立ち上げるコマンドメモ

## 手順

コンテナ起動

```bash
docker run --name some-postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres
```

コンテナに入って

```bash
docker exec -it some-postgres bash
```

DBに接続する（パスワードを聞かれたら password）

```bash
psql -U postgres
```

## 手順２（こっちは標準エラーにログを出力する）

```bash
docker run -it \
  -p 5432:5432 \
  -e POSTGRES_HOST_AUTH_METHOD=trust \
  --name local_postgres \
  postgres:14 \
  -c log_destination=stderr \
  -c log_statement=all \
  -c log_connections=on \
  -c log_disconnections=on
```

ログを見たい場合

```bash
docker logs -f local_postgres
```

ログが溜まりすぎた場合は、[docker logsを削除する方法](https://qiita.com/TachiTech/items/ae4f5da70cadc392516e) を参考にログをクリアする。
※`rm`で消すわけではないので注意

## 参照

* [postgresのDockerHub](https://hub.docker.com/_/postgres)

## リンク

* [Pythonのコンテナからpostgres用のクライアントを入れて接続する](https://qiita.com/k_hoso/private/6c06e0fa93c6e398b029)

```

## 参照

* [postgresのDockerHub](https://hub.docker.com/_/postgres)

## リンク

* [Pythonのコンテナからpostgres用のクライアントを入れて接続する](https://qiita.com/k_hoso/private/6c06e0fa93c6e398b029)
PHPで使用した関数備忘録

## ****nl2br****

****nl2br関数とは改行コード「\n」を実際に改行として出力してくれる関数****

```jsx
<?php
  echo 'こんにちは';
  echo nl2br('/n');
  echo 'さようなら';

<実行結果>
こんにちは
さようなら
```

例）

```jsx
$hoge_text = nl2br(str_replace(['<script', '</script'], ['&lt;script', '&lt;/script'], $hoge['hoge_text']));
```

## htmlspecialchars

PHPでエスケープ処理をするための関数に、htmlspecialchars()があり、こちらを利用すると、HTMLの中では特殊な身を持つため直接角ことができない<や>といった記号等を、正しく画面に<や>といった記号のまま出力できるような形に変換出来ます。

```jsx
htmlspecialchars( 文字列, 変換パターン, 文字コード )
```

| 名前 | 説明 | 必須 | タイプ |
| --- | --- | --- | --- |
| 文字列 | 変換する文字列。 | 必須 | 文字列 |
| 変換パターン | 一重引用符と二重引用符のエンコード。
ENT_COMPAT：二重引用符を変換し、単一引用符は変更しません。
ENT_COMPATはデフォルト設定です
ENT_QUOTES：一重引用符と二重引用符の両方を変換します。
ENT_NOQUOTES：一重引用符も二重引用符も変換しません。 | オプション | 整数 |
| 文字コード | 使用する文字セットを参照します。
文字セットのリスト。
ISO-8859-1：西ヨーロッパ、Latin-1 [デフォルトの文字セット]。
ISO-8859-15：西ヨーロッパ、ラテン-9。UTF-8：ASCII互換のマルチバイト8ビットUnicode。
cp866：DOS固有のキリル文字セット。
cp1251：Windows固有のキリル文字セット。
cp1252：西ヨーロッパのWindows固有の文字セット。
KOI8-R：ロシア語。
BIG5：繁体字中国語。
GB2312：簡体字中国語。
BIG5-HKSCS：Big5、香港拡張あり。
Shift_JIS：日本語。
EUC-JP：日本語。 | オプション | 文字列 |
文字の出力その他

# 文字の出力
[前回の記事](https://qiita.com/K_miyuu/items/4a206eba40e44d574721 "文字を表示してみる")にもあるように、文字列の場合は「”　”」でかこってあげます。

■改行について
System.out.println("今日も良い天気です");
System.out.print("今日も良い天気です");
→ln（LN）を削除すると、改行がなくなります。
![Eclips初期設定13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730862/c0515072-f6e2-35fa-c99a-8ceb7031c42e.png)
![Eclips初期設定14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730862/7696c811-2619-ab39-d76d-ea0c43b974f5.png)

:::note info
エスケープシーケンスについて
文章として「"」を表示したいとき（文字列出力の意味ではない単なる記号として表示させたい場合）
は、「￥”」と入力する必要がある。
※海外では「\\"」（バックスラッシュ）である。
:::
![Eclips初期設定15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730862/58608f35-8b85-78ca-0a9a-d08150ecc8da.png)
VSCodeでYJITをデバッグする

# ビルドの設定

```
../configure --prefix="${HOME}/.rbenv/versions/yjit" --disable-install-doc --enable-yjit=dev
```

`--enable-yjit=dev` じゃないとデバッグできないのかは未検証。

# Cの設定
Settings (Workspace) > Extensions > Makefile Tools > Makefile > Make Directory: out-of-place ビルドのディレクトリを指定する

# Rustの設定
Cargo.tomlの場所を自動で見つけられている気がするので何もしなくても良さそうだが、`.vscode/settings.json` に以下を足すと明示的にCargo.tomlを指定できる。

```json
{
    "rust-analyzer.linkedProjects": ["/path/to/Cargo.toml"],
}
```

# LLDBの設定
CにClangを使っていない場合でもRust側でlldbが必須になるので、Cも含めてLLDBでデバッグする必要がある。

* `apt install lldb` とかでLLDBをいれる。
* VSCodeにCodeLLDBという拡張をいれる。

# Workspaceの設定

## tasks.json の設定
`${defaultBuildTask}` を設定しておく。

```json:.vscode/tasks.json
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "make -C .yjit-arm64 -j8",
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}
```

## launch.json の設定
```json:.vscode/launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lldb",
            "name": "Run ruby",
            "request": "launch",
            "program": "${workspaceFolder}/.yjit-arm64/ruby",
            "args": ["--disable-gems", "--yjit-call-threshold=3", "/Users/k0kubun/tmp/a.rb"],
            "preLaunchTask": "${defaultBuildTask}"
        }
    ]
}
```

後からわかったことだが、tasks.jsonとpreLaunchTaskは省略しても動くぽい。

## Optional: rust-analyzerに渡るfeatureを変更
```json:.vscode/settings.json
{
    "rust-analyzer.cargo.features": [
        "disasm",
    ],
}
```

# デバッグ実行
適当にブレークポイントを足した後、Run and Debugのところで緑の三角形 (Start Debugging) を押す。
【Ruby】.gemspecについて

## `.gemspec`について
```sample_gem.gemspec
Gem::Specification.new do |spec|
  spec.name = "sample_gem"
  spec.version = "Gemのバージョン"
  spec.authors = ["作成者"]
  spec.email = ["メールアドレス"]
  spec.homepage = "ホームページ"
  spec.summary = "要約"
  spec.license = "ライセンス"

  spec.metadata = {
    "bug_tracker_uri" => "https://github.com/username/sample_gem/issues",
    "documentation_uri" => "https://github.com/username/sample_gem",
    "label" => "Gem名",
    "rubygems_mfa_required" => "真偽値",
    "source_code_uri" => "https://github.com/username/sample_gem"
  }

  spec.signing_key = Gem.default_key_path
  spec.cert_chain = [Gem.default_cert_path]

  spec.required_ruby_version = "~> 3.1"
  spec.add_dependency "auto_injector", "~> 0.5"
  spec.add_dependency "cogger", "~> 0.2"
  spec.add_dependency "dry-container", "~> 0.10"
  spec.add_dependency "git_plus", "~> 1.4"
  spec.add_dependency "pastel", "~> 0.8"
  spec.add_dependency "refinements", "~> 9.6"
  spec.add_dependency "runcom", "~> 8.5"
  spec.add_dependency "spek", "~> 0.3"
  spec.add_dependency "zeitwerk", "~> 2.5"

  spec.bindir = "exe"
  spec.executables << "sample-gem"
  spec.extra_rdoc_files = Dir["README*", "LICENSE*"]
  spec.files = Dir["*.gemspec", "lib/**/*"]
end

```
リモートワークって…

結論：選択肢が増えていいよね！けど、フルリモートは俺には無理だわ。

所感：オフィスに出社する。って前提が崩れて、午後から出社してもいいし、気分で終日家で働いてもいいし最高。前々からそういう働き方してる人も大勢いたんだろうけど、下々にも広く普及した感じ。
Qiita Night～モノリスからの脱却って実際どうなの？マイクロサービス化について赤裸々に語る～を視聴しました。

## イベント概要

https://increments.connpass.com/event/252389/

## 動機

仕事上マイクロサービス化を行った経験があります。
うまくいったところ、うまくいかなかったところなどあり、他社はどんな感じでやってるのか気になったので参加しました。

## 内容

### LT①「マイクロサービス化と共にマイクロサービス思考を組織に浸透させる」

* どこにでも出てくるコンウェイの法則
    * システムの設計と組織構造は似てしまう
* マイクロサービス化を語ると絶対組織構造の話になってしまう
    * 分割されたサービスを誰がどう保守管理していくのか
    * 密接な関係があるということ

### LT②「足場固めからやるマイクロサービス」

* 分散されたモノリス
* **「改善の過渡期は非常に長い」**
    * これめちゃくちゃ分かる

### トークセッション

* 各社のいろんな取り組みや状況の共有
* マイクロサービス完全に成功してるところない説、みんな道半ばの印象

## まとめ

やっぱり銀の弾丸はなく、泥臭くても1歩ずつ進むしかないのだなぁという印象。
マイクロサービス化→機能が分離される→そこを知る人が辞める→誰も分からず動いているサービスが誕生する。
こういう問題がまぁまぁあると思っているが、これはマイクロサービス化の問題というかそれに密接に関係する組織構造の問題なのだなと感じました。
SaaSって結局なんなの

結論：PCにインストールするアプリケーションツールではなく、webブラウザで使えるすべてのツール

もう少し詳しく：いままで自社に必要なツールは自作してきたけど、それをやめて一般的なアプリケーションを入れるようになった。それもイケてない時代になったので、インターネットに繋がればどんな環境でも、さらに誰でも同じインターフェースで操作できたほうがいいよね。みたいな経緯で流行ってるサービス提供の仕組み

SaaSツールの例：officeOnlineやweb版gmailなどブラウザで利用できて、カスタマイズ性に乏しいやつ。つか、QiitaもSaaSだわ。

所感：SaaSツールを売るようになって初めて概念を理解した…
衝撃！ XAMPP の発音は「ザンプ」じゃ無かった & 2022年度のローカルLAMP開発環境まとめ

最近、ローカルの開発環境は、Docker 、(ローカルじゃないけれど) AWS サーバーたてたり、Laravel Valet などを使っています。

しかし、Concrete CMS の初心者向けインストール動画チュートリアルを作るにあたり、初心者でも簡単にローカル開発環境を作るのは何が良いかと改めてリサーチしていました。

そこで、久しぶりに XAMPP のことを調べてみようと思って、XAMPP の公式サイトに訪問。
https://www.apachefriends.org/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44367/4e5141e8-37cb-a57b-fe9b-f1a124f1deb3.png)

何気なく、トップページに貼られている公式画を見た時、耳を疑いました！

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

「**シャンプ**」 って言ってる！

公式サイトの動画やから、正式な発音よね！？

14年以上、「ザンプ」と発音していた僕から、同志たちに伝えます。

お酒のネタにしてください。


# おまけ：最近の PHP + MySQL (MariaDB) で使えるローカル環境一覧

(2022/7/29 時点)

## 古き良き系

MAMP 
https://www.mamp.info/

XAMPP 
https://www.apachefriends.org/jp/index.html

## ちょっとモダンなCLI系 (Mac 限定)

Laravel Valet 
https://laravel.com/docs/9.x/valet
[Qiita] Mac のミニマムな Web サーバー Valet 超簡単メモ  
https://qiita.com/katzueno/items/49ca8ca2eefbe0a61b63

## 最近ナウイ Docker 関連

Docker 
https://www.docker.com/

Docker5 (Concrete CMS の Docker コミュニティイメージ)
https://github.com/concrete5-community/docker5

GitPod (Git から Docker 開発環境を一瞬で立てられるサービス)
https://www.gitpod.io/ 

[YouTube] GitPod で Concrete CMS の動作環境を作る 
https://youtu.be/sniQeRWxb0I

Local (旧: Local by Flywheel) 
https://localwp.com/
WordPress 向けだけれど、中身を変えたら PHP+MySQL 開発環境になる。GUI 的に簡単なので、これが初心者向けチュートリアルの最有力候補になってます。
UnityがUSB接続中のAndroid端末を認識しない

Unityとは別プロジェクトでAndroid SDKを使用している時は注意する

## 問題
- UnityがUSB接続中のAndroid端末を認識しない。
   - Build Settings内Run Deviceに現れない。
   ![build_settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251814/ccd46601-9e50-365e-2f09-6b0d3e550301.png)

## 背景
- Unityが参照するadbバージョンと別プロジェクト(Android Studio等でインストール)で使用中のadbバージョンが異なっていた
   - Unity-editorでandroidのモジュールを追加した際、独自にandroid-sdkをインストールしている
   - adbのありかは、`Applications/Unity/Hub/Editor/[unity-version]/PlaybackEngines/AndroidPlayer/SDK/Platform-tools/`
      - Unityが参照するAndroid SDKのパスは`Edit>Preferences>External Tools>Android>SDK`で確認可能
   - 一方で、Android Studioで認識しているのは`~/Library/Android/sdk`
      - .zshrcにplatform-toolsへのパスを登録していた
```.zshrc
export PATH="$PATH":"/Users/[username]/Library/Android/sdk/platform-tools/"
```
## 原因
- Unity起動中に`adb devices`などのコマンドを打つと、adbサーバーバージョンが異なるため、Android Studioが参照するadbサーバーに切り替わってしまい、Unity側から端末を認識できなかった。
```
$ adb devices
adb server version (40) doesn't match this client (41); killing...
```

### 補足
adbはadbクライアントとadbサーバーから構成される。 
[adbの仕組み](https://developer.android.com/studio/command-line/adb?hl=ja#howadbworks)
>adb クライアントを起動すると、まず稼働中の adb サーバー プロセスがすでに存在していないかどうかがチェックされます。サーバー プロセスが存在しない場合は、クライアントによりサーバー プロセスが起動します。
Webpackeコンパイルで詰んだこと

#備考
技術関連の詳細記載はないので悪しからず。

# なぜ起こったか
Herokuにデプロイしたのがきっかけです。
その際に依存関係解消のため、対象のバージョンを変更した。
デプロイに成功したが、ローカルでコンパイルできなくなった。
ローカルで関連するところ、モジュールなどインストールやアンインスール、アップデートした。

# 結論
本来、エラーを解決していくのが筋かと思いますが、さまざま調べ試して詰んだので、
アプリ構築を初めからやり直しました。遠回りかもしれませんが、
これも一つの方法かと思います。幸い、体系的まとまった教材を参考にしていたので、
再構築もし易かったです。
なにより、作り直したことで問題となっていたコンパイルが解消したのが良かったと思います。
公開リンク(Public Link)

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)


+ [公開リンクを一括生成して、紐付ける](https://qiita.com/Keiji_otsubo/items/994289ccda232bd66848)

# ファイルをバージョンアップしても公開リンクは変わらない

+ [ファイル自動アップロードの仕組み開発について](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007clsHv)

:::note
ファイルのバージョンが上がっても公開リンクは変わらなかったです。

ContentDistributionというオブジェクトはファイルのバージョンを変えても１つしかできないようになっていました。（このオブジェクトのDistributionPublicUrlに公開リンクがあります）

ContentVerionオブジェクトは関係なかったです。
:::


# 新規作成ボタンがない

+ [Missing "New" button to create a new Public Group](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007N9jZZSAZ)

:::note
I relaunched the session and the "New" button magically appeared
:::

+ [Unable to Create New Public Group (missing `New` button)](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A8SlGSAV)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7bb074e9-3f4a-99d3-b846-fae48fef293a.png)


# エラー

+ [Not able to share files using public links](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000HEXjRSAX)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a0b3165f-3522-3744-a94b-ec4f8378a6ad.png)
create unrestricted public link(無制限の公開リンク？)

# 既知の問題

+ [ライブラリに追加または共有されたファイルの「パブリックリンク」を作成できません](https://trailblazer.salesforce.com/issues_view?id=a1p4V0000003wXXQAY&title=unable-to-create-a-public-link-for-files-that-have-been-added-to-or-shared-to-a-library)
+ [Public Link available after publishing in a Library](https://ideas.salesforce.com/s/idea/a0B8W00000GdhLCUAZ/public-link-available-after-publishing-in-a-library)
GASでCSSを使用する

## 概要
gasでWebアプリ開発をする際にCSS（外部ファイル）が適用されず少し悩んだところがあったので忘れないためにメモをしておく
（2022/07/29現在の内容です）

## CSSを適用する
まず以下のようなファイルを作成します。
ファイル作成の仕方は「＋」ボタンを押してhtmlファイルを選択し名前を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633008/3bc3af18-05d2-9246-3ad3-de5d2a274421.png)


そして各ファイルに記述を行います。
注意してほしいのはコード.gasの内容
Googleなどで調べると以下のような記述があったりするが動かなかった。
恐らくだがこれは外部サイトにgasのプロジェクトの内容を出力したりする時に使うのではと思われる（違っていたらすみません）
```
　　return HtmlService.createHtmlOutputFromFile('index');  
```
以下のように記述することで無事CSSが適用できた
```
function doGet() {
  return HtmlService.createTemplateFromFile("index").evaluate();
  //　こっちだとCSSなどの外部ファイルが読み込めない
  // return HtmlService.createHtmlOutputFromFile('index');  
}
```

あとはそれぞれのファイルを記述していき
※CSSファイルの<style></style>で囲むのに注意
```index.html
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <?!= HtmlService.createHtmlOutputFromFile("css").getContent(); ?>
  </head>
  <body>
    <p class="text">Hello world</p>
    <?!= HtmlService.createHtmlOutputFromFile("js").getContent(); ?>
  </body>
</html>
```

```css.html
<style>
  .text {
    color: red;
  }
</style>
```

これでCSSができようされた
AWS上で起動するNode-REDでのメール送信方法

ちょっと前にやった案件で結果苦労したんで、備忘録として残します。
ちょっと前のことなんで、記憶曖昧なところありますが、ご容赦ください。

AWSのEC2(WindowsServer2019)上にNode-RED環境を作り、そこからお客さんの会社メールアドレスへ添付ファイルをつけてAWSのSESを経由してメールする必要があって。。
gmailの送信方法は出てくるんですけど、こういったAWS環境上からの送信方法ってググっても意外に出てこなくて、けっこう苦労しました。

やり方は主に２つです。
1. Node-REDのライブラリを使って送る。
2. Powershellでメール送信処理を書いて、Node-REDで送る。

上記1の方法ですが、Node-REDの公式から[こういうような](https://flows.nodered.org/node/node-red-contrib-aws-ses-send-raw)追加のライブラリをダウンロードして使うってのが手っ取り早いです。
自分も手軽にできないかなとおもってライブラリダウンロードして使ってみたのですが、ノードに宛先とか設定してノードを実行してもいっこうにメールが送信できない！
ライブラリの公式ページを見てもイマイチ分からず、結局別の方法を探すことに。。

そこで上記2のPowershellで送る方法を思い当たりました。
ググッてるとLinuxならshellでサクッと送ってる記事を見つけ、WindowsならPowershellで何とか出来ないかなと思い、
[この記事](https://qiita.com/msht0511/items/5218c09e0229618d8821)を参考に宛先やメールサーバの情報を設定した処理を書き、.ps1ファイルで保存。
その.ps1ファイルを呼び出す.batファイルを書いてNode-REDのexecノードから実行するとしっかり送れました！

何かの参考になれば幸いです。
useCallbackとは

コンポーネントをmemo化したが、そのコンポーネントの中で関数が使われている場合、関数のmemo化もしないと、余計な再レンダリングがされてしまう。
それを防ぐためにuseCallbackを用いて関数のmemo化を行う。

memo化された関数の中で、再レンダリングされないように使用するもの。

const onClickClose = useCallback(() => setOpen(false),[]);
最後の[]の中に見張る関数をかく。
[open]と記載すると、openという値が変わった際に再生成が走るようになる。
[]とnullで記載すると、最初に生成されたものがずっと使われるようになる。
PythonでALEXAを作りました

# 1.はじめに

AmazonのAlexaをpythonで作りたいと思い、試行錯誤を繰り返し、ようやく出来上がりました。
オリジナルのAlexaとはほど遠いですが、条件分岐を記述することである程度の質問には答えてくれました。
これからも改良を続けていきます。

# 2.環境
windows10


# 3.準備

## Speech_recognitionのインストール
```
$pip install speechRecognition
```
## pyttsx3のインストール
```
$pip install pyttsx3
```
## pywhatkitのインストール
```

$pip install pywhatkit
```
## wikipediaのインストール
```
$pip install wikipedia
```
# 4.実装

```main.py
import speech_recognition as sr
import pyttsx3
import pywhatkit
import wikipedia

recognizer = sr.Recognizer()
Bob = pyttsx3.init()
voices = Bob.getProperty('voices')
Bob.setProperty('voice', voices[1].id)

'''talk関数を記述することで、入力したテキストに対しコンピューターが話かけます。'''
def talk(text):
    Bob.say(text)
    Bob.runAndWait()
'''take_command関数に話しかけた内容に対してソースとして作成する'''
def take_command():
    try:
        with sr.Microphone() as source:
            print('Listening.....')
            voice = recognizer.listen(source)
            command = recognizer.recognize_google(voice)
            command = command.lower()
            
    except:
        pass
    return command
'''run_alexa関数に受け取った内容をもとに条件に応じて処理を行います'''
def run_alexa():
    command = take_command()
    print(command)
    if 'play' in command:          
        song = command.replace('play', '')
        talk('playing' + song)
        pywhatkit.playonyt(song)#「play 〜」と話すと、それに対応した動画が開きます。
    elif 'who' in command:
        person = command.replace('who', '')
        info = wikipedia.summary(person, 5)
        talk(info)
        print(info) #「who is〜」と話しかけると、wikiに基づいた情報を話してくれたり、ターミナルに文字を起こします
    else:
        talk('please say the command again.....')#話している内容が聞き取れない場合は、もう一度話して頂くように要求します

while True:
    run_alexa()




```



# 5.難しかったこと

コンピュータに音声を認識させる為、実装に必要なライブラリーpywhatkitのインストールが、開発環境がことなったせいなのか、手間が掛かりました。
こうした経験から、今後は仮想環境でアプリ開発をしていこうと思います。

以下のリンクから実装動画を視聴できます。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">pythonでAlexa作りました。<br><br>今回はjazzを流してもらいました。<br>しっかり話した内容は理解しています。 <a href="https://t.co/MzhVkAUuvy">pic.twitter.com/MzhVkAUuvy</a></p>&mdash; つばめ (@ZnRKT46JvWKbHDW) <a href="https://twitter.com/ZnRKT46JvWKbHDW/status/1556308714030002176?ref_src=twsrc%5Etfw">August 7, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
重複する不要なレコード（行）を削除する(SPSS Modeler データ加工逆引き7-6)

# 重複する不要なレコード（行）を削除（distinct）

![スクリーンショット 2022-07-22 10.04.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/913cc17e-86fe-8f29-7db3-1333d9585891.png)

## 1.想定される利用目的

・トランザクションやログからリストやマスタテーブルの作成
・新規テーブル作成のための前処理

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/distinct.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-07-22 10.25.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/94142a29-632e-bd3b-9d6b-3f1e6a498dfb.png)

a.入力するデータは以下の通りです。
![スクリーンショット 2022-07-22 10.06.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5a26f4b5-bf0e-b7f6-20b4-9ac2b99a0e16.png)


#### IDをキーにして重複を排除する

b.[重複レコード]ノードを編集します。[利用日]を降順ソートしてデバイスIDの最初のレコードを保持する設定です。
![スクリーンショット 2022-07-22 10.10.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f8815681-212e-fa83-a7ba-d3c0654c436c.png)

[テーブル]を実行します。IDでユニークなレコード（行）になりました。
![スクリーンショット 2022-07-22 10.11.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5f7571ee-cadc-4c11-af31-6f6a50afaab8.png)

c.[レコード集計]ノードでも同じ処理が可能です。
![スクリーンショット 2022-07-22 10.11.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/763aa65d-ded0-20f7-82aa-6e4f2a7717c8.png)

#### 姓と名が一致したらユニークと見なして重複を排除する

d.[重複レコード]ノードを編集します。[デバイスID]と[利用日]を降順ソートして姓名一致の最初のレコードを保持する設定です。
![スクリーンショット 2022-07-22 10.11.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e463a5de-5e3f-550d-af73-7039a1734665.png)

[プレビュー]します。正しくできていますが並び順が姓名でソートされました。
![スクリーンショット 2022-07-22 10.35.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6abcc0f8-012b-85f4-aecd-503e9d9fc680.png)

e.[ソート]ノードを編集します。
![スクリーンショット 2022-07-22 10.12.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4ea51d74-f28b-5831-b2a1-72a919a769a9.png)

[テーブル]を実行します。
![スクリーンショット 2022-07-22 10.12.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/bd457b70-f488-a08f-5c24-5c059b53e7ff.png)

f.[レコード集計]ノードでも同じ処理が可能です。
![スクリーンショット 2022-07-22 10.12.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/92e5fc5a-6094-3458-abd4-1b0a3771b2dc.png)

#### 注意事項

[デバイスID]を整数型で扱っていたため[レコード集計]ノードで最大値として利用できました。IDが文字型の場合には[置換]ノードで関数[to_integer（フィールド）]を利用して変換します。

## 4.参考情報

#### 重複処理について解説した記事

https://qiita.com/416nishimaki/items/f06f5fbf002d6fcea8bc

https://qiita.com/kawada2017/items/0cdf8fda422d332ba931

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
【ハッカソンで使える】プレゼンの基本構成

今回は、**課題解決型**のプレゼンをする際にどのような全体構成にすると相手に伝わりやすいのかを紹介します
アイデアソンやハッカソンでは、**課題解決型**のプレゼンになることがほとんどです

# 全体構成
基本的には以下の４パートを用意します
* 課題
* 原因
* 解決策
* 効果

各パートの詳細を説明します

## 課題
**どんな課題**があるのかを説明するパート
このパートでは、プレゼンする相手に共感してもらうことが重要です
まずは、どんな課題が生じているのかを可能な限り**シンプル**に伝えます

* ポイント
    * 課題はシンプルに、まずはひとことで
    * イラストを用いて右脳に訴える
    * インパクトのあるスライドにする

## 原因
課題が生じている**原因**を説明するパート
このパートでは、課題の原因が何かを説明します
相手が納得できるように話す必要があります
「それって因果関係なくない？」
「他にも原因がありそう」
と思われないように話しましょう

## 解決策
原因を解決する具体案を提案するパート
このパートでは、提案内容について話します
前のパートで説明した原因が解決するイメージができることが重要です
ロジカルに解説しましょう

## 効果
解決策を採用した場合の効果を説明するパート
最後に**具体的な**効果・メリットを話します
数値やグラフを用いることで直感的に理解してもらえます
過去の導入事例があれば、紹介しましょう
Wantedlyのプロフィールを作成したら約1か月半後に転職先が決まった話

# はじめに
なんとなくでWantedlyを始めたら約1か月半で転職先が決まったので記事にしておこうと思いました。
転職エージェントは使っていません。
新卒で入社した会社からの転職（初転職）になります。
Wantedlyの手先ではありません。
# 転職活動について
## 私の簡単な経歴（本記事執筆時点）
新卒で入社した中小SI企業に6年間勤めていました。
最初の3年間は組込み系のアプリ開発(言語はC)、その後の3年間はサーバサイドのアプリ開発(言語はC++、C#)をしていました。
ここ1年くらいはPLとして自社メンバ3～4人の管理、協力会社1、2社の管理も行っていました。
大学はFラン工学部の情報系学科卒です。
## Wantedlyを始めた理由
[SOFT SKILLS](https://www.amazon.co.jp/-/en/E3-82-B8-E3-83-A7-E3-83-B3-E3-83-BB-E3-82-BD-E3-83-B3-E3-83-A1-E3-82-BA-dp-4296000500/dp/4296000500/ref=dp_ob_title_bk)を読んで、自分を世の中に売り込むことの重要さを知りました。  
そこで、手始めに自分のこれまでのキャリアとスキルを整理しようと思い、Wantedlyでプロフィールを作成することにしました。
## 転職のスタンス
転職についてのスタンスとしては、いい会社があれば転職しようかな、くらいな感じでした。  
現職の仕事内容や給与にはそれなりに満足しているけど、仕事内容・給与ともに今後の伸びしろがあまり期待できないのと、1つの会社にずっと勤めることのリスクを感じ始めていました。
そのため、すぐの転職は希望していないけどいい会社があれば転職するというスタンスでした。
## 転職のためにしたこと
### Wantedlyプロフィールの作成
まず、Wantedlyのプロフィールを作成しました。
項目は一通り埋めることを意識しました。
スマホアプリで自分のプロフィールを見るとWantedlyスコアというのが出るのですが、私は49でした。（あまり高くない？）  
プロフィールの充実度はスカウトメールの数にも影響するので妥協せずに時間をかけて作成することをお勧めします。
### カジュアル面談
3日くらいするとカジュアル面談を勧めるスカウトメールが来るようになりました。
それから週に5,6通くらいのスカウトメールがくるようになり、その中から興味のある会社のカジュアル面談を受けました。
最終的に2週間くらいかけて6社のカジュアル面談を受けました。
カジュアル面談後は「ぜひ選考に進んでいただけたらと思います」というようなことを口頭や文章で言われますが、すべて「すぐの転職は考えていないので少し検討させてください」という返事をしました。
### 選考
興味のある企業から一通り話を聞いたら、Wantedly経由で1番志望度の高い企業の選考に応募しました。
私は志望度の高い企業から選考を受けて、ダメだったら2番目、それもダメなら3番目という順番に選考を受けようと考えていました。
その方が面接に対して本気で臨めるし、仕事をしながらの転職活動なので同時に複数の選考を受ける余裕は無いと思ったからです。
結果的に1番志望度の高い企業から内定をいただくことができました。
選考はすべてオンラインでした。
## 企業選びの軸
これまで受託開発をやっていたので、今度は自社サービスをやっているところがいいなという思いがありました。
そして、どうせなら世の中で広く使われている製品・サービスの開発に携わりたいという希望もありました。
この2つを軸にして企業選びをしました。
## Wantedlyを使って良かったこと
### 今まで知らなかった面白そうな会社をたくさん知ることができた
私がカジュアル面談をした企業はほぼすべてスカウトメールで知った会社でした。
選考を受けて内定をいただいた企業も同様です。
### 選考で履歴書や職務経歴書の提出が不要だった
選考を受けたのが1社だけだったので一般的ではないかもしれませんが、Wantedlyのプロフィールに履歴書・職務経歴書相当のことが書いてあれば、それで選考に進める企業もあります。  
職務経歴書の書き方についてはいろんな方が紹介しているので、いろいろ調べながら作成するといいと思います。
# おわりに
すぐの転職は考えていないけど将来が不安だからいつでも動けるようにしたいとお考えの方には、自身のキャリアとスキルを整理しておくことをお勧めします。
自分だけが見られるメモで整理しても構いませんが、それをWantedlyのようなSNSに共有することで今まで知らなかった企業を知ることができ、そのまま転職に繋げることもできます。
企業選びや選考を自分のペースで進められるのは転職エージェントにはないメリットだと思います。
転職する気がなくてもとりあえずプロフィールだけ作成してみてはいかがでしょうか。
私のような境遇の人にこの記事が参考になれば幸いです。