OmniAICreator/Qiita-1.07M huggingface dataset:
【初学者】プログラミング初心者が2ヶ月でRuby Silverに合格した話

### はじめに
はじめまして。
私は現在、未経験からエンジニア転職を目指し、勉強中です。
プログラミングに関しては完全未経験で、2023年4月から勉強を始めました。
この度、5月末にRuby Silverを取得することができたので、体験談を残しておきたいと思います。

### きっかけ
Rubyを中心に勉強をしている中で、
「Rubyについてどれくらい理解できているのだろう？」
「このまま勉強を進めて大丈夫だろうか？」
という不安を抱えていました。
そうした中で、「Ruby Silverを取得できるくらい、Rubyを勉強してみよう」と思い、
Ruby Silver取得を目指して勉強をスタートしました。

### 勉強方法
・公式のテキストを一通り読む
・問題演習
　　・公式のテキストの後ろについているもの
　　・公式サイトに載っているオンライン問題集
　　・RubyExamination

まずは、公式のテキストを一通り読みました。
読むだけで、全てを覚える、理解することは難しいと思い、
一通り読み終えた後は、すぐに問題演習に移りました。

問題演習は数をたくさんこなしました。
多い日では、1日で1000問近く解いた日もありました。
ただ回答するのではなく、
「この選択肢はこういう理由で正解、不正解」というのを答えられるくらいまで理解を深めました。

最終的には上記3つの問題集全てで9割以上は正答できるようになりました。

### 結果
結果として、Ruby Silverの試験は90点で合格することができました。
100点満点中、75点が合格ラインなので、まずまずの点数でした。
まだまだRubyについて学ぶことは山ほどありますが、
自分の学びが1つの形になり嬉しかったです。
1日も早く、エンジニアとして転職できるように精進していきます。
ありがとうございました。
アフィンガー6の購入方法とインストール手順

アフィンガー6の購入方法とインストール手順を知りたいアナタへ。当記事では、アフィンガー6の購入手順5ステップを画像7枚、インストール手順6ステップを画像6枚でわかりやすく解説しています。これを見れば迷うことなく購入&インストールができます。

https://mihana-log.com/affinger5-kounyu-tezyun/
UnityでFirebase SDKをインポートして実行すると発生するエラーの対処法（This application has requested the Runtime to terminate it in an unusual way...）

<h1>UnityでFirebase SDKをインポートして実行すると発生するエラーの対処法</h1>
<p>これまでUnityでFirebaseをすでに利用していたのに、追加でFirebase AnalyticsのUnitypackageをインポートして以降、Unityエディタで実行するとエラーが出てUnityが強制的に終了させられるようになった。<br>この対処法が英語含めてネットのどこにも書いてなかったので記事を書いてみた。</p>

<h2>Error文</h2>

![RTEmagicC_f3281e1838.png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464493/f253c07d-a503-535f-e922-0792cde75df3.png)

<p>Runtime Error!<br><br>
Program: ...<br>
<br>
This application has requested the Runtime to terminate it in an unusual way.<br>
Please contact the application's support team for more information.</p>

<h2>原因</h2>
<p>原因はFirebase SDKのバージョンが以前インポートしていたFirebase SDKのバージョンと異なっていたことでした。</p>

<h2>対処法</h2>
<p>今まで入れていたFirebaseのファイルを一度全部Unityプロジェクトから削除する。（具体的にはAssetsフォルダの直下にある「Firebase」という名前のフォルダを消せばいける）<br><br>
<b>※削除されたものに伴って起こった問題に対する責任は負わないのでバックアップ取っておいてください。</b><br>
<br>
<p>最新のFirebase SDKをFirebaseのサイトから取ってきてzip解凍した上で、必要な機能の.unitypackageファイルを１つ１つUnityプロジェクトにインポートしてください。</p>
<p>プロジェクトのLibraryフォルダが以前のバージョンの残ったデータをもとに悪さをする場合があるので、Libraryフォルダは一度削除して再度プロジェクトを開きなおしてください。<br>
このときSwitch Platformしてたのもリセットされるので、もう一度Switch Platformするのを忘れずに。</p>

<h2>他にあり得る原因と対処法</h2>
<p>Unityの.NETの設定がFirebaseと合ってない。この場合、Player Settings(File > Build Settings > Player Settings)のComfiguration内にある「Api Compatibility Level*」を「.NET Standard2.0」から「.NET 4.x」に変更すれば良い。またはこの逆に切り替えて治る。</p>

![スクリーンショット 2023-06-06 011309.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464493/a29fde97-2104-85f7-4b1d-95785e3e54f5.png)
Angularソースをサーバーへデプロイ手順メモ

## 前提
自分が作ったソースを実際にサーバーで動かしてみたかったので備忘録

## 手順

### 1.レンタルサーバーを契約する
今回はXFREEの無料プラン
https://www.xfree.ne.jp/

### 2.開発環境を整える
以下参考
https://angular.jp/tutorial/tour-of-heroes/toh-pt0

### 3.アプリケーションをビルドする
以下参考
https://angular.jp/start/start-deployment

distフォルダにビルド後の資産が作成される

### 4.レンタルサーバーにアップロードする
ffftpなどのツールで転送
格納フォルダはドキュメントルート
『プロになるためのWeb技術入門』を読んだので。


# はじめに

[『プロになるためのWeb技術入門』――なぜ，あなたはWebシステムを開発できないのか](https://www.amazon.co.jp/%E3%80%8E%E3%83%97%E3%83%AD%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEWeb%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80%E3%80%8F%E2%80%95%E2%80%95%E3%81%AA%E3%81%9C%EF%BC%8C%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AFWeb%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%92%E9%96%8B%E7%99%BA%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%AE%E3%81%8B-%E5%B0%8F%E6%A3%AE-%E8%A3%95%E4%BB%8B-ebook/dp/B09MVGM99L/ref=sr_1_1?crid=2RUFI5FRBVD4D&keywords=web%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80&qid=1645489804&sprefix=web%E6%8A%80%E8%A1%93%2Caps%2C205&sr=8-1) 
を読んだので、用語のまとめです。

# 用語

### ステートフル
ログイン状況などの状態を持つもの。
状態によってレスポンスが変わる。
ステートフルなプロトコルとして、`FTP`などがある。

### ステートレス
ログイン状況などの状態を持たないもの。
あるリクエストに対して毎回同じレスポンスを返す。
ステートレスなプロトコルとして、`HTTP`などがある。

### リクエスト
クライアントからサーバに対する要求

### レスポンス
サーバからクライアントに対する応答

### クッキー
クライアントとサーバ間で通信する際に保持される情報。
クライアントにテキストファイルとして保存されている。
通信するサーバごとにクッキーが存在する。
セッションとの違いとして、セッションはサーバに保持されることが挙げられる。
クライアント・サーバ間はセッションIDを受け渡し、セッションIDをクッキーに保持することで、情報量の制限を気にすることなく、安全性を高めることができる。


### プロトコル
情報をやり取りするための取り決め。  
`http`や`ftp`などが該当する。

### ポート番号
どのプログラムに通信するかを示した番号。
よく使われているプロトコルには共通のポート番号が割り振られている。
HTML＆CSSによる水平方向の中央揃えについて整理してみる

HTML&CSSで水平方向の中央揃えをするときに
迷ったり、思うようにCSSが効かなかったり
することはありませんか？:frowning2:

今回はそんな水平方向の中央揃えについて
整理していきたいと思います！

-------
<h3>中央揃えの方法一覧</h3>

まず、ざっと水平方向の中央揃えにする
パターンを挙げてみます！:point_up:
※ただの紹介なのでざっと見で大丈夫です

**<テキストの中央揃え＞**
```html:
<h1 class="center-text">Hello, World!</h1>
```
```css:
.center-text {
    text-align: center;
}
```
**text-align: center;を使うパターンですね**

**<ブロック要素の中央揃え＞**
```html:
<div class="center-block">I'm a centered block element!</div>
```
```css:
.center-block {
    width: 300px;
    margin: 0 auto;
}
```
**こちらはmargin: 0 auto;を使うパターンです**

その他にもあります:runner_tone2:

**<Flexboxの使用＞**
```html:
<div class="flex-container">
    <div>I'm a flex item!</div>
    <div>Me too!</div>
</div>
```
```css:
.flex-container {
    display: flex;
    justify-content: center;
    align-items: center;
}
```
**<Gridの使用＞**
```html:
<div class="grid-container">
    <div class="grid-item">I'm centered!</div>
</div>
```
```css:
.grid-container {
    display: grid;
    height: 100vh; /* viewportの高さを100%に設定して、中央揃えを視覚的に確認しやすくします */
    justify-content: center;
    align-items: center;
}

.grid-item {
    border: 1px solid red; /* 要素の境界を表示 */
}
```
--------------
このようにありますが、
今回はこの2つに焦点を当てたいと思います
```css:
text-align: center;
margin: 0 auto;
```
-------
<h4>text-align: center;とmargin: 0 auto;の使い分け</h4>

結論から言いますと、
ブロックの要素自体を真ん中に寄せたい時は
**margin: 0 auto;**

ブロックの内側を文字を真ん中に寄せたい時は
**text-align: center;**
となります:raised_hand:

ブロック要素自体を真ん中に寄せる
使い方はこんな感じです
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3113349/bc4ddd49-ce5f-a785-50df-4a0140074745.png" width="500">

そして、ブロックの内側を文字を真ん中に寄せる
使い方はこのような感じです
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3113349/a1e30c63-a6b1-5e38-e4f0-551d6a113cea.png" width="500">


また、
ブロックの要素に対して
**margin: 0 auto;**

ブロック内のテキスト情報に対して
**text-align: center;**
とCSSを効かせると以下のようになります！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3113349/7d78291e-5668-e4dd-9b4a-0155e86298be.png" width="500">

---------
以上になります！
ブロックを中央に寄せたいのか、
ブロック内のものを中央に寄せたいのか、
どちらを対象にするか考えてみてください！

お疲れ様でした:relaxed:
GASでGoolge Driveの共有ドライブにあるファイルの編集者を取得する

# はじめに

GASでGoogle Driveの共有ドライブにあるファイル（ドキュメントやスプレッドシート）の編集者を取得しようとしたところ、一部しか取得できなかったため、解決策を記事として残します。


# 共有ドライブにあるファイルの編集者権限

Google Driveの共有ドライブにあるファイル（ドキュメントやスプレッドシート）の編集者権限を付与する方法は3つあります。

1. 共有ドライブの管理者：共有ドライブのメンバー管理で管理者権限を付与する
1. 共有ドライブのコンテンツ管理者：共有ドライブのメンバー管理でコンテンツ管理者権限を付与する
![処理済～メンバーを管理.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/925662/63678650-8c5f-fb70-7fbb-54f602f63095.png)
1. ファイルの編集者：共有ドライブにあるファイル（ドキュメントやスプレッドシート）の共有で編集者権限を付与する
![処理済～共有.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/925662/ce082830-586b-3d12-8c37-15ba25ff98aa.png)


# 共有ドライブにあるファイルの編集者を取得する

ファイル（スプレッドシート）に紐づくスクリプトを以下のように記述しました。
```js
function myFunction1() {
    let sheet = SpreadsheetApp.getActiveSpreadsheet();  // アクティブシートを取得
    let editors = sheet.getEditors();                   // シートの編集者を取得
    let mail = "";
    editors.forEach(function(element){
        mail += element.getEmail() + ",";
    });
    console.log(mail);
}
```
上記のスクリプトで「1. 共有ドライブの管理者」と「3. ファイルの編集者」を取得できました。しかしながら、「2. 共有ドライブのコンテンツ管理者」は取得できませんでした。

次に以下のようなスクリプトを記述しました。
```js
function myFunction2() {
    let sheet = SpreadsheetApp.getActiveSpreadsheet();  // アクティブシートを取得
    let file = DriveApp.getFileById(sheet.getId());     // ファイルを取得
    let editors = file.getEditors();                    // ファイルの編集者を取得
    let mail = "";
    editors.forEach(function(element){
        mail += element.getEmail() + ",";
    });
    console.log(mail);
}
```
今度は「2. 共有ドライブのコンテンツ管理者」と「3. ファイルの編集者」を取得できましたが、
「1. 共有ドライブの管理者」は取得できませんでした。

最終的に以下のようなスクリプトにしました。
```js
function myFunction3() {
    let sheet = SpreadsheetApp.getActiveSpreadsheet();  // アクティブシートを取得
    let file = DriveApp.getFileById(sheet.getId());     // ファイルを取得
    let mail = "";
    
    let editors = sheet.getEditors();                   // シートの編集者を取得
    editors.forEach(function(element){
        mail += element.getEmail() + ",";
    });
    
    editors = file.getEditors();                        // ファイルの編集者を取得
    editors.forEach(function(element){
        mail += element.getEmail() + ",";
    });
    
    console.log(mail);
}
```

「3. ファイルの編集者」は二重で取得されてしまいますが良しとしました。


# 最後に

無事、Google Driveの共有ドライブにあるファイルの編集者を取得できました。

ファイルの共有設定で確認してもどのように編集者権限を付与されたか区別されないので、GASで一部の編集者しか表示されない理由がわからずしばらく悩みました。
ABC081B - Shift only 備忘録 Java

# イントロ
最近AtCoderを始めてみたのですが、初心者向けの問題集AtCoder Beginners Selectionの中のABC081Bで早速躓いてしまいました。
自分なりに噛み砕いてなんとか理解することができたという備忘録です。

# 問題
https://atcoder.jp/contests/abs/tasks/abc081_b


# 回答（例）
```java:Main.java
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int bit = 0;
		for (int i = 0;i < N; i++) {
			bit |= sc.nextInt();
		}
		System.out.println(Integer.numberOfTrailingZeros(bit));
	}
}
```

# 解説
いくつかの整数を同時に、いずれかの数が割り切れなくなるまで2で割るとき、何回割れるかを求める問題です。

## 整数が何回2で割れるか
算数も危うい筆者のような初心者への前提知識として、整数が2で何回割り切れるかは、2進数ので表したとき右側（末尾）に何個ゼロがあるかを見ることで分かります。
| 10進数 | 2進数 |
|--:|--:|
| 1 |  1 |
| 2 | 10 |
| 3 | 11 |
| 4 | 100 |
| 5 | 101 |
| 6 | 110 |
| 7 | 111 |
| 8 | 1000 |
| 9 | 1001 |
| 10 | 1010 |
| 11 | 1011 |
| 12 | 1100 |
| 13 | 1101 |
| 14 | 1110 |
| 15 | 1111 |
| 16 | 10000 |
| ︙ | ︙ |


## ORビット演算( |= )
```bit |= sc.nextInt();```
入力された複数の整数に対して、最も2で割ることができる回数が小さい数についての答えを調べるため、末尾が1になるまでORビット演算を行っています。
ORビット演算ってなに？という方は以下を参考にしてください。

https://wa3.i-3-i.info/word11657.html

要約すると、2つのビット値が与えられたとき、少なくとも1つが1であれば結果は1に、両方が0であれば結果は0になるというものです。
例えば、5(101) と 6(110) にORビット演算を行うと結果は 7(111)になります。

4(100) と 6(110) にORビット演算を行うと 6(110) になり、int型の変数bitに代入されます。
ここで問題に戻りますが、
> いくつかの整数を同時に、いずれかの数が割り切れなくなるまで2で割るとき、何回割れるかを求めてください

4 と 6 が入力された場合、
100 or 110 = 110
となり、末尾にゼロは1つのため、2で割り切れるのは1回となります。

## 出力
```System.out.println(Integer.numberOfTrailingZeros(bit));```
見たことのないメソッドが出てきて若干ビビりましたが、bitのバイナリ表現の末尾にあるゼロの数を数え、その結果を返すものです。

https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Integer.html#:~:text=1.5-,numberOfTrailingZeros,-public%20static%C2%A0int

4 と 6 が入力された場合、
int型の変数 bit には、ORビット演算された 110 が代入されているため、末尾のゼロの数 ```1``` が出力されます。

# 参考
[AtCoderに登録したら解くべき精選過去問10をJavaで解いてみた](https://qiita.com/0x841/items/0ce887c86cf081312a08#)
【SwiftUI】かっこいいゲージを自作する

# はじめに
iOSの標準のゲージでもいいですが、もっとカッコイイデザインのゲージを使いたいので自作してみます。

# 実装
```swift
import SwiftUI

struct CustomGaugeView: View {
    @Binding var value: CGFloat

    private let maxValue: CGFloat

    init(_ value: Binding<CGFloat>, maxValue: CGFloat) {
        self._value = value
        self.maxValue = maxValue
    }

    var body: some View {
        GeometryReader { proxy in
            levelGauge(proxy: proxy)
        }
    }

    private func levelGauge(proxy: GeometryProxy) -> some View {
        ZStack(alignment: .center) {
            Capsule()
                .foregroundColor(.secondary)

            Capsule()
                .fill(LinearGradient(gradient: .init(colors: [.yellow, .orange]), startPoint: .leading, endPoint: .trailing))
                .frame(width: proxy.size.width * (CGFloat(value) / CGFloat(maxValue)))
                .contentShape(Capsule())
                .frame(maxWidth: .infinity, alignment: .leading)
        }
    }
}
```

# 使い方
```swift
import SwiftUI

struct ContentView: View {
    @State private var value: CGFloat = 0
    
    private var maxValue: CGFloat = 100
    
    var body: some View {
        VStack(spacing: 50) {
            CustomGaugeView($value, maxValue: maxValue)
                .frame(height: 23)
            
            Slider(value: $value, in: 0...maxValue)
        }
        .padding(.horizontal, 20)
    }
}
```

:::note warn
**注意**
`frame`で`height`を指定してください
:::

# 動画
![Simulator Screen Recording - iPhone 14 - 2023-06-05 at 22.31.24.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/d87defd8-52e9-0214-6080-b7ac00fd2992.gif)

# おわり
いい感じに作ることができました
【Rails/CanCanCan】authorize_resourceのソースコードを読んでみた

# はじめに

[cancancan](https://github.com/CanCanCommunity/cancancan)というgemでは、`authorize_resource`というメソッドが用意されています。
`authorize_resource`は、以下のように使うと、Controller名から対象のリソースを特定してくれる機能があります。
その特定の仕組みが気になったので、今回はそのコードを対象に読んでみました。

```ruby:books_controller.rb
class BooksController < ApplicationController
  authorize_resource # この場合、Bookに対する権限をチェックしてくれます。

  # ...略
end
```

# コードリーディング

`authorize_resource`メソッドは以下に定義されていました。
`@controller.authorize!`で以前も記事にした`authorize!`メソッドが使われています。
今回はcontrollerから第二引数の`resource_class_with_parent`のソースコードを追っていこうと思います。

```ruby:gems/cancancan-3.5.0/lib/cancan/controller_resource.rb
def authorize_resource
  return if skip?(:authorize)

  @controller.authorize!(authorization_action, resource_instance || resource_class_with_parent)
end
```

`parent_resource`は`through`を使った際に関連しますが、今回は省略します。
`resource_class`の定義を見ていきます。

```ruby:gems/cancancan-3.5.0/lib/cancan/controller_resource.rb
def resource_class_with_parent
  parent_resource ? { parent_resource => resource_class } : resource_class
end
```

`@option`には、`load_resource`に渡しているオプションの情報が格納されています。
今回はオプションを渡していないので、`when nil`に進み、`namespaced_name`を返します。

```ruby:gems/cancancan-3.5.0/lib/cancan/controller_resource.rb
def resource_class
  case @options[:class]
  when false
    # ...略
  when nil
    namespaced_name.to_s.camelize.constantize
  when # ...略
  else
    # ...略
  end
end
```

`namespaced_name`では`namespace`と`name`が使われています。
`namespace`と`name`によって名前空間も含め、コントローラからリソースとなるモデルを特定していました。

```ruby:gems/cancancan-3.5.0/lib/cancan/controller_resource_name_finder.rb
def name_from_controller
  @params[:controller].split('/').last.singularize
end

def namespaced_name
  [namespace, name].join('/').singularize.camelize.safe_constantize || name
end

def name
  @name || name_from_controller
end

def namespace
  @params[:controller].split('/')[0..-2]
end
```

## さいごに

`authorized_resource`でどうやってリソースを特定しているんだろうと思いましたが、調べてみたらRailsの仕組みをかなり活用していることがわかっておもしろかったです。
【問答無用】JavaScriptに引数の参照渡しは無い

# 「参照渡し」　無い

```javascript
function f(&n) { // こんな構文は『無い』ので実行できない
  n = 2;
}

var n = 1;
f(n);
console.log(n); // 参照渡しができたとしたら、出力:2になる
```



# 「値渡し」　有る

```javascript
function f(n) {
  n = 2;
}

var n = 1;
f(n);
console.log(n); // 出力:1
```



# 「(オブジェクト)参照」　有る

```javascript
var o1 = { value: 1 };
var o2 = o1;

o2.value = 2;

console.log(o1.value); // 出力:2
```



# 『「参照」の「値渡し」』　有る

```javascript
function f(n) {
  n.value = 2;
}

var n = { value: 1 };
f(n);
console.log(n.value); // 出力:2
```
サービス監視のいろはのいの一画目、ゆるくまとめる

## 可用性とは？
システムが利用可能な状態である度。

何の値を使用して計算するかは定められておらず、トレンドやサービス内容によって変化する。
過去にはアップタイムやダウンタイムなど「稼働している時間」ベースで計算されていたが、最近はリクエスト数ベースであることが多い。

<details><summary>たとえば</summary>

24時間365日を通して特にリクエスト数が変わらないサービスであれば、「安定して稼働している時間の割合」みたいな評価指標を用いるのも良いが
平日は殆どアクセスがなく、土日にだけ大量のアクセスがある、みたいなサービスの場合、全く同じ指標で評価するのは最適ではない…
といった感じ。
</details>

## 取り巻く用語 SLI、SLO、SLA
### SLI
Service Level Indicator
"Indicator" = 測定器、明記、計器などの指針　などなど。つまりSLIは可用性を評価するための指標。
「これを使って測定するわよ」

### SLO
Service Level Objective
"Objective" = 目的、目標。つまりSLOはサービスの可用性として目標とするラインを表す。
「これを目指すわよ」

### SLA
Service Level Agreement
"Agreement" = 合意、契約。つまりユーザーに向けて約束する可用性がどのくらいかを表す。
「この安定度合いでサービスを提供するわよ」

サービス内容によってはこれを返金保証基準にしている場合もあり、これに基づいて返金対応をしたりする。

## モニタリング
SLA、SLOに沿ってサービスを提供できるように可用性を把握し、コントロールするために
システムが元気かチェックしたり、状況把握のための情報を計測・収集すること。
日本語ではざっくり「監視」と訳されがちで、チェックすることだけを指す場合も多い。

* 外形監視：システムの外部から定期的にユーザの操作を模して、システムが利用可能な状態かどうかを確認する。「最近どう？どのくらい元気？」
* 死活監視：サービスが生きているかどうかを確認する。「生きてる？」

モニタリングする数値（メトリクス）はSLIに応じて変わる。

### モニタリングNGです！の関連語
#### 閾値
「こいつはまずいか？まずくないか？」の基準。
サービスを提供できているとはいえない状況はどこからか？なんらかの対応をしないといけないのはどのくらいから？ということを表現する。

#### アラート、アラーティング
「こいつはまずいことになっていますよ！」という通知がアラート、それを通知することがアラーティング。
閾値に基づいてアラートが必要かどうかを判断する。

#### インシデントレスポンス
「まずいことになってるので、復旧作業します！」と対応すること。
アラートを受けて担当者が作業をする。
障害対応とかアラート対応などと言われる。

#### オンコール
「こいつはまずいことになっていますよ！」という通知を、拘束力や到達力の強い手段（強い通知）で連絡を行なうこと。
よくあるのは電話など。

すぐ気付いて対処できることは良いことだが、用法用量を守って使わないと担当者が疲弊してしまうので注意が必要。

------
<details><summary>🖊ふでおき</summary>
SLI、SLOやメトリクスのベストプラクティス的なヒントが欲しいところだけど、「各々で考えよ」という感じっぽい。
Webサーバを運用保守する人たちは一般にどういった指標を使っているのだろう。
</details>
Arduinoで「Compilation error: no matching function for call to ...」と出た場合の対処法

## 沼ったこと
　なんとなくArduinoでいろいろとしてみたく購入。手始めにサーボモーターを動かそうとすると、コンパイル時点でエラー発生。
```ruby:qiita.rb
...
...
...
Compilation error: no matching function for call to 'PCA9685::PCA9685(int)'
```
 どうやらインクルードしたヘッダーファイルがマッチしないらしい。いやどういうことだよ。

## 単純すぎる解決策
　単刀直入に言うと、原因はいまだ不明。正直Arduino自体があまりメジャーではない（？）ものらしく、これに類似するエラーが全く見当たらなかった。（外国サイトで見つけたが失敗。他全滅）
　途方に暮れていると、GithubでダウンロードしたPCA9685のクラス内ではsetPWMなどのモジュールが健在。ふと思い立って、そのファイルをワークフォルダに移行すると、あっさりと成功した。マジで何なんだこのエラー。

#### やるときの注意点。
ちゃんとインクルードを修正しておくこと。


```diff_c
 #include <PCA9685.h>
```
 を　↓
```diff_c
 #include "PCA9685.h"
```
変えておく。私は普通に忘れてました。
【心労】急に24時間が足りなくなりすぎて詰み詰みに積んでいる件について

聞いて欲しい。
こんなにも月曜日が憂鬱になったのはいつぶりだろう。
学生時代はモラトリアム大好き人間~~なんなら今もモラトリアｍ~~で月曜日のおはようだったダメ人間。
今週は金曜日が終わった瞬間から月曜日が憂鬱だった。
なんならこんな助長でタイトル詐欺の非技術的記事を見る度にイラッとしたダメ人間である。

抽象的に言うと、 __「圧倒的に仕事ができなすぎて憂鬱」__ の一言に尽きる。

テキスト的に言おう。
clone出来ねぇ→できた！！まじ卍
↓
リモートからブランチ持ってきたことないぞ？
切り方間違ったぞ？
→おぉ、！！！我こそはブランチの王様！！！！！
↓
あぁ。nodeのversion下げなきゃだめなのねぇ。ほーん
→げ。nodeバージョン下げるためのnodebrewを使うためのHomebrewをインストールするための。。。
→M1チップね！Rosettaね！Rosettaうん！わかった！
↓
？
current noneて何？もう準備終わったよね？おわたよね？
↓
おし！これでversionの問題も解決したし完璧！(フラグ)
。。。npx?
json serverなぜ認証が返ってこないんだぁぁぁぁぁ
↓
もういい帰る(~~リモワなのでどちらにしろ家~~)
となった月曜日だった

クズでごめんなさい。
今は神記事たちを崇め、先輩方の脛を齧り、頭がワニワニパニックになりながら最後通牒が来るのを松の実。
Elixirの対話モードでパターンマッチの動作を確認してみた

# 概要
Elixirの対話モードでパターンマッチの動作を確認してみました。以下のページを参考にしました。

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

# 対話モードで実行
以下のコマンドを実行しました。
```
$ iex
Erlang/OTP 24 [erts-12.2.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit]

Interactive Elixir (1.12.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> x = 1
1
iex(2)> 2 = x
** (MatchError) no match of right hand side value: 1

iex(2)> list = [1, 2, 3]
[1, 2, 3]
iex(3)> [1, 2, 3] = list
[1, 2, 3]
iex(4)> [] = list
** (MatchError) no match of right hand side value: [1, 2, 3]

iex(4)> [1 | tail] = list
[1, 2, 3]
iex(5)> tail
[2, 3]
iex(6)> [2|_] = list
** (MatchError) no match of right hand side value: [1, 2, 3]

iex(6)> {:ok, value} = {:ok, "Successful!"}
{:ok, "Successful!"}
iex(7)> value
"Successful!"
iex(8)> {:ok, value} = {:error}
** (MatchError) no match of right hand side value: {:error}

iex(8)> x = 1
1
iex(9)> ^x = 2
** (MatchError) no match of right hand side value: 2

iex(9)> {x, ^x} = {2, 1}
{2, 1}
iex(10)> x
2
iex(11)> key = "hello"
"hello"
iex(12)> %{^key => value} = %{"hello" => "world"}
%{"hello" => "world"}
iex(13)> value
"world"
iex(14)> %{^key => value} = %{:hello => "world"}
** (MatchError) no match of right hand side value: %{hello: "world"}

iex(14)> greeting = "Hello"
"Hello"
iex(15)> greet = fn                                       
...(15)> (^greeting, name) -> "Hi #{name}"                
...(15)> (greeting, name) -> "#{greeting}, #{name}"         
...(15)> end
#Function<43.65746770/2 in :erl_eval.expr/5>
iex(16)> greet.("Hello", "Sean")
"Hi Sean"
iex(17)> greet.("Mornin'", "Sean")
"Mornin', Sean"
iex(18)> greeting
"Hello"
iex(19)> 
```

# まとめ
何かの役に立てばと。
Windows10　Ruby3 Rails7にPostgreSQLデータベースを設定する手順

タイトルの通りwindows10　ruby3環境にPostgresqlデータベースを
設定する手順を記録として残したいと思います。

■前提条件
・PostgresqlがPCにインストールされていること
Windows 10
Ruby 3.0.2
Ruby on Rails 7

■新規プロジェクトで PostgreSQL を使用する場合
　下記コマンドを実行しrailsアプリを作成します。
　-dオプションをつけることでデータベースをpostgresql
　に初期設定することができます。

　rails new プロジェクト名 -d postgresql 　


■既存のプロジェクトで PostgreSQL を使用する場合
　すでにrailsアプリがありpostgresqlにデータベースを
　変更したい場合はgemfileを下記のように変更します。
 （sqlite3からpostgresqlに変更）

# 中略
# gem 'sqlite3', '~> 1.4'  # この行をコメントアウト
# 中略
gem 'pg' # この行を追加


■Ruby3.0 に PostgreSQL をインストール
　Ruby2.3 以降の Gem にはデフォルトで PostgreSQL のドライバーが入っ
　ていません。そこで手動でインストールする必要があります。
　下記コマンドを実行するとドライバーがインストールされます。



　ridk exec sh -c "pacman -S ${MINGW_PACKAGE_PREFIX}-postgresql"

インストールを行いますか？と出てきたら y を入力しましょう。これで Gem にインストールされます。
　（インストールに時間がかかります）

# 中略
(15/17) インストール mingw-w64-x86_64-python                  [#################################] 100%
(16/17) インストール winpty                                   [#################################] 100%
(17/17) インストール mingw-w64-x86_64-postgresql              [#################################] 100%

上記の表示がでればインストール完了です。

■bundleinstallする。
　下記コマンドを実行しgemfile.lockを更新させます。

　bundle install


■database.yml の編集
　config/database.yml を開いて下記のように修正する。

default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: postgres
  password: PostgreSQL をインストールしたときに設定したパスワード
  host: localhost

development:
  <<: *default

test:
  <<: *default

production:
  <<: *default
cscの作法 その341

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
closedxmlで九九なxlsxを作れ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/a61291e2-fd1b-b75c-9dbe-f7508bfb63c9.png)


# サンプルコード

```

using System;
using System.IO;
using ClosedXML.Excel;

namespace App
{
	class Program {
		static void Main(string[] args) {
			var filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Book6.xlsx");
			var wb = new XLWorkbook();
			var ws = wb.Worksheets.Add("Sheet1");
			int i;
			int j;
			int s;
			for (i = 1; i < 10; i++)
			{
				ws.Cell(1, i + 1).Value = i.ToString();
				ws.Cell(1, i + 1).Style.Fill.BackgroundColor = XLColor.Aqua;
				ws.Cell(i + 1, 1).Value = i.ToString();
				ws.Cell(i + 1, 1).Style.Fill.BackgroundColor = XLColor.Aqua;
			}
			for (i = 1; i < 10; i++)
			{
				for (j = 1; j < 10; j++)
				{
					s = i * j;
					ws.Cell(i + 1, j + 1).Value = s.ToString();
				}
			}
			wb.SaveAs(filePath);
			Console.WriteLine("ok");
		}
	}
}





```

以上。
Laravel SailでMeCabを使いたくなったので、動くようにしてみた。

# はじめに
Laravelはお好きですか？
なんだかんだ結構使っているわけですが、ふとしたことから久々にMeCabを使う必要が出てきたので、普段の開発で使っているSail環境でMeCabを使うにあたって、いろいろいじってみたので、備忘録として書いてみようかと思いました。

# やったこと
### とりあえずLaravel Sail環境を作る
お決まりのあれ。
~~~bash:bash
composer create-project laravel/laravel mecab
cd mecab
composer require laravel/sail --dev
php artisan sail:install
~~~
### Sailのdocker関連ファイルを書き出す
こんな感じで設定ファイルを書き出す。
以降は書き出されたファイルだけ編集する。
~~~bash:bash
php artisan sail:publish
~~~
### appコンテナのDockerfileを編集
何はともあれ、MeCab関連をインストール。
~~~Dockerfile:./docker/8.2/Dockerfile
RUN apt-get update\
    ~（中略）~
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# ここから追加
RUN apt-get update\
    && apt-get install -y mecab libmecab-dev mecab-ipadic-utf8\
    && apt-get clean\
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
~~~
### おまけにmecab-ipadic-NEologdも入れたい
辞書がイケてないと、求めた状態にならないので、イケてる辞書を入れたい方はこちらも。
https://github.com/neologd/mecab-ipadic-neologd
新語にやたら強かったりして、これがないと色々辛いと思っている・・・。
~~~Dockerfile:./docker/8.2/Dockerfile
RUN groupadd --force -g $WWWGROUP sail
RUN useradd -ms /bin/bash --no-user-group -g $WWWGROUP -u 1337 sail

# ここから追加
RUN cd /home/sail\
    && git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git\
    && ./mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n --asuser -a -y -p /home/sail/dic\
    && cd ..\
    && rm -rf mecab-ipadic-neologd
~~~
ユーザーが作られた後にやるのがミソ。
インストールのオプションは色々あるけど、今回は全部盛りのために-aをつけてます。
正直、-aはなくても良いかも。用途次第でよしなにどうぞ。
### sailを起動
PATH通してあるので、そのまま打てるけど、通してない方はドキュメントをどうぞ。

https://readouble.com/laravel/10.x/ja/sail.html

こんな感じでバックグラウンド起動。
~~~bash:bash
sail up -d
~~~
辞書のダウンロードやら何やらに時間がかかかるはず。
お茶でも飲んで待ちましょう。

# とりあえず使ってみる
今回、php-mecabを使っていないのです。
**permission deniedにいじめられすぎて、ちょっと折れました。**
あと、権限まわりの設定色々追加しすぎると、元のSailからかけ離れるのも嫌だったのも言い訳にしたい・・・。

https://github.com/youaoi/php-mecab

とりあえず今回はこちらのお世話に。
~~~json:composer.json
    "require": {
        "youaoi/php-mecab": "dev-master"
    },
~~~

~~~bash:bash
sail composer update
~~~
としておけば良いでしょう。

### 動けば良いのである

~~~php:route/web.php
use Youaoi\MeCab\MeCab;

# 今回の手順でmecab-ipadic-NEologdを入れた場合はこれを追加。
# .envに書くとかすると、本番と開発で分けられたりして良いと思う。
MeCab::setDefaults([
    'dictionaryDir' => '/home/sail/dic',
]);

Route::get('/', function () {
    $mecab = new MeCab();
    $text = "吾輩わがはいは猫である。名前はまだ無い。";
    dd($mecab->parse($text));
});
~~~
もう何も考えず、ルーティング直。動くかどうか見るだけだし。
localhostにアクセスして、、、
![スクリーンショット 2023-06-05 20.38.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26848/654c5a24-d04c-be16-13f4-e2d41676ecf6.png)
こんな感じで表示できたら動いてる。ってことで。
あとはcontrollerから使うなりなんなりできるはず。

# さいごに
ほ、本当にこれでいいのだろうか・・・。
もっといい方法ありそうなんだよなあ。と思っています。
様々なワイヤレス通信技術

# はじめに
毎週1本様々な技術に関する記事を投稿しています。
もし興味のある方は下のリンクから他の記事も見ていただければ幸いです。
 [@7_inai_](https://qiita.com/7_inai_)


# ワイヤレス通信技術紹介
この記事では、IoTデバイス間の通信に使用されるワイヤレス通信技術を紹介します。


## Wi-Fi
Wi-Fiは、無線LAN（Wireless Local Area Network）の一種で、比較的短い距離で高速なデータ通信を提供します。Wi-Fiは一般的に家庭やオフィスのネットワークに使用されますが、IoTデバイス間の通信にも利用されます。

## Bluetooth
Bluetoothは、近距離でのデータ通信に使用される技術で、主に個人用デバイス間の通信に適しています。Bluetoothは、各IoTデバイスとスマートフォン、スマートウォッチ、ヘッドセットなどの周辺機器との接続に広く利用されます。

## Zigbee（ジグビー)
Zigbeeは、低電力消費と短い通信範囲が特徴のワイヤレス通信規格です。IoTデバイス間の短距離通信に使用され、センサーネットワークやスマートホームのアプリケーションで広く利用されています。


## Z-Wave（ジーウェーブ）
Z-Waveは、低消費電力のワイヤレス通信技術であり、スマートホームデバイスの制御や監視に使用されます。Z-Waveは、センサーやアクチュエーターといったIoTデバイスを接続するためのメッシュネットワークをサポートします。
また、低消費電力であるため、電力源が近くにないIoTデバイスの通信で有効です。


## LoRaWAN（ローラワン）
LoRaWANは、長距離での低消費電力通信を実現するワイヤレス通信プロトコルです。LoRaWANは、センサーネットワークやスマートシティ、産業用途など、遠距離通信が必要なIoTプロジェクトに使用されます。

## Narrowband IoT（NB-IoT）
NB-IoTは、LPWA(Low Power Wide Area)性能を持ったLTEの規格です。モバイルネットワークの下り周波数帯域を使用して、IoTデバイスとの通信を実現することができます。NB-IoTは、広範なカバレッジと低消費電力の特徴を持ち、モバイルネットワークのインフラストラクチャを活用するため、デバイスのデプロイメントが比較的容易です。


# 終わりに
これらは一部のワイヤレス通信技術の例ですが、IoTデバイス間の通信には他にも様々なプロトコルや技術が存在します。使用するワイヤレス通信技術は、プロジェクトの要件や制約に応じて選択されます。

最後までお付き合いくださりありがとうございました。
【ShellScript】配列に値を追加する方法

## `array+=(value)`

次のように`+=`を記述することで配列に要素を追加できます。

```bash
array+=("追加したい値")
```

```terminal
$ array=("sample" "test")

$ array+=("example")

$ echo "${array[@]}"
sample test example
```

## `array[i]="value"`

また次のようにインデックスを指定して要素を追加することもできます。

```bash
array[インデックス]="追加したい値"
```

```terminal
$ array=("sample" "test")

$ array[2]="example"

$ echo "${array[@]}"
sample test example
```
GASでよく使うメソッドまとめ

よく使うメソッドをまとめてみました。

## 【シート】
### スプレットシートとシートの取得
スプシの取得方法は主に3つ
- アクティブなスプレットシートを取得する`SpreadsheetApp.getActiveSpreadsheet()`
- IDで取得する`.getId()`
- URLで取得する`.getUrl()`



シートの取得には
- アクティブなシートを取得する`SpreadsheetApp.getActiveSheet()`
- シート名を取得する`.getName()`
- 特定のシート名で取得する`.getSheetByName()`

の方法があります。



```
// スプシを取得できる
const ss = SpreadsheetApp.getActiveSpreadsheet();
// スプシのシートを取得できる
const sh = ss.getSheetByName("シート名");
// スプシのIDを取得できる
const ssId = ss.getId('SPREADSHEET_ID');
```

`.getActive○○○`は基本的にアクティブなスプシやシート情報を取得できます。
基本的にアクティブなスプシで指定することが多いですが、限定的なスプシを取得する場合はIdで取ってくることが多いです。

スプシとシートの取得をまとめて書くとこんな感じに↓
```
const activeSh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート名")
```

### シートでよくつかうメソット
```
//シートのコピー　.copyTo()
const newSh = sh.copyTo(ss);

// シートアクティブ化
newSh.activate();

// シートの順番
ss.moveActiveSheet(2);

//シート名の変更・指定
newSh.setName('ここにシート名');  
```
- コピー元のシート.copyTo(コピー先のシートが生成されるスプシ)
- アクティブなスプシの2番目に移動もしくは生成される。


### 列や行の取得
```
//行(横)の取得
let lastCol = activeSh.getLastColumn();
let rowData = activeSh.getRange(1,1,1,lastCol).getValues();

// 列（縦）の取得
let lastRow = activeSh.getLastRow();
let colData = activeSh.getRange(1,1,lastRow,1).getValues();
```

- 空白のセルは省いて取得しています

## 【カレンダー】

- 日付操作が多いので[Utilitiesメソッドがかなり便利](https://iwb.jp/gas-google-apps-script-7-utilities-method/)
- 日付回りの「０」は「1カウント」。nullじゃない。
- 祝日判定はメソッドで取得できないのでGoogleカレンダーの「祝日カレンダー」で判定するのが良さげ


### 日付の取得
```
const date = new Date();
```

### 月の取得
```
// 当月の月初
let startMonth = new Date(date.getFullYear(), date.getMonth(), 1);
// 当月の月末
let endMonth = new Date(date.getFullYear(), date.getMonth() + 1, 0);
// 翌月の月初
let nextMonthDate = new Date(date.getFullYear(), date.getMonth() + 1, 1);
  Logger.log(nextMonthDate)

// 日付フォーマット
let nextMonthDate = Utilities.formatDate(data, 'JST', 'yyyy/MM/dd')
```

- 月を取得する際に`date.getFullYear()`が抜けるととんでもない昔まで遡ってしまうので、月取得の際は必ず入れる
- getMonth()の戻り値が「0（1月） - 11（12月）」なので戻り値に「+1」しないと日付がずれる
- 月末の出し方は「翌月 + 0（翌月の前日＝当月の最終日）」
月末最終日から1つ前の日付が取得したい場合は「-1」などにして調整。
ストログパラメータって何？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/6357eb32-abc6-3995-98c3-b8426c7011f0.png)
１：ストロングパラメータとは
　web上から受け付けたパラメータが、本当に安全なデータかどうかを検証した上で、取得するための仕組みです。rails4から実装されています。

２：ストロングメータがなぜ、必要なのか？
　この仕組みを使うことで、意図しない（安全でない）データの登録・更新を防いでくれます。
　具体的にどうやって防ぐかというと、メソッドに予め登録・更新を許可するカラム名を指定しておきます。そうすると、未許可の絡むデータが送られてきても、データの登録前に未許可であることを検出し、登録対象として無視することができます。
エラー文：Unpermitted parameters: :カラム名と表示される。

３：エラー文：Unpermitted parameters: :カラム名の解決方法
　解決方法の１つ：ストロングパラメータで許可したいカラム名を記述する。
Windows11環境でCPU負荷の高い長時間かかるバッチ処理をしたい（動画エンコ等々）

# 普段の作業に影響させたくない
ファイルエンコ、時間がかかります。
今の動画はh265？AV1？いずれにせよ、モダンな形式はエンコに大量の時間がかかかります。
それの数が増えるともう大変。24時間PCをシャットダウンせずに動かしたくはないし。。
Windowsだと、夜中に自動でスリープに入ってムダな時間を使うことにもなりそうです。なんど朝になって涙をのんだことか。
長い間、この時間のかかる継続処理に対して、うまい解決策を思いつかずにいたのですが今回ようやく解決しそうな対処を思いつきました。
仮想環境を構築してのバッチ処理、です。

# そもそも安定した環境で動かしたい、エラー落ちするし
PC作業のウラでエンコを走らせてると、結構エラー落ちしてるんですよね。
プロセスワーカーが異常終了的なログが残っているのですが、Hyper-Vの仮想マシン上ではそんなエラーはめったにおきないようでした。
やっぱり色々作業してるとOSさんも大変なんでしょう。仮想マシンの中で一個の作業に集中させれば解決。

# ただしグラボ使ったGPUエンコなどはなし、あくまでCPUを使ったソフトエンコメイン
これは注意。うちの環境ではエンコテストした結果、GPUエンコオプションを使うとダメダメだったので問題ありませんでした。

# あまり意識したくないし、処理を中断→再開みたいにいちいち手をいれたくない
先に触れたように、あまりバッチ意識して生活を変えたくありません。
夜はPCの電源を切りたいし、昼間は仕事前に新たなルーチンなど組み込みたくもありません。昼休みに再起動だってしたいし。
すべて自動、バックグラウンドで完結してほしい。常時起動サーバでも使わないと無理では、、と思ってたんですが。
Windows11にある、（10にもあったかも）Hyper-Vを使ってバッチを仕込めば解決しそうで、うまくいった感じなので今回メモ。

# Hyper-Vで仮想環境を作ってエンコがおすすめ
https://pc.watch.impress.co.jp/docs/column/win11tec/1381698.html
とりあえず、上記記事に従って環境構築。
注意点としては、クイック構築の無料Windows11を使うとバッチ処理には向かないということ。
マイクロソフトのサイト側に、これは1時間で電源落ちちゃうという注意書きがありました。
素直にライセンス用意するかUbuntuを入れるかして構築しましょう。
別に対応してるエンコソフトなりがLinuxにあるならば、Windowsにこだわる必要もないのです。
普段Windows11を使ってる方むけの記事ではありますが。

仮想マシンの設定を見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25349/1907358a-eb42-9e6c-9b87-526a2c7278c2.png)
プロセッサ数などは調整してやるといいと思います。
うちは仮想環境に8割程度のCPUパワーを預けていますが、まあファンも常時うならずちょうどいい感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25349/e12056e9-409a-8a39-23c1-f4d1df30527e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25349/97c9de68-32d3-6a7c-a525-adf3c8906e21.png)

自動開始アクション、自動停止アクションについてはこう設定するのがおすすめ。
シームレス再開、終了。詳細は次のセクション。
預けたいバッチ処理がなくなった場合は自動起動しないような設定に直しておきましょう。

## 中断・再開のやり方（一時停止する場合は「保存」から。「一時停止」はダメ）
Hyper-Vの仮想マシンの設定から、ホストPCのシャットダウン・ログオン時に連動させて終了→自動再開する設定ができる。
普段のPCのシャットダウン時には自動でバッチの継続状態が維持され終了し、PC起動時に自動的に再開してくれる。イメージとしてはスリープ運用に近いのだろうか。仮想環境なのでもっとシームレス感がある模様。
バッチ処理があるから・・といって仕事PCの生活リズムを変える必要もないね。
もちろん処理中ファイルをいじったらバグっちゃうだろうけど、それだけ注意すれば意識せずシームレスにバッチ処理が継続してくれるみたい。

### ちょっと一時的にホストPCにパワーが必要、という場合
ちょっと一時的にホストPCにパワーが必要、という場合はバックグラウンドで動いているHyper-V仮想マシンを止めてしまうことも可能。
一時停止する場合はHyper-V「保存」（オレンジボタン）から。「一時停止」はダメ。バッチが一時停止してしまう模様。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25349/dab9d373-9a05-88b5-5376-a88f766187df.png)

# お手軽に仮想環境の様子をみるショートカットの作成方法
```C:\Windows\System32\vmconnect.exe 127.0.0.1 "HyperV_Win11_hogehoge"```
デスクトップあたりで右クリックして「ショートカットの作成」から上記みたいな感じで仮想マシン名を指定して一発起動させることも可能。管理者として実行するのにチェックを入れる必要はあるかも。

# 終わりに
とりあえず仮想マシンにOSインストールとかその後の構築系は書く必要ないと思うので割愛です。
うちではNAS上のファイルを読んで、そのままNAS上にエンコファイルの書き出しを行うようにやってます。
仮想環境に完全バックグラウンドで任せることで、気長に意識せず処理を継続させられるので出来る鷹揚な芸当ですな。

一点、昼間にPCが熱落ちすることがありました。
その場合は仮想マシンの「プロセッサ数の割り当て」設定を見直してホストCPU負荷を下げるのが対応策になりそうです。
エンコ時間はよりかかるようになりますが、まあ仕方ないでしょう。。

気長な重い処理もこれで怖くなくなりました。
ローカルでCSVファイルを作ってダウンロードさせる

# 諸元
処理の結果をファイルとして返すけど、ユーザーの任意のタインミングでダウンロードさせたい。
そうするとバックエンドでファイルを作り込んでおいて永続化（S3とか）するか、セッションにバイト配列として保持しておくか、または取得リクエストの際に別途作るのか・・・・・・。

いろいろやり方はあると思うのですが、データだけフロントに返しておいてフロント側で構築すればいいのでは？と思いました。
もちろん、ファイルの容量が大きくなってしまうような場合は取れない手段だと思うのですが。

また、ファイルの文字コードにはShift_JISとUTF8の2種類を出しわけられるようにするとします。

# 実現方法

## バックエンド

適切な文字コードで表現したCSV内容をバイト配列化、Base64エンコードした文字列として返却します。
Springでの例です。

```java
model.addAttribute("bytes", Base64.getEncoder().encodeToString(file.toByteArray()))
```

適当に埋め込んでおきます。

```html
<input type="hidden" id="data" value="${bytes}" />
```

## フロントエンド

```javascript
// Base64からバイト配列に復元する
const bs = atob($('#data').val());
const bytes = new Uint8Array(bs.length);
for (let i = 0; i < bs.length; i++) {
    bytes[i] = bs.charCodeAt(i);
}

// Fileオブジェクトを作る
// 第一引数がデータ
const file = new File([bytes.buffer], 'hoge.csv', {type: 'text/csv'});

// ダウンロード用a要素を作って
const a = document.createElement('a');
a.download = 'hoge.csv';

// fileを対象としたURLを作る
a.href = URL.createObjectURL(file);
document.body.append(a);
a.click();
```

単に持ってる文字列をファイル化したいなら第一引数は`['hoge']`みたいな感じでいいんですが……。
自分用Linuxコマンド辞典（随時更新）

### sed
- テキストの処理ができる（文字列を全置換したり、行単位で抽出したり、削除したり）
- ワンライナーで強いらしいのでテクニカルなことができそう？

```terminal
sample.txtのrakusを全てRAKUSに置換
sed -e 's/rakus/RAKUS/g' sample.txt

sample.txtの半角スペースを削除
sed -i "s/ //g" sample.txt
```

### （随時更新）
Fluent Bit備忘録

久々に触ったら色々忘れていたのでメモ。本当にただのメモ。

### INPUTプラグインによるデバッグ
syslogに吐かせて見る場合、syslogプラグインの設定を挟むため加工されているデータを見ることになりがちなので、stdoutで見た方が簡単かつ正確。
```
[OUTPUT]
  Name   stdout
  Match  kube.*
```
OUTPUTプラグインを複数書いても問題ないので、調べ物をしている最中は基本stdoutにも吐いておくとよい。

### Parserの挙動
ログを構造化する。正規表現の場合、キャプチャーグループで利用する。
```
192.168.2.20　- test_user 
```
というログがあった場合に以下の正規表現を適用すると、
```
  Name 	  apache
  Format  regex
  Regex   ^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) 
```
以下のように仕分けられる。
```
host: 192.168.2.20
user: test_user
```
### OUTPUTプラグインの項目

`Syslog_Hostname_key`や`Syslog_Appname_key`など`Syslog_xxxx_key`となっている項目は、RFCに準拠したSyslogフォーマットに沿って値を渡している。
ここに渡す値は`Parser`や`Filter`で分解した時のキャプチャーグループとマッピングする。

例えば前述のParserを通したデータであれば、
```
Syslog_Hostname_key  user
```
と設定すると、syslogのhostnameの項目は`test_user`となる。（やらないけど）

### FILTERプラグインnestの効果
入れ子構造について、入れ子を入れたり(nest)消したり(lift)出来る。
```
{"stream"=>"stderr", "logtag"=>"F", "message"=>"...", "kubernetes"=>{"pod_name"=>"vsphere-csi-controller-587b8f69db-qpk48", "namespace_name"=>"kube-system", ...
```
上のようなログがある時、
```
 [FILTER]
    Name                nest
    Match               *
    Operation           lift
    Nested_Under        kubernetes
```
のFilterを通してやると、
```
{"stream"=>"stderr", "logtag"=>"F", "message"=>"...", {"pod_name"=>"vsphere-csi-controller-587b8f69db-qpk48", "namespace_name"=>"kube-system", ...
```
と`"kubernetes"=>{}`が消えた状態になる。
OUTPUTプラグインで
```
Syslog_Appname_key   pod_name
```
と書いても、`"kubernetes"=>`部分が邪魔になって適切に値を渡せないので、そういう場合は上記のFILTERを利用する。
Kubernetes Filterを使ってsyslog出力する際に、
```
        Syslog_Appname_key   pod_name
        Syslog_Procid_key    container_name
```
としていた場合、nestプラグインによるliftなしでのvRLIの表示は以下。
![1685960892688.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/39aa4b60-880d-6bb8-2d15-778ebc29de0b.png)
適切にpod_nameやcontainer_nameが渡せていない。
liftありの表示は以下。
![1685960947551.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/87a90ed9-54fd-572b-47b7-f5cf1fb6793d.png)
appnameやprocidに値が渡っていることが分かる。

### ログのロスト対策
バッファリングレイヤはデフォルトだとメモリのみで動作するが、ストレージに出力することも出来る。
参考：https://docs.fluentbit.io/manual/administration/buffering-and-storage
以下も参考になった。
[FluentBitのログ欠損調査&対策](https://joniy-joniy.hatenablog.com/entry/2020/10/31/203559)

### クラスタ名の設定
TKG用に配布されている？Fluent Bitの[設定ファイル](https://developer.vmware.com/samples/7687/fluent-bit-package-configuration-file-for-tanzu-kubernetes-grid-v1.4?h=fluentbit#code)に以下の項目がある。
```
Syslog_Hostname_key  tkg_cluster
```
ただ、tkg_clusterは自分で設定しない限り設定されることはないので、自分で以下のように設定する。
```
[FILTER]
    Name                  modify
    Match                 kube.*
    Set                   tkg_cluster <クラスタ名>
```
クラスタ名はWorkload Cluster内で取得するのは難しいと思われるので、自動設定しようと頑張るよりは、ハードコーディング的に書いてあげた方が楽かと思われる。

### 1行のサイズ
Inputは`Buffer_Chunk_Size`や`Buffer_Max_Size`で制御するが、OUTPUT側も設定が必要な場合がある。[syslog output plugin](https://docs.fluentbit.io/manual/pipeline/outputs/syslog)を使う場合は`syslog_maxsize`で設定する。デフォルトが2KBまでしか出力してくれないので、1行のサイズが大きい場合はこちらも大きく設定しておく。
```
      [OUTPUT]
        Name   syslog
        Match  *
        Host   10.41.78.83
        Port    514
        syslog_maxsize 16384
```
ポータブル電源 EcoFlow River2 MaxをAPIで情報取得する

　EcoFlow社のポータブル電源は管理サイトにアクセスすれば、電源の情報を取得できます。稼働記録を取るために、都度ディスプレイを見て、数値入力するなんてことは避けたいものです。
　私は、寿命が長いといわれるリン酸鉄リチウム電池シリーズのRiver2商品を購入しました。サポートセンターに問い合わせたところ、[Delta Miniの事例](https://qiita.com/kshimach@github/items/6b919ea78ea1541623b2)とは少し異なる様です。River2での事例として、私が確認した事例を紹介します。
## Keyの取得
　サポートセンターに問い合わせると、幾つかの質問に答える必要がありました。
~~~
[購入者]
・名前：
・住所：
・電話番号：
[対象商品]
・製品型名：
・シリアルナンバー：
・購入時期：
・購入店舗：
[追加情報]
・領収書の写し
・EcoFlowアプリのアカウント（メールアドレス）
~~~
　使途不明な事項に回答する必要がありました。これに応答すると、サポートセンターからcurlコマンドの例文が提示されました。

### コマンド応答例

~~~
$ curl -X GET \
https://api.ecoflow.com/iot-service/open/api/device/queryDeviceQuota?sn=シリアルナンバー \
 -H 'Content-Type: application/json' -H 'appKey: 鍵1' -H 'secretKey: 鍵2'
{"code":"0","message":"Success","data":{"soc":72,"remainTime":1998,"wattsOutSum":9,"wattsInSum":20}}
$
~~~
　上記例では、シリアルナンバー・鍵１・鍵２と表現していますが、実際は英数字列です。"code"が"0"のときは成功しているようです。スマートフォンアプリと数値比較すると、"data"の意味するところを推定できます。
|key値|value値|単位|
|:---|:---|:--|
|soc|電池残量|%|
|remainTime|残り時間|60で割った商が時間、余りが分|
|wattsOutSum|消費電力|W|
|wattsInSum|充電電力|W|

### curlコマンドからnodejsへの移植例
　シェルコマンドだと問い合わせの都度プロセスが立ち上がるのが気になります。nodejsのhttpsを使えば、プロセスフォークを止めることができます。
~~~
$ node <</E
require("https").request(
        "https://api.ecoflow.com/iot-service/open/api/device/queryDeviceQuota?sn=シリアルナンバー",
        {headers: {"Content-Type": "application/json",
                "Content-Length": "0",
                "appkey": "鍵1",
                "secretkey": "鍵2"}
        }, _0=>{const w=[]
                _0.on("data", _1=>w.push(_1))
                _0.on("end", ()=>console.log(String(w)))
        }).end()
/E
{"code":"0","message":"Success","data":{"soc":72,"remainTime":1998,"wattsOutSum":9,"wattsInSum":20}}
~~~
　console.logは標準出力でありますので、データーベース出力に書き替える必要があるのは、言わずもがなです。
Mac のSystem ボリュームがデカすぎて本気で困っている人へ

## 概要
Macを使っていてSystemボリュームが半端なくデカくて困っている人へ。
Dockerを使っているのであれば、Dockerのファイルがかなり容量を取っている可能性があります。

## 注意
このコマンドでは基本的に全てのDocker関連のイメージ、ボリュームなどが消えるので、
自己責任で行ってください。
自分は何回か試しました。
Dockerを使っているとまた大きくなるので、定期的に消してもいいと思います。

## 解決策

```
~/Library/Containers/Docker/Data/vms/0/data
```

とかの下に大変でかいファイルがあるので、消したければ消しましょう。


![Screen Shot 2023-06-05 at 17.59.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/63c6b117-4421-5389-31fa-d1bb210da509.png)


先ほども書きましたが、Docker関連のファイルは消えてしまうので、
自己責任でやりましょう。


@kenmaro
HTMLまとめ

HTMLについて学習したものをまとめる。
今後、新たに学習したものも追記すること。

■タグ
以下のように開始タグと終了タグを囲うことで見出しやリンクを作成可能。タグを付ける際、tabを押すと自動補完される。
また、タグで囲い込んだ単位を要素という。
指定がなければ格要素は縦に並んで表示される。
例)
`<h1>見出し</h1>`

○タグの種類
・見出し
`<h1></h1>`で囲む。headingの略。
数字が大きほど見出しの文字は小さくなる。

・段落
`<p></p>`で囲む。paragraphの略。
見出し以外の小さい文などはこのタグを使う場合が多い。

・コメントアウト
`<!--><-->`で表記。

・リンク
`<a></a>`で囲む。囲まれた文字がリンクとして表示される。
`<a href="https//~~~">文字列</a>`でリンク先URLにとべるようになる。
タグ内にあるhrefのようなものを属性という。

・画像
`<img src="https//~~~">`でリンク先の画像を表示できる。
テキストを表示させるわけではないので終了タグは無し。

・リスト
以下のようにリストにしたい文字をliで囲み、liタグをulタグで囲む。
また、ulのように要素を囲む要素を親要素、囲まれる方を子要素という。
`<ul>`
`<li></li>`
`<li></li>`
`<li></li>`
`</ul>`

・文字指定
文中の特定文字のみ指定して個別に設定したい場合、以下のようにspanで囲む。
`<h1>`
`ここの<span>特定文字</span>だけ指定`
`</h1>`

・改行
特定部分を改行したい場合、以下のようにbrで囲む。
`<h1>`
`ここの<br>特定文字</br>だけ改行`
`</h1>`

・グループ分け
それぞれの要素をグループで分けたい場合、以下のように囲む。
class属性をつけて設定する場合が多い。
下の場合、header全体にCSSなどを設定したい場合、headerクラスをCSSで指定する。
header-logoのみの場合、header-logoクラスをCSSで指定する。
`<div class="header">`
`<div class="header-logo"></div>`
`</div>`
`<div class="main">`
`</div>`
`<div class="footer">`
`</div>`

・テキスト入力を受け取る
以下のように１行のみはinput、複数行はtextareaで指定する。
type属性を追加すると送信ボタン、そこからvalue属性を追加すると
ボタンに表示される文字を変更できる。
`<input type="submit" value="保存">`
`<textarea>`

■要素
○インライン要素とブロック要素
インライン要素とは行の一部として要素内にある要素。他の要素と同じ行に配置され、
幅や高さの設定をしても変更されない。
行の中で連続したまとまりとしてカウントされるため改行もされない。
例)`<a>`,`<span>`など

ブロック要素とは行全体としてある要素。１つの塊として全体の構造を作る。
インライン/ブロックを問わず、要素の中に要素を含むことができる。
例)`<div>`,`<p>`など

■属性
`<a href="https//~~~"></a>`のようにタグ内に属性を入れることで
指定した要素のみを個別にカスタマイズして設定できるものを属性という。
以下を忘れないようにする。
①必ずタグの後ろに半角スペースを入れること
②属性の後ろは=""で囲むこと
③属性と=""の間はスペースを開けないこと


○属性の種類
・class
特定の要素のみにCSSで設定を入れたい場合はclassでタグに名前をつけ、指定する。

・href
リンク先を指定。詳細は前述参照。

・btn
ボタン。"btn ✖️✖️"のように✖️✖️の部分にボタン内で表示される文字を指定する。

・fa
フォントオーサム。アイコンを追加できる機能。
"fa ✖️✖️"のように✖️✖️の部分に追加するアイコンを指定する。

・type属性

■全体構造
全体のHTMLは以下のように記述する。これで1つのWebページになる。
詳細は後述。

`<!DOCTYPE html>`
`<html>`
`<head>`
`</head>`
`<body>`
`</body>`
`</html>`

○!DOCTYPE html
HTMLのバージョン宣誓

○head
Webページに関する設定を記述。Webページに表示されない。
指定するものは以下３つ。

・文字コード
以下のように指定。HTMLではUTF-8推奨。
`<meta charset="utf-8">`

・ページタイトル
以下のように指定。ブラウザのタブに表示される。
`<title>タイトル</title>`

・読み込みファイルの指定
CSSの場合、以下のように指定。
`<link rel="stylesheet" href="CSSのファイル名">`

○body
Webページに表示されるものを記述する。
コンテンツのコアの部分。詳細はレイアウトで記載する。

■レイアウト
bodyでWebページに表示されるコンテンツはヘッダー、メイン、フッターの
３つで構成される。
それぞれの構成をdiv要素でグループ分けする。
Rubyのp、pp、puts、printメソッドの違いについて

Rubyには、データの表示や出力に使用されるさまざまなメソッドがあります。その中でも特によく使われるメソッドとして、`p`、`pp`、`puts`、`print`があります。それぞれのメソッドは、データの表示や出力に異なる方法を提供しています。以下でそれぞれのメソッドの違いについて詳しく説明します。

## p

`p`メソッドは、引数として与えられたオブジェクトをそのまま出力します。オブジェクトの内容がそのまま表示され、オブジェクトの詳細な情報が含まれます。主な特徴は次のとおりです。

- オブジェクトの内容がわかりやすく表示される
- デバッグや検証に便利
- メソッドの戻り値も表示される


## pp

`pp`メソッドは、引数として与えられたオブジェクトをきれいに整形して出力します。オブジェクトの要素や構造が視覚的にわかりやすく表示されます。主な特徴は次のとおりです。

- オブジェクトの要素や構造がきれいに整形される
- 配列やハッシュの要素が改行されて表示される


## puts

`puts`メソッドは、引数として与えられたオブジェクトを改行を含んで出力します。オブジェクトの内容が表示された後、改行が追加されます。主な特徴は次のとおりです。

- オブジェクトが一行ずつ表示され、最後に改行が追加される
- 配列の要素ごとには改行して表示される

## print

`print`メソッドは、引数として与えられたオブジェクトを改行を含まない形式で出力します。オブジェクトの内容が表示された後、改行は追加されません。主な特徴は次のとおりです。

- オブジェクトが一行で表示され、改行は追加されない
- 配列やハッシュの要素は改行されずに連続して表示される

これらのメソッドは、データの表示や出力において異なる目的と使い方を持っています。`p`メソッドはデバッグや検証に便利であり、`pp`メソッドは複雑なデータ構造の整形表示に適しています。`puts`メソッドは改行を含んだ出力を行い、`print`メソッドは改行を含まない出力を行います。

## 例
```
# 例1
data = {
  name: "John Doe",
  age: 30,
  hobbies: ["programming", "reading", "gaming"],
  address: {
    city: "Tokyo",
    country: "Japan"
  }
}

# pメソッド
p data
#=> {:name=>"John Doe", :age=>30, :hobbies=>["programming", "reading", "gaming"], :address=>{:city=>"Tokyo", :country=>"Japan"}}

# ppメソッド
pp data
#=> {:name=>"John Doe",
#    :age=>30,
#    :hobbies=>["programming", "reading", "gaming"],
#    :address=>{:city=>"Tokyo", :country=>"Japan"}}

# putsメソッド
puts data
#=> {:name=>"John Doe", :age=>30, :hobbies=>["programming", "reading", "gaming"], :address=>{:city=>"Tokyo", :country=>"Japan"}}

# printメソッド
print data
#=> {:name=>"John Doe", :age=>30, :hobbies=>["programming", "reading", "gaming"], :address=>{:city=>"Tokyo", :country=>"Japan"}}


# 例2
data = [1, 2, 3, 4, 5]

# pメソッド
p data
#=> [1, 2, 3, 4, 5]

# ppメソッド
pp data
#=> [1, 2, 3, 4, 5]

# putsメソッド
puts data
# 1
# 2
# 3
# 4
# 5

# printメソッド
print data
#=> [1, 2, 3, 4, 5]

```

以上が、Rubyの`p`、`pp`、`puts`、`print`メソッドの違いについての詳しい説明です。適切なメソッドを選択して、データの表示や出力に活用してください。
Rubyのchunkメソッドの使い方と動作について

rubyのプログラミング問題を解いているときに、模範解答でchunkメソッドというものを見かけたので、どんなメソッドか調べてみました。

## 概要

`chunk`メソッドは、Rubyの`Enumerable`モジュールに定義されているメソッドの一つです。このメソッドは、要素をグループ化するために使用されます。要素を特定の条件に基づいてグループ化することができ、その結果をイテレータとして利用することができます。

`chunk`メソッドは特に、データの連続したグループを作成したい場合や、連続した要素をまとめて処理したい場合に便利です。

## 使用法

`chunk`メソッドは、以下のように使用します。

```ruby
enumerable_object.chunk { |element| block }
```

`enumerable_object`は`Enumerable`モジュールをインクルードしたオブジェクトであり、`element`はイテレータの各要素を表します。`block`は、要素をグループ化するための条件を指定するブロックです。

## 動作

`chunk`メソッドは、イテレータの要素を順番に評価し、連続する要素が同じグループに属する場合にそれらをまとめます。ブロック内の条件に基づいてグループ化が行われ、グループごとに配列の形式で結果が返されます。

### 例1
整数列を連続する奇数/偶数に分ける例を見てみます。「n.even?」の値が切り替わるところで区切られているのがわかるでしょう。

```ruby
[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5].chunk {|n|
  n.even?
}.each {|even, ary|
  p [even, ary]
}
# => [false, [3, 1]]
#    [true, [4]]
#    [false, [1, 5, 9]]
#    [true, [2, 6]]
#    [false, [5, 3, 5]]
```

この結果は、偶数のグループと奇数のグループの配列を持つ配列となります。各要素は、条件に基づいてグループ化された値です。

`chunk`メソッドは、必要に応じて繰り返し処理を行います。同じグループに属する要素が連続している場合は、連続した要素をまとめたグループとして返されます。

### 例2
nil、 :_separator はある要素を無視したい場合に用います。以下の例では、空行の要素が無視されていることがわかります。
```ruby
numbers = <<'EOS'
123
456

789

998
999
EOS

datas = numbers.split("\n")

p datas.chunk {|x| x != "" || nil}.map {|x| x.last }
# => [["123", "456"], ["789"], ["998", "999"]]
```



## まとめ
以上が、Rubyの`chunk`メソッドについての説明です。このメソッドを活用することで、要素のグループ化や連続した値の処理を効果的に行うことができます。


## 参考

- [Ruby ドキュメント: Enumerable#chunk](https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/chunk.html)
- [連続した値をまとめる Enumerable#chunk を理解する](https://inokara.hateblo.jp/entry/2022/12/04/231855)
SQL Serverのデータベース間のレコードをコピーする

# 1. はじめに
* SQL Serverで移行元データベースから移行先データベースへレコードをコピーしたい
* SQLのSELECT,INSERTで一括で実施したい

# 2. 開発環境
* SQL Server 2022 Express

# 3. 事前準備
* 移行元データベースに移行先データベースへINSERTする権限があるユーザーを追加する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/82be14cb-800c-f978-8f82-7537bf017834.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/fd6cd39f-1803-5195-b4f7-2696157bd5d3.png)

# 4. SQL実行
* 移行元データベースに接続して、SELECT, INSERTのSQLを実行する
    * 移行元DB: TEST1、移行先DB: TEST2の場合
```
insert into
 [TEST2].[dbo].テーブル名
(
 カラム1,
 カラム2,
 カラム3
)
select
 カラム1,
 カラム2,
 カラム3
from [TEST1].[dbo].テーブル名;
```

# 5. 参考文献

https://www.ipentec.com/document/sql-table-data-move
C#でローカル コンピューターのホスト名を取得する

# 1. はじめに
* データベースやログに共通的に出力するため、実行環境のホスト名を取得したい

# 2. 開発環境
* C#
* .NET 6
* Visual Studio 2022
* Windows 11

# 3. ソースコード
```Csharp:
public void DisplayLocalHostName()
{
   try {
      // ローカル コンピューターのホスト名を取得
      String hostName = Dns.GetHostName();
      Console.WriteLine("Computer name :" + hostName);
   }
   catch(Exception e)
   {
       // TODO: エラー処理
       Console.WriteLine("Exception caught!!!");
       Console.WriteLine("Source : " + e.Source);
       Console.WriteLine("Message : " + e.Message);
   }
```

# 4. 参考文献

https://learn.microsoft.com/ja-jp/dotnet/api/system.net.dns.gethostname?view=net-7.0

https://qiita.com/gushwell/items/b6b6c24e26263685b941
Windows 11でシンボリックリンクを作成する

# 1. はじめに
* Unix系で使用するシンボリックリンクをWindowsでも作成したい

# 2. 開発環境
* Windows 11

# 3. シンボリックリンク作成
## 3.1. 管理者モードでコマンドプロンプトを起動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/9cd4461c-9027-d3a9-d9a4-5b675d9eede4.png)

## 3.2. シンボリックリンクを作成するフォルダへ移動する

## 3.3. シンボリックリンク作成コマンドを入力する
```mklink /d <シンボリックリンク名> <リンク先>```

* ```C:\temp\Documents```のシンボリックリンク名に対して、```C:\Users\user\Documents```へのリンク先を指定する（相対パスでも記載できる）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/4a5e6baa-3529-23f8-1afd-59b448b10c1f.png)

* シンボリックリンクが作成できている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/e38fe4e9-cfb9-02a9-5334-c17917792040.png)


# 4. 参考文献

https://www.koikikukan.com/archives/2020/04/16-235555.php