OmniAICreator/Qiita-1.07M huggingface dataset:
【第二回目/Java学習】初学者によるJava学習　基本構造について

【この記事について】
=
Javaの勉強を始めた初学者のアウトプット記事となります。
間違いなどございましたら指摘等いただけますと大変勉強になりますので
お時間あればコメントお願いいたします。

1.本日の課題
=
Java基礎構造

2.参考図書
=
スッキリわかるJava入門　第三版　

3.勉強内容：ソースコードの基本構造
=

**◉構造について：全体構造**
-

```java:Hello.java　
           //↓①クラス名"Hello"
public class Hello{　//②クラスブロック
                  //↓③メソッド名"main"
 public static void main(String() args){//④メソッドブロック名
  System.out.println("Hello World!"); 
  System.out.println("Good Morning"); 
 }//④
}//②

```
**①クラス/クラス名**
**②クラスブロック**
**③メソッド/メソッド名**
**④メソッドブロック**


●クラス：データ・処理をまとめたもの
●メソッド：内容がまとまっている処理・反復する処理などをいくつかの処理を一つにまとめたもの
参考：[クラスとは https://medium-company.com/java-%E3%82%AF%E3%83%A9%E3%82%B9/](https://medium-company.com/java-%E3%82%AF%E3%83%A9%E3%82%B9/)
参考：[メソッドについて　https://job-support.ne.jp/blog/java/howto-method](https://job-support.ne.jp/blog/java/howto-method)

:::note
**＊作成時に気をつけるポイント＊**
・クラス/メソッドブロックの始まりと終わりは必ず"{"と"}"で囲う
・クラス名の最初の文字は大文字を使用すること
・クラス名はソースファイル名と同様の名前を使用すること。
・メソッドブロック内では文末にセミコロン（;）を必ずつけること。
・インデント(字下げ)やコメント（例））「/* コメント　*/」　や　「// コメント」　）を使用して読みやすいコードを心がける
:::

**◉構造について：詳細構造**
-

<h4>1.public </h4>

他のパッケージ/クラスからのアクセスを制限する<font color= red>アクセス修飾子</font color>の一つ。
４種類のアクセス修飾子の中で一番制限がなく、どのパッケージ/クラスからでも参照することができる。

| アクセス修飾子　| 説明 |
|:-:|:-:|
| public  | どのクラスからでもアクセス可能  |
| protected  | 自分と同じパッケージに属するクラス・継承した子クラス  |
| 修飾子なし  | 自分と同じパッケージに属するクラス  |
| private  | 自分自身のクラスのみ  |


<h4>2.static </h4>

静止メソッドと呼ばれる。
staticが使用されていないメソッド（インスタンスメソッド）では"new"を用いてインスタンスを作成する必要があるが
staticを使用することでインスタンスを作成せずメソッドを呼び出すことができるようになる

例）
◯メソッドにstaticがある場合
↓
```java:Hello.java(メソッド記述class:staticあり)
public class Hello{
 public static void stMethod(){//staticあり
 }
}
```
```java:Main.java（staticあり）
public class Main{
 public static void main(string[] args){
  Hello.stMethod();//インスタンスを作成しないため、１行で済む
 }
}
```
◯メソッドにstaticがない場合
↓
```java:Hello.java(メソッド記述class：staticなし)
public class Hello{
 public void method(){//インスタンスなし
 }
}
```
```java:Main.java（staticなし）
public class Main{
 public static void main(String[] args){
  Hello noStatic = new.Hello();//インスタンスの新規作成　
  noStatic.method();//メソッドの呼び出し
 }
}
```
参考：[Javaのstaticメソッド・static変数を解説！　https://www.tech-teacher.jp/blog/java-static/](https://www.tech-teacher.jp/blog/java-static/)

<h4>３.void </h4>

戻り値の型の一つ。戻り値には何も戻さない場合に使用する。
戻り値とは呼び出されたメソッドから、呼び出し元のメソッドへ返す値のこと。
戻り値が発生する場合はメソッド内にコードを機銃した後、`return　戻り値;`を記述する必要がある。

| 戻り値の型 | 説明 |
|:-:|:-:|
| int  | 整数を返す場合  |
| String  | 文字列を返す場合  |
| void  | 何も戻さない  |

例)String型
```java:Hello.java
public class Hello{
	 String name;
	 public static String Hey(String name){
	   System.out.println( name + "さん、こんにちは");
	   return name;
	 }
}
```
```java:Main.java
public class Main{
 public static void main(string[] args){
  String name = Hello.Hey("太郎");
 }
}

```
【React】そもそもReactとは？

# はじめに
現在自己学習でReactを学習しています。
技術の基本について説明することができずに学習を続けていても効率が悪いと感じたので、記事にアウトプットすることで理解を深めたいと思い本記事を投稿しました。

# 対象読者
- Reactをこれから知ろうとしている人
- Reactを学び始めたが何ができるかよくわかっていない人

# 基本情報
ReactはUIを構築するためのJavaScriptライブラリとして、Meta社(旧Facebook社)によって開発されました。

UI(User Interface)とは、Wikipediaでは以下のように説明されています。

> 機械、特にコンピュータとその機械の利用者（通常は人間）の間での情報をやりとりするためのインタフェースである。

Webアプリにおいてはサイトのデザイン・フォントなどのユーザーの視界に触れる情報のことであり、ReactではこれをVanilla JS(素のJavaScript)より効率的かつ柔軟に記述できるようになっています。

# 得意なこと
## リッチなWebアプリを手軽に記述できる
現代のWebアプリでは、FacebookやTwitterのように現在のページに最新情報を追加で読み込んだり、各種サイトの登録画面でIDを入力する際に一意であることを入力中にチェックしたりと、複雑な操作を行うものが多く存在します。

Vanilla JSでも実装は可能ではありますが、作成難易度が高く、コードがあちこちに散らばってしまい可読性の低いコードとなってしまいます。

Reactでは、UIの中でもボタンや文字列等の細かい部品単位で切り分けレゴブロックのように組み立てることによって、やがてはユーザー情報、やがては記事全体の様にWebページを作る```コンポーネント```という仕組みを持っています。

コンポーネントを使うことによって宣言的な記述ができるので、複雑な操作でも手軽に可読性の高いコードを書くことができるのです。

:::note info
宣言的(Declarative)とは?
対義語は命令的(Imperative)とのことで、"いちいち細かく指示をする"といったニュアンスがあります。
それと比べ、宣言的は細かい指示をせずに目的だけを示すといった意味になります。
例えばコーヒーを注文する時に、器具や淹れ方を指定せずともコーヒー(目的)を注文できるといった状態なのです。
:::

## ページ上の操作が高速
Reactには、ページの一部を更新する時に前回の表示から変更となった部分のみを検知して更新することができます。
ページの一部を変更するにも、ページ全体のリロードを挟んでしまうと処理が重く更新に時間がかかってしまいます。
この仕組みを使えば、変更したい一部の部分だけ瞬時に変えることができるので処理を高速で行うことができます。

## SPAの作成を行うことができる
SPA(Single Page Application)とは、最初に読み込んだページだけで操作や画面遷移が行える、まるでネイティブアプリ(スマホアプリの様なイメージ)の様に操作することができるWebアプリのことを指します。
なんらかの操作をするにしても画面遷移を行うにしてもスムーズに動作するので、ユーザーのストレスが溜まりづらくなります。
こちらの仕組みは、読み込み処理が最初しか行われず、画面遷移も既に読み込んでいる情報を描画することによって実現しています。
Reactでは、先に述べたようにページの一部のみを更新することを得意としています。この仕組みがSPAを構築する上で重要となってくるため、SPA開発にReactが選ばれやすくなっています。

# 使われているWebサイト
FacebookやInstagram、Twitter、Slack等、様々な有名サイトがReactを採用して作られています。
WebサイトにReactが採用されているかはGoogle Chromeの拡張機能、
[React Developer Tools](https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=ja)を使うことで確認することができるので、みなさんも是非様々なWebサイトを確認してみてください。

# おわりに
Reactの基本についてイメージできたでしょうか。
これからReactを始める人や、Reactを深く知りたい人にとって理解の助けになれば幸いです。
最後まで記事を読んでいただきありがとうございました。

# 参考サイト
[React公式サイト](https://ja.reactjs.org)
[React を深く知るための入り口](https://zenn.dev/panda_program/articles/deep-dive-into-react)
[宣言的？ Declarative?どういうこと？](https://qiita.com/Hiroyuki_OSAKI/items/f3f88ae535550e95389d)
[WebサイトにReactが使われているか確認する](https://blog.zatsuzen.com/posts/react_check-react)
【Ruby on Rails】enumの導入・日本語表記の方法

# 開発環境
Rails 6.1.4
ruby 2.6.3

# 目次
- gemを導入
- enumを定義する
- enumの日本語化
- enumの紐づけ
- 確認

## gemを導入
まずはgemを導入します。

```ruby:Gemfile
gem "enum_help"
```   
記述後、enum_help をインストールするために `bundle install`を行いましょう。 

```ruby:ターミナル
$ bundle install
``` 

## enumを定義する

gem導入後、実際にenumを定義し、数値と文字列を紐付けします。
今回は数値と文字列を紐づける流れを、支払い方法のクレジットカード・銀行振込を例に解説します。

モデルは`Orderモデル`で定義します。

```ruby:Order.rb
enum payment_method: { credit_card: 0, transfer: 1 }
``` 

## enumの日本語化

先ほど定義したenumを日本語化します。


```ruby:config/application.rb
config.i18n.default_locale = :ja
  config.i18n.load_path += Dir[Rails.root.join('config/locales/*.yml').to_s]
``` 
この記述により、Rails アプリケーションのデフォルトの言語が日本語となります。
ただこれだけでは定義したenumを日本語化することはできず、
定義したenumと日本語を紐づける作業が必要になります。

## enumの紐づけ

それでは、定義したenumと日本語を紐づけます。
config/localesフォルダに`ja.yml`というファイルに次のように記述します。

```ruby:book.rb
 ja:
    enums:
      order:
        payment_method:
          credit_card: "クレジットカード"
          transfer: "銀行振込"
``` 

## 確認

最後に、定義したものが日本語で呼び出せるかを確認していきます。

```ruby:ターミナル
$ rails c 
$ Order.payment_methods_i18n[:credit_card] #credit_cardのenumを呼びだす
$ Order.payment_methods_i18n[:transfer] #transferのenumを呼びだす
```
呼び出すと、下記のようになるかと思います。
日本語に変換できていますね！

![enum_call_i18n-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730324/8ebef24e-5a4f-e669-d7d0-d09a755a4225.png)


これで完成です！お疲れ様でした！
あくまで備忘録なので足りない説明等多々あるかと思います。
行き詰まった際の助けになれば幸いです。
AdobeXDで若干レイアウトの異なる似た要素を複数配置する場合

# 似た項目の配置
xdで作業する際に添付動画のように作業していた。
![Animation1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615451/762f38ca-aaa9-35d6-46fa-469d15abaf8c.gif)
①要素をコピーして貼り付け
②貼り付けた要素のサイズや座標を数字で直接入力して調整

非効率だなと思い調べるとリピートグリッド使って配置すればいいじゃんと思ったが、以下の添付画像のように若干レイアウトが異なる場合にどうすればよいか考えた。
![スクリーンショット 2022-07-19 224142.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615451/6013ca05-a36c-6804-8007-8893b85eaadb.png)

下記の添付動画の様に、一度リピートグリッドでオブジェクトを大量に複製し、
個別で操作することで、オブジェクトの複製部分を楽に操作するようにした。
![Animation2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615451/0da97a1b-da3c-3026-da77-4fe31dd82528.gif)
「このページを印刷する」ボタンを作ってみた

## 「このページを印刷する」ボタン
![BF4C7F70-754C-4AC3-974C-D1E63F912190.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740290/3438462a-f220-9c40-4ee2-5962544bd85d.jpeg)
こんな感じのボタン。

## コード
```html
<input type="button" value="このページを印刷する" onclick="window.print();">
```
単純。```onclick```に```window.print();```をつけてあげればいいだけです。
aタグとかにもつけられます。
マンダラートでアイデア量産

## はじめに
「なんかアイデア出してー」
「意見ある人〜？」
と言われた時に、すぐに発言できますか？

<font color="Red">そんな簡単にアイデアなんかでねぇよ</font>と思ったあなたには**マンダラート**がおすすめです。

この記事では、短時間でアイデアを量産できるフレームワークであるマンダラートについて解説します。

## 対象者
この記事は下記のような人を対象にしています。

- 駆け出しエンジニア
- プログラミング初学者
- アイデアが出なくて困っている人

## 結論
マンダラートを使えば、短時間でフワッとした目標が、**具体的な64個の具体的なアイデアに変化します！**

## マンダラートとは
マンダラートとは、仏教の曼荼羅(マンダラ)の模様に似ているため、命名されたアイデア発想フレームワークです。
マンダラチャートとも呼ばれています。

ふんわりした目標しかなかったとしても、短時間で具体的な行動のアイデアに落とし込むことができます。
大リーグで活躍中の**大谷翔平選手**が、高校生時代に**ドラフト1位で8球団から指名される**と言う目標を掲げてマンダラートを活用したことでも有名です。

さて、ではマンダラートの具体的な作成方法を解説します！

## STEP1 目標とアイデア8つを書く
まずは、中心に目標やアイデアを出したい対象を書きましょう。

目標を設定する際にはSMARTを意識すると良いでしょう。

https://qiita.com/YutaManaka/items/e6b31aa13f5fd90bb2f5

目標が書けたら、その周囲の8マスに、それを達成するための具体的な行動を書き出しましょう。
「1年でプログラマー転職したい」という目標を例に書いてみました。

![マンダラート1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2157342/6f5b1830-b584-cd1e-b55c-bd6e9ebf2d4d.png)


## STEP2 8つのアイデアを周囲の8マスに書く
次に、8つのアイデアを、周囲に書き写します。

![マンダラート2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2157342/46a84c9f-826c-e08e-d07e-47c090baca13.png)

## STEP3 さらに周囲にアイデアを8こずつ書く
それぞれの中心にあるアイデアを達成するための具体的アイデアを8つずつ、書いていきます。

転職のアイデアは下記のような感じになりました。

![マンダラート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2157342/19a04feb-89db-1a48-2d2f-77c49870f414.png)

このように、短時間で64個も具体的なアイデアが出せました！
もし、「8つのアイデアを出すのも難しい」と言うあなたはオズボーンのチェックリストやSCAMPERを活用しましょう。

https://qiita.com/YutaManaka/items/89ea6ef41a25ef925c35

また、大量に出たアイデアを取捨選択する場合はペイオフマトリクスが有効です。

https://qiita.com/YutaManaka/items/26f8d142d5d2f3eef459


## おわりに
アイデアを大量に作成するマンダラートについてまとめました。
PLATEAU 


資料ライブラリ
https://www.mlit.go.jp/plateau/libraries/

PLATEAU Open Data List
https://www.mlit.go.jp/plateau/opendata/

3D都市モデル（Project PLATEAU）ポータルサイト
https://www.geospatial.jp/ckan/dataset/plateau

ソース
https://github.com/Project-PLATEAU

[Unity] モデルをマスクするボックスを作るシェーダ
 -> 透明で奥の物を隠すシェーダー
https://qiita.com/edo_m18/items/133395d1e127a2133181

GeospatialAPIとPLATEAUで実写合成してみた
https://www.docswell.com/s/kitposition/ZM32GK-2022-06-05-174216#p8


＠Immersal×PLATEAUで巨大AR
　→　わりと参考になりそう。
https://gaprot.jp/2021/05/12/immersal-plateau/
LT開いてみた

# LT開いてみた

みなさん初めましてサモンと申します。今回少し前ですがLTを開催したので、その時の事を書いていきたいと思います。LTを開催しようとしている方は是非ご参考にどうぞ。

## 開催前
### 開催前に用意したもの
開催をするにあたって、前提条件、使用ツールを全て決定しておく必要があります。
今回使用してツールとして、人を募集するサイトにConnpassを使用し、実際に開催する会場をZOOMにしました。
この時点で私が決めていたのは、LTの「テーマ」（今回はゆるっとにしました）日付、人数、時間、1人あたりの時間の5つです。

### Point!
LTはよくZOOMで開かれがちですが、無料のまま使用していると40分で切られるので注意する必要があります。
## 募集中
### 全然集まらない…
私は開催1ヶ月半ほど前から募集を行いました。しかし初めはとにかく人が集まりませんでした。このような、イベントなどを開くなど人を集める事が必要な場合、ネットだけで集めることは初めは難しいというのを、どこかのブログで読んだ記憶があったため、それを元に大学の友人を5人ほど誘ったところ2人参加してくれることになました。
### 集まり出した!
友人に声をかけたにより、友人がツイートしてくれたりリツイートをしてくれました。これにより別の大学の友人1人が参加してくれる事になりました。またTwitterのDMで仲良くしている人、工業高校時代の友人30人にDMを送りましたが1週間前の送信になってしまったため、全敗となってしまいました。
### 直前にも応募が…
Connpassからの応募が1件もありませんでしたが、開催5分前にConnpassからの参加申し込みが1人おりました。その方は、毎日の様にLTに参加していたため、初めからその様な人にアプローチしてもよかったかなと思いました。
### Point!
直前の声かけはよくありません。これにつきます2週間前までには集めないと断られる確率が格段に上がりました。

## 開催直前
開催直前に行った作業は一時前ほどから以下の確認作業を行いました。
### Zoom確認
ZOOMの画面共有、権限付与の確認、チャットのONの作業を行いました。

### 台本用意
司会用の台本を用意しました。
用意した台本として、初めの挨拶、終わりの挨拶（次回告知）、回す用の文言を用意しました。

## 開催
### 緊張…
実際に開催したところ、時間になっても今まで参加したLTとは違い、第一声を出さなければいけないため、かなり緊張し一瞬声が出なくなりました……

## 開催後
### 想定より早い
想定より交代する時間などの司会の時間は短く収まってしまい、LT登壇者の時間に回した方がよかったと思いました。
### 次回ページへ誘導
Compassの機能として、前回のイベントの文章をコピーできるため、コピーし日付を変更し一斉メールの告知、Twitterの告知、LT最後の告知を行いました。そうしたところ、Connpassからの参加者がすぐに参加登録してくれたため、すぐに告知を行う必要があります。
## まとめ
初めは人が集まらないため、友人を誘う必要があります。また、仲が良い人であれば、リンクを送り「こんなのをやるのだけどどうですか」と送るだけで反応がありました。また第二回の告知ページを作り思った事として、人が集まっているところには人は集まり、友人以外の、告知ページやTwitterから参加してくれる人（面識なし）はリターン率が高いように感じました。
Laravel:EloquentでgetしたCollectionから特定のキーのみ取得する(重複排除)

### 前提

以下のようなUsersテーブルがあるとする

|  id  |  company_id  | name |
| :----: | :----: | :----: |
|  1  |  1  | aaa  | 
|  2  |  2  |  bbb  |
|  3  |  3  |  ccc | 
|  4  |  1  |  ddd  |
|  5  |  2  | eee  | 

上記から既に全データを取得しているとする
`$users = User::get();`

### Collectionから特定のキーのみ取得する(重複排除)方法

$usersから会社idだけ取り出したい(重複排除)場合、以下のようにする

`$companyIds = $users->pluck('company_id')->unique();`
CSVからNeo4jデータ作成

三つのファイル
1．CSVファイル：Neo4jCreateCSV.csv
例：
　sNameA, nNo,sNameZ
　TestA,1,TestZ

2．TXTファイル：Neo4jCreateTXT.txt

　NodeA-Relation-NodeZ

例：
LOAD CSV WITH HEADERS FROM 'file:///Neo4jCreateCSV.csv' AS line
MERGE (a:NodeA{
	　sNameA : line.sNameA})
MERGE (z:NodeZ{
	　sNameZ : line.sNameZ})
MERGE (a)-[:Relation{
	　sNameA : line.sNameA,
	　nNo : toInt(line.nNo)
	　sNameZ : line.sNameZ	 
}]->(z);

3．SHELLファイル：Neo4jCreateSHELL.sh

例：
```
#!/bin/sh
# neo4jへのデータロードシェル
NEO4J_BASE=/whj/neo4j/
NEO4J_SHELL=$NEO4J_BASE/bin/neo4j-shell
NEO4J_HOST=localhost
NEO4J_PORT=11103
SH_BASE=/whj/SHELL/USR/neo4j_loader_batch
LOAD_COMMAND_FILE=$SH_BASE/Neo4jCreateTXT.txt

#load csv
echo $NEO4J_SHELL -host $NEO4J_HOST -port $NEO4J_PORT -file $LOAD_COMMAND_FILE
$NEO4J_SHELL -host $NEO4J_HOST -port $NEO4J_PORT -file $LOAD_COMMAND_FILE
```
ステップ１
 2と3のファイルを「/whj/SHELL/USR/neo4j_loader_batch」にアップロード
 権限修正：ファイル右クリック->property->0774
ステップ２
 1のファイルをサーバーにアップロード
ステップ３
 TeraTermでログイン、cd /whj/SHELL/USR/neo4j_loader_batch
 ./Neo4jCreateSHELL.sh シェルを実行
【#34 エンジニア転職学習】ネットワーク関連の単語

# はじめに
富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。

使用しているGoのUdemy教材後半部分である、
Webアプリ作成演習を学習していきます。

バックエンドエンジニアになるまでの学習内容は以前投稿した以下の記事を基にしています。


https://qiita.com/Chika110/items/ef54dddd565a0193ef44

# 本日の学習内容
本日もGoのWeb作成講座を進めました。
その中でネットワーク関連の分からない単語を調べたり、Goの講座で飛ばしていた部分に戻ったりが中心の日でした。

* API実装準備
* **ネットワーク関連の単語調べ　<--Topics!**
* ioutil / json

# ネットワーク関連の単語
以下解説等で出てきた単語で理解できていなかったものになります。
#### キャッシュ
ブラウザが一度表示したWebページのデータを保存しておいて、次に同じページを表示する際に、1回目より早く表示してくれる仕組みのこと。
#### リダイレクト
URL転送とも呼ばれ、2つ以上のURLアドレスを与える技術。
サイト構成を変更した後も外部リンクを機能させるためなどに使用される。
#### URI
URL（Web上の住所）とURN（Web上の名前）の総称。
#### エンドポイント
APIにアクセスするためのURIのこと。
⇔エントリポイント（アクセスされる側から見た実行開始場所）


##### 使用している教材はこちら↓


https://www.udemy.com/course/go-fintech/


# おわりに
最後までお読みいただきありがとうございました。
アドバイス・応援コメント等いただけますと幸いです。
【Win32API】ShowWindow をイイカンジに定義して使う


# Win32API をイイカンジに使いたい

## 定義

`ShowWindow` を VBAで定義するとこんな感じになる。

```vb
Private Declare PtrSafe Function ShowWindow Lib "user32" (ByVal hwnd As LongPtr, ByVal nCmdShow As LongPtr) As LongPtr
Private Const SW_SHOWNORMAL    As Integer = 1
Private Const SW_SHOWMINIMIZED As Integer = 2
Private Const SW_SHOWMAXIMIZED As Integer = 3
```

## 使いやすくする

このままでは使いにくいので使いやすいようにラップする。heyYo

```vb
Private Declare PtrSafe Function ShowWindow Lib "user32" (ByVal hwnd As LongPtr, ByVal nCmdShow As LongPtr) As LongPtr
Private Const SW_SHOWNORMAL    As Integer = 1
Private Const SW_SHOWMINIMIZED As Integer = 2
Private Const SW_SHOWMAXIMIZED As Integer = 3

Public Sub ShowWindowNormal()
  Call ShowWindow(Application.hwnd, SW_SHOWNORMAL)
End Sub

Public Sub ShowWindowMin()
  Call ShowWindow(Application.hwnd, SW_SHOWMINIMIZED)
End Sub

Public Sub ShowWindowMax()
  Call ShowWindow(Application.hwnd, SW_SHOWMAXIMIZED)
End Sub
```
【AccessVBA】AccessのRecordsetを Excel のListObject に変換するVBAを書いた

# Recordset を Excel のListObject に変換するVBAを書いた

## サンプルコード

Microsoft Access のレコードセットオブジェクトをExcelのListObject に変換する。
`Entry`関数を実行することで変換する。

```vb

Option Compare Database
Option Explicit

Private gBaseFolder As String

Public Sub Entry()
  '
  gBaseFolder = CurrentProject.Path & "\"
  
  Dim strFileName As String

  '--- ファイル名定義 ---
  strFileName = "出力" & Format(Now, "yyyymmddhhmmss") & ".xlsx"
  
  Call RecordsetToExcelListObj(strFileName, "テーブル名", "リストオブジェクト名")

End Sub

' Recordset を Excelファイルに出力
Public Sub RecordsetToExcelListObj(strFileName As String, TableName As String, ListObjName As String)

  
  Dim objExcel    As Excel.Application
  Dim RS          As DAO.Recordset
  Dim rs_cnt      As Integer

  '--- Excel出力 ---
  
  Set objExcel = New Excel.Application
  
  Set RS = CurrentDb.OpenRecordset(TableName)
  
  With objExcel
    .DisplayAlerts = False
    .Workbooks.Add
    .ActiveWorkbook.SaveAs FileName:=gBaseFolder & strFileName, ReadOnlyRecommended:=False
    .Workbooks.Open (gBaseFolder & strFileName)
    .ActiveWorkbook.ActiveSheet.Name = ListObjName
    
    'データ出力
    ' ヘッダを書き出し
    For rs_cnt = 1 To RS.Fields.Count
      .Cells(1, rs_cnt) = RS.Fields(rs_cnt - 1).Name
    Next
    
    .ActiveSheet.ListObjects.Add(xlSrcRange, _
    .ActiveSheet.Range(.ActiveSheet.Cells(1, 1), _
    .ActiveSheet.Cells(1, RS.Fields.Count)), , xlYes).Name = RS.Name
    
    .Cells(2, 1).CopyFromRecordset RS
    .Cells(1, 1).Select
    .ActiveWorkbook.SaveAs FileName:=gBaseFolder & strFileName, ReadOnlyRecommended:=True
    .ActiveWorkbook.Close SaveChanges:=False
    .Quit
    .DisplayAlerts = True
  
  End With
  
  RS.Close

  Set objExcel = Nothing
End Sub
```
【PS1】パターン全網羅作成

### 参考(引用)
> https://www.shegolab.jp/entry/windows-cross-join#shegolab-crossjoin-02
https://qiita.com/ponsuke0531/items/4629626a3e84bcd9398f

> 入力ファイルと出力ファイルのエンコーディングは BOM なしの UTF-8 です。
入力ファイルの１行目はヘッダー行とみなし読み飛ばされますので、出力には含まれません。
出力ファイル名はとりあえず [スクリプト名].out.txt の固定で、都度上書きされます。

エクスプローラのファイルパスに`powershell`と入力して実行

#### 【使い方】
> フォルダを一つ新規作成して開きます
上記バッチスクリプトを BAT ファイル（.bat）としてそのフォルダに保存します
ファイル名は任意ですが、拡張子（ファイル名の最後）を 「.bat」としてください
組み合わせたいリストをそれぞれテキストファイル（.txt）として同フォルダに保存します
先頭行から１行１項目とします（見出し行なし）
フォルダでコマンドプロンプトを開きます
フォルダウィンドウの上部にあるアドレスバーに cmd と入力してEnterを押すと、フォルダのパスでコマンドプロンプト（文字だけの黒いウィンドウ）を開けます
コマンドプロンプトでバッチファイルを実行します
各ファイルの項目の組み合わせデータがカンマ区切りで出力されます
以下のような使い方を想定しています。


```PowerShell
$scriptName = $MyInvocation.MyCommand.Name
if ($args.Count -eq 0) {
    echo "Usage: ${scriptName} FILE1 FILE2 ..."
    exit
}

$gInputLists = @()   #ファイルから読み込まれた複数リストの配列
$gOutputLines = @()  # 出力行の配列

function crossjoin {
    param($line, $listIdx, $lineNum)
    if ($listIdx -gt 0) {
        foreach($item in $gInputLists[$listIdx]) {
            $lineNum = crossjoin ([string]::concat($line,",",$item)) ($listIdx-1) $lineNum
        }
    } else {
        foreach($item in $gInputLists[$listIdx]) {
            $gOutputLines[$lineNum] = [string]::concat($line.substring(1),",",$item)
            $lineNum += 1
        }            
    }
    $lineNum
}

$gInputLists = foreach($file in $args) {
    ,(cat $file -Encoding UTF8 | select -Skip 1 )
}

$totalLineCount = $gInputlists|%{$a=1}{$a*=$_.Count}{$a}
$gOutputLines = @("") * $totalLineCount

crossjoin "" ($gInputlists.Count-1) 0 | Out-Null

$result = $gOutputLines -join "`r`n"
[System.IO.File]::WriteAllText(".\${scriptName}.out.txt", $result) # BOMなしUTF-8出力
```
Docker投稿記事のまとめ

## Docker投稿記事のまとめ
*Docker原稿のまとめリンクを記載*

:::note info
Dockerコンテナを自由に構築して使えたら便利だなぁというテーマの記事:relaxed:
1コンテナ1プロセス？なにそれ美味しいの？
「Docker Compose」「Docker Desktop」は使ったら負けだと思っている。
:::

---
### ■Docker基本編
*基本編の１〜５でDockerのイメージ、コンテナ作成、編集、保存の基本に触れる！*
*各記事コマンド実行の証跡付き*

#### [1.Docker環境確認](https://qiita.com/anlair/items/377789bf207680f359cb "Docker環境確認")

#### [2.Dockerイメージ導入・削除](https://qiita.com/anlair/items/f5e5e203966cde122c7c "Dockerイメージ導入・削除")

#### [3.Dockerコンテナの作成〜起動〜利用〜停止〜削除](https://qiita.com/anlair/items/3f62f9861f169c8903a8 "Dockerコンテナの作成〜起動〜利用〜停止〜削除")

#### [4.Dockerコンテナのネットワーク確認〜作成〜所属〜削除](https://qiita.com/anlair/items/63ee4b19ae5c609aa92f "Dockerコンテナのネットワーク確認〜作成〜所属〜削除")

#### [5.Dockerコンテナ↔Dockerイメージ↔バックアップファイル（バックアップ・リストア）](https://qiita.com/anlair/items/220ab8ad79a778bc1737 "Dockerコンテナ↔Dockerイメージ↔バックアップファイル")

---
### ■Docker実践編
#### [1.Dockerイメージ導入（ubuntu）〜コンテナへのssh接続（自動サービス起動）編](https://qiita.com/anlair/items/0f9239895c092ae0a433 "Dockerイメージ導入（ubuntu）〜ssh接続（自動サービス起動）")

#### [2.Dockerファイルを利用したSSHサーバ構築](https://qiita.com/anlair/items/a12b291d5342421a5650)

#### 3．DockerコンテナWEBサーバ↔DBサーバ接続編（掲載予定）

---
### ★Docker記事リンク（投稿記事以外）
[DockerでRedmine起動](https://glodia.jp/blog/11799/ "DockerでRedmineを簡単&スピード構築！")
Nuxtでmoutedでメソッドが発火しなかった時の対処法

## moutedのタイミングで、methodsを発火させようとするとエラーが発生！
```
TypeError: Cannot read properties of undefined (reading 'classList')
```

どうやらクラス属性が読み込めていないようだが、DOMを作成後なので操作できるはず。
ライブラリを読み込めていないときもこの方式で、導入することができる。

## 元のコード
```
  mounted() {
    this.openErrorUploadModal()
  },
```
※　モーダルを立ち上げるためにDOM操作をしている。

## 対処法
```
  mounted() {
     setTimeout(() => {
       this.openErrorUploadModal()
     }, 0)
  },
```

※　setTimeOutを0秒に設定して実行すると同じはずなのに問題なく動作した。
参考までにNuxtは画面の変更を非同期で行っているようであるが、それが原因なのであろうか?

[v2.x 以前のドキュメント非同期更新キュー](https://jp.vuejs.org/v2/guide/reactivity.html#%E9%9D%9E%E5%90%8C%E6%9C%9F%E6%9B%B4%E6%96%B0%E3%82%AD%E3%83%A5%E3%83%BC)
必須栄養素カンタン計算ツールを作りました～育児・健康・ダイエット等へ～

# はじめに
筋トレや健康、ダイエットを考えながら自炊をしたり、子どものための食事を作っていると、「何とかレシピを調べながら料理を作ることはできてきたけど、果たして栄養素は十分に取れているのだろうか？」と疑問に思ってくることはないでしょうか。私はあります。
そこで「必須栄養素」等と検索したり、本を読んでみたりすると、想像以上に必要な栄養素があることに気づくでしょう（私は以下略）。それぞれ栄養素の働きを勉強してみたり、豊富に含まれる食材を調べてみたりしてみましたが、種類が多すぎてとてもじゃないですが覚えられません。
巷には「必須栄養素に配慮したレシピ提案」的なアプリもたくさんありますが、本当に補えているのかわかりませんし、そもそも子どもがいる家庭では「これはうちの子は絶対食べんな」というレシピが提案されてやる気が失われたりします（私以下略）
というわけで、食材を選ぶだけで必須栄養素を計算し、その日のレシピや献立の栄養を簡単に計算できるツールをGoogle スプレッドシートを使って作成してみました。自炊をレベルアップさせたい方や子どものための栄養バランスに頭を悩ませている方、ダイエット中の方等に是非活用していただければと思います！
（noteにも同内容で投稿したのですが、一応技術っぽい話題でもあるのでこちらにも・・）

# ツールの紹介

[こちらのGoogleスプレッドシート](https://docs.google.com/spreadsheets/d/1ZCP-ORivxYdAcRwgd1qf2SQtpB_lBWWKLvq-SzpkckI/edit?usp=sharing)をマイドライブへコピーしてお使いください。ざっくりと機能をご紹介すると、、、

## ①食品・グラム数を選択すると栄養素を自動で計算
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606134/8d6a0c2e-1eb0-34e1-391a-2ef0f19bf941.png "食品選択画面")

「検索ワード」にキーワードを指定、「候補食品名」から候補を選択して、「g数」を指定すると、対応した栄養素量を自動で計算します。[文科省の「日本食品標準成分表2020年版（八訂）」のデータ](https://www.mext.go.jp/a_menu/syokuhinseibun/mext_01110.html)を引用しています。複数の食材を選択すると、自動で足し算してくれます。

## ②合計栄養素の一日の必要量に対する充足率をグラフで確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606134/2e884bf7-8d98-d074-7565-8fbcb16bb133.png "栄養素充足率をグラフで表示")

別シートに移ると、先ほど選択した栄養素の合計が一日の摂取基準をどの程度満たしているのかをグラフで確認できます。
ここで栄養素には、摂取量の上限が設定されているものもありまして、その場合は赤色のグラフで上限に対する割合を表示しています。（余談ですが、鉄分が足りない！と思って鶏レバーを大量に食べようとするとビタミンAの値が上限値をやばいぐらい上回って恐怖することになります）
こちらの摂取基準については[厚労省の「日本人の食事摂取基準」（2020年版）のデータ](https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/kenkou_iryou/kenkou/eiyou/syokuji_kijyun.html)を、[有志の方がcsvで公開](https://github.com/Biscuit01/Dietary-Reference-Intakes-for-Japanese-2020-csv)してくれておりますのでそちらのデータを利用しております（Biscuit01さん　超絶感謝です）。
なお、公開しているスプレッドシートでは30～49才男性の値を使用していますが、「食事摂取基準_必要分」シートの値を変更することで別の年代の値に変更したり、複数名分を合計したりできます。実際私は4人家族分の栄養計算のため、配偶者＋子供二人分を合計して使用しています。（余談ですが学校や保育園給食では一日の基準の1/3を目安に栄養計算しているそうなので、その辺を引き算したりして使用しています）
さらに超余談ですが、成分表と摂取基準がそれぞれ別の省で作成されているため（それ自体変な感じですが）、そのせいで[項目の解釈で現場に混乱が生じている](https://eiyo21.com/blog/fd_ss1/)等、縦割りの弊害をこんなところに見出してしまいます。。。

## ③不足栄養素を補える食材を検索
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606134/dfca737e-3ad8-afb4-9fc3-561efc8a0ca6.png)

3番目のシートでは、各栄養素ごとに「1日の必要栄養素のうち○％を満たす食材」という指定で検索ができるようにしてあります。栄養計算をしていると「マグネシウムってどの食材にたくさん入ってるんだ？」みたいなことを頻繁に考えることになるのでこちらのシートを作成しました。
個人的にはビタミン系が不足しがちです。

以上、ざっくりと機能を紹介しました。ここまで読んでいただいて興味を持っていただいた方は、ぜひシートをコピーして使ってみていただければと思います。基本的には「食事摂取基準_必要分」シートにあなた自身のデータを入れて、「栄養計算シート」シートに食材・グラム数を入れればOKです。よくわからない・こんな機能も追加してほしい等ありましたらお気軽にコメントください！（もしかしたら別記事で補足するかもです）
技術的な興味もあり、不足栄養を最適に満たせるレシピの自動提案、みたいな機能が作れたらなーとか妄想しています（楽天レシピのAPI使えばできそうかも？）、アドバイスください！

# 所感など

栄養素を気にしながらレシピや献立を考えていると、家庭科の授業や保育園のポスター等で嫌ほど見る（そして興味をそそらない）文言の重要性が理解できます。。。例えば

- 「野菜を食べましょう」→意外とカルシウム取るのに野菜が重要、水菜はすごい。あと食物繊維マジ足りない。ジャガイモは神
- 「肉だけじゃなく魚も食べましょう」→ビタミンDクリアするのに魚マジ大事やで
- 「朝のフルーツは大事です」→ビタミンC全然足りん！いちご！
- 「まごわやさしい」→結果的にそうなるわ
青空文庫内の小説を全ダウンロードして解析用にきれいにする

# はじめに



青空文庫のWebページはありがたいことに小説を含む全ページのソースがgithub上に公開されています．
しかしそのままデータを用いようとすると，ルビがあったりエンコーディングがshift-jisだったりで少し使いづらいです．
そこで青空文庫のレポジトリ内部のデータをパースして以下のような形式で保存することを行なったのでその手順について備忘録として書こうと思います．


```
novels
├── 芥川龍之介
│   ├── 河童
│   ├── 蜘蛛の糸
├── 坂口安吾
│   ├── 白痴

```

突然ですが[twitter](https://twitter.com/mahiiiki)良かったらフォローしていただけると嬉しいです🐦


# 使ったもの
- mac
- python3

# 小説データの保存手順

まず青空文庫のレポジトリをクローンしてきます．



[https://github.com/aozorabunko/aozorabunko:embed:cite]


```
git clone git@github.com:aozorabunko/aozorabunko.git
```

クローンしてきたレポジトリに移動すると色々入っていますが，小説データなどは./aozorabunko/cards の中に入っています．

cards内のファイルをパースする前にエンコーディングを全てshift-jisからutf-8に変更します．

```
find cards -name '*.html' -exec nkf -w --overwrite {} \;
```

自分は全て上書きしてしまいましたが，文字化けで見れなくなるので別のところに保存した方がいいかもしれません．

次にcards内の小説データを全てパースします．自分はpythonとbeautiful soupを用いました．
主に小説のhtmlデータから著者，タイトル，メインテキストを取り出し，ルビを取り除いて保存するということを行なっています．
自分以外の環境で動くかはわかりませんが使用したコードは以下です．


```python:aozora_parser.py
from bs4 import BeautifulSoup as bs
import numpy as np

import re, sys, os

def make_dir(dir_name):
    if not os.path.exists(dir_name):
        os.mkdir(dir_name)

def save_novel(file_path, text):
    if not os.path.exists(file_path):
        print('saved', file_path)
        with open(file_path, 'w') as f:
            f.write(text)

if __name__ == '__main__':
    pass

    cards = os.listdir('./cards')

    for card in cards:
        if card.isdecimal() and os.path.exists('./cards/' + card + '/files'):
            novels = os.listdir('./cards/' + card + '/files')
            for novel in novels:

                if novel[-4:] == 'html':
                    with open('./cards/' + card + '/files/' + novel, 'r') as f:
                        novel_page_html = f.read()
                        novel_parsed = bs(novel_page_html, 'html.parser')
                        try:
                            for rt in novel_parsed('rt'):
                                rt.decompose()
                            for rp in novel_parsed('rp'):
                                rp.decompose()
                        except AttributeError as err:
                            print(err)
                        novel_title = novel_parsed.find('h1', class_='title')
                        novel_author = novel_parsed.find('h2', class_='author')
                        novel_content = novel_parsed.find('div', class_='main_text')
                        if novel_author is not None and novel_author.string is not None:
                            make_dir('./novels/' + novel_author.string)
                            save_novel('./novels/' + novel_author.string + '/' + novel_title.string, novel_content.text)

```

これでおおよそ14000の小説データがnovels以下に保存されました．全部でおよそ500MB程度です．
校正を行なってくださっている方たちに頭があがらねぇ．．．
プログラミング学習始めます

はじめまして。

Qiitaを使って学んだことをアウトプットしようと思い始めました。
書き方はよくわかっていないません。
そのうち慣れていきたいです

簡単に自己紹介です。
現在24歳、社会人3年目でIT企業に勤めています。
大学は地方の私立大学で情報学を専攻していました。
プログラミングがすごくできるわけでもなかったのですが、
IT系が唯一興味のあることだったためIT企業で頑張ることに決めました。

就職して研修が終わるとすぐに出向となり、1年間SESとして働いていました。
出向先になじめず、うつ病を発症してしまい半年間休職していました。
それでも会社の人たちの人柄はよかったので復職する道を選び、現在に至ります。

今は病気は落ち着き、前向きに仕事に取り組めています。
プログラミング学習にも前向きに考えられるようになってきて、
「スキルをつけてエンジニアとして胸を張って生きていきたい」という目標を持っています。

スキルを持って生き生き働く人たちを見て、憧れがあります。
Qiitaにはそういった人が多くいるので、この環境に身を置いて頑張っていきたいです。

最初の投稿は自己紹介をさせていただきました。
これからの投稿は、仕事で学んだことやプログラミング学習で学んだことを中心にアウトプットしていきます。
もし共感してくださるようでしたら、メッセージいただけると嬉しいです。

お読みいただきありがとうございました。
PHP match式

# 概要

- PHPのmatch式について簡単にまとめる

# match式

- switch文の上位互換的な存在

    ```
    match 式の比較は、 switch 文が行う弱い比較ではなく、 厳密に値を比較(===) します。
    match 式は値を返します。
    match 式の分岐は、 switch 文のように後の分岐に抜けたりはしません。
    match 式は、全ての場合を網羅していなければいけません。
    ```

- PHP8以降で利用可能
- `;`で終わらせる必要あり（これは「matchだから`;`で終わらせる必要がある」訳ではない。単純に「文は;で終わらせる必要がある」ということ）

# 使い方

```php
match (評価したい変数) {
    評価したい変数の値A => 評価したい変数が評価したい変数の値Aだった時の処理,
    評価したい変数の値B => 評価したい変数が評価したい変数の値Bだった時の処理,
    評価したい変数の値C => 評価したい変数が評価したい変数の値Cだった時の処理,
};
```

# 具体的な使い方

- 変数`$str`に格納されている値によって変数`$result`に格納する文字列を変更したい。
    - 変数`$str`に`x`が入っていたら変数`$result`に「xです」と格納したい。
    - 変数`$str`に`y`が入っていたら変数`$result`に「yです」と格納したい。
    - 変数`$str`に`z`が入っていたら変数`$result`に「zです」と格納したい。
    - 変数`$str`に`x y z`以外が入っていたら変数`$result`に「x y z以外です」と格納したい。

    ```php
    <?php
    
    $str = 'x';
    
    $result = match ($str) {
        'x' => 'xです',
        'y' => 'yです',
        'z' => 'zです',
        default => 'x y z以外です'
    };
    
    // xですと出力される
    echo $result;
    ```

# 参考文献

- [https://www.php.net/manual/ja/control-structures.match.php](https://www.php.net/manual/ja/control-structures.match.php)
ソフトウェアのテストの自動化は何のため？ 「効率化」への違和感


自動テストの目的が「効率化のため」とか「コストダウンのため」といわれることに、筆者は違和感があります。この違和感の正体を明らかにし、企業の目的、エンジニアの人生論にまで深めてみます。

# 企業の目的は利益か？


まず「会社の目的は利益を得ること」と言われたらどう感じますか？　やはり似た違和感があります。そもそも会社の「目的」は「社会貢献」であるはずで「利益」はその「結果」に過ぎません。

わかりにくいですよね。では次に、「家の手伝いは小遣いを得るためだ」とわが子に言われたらどうですか？

親の視点からすれば、あまりに自分本位です。小さいうちならまだいいでしょう。しかし、親が子に生活費や教育費を投じていくからには、ある程度成長した子供には「自分ができる範囲で家族の役に立ってほしい」「感謝を行動で表してほしい」「その行動を通じてついでに将来、自活する力を高めてほしい」と願いますよね。ただ働きでは手伝いを継続できないので、小遣いで動機づけるにすぎません。

話を戻すと、すべての企業活動は、直接・間接的に社会に提供する「価値」につながっているべきものです。それを継続できるように企業は見返りに「利益」を得るのです。

# 自動テストの価値は何か？

では、自動テストがもたらす価値は何でしょうか？

それは、人間ではできない速さでテストを実行できること。手動の場合と違って、気軽にテストを繰り返し実行できること。変更が発生するたびに自動で回帰テストをかければ品質を保証できるので、**ためらわずに変更をどんどん受け入れ、そのたびにソフトウェアを価値あるものに進化させて、継続的に顧客に届ける**ことができます。

それが自動テストの価値です。

はやりのカタカナで書くと「ビジネスアジリティ」。

# 自動テストでコストダウンできるのか？

自動テストで本当にコストダウンできるかは疑問です。

むしろコストアップ要因として以下のものがあります：

自動テストを実行するためのコンピュータ。そしてそれを保守するエンジニア。変更要求が入るたびにテストケースを更新するエンジニア。
専門スキルを求めるわけですから、人件費ないし学習費も高くつくでしょう。

コストダウンというからには比較対象が必要ですが、それは自明ではありません。たとえば、自動テストは繰り返し実行しやすいので、ある期間に実行した回数を数え、それを手動で実行した場合の工数と比べたら、大きな投資対効果があるように見せることはできるでしょう。しかしそれにどれほどの意味があるでしょう？　大量に同じものを作る工場の生産ラインと、一品ものを作るソフトウェア開発現場では、こういう点では同じに扱えません。

工数比較の論理の裏にあるのは、「より長い時間をかけた作業ほどより大きな価値がある」とする「工数」の概念です。しかし、これこそが生産性向上の障害であり、忌むべき概念です。なぜなら「生産性が高い」というのは「より短時間でより大きな価値を生み出す」ことだからです。

# エンジニアの本望

そもそも「コストダウンのための仕事」にやる気を出すソフトウェアエンジニアなどいるでしょうか？

自分の時間が「コスト」とみなされる感覚は受け入れがたいものです。

ただ言い方の問題なのかもしれませんが、むしろ自動テストに費やす時間と金銭は、ソフトウェアの価値を高めるための「投資」です。こう言ったほうが共感しやすいです。なぜなら「人はパンのみにて生くるものにあらず」だからです。

エンジニアがしたいのは「専門性を生かして、文明の進化につながる、世の中にない価値を創出すること」のはずです。

豊田佐吉が自動織機を発明した動機は、夜なべするお母さんの機織り仕事を楽にしたいという思いでした。効率化とか生産性は結果ではあっても目的ではありませんでした。参考：[トヨタイムズの記事： "トヨタ生産方式" 豊田章男の解釈](https://toyotatimes.jp/spotlights/091.html)

そういう意味で、ソフトウェアの自動テストは、**エンジニアのテスト実行を楽にして、ソフトウェアの価値を高めることに集中させる**ことともいえます。
go install でハマったこと

不覚にも `go install` でハマった。。。
結論、**[公式ドキュメント](https://pkg.go.dev/cmd/go#hdr-Compile_and_install_packages_and_dependencies)** にちゃんと記載されているが、具体例が一切無く分かりにくい。
なので備忘録を残す。


# バージョンが異なる複数のパッケージを同時にインストールできない
**複数のパッケージをインストールする場合、全て同じバージョンを指定する必要がある。**
そうしなければ`all arguments must have the same version`と言われる。。。
```
$ go install github.com/go-delve/delve/cmd/dlv@latest golang.org/x/tools/gopls@v0.9.1 
=> go: golang.org/x/tools/gopls@v0.9.1: all arguments must have the same version (@latest)
```

> If the arguments have version suffixes (like @latest or @v1.0.0), "go install" builds packages in module-aware mode, ignoring the go.mod file in the current directory or any parent directory, if there is one. 
（中略）
\- All arguments must have the same version suffix. Different queries are not allowed, even if they refer to the same version.




# 異なるモジュールのパッケージを同時にインストールできない。
**モジュールもバージョンも同じ必要がある。**
そうしなければ、`All packages must be provided by the same module` と言われる。。。
```
$ go install github.com/go-delve/delve/cmd/dlv@latest github.com/cweill/gotests/gotests@latest
=> All packages must be provided by the same module (github.com/go-delve/delve@v1.9.0)
```

> If the arguments have version suffixes (like @latest or @v1.0.0), "go install" builds packages in module-aware mode, ignoring the go.mod file in the current directory or any parent directory, if there is one. 
（中略）
\- All arguments must refer to packages in the same module at the same version.



# 解決策
面倒臭いが、**個別にインストールするしかない。**
```
$ go install golang.org/x/tools/gopls@v0.9.1
$ go install github.com/go-delve/delve/cmd/dlv@latest
$ go install gotest.tools/gotestsum@latest
```

うーん、、、汚い。。。
Vimのマクロを楽に再利用したい

## 動機
[vim の q マクロを保存して使いまわす](https://zenn.dev/anozon/articles/vim-macro-save)  
- Vimを始める前に知った
- 「へー、使い回せるのかー、便利そうだなー」と月並みに思っていた

## 実際にやってみて
- しばらくして実際にやってみた
- Vimは日本語情報が豊富だが、マクロ関連の込み入った情報はそんなに多くない（むしろ少ない）と感じた
	- 例外がないとは言わないが
	- （マクロ自体Vimユーザー全体としてあまり使われてないのかもしれないと思ったが、英語で調べてみると僅かながらにあった、後述）
- `<Esc>`を直打ちするのはつらい（手軽に共有したりできないのはつらい）
	- 一文字づつ間違いなく打つ（そしてしばしばputして修正する）よりは楽ではあるのだけど...

## 気づき
- どうせletするんだから、expand()したりとかできないかなーと思った
- できなさそう（そりゃそうだろうな感はある、だって制御キー展開してどう扱うのみたくなるし）
- `:h expand()`らへんのヘルプを見ていたので、その辺のヘルプをないかないかと眺めていた
- そしたら、`:h feedkeys()`の記述を見た
	- あたかもユーザーがタイプしたかのようにキー入力を再現するものらしい
		- マクロっぽい
		- （今見ると`:h :execute`のとこあたりを見るのが正解だったかもしれないですね...）
	- 特殊なキーもダブルクォート内なら`\`でエスケープして使えるらしい
		- やってみるか
		- →できた
			- `let @b = "ihoge\<Esc>"`
			- 少なくとも日本語では（マクロとして使うにあたっては）そんな情報はなさそうだったので英語でも調べてみた
			- →[Stack OverFlowにあった](https://stackoverflow.com/a/52938953)（いまここ）

## 活用
###  そもそものマクロの欠点
- 前述したように、そもそも一文字一文字間違いのないように打っていくというのは苦痛である
	- 実行して挙動を確認しながら記録できるという利点はあるものの...
	- `"ap`して修正、`"ayy`するとかになるときつい
- →バッファに手書きしてyankするという方法がしばしば取られる
	- マクロは頭の中であらかじめ組み立ててやるということも多いので（脳死でhjkl使うと破綻するような気がするから）これをよくやる
        <!-- 今確かめたら以下は全くもってそんなことはない。改行コードは無視されるっぽさはあるが普通に<Space>も発火される -->
		<!-- - 行末スペースやらは（多分）トリムされてるっぽいので、雑に`yy`とかでよい -->
	- `@"`とか`@0`するとべんりかも(`:h quote0`)
		- `"`、単体ならいいけどその後に何か組み合わせようとするとなかなかに打ちづらいので
			- `"0`には最後にヤンクされたものが自動的に格納される
				- ちょっと別のとこいじったりで上書きされてしまう心配が薄い
- ただ、`<Esc>`とかしようとすると不便
	- なんや`<C-v><Esc>`を直打ちって...
### この手法なら（たぶん）ある程度改善できる
- そもそもの`let @a = ...`するという選択肢
	- 一文字一文字打たないで済む
		- 間違いのないよう確認しながら打てる
		- 修正したりするために`"`押さなくて済む
	- そもそもの話、レジスタ自体の確認も普段の流れで簡易的に`echo @a`でもできたりする[^1]
- そして制御文字・特殊文字なんかも展開できるようになる
	- [:h expr-quote](https://vim-jp.org/vimdoc-ja/eval.html#expr-quote)
	- Vim外にもコピペして持って行きやすい
	- 単純な例: `let @j = "oJetpack '\<Esc>"`
		- 新規行に`Jetpack '`という文字列を挿入し、ノーマルモードに戻る
            - 私の場合、実際にはプラグインによる補完が入るので`Jetpack '|'`というふうになる（`|`はカーソル位置）
	- （レジスタ、なんだかんだviminfoに保存されるのでvimrcに書くより直打ちすることのほうが多いかもしれない）
- もともとの`@[a-z]`とかで呼び出せる手軽さを活かせる
	- いちいちマップするようなものでもないし、というような一度限りの雑用にも活かせる
		- 押しやすいマップを使いまわせる
		- 使う度`:exec "norm ..."`とするのは手間

少しはマクロを使う機会が増えるかもしれない  

~~が、よく考えると「どうせコマンドラインから打つんなら`map @a`とかと大差なくない？」という反論が来ても答えられないなぁ、というふうにもなってしまった~~
前述のviminfoなどの関係もあるので恐らくそんなことはない

### 余談：コメントアウトされたものを適用する場合
一般的なVimの使い方の解説にはなるが、コメントアウトされたExコマンドはコマンド本文の先頭部分に移動し、`Y`を押した後コマンドラインに移動して`<C-r>"`とすることなどによって取り出し、活用できる

## ちなみに
[このGist](https://gist.github.com/romainl/9721c7dd13c30714f568063e03c106dd)のが遥かにまとまっていてマクロについて包括的であることにいまさら（再発見的に）気づいた（6ヵ月経って追記）
一応見た覚えはあるのだけど、当時の私には難解すぎて見落として/敢えて削ってしまっていたのだろうか...（ちなみにこのGist内の最後の項にあるようなyankするマクロは、書き下しでやる場合なんかは明示的にレジスタを指定したほうが被害が少なくていいと思うぜ）

...こんな感じでつけたしつけたしでやってたりするとこういう風に（これ自体は全体的に見返してみれば顕著な例ではないが）後書きがだらだら続くような感じになってしまいがちなので、少なくとも自然言語に関しては（世に出す前の段階だと特に）中途半端に作るよりもまるきり刷新してしまったりだとか概念だけ置いといて更地に近い状態からとかのほうが全体としてのまとまりが出たりするんだよなぁなどと思うなど（完全ポエム）  
あまりこうしててもくどいのでこの辺で畳んどくことにしましょう ~~この節が一番の蛇足である~~

[^1]: 印字可能な制御文字？の場合には`:reg`と異なる場合がある（タブがそのまま表示されるか`^I`というようにしてして表示されるか等）
キャプチャボードでスクリーンショット撮りたい時はOBSが一番楽 (多分)

OBSでソースの追加から映像キャプチャデバイスを選択し、デバイスにキャプチャボードを設定する。
画像を右クリックすると ｢スクリーンショット (プレビュー)｣ があるのでクリック。
[ファイル]→[録画を表示] をクリックすると、保存先のフォルダが確認できる
pythonのパッケージをインポートする方法

今回、JupyterLabで環境を構築した際にpythonのパッケージをインポートする方法について学んだことをまとめておく。

# パッケージのインストール
```
pip install パッケージ名
```
パッケージ名の後ろにversionを指定することも可能
# パッケージのインポート
```
import パッケージ名
```
# パッケージのアップグレード
```
pip install -U パッケージ名
```
# パッケージのアンインストール
```
pip uninstall パッケージ名
```
uninstallの後に-yを付与することで、アンインストール確認を自動で承認できる。
# インストール済みパッケージの詳細確認
```
python -m pip show パッケージ名
```
「pip show」で依存関係を確認できる
「requires :」 Pandasが必要とする依存ライブラリ
(インストール時に自動的にインストールされるライブラリ)
「required-by :」 Pandasに依存しているライブラリ
基本情報（OSの仕事）

OSとはオペレーティングシステム（Operating System）の略。コンピュータの基本動作を実現する「基本ソフトウェア」です。
例えば「ワープロソフトを使って文章を作りたい」「表計算ソフトを使って集計を行いたい」という前に、そもそも誰かがコンピュータをコンピュータとして使えるようにする必要があります。そのためにOSが必要です。
基本的な機能を提供するソフトウェアを基本ソフトウェアとも呼ばれます。

## ソフトウェアの分類
ソフトウェアは大きく分けると「応用ソフトウェア」と「システムソフトウェア」の2つに分かれます。

```
応用ソフトウェア ⇄ システムソフトウェア（ミドルウェア　⇄　基本ソフトウェア）　⇄　ハードウェア

//　応用ソフトウェア
ワープロや表計算などの各種アプリケーションソフト

// ミドルウェア
データベース管理ソフトウェアや各種開発支援用ソフトウェアなど

// 基本ソフトウェア
OSや言語プロセッサ、各種サービスプログラムなど
```
ミドルウェアはある特定の用途に特化して、基本ソフトウェアと応用ソフトウェアの間の橋渡しをするためのソフトウェアです。

## 基本ソフトウェア
基本ソフトウェアは、さらに細かく３つのプログラムに分けることができます。

```
制御プログラム
ハードウェアを管理して、応用ソフトウェアやミドルウェアから、コンピュータが効率的に利用できるように縁の下の力持ちとして働くソフトウェア・
このプログラムをカーネルと呼びます。メモリ管理やプロセス管理などに機能を限定したマイクロカーネルと多くの機能を網羅したモノシリックカーネルがあります。

言語処理プログラム
C言語やJavaなどのプログラミング言語で書かれたプログラムを、コンピュータが理解できる機械語に翻訳するプログラムです。

サービスプログラム
コンピュータの機能を補う、補助的なプログラムのことで、ユーティリティとも呼ばれます。ファイル圧縮プログラムなどが該当します。
```
OSを広い意味で解釈すると「OS＝基本ソフトウェア」になりますが、狭い意味に限定すると、「基本ソフトウェアの核である制御プログラムこそがOS」となります。

## 代表的なOS
|   |説明  |
|---|---|
|Windows  |Microsoft社製のOS。GUIをマウスなどのデバイスを使用してコンピュータに命令します。  |
|Mac OS  |Apple社製。GUIを実装したOSの先駆けらしい。  |
|MS DOS | Windowsの普及以前に広く使われていたMicrosoft社製のOS。CUIと言って、キーボードを使って文字ベースのコマンドを入力することで、コンピュータに命令を伝える。|
|UNIX| サーバーなどに使われることの多いOS。大勢のユーザが同時に利用できるように考えられています。|
|Linux   | UNIX互換のOS。オープンソースのソフトウェアで、無償で利用できる。ペンギン。|

## まとめ
一旦ここまで。次回に続く。
トラブル事案｜GCEでVMインスタンスへSSH接続できない

今までSSH接続できていたGCE（Google Compute Engine）のVMインスタンスへ、ある日接続できなくなりました...

> Warning: Permanently added 'xxx.xxx.xxx.xxx' (ECDSA) to the list of known hosts.
Received disconnect from xxx.xxx.xxx.xxx port 22:2: Connection blocked because server only allows public key authentication. Please contact your network administrator.
Disconnected from xxx.xxx.xxx.xxx port 22

・鍵の作り直し、インスタンスへの再登録
・ユーザー名や鍵のパスの確認
・鍵ファイルや`.ssh`ディレクトリのパーミッションの確認

何をやってもダメ....

# あっ...コレやん...

数時間かけて色々試して...結局のところ...

**「VPNやん...」**

実は、作業開始前にオフィスへ**SSL-VPN接続**しておりました。
その上でSSH接続を試みていたのです。

SSL-VPN接続のうえでのSSH接続がダメだったのか、それともオフィスのUTMの設定の影響だったのかは分かりませんが、**SSL-VPN接続を解除**したら、いつもどおりにSSH接続できましたとさ。

ちゃんちゃん
Vue3で静的なHTMLを読み込ませたかった

# やりたいこと
Vue.jsで個人開発しているSPAアプリケーションにLP(ランディングページ)を埋め込むことがありました。  
実現したいこととしては、

- 静的にHTMLを読み込んでほしい(SEO的に、jsなしでも動くことが条件)
- 同じドメイン下に置きたい
- できればVueだけで解决したい(LPのためだけにNuxtやGridsomeで書き直すようなことはしたくない)

# 調べてみた
最初にたどり着いた方法が、 **リバースプロキシ** を使ってURLでレスポンスを変える方法でしたが、Vue単体で解決できてないのでとりあえず保留。   
 
色々情報を漁っていると…  
Vue.jsには **MPA** を構築する機能が標準で搭載されているらしい…？

# MPAとは
(知っている方は読み飛ばしてください)  

VueやReactなど、モダンなフロントエンドフレームでは **SPA** (シングルページアプリケーション)として開発するのが主流です。つまり、基本的には1つのページで表示をすべて完結させています。    

それに対し、 **MPA** (マルチページアプリケーション)では、従来の方法で各ページでリクエストに対するレスポンスを表示させています。  

ざっくりいうと、
- 画面遷移にリロードがあるのがMPA
- 画面遷移にリロードがないのがSPA  

といった理解で大丈夫だと思います。

# やってみる
VueのMPA機能を使えば、任意のURLに静的なHTMLを配置することができそう、ということがわかりました。  
では実際に実装してみましょう。

今更ですが筆者の環境です
- vue-cli v5.0.4
- Vue v3.2.13
- vue-router v4.0.3
- javascript

### ディレクトリ構造
```
root/
└ src/
　├ public/
　|　├ index.html
　|　└ landing.html
　└ app/ <- src直下にあったメインのアプリケーションを移動させた
　|　├ components/..
　|　├ App.Vue
　|　└ main.js
　└ landing/ <- LP用のディレクトリ(後述するが、ここに意味のあるコードは置かない)
　　└ main.js <- 内容は空でよい
```
おそらく大半の方が`src`直下に`main.js`や`App.vue`を配置していると思うので、見やすくするため`app`など適当な名前をつけたディレクトリに移動させましょう。(やらなくても可、その場合は適宜以下のパスを読み替えてください)

### vue.config.js
```javascript
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,
  pages: {
    index: {
      entry: 'src/app/main.js',
      template: 'public/index.html',
    },
    landing: {
      entry: 'src/landing/main.js',
      template: 'public/landing.html',
    }
  }
})
```
(参考: https://cli.vuejs.org/config/#pages )
`defineConfig`に`pages`プロパティを追加することでMPAの実装ができるようになります。  
ここで必須のプロパティは、`entry`のみであり、他のプロパティはオプションです。  
今回はHTMLを表示させるのが目的のため、`template`を指定します。  

また、形式的に追加する必要があるものの、実際は動作させないため`public/main.js`は空ファイルで大丈夫です。
あとは`public/landing.html`にHTMLを書いて完成です。

実行した後、`http://localhost:8080/landing`にアクセスするとランディングページが表示されるはずです。

## おわりに
わりと裏技的な実装な気がしてるので、もう少しよい方法があれば教えてほしいです
【unity】重力の無効化について

# はじめに
あるボタンを押下した際に、重力を無視して突進をしたいと思って実装したので、メモ。

# 内容
初めに、物理現象を無効化する方法（`isKinematic`を有効化する）を試したが、前後左右への移動すら無効化されてしまった。
```c#:重力の無効化（失敗例）
    void FixedUpdate(){

        ...

            // 重力を一時無効化する
            rb.isKinematic = true;

        ...

    }
```

そのため、y方向の速度を0にするという原始的な方法で実装した。

```c#:重力の無効化
    void FixedUpdate(){

        ...

            // 重力を一時無効化する
            rb.velocity = new Vector3(
                rb.velocity.x,
                0,
                rb.velocity.z
            );

        ...

    }
```
# まとめ
物理現象の操作はよく行うので、覚えておいて損はないので、ぜひ調べていただけたらと思う。

# 参考文献
- [【unity入門】Rigidbodyを停止させる方法](https://mogi0506.com/unity-rigidbody-stop/)
Chromeの開発者ツールを開くとデフォルトで要素検査モードになってしまう問題

# 指摘

Google Chrome の開発者ツールを開いた際に、デフォルトでHTML要素を検査する機能が有効になって開かれてしまうことがある。
このとき、ネットワークタブなどを開こうと思うと、毎回一度画面をクリックして検査モードを消化してから次の操作を行わなければならず、非常に煩わさを感じる場合がある。

![8A3D049F-EA9C-4AD1-87F4-3312330095C9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102978/45565493-e356-6fb2-69fd-5230346267cb.png)
`↑ これがデフォルトで押されていて鬱陶しい、ということが言いたい`


# 原因
私はずっとGoogle Chromeのデフォルトの挙動だと思って諦めてた。
が、調べてみるとどうやら **開発者ツールを開くショートカットキーが誤っていた** ことが判明。
どうやらいくつか種類があるようだ。



# 結論
開発者ツールを開くショートカットキーが誤っていたため起こっています。別のショートカットキーを利用しましょう。

具体的には、開発者ツールを開く際、次回からは `ctrl + opt + i` のショートカットキーで開きましょう。
検査モードが無効状態で開発者ツールが開かれます。


### 補足: chrome developer consoleを開くショートカットキーが違う

| コマンド | 結果 | 説明 |
| - | - | - |
| `ctrl + shift + c` | ◯ | 要素検査モードが 有効状態 で開かれる |
| `ctrl + opt + i` | ✕ | 要素検査モードが 無効状態 で開かれる |
| `ctrl + opt + j` | ✕ | 要素検査モードが 無効状態 で開かれる |
| `F12` | ✕ | 要素検査モードが 無効状態 で開かれる |





## 引用元

- Disable "Select an element in the page to inspect it" by default https://groups.google.com/g/google-chrome-developer-tools/c/1y9-U0hg12Y

![CD5D27C1-C5E2-4C2B-B563-232BE5EAE02A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102978/a0d97f14-fe0a-75e0-bccd-66779055fe18.png)


> Paul Irish
> 
> devtoolsを開くためのキーボードショートカットを間違えている可能性があります。
> ctrl-shift-i で一般的な devtools を、ctrl-shift-j でコンソールを開いてみてください。
> ctrl-shift-cはインスペクトモードで開きます。
> ご回答になれば幸いです。



# tag
chrome google chrome developer console developer tools 開発者ツール 開発者モード HTML Elements HTML要素 要素の検査 要素の検証 左上のアイコン Inspect Mode クリック 開いたとき デフォルト 無効 方法 やり方 鬱陶しい mac macOS
【Android】他アプリを起動する

# 概要
`Aアプリ`から`Bアプリ`への遷移を行う方法について。
`getLaunchIntentForPackage`が常にnullを返していたので、同じ間違いをしないためにもメモ。

# コード
マニフェストファイル。Android11以降は`queries`内のコードを追加する必要がある。
```AndroidManifest.xml
<manifest>
	<queries>
		<intent>
			<action android:name="android.intent.action.MAIN"/>
			<category android:name="android.intent.category.LAUNCHER"/>
		</intent>
	</queries>
</manifest>
```

処理部分。`packageName`を指定して他アプリを起動させる。
```Kotlin
val packageName = "com.hoge.fuga"
val intent = packageManager.getLaunchIntentForPackage(packageName)
if (intent != null) {
	context.startActivity(intent)
} else {
	//アプリがインストールされていない場合
}
```
JavaScript覚えたかったら「JS Challenger」がオススメ

# 背景

突然ですが **JavaScript** ってどうやって勉強していますか？

私がぱっと思いついたのは以下のような方法です。

- 書籍を最初から最後まで読む
- OSSのコードを読んで見る。
- UdemyやYoutube等の講座を見る

もちろんネット上には素晴らしい書籍や教材が豊富ですが、**ドキュメントを最初から最後まで詳細に読む**なんて方法は辛いですよね？ （やれる人もいます）

今回は手を動かしながらゲーム感覚でJavaScriptの文法を覚えられる（業務のコードが読めるようになる）[JS Challenger](https://www.jschallenger.com/)というサイトをご紹介します。

# JS Challengerとは
サイトの説明から抜粋すると

- JSに特化したコーディング演習が無料でできる
- ビギナーから上級者まで対応
- JSの基礎からDOM操作まで幅広く学べる

のように記載があり、いわゆる **JS専用のコーディング問題集** だと考えることができます。

また以下のような機能が有り、手を動かしながら徐々にJSの文法を覚えていくことができます。

- 回答進捗一覧(ログイン不要)
- 問題レコメンド機能

# 御託はいいからやってみよう

まずは[JS Challenger](https://www.jschallenger.com/)にアクセス

`Next Pick For You`から最初の問題を選択

![スクリーンショット 2022-07-19 17.25.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290859/ea7e0eb4-acb6-797c-0eac-66d5d766a36f.png)

問題を解く

![スクリーンショット 2022-07-19 17.28.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290859/faafec46-c139-5694-471d-8f462da0fdba.png)

`Submit`ボタンを押して解答を提出

![スクリーンショット 2022-07-19 17.29.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290859/215c398c-0ecc-8092-49a3-661d92832922.png)

ちなみにコードに間違いがあると、`Error: Invalid Javascript`とエラーが発生する。

![スクリーンショット 2022-07-19 17.31.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290859/cff75891-52d1-80dd-66a0-3f3da49a7564.png)

正しいコードだけど問題の条件を満たしてない場合は`Error: One or more of your test cases fail`と表示される。

![スクリーンショット 2022-07-19 17.34.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290859/89b1d423-b7a1-6d76-1a64-b4520232483e.png)

以上が簡単な問題を解く流れです。

# 実はJSで実務経験あったけどわからん問題多かった

唐突ですが筆者のJS経験は以下の感じです。（似たような方もいるのでは無いでしょうか

- 普段はPHP,Java等のサーバーサイドを書き、ちょっとした改修or趣味でVueやReactを触る。
- 業務でTypeScriptのサーバーサイドを書く必要に迫られている。
- エンジニア歴自体は2~3年

上記のスペックで問題を解いてみたのですが、各セクションの後半の問題となると

- [素数探索問題](https://www.jschallenger.com/javascript-fundamentals/javascript-basics/return-prime-number)
- [Dateオブジェクトをこねくり回す問題](https://www.jschallenger.com/javascript-fundamentals/javascript-dates)
- [Setの使い方を知らずに`filter()`,`sort()`で頑張りがちになってしまうやつ](https://www.jschallenger.com/javascript-fundamentals/javascript-arrays/merge-arrays-duplicates)

など私のような **_雰囲気JSer_** を撃墜しに来る問題も多く、TSやる前にJSなんとかしろ(正論)とカマされている気分になりました。

ちなみにどうしてもわかんないときは、テストケースが少ないことを逆手にとって嘘解法で答えを見るなんてことも可能
（クソコードで申し訳ない😢

![スクリーンショット 2022-07-19 17.58.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290859/eb57cb55-ebf2-1af3-c8e9-06c921ef34c7.png)

# まとめ
というわけでみんなも[JS Challenger](https://www.jschallenger.com/javascript-fundamentals/javascript-arrays/merge-arrays-duplicates)やっていきやしょう。
簡素なメモアプリ（Web）を作ってみた

github: https://github.com/TowelMan-public/simple-memo

# 動機
　シンプルに気軽にメモできるアプリがあったら便利そうだなと思ったのと誰でも任意の環境にデプロイでいるようなものを作ってみようと思った。結構遊び感覚で作ってみた。

# 機能
 ・メモをとる（複数可）
 ・とったメモを一週間だけ一時的に保存する（保存したメモは保存結果のところに表示されているURLにアクセスすることで表示できる）
 ・保存したメモを表示させられるのは一度だけ。もう一度表示させたい場合はもう一度保存を行う。

### 補足
 ・メモのタイトルは50文字以内
 ・メモの内容は2000文字以内

# デプロイ方法
https://github.com/TowelMan-public/simple-memo参照

# 全体的な感想
 next.jsは宣言的に書けて楽しい。また、UI以外の部分の自由度が高いのも魅力の一つかもと思った。
git pullしたらCould not resolve host: gitlab.com; Unknown error

朝起きていつもどおりgit pull origin masterしたところ
```
fatal: unable to access 'https://gitlab.com/プロジェクトURL/': 
Could not resolve host: gitlab.com; Unknown error
```
できません！

sudo git pull origin masterも同じくエラーです。。
SSH鍵再設定したりも無駄で、逆にSSH鍵外したり。
仮想サーバー関連じゃないかなとアドバイスありまして、、
```
sudo vi /etc/resolv.conf
```
で中身チェック
```
# Generated by NetworkManager
nameserver 10.0.2.3
~
~
~
~
```
インサートモードにして
nameserver 8.8.8.8を追加。
nameserver 8.8.8.4も一応...
```
# Generated by NetworkManager
nameserver 10.0.2.3
nameserver 8.8.8.8
nameserver 8.8.8.4
~
~
```
保存して再度git pull origin master
SSH鍵外したまま(Gitlab上)ですがきっちり動きました。。

DNSサーバー追加のみでいけたという事の議事録でした。
Go言語で初めてWebアプリを作る際に役立ちそうな参考文献リンク集(日/英)

この記事はGo言語の基礎文法をざっくり抑えた人が、Webアプリを作るのに役立ちそうな文献をまとめたものです(2022/07/19時点)。

## 1. 公式web記事
### [Writing Web Applications / go.dev](https://go.dev/doc/articles/wiki/)
- `net/http`や`html/template`のパッケージを使ってGUIのwebアプリを作る

### [Tutorial: Developing a RESTful API with Go and Gin](https://go.dev/doc/tutorial/web-service-gin.html)  
- 基本的なRESTful APIをGOとGinで作る

### [Tutorial: Accessing a relational database](https://go.dev/doc/tutorial/database-access) 
- RDBMSをGoで使う際のチュートリアル

## 2. 書籍
### [Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る](https://www.amazon.co.jp/dp/B06XKPNVWV/ref=cm_sw_em_r_mt_dp_PWN5M5THW741DW98G9N9)
- テンプレート/DBの活用、テスト/デプロイなどが学べる

### [Go言語 ハンズオン](https://www.amazon.co.jp/dp/B08XYQ1RS3/ref=sspa_dk_detail_0?psc=1p13NParams&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUEyUEZVNUNJTEdZMFRVJmVuY3J5cHRlZElkPUEwODYzMDAxMjJGTVZQTFg5Q0ZKTiZlbmNyeXB0ZWRBZElkPUFQUzJBWlE0RExGMUkmd2lkZ2V0TmFtZT1zcF9kZXRhaWwyJmFjdGlvbj1jbGlja1JlZGlyZWN0JmRvTm90TG9nQ2xpY2s9dHJ1ZQ==) 
- Goの基礎文法からGUIアプリケーション開発, GORMを使ったアプリ開発など

### [詳解Go言語Webアプリケーション開発](https://www.amazon.co.jp/dp/B0B62K55SL/ref=cm_sw_em_r_mt_dp_0J6R417PBRH71GW2DD72)
- 標準ライブラリと主要OSSで作成するとのことなので、さくっとアプリを作りたい目的にはあってそう

### [Go言語によるwebアプリケーション開発/オライリージャパン](https://www.amazon.co.jp/-/en/Mat-Ryer/dp/4873117526/ref=sr_1_1?keywords=go%E8%A8%80%E8%AA%9E%E3%81%B8%E3%81%AEweb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA&qid=1658219470&sprefix=Go%E8%A8%80%E8%AA%9E%E3%81%AB%E3%82%88%E3%82%8B%2Caps%2C255&sr=8-1)
- 簡単なwebアプリからマイクロサービスまで手を動かしながら作る。やや難しいらしい。

### [NuxtとGoではじめるWebアプリ開発](https://www.amazon.co.jp/dp/B0823H9Z5L/ref=cm_sw_em_r_mt_dp_KR53K8YHFZNVXB9XVQFM)
- NuxtとGoでそれぞれアプリを作ったことがある人向けだと思われる

## 3. 野良のweb記事
### [ゼロから始めるGo言語/クジラ飛行机](https://news.mynavi.jp/techplus/article/gogogo-9/)
[多数の書籍](https://www.amazon.co.jp/s?k=%E3%82%AF%E3%82%B8%E3%83%A9%E9%A3%9B%E8%A1%8C%E6%9C%BA&sprefix=%E3%82%AF%E3%82%B8%E3%83%A9%E9%A3%9B%E8%A1%8C%E6%9C%BA%E3%82%AF%E3%82%B8%E3%83%A9%E9%A3%9B%E8%A1%8C%E6%9C%BA%2Caps%2C185&ref=nb_sb_ss_ts-doa-p_1_6)を出版しているクジラ飛行机さんの記事。無料だが色々なGoのアプリ、ツールの作り方をハンズオン形式で紹介している連載。

- [Go言語のWebフレームワークGinで簡単Webアプリ開発/クジラ飛行机](https://news.mynavi.jp/techplus/article/gogogo-17/)
- [100行未満かつGo標準ライブラリだけで作る掲示板/クジラ飛行机](https://news.mynavi.jp/techplus/article/gogogo-9/)
- [Go言語なら10行でWebサーバーが書ける件/クジラ飛行机](https://news.mynavi.jp/techplus/article/gogogo-3/)
リーダブルコード簡易まとめ

# リーダブルコードまとめ
- わかりやすい命名
function名を見て何を表す・実行するのかわかる


- わかりやすく無駄のないコメント
他人がコードを読むとき素早く理解できるようにする

- シンプルで美しいロジック
シンプルなロジックを組む
修正しやすく、不具合が少ないのがメリット


## 命名に関して
a b fooなどの意味のない変数名は使わない
ユーザー名だったらuserNameなど何を表すかわかるようにする
データベース名と揃えるなど

誤解を招く表現は避ける。
filterというファンクション
filterではなく、selectやexcludeを用いる。


## コメントに関して

なぜコメント使うのか。
昨日の自分は他人という格言もある。
他の人がコード見たときに、誤りなく素早く内容を理解するため

コードを変更する際はコメントも変更すること

コメントに書くべき内容としては、実装の背景にある自分の考えや、コードから読み取れない補足情報
設計書との関連付け

処理ブロックに関してもコメントを残す。

ただ、コードを見たらわかる内容はコメント残さないように。
可能な限り簡潔に


## 整理とかインデントに関して
コードやコメントは整理整頓しよう。

- 助長な部分は排除する
不要なelseを削除する

- 可能な限り否定系は避ける
unlessなどの否定系は使わない
elseなどを使う。

- エラーの少ない記述を心がける。
エラーの少ない記述を心がける。

nullチェックを心がけたり。
Unityのテスト（NUnit）でVRChat SDKのコンポーネントが参照できない

Unityのテスト（NUnit）でVRCSDKのコンポーネントが参照できない問題にぶつかったので、対処方法を書きます。

前提として、テストコードで自作クラスを参照するにはUnityでライブラリの参照を設定しなければなりません。
設定方法は以下の記事で紹介されていました。
https://qiita.com/kazukomati/items/d5f5bec204ce99ee7ad5

そして、VRChat SDKを参照する場合にも、Unityでライブラリの参照を設定する必要があります。

# VRChat SDKのライブラリの参照設定方法
1. テストコードを置いているフォルダ内の*.asmdefをクリック
2. インスペクタの項目のAssembly References（下記画像赤囲み）でVRCSDKA.dllやVDCSDKBase.dllなどの必要なライブラリを追加
3. Applyを押す

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1945857/930f9d81-274c-c9ee-0838-d2c14ed95211.png)

Assembly Referencesに追加するライブラリは、テストで参照したいコンポーネントによりますが  
VRCAvatarDescripter,PipelineManager,VRCPhysBoneを参照する場合は、画像のライブラリが必要でした。

# 経緯
VRChatのアバターの再設定を簡単にするための、VRoidAvatarSetupUtilsというUnityエディタ拡張を作っています。

https://jirko.booth.pm/items/3232745

このアプリのテストをUnity Test Runner（NUnit）で書いており、テストコードに以下のような処理を書きました。
```
VRCAvatarDescriptor sourceVRCAvatarDescriptor = (VRCAvatarDescriptor)sourceObject.GetComponent<VRCAvatarDescriptor>();
GameObject.DestroyImmediate(sourceVRCAvatarDescriptor);
```

VRCAvatarDescriptorコンポーネントを参照するためにライブラリの参照が必要なのは分かるが、どこから設定すればよいのか分からない…という感じでしばらくハマっていました。