OmniAICreator/Qiita-1.07M huggingface dataset:
QuickLook（qlmanage コマンドを利用、macOS 上）

こんにちは
```qlmanage``` コマンドを利用すると [QuickLook](https://ja.wikipedia.org/wiki/Quick_Look) 機能を使えます。ファイルをコマンドライン上から GUI 的にプレビュー可能です[^1]。

[^1]: 参考：「[コマンドラインから GUI を操作する](https://qiita.com/b4b4r07/items/037377b8efb0c1e36800)」

### 例 ###
ファイル ```sample.md``` をプレビューする例。

```console
$ qlmanage -p sample.md >/dev/null 2>/dev/null &
```
![screenshot.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54617/55cd8ead-87b5-aba5-e287-2367525d40d9.jpeg)

* ただし動作失敗する場合があるようです（```Segmentation fault```発生、原因不明）。


### 標準以外のファイルへの対応 ###

標準では対応しない Powershell スクリプトファイル（```sample.ps1```）をプレビューできるよう、[qlstephen](https://github.com/whomwah/qlstephen) をインストールし、説明にしたがって設定しました。


```1.``` 準備

```console
$ mdls -name kMDItemContentType sample.ps1 
kMDItemContentType = "dyn.ah62d4rv4ge81a63v"
$ brew install --cask qlstephen
```

* 上記から得た kMDItemContentType の情報を Info.plist へ書き加える： ```~/Library/QuickLook/QLStephen.qlgenerator/Contents/Info.plist``` 内へ、 ```<string>dyn.ah62d4rv4ge81a63v</string>``` の行を書き加える（```<string>public.data</string> <string>public.content</string>```の後）。


```2```. プレビュー

```console
$ qlmanage -p sample.ps1 >/dev/null 2>/dev/null &
```

* うまく動作しない場合、下記のリセットを実行した後、再度試してみる。

```console
$ xattr -cr ~/Library/QuickLook/QLStephen.qlgenerator
$ qlmanage -r
qlmanage: resetting quicklookd
$ qlmanage -r cache
qlmanage: call reset on cache
```
alter database 起動モード変更パターン

【構文】
alter database <起動モード>;
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49576/b7a72b30-810d-1d58-8865-f6b9db65161d.png)
結論から言うとalter databaseで変更できるパターンは「nomountからmount」と、「mountからopen」の２パターンのみで、他は変更できない（または変更してはいけない）です。


・alter databaseではcloseの状態から起動モードを変更することが出来ない。
・基本的に下から上へ１つずつ（nomount → mount / mount → open）の変更は可能だが、上から下（open → mount / mount → nomount）への変更は出来ない。（もしmountからnomountにしたい場合はいったん「shutdown」でcloseにしてから「startup nomount」を実行する）

####※「alter database close;」の罠
9の「open → close」だけ上から下への変更は一応実行可能だがこれが罠で、実行するとv$databaseのopen_modeは"mount"となる。（RACやRestart構成の場合）crsctl stat res -tのstateを確認すると"INTERMEDIATE"となっており、中途半端に起動している状態となってしまっていることが分かる。こうなるとalter databaseでnomount/mount/openに変更できなくなる。

こうなった場合の対策としては、インスタンスを「shutdown」で一旦停止し、「startup」で起動する。
※これを知っていればなんて事はないが、知らないで実行すると結構パニックになる（なった）。

もしnomount/mountの状態からインスタンスを停止（close）したい場合は「shutdown」を実行する。「alter database close;」は使用してはいけない。
Javaの基礎（メソッドとクラス）

#メソッド

メソッドは何らかの処理を割り当てた部品です。
Javaのファイルを実行すると、自動的にmainメソッドが実行されます。
mainメソッドが各メソッドに指示を出すイメージとなります。

流れとしては、
1.mainメソッドが呼び出される。
2.mainメソッドの中で、違うメソッドが呼び出される。
3.違うメソッドの中で、処理が呼び出される。

メソッドを定義する時、public static void メソッド名()と表します。
voidは戻り値がない時に使えるモノです。

メソッドは呼び出すときも();を忘れないようにして下さい。

```Java
class Main {
 public static void main(String[] args) {
 
  printData();

 }
  public static void printData() {
   System.out.println("私の名前は智紀です。");
 }
}
```
引数とはメソッドに与える追加情報のようなモノです。
そのために引数を受け取れるメソッドを定義する必要があります。
また、メソッドを定義する際に引数を受け取るための箱（仮引数)を定義する必要があります。

```Java
class Main {
 public static void main(String[] args) {
 
  printData("Tomoki");

 }
  public static void printData(String name) {
   System.out.println("私の名前は" + name + "智紀です。");
 }
}
```

メソッドの処理結果を、メソッドの呼び出し元で使いたい場合があります。
このような時は、メソッドが戻り値を返すようにします。
戻り値を使う時はpublic staticの後は戻り値のデータ型を記述します。
戻り値を使わない時はvoidを使用します。

メソッドの同名は定義できません。しかし、引数の型や個数が違う時は定義できます。

#クラス
クラスとはメソッドをまとめる大きな部品と考えて下さい。
メソッドを呼び出す時にクラス名.メソッド名とすることで、別のクラスのメソッドを呼ぶことができます。

```Java:Main.java
class Main {
 public static void main(String[] args) {
  Person.hello();
  }
}
```

```Java:Person.java
class Person {
 public static void hello() {
  System.out.println("Hello Word");
 }
} 
```
こうすることで、Personクラスのhelloメソッドを呼ぶことができます。

クラスの定義はclass クラス名とする。
クラスの最初の文字は大文字にして、ファイル名はクラス名.javaにする。

javaでは他人が作ったクラスを使うことができます。
そのクラスを外部ライブラリと言います。
外部ライブラリを使うためにはimportを使用します。

例えば数学的なメソッドを扱う、Mathクラスを読み込むためにはclassよりも上で、
import java.lang.Math;を書きましょう。

Mathクラスの例で言うと、maxメソッドやroundメソッドがあります。
maxメソッドは引数で渡した2つの数の内、大きい方を呼び出してくれます。
また、roundメソッドは小数点以下を四捨五入して渡してくれます。

#入力を受け取るクラス

java.langで表されるクラスは基本的にimportは不要となっております。

そして、本題のコンソールに入力されたモノをそのまま出力するクラスもあります。
Scannerというライブラリになります。

import java.util.Scannerを読み込みます。
まずはScannerを初期化し、scannerの変数に入れていきます。
new Scanner(System.in);で初期化します。
scanner.next();で文字列を受け取ることができます。

```Java:Main.java
import java.util.Scanner;
class Main {
 public static void main(String[]args) {
  Scanner scanner = new Scanner(System.in);
  System.out.print("あなたの名前:");
  String name = scanner.next();
  System.out.println("あなたの名前は" + name + "です。");
 }
}
```
System.out.print("");を使うと改行せずに文字列が出力できます。

整数を受け取る時はnextInt();を使い、
小数を受け取る時はnextDoubleを使います。
Rails 記事投稿画面

##記事投稿のビュー
```posts/new.html.erb

 <%= form_tag("/posts/create") do %>・・・・１
 <% @post.errors.full_messages.each do |message| %>・・・・２
<div class="form-error">
 <%= message %>・・・２
 </div>
 <% end %>
 <textarea name="content"><%= @post.content %></textarea>・・・１
 <input type="submit" value="投稿">・・・１
<% end %>
```
##解説
・・・１　投稿ボタンを押すと、textareaに入力されているデータがURL"/posts/createに送信されます。
また投稿に失敗した時（字数制限を超えた時など）は@post.contentと書いておくことにより投稿前のものが初期値として、残すことができます。
・・・２　配列@post.errors.full_messagesから要素を1個ずつ抜き出して、messageに代入しています。そのmessageを<%= message %>で表示しています。
##記事投稿のコントローラ
```posts_controller.rb
 def create
    @post = Post.new(content: params[:content])・・・１
    @post.save・・・２
    redirect_to('/posts/index')・・・３
```
##解説
・・・１name属性で指定したフォームに入力したデータであるPostインスタンスを作成し、変数@postに代入しています
・・・２作成したPostインスタンスをPostテーブルに保存しています
・・・３createアクションに対応するビューがないのでURL"/posts/index"に転送しています。
QubesのFedoraドメインでLibreOffice

##環境
Qubes OS 4.0.4

##FedoraテンプレートでLibreOfficeのインストール

安定版

```
sudo dnf install libreoffice
```

最新版

```
#公式サイトからダウンロード
wget https://ja.libreoffice.org/donate/dl/rpm-x86_64/7.1.4/ja/LibreOffice_7.1.4_Linux_x86-64_rpm.tar.gz

#展開
tar xvf LibreOffice_7.1.4_Linux_x86-64_rpm.tar.gz

#展開したディレクトリに移動
cd LibreOffice_7.1.4.2_Linux_x86-64_rpm

#展開したディレクトリ内にあるRPMSってディレクトリに移動
cd RPMS

#中に入ってるrpm拡張子のファイルを全てインストール
sudo dnf install *.rpm
```

##Fedoraベースのドメインでアプリケーションを追加
FedoraテンプレートにLibreofficeをインストールしたら、
Fedoraベースのドメイン(personalとかworkとかvault)のQube Setting画面で、Applicationってところに、LibreOffice-XXX(WriteとかMath)が追加されているはずなので、「>」ボタンを押して、ドメインにアプロケーションを追加する。
そして、起動する。

##日本語
WindowsとかにLibreOfficeをインストールしたら、言語選択にいろんな言語が表示されるんだけど、ここでインストールしたら英語しか追加されない。ので、日本語パックを追加する。
日本語パックは、公式サイトから入手できるので、さっきと同様RPMSディレクトリにあるrpmファイルを全部インストールすればいいんだけど、FedoraテンプレートにインストールしてもFedoraベースのドメインのアプリケーションに表示されない。なので、Fedoraベースのドメインに直接インストールする。
FedoraベースのTerminalを開き、以下を入力

```
#日本語パックのダウンロード
https://ftp-srv2.kddilabs.jp/office/tdf/libreoffice/stable/7.1.4/rpm/x86_64/LibreOffice_7.1.4_Linux_x86-64_rpm_langpack_ja.tar.gz

#展開
tar xvf LibreOffice_7.1.4_Linux_x86-64_rpm_langpack_ja.tar.gz

#さっきみたいに展開したディレクトリ内のRPMSディレクトリにいって、
sudo dnf install *.rpm
#って打つ
```

そして、新たにLibreOfficeを起動して設定画面を開き、言語設定で言語一覧を表示すると、Japaneseが追加されてるので、選択して日本語化成功
改めてTypeScriptの良さを考えてみた

# 本投稿の目的
TypeScriptの良さをしっかりと理解したい。
やんわり理解していたJavaScriptではなく、TypeScriptを使う理由を改めて考えてみます。

# ターゲット
- TypeScriptを使うことを悩んでいる人
- TypeScriptを使い始めたばかりの人
- TypeScriptをなんとなく使っている人

# TypeScriptとは
マイクロソフトが開発したオープンソース言語です。
簡潔に表現するなら、「静的型定義が可能なJavaScript」です。

TypeScriptで書かれたコードはJavaScriptに変換してから使用します。
このような言語の総称をAlternative JavaScript(AltJS)と呼び、その他にはCoffeeScriptが有名です。

# なぜそのままJSで書かないのか
主に以下のような問題が発生する可能性があるからだと思います。

- 動的型付けによるバグの発生
- 型の定義ができないので、意図しない値が入る可能性がある
- コンパイル時の型チェック機能がないので、意図しない値が入る可能性がある
- null safetyではないので、意図しないnullやundefinedが入る可能性がある

# TypeScriptの特徴
## JavaScriptの上位互換であること
すべての有効なJavaScriptのコードはTypeScriptで動作します。
TypeScriptはJavaScriptのスーパーセット(上位互換)なのです。

簡単に言うと、JavaScriptで出来ていたことはすべてTypeScriptでも出来ます。
JavaScriptで出来なかった機能を拡張した言語がTypeScriptというわけです。

下記はJavaScriptのコードです。

```javascript
const sample = 'Hello World!';
console.log(sample);
```

次のコードはTypeScriptのコードです。

```typescript
const sample = 'Hello World!';
console.log(sample);
```

全く同じように書くことができます。
(コードによっては型チェックエラーが発生する可能性がありますけども、、、)

つまり、JavaScriptの使用経験があれば、TypeScriptの学習コストは低いです。

## 型定義が使えること
型定義による恩恵は言わずもがなですが、予期しないバグの少ないシステムが開発できることや他者が記述したコードの可読性が高まります。

上記の恩恵からも理解できるように特に大規模なシステム開発を行う場合に恩恵が大きいです。

型定義の例を以下に記述します。

```typescript
// プリミティブ型
const fruitName: string = 'pear';

// オブジェクト型
const product: { id: number; name: string; price: number } = {
    id: 1,
    name: 'pear',
    price: 10000,
};

// 関数式
function getPrice(id: number): number {
    // 必要な処理
    return 10000;
}

const getPrice = (id: number): number => {
    // 必要な処理
    return 10000;
}

// リテラル型
const fruitName: 'pear' = pear;

// 配列型
const fruitNames: string[] = ['pear', 'apple', 'peach'];
```

その他にも様々な型定義が存在するので、ご興味がある方は非常にわかりやすいこちらの記事をご参照ください。
[TypeScriptの型入門](https://qiita.com/uhyo/items/e2fdef2d3236b9bfe74a)

また、TypeScriptには型推論という仕組みがあります。
明示的に型指定しなくても自動的に型を判別するので、プログラム実行前にエラーを発見することができます。
つまり、今まで使っていたJavaScriptと同じ書き方をしても型チェックの恩恵を得られます。

## nullやundefinedによるエラー回避
'Uncaught TypeError: Cannot read property 'propertyName' of undefined'

JavaScriptを使っていれば、一度は目にしたことがあるでしょう。
nullやundefinedの安全性がないJavaScriptでは実行時エラーが発生する可能性があります。

TypeScriptでは回避できるのか、というとデフォルトでは回避できません。
デフォルトの仕様としてTypeScriptもnullやundefinedをすべての型に代入できます。

ただし、TypeScriptではtsconfig.jsonで'strictNullChecks'を有効にすると、実行前にエラーを発見することができるようになります。

# 結論
TypeScriptは型定義による恩恵が最大の特徴だと思います。
小規模な開発であれば、型定義の恩恵は少なくなるとは思いますが、エラーの少ないシステムを開発する上で型定義は非常に有用だと感じました。

今後もTypeScriptを使用していく上で感じたメリットは追記していきます。

# 参考サイト
[TypeScript公式](https://www.typescriptlang.org/)
[TypeScriptの型入門 - Qiita](https://qiita.com/uhyo/items/e2fdef2d3236b9bfe74a)
[TypeScript: "strictNullChecks"について - Qiita](https://qiita.com/yutomaeda5510/items/f67db47e38120cf8a36c)
「tcp://localhost:53432 が活動中」であることを Linux コマンドで確認するには


## 概要

curl や wget では `tcp://` からの応答有無を確認できなかったので、実行方法を書き残しておく.


## 結果

nmap コマンドで確認できた. 
下記 🛑 より、ポートが開いていたので活動中、とみなせる.

```
$ nmap localhost -p 53432

Starting Nmap 7.60 ( https://nmap.org ) at 2021-07-11 00:20 JST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000080s latency).

PORT      STATE  SERVICE
53432/tcp open🛑 unknown

Nmap done: 1 IP address (1 host up) scanned in 0.03 seconds
```

## 追記

telnet コマンドでも良いのだろうか...

### 応答あるとき

```
$ telnet localhost 53432
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
(Ctrl-C で停止)
```

### 応答ないとき

```
$ telnet localhost 53430
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused
(Ctrl-C で停止)
```
Qubes OSのFedoraドメインで日本語入力

##環境
Qubes OS 4.0.4

※ドメイン・・・Qubesで扱われるVMのこと（だと思ってる）

##ibus-mozcのインストール&設定(Fedoraテンプレートで実行)

```
sudo dnf install ibus-mozc
```

##各Fedoraベースのドメインでibusを設定
ibus-mozcをインストールしたら、Fedoraベースのドメイン(personalやvaultなど(templateって書かれてないやつ))をQubes Managerから一旦再起動して、Terminalを開き、

```
ibus-setup
```
でibusの設定ウィンドウを開く


####入力方法の切り替えキーを設定する
設定ウィンドウで、Generalタブの「Next input method:」ってところの「...」を押してキーの登録画面を開き、既存の設定である「(Super)space」を削除(delete)し、新たにキーを登録(add)する。登録するキーは半角/全角キーで、キーの名前は「grave」で登録される。

####入力方法の追加
Input Methodタブに移動し、「Add」ボタンを押して「Japanese」を選択し、「Mozc」を選択する

####試しに
同じドメインでFirefoxを開き、検索バーに日本語で入力してみる。
半角/全角キーを押しても切り替わらない場合、一度手動でタスクバーにあるやつ(ENとか「あ」とか切り替わるやつ)を押して、Mozcを選んでからInput Methodを「Direct Input」から「Hiragana」に変えてみる(手動で)。
その後、同じように半角/全角キーを押すとWindowsみたいに全角で入力できる

####自動起動設定
自動起動の設定をしないと、ドメインを再起動したときに全角で入力できなくなる。自動起動の設定をしなくても、「ibus-setup」を毎回入力して、ibusを手動で起動してもいいけど、面倒。
なので、.bashrcに自動起動の設定を書き込む。
あまり難しいことは考えずに、ただコピペするだけ。

```vim:.bashrc
export GTK_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export QT_IM_MODULE=ibus
exec ibus-daemon -rdx
```

これで一旦再起動してみると、何もしなくてもWindowsみたいに不自由なく日本語が使える。
【C++言語】クラス超入門

# はじめに
プログラミング言語をC言語から学習された方ならご存知でしょう。C言語にはクラスという概念ありません。私は一番C言語を時間をかけて勉強してきたので、C++でクラスが出てきたとき理解するのに苦労しました。
最近WEB系エンジニアの人気が高く、WEB系の言語（PHP、Rubyなど）のほとんどがオブジェクト指向言語なのでクラス概念は必ず学習するでしょう。
ということで、プログラミング勉強中の方に向けてクラスの作り方を記事にしていこうと思います。

今回は学習用なのでソースファイルを複数に分けたりしません。

## そもそもオブジェクトって何？
オブジェクトは全ての総称であり、とても曖昧な概念です。

実世界でいえば、人間、動物、食べ物、自然、本、携帯、服、ありとあらゆるものがオブジェクトに含まれます。
オブジェクトについては、深く理解しようとするよりも、なんとなく「全ての総称なんだな」と認識してください。
オブジェクトを分類して物としてプログラムを扱うことをオブジェクト指向だと私は思ってますね。

# オブジェクトとインスタンスの関係
オブジェクトが全ての総称であるならば、インスタンスもオブジェクトの1つということになります。

本やネット上で、オブジェクトとインスタンスが同じ意味のように使用されるのはこのためです。
ネットの学習サイトでインスタンス生成とオブジェクト生成と意味は同じですが、初学者には混乱しますよね。
厳密には
**クラスから生成されたオブジェクトのことをインスタンスと呼びます。**

## 本題のクラスって何？
関数や変数をまとめることができる。
要するにクラスとはデータ構造を作る仕組みで、クラスを使うと新しいデータ型を作ることができます。
ネットや教材でよくクラスは、オブジェクトを作る設計書と説明されます。

そのクラスをもとにインスタンスを生成します。

## オブジェクトとクラスとインスタンスの関係
実際こんなクラスとインスタンスを作るのかと言うことは一旦置いておいて、ざっくりこんなイメージです。
飲み物クラス（設計図）を用意してクラスを元にインスタンスを生成します。下図ではイメージしやすく飲み物クラスからコーラというインスタンスを生成しています。



![無題のプレゼンテーション.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642219/aaf12148-49f2-fce8-b4e3-ec9b95d06ab7.jpeg)

## 実際クラスを使ってインスタンスを生成してみる



## 

```test.cpp
#include <iostream>


/* ------------------------------クラス定義------------------------------------ */

class Drink
{
public:                //外部から自由にアクセス可能
    //コンストラクタ
    Drink();
    //デストラクタ
    ~Drink();
};

/* -----------------------------メソッド処理------------------------------------ */

//コンストラクタ
 Drink::Drink()
{
    std::cout << "オブジェクト生成" << std::endl;
}
//デストラクタ
Drink::~Drink()
{
    std::cout << "オブジェクト破棄" << std::endl;
}



/* ------------------------------main関数------------------------------------ */
int main()
{
    Drink Cola; //インスタンス生成 Drink型のオブジェクトColaを生成 コントラクタ

    return 0;   // インスタンス消去 デストラクタ
}
```

記事のはじめにも記載しましたがヘッダーファイル等ファイルを分割していません。見辛かったらすみません。

ソースですがまずクラス定義の箇所Drinkクラスを作成してます。publicというのは以下の変数、関数はどこからでも呼び出すことが可能という意味です。
コンストラクタとデストラクタですが、オブジェクト生成時に実行されるのがコンストラクタであり、オブジェクトが破棄された時に実行されるのがデストラクタです。
実際はクラスに記載しなくてコンストラクタとデストラクタは実行されるのですが、今回は実行されたかどうか確認するために記載しております。（コマンドコンソールに出力したいから）

メソッド処理にはコンストラクタとデストラクタが実行された時にコンソールに出力する処理が記載されています。

main関数ではオブジェクトを生成し、処理が終了しています。
基本的に関数内でオブジェクトを生成するば、その関数の終了と同時にオブジェクトが破棄されます。

ちなみに上記以外にも、new でオブジェクトを動的に生成する方法がありますが今回省きます。

上記のソースを実行すると、、、

```
オブジェクト生成
オブジェクト破棄
```
が出力されたと思います。

まだ処理自体は何も行なっていませんが流れとしてはこんな感じです。

以上
DNSコンテンツサーバ とは

## 勉強前イメージ

ふんわりと・・・
権威サーバと何が違うのかな・・・一緒？

## 調査

### DNSコンテンツサーバ とは

権威DNSサーバのことで、自分が持ってるドメインとIPアドレスの紐付けを
外部からの問い合わせについて応答することになります。
→ DNSコンテンツサーバ = 権威DNSサーバ

以下は名前解決の流れを表していますが、
IPアドレスを答えてるのが 権威サーバ = コンテンツサーバ。

![1# DNSコンテンツサーバ とは - diagrams.net - Google Chrome 20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/f012ccee-e2ef-c8c7-6d96-9f153b97f9fa.png)

### プライマリーセカンダリーもある

権威サーバもプライマリーサーバとセカンダリーサーバがあります。
DBなどのレプリケーションと似たようなもので、
プライマリーサーバがゾーン情報が設定されているサーバ
セカンダリサーバがプライマリーサーバからゾーン情報を転送されているサーバです。

構成としては以下の2つがある

- セカンダリサーバで問い合わせを応答する

![2# DNSコンテンツサーバ とは - diagrams.net - Google Chrome 20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/cc6d219f-ce29-7634-c4c2-dc262e7dd504.png)


- プライマリサーバとセカンダリサーバで応答する

![3# DNSコンテンツサーバ とは - diagrams.net - Google Chrome 20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/c111867d-4244-51f3-6fad-a7b7c04879d0.png)


## 勉強後イメージ

早々に答えがわかってしまった。。。。。

## 参考

- [プライマリ、セカンダリの使い方を教えてください](https://www.atmarkit.co.jp/ait/articles/1512/22/news006.html)
- [権威DNSサーバ 【authoritative DNS server】](https://e-words.jp/w/%E6%A8%A9%E5%A8%81DNS%E3%82%B5%E3%83%BC%E3%83%90.html)
ソフトウェアのエラーとかテストとか

構文エラー
--
プログラミング言語の文法的なミス。
静的型付け言語は、間違ったデータにアクセスしたり、データが混合しない
対して、動的型付け言語は、早く開発できるので安全性やコードの厳密化はユーザーの責任になる

論理エラー
--
意図してないデータを取ってきてしまうエラー。ここを正すのが大変。というかエンジニアの腕の見せ所？なのかなｗｗ
言語やIDEが自動でエラーを検出してくれるわけではないロジックエラーなので特定が大変になる。

ソフトフェアテスト
--
プログラムが自分が思ったように動くかテストすること。エラーは全体のプロジェクトに影響する可能性があるのでソフトウェアテストは開発業務において
２０％ほどの時間に使われる。
基本、開発→リファクタリング（コードの修正、整理）→ソフトウェアテスト

テスト駆動開発
--
要件とは、プログラムが持つべき機能と、その動作をのこと。
①要件②テストケースの作成③テストケースの実施④コードの修正、作成⑤再テスト⑥リファクタリング（最終整理）

アサーション
--
プログラムを停止させたり、どこかが間違っている時にエラーを強制的に発生させることができるテストツールのこと
Bool型でデータを保持しており、false担ったときに強制ストップになる

ホワイトボックテスト、ブラックボックステスト
---
ホワイト→内部要素までしっかりテストする（中のコンポーネントをみて最適なアルごリズムやロジックまでテストする）
ブラック→内部要素は無視してテストする（結果だけあっていればOK)

手動テストと自動テスト
--
手動テスト
メリット　自動化できていないテストもある、少量のテストには向いている。論理エラーを経験則で解決できる
デメリット　時間がかかる、再利用しにくい、コードが煩雑になりやすい、大規模ソフトウェアテストとかは難しい
自動テスト
専用のソフトウェアをつかってQAエンジニアが行うテスト
メリット　多くのデータの計算量や空間量をテストできる。AIでできる
デメリット　単発テストには不向き。自動化できないものある。アルゴリズムの問題となると自動化には専門的な知識がめちゃ必要
VBAで学んだこと

#はじめに

現在、初めての配属先でVBAを使って業務をこなしています。
学校でも触ったことがなく、全くわからない状態だったので自分自身の備忘録としてこの記事を書こうと思いました。

#学んだこと

・メソッドの見方(引数、戻り値)
・変数の宣言
・デバッグを使って動きを見ること

ほかにもありますが、今回はよく使っているこの３つについて書いていきます。


##メソッドの見方
これを知らないとどのような処理をしているのか大まかな理解ができないと思います。
現在の業務ではFunctionプロシージャが多く使われていたのでこちらで紹介いたします。

Function プロシージャ名(引数 As データ型) As 戻り値のデータ型

戻り値はこのFunctionプロシージャの処理結果を返します。引数はほかの処理でこのメソッドが呼び出されたときに使う変数です。

この二つに何が入っているのかがわかれば大まかな処理はわかると思ます。
ちなみに、Functionプロシージャの他にSubプロシージャというものもありますが、今回は割愛いたします。

##変数の宣言
変数の宣言はメソッドの処理を見ていくと一回は見ることになると思います。
言語によって変数の宣言が違うのでこんがらがってしまうと思います。
私もほかの言語を学んでいたのでVBAで初めてコードを見たときに宣言を見落としてどのような処理をしているのかわからなくなってしまった時がありました。

Dim 変数名 [As データ型]

VBAではこのように宣言します。見落とさないようにしましょう。


##デバッグを使って動きを見る
デバッグを使ってどのように動いているのか確認してコードを理解することも必要になってくると思います。

VBAでのデバッグの使い方は
開発タブ→Visual Basic→
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1735204/a1859481-9728-16bb-9c9a-9ef487a90454.png)

動きを見たい処理の行の左側にクリックしてブレークポイントを付ける→
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1735204/478f6094-568e-e705-fa03-e515b43515d6.png)

マクロ実行する→
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1735204/1dc34caa-be92-4f94-5f82-76d447f183cd.png)

見たい処理のところで一時停止する→
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1735204/6309c4fc-b24c-13f8-0b31-108a594ac4ba.png)

F8キーで1行ずつ処理を確認→見たい処理が終わったらF5キーで最後まで一気に処理実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1735204/b686e30d-9f7d-d50b-7acb-bd6c78947c40.png)


この流れができればスムーズに見たい処理のところだけ見ることができます。


#最後に
ITの知識もあまりなく、Qiitaに記事を書くのが初めてだったのでわかりづらかったり見づらい記事になってしまったかと思いますが
少しでも参考になったら幸いです。最後まで読んでいただきありがとうございました。
複数のprotoファイルを元にC#のコードを生成する (名前衝突の回避)

# 複数のprotoファイルをもとにC#のコードを生成する

## 良くない例

```bash
    protoc \
    --csharp_out=./client/A \
    --grpc_out=./client/A \
    --plugin=protoc-gen-grpc=/usr/local/bin/grpc_csharp_plugin \
    ./proto/A/A.proto

    protoc \
    --csharp_out=./client/B \
    --grpc_out=./client/B \
    --plugin=protoc-gen-grpc=/usr/local/bin/grpc_csharp_plugin \
    ./proto/B/B.proto
```

デフォルトでは、すべての生成されたクラスは`namespace Proto`に入れられる。
したがって、このように生成したコードを複数importすると、クラス名が共通していた場合に名前が衝突してしまう。
これを回避するために、生成するファイルの名前空間を指定してあげる必要がある。

## 各protoファイルの名前空間を指定する

### protoファイル

protoファイルの頭で名前空間を指定する。

```proto
option csharp_namespace = "Proto.A";
```

### protoc

```bash
    protoc \
    --csharp_out=./client/A \
    --grpc_out=./client/A \
    --plugin=protoc-gen-grpc=/usr/local/bin/grpc_csharp_plugin \
    --csharp_opt=base_namespace=Proto.A \
    ./proto/A/A.proto
```

C#固有のオプションである、`base_namespace`を用いて名前空間を指定する。

## 参考

[Protocol Buffers Reference: C# Generated Code](https://developers.google.com/protocol-buffers/docs/reference/csharp-generated)
残プロ　第-39回　~コンソールで簡易タスクマネージャー~

# 手軽にCPUとメモリ使用率を確認したい

コンソール上で各種使用率を確認するにはtypeperfコマンドを叩きます．ただ，出てくる数字が4桁(+小数点以下6桁)で非常に分かりにくい．今回はシーケンスバーをコンソール上に実現し，一目でわかる工夫を加えました．ぜひお試しあれ．


~~~ python:TaskManeger.py
import subprocess
import re

cmd_cls = "cls"
_ = subprocess.run(cmd_cls, shell=True)

cmd_totalmemory = "wmic ComputerSystem get TotalPhysicalMemory"
output = subprocess.run(cmd_totalmemory, shell=True, stdout=subprocess.PIPE, text=True)
memory_total = int(re.findall('[0-9]+', output.stdout)[0]) // 10**6

print("USED   0%       50%       100%")
print("----   +---------+---------+")
print("CPU                         ")
print("MEMORY                      ")

while(True):
    cmd_used = "typeperf -sc 1 \"\\processor(_Total)\\% Processor Time\" \"\\Memory\\Available MBytes\"";
    output = subprocess.run(cmd_used, shell=True, stdout=subprocess.PIPE, text=True)
    cpu, memory = re.findall('[0-9]+\.[0-9]{6,6}', output.stdout)
    cpu_percent = int(float(cpu))
    memory_percent = int(float(memory) / memory_total * 100)

    print("\033[2F" + "CPU                         ")
    print("\033[1F" + "CPU    " + "#" * (cpu_percent//5))
    print("MEMORY                      ")
    print("\033[1F" + "MEMORY " + "#" * (memory_percent//5))
~~~


例に漏れず，ANSIエスケープシーケンスを利用しています．コンソール制御のコツとしてはカーソル基準行を決めておいて，逐一変更したい行に移動することで混乱を回避できます．
GanacheをWSL2のUbuntu20.04でビルドして動かす

## Ganacheの読み方
グナーシと読む。自分は当初何も考えずガナシェと読んでいた。

## git clone
ここをクローンする
https://github.com/trufflesuite/ganache

## 依存ライブラリのインストール
### nodeのバージョンを合わせる
V8 API を使っている addon が依存ライブラリに含まれているので、node のバージョンを合わせる必要がある。
package直下の`.travis.yml`をみて、そこで使われているバージョンに合わせる。例えば、、

```yaml
node_js:
# Use 12.13.1 because that is what Electron needs
- "12.13.1"
```
だったら、

```sh
$ nvm install 12.13.1
```

### 実行
```sh
$ npm i
```

## pythonのインストール
ビルドするのに Python が必要なのでインストールする。例えば、

```sh
$ sudo apt install python3
```

## 必要な共有ライブラリのインストール
以下のライブラリのインストールが必要だった。

- libxcursor-dev
- libnss3-dev
- libgdk-pixbuf2.0-0
- libgtk-3-dev

### 実行
```sh
$ sudo apt install -y libxcursor-dev libnss3-dev libgdk-pixbuf2.0-0 libgtk-3-dev
```

## ビルド
環境変数 `PYTHON` に、使いたい Python のコマンド名をセットして、`npm build-linux` を実行する。`python3` を使う場合は、

```sh
$ PYTHON=python3 npm build-linux
```

### 実行ファイル
`dist` ディレクトリに作られる、`ganache-[バージョン]-linux-x86_64.AppImage` が実行ファイル。


## 実行
VcXsrv 等の X-Server を動かしたうえで、環境変数 `DISPLAY` を適宜設定して、実行ファイルを実行する。例えば、

```sh
$ DISPLAY=192.168.1.123:0 dist/ganache-2.5.4-linux-x86_64.AppImage
```

で、こんな画面が表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499443/0078feb0-1ddb-939d-1274-d21896eafbcb.png)
【Glitch】Githubからアプリを公開する方法

#1. Glitchで新しいプロジェクトを作成する
　[公式サイト](https://glitch.com/)からGithubでログインする。
　`Start a new Project`から好きなアプリを選択する。

#2. Githubからアプリを公開する
　`Tools > Import and Export > Import from GitHub `を開く。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/25586bc3-8ede-fe63-197f-9ba5115354fd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/ceeda763-c05d-d7e0-a76b-3099e460e288.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/887b446b-c1cf-4313-4337-df7fa0fb8bcc.png)

　`Githubのユーザー名/リポジトリ名`を入れて`OK`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/3358be37-8338-5c8b-6414-f222749a1279.png)
【Java】AtCoderのABC-209に参加しました（レート：219→223）。

こんばんは。

2021/7/10に、AtCoderのABC-209に参加しました。
レートは以下の通りとなっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/a1b095cf-f5e7-1a63-ebd8-5830acb7a20d.png)


レートは219→223に更新！順位は5947位/8675でした。
C問題が解けなかったので、まあこんなもんですね。

って、こんなものだと思っている自分がやばいな。
この調子だとあと50回以上参加しても茶色に届かないぞ・・。

今回はA・B問題が結構早く解けました。
###A問題

aとbを入力。a以上b以下の数はいくつある？

```java

import java.util.Scanner;
import java.util.Arrays;

public class Main{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
if(b<a){
System.out.println(0);
}else{
System.out.println(b-a+1);
}
}
}


```


###B問題

Nこの商品が売られている。
偶数個目の商品は-1円で販売される。
x円持っているが、全部買う事ができるか？

```java

import java.util.Scanner;
import java.util.Arrays;

public class Main{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int x = sc.nextInt();
int a[] = new int[n];
int rui = 0;
for(int i=0;i<n;i++){
  a[i] = sc.nextInt();
  if((i+1)%2==0){
    rui = rui + a[i]-1;
  }else{
    rui = rui + a[i];
  }
}

    if(rui<=x){
      System.out.println("Yes");
    }else{
      System.out.println("No");
    }
}
}


```


###最後に
A・Bを8分で解きましたが、まだまだ遅いですね。
VSCodeプラグイン

##インストール方法
VSCodeは、多くのプラグインを導入することができます。
コーディングをサポートしてくれるものを入れておくと、作業効率が一気に向上します。

インストール方法は、以下の手順です。

- 拡張機能を選択
- プラグイン名で検索
- インストール

実に簡単にインストールできるので、早い段階でインストールすることをおすすめします^^

#おすすめプラグイン
###Highlight Matching Tag
ペアのタグを強調して表示してくれるプラグインです。
![スクリーンショット_2021-03-11_8.02.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1210417/a1ecff93-0caf-6928-0361-9fcb9724501e.png)

上の画像では、<div>タグにカーソルを乗せている状態ですが、どこの`<div>`タグとどこの`</div>`タグがペアになっているのかを黄色の下線と透明な白色のマスクで教えてくれます。

###Bracket Pair Colorizer
対応する括弧に縦と横の線でハイライト表示をしてくれます。

先ほどのHighlight Matching Tagが、ペアとなるタグを教えてくれるものだったに対して、こちらはペアとなる括弧`（ ）``{ }``[ ]`を教えてくれます！

![f392f141be7fc179c06eca6ad61f3d60.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1210417/2ff55a84-a49a-88f6-62be-a97a921f57e5.png)

###Trailing Spaces
コード中に不要なスペースがある場合に、赤色のハイライトで表示してくれます。

![ff5061e4288e035877f0c507459086b5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1210417/bdc55523-6e17-6bb6-771b-7f6cc991bd17.png)

上の画像だと、 `<div class="top">`の横に不要な半角スペースがある状態を示してくれています。

###Auto Rename Tag
開始タグまたは閉じタグを修正した時に、対になるタグも合わせて修正してくれるプラグインです。

![53ae67b78403f4f3c189dae2f86695a1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1210417/4d3efd84-ba5e-0122-bb88-c29ebbd69803.gif)

###Indent-Rainbow
インデントを色分けして分かり易く表示することができます。
ユーザ設定にて色などの変更も可能です。
![071bf0cb321a89023f34b5d5caca8e41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1210417/5e0d4ece-6733-c20f-5fb8-30da77c66a48.png)

###vscode-icons
VScodeのファイルのアイコンはデフォルトだと非常にシンプルなものですが、vscode-iconsをインストールすると、ファイルの拡張子でアイコンが変更されることはもちろん、testフォルダーやassetsフォルダー、configフォルダーなども対応したアイコンにしてくれます。

フォルダやファイルが視覚的に整理しやすくなるため、オススメのプラグインです。

![vscode-icons.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1210417/6d3b5542-fc2e-03c7-58ff-dbe55679c832.gif)


###Prettier
ソースコードを自動で整形してくれるプラグインです。

ソースコードを保存するとタブのサイズや位置、さらにセミコロンやシングルクォーテーションなどを全て自動で整形してくれます。

主なフロントエンド開発に対応しているため、静的なHTML、CSS、JS（jQuery）での開発時に、非常に役に立ちます。


![スクリーンショット_2021-03-11_9.24.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1210417/77fc50d2-5f6f-479a-28f5-39e6484896e4.png)

自動で整形したソースコードを保存するために、
「設定」の`Format On Save`にチェックをいれておきます。

###EvilInspector
ソースコード上の全角スペースを可視化してくれます。

![23aa51873f5a06e5d456addc1403ca03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1210417/dea581ba-086a-61f8-542a-52db886919ae.png)

不要なスペースが紛れ込んでいて、エラーとなってしまうケースを回避することができるので大変助かります！


#終わりに
これまでおすすめのプラグインを紹介しました。
これを全てインストールするだけでコーディングの効率が格段に向上するのは間違いないのでぜひインストールしてみてください^^

また、今回紹介した以外にも便利なプラグインがあったらまたお伝えしたいと思います！
Reactを使ってBulmaのTabsを切り替える

#概要

<a href = "https://qiita.com/jhanyu/items/98ed4b3dedc4eec6f815">Vue.jsを使ってBULMAのtabsを切り替える</a>
この記事を参考にして頂きました。

記事ではVueを使っていますが、今回はReactを使って書いていきます。

#コード
```jsx:App.js
import React, {useState} from "react";
import { Link } from "react-router-dom";

function App() {
    const [active, setActive] = useState('pictures');

    return (
        <div className="tabs">
            <ul>
                <li className={active === 'pictures' && 'is-active'}><a onClick = {() => setActive('pictures')}>Pictures</a></li>
                <li className={active === 'music' && 'is-active'}><a onClick = {() => setActive('music')}>Music</a></li>
                <li className={active === 'videos' && 'is-active'}><a onClick = {() => setActive('videos')}>Videos</a></li>
                <li className={active === 'documents' && 'is-active'}><a onClick = {() => setActive('documents')}>Documents</a></li>
            </ul>
        </div>
    );
  }
  
  export default App;
```
# 説明
state変数のactiveはどのTabを強調するか表しています。そして，clickイベントが起こった時、useStateでstate変数を変更しています。リロードしたとき、activeがpicturesになるので、その時はuseEffectなどで対処しましょう。また、aタグをreact-router-domのLinkタグに変えることもできます。

以下のURLはコードのTabsを実装したものです
https://exampletab.netlify.app/
【Unity】WebGLでコピペしたい

# はじめに
入力フィールドを使用しないでコピペしたかった。

# 調べてみた結果
|(WebGLの場合)|GUIUtility.systemCopyBuffer| .jslib|
| - | - | - |
|**コピー**|  × (ローカル○)  |○|
|**貼り付け**|  × (ローカル○)  | △|
※Ctrl+C/Vは使わない(コピペボタンを設置したい)。

# GUIUtility.systemCopyBuffer
PC・Mac環境(非WebGL環境)やローカル環境のWebGLなら使えます(スマホ環境は未確認)。

**参考:**
https://kan-kikuchi.hatenablog.com/entry/Clipboard

# JavaScriptでコピペする
結論から書くとこの方法はローカル環境では動作しますが、unityroomなどのサイトにアップロードすると貼り付け処理だけブロックされることがあります(コピー処理は動作します)。

## 手順
1. Pluginsフォルダ下に作成した**(任意ファイル名).jslib**に以下のコードを張り付けてください。

コピーペースト処理は次の記事を参考にしました。butakoma様に感謝します。

https://qiita.com/butakoma/items/642c0ec4b77f6bb5ebcf

``` javascript
//.jslibファイルに張り付けてください。
mergeInto(LibraryManager.library, { 
  CopyWebGL: function(str) {
    var str = Pointer_stringify(str);
    var listener = function(e){
    e.clipboardData.setData("text/plain" , str);    
    e.preventDefault();
    document.removeEventListener("copy", listener);
    }
    document.addEventListener("copy" , listener);
    document.execCommand("copy");
  },
  AsyncPasteWebGL: function() {
      if(navigator.clipboard){
    navigator.clipboard.readText()
    .then(function(text){
        SendMessage('GameSceneManager', 'PasteWebGL', text); //クリップボードから取得したテキストを渡します。引数はゲームオブジェクト名、メソッド名、渡す値
    });
    }
  }
});
```

2.次のコードをどこでもいいので追加してください。(C#)

```c#
    //コピー
    [DllImport("__Internal")]
    private static extern void CopyWebGL(string str);
    //ペースト
    [DllImport("__Internal")]
    private static extern void AsyncPasteWebGL();
```

CopyWebGLを呼ぶことでクリップボードへコピーすることができます。
AsyncPasteWebGLは、ローカル環境では動作しますが、前述したように環境によってはブロックされることがあります。(それでももし使う場合はAsyncPasteWebGL関数内の**SendMessage(ゲームオブジェクト名, 呼び出すメソッド名, 渡すテキスト);**を指定してください)

# Ctrl+C/Vでコピペする場合 \: WebGLInput
「**WebGLInput**」パッケージを導入するとInputFieldとキーボードを使ってコピペができるようになります。
導入方法は、easy_light2213様の記事が参考になるかもしれません。

https://qiita.com/easy_light2213/items/90e4dcee3fb50133ffaa

# おわりに
CopyWebGLメソッドとWebGLInputパッケージを併用することでだいたいのやりたいことはできると思います。貼り付け処理が厳しいのはユーザーの情報を勝手に抜き取れないようにするためだと考えられます。
もし間違いがあればコメントにてご指摘ください。
【備忘録】忘れがちなvimコマンド　チートシート

作業時の確認用シートとして作成。
基本のコマンドを習得したい & パッと見で把握したいので必要最低限の情報だけ載せます。

###移動
![931px-KB_Terminal_ADM3A.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/746705/e4854a70-7053-e163-2dcb-afe08df5bf05.png)



###削除コマンド
|やりたいこと|コマンド|
|:-:|:-:|
|1文字（カーソル部分）|x|
|１行|dd|
|行頭 / 行末まで| d0   /   d$|
|ページ頭 / 最後まで|dgg   /   dG|
|１行削除後 インサートmodeに移行<br>(ノーマルモードで実行)|cc|
|ファイル内全て削除<br>(ノーマルモードで実行)|:%d|

###その他主要作業
|やりたいこと|コマンド|
|:-:|:-:|
|undo|u|
|redo| Ctrl + r|
|コピー|yy|
|貼付け|p|
スキルの狭間で悩む

VUE-CLIの開発環境を使いこなすことを、将来的にはあこがれるのであるが、
フロントエンドにそこまでコダワリが無いとすれば、JSのフレームワークは過剰な気がしてならない

そりゃ、最近はWEB-APPもELECTRONでサクッとデスクトップ化できる世の中なので、
ある意味、JSさえ覚えていれば、何でもマルチにできるのかもしれない。

しかしながら、自分のいまのスキルセットを考えたところ、別にWEBアプリはPYTHONで何ら苦労はしていない。

なので、VUE.JS＋NODE.JSの開発環境で、全部こなすことを勉強するぐらいならば、
全く別のスキルである、アンドロイドのアプリ開発を身に着けた方が良いのかもしれない。
（この場合はJAVAの一択にはなるが、まだJAVAもまともにできていないので・・・）

自分にとって必要なスキルは、コーディングよりも、
要件定義だとか、テスト設計だとか、実装以外の部分を膨らませていくことのほうが、
いまは大事なのかもしれない・・・

これまでの、やりっ放しの状態から脱却するには、コードのコメントからDOCUMENTを作ったり、
フロー図やクラス図を書いたり、そういう机上のスキルを身につけることの方が先決な気がする。
（これ以上の学習は、書籍から独学で得るのは限界に近い）

やはり、開発の実務を肌で感じるような、GITのリポジトリに参加したり、
OSSのプラグインや、モジュール開発に関わって、実務経験を感じる機会を
持った方がいいんだろうと思う。

最近は、COMPASSのような会合にも出れないし、なかなか人と交わる機会も取れないので
いかに情報を得て、日々の生活の中にＩＴ勉強を取り入れていくのか?

これが最も重要な課題と感じる・・・
RSpecとは~1~

## 前置き

※ 私はエンジニアに転職を希望している者で、学んだことのアウトプットとしてこの記事を書いていますので、承知ください。

本記事の対象者となるのは、

- **これからプログラミング学習始める人**
- **エンジニア転職希望者**
- **RSpecについて聞いたことがある程度の人**
- **RSpecのメリットについて知りたい人**

で、テストコードのメリットをイメージとして掴みたい人におすすめです。
なので、この記事には、コードの書き方は一切出てきませんので、承知ください。

本記事については、以下の構成で進めていきます。


**１.RSpecってなに**
**２.なんでテストが必要なのか**
**３.どんな現場で必要とされるのか**
**４.まとめ**


## 1. RSpecってなに

一言で言えば、**RubyやRailsのテストコード**です！
いや、そのテストコードがなんなのかが分からないんだよ、、って感じですよね

**テストコード**とは、**作ったものが正常に動いているかを確かめるコード**になります。
例えば、User model（データベースに作られたユーザーのデータを取り出したり登録したりする場所みたいなイメージです）のcreateメソッド（ユーザーの作成のメソッド）では、

- email（accountの場合もあるかな）
- password

は情報として欲しいですよね？普段使用しているアプリとかサービスもこの二つは必ず入力していると思います。

なのでUser modelに

　- **emailとpasswordが入力されていない場合は、ユーザーが作成できない**

という設定をコードで書きます。

でもコード上でこの設定をしても、本当にコードの通りに動いてくれるかデータ入れてみないと分からないじゃないですか。
そのための**テストコードなんです！**
テストコードとは**主にダミーのデータを活用して**プログラムに書いたコードが**そのとおりに動いているかを確認するためのもの**なのです！

普通にデータ入れて確認すればと思う人もいるかもしれませんが、実際のWebサービスでは、たくさんの設定がありますし、いちいちデータ入れて確認なんてしてたら、開発が進まないんです！
そのほかにも色々メリットありますが次のステップで紹介します。

**1.のまとめ**

- RSpecとはRubyやRailsのテストコード
- テストコードは主にダミーデータを使って書いたコードがそのコード通りに動くか確認するためのもの


## ２.なんでテストが必要なのか

テストを必要とする１番の理由、それは

**テストコードがあれば、バージョンアップしやすい**からです！

日々アプリユーザーやWebサービス利用者からは

**「こんな機能が欲しい」**とか**「ここを改善してほしい」**とかの声がレビューで届いています。

企業や開発者はそんな声に応えるため、サービスを改善（バージョンアップ）します。
しかしテストコードが書いていないサービス（そんなサービスないと思うけど）はバージョンアップしづらいんです。

自身でも何か作り始めれば、実感すると思いますが、**バージョンアップさせるためにコードを追記**することによって、今まで**正常に動いていたサービスが動かなくなる**ことがあるんです。

このような場合にテストコードが書いていないと、
**　どこでエラーしているか分からない**
ので、エラーコードを順番に読み取って、エラー箇所にたどり着く手間が出るのです。

**テストコードが書いてあれば、コードの追加、修正がしやすいし、データ入力しなくてもコマンドひとつでちゃんと動くか確認できるのでバージョンアップもしやすいんです。**

アプリやサービスの利用者には、色々な人がいます。

**最新の機能を使いたい！**　
**今の方が便利だからこのままでいい！**
**面倒だからこのままでいい!**

この要望に応えるには、バージョンアップしても前のバージョンが**今まで通り動いてくれる必要がある**のです！

**だからテストが必要なんです！**

**2.のまとめ**

- テストコードがあるとコードの追加、修正、バージョンアップがしやすい

## 3.どんな現場で必要とされるのか

ズバリ、**自社開発企業**では必須のスキルになるでしょう。
もちろん他の受託開発企業でも必要なスキルではあります。

それぞれ開発手法に違いがあるので、そこにフォーカスした観点からお話します。

自社開発企業では、一般的に**アジャイル型開発**で開発が行われています。

- **アジャイル型開発**とは、ざっくり言えば、設計、作成、公開、使用者からのレビューを元に機能の追加、作成、公開、使用者からのレビュー、、、の繰り返しです。

この手の開発手法では**完璧よりも最速の開発が必要**とされますし、バージョンアップしてどんどんいいものにしていこうという開発手法になるので、テストコードは必須と言えるのです。

一方で受託開発企業では、一般的に**ウォーターフォール型開発**が主流です。

- **ウォーターフォール型開発**とは、ざっくり言えば設計、作成、納品の流れでの開発であり、フィードバックによるバージョンアップを前提とはしない開発手法です。

受託開発企業では、企業からの依頼されたものを完璧な状態でかつ納期までに完成させ、納品しなければなりません。
もちろん開発の過程でテストコードを使ったりすることもあるとは思いますが、依頼された案件を納期までに納めることの方が大事になってくるので、自社開発企業の方がテストコードは必須と言えるでしょう。

まああったほうが絶対にいいスキルなんです、要は。笑


## 4.まとめ

今回の話をもう一度まとめると

- **RSpecとはRubyやRailsのテストコード**
- **テストコードは主にダミーデータを使って書いたコードがそのコード通りに動くか確認するためのもの**
- **テストコードがあるとコードの追加、修正、バージョンアップがしやすい**
- **自社開発企業では必須、受託開発企業でも必要、というかWeb系企業で働くならばテストコードからは逃げられない**

といったところでしょう。



今回は、RSpecやテストコードの基本部分についてお話しました。
今後はもっと細かい部分やコードの書き方についても記事にしたいと思います。
MacBook Air M1チップ搭載機でPower BI Desktopを動かす（折れ線グラフとクイックメジャー）

##M1で初めての折れ線

Parallels Desktop 16 for Macを使い、M1チップ搭載MacBook AirにWindows Insider PreviewのARM版Windows10をインストールしました。
その後で[Power BI Desktopが起動するところまで確認](https://qiita.com/text_owleyes_0214/items/ff164ea5ebfcd94332e4)しました。
今回、実際に操作できるのかを試しました。

NHKの新型コロナウイルスサイトで提供しているオープンデータを利用しました。

https://www3.nhk.or.jp/news/special/coronavirus/data-widget/

「データを取得」からcsvファイルのURLをペーストします。
今回は県別集計データを使いました。

>https://www3.nhk.or.jp/n-data/opendata/coronavirus/nhk_news_covid19_prefectures_daily_data.csv

折れ線グラフを作成できました。
凡例として都道府県フィールドを使っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/db90766c-79cb-a545-61fc-9ee0159bb320.png)

##移動平均クイックメジャーを試す

右パネルの「フィールド」内で右クリックし「新しいクイックメジャー」を選びます。
「移動平均」のクイックメジャーの設定をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/8bfc94f4-37aa-7555-f607-ac9b90dd3030.png)

DAX言語を使ったスクリプトが生成されます。

```JavaScript
各地の感染者数_1日ごとの発表数 移動平均 = 
IF(
	ISFILTERED('nhk_news_covid19_prefectures_daily_data'[日付]),
	ERROR("タイム インテリジェンスのクイック メジャーは、Power BI が指定する日付階層またはプライマリの日付列でのみグループ化またはフィルターできます。"),
	VAR __LAST_DATE = LASTDATE('nhk_news_covid19_prefectures_daily_data'[日付].[Date])
	RETURN
		AVERAGEX(
			DATESBETWEEN(
				'nhk_news_covid19_prefectures_daily_data'[日付].[Date],
				DATEADD(__LAST_DATE, -6, DAY),
				__LAST_DATE
			),
			CALCULATE(SUM('nhk_news_covid19_prefectures_daily_data'[各地の感染者数_1日ごとの発表数]))
		)
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/214cd8e1-abd0-9ba5-c8b3-f7ee479bc1cd.png)

クイックメジャーを使った移動平均グラフが作成できました。
M1チップ搭載機でPower BI Desktopを動かせそうで、一安心です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/c61852ad-0b3b-e871-5d04-2538e7d95ca0.png)

ただ、Windows Insider PreviewのARM版Windows10で日本語入力ができません。
アプリケーションのU/Iには日本語表示されるのですが、IMEでかな入力ができないままです。
「日本語補助フォント」のインストールに失敗しているのが原因のようです。
Windows Updateを実行すると、Windows11のPreview版へのアップデートが始まり、失敗します。
しばらくこのまま使い続けるしかなさそうです。

**了**
接続エラー解消　Failed to listen on localhost:8765 (reason: Address already in use)

Every Qiita #8
のんびり独学初学者の毎日投稿チャレンジ 8日目
今回は・・・
cakePHP言語でのlocalhost接続エラーに関しての備忘録です。

###localhost:8765実行のエラー
```
Failed to listen on localhost:8765 (reason: Address already in use)
```
すでにプロセス実行中ですとのこと。

###PHPプロセス状況の確認
`ps ax | grep php`
上記でphpが含まれるプロセスを確認できます。

###実行したいプロセスID(PID)の切断
`kill -9 （プロセスID）`
*-9で強制的に切断できます。*

###再度サーバ実行
```terminal
bin/cake server
```
ESXiでCentOS8.4環境を作成してwindowsからsshでつなぐ

# SSH接続したい理由
ESXiはどうやらGUIで触れるみたいです。
ただし、コンソールで触る分には慣れているteraterm等で触るのが楽だと考えたのでsshで触れるようにしてみます。

# CentOSの仮想マシンを作成する
## CentOSのダウンロード
https://www.centos.org/download/
上記からCentOSの現時点での最新版をダウンロードします。
今回はCentOS-8.4.2105-x86_64-dvd1.isoをダウンロードしました。

## isoファイルをアップロードする
ESXiのコンソールの左側にあるナビゲータからストレージをクリックします。
次にデータストアを選択して右クリック→参照をクリックします。
![datastore.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157171/9c485368-4e2c-005c-57f2-fc2a75b0519f.png)

次に左上のアップロードから先ほどダウンロードしたCentOS-8.4.2105-x86_64-dvd1.isoをアップロードします。
自分はisoフォルダいかに置きました。
![upload_iso.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157171/ca1c99c9-1bc3-974e-e5c2-e76e05de19cc.png)

## 仮想マシンの作成
ナビゲータの仮想マシンをクリックして左上の仮想マシンの作成/登録から作成します。
新規仮想マシンの作成を押して、表示されるがままにマシンの名前等を決めていきます。
4の設定のカスタマイズでマシンスペックを決めます。(今回はとりあえずデフォルトのまま)
その際にCD/DVDドライブ1でデータストアISOファイルを選択して、CentOS-8.4.2105-x86_64-dvd1.isoを選択します。
これで最後まで行って完了で作成完了です。

## 起動
仮想マシン以下に作成したマシンの名前があると思うのでクリックして移動し、上部分にパワーオンというボタンがあるのでクリックして起動します。
起動後、コンソールをクリックでマシンの操作ができますので以下を参考にosのセットアップをしてください。
https://eng-entrance.com/linux-centos-install

## ちょっとハマった点
biosからintel vtxという仮想化に必要な設定をオンにする必要がありました。
https://www.asus.com/jp/support/FAQ/1043786/
今回はasusのマザーボードを使用しているため、上記リンク先の記事を参考にオンにしました。

# SSHでつなぐ
## ESXi側の設定
ESXiのコンソールからホスト/管理へ行きます。
![ssh_on.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157171/d0233d85-153c-07cb-43c4-8075ae0f9cc2.png)

サービスへ行き、TSM-SSHを右クリックして起動を選択します。
そのあともう一度クリックしてポリシー→ホストと連動して起動および停止します　にチェックを入れておきます。

## teratermでつなぐ
https://ja.osdn.net/projects/ttssh2/
teratermは上記からダウンロード/インストールを実施しました。
起動後、ホストに作成した仮想マシンのIPアドレスを入力し、その後CentOSインストール時に作成したユーザー名/パスワードでログインできるはずです。
![cent_ssh.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157171/5010c265-63c2-2d8c-95bf-491232b687f4.png)

# 感想
難しいことをしなくてもとりあえずインストールと触るための準備はできました。
これから何をするか考え中です。

# 参考にした記事
以下の記事を参考にさせていただきました。ありがとうございました。
https://anything-it.info/esxi67-sshlogin-enable/
https://mekou.com/linux-magazine/centos-8-%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E6%96%B9%E6%B3%95-32bit%E7%89%88%E3%81%AF%EF%BC%9F-%E6%97%A5%E6%9C%AC%E8%AA%9E%E7%89%88%E3%81%AF%EF%BC%9F/#CentOS_Linux_DVD_ISOCentOS_Stream_DVD_ISO
Windows環境でIPアドレスを多数設定するbatファイル

#はじめに
Windows環境で多数のIPv4アドレスを振る必要が出てきました。
IPv4アドレスを1個ずつ設定するのはとても面倒なので、自動化してやろうという魂胆です。

#やり方
pythonを使って…と思ったのですが、どうせWindowsでしか使えないですし、batファイルでもよさそうです。
今回はbatで作成します。

#書く前の整理
batファイルを書く前に何をさせるのか大まかに整理します。

###処理の内容
①IPv4アドレスを設定するコマンドをたたく
②①はループ処理の中で実行する

###注意事項
IPv4アドレスは32ビットですが、8ビットずつで合計4つに区切られます。
この区切りをオクテットと呼びます。
1オクテットの最大値は255ですので、桁上がりの時には注意が必要です。

#さっそく書いてみる

```:ip_add_loop.bat
@echo off

rem 変数の指定
rem -------------------------------------------------------
rem IPアドレスを設定するインタフェース名の指定
set Ifname="ローカル エリア接続"

rem 繰り返しの最初の値となるIPアドレスの
rem 第1オクテットから第4オクテットまでを設定する
set Oct1=1
set Oct2=0
set Oct3=0
set Oct4=1

rem サブネットマスクの指定
set Subnet=255.255.0.0

rem デフォルトゲートウェイ
set DefGW=1.0.2.254
rem -------------------------------------------------------

rem ループ中で変数を使うための設定
setlocal enabledelayedexpansion

rem デフォルトゲートウェイを設定する
echo netsh interface ipv4 set address name=%Ifname% source=static gateway=%DefGW%

rem ループ処理①(第3オクテットをインクリメントする用)
for /l %%m in (1,1,2) do (

  rem ループ処理②(第4オクテットをインクリメントする用)
  for /l %%n in (1,1,255) do (
    echo netsh interface ipv4 set add name=!Ifname! source=static addr=!Oct1!.!Oct2!.!Oct3!.!Oct4! mask=!Subnet! 
    rem netsh interface ipv4 set add name=!Ifname! source=static addr=!Oct1!.!Oct2!.!Oct3!.!Oct4! mask=!Subnet! 
    set /a Oct4 += 1
  )
  rem 第4オクテットが255に達したら、1に戻す。
  set /a Oct4 = 1
  
  rem 第3オクテットをインクリメントする。
  set /a Oct3 +=1
)
rem 設定の終了
endlocal
pause
```

#テスト
実行してみますが、実際のIPアドレス割り当ては不要なのでechoのみ実行します。
上記であれば、1.0.0.1～1.0.1.255までアドレスが表示されるはずです。

![結果1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048145/d9bcad22-d9e0-f509-ecdc-305fe7e625ce.png)
![結果2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048145/5eecdf2e-74cd-f278-0457-8f47aa33805a.png)
![結果3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048145/773aa4d9-d701-92c5-a328-9f32361d3149.png)

無事想定範囲のIPアドレスが表示されました。
桁上げ箇所も問題なさそうです。

#終わりに
batファイルを作るのはあまり慣れていないですが、何とか動くものができました。
ホストアドレス数を増やすとループが多段になってしまい処理が重くなりそうなので、
処理速度が気になる場合はif文を使うほうが良いような気がしますね。
React 外部ライブラリ読み込み方法

# はじめに

React をちょくちょく触っているんですが、理解できていない & 少し時間をかけてしまったことがあるので、記憶がてらまとめてみました。


# React 外部ライブラリ読み込み方法

以下の1行です。

```react
require('sample.js')
```

え、、・・・。```require```ってサーバーサイド（Nodejs）で実行する時にしか使えないという認識でした。

いろいろ調べてみたところ、以下のような記述を見つけました。

> どの環境でも動作するようにするためには、
> webpackなどのモジュールバンドルツールを利用する方法があります。

> webpackというツールのイメージとしては、
> ・上記の書き方の例でいうmain.jsのような「読み込み側」のファイルを変換対象として指定する
> ・ツールを実行する
> ・ファイルに書かれているimportやrequireなどの文を解析してくれる
> ・必要な外部ファイル（モジュール）を取ってきて全部１つのファイルとしてまとめて出力する
> ということができるものです。

なるほど、```webpack```で require も解析して1つの JavaScript ファイルとして出力してくれて、そのファイルをHTMLで読み取るから読み込めるんだ〜と納得しました。


# まとめ

今日は軽めの記事でした〜。
まだまだ勉強不足なので、励みたいと思います。
ご指摘などがあればお願いします。。。

# 参考
* jsのimportとrequireの違い
    * https://qiita.com/minato-naka/items/39ecc285d1e37226a283

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/
VS Code 1.58 の新機能 - エディタのスクロールバーの設定項目追加

https://code.visualstudio.com/updates/v1_58#_editor-scroll-bar-customization

エディタのスクロールバーに関する設定項目が追加された。

### スクロールバーの表示・非表示設定
`editor.scrollbar.horizontal` 水平スクロールバー
`editor.scrollbar.vertical` 垂直スクロールバー

設定値は

- `auto` : スクロールが必要な場合のみ表示(デフォルト)
- `visible` : 常に表示
- `hidden` : 常に非表示

### スクロールバーの幅サイズ設定
`editor.scrollbar.horizontalScrollbarSize` 水平スクロールバー
`editor.scrollbar.verticalScrollbarSize` 垂直スクロールバー

### ページ単位スクロール設定
`editor.scrollbar.scrollByPage`
スクロールバーの余白をクリックしたときのスクロール動作の設定。
デフォルトはクリックした位置にスクロールするが、チェックボックスをオンにするとページ単位にスクロールする。

そう、これ！
以前はページ単位スクロールだったはずが、いつの間にかクリック位置スクロールに変わっていた。他のアプリがみんなページ単位スクロールなのでVS Codeだけ操作が異なっていてすごく使いづらかったのでこの設定追加は嬉しい。クリック位置スクロールはミニマップのほうでできるし。
Windows PowerShell (VS Code) コマンドを改行する方法

# Windows PowerShell (VS Code) コマンドを改行する方法
書籍や動画で学習を進めていくと、講師がコマンドを改行してキレイに（？）書く場面を見かける時がある。（長すぎても一行で書く人がいるが、見づらい。。）
学習は後回しに、講師と同じことをやりたかったので、探しまくって方法を見つけた。次からは学習の方に集中できると思う。

## 環境の整理
- VS Code 内 Terminal : Windows PowerShell


## 方法
1.　![スクリーンショット 2021-07-10 210011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676239/43c34b90-dc1c-017a-b6a3-87bd55879e81.png)

2.　改行したい行の末端に　\`　を入力しEnter
- \` : バッククオートと読む
- Shift + @ で入力可
![スクリーンショット 2021-07-10 211535.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676239/a26f61ba-dba7-1f02-d517-e44eaa56d628.png)


3.　例）Railsコマンドを入力した時。
　　オプションたちは改行して書いた、最後にEnter => 実行される。
![スクリーンショット 2021-07-10 210111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676239/c47d73f9-615a-464b-9cad-32532c22476a.png)

OK
GitHubの用語についてのまとめ

#本記事を記入しようと思ったわけ
GitHubについて実際に言語化しようとしたらうまく説明できず用語や役割ついてあいまいなところがあったので、復習とアウトプットもかねて用語などについてまとめてみたいと思ったのが理由です

#git

プログラムソースコードなどの変更管理をしてくれる分散型のバージョン仮ツールです、当ツールで管理されているおかげで途中でコードの編集などをしたくなった時などにスムーズにできます。
変更履歴も見ることができたり編集前に戻したりもできるので非常に便利ツールです。

#GitHub
gitを利用した開発者支援のwebサービスです、私も最初gitとGitHubが混在しててあいまいでしたが、gitがツールでGitHubがgitを使用することができるサービスです。

#レポジトリ(repository)
システムの開発プロジェクトなどで作成したデータを一時的に保存できる保管庫みたいなものです。各工程の様々なデータを管理できます。
この他にもローカルレポジトリやリモートレポジトリがありますが、これらについてはまた後程記述します。

#ローカルレポジトリ(local repository)
自分のpcなどに入っているデータのことを言います、この状態だとまだネット上には作成した本人だけが確認できネットには公開されていません。

#リモートレポジトリ(remote repository)
ローカルレポジトリに対して逆で自分の作成したデータを外部のレポジトリにプッシュして、ネット上からだれでも閲覧できる状態にしたものです。
サーバーなどの外部にあるデータのことも該当します。
個人製作でいろんな方々公開したいときなどにも利用できます。
簡単に共有でき、データの保存ができます。

#フォーク(fork)
GitHubが提供するサービスの一つでほかの開発者のgithbu上でクローン（後述）できます。
またこちらはこちらは貢献することが前提になっていることが注意です。

#クローン(clone)
他の開発者や自分のリモートレポジトリから自分のpcなどに複製できる仕組みです。

#イニット(init)
空のレポジトリを作成したいときに使用するコマンドです。
またレポジトリを初期化したいときなどにも使用されます。

#コミット(commit)
追加や変更したがいるなどをわかりやすくレポジトリに記録させます。
ゲームなどで言うセーブみたいなものです。

#コミットメッセージ(commit message)
コミットした内容を期日します。基本的には必須で書きます。

#ヘッド(head)
今いるブランチの最新のコミットの代名詞を指します。

#プル(pull)
リモートレポジトリにあるコミットをローカルレポジトリに反映させます。

#ブランチ(branch)
作業内容をそれぞれのパーツごとに分けて、プロジェクト本体に影響を与えずに開発を行える機能です。
この機能によりエラーなどが発生しても本体に影響を与えず修正ができ、ほかの作業を同時に進めることができます。

#マスターブランチ(masterbracch)
プロジェクトの本体でレポジトリに最初にコミットした内容がマスターブランチになります。
Linux: 大きいファイルの分割・結合方法

たまに必要となるのでメモ。

###### 実施環境：

```Linux:Linux
[testuser@testhost ~]$ uname -a
Linux testhost 4.18.0-147.8.1.el8_1.x86_64 #1 SMP Thu Apr 9 13:49:54 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
[testuser@testhost ~]$ echo $SHELL
/bin/bash
```

サイズの大きいファイルを、Linux上で分割したい時があります。
そのような時に使用するのが、splitコマンドです。
以下のように記載して使用します。

```Linux:Linux
split -b 分割サイズ -d 分割前ファイル 分割後ファイル
```

分割後のファイル名は、分割後ファイル00,分割後ファイル01,...となります。
以下、実行例です。

```Linux:Linux
[testuser@testhost ~]$ ls -lh test.log*
-rw-r--r-- 1 testuser testgrp 4.8M Jul  3 20:17 test.log
[testuser@testhost ~]$ split -b 1M -d test.log test.log.
[testuser@testhost ~]$ ls -lh test.log*
-rw-r--r-- 1 testuser testgrp 4.8M Jul  3 20:17 test.log
-rw-r--r-- 1 testuser testgrp 1.0M Jul  3 20:20 test.log.00
-rw-r--r-- 1 testuser testgrp 1.0M Jul  3 20:20 test.log.01
-rw-r--r-- 1 testuser testgrp 1.0M Jul  3 20:20 test.log.02
-rw-r--r-- 1 testuser testgrp 1.0M Jul  3 20:20 test.log.03
-rw-r--r-- 1 testuser testgrp 787K Jul  3 20:20 test.log.04
```

上記の例では、test.logを1MB単位のtest.log.00~test.log.04に分割しています。
分割したファイルを結合するにはcatコマンドを使用します。

```Linux:Linux
[testuser@testhost ~]$ ls -lh test.log*
-rw-r--r-- 1 testuser testgrp 4.8M Jul  3 20:17 test.log
-rw-r--r-- 1 testuser testgrp 1.0M Jul  3 20:20 test.log.00
-rw-r--r-- 1 testuser testgrp 1.0M Jul  3 20:20 test.log.01
-rw-r--r-- 1 testuser testgrp 1.0M Jul  3 20:20 test.log.02
-rw-r--r-- 1 testuser testgrp 1.0M Jul  3 20:20 test.log.03
-rw-r--r-- 1 testuser testgrp 787K Jul  3 20:20 test.log.04
[testuser@testhost ~]$ cat test.log.* > test.log.merge
[testuser@testhost ~]$ ls -lh test.log*
-rw-r--r-- 1 testuser testgrp 4.8M Jul  3 20:17 test.log
-rw-r--r-- 1 testuser testgrp 1.0M Jul  3 20:20 test.log.00
-rw-r--r-- 1 testuser testgrp 1.0M Jul  3 20:20 test.log.01
-rw-r--r-- 1 testuser testgrp 1.0M Jul  3 20:20 test.log.02
-rw-r--r-- 1 testuser testgrp 1.0M Jul  3 20:20 test.log.03
-rw-r--r-- 1 testuser testgrp 787K Jul  3 20:20 test.log.04
-rw-r--r-- 1 testuser testgrp 4.8M Jul  3 20:22 test.log.merge
[testuser@testhost ~]$ diff test.log test.log.merge
[testuser@testhost ~]$ 
```
話題沸騰中の Windows11(Insider Preview版) をHyper-Vにインストールする方法

## Windows11を簡単にインストールしたい！
Windows11何かと話題ですよね。そんなWindows11を早速インストールしてみたいと思うのがミーハーの性というもの。しかし実機インストールはハードルが高いしWindows11の`ISO`ファイルは出回ってないから仮想環境でもインストールできない…そう思っていませんか？Windows11は割と簡単にインストールできます。
そう、Hyper-Vならね。
## 必要なもの
- Windows10がインストール済みのPC（ホストOS用）
- Windows10のライセンス（ゲストOS用）　~~ぶっちゃけアプリの動作確認程度の目的だったら必要ない~~
- Hyper-V（インストールしてない場合は[事前準備1](#事前準備1-hyper-vをインストールする)）
- Windows Insider Programに登録済みのMSアカウント（持ってない場合は[事前準備2](#事前準備2-windows-insider-program-に登録する)）

## 事前準備1 Hyper-Vをインストールする
```powershell:PowerShell（管理者権限）
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
```
インストールできたらWindows10を再起動してください。
（この記事ではWindows10 Pro前提で書いていますが一応Windows10 Homeでもこれとは違う方法でHyper-Vをインストールすることはできます。）
## 事前準備2 Windows Insider Program に登録する
https://insider.windows.com/ja-jp/getting-started

上のリンクから`Windows Insider Program`に登録してください。これはあくまでも`Windows Insider Preview`の Dev チャネルのISOファイルをダウンロードするための登録なのでMicrosoftアカウントとWindows 10のアカウントを関連付ける必要はありません。
## ISOをダウンロード
https://www.microsoft.com/en-us/software-download/windowsinsiderpreviewiso

上のリンクを開いたら Select edition のところまで移動して`Windows 10 Insider Preview (Dev Channel)`を選択して`Confirm`をクリックしてください。
![Select edition](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/807403/78db1e23-6a66-d4cd-861e-6085baa8e7e3.png)
Select the product language では`Japanese`（別に日本語じゃなくてもいいけど）を選んで`Confirm`をクリックしましょう。
![Select the product language](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/807403/19335679-7645-c64c-6b9a-cb696754382f.png)
最後に`64-bit Download`を選んでダウンロードしましょう。（これにはかなり長い時間がかかるため気長にお待ち下さい。）
![OSのbit選択](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/807403/09396602-e330-e63b-c97e-00fb1c9e19f5.png)
## 仮想マシンの作成
ここまで来たらいよいよWindows11のインストール！と言いたいところですが先程の手順でダウンロードしたのはあくまでも”Windows10”のInsider Preview版のiso。先にWindows10をインストールします。
まずHyper-V マネージャーを起動してクイック作成をクリックしてください。
![クイック作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/807403/64628a07-e68c-c7fe-69ee-a01682cd6d45.png)
次に`ローカル インストール元`をクリックして`インストール元の変更`をクリックしてください。
ファイラーから先程ダウンロードしたISOファイルを選んでください。
そしたら`仮想マシンの作成`が選択できるようになるのでクリックしましょう。
![オペレーティングシステムの選択](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/807403/8a9d5e17-9dc1-41a0-70c2-feade655862d.png)
正常に作成されたら`設定の編集`をクリックしてください。
メモリを4000MBにしたら`OK`をクリックし接続しましょう。
![メモリの編集](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/807403/ca280398-a560-97aa-f67e-f6f09355b8b8.png)
## Windows10をインストール
起動したら「Start PXE over IPv4.」という文字が表示される前に何らかのキーを押してWindows セットアップの画面に入ってください。
Windows セットアップ画面では画面の手順に従ってインストールしてください。
![Windows セットアップ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/807403/b1bf5b89-9e65-7ca9-2ece-228a98445106.png)
## Windows11に更新
Windows10のインストールが完了できたら後は簡単です。
`Windows`+`I`キーを押して設定（コントロール パネルではない方）を開き
[更新とセキュリティ]->[Windows Update]から`更新プログラムをチェック`を押してください。
上手く行っていれば`Windows 11 Insider Preview`が降ってくるはずです。
![Windows Update](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/807403/95ba4369-a2c1-07f0-05b9-4835dea0f1b0.png)
しばらく待てばWindows11が無事インストールできるはずです！
![Windows11](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/807403/31a65f64-5402-263a-b155-a4f4ca164257.png)