OmniAICreator/Qiita-1.07M huggingface dataset:
【WordPress】カテゴリーを設定する

# 前回の記事

前回の記事では、アイキャッチ画像の設定方法を確認しました。

https://qiita.com/raptony110/private/d980f2739f8752772c44

今回は、カテゴリーの設定方法です。

僕のAdvent Calendarを読み終わった人が、
「へぇ簡単なんだなぁ〜　自分もWordPress使ってサイト作ってみようかな〜」って思うあなたがそこにいたのなら、、、、
読むだけで、頭の中WordPress化しちゃったんだよッ！！！！

https://qiita.com/advent-calendar/2022/wordpress-output

# カテゴリーを設定する
カテゴリーは、投稿記事を整理するための箱です。一つの箱の中にさらに箱を入れることができます。
例えば、海外旅行について投稿するブログだった場合、国別のカテゴリーがあって、その中に地方のカテゴリーがあると、読者の興味が関連する記事を読んでもらいやすくなります。
## カテゴリーを作成する
カテゴリーの作成は、管理画面メニューの投稿>カテゴリーのメニューにて行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/ca4166cd-2616-96c0-f741-f0a8f6c9e6e2.png)
名前に作成したい名前をつけ、スラッグにはカテゴリーを表す英数字を記入しましょう。スラッグは、URLに利用されますので、カテゴリーをわかりやすく説明できる文字列が良いです。
親カテゴリーは、新規追加するカテゴリーの親カテゴリーを選択します。つまりカテゴリーは階層構造を作ることができるということですね。
いくつか追加して階層構造を組んでみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/28afd0e4-9796-8c82-228b-f74879536670.png)
## 記事にカテゴリーを設定する
記事にカテゴリーを設定するのは、投稿画面で設定します。
投稿画面の右側、アイキャッチ画像を設定するエリアの上に、カテゴリーメニューがあります。
ここで、記事のカテゴリーを選択しますが、下の画像のように複数のカテゴリーを選択することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/b4a4ba80-eff0-03a6-6627-d891659a57f6.png)

# おわりに
いかがでしたでしょうか。今回の記事で、カテゴリーの設定まで行うことができました。これで記事投稿に関する方法を終わりになります。

次回は、固定ページについて見ていきましょう。
【CommonLisp】ローカルのASDファイルを読み込む方法【ASDF】

## 結論

次のサイトを読みましょう

http://diary.wshito.com/comp/lisp/ros-local/

https://privet-kitty.github.io/misc/asdf-ja/index.html

もしくは

次のプログラムをロードしましょう。
このファイルが存在するディレクトリ配下のASDファイルが再帰的に読み込み可能となります。

```common-lisp:search-asd.lisp
;;;; このファイルと同ディレクトリ配下のASDファイルを再帰的に読み込み可能にする

(require :asdf)

;; このファイルが存在するディレクトリの絶対パスの取得
(let ((system-path (make-pathname :host (pathname-host *load-truename*)
                                  :directory (pathname-directory *load-truename*))))
  (asdf:clear-source-registry) ; ソースレジストリの設定のクリア
  (asdf:ensure-source-registry ; ソースレジストリの設定の初期化
    `(:SOURCE-REGISTRY
      (:tree ,system-path) ; ASDファイルを再帰的に探索する
      :ignore-inherited-configuration))) ; ソースレジストリの古い設定を無視する？
```

読み込んだらrequireなりql:quickloadなりで好きにパッケージをロードしてください。

このプログラムの作成にあたり以下のリポジトリを参考にしました。

https://github.com/fourier/cl-self-contained
『Marvel』でスマホアプリの画面モック作成！！

↓MarvelのURL
https://marvelapp.com/

↓今回作成した画面モックアップ
https://marvelapp.com/prototype/j3h39hh

※この記事はMarvelを数回しか使っていないものの感想なので参考程度にとどめてください。
# Marvelとは
Marvelは、PC・スマホなどの画面モックが作れるサイト。
アカウントを作れば、無料で1つまでプロジェクト単位での画面モックを作ることができます。
試してはいませんが、チームで作成することができるらしいです。

今回は、無料ユーザで試してみた感想を書き連ねていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998004/09d4d0f1-5f14-05fd-3ab3-3ee136c47c4c.png)

# Marvelを使ってみて
まず、使ってみての第一感想は「無料という前提で、まあまあ満足できる」でした。
画面モック作成の流れですが、
①：アカウントを作成
②：作成するモックのタイプ選択(PC？スマホ？)
③：「Let's add some designs!」か「Try an example prototype」か選択
(「Let's add some designs!」を選択すると0ベースからの作成)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998004/45706149-8f15-9cb8-1882-ee4056da4d0e.png)

プロトタイプを選択すると、以下のテンプレが出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998004/c67dbac5-677d-d4d7-72a4-1987f1c7ad3f.png)
一見、テンプレをもとに自分好みにカスタマイズできるのかなと思ってしまいますが、カスタマイズすることはできないので注意。
(ここが、『まあまあ』満足できるという点)

なので、画面モックを作る時は結局0から作ることになります。。。
「Upload or create designs」を選択し、「Design in Marvel」を選択。
そうすると、画面モック作成画面に行きます。

↓画面モック作成ページ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998004/e4f309bb-cb1e-219e-d4c5-dc192150e51d.png)

Marvelで提供されているパーツを駆使したり、画像アップロード機能を使いながらモック作成することになります。

↓実際に作成してみた画面はこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998004/81384fdf-9b2a-abe7-c041-aa85b91d74fe.png)

不便だなと感じたのは、挿入した図形を均等配列できないこと(目視で揃えることになる)や、三角形の図形が見当たらなかったこと。
なので、Marvelで見つけることができなかったパーツは、Excelの図形でいい感じに作り、それをコピペするというやり方でモックを作りました。

多少不便さはあれど、無料という範囲内では全然満足できました。

# 結論
ちょっと記事の後半で不便さを書いてしまいましたが、無料で使えたのと「力を入れず、サクッと作りたい」という目的だったので全然不満には感じませんでした。

スマホやPCで画面モックを作ろうとしている人は、１つの参考情報として検討してみてください。
【Laravel エラー編】 Migration/Seeder/Factory作成 

こんばんは〜



今回は、Factory作成で出会ったエラーちゃん達の紹介と解決方法を書いていきます！


1)`["SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint"]`
![エラー テーブル作成順番が原因.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748934/def22d05-d7ba-8d30-1fb1-3872bc31da3c.png)

[参考URL]
https://qiita.com/kitakrazy/items/6a3e1936da727dbd92b3

[主な原因→解決方法]
・テーブル生成順序がおかしい　→　テーブルの生成順序を変えてみる
・外部キーの参照と、のっけるのが違う　→　外部キーの箇所を見直す、変えてみる


2)`SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry`
![エラー 被りが原因.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748934/e559b368-99aa-7f5b-1545-fedb9ea59ce8.png)


[参考URL]
なし

[主な原因→解決方法]
・Factory時に、重複した文字列や数値が生成されてしまった時　
→　例）`'name_en' => $this->faker->word . $this->faker->randomNumber()`
の様に、ランダムの数値などを結合する。

3)`SQLSTATE[22003]: Numeric value out of range: 1264 Out of range value for column 'size' at row 1 `
![エラー outofrageサイズ超え.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748934/cb6ad5c5-6e0d-2a3a-3dda-ebcaca9b666f.png)


[主な原因→解決方法]
・カラムのサイズをオーバーした意味。
　intとかtinyintとか、decimalの定義しているサイズを超えたから
→`randomFloat` 若しくは`randomElement`を使用！
未経験からiOSエンジニアになって3ヶ月経ったので、振り返ってみたよ

## 概要
振り返ろうと思った理由は、大きく2つあります。
###### 1つ目は、単純に今まで何をしてきたのか言語化し思考整理をするためです。
自分的に、この3ヶ月は濃密すぎて時間が一瞬にして過ぎ去っていったので、改めてどんな行動をしていたのかを思い出すために振り返りを実施しました。

###### 2つ目は、前職で個人的に振り返りをしていなかったことを後悔したからです。
というのも、前職では全く振り返りをしておらず振り返らないということは、「振り返りをした時点で何がどこまでできて、逆に何ができないのか、また今後の自分の成長目標を適切に設定すべきか」を考えることを放棄していると気付き後悔したからです。

なお、今回は技術共有的なことは書きませんが、興味があればお読みいただきたいと思います。

## 成長したなと感じること
- 携わらせていただいているアプリ開発でそこそこ難易度が高い実装でも助言をもらいながら進めることができること。
- タスクを上手く捌き、無駄な時間を作らないようにできていること。
- アーキテクチャを意識したり、命名規則を意識してコードを書くことの重要性を理解しつつあること。
- （技術的なことではないですが、)UXを向上のためにアプリの仕様について積極的に発言したり、イシューを発行することができていること。

## 上記の中で特に成長したと感じることの詳細
###### 携わらせていただいているアプリ開発でそこそこ難易度が高い実装でも助言をもらいながら進めることができること。
自分自身、全くの未経験でSwiftの文法もあやふやな状態で、入社しましたがわからないことを1つずつ潰しながら知識を蓄えられていると感じます。また、最近では周りの方は実装したことがない領域でも調べながらエラー等も解決していけるようになったので、なんとか解決するという気持ちも初期の頃よりはついてきたと思います。

# 改善しないといけないこと
- 難しい実装になると、自己解決力が不足していると実感すること。
- 他の方の実装に対するレビューの精度が低いこと。
- 実装について質問する際に、伝え方が曖昧になってしまうこと。

## 上記の中で特に改善したいと考えていることの詳細
###### 難しい実装になると、自己解決力が不足していると実感すること。
実際、既存のサービスのコードを扱う時に仕様を理解できずに実装してしまい、実装を断念してしまったこともあったので、その点で粘り強く色んな手立てを考えて問題を解決できるようになれればよりエンジニアとして成長できると考えています。そもそもそんな考えは全く持っていないですが、「エンジニア初めて3ヶ月だから...」とかは思わず実装していきたいと思います。


## 今後どのように活動したいか
自分的には、弱点を重点的に見直すというよりもストロングポイントをより伸ばしていくという方が有効だと考えているので、チームでのコミュニケーションを密に取りつつ自分自身の実装力をしっかりつけて成長していきたいと考えています。

# さいごに
こうやって振り返っていくと濃密な3ヶ月間、本当に一瞬で時間が過ぎていったような気がします。最近も新しいアプリの開発をさせていただき学ぶことが多く本当に楽しく仕事に没頭できているなと感じます。
今後は、限られた時間でいかに効率良く質のいいコードが書けるかやいかにタスクをこなすかを考えつつアプリの売上に貢献するためにフルコミットしていきたいと改めて感じました！
次は、入社して6ヶ月後あたりでまた振り返りをしてみたいと思います。
【Laravel エラー編】 sassコンパイル

備忘録として残します！

https://readouble.com/laravel/5.5/ja/mix.html

@mk185さんの記事
https://qiita.com/mk185/items/1508ac6172c73db7808b

を参考にコンパイルに挑戦！

`$npm run dev`

をするとエラーが。。。

![error1_compile.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748934/571c7f58-564a-62e3-5d8e-61128a60e169.png)


`@import 'variables`;

なにこれ！？！？！

師匠曰く
「import先に"variables"がないから、できまへん。」って言ってるよ。
とのこと。

ほう。。


1) resouces>sass>app.scss内の `@import 'variables;'`　を確認

![スクリーンショット 2020-10-09 12.19.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748934/3afb93c2-38de-d5eb-1a68-5e0c88b6f40e.png)

2) ファイルツリーに `variables.scss`　があるかどうか確認。

![スクリーンショット 2020-10-09 12.23.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748934/0a8be33b-041d-6600-b3bf-b86b2e49861f.png)


ない！！急いで作成して再び
`$npm run dev` 

........

エラー

次はこいつ

![スクリーンショット 2020-10-09 12.27.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748934/0797886d-f97e-f8c8-dc18-ea0e0d1144bf.png)


ほほう、さっきの手順で行けば
`~bootstrap/scss/bootstrap`
ここにbootstrapがないからエラーが出る。

https://github.com/coderstape/freeCodeGram/issues/4
この記事によると
`npm bootstrap install`でエラーが消えるとのこと！

インストール後に再び`$npm run dev`


エラー出なかったーーーーー！

師匠に感謝のメールを打つと、

**あんたboostrap使わんくね？**
**さっきのapp.scssの//bootstrap　消せばOK**

消す選択肢があるんですね初めて知りました😢


いう通りにする前に、アンインストール作業が必要

【アンインストール作業】
**package.jsonのbootstarpの部分を消して、`npm install`をして`npm run dev`だ！！**

できたー！！

![スクリーンショット 2020-10-09 13.11.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748934/7813a475-95db-8e0c-ce09-4ea95ec00943.png)


ちゃんと反映されました！！
もう2度とこのエラーで苦しみません！師匠ありがとう！
【2.設計編】MENTA使ってメンターと開発

こんちわ！

モデリングとDB設計にかなりてこずりました。。。。。

ーーーーーーーーーーーーーー
【開発手順】
⑴画面デザイン(ワイヤーフレーム)　　　　（8〜10h）
✔︎Figma 画面遷移図作成

⑵画面デザインからhtmlコーディング　　（15h〜20h）

⑶ワイヤーフレームからモデリング(情報設計)とDB設計 (7h)
✔︎Figamで機能設計図作成
✔︎spreadsheetでテーブルレイアウト作成
✔︎モデリングをgoogleスライド書き出し
✔︎ER図をDraw.ioで作成

⑷URL設計                      (1h~1.5h)
✔︎spreadsheetで設計

⑸htmlをlaravelに組み込み  ←NOW
⑹DBへ永続化するなど、処理をlaravel内に作成
⑺テスト
⑻デプロイ
ーーーーーーーーーーーーーーー

⑶ワイヤーフレームからモデリング(情報設計)とDB設計
[参考URL]

<<4ステップで作成する、DB論理設計の手順とチェックポイントまとめ>>
https://qiita.com/nishina555/items/a79ece1b54faf7240fac

<<データベース設計入門#3 テーブル設計の手順【実戦形式で解説】>>
https://www.youtube.com/watch?v=D5UgoChhrSo

<<要件定義～システム設計ができる人材になれる記事>>
https://qiita.com/Saku731/items/741fcf0f40dd989ee4f8
<<正規化の要点を理解する>>
https://qiita.com/mochichoco/items/2904384b2856db2bf46c

[感想]
モデリングが激ムズと感じた！
とりあえず形にするために、参考記事に書いていることを実践！
youtubeでも、設計仕方の動画を漁ってなんとか完成させる。
ほんとに表面的なことしか出来ていない＋極度に慣れていないと感じたので、参考書購入。

「達人に学ぶsql徹底指南書 第2版 初級者で終わりたくないあなたへ」
を購入したが難しすぎたw
なので、基礎から学ぶことに
「スッキリわかるSQL入門 第2版 ドリル222問」
SQL入門から終わらし、達人を読破していき血肉にしていきます！
簡単なER図とURL設計、モデリング、テーブルレイアウト作成したので
次からは時短ができそう。

[作成画像]
![スクリーンショット 2020-10-08 13.14.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748934/623bd4ab-f1bf-bede-f5f6-e4fbe3790912.png)

![スクリーンショット 2020-10-08 13.15.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748934/e30fcd0e-e50c-ef97-2f73-d135513d243a.png)


⑷URL設計
[参考URL]
<<分かりやすいURL構造を設計しよう「ディレクトリ名・ファイル名の付け方>>
https://www.asobou.co.jp/blog/web/url-optimisation

＊記事まとめ
・階層は深くても3階層までが良い。
・可能な限り、簡潔に＋ページ内容に沿ったURL名にする。

例
↓
会員登録画面の場合
zozo.jp/-member/regist.html


[感想]
参考にしているECサイトが複数個あったので、それのURLを元にして＋URLのコツを参考にして作成しました！
なので、作業時間は30mぐらいですんだかな？
あとは表作成と修正を頂いてので訂正して完成！

[作成画像]
![スクリーンショット 2020-10-08 13.15.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748934/4917978b-e065-8861-3555-b35fe30883f7.png)

ではではいよいよ5)htmlをlaravelに組み込みしていきます！！

【開発手順】の
⑸htmlをlaravelに組み込み
⑹DBへ永続化するなど、処理をlaravel内に作成
⑺テスト
を細かくすると
↓
↓

1)ルーティング定義に基づいて全viewを作成(まずはDBとかなしで画面遷移できるようにhtmlベタでok)
2)テーブル定義に基づいてmigration作成
3)eloquent作成
4)ダミーデータ用にシーダーとファクトリー作成
5)コントローラー作り込み(ここで具体的な処理作成)
6)テスト(適宜リファクタリング)


なんじゃこりゃーーーー！
trocco®力の伸ばし方

### ご挨拶
こんにちは、あるいはこんばんわ。

primeNumberでカスタマーサクセスをやっています@y-matsunooです。
[trocco®](https://trocco.io/)のCSとしてのお困り事に答えたり、ユーザーさんのこんな機能あったらいいなに向き合う日々を過ごしております。

今回がQiita初投稿ですが、[troccoアドベントカレンダー2022](https://qiita.com/advent-calendar/2022/trocco)に記事を捧げます。

## 概要
trocco®力ってなに？
どうやったら伸びるの？

**こんな方に読んでほしい**
- trocco®のユーザーさん
- 爆速でデータアナリストになりたい人
- trocco使ってみたいって人！！！

## trocco®の特徴（知っている人は飛ばしてOK）
trocco®はETL・ELTに留まらず、ワークフローの管理やメタデータの管理もできるちょっと欲張りなデータエンジニアリングを支援するサービスです。（そう私は思っています）

簡単にですがtrocco®でできることを書きます。
- 幅広いデータフォーマットに対応
- MAやCRMをはじめクラウドサービスのデータを収集できる（各種DBはもちろんできる）
- 収集したデータ（DWH）を対象にクエリを実行（分析）できる
- **これらがGUI上で設定ができる**

もっと機能があって書き尽くせないのですが、
「あのデータ分析したい」と思ったとき、
「こういったデータあるから分析してみて」って言われてしまったときの
面倒事を引き受けてくれます。

ユニークな点はデータ転送設定・データマート機能といったジョブを作成して、
それらをワークフロー機能として管理できることです。

## trocco®力 is {デリバリー力}
カスタマーサクセスとしてユーザーさんに向き合う中で私が出した答えが「デリバリー力」なのでこれが正解とかではないです。

trocco®はデータをつなげる、届けるツールです。
フルマネージドではありますが、対応しているデータソース側のアップデートもあれば、
ビジネスサイドの分析ロジックが変わることも考えられます。
trocco®のユーザーさん（データエンジニア/データアナリストの方）の多くはそういった変更に日々対応されており、見えないところでも思考されているのかなと思います。

そういった点から、正確なデータをスピーディ届けることをtrocco®力だと考えます。

## エラーと向き合う
カスタマーサクセスをしているとユーザーさんからエラーの連絡があり、解消までのサポートすることがありますが、
そうこうしているうちに勝手にtrocco®力が鍛えられていることに気付かされます。

というのも、trocco®のエラーを解消することは、分析に必要な形でデータを届けられることに直結することが多いからです。
いくつか問い合わせを紹介させていただきます。

- Bigqueryに配列型でデータを格納したい。もしくは配列から必要なデータだけ抽出したい。
- DBから差分転送をしているが、データの欠損がある。
- CSVファイルのカラム数が一定ではないケースがあるが、カラムマップングをして取り込みたい。
- 広告APIのエラー（Rate Limit）のようだが、どうやったら解消できる？
- 自前でAPIを叩いているデータソースをtrocco®で連携させたい

**データソースA** --(処理①)--> **trocco** --（処理②）--> **データソースB**

このようにtrocco®はデータを中継するだけの存在なので、
処理①、処理②のどちらでもエラーは発生しうるのですが、これらのエラーを見ていく中でデータ処理の中で制約やベストプラクティスが身についていきます。

もちろん、データ転送時のETL機能で実装ができない（現実的ではない）ものは、データマートで処理してしまったり、オプション機能のプログラミングETL（[デモ動画](https://www.youtube.com/watch?v=RNiaso4lJDc)）をお使いいただくケースもございます。


## trocco®力の伸ばし方
先に書いた通り、trocco®はつなぐツールなので、
転送ジョブがエラーになったときに、
- ①②どちらの処理でエラーになってしまったのか？
- どういったエラーなのか？
  -  trocco®のエラーログは長いですが、多くは最終行と最終行を含む段落に原因が書いてあります。
  - エラーログのメッセージを調べてtrocco®の設定をどう変更するのかを考えていただくのが良いかと思います。
  - API連携のエラーの多くは各ツールのコミュニティでQ&Aがすでに行われているケースもございます。


もちろんエラーをtrocco®で吸収できるような改善要望もお待ちしております。






### 結び
trocco®のユーザーの皆さんがデータエンジニアとしてもデータアナリストとしても先生となっていただいています。感謝。感謝。感謝の限りです。

本年も残すところ僅かですが、
来年もtrocco®は皆さんの夢を乗せて走り続けます！

よいお年を。パワーーーーーっ！！
M1 Macで初めての環境構築 (homebrew, anyenv, nodenv使用)

# はじめに
今回はM1 MacでHomebrew、anyenv、nodenvを使用してNode.jsが使える環境を構築します。

### Macのスペック
:::note
* MacBook Pro 13-inch 2020
* Chip: Apple M1
* OS: macOS Ventura13.0.1
* Memory: 16 GB
* Storage： 500GB
::::

# Homebrewの導入前
### xcode-selectインストール
homebrewを導入するにあたって、xcode-selectを導入する必要があります。
```shell
xcode-select --install
```
# Homebrew導入
### `opt`ディレクトリに移動
```shell
cd /opt
```
### `homebrew`ディレクトリを作成
```shell
sudo mkdir homebrew
```

### `chown`コマンドで`homebrew`の所有権を変更
`user`部分はMacのユーザー名を入力
```shell
sudo chown user:admin homebrew
```
### Homebrewインストール
```shell
curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew
```

### Homebrewのパスを通す
```shell
vi .zshrc
```

#### パスを入力し保存する
`i`キーでINSERTモードにし、`esc`で入力終了
`:wq`で上書き保存する
```shell
export PATH=/opt/homebrew/bin:$PATH
```
### Homebrewを有効にする
```shell
source .zshrc
```

### Homebrewがインストールされているか確認
```shell
brew -v
```
以下のように表示されればインストールされています。
```shell
Homebrew >=2.5.0 (shallow or no git repository)
Homebrew/homebrew-core N/A
```

# anyenvの導入
### anyenvインストール
```shell
brew install anyenv
````

### anyenvがインストールされているか確認
```shell
anyenv -v
```
以下のように表示されればインストールされています。
```shell
anyenv 1.1.5
```

### anyenv初期化を実行
```shell
anyenv install --init
```

### anyenvのパスを通す
今後の作業を楽にするために、〇〇env毎にパスを設定してくれるよう、`.zshrc`ファイルに追記するコマンドを実行する

```shell
echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.zshrc
```

```shell
echo 'eval "$(anyenv init -)"' >> ~/.zshrc
```

### `anyenv update`導入
`anyenv update`というコマンドを実行するだけで〇〇env系も全てアップデートされるようにしてくれるプラグインを導入
```shell
git clone https://github.com/znz/anyenv-update.git ~/.anyenv/plugins/anyenv-update
```

# nodenvの導入
### nodenvインストール
```shell
anyenv install nodenv
```

### nodenvがインストールされているか確認
```shell
nodenv -v
```
以下のように表示されていればインストールされています。
```shell
nodenv 1.4.0+5.acf64b3
```

### nodenvでインストールしたいバージョンを確認
```shell
nodenv install -l
```

### nodenvインストール
任意のバージョンを指定する
```shell
nodenv install 18.12.1
```

### nodenvを有効にする
```shell
nodenv rehash
```

### デフォルトで使うバージョンを指定する
```shell
nodenv global 18.12.1
```

### Node.jsのバージョンを確認
```shell
node -v
```
以下のようにバージョンが表示されればインストールされています。

```shell
v18.12.1
```

これで導入は終了です。
社会に蔓延る労苦〈Toil〉をなくす（株式会社スリーシェイク入社エントリ）

このエントリーは [3-shake Advent Calendar 2022](https://qiita.com/advent-calendar/2022/3-shake) 5日目の記事です。
前日は @aqarium さんによる [徒然なるままにDatadog APM](https://qiita.com/aqarium/items/9aeb82a6b4f166fda417) でした。

私は株式会社スリーシェイクに入社し１ヶ月がたちました。
そこで入社エントリーを書き、どうしてこの会社に入ったのか、何がしたいのかを改めて確認しようと思います。

## 略歴

- 2016/03 大学院卒業
- 2016/04 製造関連会社のICT専門グループ会社 に就職
- 2016/10~ C# による Windows アプリケーションの設計、開発、テスト
- 2017/10~ Java による Web システムの設計、開発、テスト
- 2019/10~ AWS　のインフラ、開発環境構築 （Terraformを用いたIaCを実施）     
- 2021/09~ GCP のインフラ構築、PHP による Web システムの設計、開発、テスト 
- 2022/11~ スリーシェイク入社！ 

## なぜ転職しようと思ったか

前職では Web　システムの設計開発テストをメインに、バックエンドエンジニアとして働いておりました。
最初こそコードを書いて、レビューして、テストして・・・という流れを繰り返す毎日でしたが、
その書いたコードがどんなところでどうやって動いているかは全く意識することがありませんでした。
というのも自分がペーペーだったのもありますが、開発部門とインフラ部門がキッパリと分かれている会社であり、
自社のデータセンターにデプロイして動かすという体制が出来上がっていたからです。

そんな中で前職でもクラウドを利用していこうという機運が出てきたところで、
運良く AWS、GCP　を用いた案件に触れる機会ができました。
これまでと違い、Web アプリを作るだけでなく「どうすればクラウドに適した作りにできるのか」、
「どうすればより簡単にデプロイできるのか」、「コンテナをつかった時の最適な作りはどんなのか」などなど色々と考えることが増えました。
この経験をするまではどこか単調に過ごしていたように感じます。
ですが、開発とインフラ構築、運用を全て実施することで、少しの「辛い」を感じながらも「楽しい」を感じることができるようになったのです。
この辺りから「開発者が幸せになるような働き方がしたい」、「辛い思いを少なくしたい」と強く思うようになりました。
具体的には多分以下のようなことを考えていたと思います。
- どうしたら開発者が効率化された開発プロセスを体験できるの？
- 運用、監視を漏れなく正確に行うためにはどうしたらいいの？
- デプロイするのにこんなに手順必要かなあ？どこか自動化できない？
- 古いシステムをずっとそのまま運用していくのやばくない？
- 世の中で新しいと言われていること、技術的に面白いと言われていることに触れてみたい！

そして、「そしてそれってもしかして SRE ってのがいいんじゃない？」と思うようになり、
そんな中でスリーシェイクに出会いました。

## なぜスリーシェイクを選んだのか

まず目についたのは「[社会に蔓延る労苦〈Toil〉をなくすプラットフォーマーになる](https://3-shake.com/about/)」という言葉でした。
自分もそういったことを考えていたこともあり、とても気になりました。
また、[SRE 自体をサービス](https://sreake.com/)にしていることを知り、これならば自分のやりたいことができるのではと強く思いました。
働く上で自分たちがワクワクできるということが、私にとっては素敵なことに思っています。
入社して１ヶ月経ちましたが、スリーシェイクに入れたことは私のワクワクにつながっています。

## これからどうなりたいか

- SRE を理解する、わかりやすく説明できるようになる
- Kubernetes をしっかりと使えるようになる
- さまざまなサービスの中で自分の得意分野を見つけていきたい
- 上記それぞれについてもしっかり発信することを意識したい
    - 文章上手になりたい
- スリーシェイクの一員として胸を張れるようになる

短く抽象的な内容になってしまいまいしたが、現在の素晴らしい環境でしっかりと学びながら、
「社会に蔓延る労苦〈Toil〉をなくすプラットフォーマー」になるべく精進していきます。

次回は @aiko829 さんの記事です。
よろしくお願いいたします。
Leetcode 876. Middle of the Linked List

# 876. Middle of the Linked List

https://leetcode.com/problems/middle-of-the-linked-list/

## 難易度
### Easy

## アプローチ
### Brute Force

```java
package com.leetcode.easy;

public class MiddleOfTheLinkedList876 {
    public static void main(String[] args) {}

    public ListNode876 middleNode(ListNode876 head) {
        ListNode876 temp = head;

        int length = 0;
        while (temp != null) {
            temp = temp.next;
            length++;
        }

        length /= 2;
        temp = head;

        while (0 < length) {
            temp = temp.next;
            length--;
        }
        return temp;
    }
}

class ListNode876 {
    int val;
    ListNode876 next;

    ListNode876() {}

    ListNode876(int val) {
        this.val = val;
    }

    ListNode876(int val, ListNode876 next) {
        this.val = val;
        this.next = next;
    }
}
```
- [こちら](https://leetcode.com/problems/middle-of-the-linked-list/discuss/1651627/C%2B%2BJAVA-EASY-TO-SOLVE-oror-Different-Variations-with-detailed-explanations)の解説を参考しました
プルリクエスト（PR)を作るときに意識したいこと

自分が実際に実務で実践出来ているかどうかは置いておいて今までの経験や技術書を読んでプルリクエストを作る上で大事だと思うことをまとめてみます。

## レビューアーの立場（気持ち）で考える
これから説明することの全ての原点はこれに帰着すると思う。
コードレビューはそれなりに工数がかかる作業のためレビューアーの負担が少なくなるように前提知識や拝見等を漏れなく列挙するのが大事である。

- プロジェクト全体でかけるコストが少なくなるように意識する
- レビューアーが差分をみたらすぐにレビューできる状態にしておく
- レビューアーのコスタが低くなるようにレビューを依頼する

## レビューアー向けの説明を書く

- 適切なタイトルをつけ、本文に目的、背景を書く
- 実装の根拠を書く
- 仕様や設計をまとめる（リンクや画像があれば
- コードを改善する（リファクタリング）
- 差分の説明をする
- 成果物のリンク、画像、動画等を貼る

何を実装したのか？について重点的に書く人は多い印象を受けるが意外と「なぜ」そのように実装したのか？を書く人は少ない印象を受ける。
極論、何をやっているのかはコードを見れば理解出来るし、もしコードを見て理解出来ない状態であればコードの書き方をもう一度見直す必要がある。しかし、なぜ？そのような実装になっているのかは実装者にしか分からないことが多いのでプルリクの説明だけでなく、ドキュメントコメントとして恒久的に残すのも重要である。



## 不要な差分は持たせず、必要十分なPRを作ることを意識する
余計な差分があると無駄に脳のメモリを消費してしまうのでプルリクを出すときは無駄な差分が無いかどうかチェックしましょう。
色々蛇足で修正し続けたりしてプルリクの粒度が大きくなりすぎたらプルリクを分けるなどするのが重要です。

- プルリクの目的を一つに絞る。
- プルリクの粒度は小さく保つ。一つの機能でもプルリクの粒度が大きくなりそうであれば分割を検討する。

## 最後に
レビューアーをやったことない人はどこか早いタイミングでレビューアーを経験すると良いでしょう。
他人のコードをレビューしてみてはじめてレビューアーの気持ちが分かり思いやりのあるプルリクが作れるようになるのではないでしょうか。
変数がデフォルト値を持つstructではmemberwise initとcustom initで挙動が異なる

## そもそもcustom/memberwise initializerって？

swift.org参考

https://docs.swift.org/swift-book/LanguageGuide/Initialization.html


> ### Memberwise Initializers for Structure Types
> Structure types automatically receive a memberwise initializer if they don’t define any of their own custom initializers.
> 構造体タイプは、独自のカスタムイニシャライザを定義しない場合、自動的にメンバーワイズイニシャライザを受け取ります。

つまり以下の解釈で問題なさそうです。
- custom initializer: 手動で書くinit
- memberwise initializer: structにcustom initializerがない場合に自動生成されるinit

# 本題

## 環境

- Xcode：14.1 (14B47b)
- Swift：5.7.1
- Swift Playground

## 問題

いきなりですが問題です。

### 第1問

以下のコードの出力はどうなるでしょうか？
（`CountA` のinitは何回実行されるでしょうか？）

```swift
final class CountA {
    static var count = 0

    public init() {
        Self.count += 1
    }
}

struct A {
    var count: CountA = CountA()

    // custom init
    init(count: CountA) {
        self.count = count
    }
}

let a = A(count: CountA())
print(CountA.count) // ?
```

答えは **2**  です。
デフォルト値の初期化はinitとは別に行われるため、`var count: CountA = CountA()`と`let a = A(count: CountA())`で２回の処理が行われ、 `CountA` のinitは２回実行されます。

### 第２問

以下のコードの出力はどうなるでしょうか？
（`CountB` のinitは何回実行されるでしょうか？）

```swift
final class CountB {
    static var count = 0

    public init() {
        Self.count += 1
    }
}

struct B {
    var count: CountB = CountB()

    // memberwise init
}

let b = B(count: CountB())
print(CountB.count) // ？
```

答えは **1** です。

## なぜこうなるの？

調べた限りだとSwift.orgにこの仕様に関しては詳しく書いてありませんでした。
コンパイル後の出力を見れば何かわかる気がしますが、そこまでの知識がないのでわかりません。有識者の方、コメントよろしくお願いします。

## なぜこうなるの・考察

custom init版でCountAが2回initされることに関しては、そこまで不自然ではない（理解できる挙動）ですね。

```swift
struct A {
    var count: CountA = CountA() // ここでもCountA生成

    // custom init
    init(count: CountA) {
        self.count = count
    }
}

let a = A(count: CountA()) // ここでもCountA生成
```

**「デフォルト値の初期化・代入はinitとは別に行われる」** ということを意味しています。
ところが、memberwise initだと１回しか初期化が起こりません。つまり以下のようになっています。

```swift
struct B {
    var count: CountB = CountB() // <- ここでCountB生成は起きない

    // memberwise init
}

let b = B(count: CountB()) // <- ここでCountB生成は起こる（当たり前）
```

これは、「memberwise initはデフォルト値の生成プロセスに影響・関与する」ということになります。
**memberwise initは単なる「自動で生成してくれるinit」ではなく** 、「特殊なinit」という認識の方が正しそうです。

C++やJavaでは、「イニシャライザ=変数を初期化・定義するフェーズ」「コンストラクタ=クラスのインスタンスを作成するフェーズ」が分かれていたりします。その概念をSwiftにも当てはめると、
- memberwise initはイニシャライザ（寄り）
- custom initはコンストラクタ（寄り）

という感じになるのかもしれません。

## それで...？

はい、ただの豆知識です。
紹介しといて何ですが、memberwise initによるデフォルト値生成削減の挙動はコスト的には良い物ですが、直感的ではないため、 **狙って利用するべきではない** と思います。structをpublicにしたら強制的にmemberwise init使えなくなリますし...

:::note info
custom initで2回初期化が走る挙動をご存知の方はもうやられているかと思いますが、「デフォルト値を設定しているが、initでの代入を受け付けたい」というケースは、デフォルト引数（もしくはinitのオーバーロード）で吸収できるので、これが一番丸いと思います。

```swift
struct A {
    var count: CountA

    // custom init
    init(count: CountA = CountA()) {
        self.count = count
    }
}

let a = A(count: CountA())
```
:::

## 余談

Xcodeの補完で"generate memberwise initializer"ってありますが、上記問題を考えても、swift.orgの定義を考えても、あれは"memberwise initializerと同じ定義を持つcustom initializer"であって、"memberwise initializer"じゃない気がしています、変えた方がいいような...
【WordPress】アイキャッチ画像を設定する

# 前回の記事

前回の記事では、記事投稿ブロックエディタの使い方を確認しました。

https://qiita.com/raptony110/private/2988fab8e83b41f4aec1

今回は、アイキャッチ画像の指定方法です。

僕のAdvent Calendarを読み終わった人が、
「へぇ簡単なんだなぁ〜　自分もWordPress使ってサイト作ってみようかな〜」って思うあなたがそこにいたのなら、、、、
読むだけで、頭の中WordPress化しちゃったんだよッ！！！！

https://qiita.com/advent-calendar/2022/wordpress-output

# アイキャッチ画像とは
アイキャッチ画像とは、記事タイトルの下に表示される人の目を惹くための画像のことです。
記載する記事の内容を表す画像で、思わず読んでみたいと思う画像を選択すると、閲覧数が伸びる可能性が高くなります。
ですので、いくら記事に自信があったとしても、アイキャッチ画像は、その記事を読んでもらうためのきっかけの一要素と言えますので、是非設定するようにしましょう。
# アイキャッチ画像を設定する
アイキャッチ画像の設定は、記事投稿画面の右側にあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/d1fddfd2-1ad6-a235-46ec-0ab364793c7b.png)
「アイキャッチ画像を設定」と書かれたグレーのエリアをクリックすると、メディア一覧が表示されますので、設定したい画像を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/4bd85950-7f71-48e4-96b5-889931a06c64.png)


# おわりに
いかがでしたでしょうか。今回の記事では、アイキャッチ画像の設定方法について記載しました。せっかく記事を書くのでしたら、是非アイキャッチ画像を活用して、閲覧数を伸ばしましょう。

次回は、同じく記事投稿に付随する設定ですが、カテゴリーとタグの設定方法を見ていきましょう。
GitHubアカウントの作成方法(2022年12月版）

みなさんこんにちわ、泉です。

こちらの記事はGitHub(ギットハブ）アカウントの作成方法について紹介します。
初めてGitHubアカウントを作成する方の参考になりましたら幸いです:raised_hand:

###### 1.GitHubとは

GitHubの読み方は"ギットハブ"と呼びます。ソースコードやドキュメント等を保存したり共有したり公開することができるソフトウェア開発者向けのサービスです。

https://ja.wikipedia.org/wiki/GitHub　※Wiki引用


###### 2.GitHubアカウントの作成手順

 2-1.GitHubのサイトへアクセスする（https://github.co.jp/）

 2-3.GitHubに登録するをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933392/d22cb531-0100-a2d5-748c-1fcf5d5e275e.png)

2-4.各項目を記入する
※電子メールアドレスはGmail等のフリーメールアドレスでもOKです:thumbsup:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933392/d836982c-91ff-5545-ef98-d0444de36af5.png)

2-5.アカウントを確認するの検証後に"アカウントを作成する"をクリックする


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933392/5b653217-b4bf-ef3a-f586-c9c925656035.png)

2-6.登録したメールアドレスに認証コードが届くので届いたコードを入力する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933392/4108db0f-b779-18aa-9e9b-898f50ce8363.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933392/ab367e4d-0a09-8f20-a94c-043cc583ef30.png)

2-6.該当する個人や組織を選択する
※個人で使用するのであれば"私だけ"

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933392/52115d22-6a5c-130e-a650-320a81224f6b.png)


2-6.使用する機能を選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933392/c5bf0a03-1ed3-f153-d39c-70dc1dfeae8e.png)

2-7.GitHubを使用するプランを選択する
※とりあえずフリーで良いと思います

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933392/92d3aa5f-d288-b115-98a2-69f793cbdf95.png)


2-8.REDMAの作成やリポジトリ作成の画面が表示される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933392/c925a142-75b9-f69d-d0bf-c43b3d4bdc4c.png)


###### まとめ

いかがでしたでしょうか？
思ったよりも簡単にGitHubが作れることが分かったと思います。
GitHubはプログラムソースだけじゃなくテキストファイルやword等の資料も格納でき
それぞれのドキュメントのバージョン管理ができるソフトウェアです。この記事を読んだ
方も是非GitHubアカウントを作成してみましょう:relaxed:

最後までご覧いただきありがとうございました👏
Elixirで気軽に巡回冗長検査（CRC）



## 巡回冗長検査（CRC）とは

[ウィキペディア][巡回冗長検査]によると

> 巡回冗長検査（じゅんかいじょうちょうけんさ、英: Cyclic Redundancy Check, CRC）は、誤り検出符号の一種で、主にデータ転送などに伴う偶発的な誤りの検出によく使われている。送信側は定められた生成多項式で除算した余りを検査データとして付加して送信し、受信側で同じ生成多項式を使用してデータを除算し、その余りを比較照合することによって受信データの誤り・破損を検出する。

> 巡回冗長検査は唯一の標準規格があるわけではなく、例えば CRC-12 では3種類の多項式が使われている。また、CRC-16 にはよく使われているものが8種類、CRC-32 は3種類存在する。

> よく使われるCRC-32多項式は、IEEE勧告のものも V.42、イーサネット、FDDI、ZIP、PNG などで使われているものも、ハミング符号の生成多項式を使っている。これは、誤り検出性能がよいためである。ただし、iSCSIで使っている Castagnoli CRC-32C の方がさらに優れている。

送信者側と受信者側でデータに対して割り算をしてその余が一致するかを確認するんですね。面白い。

いろんな種類のいろんなアルゴリズムが存在しているようですが、CRC-32がよく使われるという印象を持ちました。

## Erlangの[:erlang.crc32/1]

やっぱりCRC-32がよく使われるのでしょうか。[Erlang]に[:erlang.crc32/1]関数が実装されています。

```elixir:IEx
iex(1)> :erlang.crc32("闘魂")
628560421

iex(2)> :erlang.crc32("闘魂")
628560421

iex(3)> :erlang.crc32("闘魂x")
3355293142
```

これで気軽にCRC-32の[巡回冗長検査]できることがわかりました。

https://qiita.com/torifukukaiou/items/17d55cf896c24b13350e

## ご参考までに

https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian

https://qiita.com/piacerex/items/e0b6e46b1325bb931122

https://qiita.com/torifukukaiou/items/1edb3e961acf002478fd

https://qiita.com/piacerex/items/e5590fa287d3c89eeebf

[Dashbit]: https://dashbit.co/
[Elixir]: https://elixir-lang.org/
[Erlang]: https://www.erlang.org/
[Phoenix]: https://www.phoenixframework.org/
[Nerves]: https://hexdocs.pm/nerves
[Livebook]: https://livebook.dev/
[IEx]: https://elixirschool.com/ja/lessons/basics/basics/#%E5%AF%BE%E8%A9%B1%E3%83%A2%E3%83%BC%E3%83%89
[Node | hexdocs]: https://hexdocs.pm/elixir/Node.html
[otp_distribution | elixirschool]: https://elixirschool.com/ja/lessons/advanced/otp_distribution
[Node.ping/1]: https://hexdocs.pm/elixir/Node.html#ping/1
[Node.connect/1]: https://hexdocs.pm/elixir/Node.html#connect/1
[Node.spawn/2]: https://hexdocs.pm/elixir/Node.html#spawn/2
[Node.list/0]: https://hexdocs.pm/elixir/Node.html#list/0
[Node.set_cookie/2]: https://hexdocs.pm/elixir/Node.html#set_cookie/2
[Node.get_cookie/0]: https://hexdocs.pm/elixir/Node.html#get_cookie/0
[epmd]: https://www.erlang.org/doc/man/epmd.html
[rpc]: https://www.erlang.org/doc/man/rpc.html
[erpc]: https://www.erlang.org/doc/man/erpc.html
[phoenix_live_dashboard]: https://github.com/phoenixframework/phoenix_live_dashboard
[phoenix_pubsub]: https://github.com/phoenixframework/phoenix_pubsub
[遠隔手続き呼出し]: https://ja.wikipedia.org/wiki/%E9%81%A0%E9%9A%94%E6%89%8B%E7%B6%9A%E3%81%8D%E5%91%BC%E5%87%BA%E3%81%97
[BEAM (Erlang virtual machine)]: https://en.wikipedia.org/wiki/BEAM_(Erlang_virtual_machine)
[:rpc.call/4]: https://www.erlang.org/doc/man/rpc.html#call-4
[メッシュネットワーク]: https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%83%E3%82%B7%E3%83%A5%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF
[巡回冗長検査]: https://ja.wikipedia.org/wiki/%E5%B7%A1%E5%9B%9E%E5%86%97%E9%95%B7%E6%A4%9C%E6%9F%BB
[:erlang.crc32/1]: https://www.erlang.org/doc/man/erlang.html#crc32-1
一般的なアジャイルと、自担当プロダクトの開発を比較してみた結果、貴方がアジャイルをよく分かった気になれる話

アジャイル、アジャイルと言いますが、何だかんだで、そのまんまやれる状況も珍しいと思います。

前提として、アジャイル自体「決まり切った形があるわけではなく、考え方が重要で、アレンジして適用していくもの」と捉えてはいます。
が、実際のところ、「どういうプロダクトだからどう適用するか」という部分は、皆さんそれなりに悩まれているところではないかとも思っています。

そこで、一つのモデルケースとして、自分が担当しているプロダクトについてまとめてみたいと思っています。

【本記事のターゲット】

■アジャイルの理解を深めたい方
■アジャイルの適用事例を探している方
■弊社の開発に興味がある方
※ここで書いているのが、弊社全体の話ではなく、一プロダクトの話であることはご了承ください。

【私が担当しているプロダクト】

■顧客の数は1000～で、法人
■ノーカスタマイズパッケージである

【アジャイルのベースとして参考にしているもの】

■「アジャイルサムライ-達人開発者への道」など(他もありますが、メインはこれ)

それでは、本題…といきたいのですが、いろいろ書こうとすると、膨大になり過ぎることが判明しました。
開発でもよくあることですよね。
なので今回は、本記事において、アジャイルの秘訣の一つを体現していくことにします。

アジャイルにおいて、「時間」、「予算」、「品質」、「スコープ」の内、最初に削ることを考えるべきなのは、どれでしょうか？

答えは「スコープ」です。
※もちろん、他を動かせる状況の場合はその選択もあります。

ということで、「スコープ」を削り、今回は「チーム編成」についてのみ、比較します。気が向いたら続編を書きます。

そしていきなりなのですが、実は「チーム編成」については、一般的なアジャイルと、自担当プロダクトで異なる点が多いです。

まず一つ目、大きなポイントとして、アジャイルでは、顧客と近くで仕事をすることが特に重要とされていますが、我々のチーム内、あるいはチームの身近に「顧客」はいません。
自担当プロダクトでは、「顧客の数は1000～で、法人」であり、要望もバラバラであることが多いです。
こうした中で、プロダクトの性質を踏まえた手段として、「カタログ」というものを作成しています。
細かくは割愛しますが、いわゆる「カタログ」を想像していただいて、大きく差し支えないです。
カタログをレビューして、多くの顧客に価値を感じてもらえる機能を出荷できるよう、努めています。
分野に因りますが、顧客の顕在化したニーズを踏まえつつ、顧客の想像を超えたソリューションを形にしたい、という思いもあるでしょうか。

ただ、正直に言うと、特定の顧客にもっとヒアリングをしたい状況もあります。
もっとできないか、と思うのですが、話を聞いてしまうと、どうしてもそれを(細かい話であっても)体裁の面でも我々の心情の面でも尊重せざるを得なくなり、「ノーカスタマイズパッケージ」として落とし込む上で、ときとして難しい状況になることがあります。
「話はするけど、無視されても気にしない」などという都合の良いお客様はあまりいらっしゃらないので、ここが一つ、難しいところです。

やはり、ビジネス上の状況は、やり方にも影響を及ぼしますよね。

次に二つ目のポイントとして、チーム内の役割分担についてです。
自担当プロダクトでは、一つのチーム内では、プロダクトマネジャー兼スクラムマスターのような存在(ウチのチームの場合は自分)がいる以外、個人が特定の役割に特化していないです。基本的には全員が開発(コーディングなど)を実施し、アナリスト、UXデザイナ、品質保証といった役割は、チーム内である程度こなしつつ、後者2つは別で専門チームがあり、必要に応じて相談、連携する形です。

ただ、チーム外に専門家がいる形は、個人的には正直微妙で、各チームに参加してもらった方が良いと思っています(※仮にチーム数分のメンバーがいなくても)。
今の形の良い点としては、各チーム内の全メンバーが全ての役割にトライできます。
しかし一方、各チーム内では専門性、その自負が育ちにくいところもあります。
ので、既に自負を持っているメンバーが各チームに参加していくことで、各チーム内で自負を育む呼び水にならないか、と思っています。

ただ、いざ変更しようとすると、今、専門チームで活動しているメンバーの思いであるとか、メリデメであるということもあって、総じて「変えようとするほどではない」という考えです。
自社の話でこんなことを書くと、どこかから怒られそうですが、ここは「心理的安全性の高い組織なのだな」と、生暖かい目で見守ってください(笑)。

ということで、今回、内容については一旦ここまでです。

もしかすると、「え、チーム編成の話だけ？」と思われたかも知れません。

しかし今回、奇しくも私は、この記事のスコープの調整によって、アジャイルの真髄を示すことができたのではないかと、謎の満足感に浸っています。
そうです。私は、スコープを調整しながら、アドベントカレンダーの期日を守り、予算は0円のままで、品質…は分かりませんが(大汗)、記事をきっちりとアウトプットしたのです。

例えばこの調子で、何らかの記事を毎週上げていったとすれば、それこそがアジャイル、です。

惜しむらくは、一般的なアジャイルと、自担当プロダクトの開発の共通点についても、もっと示したかった、です。
「チーム編成」については、一般的なアジャイルと、自担当プロダクトで異なる点が多かったため、共通点を示して、「弊社の若手メンバーに、自分達のやっていることを言語化して自覚してもらう」というストーリーは、今回は実現できませんでした。
なので実は、投稿前に、【本記事のターゲット】から「自社の開発に関して、一般的なアジャイルと比較してどうなのかを知りたい弊社若手メンバー」の記述を削除しています。
これはまた、次のスコープにしようかと思います。
TextDiagram 系比較：D2 / PlantUML / MermaidJS / GraphViz

# 背景
PlantUML より Mermaid が好き、とかそういうのってありますよね。
とはいえ、共通してるのは、テキストで図を描くことで、Git で差分管理が可能ってこと

そんな Text 2 Diagram を比較できるサイトを同僚から聞いたので紹介まで


# text-to-diagram.com
直接見てもらった方が早いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/7cfc22dc-3d9c-73f3-9966-c2ab01dde411.png)

https://text-to-diagram.com/

# 比較対象
以下四種類
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/736aabf8-fe65-61ae-3f31-ad96621efed0.png)

## 比較例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/17a57907-d467-14ae-b2f4-92982c11fde4.png)


# Text to Diagram Tools 一覧
以下に色々記載があって、 Contributor 次第では増えるので、興味がある人は挑戦してみては？

https://xosh.org/text-to-diagram/

# 今後
> We'll include a live-runner where you can try out any of the tools/languages. After D2 is more stable, we plan **to write transpilers to and from all popular languages for easy imports and exports**. When that becomes a reality, you'll be able to write one example and compare the equivalent syntax across languages.

Diagram 変換が出来るようになったら確かに便利ですね。

# あとがき

まだまだ発展途上って感じですが、期待大ですね :laughing:
hanamiで簡単なREST APIを作る 1日目

## はじめに
Railsを普段書いているエンジニアです
hanamiというRubyで作られたWebフレームワークがあることを知りました
v2.0.0がリリースされたらしいので、一度触ってみたいと思います

https://github.com/hanami/hanami

## 環境
windows 10, wsl2
ubuntu 22.04
ruby 3.1.2
hanami 2.0.0

## hanamiの準備
hanamiのインストール自体はRailsと同じようにhanamiコマンドが用意されています
```
gem install hanami
```

```
hanami new sample_app
```
プロジェクトの作成もhanami newで実行できます

webサーバーを立ち上げてみます
```
cd sample_app
hanami sever
open http://localhost:2300/
```

![bd438e4a24bc7bad70915b89954bccba.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362594/6295d215-1099-0d57-4513-9dc976c67278.png)

hello from hanamiと表示されました

## postgreSQLとの接続
こちらを参考にインストールしてください
https://wiki.postgresql.org/wiki/Apt

```ruby:Gemfile
gem "rom", "~> 5.3"
gem "rom-sql", "~> 3.6"
gem "pg"
```

こちらを追記して`bundle install`をします

rails db:createのようなdbを作成するコマンドはhanamiでは提供されていないようなので、postgreSQLのコンソールからcreatedbコマンドを実行します
```
createdb sample_app_development
```

dbに接続するための設定を書いていきます
```ruby:config/providers/persistence.rb
Hanami.app.register_provider :persistence, namespace: true do
  prepare do
    require "rom"

    config = ROM::Configuration.new(:sql, target["settings"].database_url)

    register "config", config
    register "db", config.gateways[:default].connection
  end

  start do
    config = target["persistence.config"]

    config.auto_registration(
      target.root.join("lib/sample_app/persistence"),
      namespace: "SampleApp::Persistence"
    )

    register "rom", ROM.container(config)
  end
end
```

database_urlを設定するためにhanamiのSettingsクラスに追加します
```ruby:config/settings.rb
# frozen_string_literal: true

module SampleApp
  class Settings < Hanami::Settings
    # Define your app settings here, for example:
    #
    # setting :my_flag, default: false, constructor: Types::Params::Bool
    setting :database_url, constructor: Types::String
  end
end
```

.envに接続先を設定します
```sh:.env
DATABASE_URL=postgres://postgres:postgres@localhost:5432/sample_app_development
```

ここまでで一旦開発環境の構築は完了しました！
次回は実際にAPIの作成をしていきます
【C#】最近知った便利なVisualStudioの機能と拡張機能【VisualStudio 2022】

# 初めに
閲覧頂きましてありがとうございます🙇
この記事では、私が最近知ったVisualStudioの機能と拡張機能を紹介します。
気になった機能があったら一度試してみてください！！

# 環境
- Visual Studio 2022 community
- C#10(.Net6)
- コンソールアプリ

# 名前のリファクタリング

変数やメソッド名を選択して`ctrl`+`R`,`ctrl`+`R`を入力すると名前をリファクタリング(変更)できます😆

![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519245/99122566-c59e-726e-48c4-0748a2fae93a.gif)

# プロパティからコンストラクタを生成

クラス名の行で`ctrl`+`.`を入力して`コンストラクタ－を生成する...`を選択すると、クラスのプロパティからコンストラクタを実装できます👍
![Animation2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519245/c442f825-ce5f-f92b-2797-a260fbc379bb.gif)

# 日本語から変数名を命名

プログラマーのためのネーミングツールとしてサービスを提供しているCodicの拡張機能になります。拡張機能に関しては公式サイトを参考に導入してください✨

https://codic.jp/

![Animation3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519245/20655242-3fb7-5e69-e818-f43f0881df69.gif)

# 最後に
私がよく使う便利な機能を挙げてみました。これ以外にもCodeMaidやLiveShare等の便利な拡張機能がたくさんあるので自分が使いやすい最高の開発環境を目指して色々試してみてください！！🎆
Vuetify2~3の変更点比較

## はじめに
[LIGTHzアドベントカレンダー](https://qiita.com/advent-calendar/2022/lightz) 2022の６日目の記事です。
### 11月1日にVuetify3がリリースされました！👏

Vuetify2からの変更点が多く、移行に時間がかかっています。
（v-data-tableとv-date-pickerがまだ利用できないのが痛いです😓）

今回はVuetify2からVuetify3に移行した際に、動かなくなった箇所とその解消メモです。

# コンポーネント
## solo,outlined,サイズ等のstyle　propsの指定

```html:vuetify2
<v-btn small outlined></v-btn>
```
vuetify3では↓
```html:vuetify3
<v-btn size="small" variant="outlined"></v-btn>
```
text、outlined、solo　等のpropsは廃止され、
`variant`,`size` propで指定するようになりました。
## v-combobox
### コンボボックスの選択肢にアイコンを挿入するなど、カスタマイズする方法
![スクリーンショット 2022-12-05 21.46.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217078/2837e756-09dc-b176-0276-6db00503f5ce.png)
```html:vuetify2
<v-combobox
    v-model="select"
    :items="items"
  >
    <template v-slot:item="{ item }">
      <v-icon color="primary" class="pr-1" v-if="item.icon">
        {{ item.icon }}
      </v-icon>
      <v-list-item-content>
        <v-list-item-subtitle>
          {{ item.title }}
        </v-list-item-subtitle>
      </v-list-item-content>
    </template>
  </v-combobox>
```
```javascript:script/data
      select: "",
      items: [
        { title: "いちご", icon: "mdi-heart" },
        { title: "バナナ", icon: "mdi-star" },
      ],
```
vuetify3では↓
```html:vuetify3
   <v-combobox v-model="select" :items="items">
        <template #item="{ props }">
          <v-list-item v-bind="props">
            <template #title="{ title }">
              <v-icon
                color="primary"
                class="pr-1"
                v-if="props.value.icon"
                :icon="props.value.icon"
              ></v-icon>
              {{ title }}
            </template>
          </v-list-item>
        </template>
      </v-combobox>
```
itemslotがv-list-itemを自動生成しなくなりました。
vuetify3の[upgrade-guide](https://next.vuetifyjs.com/en/getting-started/upgrade-guide/#v-select-v-combobox-v-autocomplete)に補足で記述があります
# style
styleでテーマ色やマテリアルカラーを指定する方法
```scss:vuetify3
.class1 {
  color: var(--v-theme-primary);
}
```
vuetify3では↓
```scss:vuetify3
.class1 {
  color: rgb(var(--v-theme-primary));
}
```
RGB値で持つようになる為、このように変更する必要があります。

##
変更対応する箇所が多かったところと詰まったところ上げました。
また移行中に気づいたところがあれば追記します。
半導体不足時代のCollapseOS

# Z80-MBC2 
シングルボードコンピュータの[Z80-SBC2](https://hackaday.io/project/159973-z80-mbc2-4ics-homemade-z80-computer)はROMとIO回路をATMELのATmega32に担当させ、後は、Z80CPU、128 kB RAM、74HC00を用意すれば完成する8ビットコンピュータです。
このZ80-MBC2で動作するOSには、8ビットCPU用DOSの、CP/M 3 、CP/M 2.2、QP/M 2.71やUCSD PascalだけでなくCollapse OSがあります。

# Collapse OS
[Collapse OS](http://collapseos.org)は、文明が崩壊した2030年にも動作可能なForthをOSに採用したコンピュータです。2019年10月7日に[reddit](https://old.reddit.com/r/collapse/comments/dejmvz/collapse_os_bootstrap_postcollapse_technology/
)でその詳細が公開されます。


2020年から続くコロナ禍による、全世界的な半導体不足の時期に、2022年6月に改めてオンラインメディアの[ねとらぼ](https://nlab.itmedia.co.jp/nl/articles/2206/19/news024.html)で取り上げられました。

紹介されている動画では、ソースが公開されていない（？）ZX Spectrumでの動作が紹介されていましたが、日本でもおなじみのセガマスターシステムやセガメガドライブあるいはLegacyBIOSで起動可能なX86マシンでも動作可能です。

実は、エミュレータ上で動作する環境もありますので、windowsのWSL上でも動作確認できます。
ここでは、Collapse OS内蔵のエミューレータをLinux上でコンパイルして、動作させる方法を紹介します。

まず、コンパイルに必要な環境構築です。
```
$ sudo apt install -y make gcc libncurses5-dev
```
次に、Collapse OSをコンパイルするディレクトリを作成し、そのディレクトリでソースファイルをダウンロードします。
```
$ mkdir CollapseOS
$ cd CollapseOS
$ wget http://collapseos.org/files/collapseos-latest.tar.gz
$ tar xvf collapseos-latest.tar.gz
```
最後に、cvmディレクトリに移動して、エミュレータ―をコンパイルします。
```
$ cd cvm
$ make
```
コンパイルが成功すると、
./cos-grid
./cos-serial
./satage
の3つのエミュレータが生成します。

# Collapse OSを起動
そのうち「stage」を実行すると、Collapse OSが起動します。
```
$ ./stage
Using blkfs blkfs
Collapse OS ok
```
Collapse OSのウィンドウで、例えば、「0 LIST」と入力すると、「MASTER INDEX」が表示されます。
```
Collapse OS ok
0 LIST
0 LIST
 1 MASTER INDEX
 2
 3 001 Useful little words       010 RX/TX tools
 4 020 Block editor              035 Memory Editor
 5 040 AVR SPI programmer        045 Sega ROM signer
 6 050 Virgil's workspace        060-199 unused
 7 200 Cross compilation
 8 210 Core words                230 BLK subsystem
 9 235 RX/TX subsystem           237 Media Span subsystem
10 240 Grid subsystem
11 245 PS/2 keyboard subsystem   250 SD Card subsystem
12 260 Fonts                     280-289 unused
13 290 Automated tests           300 Arch-specific content
14
15
16
 ok
```
Collapse OSはForthという言語をもとにしているので、Collapse OSのマニュアルだけでなく、Forth言語のマニュアルを参照して、プログラムすることができます。

例えば、「4＋2」を計算したい場合、「4 2 + .」と入力したのち、エンターキーを押すと、答えの「6」と「OK」が表示されます。
```
4 2 + .
4 2 + .
6 ok
```
Salesforce LWCの設定情報について

# これは何？
この記事は「[24日後に立派なSalesforceエンジニアになるWEBエンジニア Advent Calendar 2022](https://qiita.com/advent-calendar/2022/kakakaori)」の11日目の記事です。14日後に立派なSalesforceエンジニアになるために今日はLightning Web Component (LWC)のxmlで設定する項目について見ていきたいと思います。
設定可能なすべての項目については[XML Configuration File Elements](https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.reference_configuration_tags)に記載されています。ここでは独断と偏見に基づいて設定でよく使う項目についてピックアップしてみていきます。

# isExposed
LWCを作るとデフォルトではfalseになっている。このままだとLightningページに表示されないのでtrueに変更する。
```xml:test.js-meta.xml
<isExposed>true</isExposed>
```

# masterLabel
lwcのタイトルでLightningアプリケーションビルダーやLightningコンポーネントのリストビューなどで表示される。
```xml:test.js-meta.xml
<masterLabel>testコンポーネント</masterLabel>
```
![スクリーンショット 2022-12-05 15.25.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/bb8039e7-206e-c478-312f-8102adb2736b.png)
ここに表示される。


# targets
LWCを配置する場所を指定する。
```xml:test.js-meta.xml
<targets>
    <target>lightning__RecordPage</target>
</targets>
```

- lightning__AppPage
- lightning__RecordPage
- lightning__HomePage

あたりをよく使う（気がする）。

# targetConfigs
targetConfigsでは異なるtargets毎に詳細な設定を行うことができる。以下のようにするとレコードページにこのコンポーネントを配置したときに指定する公開プロパティを設定することができるようになる。
targetConfigsは以下のようなサブタグを指定することができる。
## property
```xml:test.js-meta.xml
<targetConfigs>
    <targetConfig targets="lightning__RecordPage">
        <property type="String" name="objectName" label="オブジェクト名" required="true" default="" ></property>
        <property type="String" name="fields" label="項目名(複数の場合は,区切り)" required="true" default="" ></property>
        <property type="String" name="title" label="タイトル" ></property>
        <property type="String" name="iconName" label="アイコン名" default="standard:user_role" ></property>
        <property label="表示モード(view/edit/readonly)" name="mode" type="String" datasource="view,edit,readonly" default="view"/>
    </targetConfig>
</targetConfigs>
```
![スクリーンショット 2022-12-05 22.04.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/d0c6751e-72b8-cd8d-3fc9-53069e63d957.png)
また、ここから指定された値はjsで`@api`デコレータをつけることで取得することができる。
```javascript:test.js
export default class test extends LightningElement {
  @api recordId; // これでコンポーネントを配置するときに指定された値を取ってこれる
  @api objectName;
  @api fields;
  @api title;
  @api iconName;
  @api mode;

  connectedCallback() { 
    // fieldsは”,”をセパレータとして入力を促していたので扱いやすく加工する
    this.fields = this.fields ? this.fields.split(",") : [];
  }
}
```

## objects
このコンポーネントがサポートするオブジェクトを指定する。
```xml:test.js-meta.xml
<targetConfigs>
    <targetConfig targets="lightning__RecordPage">
        <objects>
            <object>Account</object>
            <object>Contact</object>
        </objects>
    </targetConfig>
</targetConfigs>
```
上記のように指定した場合は取引先と取引先責任者のレコードページ以外の編集画面ではこのコンポーネントは表示されない。

## 最後に
今日はLWCでコンポーネントを作るにあたりよく使う設定をまとめました。
他の設定項目について気になる方はぜひ[こちら](https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.reference_configuration_tags)をご覧ください。
明日はLWCのライフサイクルについてみていきたいと思います。
getとsetって便利だねぇ

## 概要
プロジェクト内でAPIでUser型で取ってきた情報を取得してきて、ViewControllerのtableViewに表示するということをしました。ViewControllerに情報を反映させる前にUseCaseとPresenterにて、一時的にUser型の配列をバケツリレーのように参照してViewControllerに反映させました。その際に、getとsetを使ったので、復習を兼ねて調べようと思い記事にしてみました。

## 前提知識
getとsetを説明する前に、ストアドプロパティとコンピューテッドプロパティの違いについて知っておかなければなりません。
###### ストアドプロパティ
まず、ストアドプロパティとは、「変数や定数のように値を代入して保存するプロパティで、定義方法は、変数や定数と同様にvarキーワードやletキーワードを使用する。」と解説されています。
具体的に、コードに落とし込んでみると以下のようなもののことを指します。
```StoredProperty.swift
/// ストアドプロパティ
var storedProperty = "StoredProperty"
```
変数「StoredProperty」を宣言し、その後にString型の文字列を代入しております。このように、単に変数に直接値を代入すると考えていただければと思います。

###### コンピューテッドプロパティ
一方、コンピューテッドプロパティとは、「プロパティ自身では値を保持せず、すでに存在するストアプロパティなどから計算して値を返すプロパティでアクセス毎に、値を計算し直すため計算元の値との整合性が常に保たれると言う性質がある。」と解説されています。そして、続けて「コンピューテッドプロパティを定義するには、varキーワードプロパティに続けて、プロパティ名と型を指定し、{}内にgetキーワードでゲッタを、setキーワードでせったを指定する。」とされています。初めてここで、getとsetが出てきますね。
###### get
getは文法書によると、「他のストアドプロパティなどから値を取得して、コンピューテッドプロパティの値として返す処理で、値の返却にはreturn文を用いる。」と解説されています。
要するに、getとは「直接変数に値を代入せずに、計算され終えたりした値を代入するために使われるもの」であるという認識でとりあえずいいと思います。

###### set
setとは、「プロパティに代入された値を使用して、他のストアドプロパティなどを更新する処理を行う。セッタ内では、暗黙的に宣言されたnewValueという定数を通じて代入された値にアクセスできる。この値を使用してセッタの実行後にゲッタがnewValueと同じ値を返せるようにインスタンスを更新する。」とされています。

###### セッタの省略
セッタの省略とは、「コンピューテッドプロパティではゲッタの定義が必須ですが、セッタの定義は任意で、セッタが存在しない場合は、getキーワードと{}を省略してゲッタを記述できる。」とされており、「セッタが定義されていないコンピューテッドプロパティでは、代入による値の更新ができなくなり、プロパティを更新するコードはコンパイルエラーとなる。」と解説されています。

何はともあれ、どんなものか見てみましょう。

```ComputedProperty.swift
    var price = 100

    /// コンピューテッドプロパティ
    /// このように、直接値を変数に代入することはない。
    var computedProperty {
        get {
            return price * 1.08
        }
    }
/// 108になるはず
print(computedProperty)
```

このように、コンピューテッドプロパティは、あらかじめ値を持たずに、他のプロパティ同士等で値を算出した後に、代入されることが多いみたいです。その際に、getキーワードとsetキーワードを用いることになります。
getおよび、コンピューテッドプロパティを用いることでインスタンスの管理がかなり簡単になったような気がしているので是非使ってみていただきたいなと思います。

## さいごに
普段あまり考えずにとりあえず、使用している感があったので復習してみて新たらためてgetとsetの良さに気づけたかと思います。
W杯クロアチア戦、頑張って欲しいものです。


## 参照記事
https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%AC%AC3%E7%89%88-Swift%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E7%9B%B4%E6%84%9F%E7%9A%84%E3%81%AA%E6%96%87%E6%B3%95%E3%81%A8%E5%AE%89%E5%85%A8%E6%80%A7%E3%82%92%E5%85%BC%E3%81%AD%E5%82%99%E3%81%88%E3%81%9F%E8%A8%80%E8%AA%9E-PRESS-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4297112132/ref=asc_df_4297112132/?tag=jpgo-22&linkCode=df0&hvadid=342397001181&hvpos=&hvnetw=g&hvrand=3895652027245617668&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009309&hvtargid=pla-901496971800&psc=1&th=1&psc=1&tag=&ref=&adgrpid=72867581430&hvpone=&hvptwo=&hvadid=342397001181&hvpos=&hvnetw=g&hvrand=3895652027245617668&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009309&hvtargid=pla-901496971800

https://qiita.com/akeome/items/2197a635ac616ab2f8e2

https://qiita.com/miyakooti/items/a8ac0896eb912c60bd1f
input type="file"でSJISのファイルをアップロードしてFileReaderで取得する時は文字コードに気をつけよう

# \<input type="file">でSJISのファイルをアップロードする時

従来のMPAでは、

```html
<form action="upload.php" method="POST">
  <input type="file" name="uploadFile" />
  <input type="submit" name="submit" value="送信する">
</form>
``` 

と書いて、
PHPやRubyなどサーバーサイドでアップロードファイルの中身を受け取るユースケースは多いと思います

今回はSPAの開発をしており、
Nuxt.js上でアップロードファイルをaxiosでAPIに送信しようとして、
SJISのファイルが文字化けしてしまうことに気付きました

↓下記の **reader.readAsText(file, 'SJIS')** のように第2引数に文字コードの指定をする必要があります

```vuejs
<template>
  <form action="upload.php" method="POST">
    <input type="file" name="uploadFile" @change="onUpload" />
    <input type="submit" name="submit" value="送信する">
  </form>
</template>

<script>
export default {
  name: 'Sample',
  methods: {
    onUpload(event) {
      const file = event.target.files[0]
      const reader = new FileReader()
      reader.readAsText(file, 'SJIS') // SJISのファイルの場合は文字コードの指定が必要

      reader.onload = (e) => {
          // ...アップロードしたファイルの取得処理
          console.log(e.target.result)
      }
    },
  },
}
</script>
```
書評：コーディングを支える技術

# 「コーディングを支える技術」

## どんな人におすすめか
- プログラミング「言語」に興味がある人
- 非CSのプログラマーで２個目３個目の言語にチャレンジしようと思ってる人
- 「オブジェクト指向」や「関数型プログラミング」が全く直感できない人


## どんな本か

プログラミング初学者を対象に「関数」「エラー処理」「並列処理」「オブジェクト指向」といった幅広いプログラミング言語の要素について比較・言語史を用いつつ解説を加えている書籍です。
他の本ではあまり説明されないがちな「関数」「オブジェクト指向」の意義などについてフラットに各言語の比較・言語史的「〇〇をいままでパラダイム前はこのようにしてやってたけどこれを言語機能にしたのが××」といった解説が付け加えられ、プログラミングへの深い理解を助けてくれます。


## 特になるほどなと思った章について軽く紹介

### 構文木

構文木とは、Wikipedia[^1]によると
> 構文木（こうぶんぎ）とは、構文解析の経過や結果（またはそれら両方）を木構造で表したもの。

とあり、実際にプログラミング言語の処理系は一度構文木を中間状態として持っている言語もあると思います。
Pythonではastライブラリーによって途中の構文木を確認することができるということを知り、結構中身ではいろんな処理が走ってるのだなと触って少し感激しました。
どうやって入力値を木構造に変えているか興味を持ったので後日C#で再起下降パーサーというパーサーを書く記事でまた詳しく構文木については触れていきたいと思います。

[^1]:https://ja.wikipedia.org/wiki/%E6%A7%8B%E6%96%87%E6%9C%A8#


### 関数・例外処理

関数：　以前はポインターでここに戻って処理をしてね！」と次のやる作業のポインターを変えることで実装していた処理でした。これを言語機能として一塊の処理のまとまりとすることで、可読性と再利用性を高めることができるようになった。またこれによって「再帰呼び出し」をやりやすくなった。

特に再起呼び出しについては、図表を用いて丁寧に説明しているため関数型プログラミングの初歩でつまづいている場合この辺りを読んでみると嬉しさがわかるようになる気がします。

例外処理：　失敗時の処理を昔は返り値や割り込みをおこなっていたが、　返り値には可読性やエラーの原因究明に時間がかかるという課題があった。そこで割り込み処理を応用した「例外処理」のための文法が生まれた。例外の文法には、try-catch-finally構文（失敗しそうな部分を囲むことができる。また、必ずやる処理を規定できる）や検査的例外（例外処理として行う例外をあらかじめ宣言するJavaの機能）など様々な例外時の問題を解決する方法が提案されている。

個人的には、まだ実装時の課題が残りまだまだ新しい例外処理の概念が提唱されそうだなとワクワクするような部分もありました。また、関数にも例外処理にも言えるのですがこれらは「善く」コードを書かないと活用できてないことによる可読性の低下やトレーサビリティの低下を招いてしまうなということを感じ、意味を知りより善く書いていきたいということを改めて感じさせる文でした。

### オブジェクト・継承
いわゆる「オブジェクト指向」に関連する事項が２章に分けられており、そこからもオブジェクト指向というパラダイムの難しさ載せられている期待感がいかに大きかったかを感じることができます。また、型という概念もオブジェクト指向を難しくさせている一つの要因に思えます。

オブジェクト指向：　少なくとも二種類の考え方があり、その上でオブジェクト思考を実践している言語には型がついている言語と型タグのみ採用している言語があることも述べられています。その上で
> つまり、現実世界の「モノ」の「模型」をコンピューターの中に作るにはどうすればいいか？どうすれば楽に作ることができるか？それを色々な人が考えた結果「オブジェクト指向」という概念が生まれたきたのです[^2]

と紹介されています。その後、ParlやJavascriptを例にしてクラスについての解説が行われています。図表やコードが多く書かれており、かなり短い分ではありますがわかりやすく概念を説明しているように思えます。

## 他のおすすめ書籍

この本と一緒に読むと良い本としては以下があげられます。
- C#/Javaの入門書
- Python/Rubyの入門書
- [オブジェクト指向でなぜ作るか](https://amzn.to/3VvFLej)

個人的にオブジェクト指向はプログラミング言語的な概念以外にも広がってしまった概念であるためそれに言及された本を一緒に読むとオブジェクト指向についての理解や認識が持てるのかなというふうに感じています。



[^2]:西尾 泰和　（2013）　「[コーディングを支える技術 ~成り立ちから学ぶプログラミング作法 (WEB+DB PRESS plus)](https://amzn.to/3Bb2Zy4)」 技術評論社　１８８　７−１０