OmniAICreator/Qiita-1.07M huggingface dataset:
manifest.jsonとは何者だ...?

# はじめに
Reactを使ってTODOアプリの開発を行っていたところ、コンソールにとあるエラーがずっと出ていました。

それがこちら
```console:コンソール
Manifest: Line: 8, column: 7, Syntax error.
```

# 問題
エラーコードを基に調べていくと、manifest.jsonが悪さをしていることがわかりました。
実はというと悪さをしていたのは僕なのですが…

# manifest.jsonって何??
> Webアプリケーションやブラウザ拡張機能の開発に使用されるJSONファイルです。このファイルは、アプリケーションまたは拡張機能の基本情報や設定、アイコンなどのリソースの場所を定義します。
>引用元
>https://zenn.dev/hirouen/articles/3730805e2da990

ふむふむ

# 僕のやらかし
僕は *npx create-react-app* というコマンドを用いてローカル環境にreactアプリを作ったのですが、邪魔なファイルを消そうとしてmanifest.jsonのファイルを消してしまっていました。
# 解決方法
manifest.jsonを復元する。
リポジトリをしっかり作っていてよかった(汗

ついでに、manifest.jsonがデフォルトのままだとiconの設定にデフォルトで入っている画像が使われているので違うエラーが吐かれると思います。
iconsの配列のところ丸々消しときましょう。
```jsonc
{
  "short_name": "React App",
  "name": "Create React App Sample",
  
  //ここから
  "icons": [
    {
      "src": "favicon.ico",
      "sizes": "64x64 32x32 24x24 16x16",
      "type": "image/x-icon"
    },
    {
      "src": "logo192.png",
      "type": "image/png",
      "sizes": "192x192"
    },
    {
      "src": "logo512.png",
      "type": "image/png",
      "sizes": "512x512"
    }
  ],
  //ここまで消そう
  
  "start_url": ".",
  "display": "standalone",
  "theme_color": "#000000",
  "background_color": "#ffffff"
}
```

# おわりに
アプリ自体は正常に動いていたので問題なかったのですが、ちゃんと解決することが出来てよかったです。

**エラーは学びを与えてくれるもの!!**

みなさんも一緒に頑張りましょう~~

# 参考
https://zenn.dev/hirouen/articles/3730805e2da990
商品が購入された時の条件分岐

# はじめに
今日の学習で学んだことを掲載していきます。
初心者ですので温かく見守ってください、、、、
# 商品が購入された場合の条件分岐
今回は商品が購入された場合にはSold Out!!の文字が出るように実装しました。
#### 商品一覧画面
```html
<% if item.order %>
  <div class='sold-out'>
    <span>Sold Out!!</span>
  </div>
<% end %>
```
itemという商品が保存されているテーブルとorderという商品が購入されたことが保存されるテーブルの二つが存在し、これらはアソシエーションが組まれています。
ですので、orderテーブル内にitemがあった場合に文字が反映されるような条件分岐は上記のようになります。

#### 商品詳細画面
詳細画面における「購入ボタン」「削除ボタン」「編集ボタン」の表示の条件分岐にも同じように記載します。
```html
<% unless @item.order %> 
      <% if user_signed_in? %>
        <% if current_user == @item.user %>
          <%= link_to "商品の編集", edit_item_path(@item), method: :get, class: "item-red-btn" %>
          <p class="or-text">or</p>
          <%= link_to "削除", item_path(@item.id), data: {turbo_method: :delete}, class:"item-destroy" %>
        <% else %>
          <%= link_to "購入画面に進む", item_orders_path(@item.id), data: { turbo: false }, class:"item-red-btn"%>
        <% end %>
      <% end %>
    <% end %> 
```
上記の解説としては、
#### 商品が購入されているかどうか
##### ユーザーがログインしているかどうか
・ログインしているユーザーと出品者が同じ場合、編集ボタンと削除ボタンを表示する
・そうでない場合は購入ボタンを表示する
の条件分岐です。

の順番で記述しています。

今回は以上です。
シェルスクリプトでループの引数を2つの文字列として処理したい

ループの引数を2つの文字列として処理したい場合、ループを使用してそれぞれの文字列に対して処理を行い、その結果を配列に格納する方法を紹介します。ここでは、2つの異なる文字列をループの各イテレーションで処理し、結果を初期値が設定された配列に格納する例を示します。

```bash
#!/bin/bash

# 初期値が設定された長さ2の配列を定義
results=(0 0)

# ループで処理する2つの文字列
string1="Hello"
string2="World"

# 文字列の配列を定義
strings=("$string1" "$string2")

# ループ処理
for i in "${!strings[@]}"; do
  # 文字列の長さを計算し、配列に格納
  # 実際にはここで任意の処理を行い、その結果を配列に格納する
  results[$i]=${#strings[$i]}
done

# 配列の内容を表示
echo "Results: ${results[@]}"
```

このスクリプトでは、`strings` 配列に2つの文字列 `"Hello"` と `"World"` を格納しています。ループ内で、これらの文字列の長さを計算し（`${#strings[$i]}` を使用して）、その結果を `results` 配列の対応する位置に格納しています。この例では、`"Hello"` と `"World"` の文字列の長さがそれぞれ配列に格納されます。

ループの引数として2つの文字列を扱いたい場合にこの方法が有効です。ループ内で任意の処理を行い、その結果を配列に保存することで、処理結果を効率的に管理できます。
クラスとは？

Javaでは、クラスを定義しそこからオブジェクトを生成する事が出来ます。

手間が増えるだけのようにも見えますが、クラスを用いると同じ定義の別の関数や変数を使用する際に、複製や一部を利用する事が出来るので便利です。
生徒会のデジタル化を目指す組織を建てた話

はじめまして、**TRANs**です。
Kombumoriとして投稿するのもこれが初めてです。
Zenn Publicationに続き、Organizationに申請したら驚異的なスピードで承認されたので記事を投稿 ~~（転載）~~ させていただきます！

# TRANsって？
![](https://storage.googleapis.com/zenn-user-upload/31091b2fba6b-20230728.jpeg)
TRANs、日本語名**生徒会情報機構**は、その名の通り生徒会における情報技術応用の促進を目指して23年1月に設立された組織です。24年2月現在9校の生徒会役員などが加盟しています。その他にも多数の学校の生徒会役員や学生開発者などがTRANsの活動に参加しています。
## 目的は？
先ほど掲げた「**生徒会における情報技術応用の促進**」を目的とし
- 情報共有や知見、技術の交流
- 生徒会で利活用するシステムの統合
- 地域間の情報格差の解決
- 不具合の素早い共有と解決

など、幅広い課題の解決を目指しています。
## 何をするの？
TRANsのDiscordサーバーにおいて活動などの情報を交流するとともに、各校の生徒会の要望に合わせたサービスの開発や、TRANsに参加していない生徒会でも簡単に導入できるシステムの開発などを行う予定です。
また、Zenn、note、Qiitaなどのソーシャルサービスを通して、活動を共有したり、GIGAスクール政策で導入しているサービスの不具合・障害情報などをお知らせしたりすることも計画しています。

# 参加したい！という方へ
こちらのリンクからDiscordサーバーに参加できます。現生徒会役員だけじゃなく、生徒会に興味のある方、OBも大歓迎！もちろんデベロッパーも募集中！
https://discord.gg/jnZevNmYRg
**「案内板」をよく読んでね！**
KotlinのExposedで2つのkeyの組み合わせで削除をしたい

kotlinのExposedというO/Rマッパーを使っているのですが、
2つのkeyの組み合わせで削除したいニーズがでてきました。

例えばこのようなテーブルの場合
```kotlin
object HogeTable : Table("hoge") {
    val foo = varchar("foo", length = 99)
    val bar = varchar("bar", length = 99)
}
```

以下のように書けば実現できそうです。

```kotlin
fun deleteByColAColB(hoges: List<HogeModel>): Int {
    return HogeTable.deleteWhere {
        hoges.map { hoge ->
            Op.build { (foo eq hoge.foo) and (bar eq hoge.bar) }
        }.reduce { a, b -> a or b }
    }
}
```

もう少しエレガントな書き方ができればコメントで教えていただきたいです :bow:
[初心者向け] [Mac] VScodeのエディタとターミナルを行き来するショートカットを設定する

# はじめに

マウスを使った、VScodeでのエディタとターミナルの行き来が面倒になってきたので、ショートカットを作成しました。その設定方法を共有したいと思います。
***※この記事はMacキーボードのみ対応しています。***

Mac版VScodeではデフォルトで、ターミナルからエディタへの移動を ***"command+1"*** と設定しているので、このショートカットをトグル式にすることで、エディタとターミナルの行き来を可能にしたいと思います。

具体的には
エディタにフォーカスがある状態で ***"command+1"*** を押下するとターミナルにフォーカスが移る。
ターミナルにフォーカスがある状態で ***"command+1"*** を押下するとエディタにフォーカスが移る。

というショートカットを設定することを目的としています。


# ショートカットを設定

まず、VScodeにて***shift+command+p***を実行し、コマンドパレットを開きます。

以下のように、コマンドパレットが出現すると思います。 

![コマンドパレット画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708101/9a31c4dd-fe5f-f393-9f26-19fff4330d97.png)

この検索欄に
***Open Keyboard Shortcuts (JSON)***　または　***キーボードショートカットを開く(JSON)*** と入力し、それをクリックします。

そうすると、***keybindings.json*** というファイルが開かれたと思いますが、そのファイルに以下のコードを追加することで、設定は完了です。

```keybindings.json
{
    "key": "cmd+1",
    "command": "workbench.action.terminal.focus",
    "when": "editorTextFocus"
  },
  {
    "key": "cmd+1",
    "command": "workbench.action.focusFirstEditorGroup",
    "when": "terminalFocus"
  }
```
***"command+1"*** を押すことで、エディタとターミナルの行き来が可能になっていることが確認できると思います。

このファイルでは ***"when"*** を利用することで、エディタとターミナルのどちらにフォーカスがあるかによって場合分けを行なっています。

# 終わりに

記事は以上になります。

自分自身も初心者ではありますが、ショートカットを覚えたり、作成したりしながら快適にVScode利用していきたいですね！
Windows10 サポート終了のまとめ

## 概要
Windows10が2025年10月14日にサービス終了となるといことで少しまとめておきたいと思います。
サポート終了することで以下のようなものが、マイクロソフト社より提供されなくなります。
- 脆弱性のセキュリティ修正
- バグ修正
- 仕様の変更

## Windowsのバージョンの確認
バージョンやエディションを確認の方法は[PowerShell]や[ファイル名を指定して実行]から以下のコマンドを入力することで確認することが出来ます。
Windows 10 22H2が最終バージョンとなります。

```
winver
```

## Windows 10のエディションについて
まず、Windows10は大きく分ける以下のエディションに分類され、
サービスチャネルも変わってくるため、意識しておく必要があります。
また、エディションだけ変更する出来ないので、この点も注意が必要です。
※以下、以外にもMobileなどのエディションもありますが、記載はしていません。
| エディション |   用途    |    説明    |
|:-:|:-:|:-|
| Home             | 個人向け | 基本機能が搭載されているエディションで家電量販店等で購入するとこのエディションになるのではないかと思います。|
| Pro           | 中小企業向け |   基本機能に加えて、機能がプラスされています。例えば、GPOの設定やHyper-Vの利用などです。   |
| Enterprise LTSC           |   大企業向け |  機能面では、ほぼProと変わりはないですが、Cortanaが提供されていなかったりします。       |
| IoT           |            特殊な端末向け |       特定用途用で使われるエディションとなり、シンクライアント端末等で良く使われています。|

## サポートの種類
Enterprise LTSC、IoTについてはメインストリームサポート、延長サポート期間が設けられます。
法人向けの方はこの猶予期間で移行してくださいねと考えた方が良いです。

| サポート |     説明    |
|:-----------------|:------------------|
| メインストリームサポート| メインストリームサポートにおいては、セキュリティ更新プログラムや仕様変更などのサポートが受けられる期間です。|
| 延長サポート| メインストリームサポートが終了し、延長サポート期間に入りますが、延長サポートにおいては、基本的にセキュリティ更新プログラムの提供のみとなり、仕様変更のリクエスト等も終了し無償サポートも終了とないります。|

※ メインストリームサポート、延長サポートが終了すると無償・有償サポートを一切受けることが出来なくなります。

## サポート期限
纏めると、エディションによってサポート期限が変わるため、注意が必要となりまずは、エディションの確認をしたうえで直ぐに対応するべきことなのか判断が必要となります。
また、エディションのバージョンによってもサポート期限が変わってきますが、Windows 10の最終バージョン H21H2を適用している前提での記載します。

| エディション |     サポート期限    |     延長サポート    |
|:-----------------|:------------------|:------------------:|
| Windows10 Home 及びPro| 2025年10月14日|なし|
| Windows10 Enterprise LTSC|メインストリームサポート：2027年1月12日|延長サポートはありません。|
| Windows10 IoT Enterprise|メインストリームサポート：2027年1月12日|延長サポート:2032年1月13日|
CompTIA Security+（SY0-601）受験記録

## 概要
表題の通り、CompTIA Security+（SY0-601）の受験記録・勉強方法となります。
参考になれば幸いです。

- 取得済み資格：FE, AP, SC

- 勉強時間：4日(15時間程度)

- 使用(購入)した教材：
・TAC Security+（SY0-601）Web模擬試験コース￥52,200（リテイクチケット付）
・Udemy問題集


## 受験の流れ
1. 情報収集
最短で効率よく合格するために一番重要な項目かと思われます。過去の受験者のブログ等を参考にしましょう。
　
2. TAC申し込み
全体の流れや概要に関しては、こちらの記事が非常に参考になりました。
http://deepserver.aa1.netvolante.jp/comptia-security/  
TAC申し込みから模擬試験・バウチャーチケットが届くまで数日かかるため、余裕をもって申し込みましょう。
 　
3. 勉強
筆者は過去の受験者のブログを参考にした結果、下記のような流れで勉強しました。自身の状況や好みに応じて取捨選択してください。もちろん、時間があれば全て確認してみるのが確実であると思います。個人的にはTACの問題集とUdemyの問題集が非常に役に立ちました。合格するだけならこれだけで十分だったかもしれません。
　
・TAC模擬問題集(試験2回分)
　本試験勉強のベースとなります。覚えるまで繰り返し勉強しましょう。(筆者は1週のみ)
　
・Udemy問題集
　TACの問題集だけでは心もとなかったため、追加で問題集を購入。
　セール時購入推奨。レビュー数が多く、601に対応しているものを購入しました。
　https://www.udemy.com/course/sy0-601-comptia-security-plus/
　※Udemyは商品の移り変わりが激しく、
　　過去の受験者ブログで紹介されている教材が使えなかったりするので注意。
　
・CompTIA Security+ 認定資格試験出題範囲（公式） 
　https://www.comptia.jp/certif/core/comptia_security/
　念には念を入れて、問題集に出てこなかった用語を全て調べます。
 　
・その他
　公式の類似問題やパフォーマンスベーステストも確認しておくと良いでしょう
　
4. 試験予約・受験
公式サイトで予約後、テストセンターで受験しました。
　
5. 結果
合格ライン：750
スコア：816/900(8割が合格ラインと言われていますが、9割弱くらいでしょうか...)
合格


## 感想
ある程度前提知識があったためか、無事にサクッと合格することができました。
次回はCySA+に挑戦してみようと思います。(既にバウチャーチケット及び模擬試験購入済み)
そちらも合格次第、同じように記事にできればと思います。それでは、以上で失礼します。

2024/04/29 追記
[CompTIA CySA+（CS0-002）受験記録](https://qiita.com/nagi4472/items/36ca6cc92cdd13ce1b09)
Elixirのバージョンを上げるのを自動化してみた

asdfをインストールするスクリプト

```bash
#!/bin/bash

# If you use Linux, git clone asdf.
# After install asdf, add path in current shell
# and add plugin elixir and erlang.
_linux_install_asdf() {
  echo "----- Linux install asdf."
  git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.0

  echo "----- Add path to ~/.bashrc."

  # .bashrc
  echo '# asdf' >> ~/.bashrc
  echo '. "$HOME/.asdf/asdf.sh"' >> ~/.bashrc
  echo '. "$HOME/.asdf/completions/asdf.bash"' >> ~/.bashrc

  source ~/.bashrc
  which asdf

  echo "----- Add plugin Elixir."
  asdf plugin-add elixir https://github.com/asdf-vm/asdf-elixir.git

  echo "----- Add plugin Erlang."
  asdf plugin-add erlang https://github.com/asdf-vm/asdf-erlang.git

  echo "----- Install dependencies erlang."
  sudo apt install -y libssl-dev automake autoconf libncurses5-dev
}

# If you use macOS, execute `brew install asdf`.
# After install asdf, add path in current shell
# and add plugin elixir and erlang.
_macOS_install_asdf() {
  echo "----- macOS install asdf."
  brew update
  brew install asdf

  echo "----- Add path to ~/.zshrc."

  # .zshrc
  echo '# asdf' >> ${ZDOTDIR:-~}/.zshrc
  echo -e "\n. $(brew --prefix asdf)/libexec/asdf.sh" >> ${ZDOTDIR:-~}/.zshrc

  source ${ZDOTDIR:-~}/.zshrc
  which asdf

  echo "----- Add plugin Elixir."
  asdf plugin-add elixir https://github.com/asdf-vm/asdf-elixir.git

  echo "----- Add plugin Erlang."
  asdf plugin-add erlang https://github.com/asdf-vm/asdf-erlang.git
}

install_asdf() {
  if [ "$(uname)" = 'Darwin' ]; then
    _macOS_install_asdf
  else
    _linux_install_asdf
  fi
}

# Execute this script current shell. For example,
# $ source install_asdf.sh
install_asdf
```

Elixirをインストール/バージョンアップデートするスクリプト
```bash
#!/bin/bash

# Install version
ELIXIR_V=1.16.2
ERLANG_V=26.2.2

# Update asdf.
# If you use macOS, execute `brew upgrade asdf`.
# If you use Linux, execute `asdf update`.
_update_asdf() {
  if [ "$(uname)" = 'Darwin' ]; then
    echo "----- macOS update brew asdf."
    brew update
    brew upgrade asdf
  else
    echo "----- Linux update asdf."
    asdf update
  fi
}

# List installable elixir and eralng versions.
version_list() {
  _update_asdf
  paste <(echo "Elixir" && asdf list-all elixir | tail -n 15) \
        <(echo "Erlang" && asdf list-all erlang | tail -n 15) \
  | awk '{printf "%-20s %s\n",$1,$2}'
}

# Uninstall elixir and erlang current setting versions.
uninstall() {
  echo "----- Uninstal Elixir."
  asdf uninstall elixir

  echo "----- Uninstall Erlang."
  asdf uninstall erlang $(asdf list erlang | perl -pe 's/\*//g')

  asdf list
}

# Install specified elixir and erlang version.
# And set global installed version.
install_elixir() {
  _update_asdf

  echo "----- Install Elixir."
  asdf install elixir ${ELIXIR_V}

  echo "----- Install Erlang."
  asdf install erlang ${ERLANG_V}

  # echo "----- Set local installed version."
  # asdf local elixir ${ELIXIR_V}
  # asdf local erlang ${ERLANG_V}

  echo "----- Set global installed version."
  asdf global elixir ${ELIXIR_V}
  asdf global erlang ${ERLANG_V}

  asdf current
}

version_list
install_elixir
```
Gitでの取り消し

# 内容
以下の内容について書いていきます。
- 直前のコミットのコミットメッセージを変更したい
- 直前のコミットの内容を変更したい
- ワーキングツリー/ステージングエリアに載せた変更を取り消したい
- 動作確認のためにいくつも前のコミットの状態に戻したい

# 前提
mainブランチで、v1→v2→v3とコミットを重ねてきているとします。

## ワーキングツリー/ステージングエリアに載せた変更を取り消す
```
git restore <filename>
```
add前のファイルの変更を取り消す。```git add```と同じ文法で使用可能。
```git status```で表示される。

```
git restore --staged <filename>
```
ステージングエリア上の変更を取り消す。
```git status```で表示される。



## 直前のコミットのコミットメッセージを変更する
```
git commit --amend
```
エディタが開き、修正後に閉じることで修正が完了する。
この際ステージングエリアにある変更を自動で直前のコミットに追加する。

## 特定のコミットの状態に戻す
```
git reset --hard <戻したいコミットのハッシュ>
```
※戻したいコミット以降の変更やワーキングツリー/ステージングエリアの情報が全て消えるので注意

```
git reset --mixed <戻したいコミットのハッシュ>
git reset <戻したいコミットハッシュ>
```

上記2つとも同じ。
コミットを取り消しつつ、手元のファイルの状態を残したままにできるので、直前のコミットの内容を修正したい場合に便利

::: note info
直前のコミットの内容を修正する場合は以下でも可。^は「１つ前」を表す。
```git reset --mixed HEAD^```
:::


```
git reset --soft <直前のコミットハッシュ>
```
--mixed オプションと同じく、手元のファイルの状態はそのまま残る。
--mixed オプションではステージングエリアの変更が空になるが、--soft オプションではステージングエリアに変更が残っている状態になる。場合によって使い分けの必要あり。



## git resetのオプションの挙動まとめ

v1に戻したとする時のオプションによる挙動の違いは以下のようになります。
|  | --hard | --mixed | --soft |
|:-:|:-:|:-:|:-:|
| 手元のファイルの状態(WT)  |  v1時点に戻る | v3時点のまま  | v3時点のまま  |
| ステージングエリア  | 空になる  |  空になる |  v3時点のまま |
Docker壊れたので初期化

:::note info
この記事は、5分で読めます。
:::

## はじめに
- dockerが壊れた時の解決方法
- ”docker desktopもエラー”、”dockerコマンドも使えない”を解決
- PCは、M1のMacです。

## 症状
- いろいろdocker周りをいじっていたら壊れました
- docker desktopの再起動ができない（& アプリを終了しても立ち上がらない
- which dockerコマンドでdockerの在処は出てくるが、docker infoなどのコマンドが永久に終わらない

## 手順
結論、Dockerまわりのファイルやアプリを全部消し去ってから、再度docker desktopをインストールします。
3ステップです。
1. docker desktopアプリをアンインストール
    →アプリをゴミ箱に入れて、ゴミ箱からも削除する
    <br>
1. 以下のdockerまわりの設定を削除
    1. ~/.docker
    1. ~/Library/Caches/com.docker.docker
    1. ~/Library/Containers/com.docker.docker
    1. ~/Library/Preferences/com.docker.docker.plist
    1. /usr/local/lib/docker

    以下のコマンドで、各種ファイルを削除します。コマンド実行時に、権限がないと言われたらsudoを先頭につけて管理者権限でコマンド実行すればokです。
    ```terminal
    rm -rf 対象ファイル
    ```
    <br>
1. 再度docker desktopをインストールして、docker buildコマンドなどでdockerを起動してみる

https://docs.docker.com/desktop/install/mac-install/


##### 補足：手順２で削除するディレクトリたちの役割
~/.docker：ユーザーの Docker 設定と認証情報を格納
~/Library/Caches/com.docker.docker：キャッシュデータを格納
~/Library/Containers/com.docker.docker：アプリケーションが使用するデータを格納
~/Library/Preferences/com.docker.docker.plist：起動時の設定、リソース割り当て（CPU、メモリ）、その他のユーザー設定を格納
/usr/local/lib/docker：コアコンポーネント(ライブラリやエンジン関連)を格納
<br>
私の環境では存在しませんでしたが、lsを叩いて以下ディレクトリがヒットする場合は以下も削除ください。
~/Library/Group Containers/group.com.docker
＞異なるアプリケーションやプロセス間でデータを共有するために用いられるグループコンテナの一種

## おわりに
またdocker使えるようになって良かったぁ
はじめてのJavaScript:初心者の学び場（配列操作編）

これはJavaScriptを学んでいるうえでのメモ書きです。
間違っている個所などご指摘の方お願いします。
# 配列操作
## map() メソッド
map() メソッドは、元の配列の各要素に対して指定されたコールバック関数を実行し、その戻り値を新しい配列に格納します。元の配列の要素数と同じ長さの新しい配列が作成
```diff_ruby:
const newArray = array.map((element, index, array) => {
  // 各要素に対する処理を記述し、その結果を返す
});
```
## コールバック関数の引数
map() メソッドに渡されるコールバック関数は、3つの引数を取ります。
1\.要素の値(element)
現在処理されている配列の要素の値です。この値を変更しても、元の配列に影響を与えることはありません。

2\.インデックス (index)
現在処理されている配列の要素のインデックスです。配列内の要素の位置を示します。

3\.元の配列 (array)
map() メソッドが呼び出された元の配列自体です。この引数を使用して、元の配列全体にアクセスすることができます。

:::note warn
## 注意点
・コールバック関数内で元の配列 (array) を変更しても、新しい配列には影響しません。map() メソッドは元の配列を変更せず、新しい配列を作成して返します。

・コールバック関数内では、元の配列 (array) を直接変更することは一般的に推奨されません。そのような変更は、元の配列と新しい配列の整合性を乱す可能性があります。
:::

### 参考例
```diff_ruby:
const numbers = [1, 2, 3, 4, 5];
const squaredNumbers = numbers.map((number, index) => {
  console.log(`Processing element ${number} at index ${index}`);
  return number * number;
});

console.log(squaredNumbers); // [1, 4, 9, 16, 25]

```
配列 numbers の各要素が2乗された新しい配列が作成される。
コールバック関数内で要素の値とインデックスがログに出力されることがわかる。

## filter() メソッド
配列内の要素をフィルタリングするためのメソッドであり、指定された条件に合致する要素だけからなる新しい配列を作成します。このメソッドは、条件に一致する要素のみを残して他の要素を取り除くときに便利

:::note warn
## 注意点
・filter() メソッドは元の配列を変更せず、条件に合致する要素だけを含む新しい配列を作成して返します。

・コールバック関数内では、元の配列 (array) を直接変更することは一般的に推奨されません。そのような変更は、元の配列と新しい配列の整合性を乱す可能性があります。
:::

### 参考例

```diff_ruby:
const numbers = [1, 2, 3, 4, 5];
const evenNumbers = numbers.filter((number) => {
  return number % 2 === 0;
});

console.log(evenNumbers); // [2, 4]

```
配列 numbers の各要素が偶数かどうかをチェックし、偶数の要素だけからなる新しい配列 evenNumbers を作成

:::note info
filter() メソッドは、配列内の要素を効果的にフィルタリングするための強力なツールです。特定の条件に基づいて配列を絞り込む必要がある場合に、非常に役立ちます。
:::
GWTはなぜ最新のフロントを作れるのか？

# GWTはJavaをjavascriptに変換します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132663/b99ebc21-399a-f2ee-4068-b388f324a075.png)
その為、最新の状態でプログラムを更新する事が可能です。


# GWTのJava→javascript変換は、割と凄い
・最適化（サイズ縮小）
・難読化（セキュリティー向上）
・互換性（各ブラウザ別変換）
apacheが動かなくなったときの１つの原因

# はじめに
こんにちは。
今回は、私が遭遇したapacheが動かなくなってしまった際の１つの原因について解説します。

# apachectl start してみるも

```
httpd: Syntax error on line 191 of 
/usr/local/apache2/conf/httpd.conf: 
Cannot load modules/libphp.so into server: 
dlopen(/usr/local/apache2/modules/libphp.so, 0x000A):
Library not loaded: /usr/local/opt/libsodium/lib/libsodium.23.dylib\n  
Referenced from: <英数字の羅列> 
/usr/local/apache2/modules/libphp.so\n  
Reason: tried: '/usr/local/apache2/lib/libsodium.23.dylib' (no such file), 
'/usr/local/opt/libsodium/lib/libsodium.23.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/usr/local/opt/libsodium/lib/libsodium.23.dylib' (no such file),
'/usr/local/opt/libsodium/lib/libsodium.23.dylib' (no such file), 
'/usr/local/lib/libsodium.23.dylib' (no such file),
'/usr/lib/libsodium.23.dylib' (no such file, not in dyld cache),
'/usr/local/apache2/lib/libsodium.23.dylib' (no such file),
'/usr/local/Cellar/libsodium/1.0.19/lib/libsodium.23.dylib' (no such file),
'/System/Volumes/Preboot/Cryptexes/OS/usr/local/Cellar/libsodium/1.0.19/lib/libsodium.23.dylib' (no such file),
'/usr/local/Cellar/libsodium/1.0.19/lib/libsodium.23.dylib' (no such file), '/usr/local/lib/libsodium.23.dylib' (no such file),
'/usr/lib/libsodium.23.dylib' (no such file, not in dyld cache)
```

# libphp.soを確認。バージョンは？
phpのバージョンが8のとき、libphp.soという名前になるらしいのですが、
私の場合は、phpのバージョンが上がったことで、"libsodium.23.dylib"というファイルが読み込めなくなったことが原因だったようでした。

検索で以下のようにしたところ、libsodium.26.dylibが引っかかりましたので、phpのバージョンがアップしたことで、読み込むlibsodiumのバージョンが変わってしまったようです。
```
// /usr/local.libフォルダで
$ find . -name "*libsodium*"
./libsodium.26.dylib
./pkgconfig/libsodium.pc
./libsodium.dylib
./libsodium.a
```

apacheに読み込むphpのバージョンやlibsodiumのバージョンをダウングレードすることも考えましたが、まずはアップグレードをしてみようと思い、libsodium.26.dylibを読み込むようにしてみました。

検索で以下のようにすると、libphp.soの場所がわかるので、それをapacheのフォルダにコピーしました。
```
$ sudo find / -name "libphp.so"
/usr/local/apache2/modules/libphp.so
/usr/local/lib/httpd/modules/libphp.so
/usr/local/Cellar/php/8.3.2/lib/httpd/modules/libphp.so
^C
```
１つ目が現在使っているlibphp.so、
２つ目がmacOSに付いてきたlibphp.so（だったはず）、
３つ目がバージョンアップのときに付いてきたlibphp.soです。

以下のようにしてコピーします。
```
$ sudo cp /usr/local/Cellar/php/8.3.2/lib/httpd/modules/libphp.so /usr/local/apache2/modules/libphp.so
```

私の場合は、これでapacheが動くようになりました！

# 終わりに
バージョンアップの際にサーバーやプログラムが動かなくなることはよくあることですが、
避けるか、乗り越えるかしていきましょう！
AWS GlueでCrawlingして変なテーブル名を命名された場合の対応

## 背景
aws glueのcrawlerでファイルをcrawlすると、テーブルに思いもよらぬ名前がつけられることがあるかと思います
プレフィックスで対応できると良いのですが、そうもいかない場合も多いかと思います

今回その状況になって、思ったよりも素直に対応できなかったので、その方法を残しておきます
なお、コンソールからは見つけることが出来ませんでした

google先生にお聞きすると[How set name for crawled table?](https://stackoverflow.com/questions/48322330/how-set-name-for-crawled-table)の記事がヒットしました
(Geminiの回答はいけてませんでした)
初め見た時は、create_tableとあったので、新規にテーブルを作りたいんじゃないけどって思いましたが、元テーブルのメタ情報を引き継いで新しい名前のテーブルを作るので、これで大丈夫ですね

年月がかなり経っていますのでそのままではエラーになりましたが、1箇所の修正とCrawlerの設定変更で対応できました


## 対応内容
### その１

get_tableで取ってきたtable_inputからキーをpopしている箇所で、下のVersionIdを追加
```update_table.py
table_input.pop("VersionId")
```


### その２
Crawlerの設定変更

Crawl結果のマッピング先をリネームしたテーブルにして(Not YetからYesに)
![スクリーンショット 2024-02-15 14.45.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6748/ef874dfd-03d3-18ba-0b9e-098f5717d241.png)

一番下のupdate〜のチェックボックスを外す必要がありました
こちらの操作は謎ですが、エラーになりましたので一旦外しました
必要に迫られたらAthenaクエリ等々から設定することにします

![スクリーンショット 2024-02-15 14.47.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6748/1087d96b-a9cd-9798-f096-1a2dec72858f.png)


こちらの投稿が何方かのお役に立つと嬉しく思います
CpawCTF Q17.[Recon]Who am I ?

## CpawCTF Q17.[Recon]Who am I ?
「@porisuteru スペシャルフォース2」を検索すると、@porisuteruさんのスペシャルホースをプレイしている画面が投稿されているので、それを見て答えはcpaw{parock}とわかります。
The Skills That Every Engineer Must Require to Upgrade Themselves in the Career

Pursuing an engineering course in tamilnadu is not that easy. Frequently the engineers must upgrade their skills to stay at the top of the competition. Even though, you are strong at engineering concepts, apart from that the engineers need lots of other non-academic skills that includes problem-solving, time management, stress management etc.

The Villupuram College of engineering explains the necessary skills that every college student must possess.

1. Thinking in Different Perspective: While studying, engineering students might have less experience to solve the problems. However, you must train yourself to think in all the possible ways to overcome it. And this becomes the base for creative thinking. During, job interviews, the recruiters will look for this skill in your resume. Hence, practising for it from the college days is undoubtedly essential.

2. Communication Skills: Are you confused on why the engineering students requires communication skills? Though engineering is the course for improving the analytical skills, the students must also develop the communication skills. This will eventually develop interpersonal skills, effective teamwork and helps to gro  the potential employees in the organization.

3. Research Skills: According to the Villupuram College of engineering, the students must improve the research skills. This helps them to improve the technical skills too. For example, the students can research deeply and find answers for many technical questions for their projects, seminars and self-study topics.

4. Skills to Handle Different Software: Irrespective of the engineering courses, software skills became mandatory.  The software including matlab, CAD or CAM is used in all types of engineering specifications. Hence mastering it is essential.

Finally, leadership qualities, project management, design and technology skills, quality assurance skills, accounting and system management are also essential for all future engineers. Hence, the engineering students must invest their time and efforts to build these from their college days. The college in Villupuram assists the students in all possible ways to improve these skills and to excel in their job.

Therefore, utilize the opportunities to learn. And add these skills in resume to attract the employers’ attention.
シェルスクリプトで配列の各要素の末尾に配列の要素数を追加する

シェルスクリプトで配列の各要素の末尾に配列の要素数を追加するには、以下のようにします。

1. 配列の要素数を取得します。
2. 配列の各要素に対してループを実行し、要素数を末尾に追加します。

以下に、具体的なシェルスクリプトの例を示します。

```bash
#!/bin/bash

# 配列の定義
array=("apple" "banana" "cherry")

# 配列の要素数を取得
length=${#array[@]}

# 配列の各要素に対してループ
for i in "${!array[@]}"; do
  # 各要素の末尾に要素数を追加
  array[$i]="${array[$i]}$length"
done

# 結果の表示
echo "${array[@]}"
```

このスクリプトでは、まず配列 `array` を定義し、その要素数を変数 `length` に格納します。次に、`for` ループを使用して配列の各要素を順に処理し、各要素の末尾に要素数 `length` を追加します。最後に、変更された配列の内容を表示します。

このスクリプトを実行すると、配列の各要素の末尾にその配列の要素数が追加された結果が表示されます。たとえば、上記のスクリプトでは `"apple3" "banana3" "cherry3"` が出力されます。
シェルスクリプトで2つの配列を重複なしでマージする

シェルスクリプトで2つの配列を重複なしでマージするには、以下のようにすると良いでしょう。この例では `bash` シェルを想定しています。

```bash
#!/bin/bash

# 2つの配列を定義
array1=(a b c d e)
array2=(c d e f g)

# 2つの配列をマージし、重複を削除
merged_array=($(echo "${array1[@]}" "${array2[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' '))

# 結果を表示
echo "${merged_array[@]}"
```

このスクリプトは、以下のステップを実行します：

1. `array1` と `array2` という名前の2つの配列を定義します。
2. `echo` コマンドを使用して2つの配列の内容を出力し、`tr` コマンドを使用してスペースを改行に置換して、各要素を独立した行にします。
3. `sort -u` コマンドを使用して行（配列の要素）をソートし、重複を削除します。
4. 再び `tr` コマンドを使用して改行をスペースに置換し、ソートされ重複が削除された要素を新しい配列に格納します。
5. 最後に、マージされた配列の内容を表示します。

この方法で、2つの配列を重複なしで1つの配列にマージすることができます。
シェルスクリプトでURL内の特定のパターンにマッチする部分を取り出す

シェルスクリプトでURL内の特定のパターンにマッチする部分を取り出すには、`grep`や`sed`、`awk`などのツールを使用する方法が一般的です。この場合、"/V00.01/"の形を持つバージョン文字列を取り出したいので、`grep`と正規表現を組み合わせる方法を紹介します。

以下のコマンドラインは、URLから"/VXX.XX/"形式（Xは任意の数字）のバージョンを抽出します。

```sh
echo "http://example.com/path/V00.01/other/path" | grep -o '/V[0-9]*\.[0-9]*/'
```

- `echo`はURLを出力します。
- `grep -o`はマッチした部分のみを出力します。
- 正規表現`'/V[0-9]*\.[0-9]*/'`は、"/V"で始まり、任意の数字（0個以上）、ピリオド、任意の数字（1個以上）、最後に"/"で終わる文字列にマッチします。

もしシェルスクリプト内でURLが変数に格納されている場合は、以下のように書くことができます。

```sh
url="http://example.com/path/V00.01/other/path"
version=$(echo "$url" | grep -o '/V[0-9]*\.[0-9]*/')
echo $version
```

これで、指定された形式のバージョン文字列を取り出すことができます。



スラッシュ（`/`）を取り除きたい場合は、抽出した文字列からこれらを削除するために`sed`コマンドを追加することができます。以下のコマンドは、先ほどのコマンドからスラッシュを取り除くように改良されています。

```sh
echo "http://example.com/path/V00.01/other/path" | grep -o 'V[0-9]*\.[0-9]*' | sed 's/\///g'
```

この場合、`grep`コマンドは"/"を含まないように正規表現を調整して、バージョン文字列だけを抽出します。そして、`sed 's/\///g'`は不要なスラッシュを削除しますが、この正規表現の調整により、`sed`でのスラッシュ削除は実際には必要なくなります。したがって、最も単純な形では、以下のコマンドだけで十分です：

```sh
echo "http://example.com/path/V00.01/other/path" | grep -o 'V[0-9]*\.[0-9]*'
```

このコマンドの出力は以下のようになります：

```plaintext
V00.01
```

これで、URLから"/"を含まないバージョン文字列だけが正確に取り出されます。
その通知はどこから来ているのか？

## 課題
アプリの通知元をわかるようにしたい

## 詳細
Webhookを利用して、Slackに自前のGASでとある通知を送っていた際に「そういえばこのGASってどこにあるんだっけ...」と分からなくなってしまったことがあります。

通知を消すためにWebhookを消したのですが、彼はきっと今も存在しないURLを叩き続けているのかもしれない...（ごめんなさい）

## 解決策とメリット
GASなどであれば、通知するメッセージの下にどのリンクから送られているかを追記しておくと良さそうです。

```javascript
    const poweredBySection = {
      "type": "context",
      "elements": [
        {
          "type": "mrkdwn",
          "text": "Powered by <https://script.google.com/hoge/edit | AppScript>"
        }
      ]
    }
    messageBlocks.push(poweredBySection);
```

このような感じで通知元がわかると、自分みたいに修正が必要になった場合どこへ行けばいいか思い出せますし、あるいはOSSだったらコントリビュートしてもらえる可能性が上がるなど、メリットがあります。

ふと思い出したときに追記してみてください 📝
なぜExcelでセル結合してはいけないのか

# はじめに
メンバーがRDBテーブル仕様書（Excelファイル）の複数Columnの備考欄をセル結合したので、なぜそれがダメなのか言語化しておく。
内容が同じで文字量が多いため、セル結合するのも一理はあった。
しかし、セル結合はやめて同上や同左と書いてもらうことで解決した。

# 本文

・基本的にフォーマットは既存のものに合わせるべきである。Excelに限らずITに限らず。
　フォーマットが同じであれば、コミュニケーションコストや読解コストが下がるし、スケーラビリティも高くなる。
・セルフォーマットが同じであれば、プログラム（Excel関数、Excelマクロ、Pythonなど）で扱いやすい。
　その時点ではプログラムで扱う予定がなくても今後に備えるべき。
・RDBに関していえば、Column定義は1つ1つ独立しているべきものなのだから混ぜるべきじゃない。

もちろん上記を無視してでもセル結合するメリットがあるならしたらいいが、そんな状況が来てしまったらもっと別のところを直すべきじゃないか？
JavaScriptファイルにcssをimportしようとしたらエラー吐かれた件

# はじめに
とあるudemy(下記に記載)を進めていたところ、エラーが出たので共有します!
TODOアプリをjavascript, html, cssにて作成中です。

https://www.udemy.com/course/react_stepup/

# 問題
JavaScriptファイル内でcssファイルをimportしようとしたらエラーが出た。
```javascript:index.js
/* エラーコード
Failed to load module script: Expected a JavaScript module script 
but the server responded with a MIME type of "text/css". 
Strict MIME type checking is enforced for module scripts per HTML spec.
*/

//エラーが出た箇所
import "./style.css";
```
# なぜエラーがでた???
- **サーバーを立てない**とimport文が使えないらしい
# 解決方法
htmlファイルにlinkタグを使って直接cssを読み込んだ。
```html:index.html
<!-- 周辺のコードも載せときました -->
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Todojs</title>
    <link rel="stylesheet" href="style.css"> 　<!-- この行 -->
</head>
```
# 余談
これからhtmlファイルに読みこもっと~~と思ったそこのあなたへ
importを使うといいことがあるらしい。
僕自身も知識がまだ足りないのでちゃんとしたことは言えないけど、JavaScriptファイルとそのファイルに関係したcssをセットで管理できるという利点があるらしい。

説明へたくそ、いつか書き直そうかな笑

# おわりに
余談でも話したけど、エラーの解決方法がわかっても**現状の何がだめなのか**を把握することがさらに学習を深いものにしてくれるのかも。

# 参考
https://qiita.com/AK_React/items/094c281cf91a1a3eeeae
【VSCode】The current workspace is using an obsolete version of .NET SDK 'x.x.x'

少し古いUnityのプロジェクトをVSCodeで開いたところ、Unityのコード補完が効かない。

### エラー
The current workspace is using an obsolete version of .NET SDK '5.0.400', which is not supported. The C# Dev Kit extension may not work correctly. Please update the computer and potentially global.json file to use a more recent version of .NET SDK.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865650/ced71280-a0d0-004c-9d9b-73185a84a884.png)

### 解決策
Turn Off Notifications from C# Dev Kitを選択して再起動。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865650/18b3bf29-b62e-3639-ff33-5bfc62d49368.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865650/b104c2af-e097-e67a-2ee0-35db0970a460.png)

C# DevKitのエラーらしい？
C# Dev KitをDisableしなくても治った。
Turn Off Notificationなので通知を無効にするだけで治ったのが謎。

### 環境
Unity 2021.3.8

VScode 1.86.1
VSCode 拡張機能
- C# Dev Kit v1.3.10
- Unity v0.9.4
メモ: VSCodeのPythonコード整形プラグインBlack formatterの設定/quote変換を回避

### `VSCode`に`Black formatter`プラグインを導入したあとの設定メモ。

基本的にはデフォルト設定で、保存毎に整形していく。
しかしデフォルトでは[シングルクオートの文字列をダブルクオートに変換するようになっている](https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html#labels-strings)。

パイソニアンにはなぜかシングルクオートユーザーが多いが、勝手にダブルクオートに変えられるのは頭にくるだろう。つまりこの挙動では彼らに失礼である。

したがって、`--skip-string-normalization`を設定し、クオート変換はOffにするとよい。

```json:setting.json
{
    "[python]": {
        "editor.defaultFormatter": "ms-python.black-formatter",
        "editor.formatOnSave": true
    },
    "black-formatter.args": [
        "--skip-string-normalization"
    ],
}
```

他にもカスタマイズしたければ、以下のページから探して設定する。
https://black.readthedocs.io/en/stable/usage_and_configuration/the_basics.html
はじめてのJavaScript：初心者の学び場（スプレッド構文編）

これは自分がつまずかないように残すメモです。

今回はスプレッド構文について学びました。
# スプレッド構文とは
配列やオブジェクトなどの展開やコピーを行うための構文です。
JavaScriptで複数の値をまとめて扱う場面で非常に便利です。

# 配列におけるスプレッド構文
スプレッド構文を使用して、既存の配列の要素を展開して新しい配列を作成

```js
const array1 = [1, 2, 3];
const array2 = [...array1, 4, 5, 6];

console.log(array2); // [1, 2, 3, 4, 5, 6]
```

この例では、array1 の要素が展開されて、array2 に結合されています

# 配列のコピー
スプレッド構文を使用して、配列のコピーを作成することができます。
```js
const originalArray = [1, 2, 3];
const copiedArray = [...originalArray];

console.log(copiedArray); // [1, 2, 3]
```
この例では、originalArray の要素が展開されて新しい配列 copiedArray にコピーされています。

# 関数の引数としての使用
関数の引数としてスプレッド構文を使用することで、可変長の引数を扱うことができる。
配列の要素を関数の引数として展開します
```js
function sum(a, b, c) {
  return a + b + c;
}

const numbers = [1, 2, 3];
const result = sum(...numbers);

console.log(result); // 6
```
可変長の引数を受け取る関数を定義できる
```js
function sum(...numbers) {
  return numbers.reduce((total, current) => total + current, 0);
}

console.log(sum(1, 2, 3)); // 6
console.log(sum(1, 2, 3, 4, 5)); // 15
```

この例では、sum 関数は可変長の引数を受け取り、それらを合計して返しています。スプレッド構文を使用することで、関数に渡された引数が配列として扱われます。

# オブジェクトにおけるスプレッド構文
複数のオブジェクトをマージして新しいオブジェクトを作成します。
```js
const obj1 = { a: 1, b: 2 };
const obj2 = { c: 3, d: 4 };
const mergedObj = { ...obj1, ...obj2 };

console.log(mergedObj); // { a: 1, b: 2, c: 3, d: 4 }

```
:::note warn
# スプレッド構文の注意点
1\. スプレッド構文は、浅いコピーを行います。つまり、配列やオブジェクト内の参照型の値は元の配列やオブジェクトと同じオブジェクトを参照しています。

2\. スプレッド構文は、配列内の要素を展開して新しい配列を作成するため、元の配列の要素が変更されても影響を受けません

:::
配列におけるスプレッド構文は、コードの可読性を向上させ、配列の操作を簡潔かつ効果的に行うための重要なツールですが、スプレッド構文は非常に便利ですが、適切な状況で適切に使用する必要があります。特に大規模なデータやパフォーマンスが重要な場合には、スプレッド構文の使用によるメモリ消費や処理速度に注意する必要があります。
SourceTreeの設定を初期化する方法

# Source Treeの連携について設定を初期化したい
こうした場合、アプリケーションを削除し、再度アプリをインストールするだけでは、設定は元のままでした。

## ■上手くいかなかった方法
そこで、初期化の方法を調べると、多くの記事が
```
cd /Library/Application\ Support/SourceTree
```
上記SourceTreeフォルダの中身を削除すると良いと記載されておりました。

例）
```
# SourceTreeのアプリを削除
$ rm -rf ~/Library/Application\ Support/SourceTree/

# 設定をリセットする
$ defaults delete com.torusknot.SourceTreeNotMAS
```
しかし、私の環境では、そもそも上記Application Supportディレクトリの配下にSourceTreeディレクトリは作られていませんでした。
どこにあるんだ、、、

## 成功した方法

### 結論
SoucreTreeディレクトリの場所が違いました

```
cd /Users/ユーザー名/Library/Application\ Support/SourceTree
```
上記場所に私の場合、SourceTreeディレクトリが作成されていました。
こちらのSourceTreeディレクトリを削除することで、設定の初期化が成功しました
【ネットワーク】初心者のためのイーサネットのアドレスについて

## 概要
前回の記事はイーサネットの規格について説明をしました。
今回はイーサネットのアドレスについて説明していきます。

前回の記事は下記のものになります。
こちらの記事を読んでからの方が理解しやすいと思います。
是非、こちらも読んでみてください。

https://qiita.com/nakamura_slj/items/433651c4ff5ad377c85d

そもそもイーサネットって何？という方は下記の記事を読んでみてください。

https://qiita.com/nakamura_slj/items/2f2df1f946a579023fbc

ネットワークの基礎から学びたいという方には下記の記事から読んでみてください。

https://qiita.com/nakamura_slj/items/5841195df35a8325427e

## 対象とする読者
* ネットワークの基礎から学びたい人
* 前回の記事を読んだ人
* これからIT業界で仕事をしようと考えている人
* CCNAの資格を取ろうとしている人

## イーサネットのアドレス
MACアドレスは**ネットワークインターフェイスカード**に割り当てられている固有の識別子で、
**物理アドレス**や**ハードウェアアドレス**とも呼ばれています。
48ビット　（6バイト）で、12桁の16進数を2桁ごとに「-」(ハイフン)or「:」(コロン)で
区切って表記されます。
前半の24ビットはNICのベンダーを識別するIDで**OUI**といい、IEEEが管理しています。
後半の24ビットは各ベンダーが独自に割り当てます。
割り当てる時は、ベンダー内で重複しないようにします。
そのため、前半の24ビットと後半の24ビットを合わせると、唯一のMACアドレスとなります。

例）
28:1A:8D:87:AE:02

「28:1A:8D」→OUI
「87:AE:02」→ベンダーが独自に割り当てるID

ユニキャストの通信を行う場合には、宛先のMACアドレスを指定しますが、
それ以外にもブロードキャスト用、マルチキャスト用に用意されたMACアドレスがあります。

| アドレスの種類 | 説明 |
|:--------|:----------|
|ユニキャストアドレス|単一の機器を識別するためのMACアドレス|
|ブロードキャストアドレス|ネットワーク上のすべての機器を識別するためのMACアドレス|
|マルチキャストアドレス|ネットワーク上の特定のグループを識別するためのMACアドレス|

ユニキャスト、ブロードキャスト、マルチキャストがわからないという方は下記の記事をぜひ
確認してください。
図を用いて簡単にまとめています。

https://qiita.com/nakamura_slj/items/4d10e529f771225d2844

# 最後に
以上となります。
今回はイーサネットのアドレスについて説明しました。
次回も何かネットワーク関連について説明しようと思います。
RaspberryPiのVNC接続で"Cannot currently show the desktop"が表示された時

# はじめに
![スクリーンショット 2024-02-15 121952-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126772/5d76c9c5-5b7a-80fd-8575-445498dfb58c.png)

画面出力せずにVNC接続したとき，たまに発生するアレ．対処法をまとめてみた．
### 目次
1. HDMI信号を常時出力させる
1. Desktopモードにする
1. 解像度を変更する

# 1. HDMI信号を常時出力させる

hdmi_force_hotplugを有効にする．これをすると，HDMIモニタが接続されていなくても常に画面出力されるらしい．

config.txtを編集
```
sudo nano /boot/config.txt
```
![スクリーンショット 2024-02-15 125126.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126772/475ec34c-478f-0e44-8b27-64bab4767fbd.png)

以下を参考に，#hdmi_force_hotplug=1のコメント(#)を外す
```
# uncomment to force a console size. By default it will be display's size minus
# overscan.
#framebuffer_width=1280
#framebuffer_height=720

# uncomment if hdmi display is not detected and composite is being output
hdmi_force_hotplug=1
```
再起動する．



# 2. Desktopモードにする

そもそもGUIが起動していないから，有効にすれば治るというやつ．

configを起動
```
sudo raspi-config
```
1 System Options ⇒ S5 Boot / Auto Login

![スクリーンショット 2024-02-15 123827.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126772/c26be171-4708-a745-a665-4439b0d82555.png)

B3 Desktop を選択後, 再起動



# 3. 解像度を変更する
解像度変更でも治ったと報告がある

configを起動
```
sudo raspi-config
```
3 Display Options ⇒ D1 Resolusion

![スクリーンショット 2024-02-15 130342.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3126772/2a381c41-ed4b-f0cb-2bfb-d5a0629f5ee2.png)

Default以外の解像度に変更し, 再起動



# おわりに

自分の場合，だいたい1が原因．

## 参考文献

[VNC] Cannot currently show the dekstop
https://forums.raspberrypi.com/viewtopic.php?t=216737

ラズパイのVNC接続で「Cannot currently show the desktop」エラーに対応する
https://blog.ko31.com/202004/respond-to-cannot-currently-show-the-desktop-error-for-vnc-connection-in-lazzie/

「初心者のラズパイ勉強日記その3.5」Cannot currently show the desktopの解決法
https://white-sesame.jp/archives/blog/2472

RaspberryPi HDMIを快適にする
https://www.incmplt.net/2021/12/12/raspberrypi-hdmi-config/
Databricks にて Oracle Autonomous Database に ojdbc11.jar にて接続した際のエラー対応


## 概要

Databricks Runtime 13.3 LTS にて Oracle Autonomous Database に ojdbc11.jar にて接続した際に、次のエラーが発生しました。 ojdbc11.jar ではなく、ojdbc8.jar を利用する必要があるようです。

```text
java.lang.UnsupportedClassVersionError: oracle/jdbc/driver/OracleDriver has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
```

## エラー概要

### エラーメッセージ

```text
java.lang.UnsupportedClassVersionError: oracle/jdbc/driver/OracleDriver has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
```

### 実行コード

```python
username = ""  ## ユーザー名
password = ""  ## パスワード

hostname = "adb.ap-tokyo-1.oraclecloud.com"  # ホスト名
service_name = "g55ca460616b750_kpwq304szjg90by8_high.adb.oraclecloud.com"  # サービス名
```

```python
# connection strings
conn_str = "("
conn_str += f"description=(retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1521)(host={hostname})"
conn_str += ")"
conn_str += "("
conn_str += f"connect_data=(service_name={service_name})"
conn_str += ")"
conn_str += "(security=(ssl_server_dn_match=yes))"
conn_str += ")"

# JDBC connection URL
jdbc_url = f"jdbc:oracle:thin:@{conn_str}"

# JDBC connection properties
properties = {
    "url": jdbc_url,
    "user": username,
    "password": password,
    "driver": "oracle.jdbc.driver.OracleDriver",
    "sessionInitStatement": "ALTER SESSION SET TIME_ZONE = 'Asia/Tokyo'",
    "dbtable": tgt_table,
}

# Create spark dataframe
df = spark.read.format("jdbc").options(**properties).load()

df.display()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/14a26f1e-eaa6-45d5-05d3-e5dbc280ba73.png)

## 対応方法

### 1. ojdbc11.jar をアンインストールして、 ojdbc8.jar をインストール後、クラスターを再起動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/93a64aac-ff72-b7ee-a880-4ea1d265f089.png)

#### 2. 再度コードを実行して正常終了することを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e69d4d71-3557-0d28-3b7d-c37f9a9f7fff.png)
privateコンストラクタをmake_sharedする

そのままでは`private`なコンストラクタを`make_shared`で利用できないので内部クラスを利用する。
```C++
#include <memory>

class Hoge {
 public:
  static std::shared_ptr<Hoge> Create() {
    return std::make_shared<CreateHelper>(1, 2);
  }
  static std::shared_ptr<Hoge> Create(int x, int y) {
    return std::make_shared<CreateHelper>(x, y);
  }

 private:
  // privateコンストラクタを呼び出すためのヘルパクラスとそのエイリアス
  template<class T>
  struct Impl : T {
    template<class... ARGS>
    explicit Impl(ARGS&&... args)
        : T(std::forward<ARGS>(args)...) { /* ignore */ }
  };
  using CreateHelper = Impl<Hoge>;
  
  int x_, y_;
  Hoge(int x, int y) : x_(x), y_(y) { /* ignore */ }
}
```
## 説明
まず
- `std::make_shared`は`private`内部クラスを構築可能
- 内部クラス(子クラス)は親クラスの`private`メンバにアクセス可能

そこで
1. コンストラクタを呼び出すために親クラスを継承した`private`内部クラスを作成
2. `private`エイリアスを作成
3. `std::make_shared`で利用
4. 暗黙的アップキャストによって親クラスのポインタとして使用

という流れ。

1.について、内部クラスの継承先をテンプレートにすることで、親クラス`Hoge`の継承を可能にしている。また、コンストラクタの引数をテンプレートにすることで、定義の手間を省いている。

2.について、直接内部クラスを呼び出すと、`std::make_shared<CreateHelper<Hoge>>`となり、複数の関数から呼び出すという状況では保守性やコードの移植性が問題になるので`using`を使って`std::make_shared<CreateHelper>`の形式で呼び出せるようにしている。

#### 参考記事
https://gintenlabo.hatenablog.com/entry/20131211/1386771626
https://qiita.com/ToshiManaPlus1/items/b98e50fa3af771fd0d60
インデントは半角スペースの方がオススメ

# ソースコードのインデントは、タブよりも半角スペースの方がオススメ

# 理由
環境依存で見え方が変わってくるため。
（1タブをスペースいくつで表示するかによって、見え方が変わってしまう）

例：eclipseとかで「半角スペース何文字をタブに変換」とかの設定があり、各々の環境によって差異が生まれてしまう

以上より、タブは使わない方がいい。

**大体は半角スペース4文字を使うハズ！！**

（ただし、**既存のソースコードに合わせる** のが一般的なため、既存のコードを **要確認** だけど……）

# 追記
- インデントがタブになっていた場合、以下のようなことがよくある。
  - Windows環境：それっぽく綺麗に見える
  - Linux環境：タブを使っていると、1つのタブが半角スペース8個分とかで表示されてしまって、横スクロールしないとソースコードが読めない

- プロジェクトによっては、自動でフォーマットチェックをするように設定し、1行の文字数が設定値を超えると警告を出すようにしている。
(1行が長くなってしまうと、可読性が悪くなってしまうため。)
→タブはあまり使わない方が良さそう。
- エディタの設定で、保存時にタブを半角スペースに置換することも出来る。
そのため、コーディングをする際は、タブを使っても、保存する際に半角スペースに置き換えるなどの工夫をすれば、コーディングを楽にしつつ、可読性も担保出来る。

# 参考サイト
https://s8a.jp/tab-space-or-space
LabelImgの使い方

アノテーションツールであるLabelImgの使い方をメモしておきます。
実行環境：MacBook Air M1, 2020

https://github.com/HumanSignal/labelImg

# LabelImg（アノテーションツール）
https://github.com/HumanSignal/labelImg
https://laid-back-scientist.com/labelimg

ターミナルにてインストール
```zsh
git clone https://github.com/tzutalin/labelImg.git
cd labelImg
conda create -n labelImg python # 仮想環境を構築
conda activate labelImg
brew install qt
brew install libxml2
pip install pyqt5 lxml
make qt5py3
```

LabelImgを起動
```zsh
cd labelImg
conda activate labelImg
python labelImg.py
```

labelImg/data/predefined_classes.txtを書き換える（nameはラベル名）
```labelImg/data/predefined_classes.txt
name
```

# 参考文献
https://github.com/HumanSignal/labelImg
https://laid-back-scientist.com/labelimg
【Unity】ビルド時に大量に 'Editor' could not be foundのエラーが発生する場合の対処方法

# はじめに
ビルド時にAssets/*/Editorディレクトリ内のエディター関連のコードが含まれている際に以下のようなエラーが発生した際にどのような対応をされていますか？

```
Assets\*\Editor\*.cs(*,*): error CS0246: The type or namespace name 'Editor' could not be found (are you missing a using directive or an assembly refer
```

数ファイルだけなら以下のような方法でEdior環境でのみ動作するようにスクリプトを修正をするのもありだと思います。

尚、アセンブリを分けてないEditorディレクトリに配置していればこのエラーは発生しないようですので、asmdefが切られている配下のEditorディレクトリでのエラーが本記事の対象となります。（例えばUnityAssetStoreで購入したasmdefを使っているアセットだとこのエラーが発生しやすい傾向にあります。）

```cs
#if UNITY_EDITOR
public class MyScriptEditor: Editor {
... your custom editor code here ...
}
#endif
```

ただし、以下の事例のように数百ファイルでこのようなエラーが発生する場合には全ファイルを書き換える訳には行きませんよね？
このような事例に対応する方法を調べたのでFinalIKの場合を例に対処方法を共有させていただきます。

https://assetstore.unity.com/packages/tools/animation/final-ik-14290

前提としてFinalIKでは `RootMotion` ディレクトリにFinalIK.asmdefファイルが配置されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/ee1d720b-d1c7-a8aa-c330-34f14b809d97.png)

# 対処方法
### 方法1 asmdefファイルをEditorディレクトリに配置する 
Editorディレクトリ内にasmdefを配置して親のasmdefを参照させPlatformを `Editor` のみにチェックを入れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/f5387efe-3695-ae9e-17f9-a1110a34ca5e.png)


:::note info
FinalIKの場合のみの注意事項
RootMotion/ImportAssemblyDefinitionsを実行することでasmdefを自動で作成できますが、何故かFinalIK.asmdefとコンフリクトするRootMotion.asmdefを生成してしまうので注意が必要です。
:::

### 方法2 Assets/Editorディレクトリにファイルを移動する
親のasmdefの影響から除外するため `Assets/Editor` に移動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/5d9e84b3-16b1-5b3b-3961-3c2df703434c.png)

## 最後に
方法2ではシンプルな対処方法になりますが、プロジェクトのディレクトリ構成が大きく変わってしまうのがデメリットになります。ある程度規模のプロジェクトだと方法1がおすすめです。

## 関連公式フォーラム

https://forum.unity.com/threads/cant-build-due-to-cs0246-the-type-or-namespace-name-editor-could-not-be-found.1236301/

以上
Go REST API を作ってみる

GoでREST APIを作成する :baby_tone2:

下準備
```bash
mkdir todo-go
cd todo-go
```

プロジェクト作成
```bash
go mod init example/todo-go
```

パッケージ追加
```bash
go get github.com/gin-gonic/gin
```

実行
```bash
go run .
```

postmanの結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/e48231e6-4d54-8190-b5c6-cd4c1603d18c.png)


## ソースコード
```go
package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

type todo struct {
	ID        string `json:"id"`
	Item      string `json:"title"`
	Completed bool   `json:"completed"`
}

var todos = []todo{
	{ID: "1", Item: "Goの言語仕様を学習する", Completed: false},
	{ID: "2", Item: "Goのチュートリアルを実践する", Completed: false},
	{ID: "3", Item: "Goで動くアプリを開発する", Completed: false},
	{ID: "4", Item: "QiitaにGoに関するアウトプットを行う", Completed: false},
}

func getTodos(context *gin.Context) {
	context.IndentedJSON(http.StatusOK, todos)
}

func main() {
	router := gin.Default()
	router.GET("/todos", getTodos)

	router.Run("localhost:8080")
}

```

## Reference
- [RESTful API with GO and Gin](https://golang.google.cn/doc/tutorial/web-service-gin)
- [Gin Web Framework](https://github.com/gin-gonic/gin)
- [Gin 日本語ドキュメント](https://gin-gonic.com/ja/docs/)
- [Gin Examples](https://github.com/gin-gonic/examples)
- [net/http](https://pkg.go.dev/net/http)
labelmeの使い方

アノテーションツールであるlabelmeの使い方をメモしておきます。
実行環境：MacBook Air M1, 2020

https://github.com/wkentaro/labelme

# labelme（アノテーションツール）
https://github.com/wkentaro/labelme
https://qiita.com/omuram/items/a3be821734fd81c3ac59
https://farml1.com/yolact/
https://farml1.com/multiclass_classification/

ターミナルにてインストール
```zsh
git clone https://github.com/wkentaro/labelme.git
cd labelme
conda create -n labelme python=3.9 # 仮想環境を構築
conda activate labelme
pip install -e .
```

labelmeを起動
```zsh
conda activate labelme
labelme
```

画像データ（.jpeg）とアノテーションデータ（.json）の配置
```
labelme
└── examples
    └── semantic_segmentation
        └── train
            ├── 0001.jpeg
            ├── 0001.json
            ├── 0002.jpeg
            ├── 0002.json
            ├── 0003.jpeg
            └── 0003.json
```

labelme/examples/semantic_segmentation/labels.txtを書き換える（nameはラベル名）
```labelme/examples/semantic_segmentation/labels.txt
__ignore__
_background_
name
```

以下のコードを実行し、データセットを生成します。
```zsh
cd labelme/examples/semantic_segmentation
python labelme2voc.py train data_dataset --labels labels.txt --noobject
```

生成されたデータセットの配置
```
data_dataset
├── JPEGImages
│   ├── 0001.jpg
│   ├── 0002.jpg
│   └── 0003.jpg
├── SegmentationClass
│   ├── 0001.png
│   ├── 0002.png
│   └── 0003.png
├── SegmentationClassNpy
└── SegmentationClassVisualization
```

# 参考文献
https://github.com/wkentaro/labelme
https://qiita.com/omuram/items/a3be821734fd81c3ac59
https://farml1.com/yolact/
https://farml1.com/multiclass_classification/
英検5級レベルワイ、AIに英語を学ぶ。 ～GPT-4と一緒に英語のお勉強、しよ？✨🚀～ 【ChatGPT】【ポエム】


# 登場人物紹介🎭

- 🌟えも子🌟: ウチはえも子！オタク文化をこよなく愛し、友達思いのギャルJK✨ 毎日を楽しく過ごすのがモットーだよ💖🌈 今回は、限界MAUI集落とはちょっとバイバイして、Meくんと一緒に英語のフレーズを学びたいと思ってるんだ～📚💫

- 👦Meくん👦: コミュニケーションがちょっぴり苦手なネットオタクの男の子。よく朝までゲームしながらマイクに向かって絶叫してる🎮📖
---
🌟えも: ようこそ～💖 ウチ、えも子だよ✌️🎀 
🌟えも: 今日はMeくんと一緒にChatGPTを使って英語のフレーズ学ぶよ～😊💫

👦Me: 自慢じゃないけど英語力には自信がない。知っとる英語はggとwtfくらいやで。

🌟えも: それじゃあ、まずはChatGPTに英語で自己紹介してもらおうかな💬✨ 
🌟えも: 特に気になるフレーズがあったら、ピックアップしてみてね🔍💖

👦Me: りょ。

# 今回の目的と方法✨ 
ここだけチョットマジメ
### 目的：GPT-4と一緒に英語を勉強しよう！
GPT-4はGPT-3.5の頃に比べて、文章能力が飛躍的に向上しています。この文章能力を生かして、英語学習に利用します。
エンジニアとして活動していく中で、英語は正直避けては通れないです。昨今はGoogleページ内翻訳先生のおかげで英語残念マンな筆者もだいぶ救われてますが、やっぱりAPIリファレンスなどの技術文章は英語で読めるに越したことはないです。

ちなみに、GPT-4に比べると精度は落ちますが、無料で使えるGPT-3.5でも同様のアプローチで語学学習はできると思います。
### 方法：ChatGPTに自己紹介してもらって、そこから話を広げよう！
英語学習は、新しいフレーズや表現に触れることが成長の鍵🔑です。
この記事では、ChatGPTに英語で自己紹介してもらい、気になるフレーズを掘り下げていくことで、そこから学びを深めた体験を共有します。
ちなみに今回は、マシュマロなレスを心がけるようにチューニングした自作したGPTsを使用しています。通常のGPT-4を使っても問題なく再現できると思います。

# 実践編：ChatGPTと会話してみる
## 1.ChatGPTからの自己紹介💁‍♀️

🌟えも: ChatGPT、まずは英語で簡単に自己紹介してくれる？😊✨

🧠ChatGPT: Hey there! I'm Emo, your cheerful and witty high school gal from Japan who's all about embracing otaku culture with open arms! 🌈🎀

🌟えも:あざまる～💖。Meくん、どう？どんな意味だかわかるかな？

👦Me: 「なにもわからない」。チョットデキルとかそういう文脈じゃなくてリアルガチ。
🌟えも: 諦めたらそこで試合終了だよ？

👦Me: う～ん...
👦Me: 「Hey there」...は挨拶か？
👦Me: 「otaku」が「open arms」とか言ってるな。オタクが腕を開く？

🌟えも: うんうん、「Hey there」や「embracing otaku culture with open arms」というフレーズが気になるね🌸💭

## 2.気になる部分を解説してもらおう🙋‍♀️💬
### Q1: 「Hey there」ってどんな時に使うの？🤔

🌟えも: 「Hey there」ってどんな時に使うの～？👀✨

🧠ChatGPT: 「Hey there」はね、めっちゃカジュアルな挨拶だよ～😊✨。
🧠ChatGPT: 友達や気軽に話したい人に対して「おーい、こんにちは！」みたいな感じで使うんだ👋💖。

👦Meくん: ChatGPT、日本語で喋るとそんなんなるんか。
👦Meくん: えも子、キャラ被っとるがな...

🌟えも: 😂😂😂💖

### Q2: 「embracing otaku culture with open arms」の意味は？🧐

🌟えも: じゃあ、「embracing otaku culture with open arms」はどんな意味？📚💖

🧠ChatGPT: これは「オタク文化を全力で受け入れ、大歓迎するよ」って意味だよ😍✨。
🧠ChatGPT: 「with open arms」の部分が、心から歓迎してるって表現なんだよね🥰👏。

👦Meくん: 随分と俗っぽいAIなんやな。
# まとめだよ🔚💐
🌟えも: ChatGPTへの質問とその返答を通じて、特定のフレーズの使い方や文化的背景を深く理解できたよ😌🌟
👦Me: 「Hey there」くらいならまぁ明日からでも使えそうやな。

🌟えも: ChatGPTとの対話を通じた英語学習は、楽しくて効果的な方法だね💡🎉

👦Me: 毎度のことながらGPT-4は返答の精度が高くてビビるな。テキストで勉強するよか捗るんちゃうか？

🌟えも: これからも、いろんなフレーズを学んでいこうね！🎶💖

 **🌠おしまい🌠** 

## 宣伝
今回使用したGPTsは、↓のリンクからお試しできるようにしているよ！
語彙力Emojiマシマシ日本語ChatBot「えも子」よろしくね。
(本記事の通り、英語も喋れるよ！)

https://chat.openai.com/g/g-ueiz56taY-emojigirl-emo
CakePHP5 XServer へ公開

CakePHP5 の情報が少ないなぁと思ってたら、
PHP8.1以上が必要だったのね。。
相変わらず勢いのある開発で(笑)

composer でインストールしはじめたけど、
だんだんコマンドが面倒になって、、

一括ファイルアップをすることにしました。
まだまだ開発するから多分こっちのが早い。

# ロリポップはあきらめました
最初ロリポップ（エンタープライズ プラン）の契約に比較的余裕があったのでロリポップで公開しようとしてみました。...が

・zend.assertions を 1 にしろ っていうWarning で引っ掛かる
・php.ini は一部しか触れない。.htaccess からも設定できないものが多い
あれこれしているうちに、時間がどんどん経過。

時間の浪費が一番嫌だ！ということで、制約の少ないエックスサーバーで公開することに変更しました。

#### 2,640円/月 を 198円/月 に変更したいけど、、
また忘れちゃうからこの機会にロリポップの契約をエコノミープランに変ええようとしたら、、
#### 「ファイル数の上限に達しているため...」
変更はダメですって。
まぁでもこれは何とかなるとして、

#### 「バックアップオプションを使用中のため...」
変更はだめですって。

で、バックアップ契約を解約したところ「利用停止申請済み」？
月末まで停止はできず、翌月まで待てということらしい。

・・・永く使わせてもらったけど、
もうlolipopは空っぽにしてサヨウナラしよう。

他もいろいろあったけど、気を取り直して本題。
最短コースはこちら。

# CakePHP5 を XServer で公開、最短コース

1. XServerの管理パネルからPHP8.1以上を選択
1. XServerの管理パネルからサブドメイン作成　[サブドメインのディレクトリ]が作成される
1. public_html と同階層に cakephp5ディレクトリ作って、ファイル全部アップロード
1. [サブドメインのディレクトリ] を削除
1. [サブドメインのディレクトリ]⇒cakephp5/webroot へのシンボリックリンク作成
1. cakephp5/config/app_local.php を空にして書き込み禁止に。

数分で公開できたじゃないか。



アリガトウロリポップサマ、サヨウナラロリポップサマ。
GitHubリモートリポジトリの使い方

# 内容
GitHubのリモートリポジトリでバージョン管理する方法を復習として残します。

# to do
1. リモートリポジトリの作成
1. ssh keyのコピー
（sshキーを取得している場合。取得方法は別の箇所で書くかもしれません。）
1. ローカルリポジトリの作成：```git init --initial-branch main```(mainブランチで始まる状態で.gitを作成)
1.  コードを書く
1.  ```git add <ファイル名>```ステージングを行う
1.  ```git commit -m "コミットメッセージ"```
1.  ```git remote add <リモートリポジトリの名前> <URL>```
1.  ```git push -u origin main```