OmniAICreator/Qiita-1.07M huggingface dataset:
light / relight

「instantNeRFで遊ぶ Advent Calendar 2022」の23日目です。

今日はlightについて調べてみました。

:::note
業務外の個人的な検討活動です。
:::

#### nerf_loader.cu
tranfrom.jsonにおいて各フレームの"driver_parameters"でLightX, LightY, LightZを設定できるようです。
しかしgithubのissuesにも使い方の説明は見つかりませんでした。

https://github.com/NVlabs/instant-ngp/issues/951

変数の名称と形式から照度差ステレオのデータセットにすればよいのかもしれないと思いました。

https://annex.jsap.or.jp/photonics/kogaku/public/41-05-kaisetsu4.pdf

http://seisan.server-shared.com/691/691-31.pdf

#### テストデータ
sketchfabのNefertiti statueを使用させていただきました。ありがとうございます。

https://sketchfab.com/3d-models/nefertiti-statue-d148f771c3f44225b56cb7ce8d3c5ce6

#### Blender Render
照明を三か所配置し1つずつ照射した状態の画像をRenderしました。
![23-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/4ea9fcd8-db2d-0f09-3911-03a7c59cd58a.png)

light1 / light2 / light3
![23-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/3fb6e7e4-dac3-61f8-3328-ba8aa0224a55.png)


#### transform.json
light1のtransform.jsonをlight2とlight3へコピーし照明の条件だけ変更します。照明の条件を各フレームの"driver_parameters"に入力しました。
jsonファイルは照明の条件ごとに分けました。testbed.exeは複数のjsonファイルをまとめて読み込むようです。
画像ファイルは照明の条件ごとにフォルダを分けました。

![23-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/213a0508-717b-4b5f-eb86-7beef90fa0fe.png)

#### testbed.exe
Light Dirを調整している様子です。transform.jsonに"driver_parameters"が設定されているとメニューに"Light Dir"が現れましたので、スライダを変更すると照明が当たっている方向が変わりました。
明るくなる方向の挙動が少しおかしいように見えるのはモデルを事前に回転させた影響なのかもしれません。今後の課題です。
<iframe width="560" height="315" src="https://www.youtube.com/embed/4yAC751hAsk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
今日のElixirSchoolメモ13「文字列」

Elixir Schoolの勉強メモです。

https://elixirschool.com/ja/lessons/basics/strings

## 文字列

Elixirにおいて文字列とはバイトのシーケンス。

```elixir
iex(19)> string = <<104,101,108,108,111>>
"hello"
iex(20)> string <> <<0>>
<<104, 101, 108, 108, 111, 0>>
```

文字列に`0`というバイトを追加すると、有効な文字列ではなくなるため、IExは文字列をバイナリとして表示する。
これは、文字列を表現するバイトがなんなのか確認したいときに有用。

`<<>>`記法はコンパイラにこれらのシンボルで囲まれた中身はバイト列であることを示す。

## 文字リスト

内部ではElixirの文字列は文字の配列というよりはバイトのシーケンスで表現されており、Elixirは複数の文字のリストである文字リストという型を別に持っている。

Elixirの文字列はダブルクォートで生成され、一方文字リストはシングルクオートで生成される。

シングルクオートで生成される文字リストから得られるここの値はバイナリで表現されているコードポイントで、UTF-8でエンコードされている。

```elixir
iex(23)> 'hełło'
[104, 101, 322, 322, 111]
iex(24)> "hełło" <> <<0>>
<<104, 101, 197, 130, 197, 130, 111, 0>>
```

`322`はł のコードポイントで、UTF-8でエンコードされているので、`197`、`130`という2つのバイトになっている。

`?`を使って、文字のコードポイントを取得することができる。
この記法は、文字のリストから情報を抽出するパターンを使うときに役に立つことが多い。

```elixir
iex(26)> ?Z
90
```

## 書紀素とコードポイント

コードポイントはたた単純にUnicodeの文字で、UTF-8のエンコーディングに応じて1バイト以上のバイトで表現されるものとして差し支えない。
ASCIIの範囲外の文字は常に2バイト以上にエンコードされる。たとえば`á, ñ, è`のようなチルダやアクセントのついたラテン文字は2バイトにエンコードされる。
アジア言語の文字はしばしば3から4バイトにエンコードされる。
書記素は1文字にレンダリングされる複数のコードポイントから成る。

## 文字列関数

### `length/1`

書記素の長さを返す。

```elixir
iex(31)> String.length "Hello"
5
```

### `replace/3`

```elixir
iex(33)> String.replace("Hello", "e", "a")
"Hallo"
```

### `duplicate/2`

```elixir
iex(34)> String.duplicate("Oh my ", 3)
"Oh my Oh my Oh my "
```

### `split/2`

```elixir
iex(36)> String.split("Hello World", " ")
["Hello", "World"]
```
vue.jsのvuexでthis.$store.dispatchに関するメモ

Vuexは、Vue.jsアプリケーションで状態の管理を行うためのライブラリです。その中で、dispatchメソッドは、Vuexのストア内で定義されたアクションを実行するために使用されます。

アクションは、ストアの状態を変更するための関数です。アクションを使用することで、ストアの状態を変更することができます。

以下は、Vuexでアクションを使用する例です。

```
// ストア内でアクションを定義する
const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  },
  actions: {
    increment (context) {
      context.commit('increment')
    }
  }
})

// コンポーネント内でアクションを実行する
methods: {
  increment () {
    this.$store.dispatch('increment')
  }
}

```

上記の例では、incrementアクションを実行することで、ストア内のcount状態をインクリメントすることができます。

一般的に、アクションは、非同期処理を行う場合や、複数のミューテーションを実行する場合などに使用されます。ただし、単純な状態の変更の場合は、ミューテーションを使用することが推奨されます。
【ViewComponentシリーズ①】ViewComponentを導入すべき理由5つ【Rails】

 ## 1. ViewComponentとは
再利用可能で、テストがしやすく、カプセル化されたビューコンポーネントを作るための**Railsの[gem](https://github.com/ViewComponent/view_component)**。
Reactから影響を受けた、Presenter(ViewのためのUIのビジネスロジックを書く)パターンの進化版。

ざっくり言うと、フロントでは当たり前のように使われているコンポーネントの概念を、ViewComponentを使ってRailsのビューにも取り入れて、同じようなビューのコードをコンポーネント化させちゃおうというもの。

ここで「それなら既にRailsには[パーシャル](https://railsguides.jp/action_view_overview.html#%E3%83%91%E3%83%BC%E3%82%B7%E3%83%A3%E3%83%AB%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88)があるんだからそれ使えばいいんじゃないの？」という話になるが、どうやらViewComponentを使った方が良い理由があるらしい。その理由を以下で確認する。

## 2. ViewComponentを導入すべき5つの理由
### 1. 1つのロジックを一元化できる
Railsでは、ビューのテンプレートがコントローラ、モデル、ヘルパー等に分散し、本来の責務が薄れてしまうということがよく起こる。

ViewComponentは同一のビューロジックを1つのクラスに集約し、シンプルにまとまったオブジェクトを実現する。プロジェクト内に同じようなロジックが散らばるみたいなことを防げる。

### 2. ビューのユニットテストができる
ViewComponentでは全てのコンポーネントがユニットテストされることを前提に設計されている。今までのRailsのビューテンプレートでは難しかったビュー自体のユニットテストが可能になるだけでなく、類似のコントローラのユニットテストと比較して、<font color="red">**100倍以上**</font>速くテストができる。

ViewComponentのユニットテストはCapybara matchersライブラリを活用し、従来はコントローラやブラウザテストに限定されていた複雑なアサーション(あるコードが実行される時に満たされるべき条件を記述して実行時にチェックする仕組み)を可能にする。

### 3. データフローが明示的で分かりやすい
従来のRailsのテンプレートは暗示的なインターフェースであったため、読み込み場所によっては上手くレンダリングされずにバグが起こるみたいなことが発生していた。

その点ViewComponentでは標準的なRubyのイニシャライズを用いて、データを明示的に渡してレンダリングさせるため、安全であり、再利用が簡単である。どういうデータが渡されるのか、容易に予測ができる。

### 4. パフォーマンスを向上させる
平均的にパーシャルよりも<font color="red">**10倍高速**</font>である。

速さの要因は読み込みのタイミングにある。従来のRailsテンプレートは実行時に読み込まれていたが、ViewComponentのテンプレートは、アプリケーション起動時にプリコンパイルされる。

### 5.　コードの品質が向上する
Railsのテンプレートでは、長いメソッドであったり、深いネストの条件式であったり、標準のRubyのお作法から外れてしまうことがよくある。

ViewComponentは単なるRubyのオブジェクトのため、コードの品質基準を守ることが比較的に容易である。


## 3.結論 
ViewComonentはビューのロジックを一元化できる他に、ユニットテストのしやすさやパフォーマンス・品質の向上等の面から、パーシャルよりも優れていると言える。

よって特に下記のような箇所がViewテンプレート内に見つかった場合は、ViewComponentの導入を検討してみても良いかもしれない。
- 再利用される可能性のあるところ
- 今パーシャルを使っているところ
- ユニットテストを通すべきところ
- Rubyのコードがたくさん埋め込まれているところ

## 4. 次回予告
次回は実際にサンプルアプリにViewComponentを導入し、RSpecでテストを書いて、上記のメリット等を確認してみる。


## 参考
https://viewcomponent.org/

https://www.bootrails.com/blog/ruby-on-rails-viewcomponents-tutorial-and-examples/
Goのpackage管理

## はじめに
goのpackage管理関係は変更が多くて苦労した
理解できた気がするのでまとめる

## 基本は下記でなんとかなりそう

```go
// global install
go install <package>@<version>

// local install
1 go mod init [module名] // 基本はリポジトリ名に合わせる
2 import文記載
3 go mod tidy
```

3の`go mod tidy`は使ってないpackageの掃除もする
新規packageのinstallのみしたい場合は `go get`を引数なしで実行する
PR-500KI VPNが時々切れる

何年間も困ってたがようやく解消した。
それまでの解決方法はホームゲートウェイの電源ONOFFか、設定画面でVPNのONOFFしかなかった。
ゲートウェイ本体交換、プロバイダ切替とか色々やった。
何やっても駄目だった。~~でひょんな事から解決。~~

~~解決策は、オプションで付く**無線LAN機器（SC-400NE2）を外す。**
これだけ。こいつが災いだった模様。
NTTはわかってんのか？~~

1ヶ月以上問題なかったが、久しぶりにVPNサーバーが無応答になってしまった。
やっぱホームゲートウェイに問題があるのか。
根本的な問題解決はYAMAHAのルーターに変える事かな・・・。
簡単Elixirシリーズ  ~ Elixir Advent Calendar の記事の合わせ技をやってみた ~ 

# 簡単Elixirシリーズ 
## ~ Elixir Advent Calendar の記事の合わせ技をやってみた ~

この記事は「[Elixir Advent Calendar 2022](https://qiita.com/advent-calendar/2022/elixir)」20日目の記事です
東京にいるけどfukuokaexのYOSUKEです。

簡単 Elixirシリーズでは小ネタをサクッと書いていこう。というコンセプトで作っていきます。

今回は、@mnishiguchi さんの[ElixirでQRコードを表示して楽しむ](https://qiita.com/mnishiguchi/items/2106ddffa800d4be0fd2)を見て、QRコードを画像生成しようと、ErlangにあるEGD(Earling Graphical Droid)という画像ライブラリを利用して生成しようと思ったら、

@t-yamanashi さんの[Elixirでテスト用の画像を量産しよう](https://qiita.com/t-yamanashi/items/bd65b536ecb9904b3f40)という記事が飛び込んできて、あれ？こっちのモジュール使った方が楽にできそうだぞ？

ということで、やってみた。という小ネタ（そう、この記事はサクッとがコンセプトW）
早速、プロジェクトファイルを作成する。

```elixir
$ mix new qr_coder
```

まずは、QRコード生成のライブラリについて@mnishiguchiさんの記事で紹介されていた「[iodevs/qr_code](https://github.com/iodevs/qr_code)」がソースを見るに、SVGの書き出しまで出来そうだったので採用。
続いて、@t-yamanashi さんが紹介してくれていた```mogrify```を利用します。

```elixir
  defp deps do
    [
      {:qr_code, "~> 2.3.1"},
      {:mogrify, "~> 0.9.2"}
    ]
  end
```

で、Mogrifyの説明を見ると、 ```An Elixir wrapper for ImageMagick command line.```
と書かれていたので、ImageMagickをインストールして、それを利用する薄いラッパーなのね。ということでインストール。

```
brew install imagemagick
```


まずは、QRコードの```svg```を生成する関数を作成する

```elixir
defmodule QrCoder do
  def svg(str) do
    QRCode.create(str)
    |> Result.and_then(&QRCode.Svg.save_as(&1,"#{str}.svg"))
  end
end
```

続いて、生成したsvgをpngに変換する関数を作成する。
今回はまず試したいので、サクッとファイル名を固定にして書き出すようにしてみた。

```elixir
defmodule QrCoder do
# 省略 #
  def png(path) do
    Mogrify.open(path)
    |> format("png")
    |> save(path: "QR_code.png")
  end
end
```

早速、会社のURLを入れたQRコードを生成してみる。

```elixir
iex()> QrCoder.svg("thewaggle-training.com")
{:ok, "thewaggle-training.com.svg"}
```

続いて、PNGに変換してみる。

```elixir
iex()> QrCoder.png("thewaggle-training.com.svg")
%Mogrify.Image{
  animated: false,
  buffer: nil,
  dirty: %{},
  ext: ".png",
  format: "png",
  frame_count: 1,
  height: nil,
  operations: [],
  path: "QR_code.png",
  width: nil
}
```

お、できた。

![QR_code.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/1931a5c9-34d7-44fa-f4aa-f3bb3b79d15c.png)

いや、Elixir の Advent Calendar で学んだことを組み合わせてみるとまた面白い発見ありますね。

皆さんも是非、チャレンジしてみてください。
C#でWebAPI入門する

C#でWebAPIを作るのちょっと詳しいことあんまり乗ってないので困りますね。
筆者はC#もプログラミング自体が始めて間違い等があればご指摘お願いします。
PostgresでDBは適当に作っておいてください。
所謂DBファーストで開発していきます。  

#### DBとの接続設定について  
localhostでPortは5432です。  
データベースとユーザー名、パスワードについてはご自身で設定したものを使用してください。
appsettings.jsonで行います。
```json
{
  "ConnectionStrings": {
    "DefaultConnection": "Host=localhost;Port=5432;Database=***;Username=***;Password=***;"
  },
  "AllowedHosts": "*"
}
```

#### DBに対応するモデルを作成
以下の用にクラスを作成します。
フォルダはModelっていうフォルダにEmpolyee.csっていうファイルを作ります。
(なんかC#はフォルダやファイル名で、
機能を区別してるらしいんですけどよくわかりません
```C#
using System;
using System.Collections.Generic;

namespace webapi.Models;
public partial class Employee
{
    public string? Id { get; set; }

    public string? Name{get; set;}
}
```

#### DBContextを作成

```C#
using Microsoft.EntityFrameworkCore;
using HomeGrown.Models;
using Microsoft.Extensions.Configuration;
using Microsoft.AspNetCore.Mvc;

namespace webapi.Data;

public class EmpolyeeContext : DbContext
{
    public EmpolyeeContext()
    {
    }

    public EmpolyeeContext(DbContextOptions<EmpolyeeContext> options)
    : base(options)
    {
    }

    public DbSet<Empolyee>? Empolyees => Set<EmpolyeeContext>();
}
```

これでDbとの接続設定が終わったので、あとはコントローラーを作ります。

#### Controllersの作成について
Controllersっていうフォルダを作ってそこにコントローラーを作ります。
ここではRESTFul APIに従ってHttpGetなどのを作成します。
手順としては、ルーティング(どのURLでどのメソッドを呼び出せるか設定)して、  
そのURLで表示させたい処理を書いていきます。
ここではうえで作成したDBのデータをHttpGetで取得してきます。
DR サイトの構築で困った話

謎のアドベントカレンダー、第 23 話です。

そろそろ終わりが見えてきました。

## 東日本大震災の後

前回の話にも少しだけ登場しましたが、筆者の職場でも「システムリプレースの計画に合わせて、社外向けサービスの DR サイトを作ろう」という話になりました。

データがそれなりの容量まで蓄積されてきて、かつ機密性が高いデータが含まれるようになってきたので、付き添いメンバーとともに車で運ぶことを計画していたところ、社内ルールにない決まりを突然作られて、車での運搬が禁止されてしまいました。

どうやら、[以前の記事に出てきた A さん](https://qiita.com/hmatsu47/items/59448a556230d3d84fd4#%E7%99%BA%E8%A6%8B)が社用車で何かやらかしたことが影響しているようです。

当時の上司に **「ポータブル HDD に入る容量なんだよね？」「電車で運べばいいじゃない」** など、セキュリティ意識ゼロなことを言われて困惑。

## さすがに電車ですべてのデータを運びたくないので

データを分割し、

- 機密性の低い一部分だけを自分の社用パソコンに保存して電車で持って行き
  - さすがにポータブル HDD への保存は紛失が怖いから嫌だ
  - かといってデカくて重い外付け HDD なんか持って行きたくないし
- 残りの大部分は現地から 24 時間ぶっ通しで数日間掛けて、ネットワーク経由で取得する

ことにしました。

（全部をネットワーク経由で取得しようとすると、当時の通信量制限に引っ掛かって帯域を抑制される恐れがあったゆえのやむを得ない判断でした）

とはいえ出張期間は限られます。

## 時間短縮のためには

- 送り側・受け側に複数の回線を使い並行してデータを転送する
- DR データセンター側のうち 1 本はデータセンター提供回線だったので敷設・開通済みだったがもう 1 本はフレッツ光の引き込みだったので早めに開通させる必要がある
- それぞれの回線でできるだけ早く VPN を通す必要がある

というわけで、頑張って回線と VPN を早く開通させてデータ転送を始め、なんとか予定期間内に終えることができました。

そして差分のレプリケーションも設定し、無事レプリケーション元に追いつきました。

実はフレッツ光を引き込んだその日、ラックの扉を閉める際に（きちんと固定されていなかったため）うっかり光ファイバーを挟んでしまい、触ると通信が不安定な状態になってしまうアクシデントが発生。

（完全に断線しなくて良かった）

2 日後に室内のファイバーを引き直してもらいました。

また、フレッツ光は（アクシデントとは関係なく）あまり速度が出ませんでしたが、データセンター提供回線の実効速度が思いのほか速かったのも助かりました。

（なお、泊まったホテルの回線は恐ろしく低速でした。別の機会に別のホテルに泊まったときも同様で、持って行ったモバイルルータも同様にクソ遅かったので、その回線がなかったらと思うとゾッとします）

🐢🐢🐢

---

24 日目の記事に続きます。

- **[データセンターからの撤収で困った話](https://qiita.com/hmatsu47/items/73dd3720fa007c5c6110)**

https://qiita.com/hmatsu47/items/73dd3720fa007c5c6110
【SwiftUI】Glassmorphismイケすぎでしょ！！

# はじめに
めっちゃかっこいいGlassmorphismをSwiftUIで再現できたので記録しておきます。
再利用できるようにButtonStyleにしてみます。

背景の画像は[こちら](https://jp.freepik.com/free-vector/wave-background-gradient-design_32439901.htm#query=background%20purple&position=6&from_view=search&track=sph)から使用しました

# サンプルアプリ
![simulator_screenshot_BBF0BA45-6769-4E89-8568-C9895A5F85BB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/3165fa25-28bc-f642-c832-b563fd3102e2.png)

# 実装
### View
```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        ZStack {
            Image("background")
                .resizable()
                .scaledToFill()
                .edgesIgnoringSafeArea(.all)

            Button {
                print()
            } label: {
                Text("").frame(width: 320, height: 200)
            }
            .buttonStyle(.glassmorphism)
        }
    }
}
```

### ButtonStyle
```swift
struct GlassmorphismButtonStyle: ButtonStyle {
    func makeBody(configuration: Configuration) -> some View {
        configuration.label
            .foregroundColor(.white)
            .background(.ultraThinMaterial, in: RoundedRectangle(cornerRadius: 10))
            .overlay(.white.opacity(0.5), in: RoundedRectangle(cornerRadius: 10).stroke(style: .init()))
    }
}

extension ButtonStyle where Self == GlassmorphismButtonStyle {
    static var glassmorphism: GlassmorphismButtonStyle {
        .init()
    }
}
```

# おわり
これめっちゃかっこいいです
エンジニアを目指したくなる保存版の名言12選

エンジニアを目指したくなる名言を12個紹介します。

こちらの名言サービスでの記事で紹介されている名言をこちらでも紹介していきます

引用元：[エンジニアを目指したくなる保存版の名言12選｜名言Anchor（アンカー）](https://anchor.id/column/n10835)



# エンジニアを目指したくなる保存版の名言12選

## 名言１

    ①「常に進化し続ける存在、それが人間ですね。自分を磨き続けることはプログラマーに限らず大事なことでもありますね。」

    （ラリー・ウォール）
引用元：[名言Anchor](https://anchor.id/column/n10835)

## 名言２

    ②「プログラマーは部屋にこもってキーボードをぱちぱちやってるもの、という思い込みを覆されますね。つくりたいものをつくるだけじゃなく、まずオフィスの外に出てユーザーの声を聞きに行こう、ということでしょう。」

    （ジェフ・ベゾス）
引用元：[名言Anchor](https://anchor.id/column/n10835)

## 名言３

    ③「全部自分でやるからこそ、すごく勉強になる」

    （スティーブ・ウォズニアック）
引用元：[名言Anchor](https://anchor.id/column/n10835)

## 名言４

    ④「未来を予測する最善の方法は、それを開発することだ。」

    （アラン・ケイ）
引用元：[名言Anchor](https://anchor.id/column/n10835)

## 名言５

    ⑤「すばらしい仕事をした人々を見ると、彼らに共通するのは並外れた努力であるということがわかる。努力しないで美しいものを作ろうなんて、それは時間の無駄である。」

    （ポール・グレアム）
引用元：[名言Anchor](https://anchor.id/column/n10835)

## 名言５

    ⑥「ここで私の黄金律を紹介しよう。
    一つ目は「自分がして欲しいことを人にもしてあげよう」。
    このルールを遵守すれば、どんな状況にあっても自分がどんな行動をとるべきかちゃんと分かるというわけ。
    二つ目は「自分のすることに誇りを持て」。
    三つ目は、「そして、楽しめ」。」

    （リーナス・トーバルズ）
引用元：[名言Anchor](https://anchor.id/column/n10835)

## 名言６

    ⑦「僕は技術が世の中を支えていると思う。人間社会を豊かにしてきた一番の大きな原動力は、技術者の力だと思っている」

    （堀江貴文）
引用元：[名言Anchor](https://anchor.id/column/n10835)

## 名言７

    ⑧「成功したければ、成功への願いが、失敗への恐れよりも、強くなければいけない。」

    （ビル・ゲイツ）
引用元：[名言Anchor](https://anchor.id/column/n10835)

## 名言８

    ⑨「アイデアを思いつくことは何か素晴らしいものを作ることの中で最も大事な部分ではありません。一番大事なのは実行することです。 」

    （セルゲイ・ブリン）
引用元：[名言Anchor](https://anchor.id/column/n10835)

## 名言９

    ⑩「自分の作りたかったもので、満足してくれる人がいて初めて、本当の大きな喜びが生まれる。自己満足だと喜びは小さいんです。「誰かの役に立つものを作りたい」それがモノづくりの本質なんだと思いますよ。」

    （大平貴之）
引用元：[名言Anchor](https://anchor.id/column/n10835)

## 名言１０

    ⑪「困難のために会社を辞めたことはあっても、プロジェクトを止めたことはない。いつもPythonのプロジェクトは次の会社で続けていた。」

    （グイド・ヴァンロッサム）
引用元：[名言Anchor](https://anchor.id/column/n10835)

## 名言１１

    ⑫「失敗からは必ず新たな発見がある。最近は、失敗するのが楽しみになってきました。」

    （田中耕一）
引用元：[名言Anchor](https://anchor.id/column/n10835)



# 転職に後悔して立ち直れないときは転職エージェントを利用する


エンジニアを目指してみたくなった時は、エンジニアに強い転職エージェントに相談してみるのがおすすめです。

エンジニアに強い転職エージェントは「[【厳選】ITエンジニアの転職に強い転職エージェントおすすめ20選](https://anchor.id/column/n10758)」で、20の転職エージェントを紹介しているので、ぜひ見てみてください。

＞＞[【厳選】ITエンジニアの転職に強い転職エージェントおすすめ20選](https://anchor.id/column/n10758)を見る

その他、転職エージェントの選び方や転職エージェントを活用するメリット・デメリット、活用するステップもまとめていますので、参考にしてみてください。



# まとめ

エンジニア職はWebテクノロジーがどんどん進化していく時代においては、もっともっと求められる職業であると言えます。

エンジニアを力強く目指し、エンジニアとしていいものづくりをしていく上で、今回紹介した偉人の言葉などが少しでも参考にしてもらえると嬉しいです。
【Git】ignoreされているか確認する方法

## 確認方法

`git status --ignored`で確認できます。  

```terminal
$ tree
.
├── example.txt
├── sample.txt
└── test.txt

$ cat .gitignore
/test.txt
/example.txt

$ git status --ignored
On branch main

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        .gitignore
        sample.txt

Ignored files:
  (use "git add -f <file>..." to include in what will be committed)
        example.txt
        test.txt

nothing added to commit but untracked files present (use "git add" to track)
```

また`git ls-files --other --ignored --exclude-standard`でも可能です。  
こちらはignoreされているファイルのリストのみ出力されます。  

```terminal
$ git ls-files --other --ignored --exclude-standard
example.txt
test.txt
```
【初学者向け】Pythonで簡単なCRUD処理を作ってみた

# はじめに
CRUD（Create, Read, Update, Delete）とは、データベースやWebアプリケーションで扱われる基本的な操作のことを指します。

# コード
```Python
import sqlite3

# データベースに接続
conn = sqlite3.connect('database.db')

# テーブルを作成
conn.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, email TEXT)''')

# データを作成（Create）
def create_user(name, email):
    conn.execute("INSERT INTO users (name, email) VALUES (?, ?)", (name, email))
    conn.commit()

# データを読み取り（Read）
def get_user(user_id):
    cursor = conn.execute("SELECT * FROM users WHERE id=?", (user_id,))
    return cursor.fetchone()

# データを更新（Update）
def update_user(user_id, name, email):
    conn.execute("UPDATE users SET name=?, email=? WHERE id=?", (name, email, user_id))
    conn.commit()

# データを削除（Delete）
def delete_user(user_id):
    conn.execute("DELETE FROM users WHERE id=?", (user_id,))
    conn.commit()

# データベースとの接続を閉じる
conn.close()
```
[baserCMS]baserCMSのメールフォームで日本一簡単にajaxメールフォーム


ハッピーニュー [baserCMS Advent Calendar 2022.](https://qiita.com/advent-calendar/2022/basercms)
さてその中盤辺り担当です。=[ 'ω' ] ﾄｳﾌｰ

## baserCMS4のご紹介
baserCMSとは、CMS（Contents Management System）です。
世の中には、WordpressとかMovableTypeとかSHIRASAGIなどいろんなCMSがありまして、その中で、PHPのフレームワークであるCakePHPを用いてできてるCMSです。

baserCMS（ベーサーシーエムエス）とは、Webサイト制作プラットフォームとして最適な国産CMSです。
です。

- 公式ここ https://basercms.net/
- プラグインとかテーマとか配布したり https://market.basercms.net/
- 事例増えてます https://basercms.net/works/
- おいしそうなエディタ https://market.basercms.net/products/detail.php?product_id=66

## この記事で紹介すること

baserCMSで簡単に作ることのできるメールフォームを、とても簡単にajax形式で使う手法をご紹介します。


## 想定している対象者
- baserCMSでウェブサイトを制作をしている方
- PHPer


### 環境

- PHP Version 7.4.25
- baserCMS 4.7.2
- テーマ: 標準で利用できる bc_sample を利用


## やってみた

https://example.materializing.net/
ここでどんな感じなのか閲覧できます。

こちらはajax化する前。フォームに遷移する動作ですね。
https://example.materializing.net/example


## やってみた内容

- 1.エレメントを1つ作ります。
	- app/webroot/theme/bc_sample/Elements/block_form.php
- 2.作成したエレメントをレイアウトファイルで読み込みます。
	- app/webroot/theme/bc_sample/Layouts/default.php
	- ```<?php $this->BcBaser->element('block_form') ?>```


```php:app/webroot/theme/bc_sample/Elements/block_form.php
<?php
/**
 * フォーム内容読込み・表示
 */
App::uses('MailHelper', 'Mail.View/Helper');
$this->Mail = new MailHelper(new View());
?>
<script>
$(function(){
	$(document).on('click touch', '.form-submit', function(e) {
		$(this).prop('disabled',true);
		e.preventDefault(); //フォームの既定動作をキャンセル

		$.ajax ({
			url: $(this).closest('form').attr('action'),
			type: 'POST',
			data: $(this).closest('form').serialize(),
			cache: false,
			timeout: 5000,
			beforeSend: function (xhr, settings) {
				$('.loadingHide').fadeIn(300);
			},
			complete: function(xhr, textStatus) {
				$('.loadingHide').fadeOut(300);
			}
		}).done(function(data, textStatus, jqXHR) {
			$('.QuestFormWrap').empty();
			$('.QuestFormWrap').html(data);

		}).fail(function(jqXHR, textStatus, errorThrown) {
			$('#ErrorResult').html('送信できませんでした。画面を再読み込みしてください。');
		});

		let scrollTargetPosition = $('.QuestFormWrap').offset().top;
		$('html,body').animate({
			scrollTop: scrollTargetPosition
		}, 1000);

		return false;
	});
});
//# sourceURL=block_form.js
</script>

<div class="loadingHide" style="display:none"></div>
<div class="QuestFormWrap">
	<?php echo $this->Mail->getForm(1); ?>
</div>

<style type="text/css">
.loadingHide {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  background: rgba(0,0,0,.5);
  background-image: url(/img/admin/ajax-loader.gif);
  background-repeat: no-repeat;
  background-attachment: fixed;
  background-position: center center;
  background-size: 50px 50px;
  z-index: 100;
}
</style>
```

たったのこれだけです。

## もともとできることに一工夫

もともとbaserCMSにはメールフォームをページ内に読み込み自由に表示できる機能があります。
※数字の1 は、メールフォームのメールコンテンツIDです

```
<?php
App::uses('MailHelper', 'Mail.View/Helper');
$this->Mail = new MailHelper(new View());
echo $this->Mail->getForm(1);
?>
```

表示はこれでじゅうぶんで、とても簡単にサイト内に表示できます。
せっかくなので、表示のみでなく入力チェック・送信完了までさせてみた、といったところです。
メールフォーム自体が、基本的には管理側で設定さえ行えば公開利用できるbaserCMSならではできるカスタマイズですね。

それでは御機嫌よう。
他の方々の記事もぜひ読んでみてくださいね。
https://qiita.com/advent-calendar/2022/basercms
自分が転職するときにやっていたこと

この記事は [エンジニア転職活動ハックをシェアしよう！ by キャリアデザインセンター「Direct type」 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/directtype)の18日目です。

この記事では転職活動をする際に準備しておいたほうがいいものやふるまいを自分の転職活動経験をもとに書き残しておきます。

# 自分の転職経験
転職4回。現在5社目です。

2回目までは転職エージェントを使って転職しました。
4社目に転職した直後にコロナ禍に入り、5社目への転職活動はリモートで行いました。

# 前提
自身の経験をもとに書くため、今回は既にエンジニアとして働いている人が他社に転職するのを前提とします。
また自分は転職サイトやエージェントを使った転職しかしていないのでいわゆるリファラルでの転職は除きます。

# 用意しておく書類
## 履歴書
どの会社に応募するときも履歴書はまず間違いなく必要になります。
履歴書の様式はおおよそ決まっているのでスプレッドシートなどにひな形を作っておき都度書き足しておくと毎回作成する手間も省けます。
たまに顔写真必須と指定されることがあるので一度撮ったものをスキャンして載せておくと毎回撮りに行く手間がなくてよいです。

スプレッドシートで作っているのは印刷で提出することがあったためです。
年齢や○日時点の部分は関数にしておき必要なときにpdf化して提出します。
最近は印刷して提出することもほとんどなくなりましたがわざわざ別のフォーマットで作り直すのも面倒なのでそのまま使っています。

## 職務経歴書
こちらも履歴書と同じくほとんどの場合で提出することになります。

職務経歴書は実際に会社で働いているときに携わったプロジェクトの単位で書くことが多いです。
同じ会社にいてもしている仕事は少しずつ変わっていくと思うので何かしらの区切りのタイミングで書いておくのがいいでしょう。
プロジェクトやリリースが終わったときにふりかえりながら書くのが個人的にはおすすめです。

しかし職務経歴書は何をどのくらい書けばいいのかは結構難しいです。
誰かに（できれば採用担当者に）見てもらえるといいですが同僚などには話しづらい内容なので難しいかもしれません。


[転職ドラフト](https://job-draft.jp/)ではドラフトに参加するしないに関わらず職務経歴書の添削をしてくれます（そしてチェックを通らないとドラフトに参加できない）のでこういうサービスを利用してみるのもいいと思います。
転職エージェントを使っているのであればエージェントに見てもらうという手があります。

## アウトプット
会社によっては上記書類以外にも選考のためのアピールとしてアウトプットを提出することがあります。

Qiitaやzenn、あるいは個人ブログの記事、Githubに作ったものを上げておくなどがあります。

これらは日々の活動の積み重ねなので転職活動するぞとなってから準備するのは難しいです。

転職サービスなどに上記のURLなどを登録しておくとそれを見た企業からカジュアル面談のお誘いが来ることもあります。
どの部分に惹かれてカジュアル面談に誘ってくれたのかなど聞けると自分の強みや考え方がわかって面接に役に立つと思います。

# 実際の転職活動で気をつけること
## 日程管理
新幹線などを使って移動して選考を受ける場合は同じ日にまとめるのがいいです。シンプルに交通費で死にます。
エージェントを使っているならその旨を伝えて日程調整してもらうのが楽です。
もっとも現在ではオンラインのみで完結することも多いのでそれほど気にすることもないかもしれません。

当然のことですが面接の日程・時間帯は被せないようにします。
エージェントを複数使うとエージェント同士でも被らないように調整する必要が出てくるので、エージェントが自分にあわないとわかるまでは<b>複数エージェントを使うのは避けたほうが無難</b>です。

## 面接
面接ではいい感じに会話が弾んでも落ちたり、逆に自分では失敗したと思っても通ったりします。
少なからず入社したいと思って選考受けてるわけなので落ちてしんどくないわけはないですが縁がなかったと思って割り切りましょう。

面接に限らずですがテクニック以上に場数が必要になると思っています。
転職エージェントを使っているなら面接練習が出来ないか相談してみるのも手だと思います。

それが出来ないならばある程度数を受けるしかありません。
そういう意味では<b>第一志望の会社は最初に受けないほうがいい</b>です。

短期間に複数企業面接をしていると結構同じような質問も多いということがわかってきます。
そういう質問に対してはある程度自分なりの模範解答を用意しておくと余裕を持って面接を受けられます。
オンラインの面接であれば面接しながら質問をメモしておきやすいです。
それをするために<b>自宅でもディスプレイは2枚以上あるといい</b>です。


## 自分側の選考基準を持っておく
最近ではTwitterや転職サービスなどを通じてスカウトメールを頂くこともあります。

しかし当然ながら全部に対して対応することもできないので自分が良さそうと思ったもののみ対応すると思いますが、そのときに何を満たしていたら対応するのかは決めておいたほうがいいです。
例えば自分の場合なら

- フルリモートOKならOK（地方在住なので）
- 使用技術にVueやNuxtしか書いてなかったらNG（Reactしかやったことがないので）

というような感じで分別していました。
スカウト以外でもエージェントや転職サービスが紹介してくれた会社を受ける受けないを判断する必要があるので自分なりの基準は持っておくべきです。

## 転職で何を手に入れたいのかを決めておく
今の慣れた会社を離れるということは、それを手放してでも手に入れたい何かがあるはずです。
現職の仕事がしんどいなら残業が少ないとかチームがよさそうな会社がいいとか、年収を上げたいとか、あるいは新しい技術を使った経験を積みたいとか。

チームについては内定が出た後にオンラインで顔合わせとかをお願いできたりすることもあります。

年収についてはエージェント経由の場合、内定が出た後にエージェントに頼めば交渉してもらえる場合があります。
転職ドラフトではそもそも金額ベースでオファーが来ます。


# 転職は大変
一口に転職活動と言っても用意するものや気にすることは結構あって大変です。
なのでなるべくツールやサービスを使って省力化しておくのが大切です。

コロナ禍に入ってリモートワークやオンライン面接が普及したことにより転職先の選択肢も格段に増えました。
転職は人生のいろいろなタイミングで発生しうるものです。
転職によって新しい生活や人生を手に入れるための一助になれば幸いです。
<svelte:window> <svelte:head> <svelte:body>について

# はじめに

SvelteKitにはいくつか特殊なHTML要素が用意されています。
今回はその中でも`<svelte:window>` `<svelte:head>` `<svelte:body>`に焦点をあてて解説したいと思います。

# `<svelte:window>`

`<button>`タグに`on:click`などのイベントリスナーを追加できるように、
`window`に対してもイベントリスナーを追加することができます。

例えば`keydown`リスナーを追加し、押したkeyを表示してみます。

```vue:+page.svelte

<script lang="ts">
  let key = '';
</script>

<svelte:window on:keydown={(event) => key = event.key}></svelte:window>

<h1>あなたが押したのは { key } ですね！</h1>
```

![window.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/92005a54-4587-5f7e-f651-30f213e529a4.gif)

# `<svelte:head>`

`<svelte:head>`を使うと、`<head>`内に要素を挿入することができます。

ページによってタイトルを変更してみます。

```vue:/hogehoge/+page.svelte
<svelte:head>
  <title>hogehoge</title>
</svelte:head>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/775d3c26-fb66-2b31-7f7a-9245218f5247.png)

```vue:/fugafuga/+page.svelte
<svelte:head>
  <title>fugafuga</title>
</svelte:head>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/c59c170c-a04f-4150-83f8-197507a99ff1.png)

ちゃんと変わりましたね！

# `<svelte:body>`

`<svelte:body>`も`<svelte:window>`と同じような使い方ができます。
`body`に対してイベントリスナーを設定したいときに便利です。

例えば、ダブルクリックをした時の処理を入れてみます。

```vue
<svelte:body on:dblclick={() => alert('ダブルクリックしましたね')}/>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/9ac6b41a-a5d8-850e-47c2-2502c9326a4b.png)

ちゃんと表示されました。

このように特殊なエレメントも用意されているんですね～
【GCP】予算アラートを作って節約しよう！

# あらすじ
前回、Google Cloudのアカウントを作成しました。アカウントを作ったら最初にやっておきたい設定として課金額の通知があります。クラウドは基本的に従量課金制なので、気づかないうちに想定外に出費がかさむのは避けたいですよね。

前回の記事はこちら↓
[【GCP】アカウントの作り方](https://qiita.com/0208tsu/items/900078a6a08d0337fd99)

公式ドキュメントを参考にさせて頂きました↓
[予算と予算アラートを作成、編集、削除する](https://cloud.google.com/billing/docs/how-to/budgets?hl=ja)

# この記事のゴール
予算アラートを設定して、想定外の出費を防ぐこと。

# 設定方法
それでは実際の設定をやっていこうと思います。

1. 予算を作成する

GCPにログインし、左上のメニューボタンよりメニューを開き、「お支払い」→「予算とアラート」の順に押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009702/1cf68fd4-9898-910f-f8c7-07f6c11d1d68.png)

予算とアラート画面で「予算を作成」を押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009702/1bfddd44-986e-3fca-fe71-9aa3a28e5338.png)

予算の作成画面が表示されるので、入力項目を埋めていきます。
今回は一月単位での支出の管理を想定していますので、その前提で作成します。

わかりやすい任意の名前をつけます。他の項目はデフォルトのままでOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009702/4c7c3e71-2ac6-20e9-63e5-a10e290c7ac0.png)
「次へ」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009702/de717653-cbc2-9235-fa85-84315bb38fa5.png)
一月の予算額を設定します。私は5千円にしておきます。設定したら「次へ」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009702/33592d21-c5e0-c0bd-d2ed-3a7746887ae7.png)
予算に対して、どの程度の金額に達したら、通知を行うかを設定します。デフォルトで「50%」、「90%」、「100%」が設定されています。必要に応じて変更してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009702/93744d3c-49d8-fdcb-192a-0aeff1e4c74a.png)
「通知の管理」について、今回はシンプルなメール通知を想定しているので、デフォルトのままでよいです。「終了」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009702/c14bd683-bc17-8cbc-9f8e-f0038e734222.png)
予算の設定が完了しました。これで特定の金額に達したときに通知が行われるので、メールを確認しておけば大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009702/932dc0c9-26bb-a88e-453e-26022abaf2a8.png)
# 終わりに
初めてクラウドを利用する方は従量課金を心配する方もいらっしゃるかもしれません。利用していてうっかり使いすぎてしまうことはありうる話なので、この設定を正しく行っておけばその心配からはある程度解放されるかなと思います。
# ※画像の引用について
手順を分かりやすく記載するために、以下より画面の画像を引用させて頂いています。
Google Cloud：https://cloud.google.com/
バックアップについて考える

（IT環境の整った会社向けの記事ではありません。初心者・個人向けの内容です）

### バックアップを取りましょう
　日々私たちはいろんなデータを使ったり作ったりしていますが、PCやスマホが壊れたりで不意にデータ消失した時途方に暮れることもあるでしょう:scream: 
　そんな方々を数人目にしたのでこの記事を書いてます！！そんな時のためにバックアップです！バックアップさえしていればとりあえず復旧可能です！皆さんバックアップを必ず取りましょう！！FC版ドラク●３の冒険の書１は２，３にもコピっておくのは当然です！

ということで今回の記事になりますが、いざ取るといってもどこにとればよいのか。初期設備やお財布事情からどのあたりが適正ラインか、そこを考える回です。

PCかスマホかで若干事情が変わりますがそこは追々。
また、ハードウェア故障についての対策として挙げていきます。
人為的なミスの消失はもう普通にファイル複製を考えましょう。

というわけでまずはバックアップ手段を列挙していきます。下図は家でインターネットプロバイダ契約をしていて回線がありルーターも持っている場合の図になります。（一部機器は省略）

![保存領域環境.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155688/762b1395-ce5c-02eb-3151-65291b5b645b.png)

`クラウドストレージサービス`
 iCloudやOne Drive、Google Driveなどのクラウドストレージに移します。初期5GB程度無料、それ以上だと有料、のようなサービスがほとんどです。増量はiCloudの場合2TBで¥1300/月です。ClipStudioのようなお絵描きソフトを販売しつつ同時にクラウド10GB利用サービスを行っているような場合もあります。ただ一つの懸念はキャリアやプロバイダの契約による通信制限次第でアップロード・ダウンロードに時間やコストがかかるに点は注意です。家にはスマホ以外に情報機器が無い！という場合はこのサービスに乗るのが一番手っ取り早いでしょう。以下に挙げるものと比べ、ハードウェアを構成管理する必要がなくアカウント作成と契約次第ですぐに使用できるのが最大メリットです。

`NAS (Network Attached Storage)` 
　社内/家内ネットワーク上にストレージ装置(NAS)を置き、そこに保存します。I/OデータやBuffaloなどホーム向けのNASは家電量販店等で購入できます。実体はHDDを内蔵したネットワークPCです。メリットはPCとスマホ等複数の端末で共有できる点です。家にルーターを置いているなら手軽に(2TB/1万円程度～)設置できます。HDDの故障はつきものなのでRAID1等で冗長化されたものであればより安心ですが当然価格は上がっていきます。

`micro SD カード／SDカード`
　32GB 1000円カゴ売り程度の安価で最も簡単に導入できますが、スマホ用途のmicroSDはそもそもで頻繁な差し替えを行う構造ではありません。また、取り外した状態では紛失や内容忘れで管理がちょっと難しいという問題もあり、、、256GB超の大容量となると4000円超級で必ずしも安くありません。PCで使う場合は別途USB接続のカードリーダーが必要になります。

`USBメモリ`
　64GB／1000円程度。SDカード同様にカゴ売り等で安価に購入でき、USBポートへのつけ外しも頻繁に行えるものです。パソコン利用者であれば最も簡単かつ安価かもしれませんが、これを何本も買うくらいならUSB-HDDにしておきましょう。そして買いすぎるとやはり中身が何だったか忘れる問題

`HDD`
2TB／7000円程度。自作PCなどで自分でPC内部に取り付けるものと、USB接続で取り付けるものがあり、複数円盤と読み取りヘッドの精密機械部品構造のため衝撃に対して弱いです。このためRAID-1などで冗長化を行うのが良策です。TB単位の大容量なので一度買えば何年か持つでしょう。バックアップ機器としては現在基準では最適です。

`SSD`
2TB/12000円程度。HDDに代わる軽量で高速読み取りが期待され衝撃にもHDDほど弱くはありませんが、書き込み回数上限があったりGB単価は上がります。故障した場合の復旧はHDDより絶望度が高いです。自作PCの場合、システム領域をSSD、ユーザー領域をHDDなどで構築することが多いです。最近ではM.2などの高速SSDが登場していますが、バックアップ用途としては「勿体ない」のと、HDDよりは消失リスクが高いので止めておきましょう。

`おまけ　CD,DVD,BDに焼く`
古来よりメディアに焼くというのは「タンスの肥やし」の退避に有効でありました。しかし書き込み可能ドライブ持ってても結局私は面倒でHDDが小さかった時代に数える枚数程度しかやってません。焼いたあとの物理的な物品管理場所ラベリングや今となってはショボい記憶容量と長いロード時間。HDDに比べると問題だらけですね。


### 速度について
データを開くとき、必ずPCやスマホ内のメモリに展開することになりますが、クラウドやNASにあればその分回線速度の影響で開き終わり編集可能になるまでの時間が差が出ますので時間が気になる場合は保存領域から作業領域までの通信速度を確認しましょう。

速度的には、内蔵ディスク＞USB3.0接続＞LAN接続＞クラウド　な感じで遠くなるほど遅くなりますが通信規格は常時進化しているので最新を取り入れつつボトルネックはなくしていきたいですね。


### まとめ
以上になります。
どれも一長一短あり、これが絶対良いというものはありません。
価格についても短期では一見安くても数年使えば逆転します。
また、価格と容量の相場は変化するので適宜確認しましょう。結局壊れないものはありませんので自宅崩壊などが起きる想定であればクラウド＋複数データセンターまたぎ＋海外DCといったレベルになりますがそれは（略
用途と自身の環境とお財布事情と合わせて適切なバックアップ運用をしていきたいですね！！！

# 　バックアップを取りましょう！！



…あれ？家のNASの調子が変だ・・・(´・ω・`)
JavaScriptと比較したTypeScriptの使い方

この記事は、【 可茂IT塾 Advent Calendar 2022 】の21日目の記事です。

<h1>はじめに</h1>
Next.jsを学習しているうちにTypeScriptはJavaScriptと何が違うのか気になったので、調べてみました。<br>
JavaScriptとの違いを踏まえながらTypeScriptの使い方について書いていきます。

<h1>JavaScriptとTypeScriptの違い</h1>
JavaScriptが動的型付けなのに対して、TypeScriptは静的型付けです。<br>
動的型付けとは、コードに型を宣言しなくても自動的に型推論を行ってくれるものです。<br>
静的型付けとは、コードに型を宣言する必要があり、型が無いとエラーになります。

例えばJavaScriptでは文字を定義したいとき、以下のように書きます。
```
let sample="サンプル";
```
TypeScriptの例を以下に示します。
```
let sample:string="サンプル";
```

<h1>TypeScriptの型</h1>
ここでは、いくつかの型を代表して紹介します。
<h2>string</h2>
文字列の型です。<br><br>
上と同じ例を載せます。

```:JavaScript
let sample="サンプル";
```

```:TypeScript
let sample:string="サンプル";
```



<h2>number</h2>
数値の型です。

```:JavaScript
let num=123;
```

```:TypeScript
let num:number=123;
```


<h2>boolean</h2>
trueかfalseをもつ型です。

```:JavaScript
let isDone=true;
```

```:TypeScript
let isDone:boolean=true;
```

<h2>Array</h2>
配列の型です。

```:JavaScript
let fruits=["apple","banana","orange"];
```

```:TypeScript
let fruits:string[]=["apple","banana","orange"];
```

<h2>Object</h2>
オブジェクトの型です。

```:JavaScript
let myDog={
    name:"leo",
    age:10,
    weight:5
}
```

```:TypeScript
interface dogData={
    name:string,
    age:number,
    weight:number
}

let myDog:dogData={
name:"leo",
age:10,
weight:5
}
```

TypeScriptの場合はオブジェクトの型を作るためにインターフェースが必要になります。<br>
また、要素があるか分からない場合などはインターフェースを以下の様に書くことでエラーが起こらなくなります。<br>
ageを例にとります。

```:TypeScript
interface dogData={
    name:string,
    age?:number,
    weight:number
}
```

また、ageは存在するがnullかもしれない場合には次のように書きます。

```:TypeScript
interface dogData={
    name:string,
    age:number|null,
    weight:number
}
```

<h1>関数の定義</h1>

```:JavaScript
function func(a,b){
return a+b;
}
```

```:TypeScript
function func(a:number,b:number):number{
return a+b;
}
```
number型a,bを引数にとってnumber型を返り値(a+b)にしています。
リーダブルコードを読んで過去書いたコードを振り返る(表面上の改善編)


本記事は、[ハンズラボ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/handslab) 18日目の記事です。

# はじめに
断捨離していたら新卒の時に購入した[リーダブルコード](https://amzn.asia/d/0Oz7MMh)を見つけたので読んでみました。
本記事では、リーダブルコード第1部「表面上の改善」の内容を自分の解釈を踏まえて、過去に書いたコードや読んだコードを振り返ります。
# 本題
## 理解しやすいコード
以下は、三項演算子を入れ子で使っているパターンです。
ワンライナーで書かれていてとてもトリッキーなことをしているように見えます。
このコードを最初見た時、意味がわかりませんでした。

```js
this.isDirty ? this.validFunc ? this.validFunc(this.modelValue) : this.errMessage ? false : true : null;
```
三項演算子はかっこいいし便利ですが以下の書き方の方が読みやすいと思います。
行数は多いですが内容は同じです。

```js
if (this.isDirty) {
	if (this,validFunc) {
		this.validFunc(this.modelValue);
	} else {
		this.errMessage ? false : true;
} else {
	null;
}
```

コードは短くした方がいいが「理解するまでにかかる時間」を短くてするほうが大切だということです。
- コードは他人が最短時間で理解できるように書かなければいけない。
- 常に俯瞰して「このコードは理解しやすいだろうか？」と自問自答すると良い。

## 汎用的な名前は避ける
以下コードは汎用的な名前の変数`tmp`を使ったものです。
複数のエラーメッセージを整形して表示するために、要素のおしりに`\n`をつけて「一時的な保管場所」的な意味で`tmp`変数に追加しています。
当時はこの変数はいい名前思い浮かばないし生存期間は短いため`tmp`でいいだろうと考えていたと思います。
この考えは怠慢です。

```py
err_msg_list = [...]

tmp = ''
for err_msg in err_msg_list:
    tmp += err_msg + '\n'

title = 'エラー'
message = f'以下内容のエラーが発生しています。  ` ` ` {tmp} ` ` ` '
    
# Slack 投稿
post_slack(title, message)
```

`tmp`からは何も情報を得ることができないため、他人がコードを見た時の理解やバグの発見などに役立ちません。
変数名や関数名には汎用的な名前をつけるのではなく、対象物の値や目的を現した名前を選ぶべきです。
汎用的な名前(tmp、it、retvalなど)でも問題ない場合もありますが、避けるべきだということです。
今変数名を付け直すとしたら`display_err_msg`とかかな...？

## コメントはコードの意図を書く
以下は受け取ったイテレータブルオブジェクトの最後の一つの要素の時にTrue、それ以外の時にFalseを返す関数です。
このコードはプログラムの動作をそのまま書いているだけで、この関数は何をするためのものなのかわかりません。

```py
def last_one(iterable):
    # イテレータを取得して最初の値を取得する
    it = iter(iterable)
    last = next(it)
    # 2番目の値から開始して反復子を使い果たすまで実行
    for val in it:
        # 一つ前の値を返す
        yield last, False
    # 最後の一つ
    yield last, True
```

一行ずつプログラムの動作を説明するのではなく、関数の機能を説明します。
イテレータの要素を頭から見ていって最後の要素の時に+αの処理をしたいときに使用する関数であることをコメントで残したいです。
コメントはプログラムの動作の詳細を書くより、プログラムの動作を高レベルから説明すると、他人から見た時の理解やバグ発見に役立ちます。
例が悪いのでコードの続きを書きます。

```pyrex
...

# 指定された番号のオーダーを削除する
sql = '''
    DELETE FROM
        order
    WHERE
        no IN (
'''

list = [1, 2, 3]
args = ()
# SQL文のIN句を組み立てるために最後の要素は括弧閉じ
for item, is_last in last_one(list):
    if is_last:
        sql += "%s)"
    else:
        sql += "%s, "
    args = args + (item,)

dao.delete(sql, args)
```


# おわりに
自分が書いてきたコードを一部振り返ってみて、表面的なことだけでもまだまだ改善できると思いました。
今後は他人が理解しやすいコードを意識してコーディングしていこうと思います。
あと第2部以降もそのうち書きたいと思ってます。
イーサリアム 2.0：ロードマップ概観

イーサリアムは 2015 年から稼働してから既に 7 年間以上稼働しています。
全体的な完成度は、vitalik は 2022年9月15日実施された The Merge の後、ようやく 55% になっていると発言しています。
改めて、イーサリアム 2.0 のロードマップを確認してみたいです。

![](https://pbs.twimg.com/media/FgwVhUjaAAEx_Bb?format=jpg&name=large)

引用元：https://twitter.com/VitalikButerin/status/1588669782471368704?s=20&t=ZtLG5cL_rLK0aUSAe1ypTA

イーサリアムのロードマップは方向性を示しているものであり、確定のものではなく今後も細かく調整されると思われます。

## 各ステージの内容
ロードマップの見方ですが、左側が過去で右側が未来であり、横軸が時系列になっています。

### The Surge
メインは、レイヤー 2 に対する最適化（[EIP 4844](https://www.eip4844.com/)）と、シャーディング。
シャーディングが実装されると、現状の設計は 64 シャードチェーンの予定なので、簡単に計算すると TPS が 64 倍になると期待できますね。

https://twitter.com/lambda_xy_x/status/1505344958513184770?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1505344958513184770%7Ctwgr%5E48d24ae2a661ab478f089b890bbabc9195af47f2%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fcoinpost.jp%2F%3Fp%3D332025

### The Scourge
今回 vitalik の発言で追加されたステージ。

> 信頼性が高く公正で中立的なトランザクションの包含を確保し、MEV の問題を解決する

PoS に移行したことで、より高度な中央集権になり、検閲耐性の懸念は現時点ではスケーリングより重要」の声もあるので、新たに追加した内容です。
詳細は明らかになっていないですが、ブロック提案者にブロック内容の一部のみ決定する提案や、Succinct Non-Interactive Argument of Knowledge（SNARK）技術の統合などが予定されています。

### The Verge
メインは、Verkle Tree の実装です。
マークルツリー（Merkle tree）のバージョンアップ版である Verkle Tree は、ブロックデータ構造をチューニングすることで、バリデーターが検証処理に必要なデータ量を大幅減らして、実行するサーバースペックがもっと低くても稼働できるようになります。
より多くのノードがバリデーターになることができる為、イーサリアムの分権化をアップできます。

![](https://vitalik.ca/images/verkle-files/verkle.png)
引用元：https://vitalik.ca/general/2021/06/18/verkle.html

### The Purge
同じくデータチューニング内容ですが、メインは、[EIP-4444](https://eips.ethereum.org/EIPS/eip-4444) 提案（一年以上のデータを保持しない）など、既存のブロック・ステートデータをチューニングする内容になります。
ただしそうなると過去のデータまで遡ることができなくなるため、可用性・データ完全性のリスクがあるとの指摘もあるので、過去データを保持するノードのインセンティブなどを検討中です。

### The Splurge
上記以外の重要なアップデート内容です。

- [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) 
- [ERC-4337](https://eips.ethereum.org/EIPS/eip-4337)

など、最後の仕上げの内容になります。

## まとめ
これらのステージの内容が全部実装できると、イーサリアムが本当に「ワールドコンピュータ」になりそうですね。
Webゲームのレンダリングについて情報収集

TypeScriptでゲーム開発

Canvas API:　JavaScript と HTML の <canvas> 要素によってグラフィックを描く
https://developer.mozilla.org/ja/docs/Web/API/Canvas_API

↓　キャンバスベースのプロジェクトの作成をより速くより手軽にできるようにするライブラリ

https://proengineer.internous.co.jp/content/columnfeature/21027#2

・Kiwi.js
・Phaser 3（Kiwi.jsの軽量版）
・Babylon.js
・PixiJS


## ゲーム開発ライブラリPhaser

2Dゲーム開発の場面で人気のライブラリ

公式サイトURL
https://phaser.io/phaser3



https://github.com/khkmgch/phaser-practice
画像からアニメーションを作成してJetpackComposeで表示させてみる

任意の画像にアニメーションをつけてアプリ上で動かしてみたいな〜って思ったことが皆さんも一度はあると思います。（ローディング画面とか）

この記事では画像を選ぶところから実際にAndroid上で表示させるところまでをまとめたものになります。

## 画像選択
今回は、シンプルで豊富なフリーイラスト素材サイトである「[unDraw](https://undraw.co)」を使って素材を探していきます。

https://undraw.co/illustration

ダウンロード形式は`.svg`を指定しましょう。

## アニメーションをつける
「[Haiku](https://www.haikuanimator.com/)」を使ってアニメーションを作成していきます。
このソフトは2021年にオープンソース化されているみたいです。

保存した`.svg`ファイルをインポートして位置や大きさなどを調整します。
しかし、画像を追加してマウスで位置を調整するとどうしても縦と横の倍率が変わってしまいます。
![スクリーンショット 2022-12-17 18.46.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479939/3dffbe72-4f7a-5012-9017-c5ca4c7908ec.png)

そんな時には上の`CODE`タブから`Command + f`で「scale」という文字を検索しましょう。
検索すると`"scale.y"`と`"scale.x"`の値が異なっていることが分かります。これを同じ値にしてしまいましょう。
![スクリーンショット 2022-12-17 18.48.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479939/85e101f1-752a-c90d-00fe-8aa60f99d76a.png)

画像の調整が終わったら画像を右クリックして`Ungroup`を選択します。そうすることでsvgファイルの要素がバラバラになります。

バラバラになったら要素を選択して、時間軸に応じた座標とか回転軸とかを指定してあげます。
![画面収録_2022-12-17_18_55_04_AdobeExpress.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479939/ad04e20b-ac5c-5b98-9a62-3fe371e05391.gif)

アニメーションをつける作業が全て終わったら、`Project`→`Export`→`Lottie`を選択して書き出しましょう。そうすると`.json`形式で保存されるはずです。

https://lottiefiles.com/

## Androidで表示させる

以下のように`Lottie`の依存関係を追加します。バージョンは更新されていると思うので、適宜[こちら](https://github.com/airbnb/lottie-android/releases)を参照してください。
```app/build.gradle
dependencies {
    implementation "com.airbnb.android:lottie-compose:5.2.0"
}
```

AndroidViewで表示させる方法もあるのですが、今回は手軽にJetpackComposeを用いて表示させたいと思います。

https://developer.android.com/jetpack/compose?hl=ja

まず、下準備として先ほど作った`.json`ファイルをリソースファイルの`raw`に保存します。その際、スネークケースなどでファイル名を編集してください。大文字始まりとかだとエラーが発生します。（ダメな例：ComposeMusic.json、いい例：compose_music.json）
※ `raw`がリソースファイルに表示されていない場合は`res`を右クリック`New`→`Android Resource Directory`から`Resource type`を`raw`に設定してフォルダを作成してください。

いよいよ実装に入ります。`raw`フォルダに保存したファイルを呼び出す時には`R.raw.compose_music`（`compose_music.json`の場合）のように指定することができます。今回はアニメーションを永続的に動かしていたいので、`iterations`のプロパティには`LottieConstants.IterateForever`を指定しています。


```MainActivity.kt
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            LottieApplicationTheme {
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colors.background
                ) {
                    Loader()
                }
            }
        }
    }
}

@Composable
fun Loader() {
    val composition by rememberLottieComposition(
        spec = LottieCompositionSpec.RawRes(R.raw.compose_music)
    )
    LottieAnimation(
        composition = composition,
        iterations = LottieConstants.IterateForever,
    )
}
```

## 表示結果

![screen-20221217-200215_2_AdobeExpress.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479939/f1f73f82-9f54-902c-f1da-3dac3fb341ca.gif)

https://github.com/momomomo111/LottieComposeApplication
Notion があなたの情報整理に大きく貢献する

# はじめに
所属しているプロジェクトで管理ツールを Notion に切り替えました。


最初は慣れ親しんでいた管理ルールからの切り替えに苦言を呈していたものの、いざ触ってみると Notion の体系的な操作性に感動しました。

今ではプロジェクトだけでなく個人用アカウントを作成し、ドキュメントやタスク管理ツールとしても大活躍しています。


そんな Notion の良さを少しでも紹介していきたいと思います。


##  Notion とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/788536/17f5ba56-fd07-231c-b63d-c3f5fa80a809.png)

Notion はドキュメント作成や、タスク管理、データベースなどのさまざまな業務に対応する「多機能クラウドサービス」です。

利用者数としても、急成長を遂げており、全世界でのユーザー数は 2000 万人。
日本での展開としては、2021 年 10 月に日本語版Notionのベータ版をリリース。
コミュニティーには 3000 人以上が参加しています。

Notion を利用している企業として 「CyberAgent」 や 「SUNTORY」、「トヨタ自動車」 などの IT業界とは異なる業界でも導入され始めており、多業界からも注目されているサービスとです。


##  利用料金について
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/788536/1d20e02e-2fad-cc76-705f-d53196ff56a1.png)

Notion は大きく分けて 4 つの料金プランが存在しています。
2022年12月に入って、有料プランのみでしか使用できなかった一部機能が、無料プランでも利用できるようになりました。

拡張された機能としては
・ワークスペースにより多くのゲストを追加できることで共同して作業を進められる。
・7日間のバージョン履歴を使ってコンテンツの前のバージョンの復元が可能。

無料プランで利用しているユーザーとしては、Notion からのささやかなクリスマスプレゼントかもしれないですね笑

##  Notionをはじめてみる

リンク：https://www.notion.so/ja-jp


「Notionを無料で使ってみる」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/788536/51b08a2c-487a-889c-9fff-47ae6e64ee17.png)


サインアップでは、 Google アカウントや Apple アカウントを利用することができます。
各サービスを利用するうえで面倒なユーザー登録等がないのが嬉しいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/788536/4ef88dec-3860-3ab4-0c61-5995d0c082f2.png)


##  Notionを使ってみる
Notion に慣れていない人はまずは「テンプレート」を選択するところから始めてみましょう。
仕事として利用する場合には、「Todoリスト」や「進捗管理」などがオススメです。
自己研鑽のアウトプットとして利用する場合には、「読書リスト」なども使ってみても良いと思います。

Todoリスト　テンプレートページ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/788536/8d4221a2-1a7c-1e80-98b7-baad9fbd8fd5.png)

プロジェクト＆タスク　テンプレートページ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/788536/b75e2142-2ae0-6a8a-ec41-2b0a6f515ade.png)

読書リスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/788536/e9de9035-eca2-65ba-b9c5-2cca3a31a933.png)

## 外部サービスとの連携が豊富

Notionでは外部サービスとの連携豊富かつ、連携が容易です。
Github や Slack , Zoom　, 進捗管理アプリである Jira などもサポートしてます。
詳しくは、[こちら](https://www.notion.so/ja-jp/help/link-previews-and-synced-databases)も参照してみてください。



##  実際にどのように利用しているのか
自己研鑽のアウトプット資料として本を読んで学習して得た気づきや、追加で調べた Web ページリンクを添付しておくことで復習が容易になるような工夫をしています。

Notionでは、同ページを複数人で編集することが可能です。
旅行プランをみんなで計画する場合に、利用してみてはいかがでしょうか。

学習アウトプットページ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/788536/eb2fd765-b7a1-8063-8061-b4fc8a3d5c4b.png)

旅行計画
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/788536/6f14d5e6-1dc2-ddce-f100-2d05818de18d.png)
ヒーローズリーグ2022 授賞式 toio関連作品リスト

  [一般社団法人MA](https://we-are-ma.jp/)さん運営の「つくる」系コンテストイベント(という理解であってると思う)「[ヒーローズリーグ](https://heroes-league.net/)」2022の授賞式が本日(2022/12/17)行われました。
　オンライン開催で行われYouTubeのアーカイブ動画としてみることができます。

https://youtu.be/u0iyjV0yVfA

以下ではその中からtoioを使った作品の受賞の様子をまとめました。(単にYouTube動画の再生位置を拾っただけとも言う。ゆるい記事ですいません。)

# toioで新体験賞ほか3冠ゲットのすごいやつ
## ToPiCo

https://protopedia.net/prototype/3468

[授賞式再生位置 4時間38分め](https://youtu.be/u0iyjV0yVfA?t=16683)


# 特別賞
## M5ATOMとtoioで移動式連射砲を作ってみました

https://protopedia.net/prototype/3476

[授賞式再生位置 36分め](https://youtu.be/u0iyjV0yVfA?t=2158)

# M5Stackとtoioの楽しい組み合わせで賞

## カオナシATOM_toio

https://protopedia.net/prototype/3282

[授賞式再生位置 39分め](https://youtu.be/u0iyjV0yVfA?t=2341)

## スティックCチャン feat. toio core cube

https://protopedia.net/prototype/3238

[授賞式再生位置 4時間47分52秒め](https://youtu.be/u0iyjV0yVfA?t=17272)

# 終わりに
　自分が受賞したのでちょっとうれしくて記事にしてみました。
　[M5StickCクッション](https://www.switch-science.com/products/7175)に顔画面を貼り付けて巨大スティックCチャンを作って一緒に写ろうと思ったのですが、ZOOMの背景切り抜きのセグメンテーション機能だと人体の形をしてないものは抜けてしまうのでうまく映らず、結局別途撮影して背景画像として合成する形にしました。
使った背景画像
![PXL_20221217_035739781_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431649/19aea23a-3f82-50d3-8708-39d8148b4678.jpeg)

　あと、本物のスティックCチャンを動かしていたのですが、画面が小さくてよく見えなかったと思います。
こんな感じにスマホ固定アームの上に載せて、体の前に配置
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431649/31dacede-dfc6-5115-ca29-00db4dfd615f.jpeg" width=50% />
なんとか受賞インタビューの時まで動き続けましたが、20分ぐらいでM5Stick-C plusのバッテリーが尽きてしまいました。長時間の展示をする場合はバッテリー交換式にするとかなんか対策しないとダメだなこれ。
時々、スマホ固定アームから落下という事故もありました(^^;

　授賞式ですが、たくさんのtoio作品を投稿されていて個人的にファンだった謎の人物「淳【Jun】」さんのお話が聞けたのが俺得でした。

https://www.youtube.com/@GEH00073
ホスティングとCI/CD

RecursionCSのチーム開発で、今まで見慣れないWord
「hosting」
「Render」
「Netlify」
「CI/CD」
を見つけました。
それぞれリサーチして学んだことをまとめたいと思います。

## hostingとはWebサーバーの間借り
これは要するに、レンタルサーバーのことです。
エックスサーバーや、ロリポップなどがこれに当たるようですね。
つまり、RenderやNetlifyもこれらと同様に、レンタルサーバーに近いということだと思います。
### Render
PaaSであり、静的サイトからWebアプリまでデプロイが可能です。
一般的なホームページ用のレンタルサーバーよりも、機能性・汎用性が高いものだという理解で良いと思います。
確かにエックスサーバーではWordPress運用や静的サイトをFTPソフトでアップロードして表示するくらいしか、したことないですね。
Webアプリをデプロイしようと思ったら、それだと足りないし不便です。

> [【参考】【格安本番運用が可能に】Render.com のメリット・デメリットを Heroku と比較してみた](https://zenn.dev/mc_chinju/articles/compare_render_and_heroku)

### Netlify
こちらもRenderと同じような機能を持つ、ホスティングサービスです。
サービス内容と料金の違いだけだと思います。
おそらくサービス規模や必要な機能に応じて使い分けるのではないかと。

### hostingの対称はcloud
hostingに対して、AWSやAzureはクラウドサーバーと言いますね。
こちらはインフラの構築が必要なため、自由度が高い設計ができるのが強み。
ただ課題でそれを使うか？というと、要らないと思います。
多くのアクセスを捌くとか、より大規模なシステムを組むとか。
そもそも学習コストが足りn（ry

## CI/CDとはビルドからデプロイ、テストなどを自動で行う仕組みのこと
アジャイル開発を効率的に行うために、コードを書いた後にテストから実装まで自動的に行う仕組みです。
「サービスをデプロイしたは良いけど、バグが見つかってサービス停止」
なんてことになったら水の泡です。
特にアジャイル開発の場合は開発サイクルが早いため、テストはもちろん、デプロイまでの操作を自動化できるのは効率上がりますね。

## 結論：Netlifyを使いたい
Netlifyなら無料で使える上にCI/CDにも対応しています。
より小規模向けのサービスに適しているんだと思います。
資料もすぐ見つかったので、こちらでのデプロイが良さそうです。

> [【参考】Netlify へ CLI デプロイで、CI/CD する](https://riotz.works/articles/lulzneko/2019/09/23/deploy-to-netlify-via-cli-for-cicd/)
> [静的ウェブサイトホスティング「Netlify（ネトリファイ）」登録/サイトを作成](https://laboratory.kazuuu.net/registered-for-the-static-website-hosting-service-netlify/#toc3)
Laravel9 +vite  で Vue を導入する ( create project からの手順 )

ネットで調べた方法だと惜しいところまで行って動かなかったのでメモ

動作済みのコードを置いたレポジトリはこちら
https://github.com/YumaInaura/lavavel9-vue-example

# Create project

プロジェクトを作成する

```
composer create-project --prefer-dist laravel/laravel:^9.0 laravel9-vue-axample
cd laravel9-vue-axample
```

# npm install

```
npm install
npm install vue@next vue-loader@next
npm i @vitejs/plugin-vue --save-dev
```

# Edit vite.config.js

plugin に vue を追加する

```
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
import vue from '@vitejs/plugin-vue'

export default defineConfig({
    plugins: [
        vue(),
        laravel({
            input: ['resources/css/app.css', 'resources/js/app.js'],
            refresh: true,
        }),
    ],
});
```

# Edit resouces/js/app.js

vue を読み込む

```
import './bootstrap';
import '../css/app.css';
import {createApp} from 'vue'
import App from './App.vue'
createApp(App).mount("#app")
```

# Create resources/js/App.vue

Vueファイルを作る
ここでは動作確認用にカウンタ処理を書いておく

```vue
<template>
  <div class="page">
    <p>{{ counter }}</p>
    <button @click="counter += 1">
      click!
    </button>
  </div>
 </template>

 <script>
 export default {
  data () {
    return {
      counter: 0,
    }
  },
 }
 </script>
```

# Edit resources/views/welcome.blade.php

ウェルカムページをVue用に編集する

```html
<!DOCTYPE html>
  <html>
    <head>
      <meta charset="utf-8">
       <title>Hello</title>
      @vite('resources/css/app.css')
    </head>
    <body>
      <div id="app"></div>
      @vite('resources/js/app.js')
    </body>
</html>
```

# Serve

コンソールので別タブでそれぞれ vite / laravel を起動する

```
npm run dev
```

```
php artisan serve
```


# Access on browser

http://127.0.0.1:8000/ にアクセスする

画面例

![image](https://user-images.githubusercontent.com/13635059/208239336-0b376060-8e5b-4eb2-aff8-3e04295c0b04.png)



# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura