OmniAICreator/Qiita-1.07M huggingface dataset:
Rubyの基礎文法を簡単にまとめてみた

個人的に理解が浅い部分を抜粋してまとめています。
詳細はページ下部リンクからご覧ください。

# ハッシュ

```ruby
#key:valueをひとかたまりに格納する
fruits = {"a":"apple", "b":"grape", "c":"orange"} 
puts fruits
puts fruits[:a] #キー値で取り出す

#実行結果
{:a=>"apple", :b=>"grape", :c=>"orange"}
apple
```

# 条件分岐

```ruby
if 条件A
  条件に一致した場合の処理
elsif 条件B
  条件Aと一致せず、条件Bに一致したの時の処理
else
  条件A, Bのどちらにも一致しない時の処理
end
```

# インデント

rubyでは、tabキーでインデントはNG！

スペースキーでインデント作る！

# 繰り返し処理

### for文

```ruby
list = [1, 2, 3, 4, 5]
for item in list
    puts item
end

#実行結果
1
2
3
4
5
```

### while文

```ruby
a = 1
while a <= 10 do
    puts a
    a += 1
end

#実行結果
1
2
3
4
5
6
7
8
9
10
```

# 例外処理

### begin

```ruby
begin
実行するコード
rescue
例外が発生したときだけ実行されるコード
else
例外が発生しなかったときだけ実行されるコード
end
```

### rescue

```ruby
begin
実行するコード
rescue
例外が発生したときだけ実行されるコード
else
例外が発生しなかったときだけ実行されるコード
ensure
例外の有無にかかわらず 最後に実行されるコード
end
```

### raise

```ruby
raise エラーの種類
```

# メソッド

```ruby
#メソッド
def drinkServer(fruit)
    drink = fruit + 'ジュース'
    return drink
end

puts drinkServer('りんご')

#出力結果
りんごジュース
```

# クラス

メソッドなどの処理全体のひとかたまり

```ruby
#円についての処理をするクラスを宣言
class Circle #クラス名の最初は大文字
 
  def area_circle
    puts @radius * @radius * 3.14
  end
 
  #関数などが連続するときは間に空行を１行入れること
  def circumference
    puts @radius * 2 * 3.14
  end
 
  def radius=(radius)
    @radius = radius
  end
end
 
#インスタンスを生成
circle1 = Circle.new
 
#半径を入力
circle1.radius = 3
 
#関数を呼び出す
circle1.area_circle
circle1.circumference
```

# 継承クラス

```ruby
class クラス名 < 継承したいクラス名
 
end
```

# 参考記事
[初心者のためのRuby入門徹底ガイド【基礎からわかりやすく解説】 | 侍エンジニア塾ブログ（Samurai Blog） - プログラミング入門者向けサイト](https://www.sejuku.net/blog/curriculums-ruby-2)

[とほほのRuby入門 - とほほのWWW入門](http://www.tohoho-web.com/ruby/)

[20分ではじめるRuby](https://www.ruby-lang.org/ja/documentation/quickstart/)
Automation Anywhere Automation360  - 基本  Excelパッケージ 

#Automation Anywhere A2019 Excelパッケージ

業務の自動化で良く使うであろうアプリケーションの一つであろう、
Microsoft Excel用のパッケージについて紹介します。
_使用方法については別途書く予定（あくまで予定）です。_

##Automation360で用意されている標準Excelパッケージ
Automation360 では下記の3つのパッケージが標準で用意されており、基本的には、利用するExcelによって選択します。
- Excelの基本操作
- Excelの高度な操作
- Office 365 Excel
ただ、単純な処理で高速な処理がしたいといった場合、Excelの基本操作が適しています。

###Excelの基本操作アクション
Excelの基本操作は、出来ること自体は少ないのですが、なんといっても、**Excelがインストールされていない環境でも動作**し、処理中に**Excelのウィンドウも表示されない**という利点があります。**動作も高速**です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/41c6899d-7eef-2e91-9e6a-d482effd5b34.png)


###Excelの高度な操作アクション
基本の操作に比べると、**非常に多くのアクション**が設定されており、色の取得であったりPDFへの変換等にも対応します。
Excelがインストールされている環境でBotを動作させる場合は、後々やりたいことも増える可能性もありますし、こちらが選択肢になりそうですね。

| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/62cce00b-3bfb-6261-fcd4-d8f139228da7.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/9d1477df-e94a-c177-f286-1ff3c0a990ba.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/ef429d5c-6811-c63e-e724-0fcf90f360ca.png) |
|:-:|:-:|:-:|



###Office 365 Excelアクション
Office365用のパッケージも、高度な操作同様に、様々なアクションをサポートしています。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/c4b0515f-f4a6-6e4a-4b9a-60872fb5474d.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/940cd806-faac-8402-85be-79ccecf55b4d.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615564/9e3e7f18-1a2b-1e58-1c7e-1bca1ce0e23b.png)|
|:-:|:-:|:-:|
DHCP、DNSについて

#DHCP,DNSについて

##1. DHCPについて

###1.1 DHCPとは
DHCPとはDynamic Host Configuration Protocolの略称
DHCPサーバーによってネットワーク上PCのIPアドレス設定を自動化できる。

###1.2 DHCPでの設定
DHCPによって設定できるのは以下の通り
・IPアドレス
・サブネットマスク
・デフォルトゲートウェイ
・DNSサーバーアドレス
・DNSドメイン名
・リース期間
・Proxyサーバーアドレス

###1.3 DHCPリレーエージェント
DHCPのサーバーとクライアントが同一セグメントの場合、ブロードキャストによってDHCPと通信するが、
同一セグメント上にDHCPサーバーとクライアントが存在しない場合、DHCPリレーエージェント経由
通信する。 DHCPリレーエージェントとDHCPサーバー間での通信はユニキャスト（一対一）となる。

###1.4 DHCPサーバーの冗長構成
①フェイルオーバー構成
　２台のDHCPサーバーをホットスタンバイした冗長構成。
　限られた製品でしかできない（Windows　Server２０１２以降）

②重複スコープ、重複アドレス検知
　DHCPサーバーを複数構築。
　配布前にIPアドレスにping応答を確認し、重複を回避。
　ファイアーウォールの設定などによってping応答を返さないこともあるので注意が必要。

③重複しないスコープレンジ
　事前にスコープを分けたDHCPサーバーを構成。
　DHCPサーバー障害時には、そのスコープ範囲のIPアドレスは使えなくなる。

###1.5 不正DHCPサーバー回避
・DHCPスヌーピング
　スイッチのポートに信頼状態を設定
　信頼したポートのみDHCPサーバーからの通信を受け付けるので、
　不正なDHCPサーバーから通信がされないよう設定する。

##2. DNSについて

###2.1 DNSとは
DNSとはDomain Name Systemの略。ホスト名とIPアドレスの結びつけを行うプロトコル。
ホスト名からIPアドレスを割り出すことを名前解決と呼ぶ。
DNSサーバーを利用するクライアントをDNSリゾルバと呼ぶ。

###2.2 ドメイン名の構造
「www.example.com」の表記を**FDQN**（Fully Qualified Domain Name 完全修飾ドメイン）と呼ぶ。
「www」はホスト名、「example」は第２レベルドメイン、「com」はトップレベルドメインという階層構造の形になる。
トップレベルドメインは国や機関によって管理されている。

###2.3 ゾーンデータベース
ゾーンデータベースとはホスト名とIPアドレスの対応情報が格納されたデータベースで、DNSサーバーが管理
ホスト名→IPアドレスを導き出すことを正引き、
IPアドレス→ホスト名を導き出すことを逆引きと呼ぶ。

###2.4 DNSサーバーの役割
・プライマリDNSサーバー
　ゾーンデータベースのマスターデータを保持。読み取り/書き込みが可能。
・セカンダリDNSサーバー
　プライマリDNSサーバーからソーンデータベースのコピーを保持。読み取り専用。
・キャッシュオンリーDNSサーバー
　ゾーンデータベースは保持せず、キャッシュから応答を返す。

プライマリDNSサーバーからセカンダリDNSサーバーへのゾーンデータベース複製処理をゾーン転送と呼ぶ。

###2.5 DNSレコードの種類
・SOA（Start Of Authority）
　ゾーンの基本情報
・NS（Name Server）
 DNSサーバーのアドレスを記載
・A（Address）
　ホスト名に対するIPv4アドレスを記載
・CCNAME(Canonical Name)
　ホスト名の別名(エイリアス名)を記載
・PTR(PoinTeR)
　IPアドレスに対するホスト名を記載

###2.6 DNSサーバーの配置
・社内DNSサーバー
社内のサーバー、クライアントの名前解決を行うためのレコードを保持。
クライアントからインターネットなど外部の名前解決を行うため外部DNSサーバーをフォワーダとして指定する。
不断の改善

**改善にはどれだけやれば良い、これを達成したら終わりであるというゴールがありません。**
皆さんの周りの社会環境・ビジネス環境の変化を時間に表すとどのくらいの時間軸で変化していますか？　1年、半年、四半期、一カ月、一週間・・・と、どの程度でしょうか？
私たちの周りは**刻々と変化**しています、それは**分・秒という短い**もので変化しています。人は保守的になりがちで、ほっておくと変化しなくなります。
常に周りに敏感であるためにも、変化は刻々と変化していると認識すべきです。
今は上手くできていても、変化に柔軟に対応できるように変化していかなければ、あっという間に、悪くなってしまいます。刻々に変化しているという立ち位置でないと、悪くなっている事も気づけなくなり、目に見えるような、誰でもわかる様に悪い状態に陥ってからでは、莫大な時間と労力を費やすはめになってしまいます。
**問題意識**を常に持ち、日々**『いまよりももっと良いやり方は無いか？』・『もっと品質を高めるように出来ないか？』・『もっと生産性を上げることが出来ないか？』**と現状にあまんじなく、否定できる姿勢**（現状否定）**を持つことです。問題意識だけ長けても悲壮感に陥ってしまっては行動が止まってしまいます。楽観的でかつ問題意識を持つ姿勢です。
楽観的にするためには、『不断の改善』を躾として行動に染みつけます。
継続させる為に、皆さんの現場の**理想的な姿**（これは、やっても、やっても到達出来ないような、崇高なレベルで思い描きます）を現場メンバ全員で掲げます、次に現状とのギャップから、数ヶ月（3カ月程度が望ましい）で達成できる**目標（マイルストーン）**を決めます。
マイルストーンが決まれば、それに**効果を期待できる日々の行動**を考え実施して適宜マイルストーンへ向かって進化しているか確認をして改善を進めて行きます。
なかなか、マイルストーンへ近づいていなければ、日々の行動を考え直して実施する。マイルストーンを変更する、といった変更を行い成長できる体質を現場チームに醸成します。
このマイルストーンには、活動**初段ではチームビルディン的要素**を入れるのをお勧めします。チームビルディンが出来ていない現場では、活動の礎が無いと等しいので、何をやっても上手くいきません。
チームビルディンが出来てきたら、徐々に**マイルストーンに業務や仕事の内容**を入れていきます。業務や仕事の内容もいきなり難しいテーマを入れると、成長が進まず、その結果、活動止まってしまいます。容易にできる内容から始めて、徐々にレベルを上げていくことをお勧めします。**活動中に迷走し、各メンバのモチベーションが下がってきたら、その真因をみつけて、マイルストーン、日々の行動を変える**ことです。この時に一見レベルダウンしたようなマイルストーンを立てても構いません。全員でモチベーション高く活動できる状態へ復活できることが最優先なのです。
崇高な理想を掲げ、そこへのマイルストーンを立て、そのマイルストーンへ向かって日々改善活動を行う。これが『不断の改善』を会得・躾となる為のプロセスなのです。
SMBv1 の NAS に Windows10 をつなげる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/ffd63cf1-334e-e3df-d445-78fa79bd42d5.png)

Windows10  Version1709 以降では SMBv1 はデフォルトでOFFになっているが、SMBv1 しか対応していない昔の NAS に接続したい。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/082134d1-40a7-e008-517a-33aaf9ba7b7a.png)

設定画面を出して、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/25d4f2f1-d62f-ce13-2b26-96340de605e6.png)

「アプリと機能」から

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/f02f54cb-30fc-da2f-ab83-25890f121a85.png)

オプソション機能の

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/57c17f1a-1eb2-29c9-ac1e-64d54ef43732.png)

「Windowsの機能」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/f8191a1e-81de-7e52-dafb-868b9e5ce5bd.png)

の「SMB 1.0/CIFS クライアント」をONにする。

SMBv1 はセキュリティ的に脆弱であるので必要がなくなれば再び OFF にするべき。
DOMツリーが小さくなるとページの読込時間が短くなるって本当？

# はじめに
DOMツリーを小さい（階層が浅いと言った方が正しい？）ことで、ページの読込時間が短縮されるのか検証します。

# DOMツリーとは
例えば、以下のようなhtmlがあったとすると、

```html
<!DOCTYPE html>
<html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>Page Title</title>
      <link rel="stylesheet" href="./main.css">
    </head>
    <body>
      <div>
        <p>Message...</p>
      </div>
    </body>
</html>
```

1階層：html
2階層：head, body
3階層：meta, title, link, div
4階層：p
となります。

階層が浅いDOMツリーであればあるほどブラウザによるDOMの読込が早くなると言われています。

# 比較対象
どれくらい違うのか階層が深いページと浅いページを比較してみたいと思います。



```html:階層が深いhtml
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Mariana Trench</title>
</head>
<body>
    <div><p>Message..</p><p>Message..</p><p>Message..</p><p>Message..</p><p>Message..</p>
    <div><p>Message..</p><p>Message..</p><p>Message..</p><p>Message..</p><p>Message..</p>
    <div><p>Message..</p><p>Message..</p><p>Message..</p><p>Message..</p><p>Message..</p>
    // ：
    // divの中にpを5つ、さらにdivの中にpを5つ、、を1000回繰り返す
    // ：
    </div>
    </div>
    </div>
</body>
</html>
```


```html:階層が浅いhtml
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Puddle</title>
</head>
<body>
    <div><p>Message..</p><p>Message..</p><p>Message..</p><p>Message..</p><p>Message..</p></div>
    <div><p>Message..</p><p>Message..</p><p>Message..</p><p>Message..</p><p>Message..</p></div>
    <div><p>Message..</p><p>Message..</p><p>Message..</p><p>Message..</p><p>Message..</p></div>
    // ：
    // divの中にpを5つ入れて閉じる、、を1000回繰り返す
    // ：
    <div><p>Message..</p><p>Message..</p><p>Message..</p><p>Message..</p><p>Message..</p></div>
    <div><p>Message..</p><p>Message..</p><p>Message..</p><p>Message..</p><p>Message..</p></div>
    <div><p>Message..</p><p>Message..</p><p>Message..</p><p>Message..</p><p>Message..</p></div>
</body>
</html>
```

DOMツリーを比較するとこんな感じ・・

![image55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122485/76b78d35-87f1-8749-dd16-4098346f59f8.png)

# 比較結果
DOMツリーの読込に要した時間は、[DOMContentLoaded](https://developer.mozilla.org/ja/docs/Web/API/Window/DOMContentLoaded_event)で表されます。
DOMContentLoadedは開発者ツールのNetworkで確認できます。

![image56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122485/0669fdf5-162a-fb46-331d-ac0002aa8ef0.png)

上が階層が深いhtml、下が階層が浅いhtml。
100ミリ秒程度の違いは体感的にごくわずかですが、階層の浅い方が読込時間が短いことがわかります。

通常のシステム開発の中で1000階層も深くすることはないと思いますが、
フロントエンドを担当する際はDOMツリーの構成を意識しておくと良いかもしれませんね。
WPF+ReactivePropertyでのViewModelの初期化処理

**ViewModelのコンストラクタでデータベースとかWEBサービスにアクセスしたくない**

コンストラクタであんまり重い処理を実行したくない。例外出ても嫌だ。ダイアログでIntaractinNotificationでパラメータもらってデータベースにアクセスしてモデルを更新するとか、コンストラクタ終わったあとなんじゃ？ってわけで。

## View

Interaction.Triggers に Loadedイベントに反応するトリガーを記述する。

```xml
<Window>
  <i:Interaction.Triggers>
    <i:EventTrigger EventName="Loaded">
      <i:InvokeCommandAction Command="{Binding LoadedCommand}"/>
    </i:EventTrigger>
  </i:Interaction.Triggers>
</Window>
```

## ViewModel

Loaded イベントに反応するコマンドを記述して、イベント処理内でデータベース処理とかする

```csharp
public class FooViewModel : BindableBase
{
    private FooModel _model {get; set;}
    public ReactiveCommand LoadedCommand { get; set; } = new ReactiveCommand();
    public ReactiveProperty<string> Name {get; set;}
    public FooViewModel
    {
        // イベントに反応する
        LoadedCommand.Subscribe(OnLoaded);
    }
    public void OnLoaded()
    {
        // ここでデータベース処理とか
        using(var db = new AppDbContext())
        {
            _model = db.Foos.FirstOrDefault();
        }
        Name = _model.ObserveProperty(x => x.Name).ToReactiveProperty();
        // プロパティ変更通知しないと新しいReactivePropertyが機能しない
        RaisePropertyChanged(null);
    }
}
```

Prismを使っているので BindableBaseを利用し、変更通知にRaisePropertyChangedを使う。
Prismでなければ INotifyPropertyChangedの実装を直接使ったり、他の方法を使う。

## その他

`RaisePropertyChanged(null)` の代わりに `RaisePropertyChanged()` (引数なし)を使ってもViewは更新されない。何故だろう。
複数のファイルを並行に取得して読込速度を改善する

# はじめに
`<link rel="preload">` を使用することでブラウザに対して早期にファイル取得を促し、読込時間を短縮させることができます。

# preload
[preload](https://developer.mozilla.org/ja/docs/Web/HTML/Preloading_content)は、ブラウザのレンダリング機構が起動するよりも早く、ファイルの読込を開始させたい場合に使用します。

# 改善前
開発者ツールのNetworkからファイルを読み込むタイミングを確認します。

![image52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122485/0497bae7-4ab5-e750-8159-90f9dea7d8a6.png)

cssファイルが取得＆読み込まれた後に画像(webp)、Googleフォント(font)が取得されていることがわかります。
画像とフォントをcssファイルやjsファイルなどと並行して読み込むことができれば、ページの読込速度の改善が見込めそうです。

実装を見ると背景画像とフォントはcssファイルの中で読み込んでいます。

```html:index.html
<link rel="stylesheet" href="./main.css">
```

```css:main.css
@import url(https://fonts.googleapis.com/css?family=Roboto:900|Roboto+Mono:300,400,700); // Googleフォントの読込
background-image-container {
  background-size:cover;
  background-repeat:no-repeat;
  background-position:top;
  background-image: url('./assets/images/space.webp') // 背景画像の読込
}
```

この場合、背景画像とフォントはcssファイルが完全にダウンロードされた後、上から順にcssが解析されていく途中で取得されることになります。

# 改善後
では、背景画像とフォントを並行して読み込ませるために、headタグ内に `<link rel="preload">` を実装します。


```html:index.html
<link rel="preload" href="./assets/images/space.webp" as="image">
<link rel="preload" href="https://fonts.gstatic.com/robotomono.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:900|Roboto+Mono:300,400,700">
<link rel="stylesheet" href="./main.css">
```

![image51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122485/bde4a4c7-deb9-4a59-0f5e-648039a01cb3.png)

cssファイルとwebp、font の読込が並列になっていることがわかります。

結果、背景画像をいち早く画面に表示させ、文字にもいち早くフォントを当てることができます。

# 注意点
１つ注意点としては、オリジンを跨いでファイルを取得する場合は
`crossorigin` 属性を付与しておく必要があります。

通常、Webサーバには[同一オリジンポリシー](https://developer.mozilla.org/ja/docs/Web/Security/Same-origin_policy)があり、オリジンを跨いだアクセスは制限がかかります。
`crossorigin` 属性はオリジンを跨いだアクセスを許可する際に付与します。
未使用のjavascript、cssのコードを特定する

# はじめに
開発が進むにつれ、jsファイルやcssファイルは何かとファイルサイズが膨れます。
というのも過去に参照されていたが現在は使用されていないデッドコードが生まれがちだからです。

未使用のコードを削除することでファイルサイズが小さくなり読込速度の改善したり、保守性がアップが見込めます。

# 手順
ブラウザの開発者ツールを利用することで、どのコードが実行されていないか簡単に調べることができます。

1.  開発者ツールを開く（WindowsならCtrl＋Shift＋I、MacならCommand＋Option＋I）
2. 縦の3点リーダ を選択
3. More tools を選択
4. Coverage を選択
5. ページを再読み込み

![image48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122485/8ca1b4d9-4eac-7a49-c3c7-8a4cd8f08ffd.png)

CoverageからJSやCSSのコードの使用率がわかります。

![image46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122485/7d7f7e9a-41f4-b3f9-b179-26874fc5f446.png)

赤いラインで表示されているコードが未使用のコードになります。
ただし、未使用だからと言って不要なコードとは限りません。

 - if/else の判定により片方だけ実行されるコード
 - エラーが発生した時に実行されるコード
 - 特定の操作をした際に実行されるコード
 - 特定の端末で表示した際に実行されるコード

など、未使用となった理由や背景を見極めた上でコードを削除しましょう。
FreeBSDでLogicool MX Master 3を使う

#きっかけ
マウスにより腱鞘炎になりつつあるので、思い切ってマウスを変更することにした。買ったのは、[Logicool MX Master 3](https://www.logicool.co.jp/ja-jp/products/mice/mx-master-3.910-005707.html)。
#FreeBSDで使えるか？
多機能なのだが、FreeBSDで使えるかどうかが問題である。私は普段の仕事もFreeBSDで、デスクトップ環境としてXfceを利用している。LibreOfficeのおかげで、だいたい人とのファイルのやり取りなどもどうにかなる。

調べてみると、LinuxにはSolaarというソフトウェアがある。portsを検索してみると、[sysutils/solaar](https://www.freshports.org/sysutils/solaar) がある！

#Solaarのインストール
早速インストールしてみるが認識しない。

MX Master 3は新しいため、FreeBSDのportsにあるSolaar 1.0.1では認識しない。そこで、[SolaarのGithub](https://github.com/pwr-Solaar/Solaar)を見てみると、1.0.2では対応しているようだ。
##Solaarのportsを書き換える
1. `cd /usr/ports/sysutils/solaar`
1. Makefileを書き換える。`PORTVERSION=1.0.1` -> `PORTVERSION=1.0.2`
1. `make makesum` をして distinfo を更新する。
1. `make install`

動かしてみるがエラーが出て起動しない。
##Solaar 1.0.2へのパッチ
エラーを見ると、`udev.py`に問題があるらしい。調べてみると、FreeBSD には udev がないので、USB HIDの情報は`comms/hidapi`から得て読み込むようになっていた。このため、独自の`udev.py`を`sysutils/solaar/files/hidapi.py`として用意し、`udev.py`へ上書きコピーしている。

Solaar 1.0.2 で`udev.py`の中の関数 enumerate の引数が変更されていることが原因らしい。そこで、`sysutils/solaar/files/hidapi.py`の enumerate 関数の中を以下のようにした。

```Diff:hidapi.py
--- hidapi.py.orig  2018-01-23 07:14:45.328006000 +0900
+++ hidapi.py   2020-07-16 13:06:12.037575000 +0900
@@ -111,7 +111,10 @@
 def monitor_glib(callback, *device_filters):
        pass

-def enumerate(vendor_id=None, product_id=None, interface_number=None, hid_driver=None):
+def enumerate(usb_id):
+       vendor_id  = usb_id.get('vendor_id')
+       product_id = usb_id.get('product_id')
+       interface_number = usb_id.get('usb_interface')
        devices = _native.hid_enumerate(vendor_id, product_id)
        d = devices
        while d:
```

これで、コンパイルし直すと、MX Master 3を認識するようになった。
##Solaar 1.0.3へアップデート
しばらくして、Solaar 1.0.3がリリースされたのでアップデートしたら、さらにいろいろな機能の調整ができるようになっていた。ついでに、日本語化も行った。portsを以下に置いてあるので、興味のある人はどうぞ。

https://github.com/kdeguchi/ports/tree/master/sysutils/solaar
やばい、これはやばい。Github CodespacesとSync Settingsに無限の夢しか見られない

ブラウザ上でVisual Studio Codeを開く、「Visual Studio Codespaces」もしくは「GitHub Codespaces」というのが存在することはご存じの方も多いかと思います。

このうち、Visual Studio側がGithub側に統合されることが発表されました。

- [マイクロソフト、WebIDEの「Visual Studio Codespaces」を「GitHub Codespaces」に統合へ](https://www.publickey1.jp/blog/20/webidevisual_studio_codespaecsgithub_codespaces.html)

Githubには現在プレビューで、Githubのリポジトリから直接Codespacesを開く機能が提供されています。

ニュースを見て試しに開いてみて、目が飛び出し鼻血が噴き出すほど驚き興奮しました。実際にみてみてください。

![Github Codespaces.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99262/1452956c-7fc4-6b67-7755-18a06a79785e.gif)

この動画は初期のコンテナ生成をだいぶ短縮してあることに注意してください。

先日、[Visual Studio Codeの公式のクラウド同期設定がリリース](https://qiita.com/Nuits/items/6204a6b0576b7a4e37ea)されました。

これの本当の意味をやっと今理解しました。

はじめて利用する（もしくはちょっと覗きたい）リポジトリを、ローカルにクローンすることもなく、ダイレクトに「いつも自分が利用している環境で」ひらける。

これはやばい。

Codespaces自体は有償のサービスで、今すぐにこれに置き換わる未来がやってくるとは限りませんが、そのうち「開発のための高性能なPC」なんて買う必要はなく、手元にはブラウザとディスプレイ・マウス・キーボードだけあれば良い時代が来るのかもしれませんね。

ひさしぶりに純粋に技術にワクワクしました。
UbuntuServerにgdm3の環境を構築したら自動サスペンドするようになってしまった

ハマったので自分用メモ

```Shell
$ sudo -u gdm dbus-launch gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-timeout 0
$ sudo -u gdm dbus-launch gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-type 'nothing'
```

変更した設定を確認するには

```Shell
$ sudo -H -u gdm dbus-launch --exit-with-session gsettings list-recursively org.gnome.settings-daemon.plugins.power
No protocol specified
org.gnome.settings-daemon.plugins.power lid-close-ac-action 'suspend'
org.gnome.settings-daemon.plugins.power time-critical 300
org.gnome.settings-daemon.plugins.power power-button-action 'suspend'
org.gnome.settings-daemon.plugins.power lid-close-suspend-with-external-monitor false
org.gnome.settings-daemon.plugins.power button-hibernate 'hibernate'
org.gnome.settings-daemon.plugins.power idle-dim true
org.gnome.settings-daemon.plugins.power button-power 'suspend'
org.gnome.settings-daemon.plugins.power lid-close-battery-action 'suspend'
org.gnome.settings-daemon.plugins.power priority 0
org.gnome.settings-daemon.plugins.power idle-brightness 30
org.gnome.settings-daemon.plugins.power active true
org.gnome.settings-daemon.plugins.power critical-battery-action 'hibernate'
org.gnome.settings-daemon.plugins.power button-suspend 'suspend'
org.gnome.settings-daemon.plugins.power button-sleep 'hibernate'
org.gnome.settings-daemon.plugins.power percentage-critical 3
org.gnome.settings-daemon.plugins.power sleep-inactive-ac-timeout 0
org.gnome.settings-daemon.plugins.power sleep-inactive-ac-type 'nothing'
org.gnome.settings-daemon.plugins.power ambient-enabled true
org.gnome.settings-daemon.plugins.power notify-perhaps-recall true
org.gnome.settings-daemon.plugins.power percentage-low 10
org.gnome.settings-daemon.plugins.power percentage-action 2
org.gnome.settings-daemon.plugins.power sleep-inactive-battery-type 'suspend'
org.gnome.settings-daemon.plugins.power time-low 1200
org.gnome.settings-daemon.plugins.power sleep-inactive-battery-timeout 1200
org.gnome.settings-daemon.plugins.power time-action 120
org.gnome.settings-daemon.plugins.power use-time-for-policy true
```
【TypeScript】エラー：This expression is not constructable でハマった話。 

#概要
以前、PHPで作成した簡単なフレームワークをTypeScriptで書き直したら面白いんじゃない？と思って、書き始めたら、爆速でハマってしまいました。

やりたかったのは、コアな機能毎にtsファイルを分けて書いて、それをbarrelを使って、メインファイル（index.ts）に一気にimportを決める！というシンプルな事だったのですが・・。

#構成
○ ディレクトリ構造（※抜粋）
　[ app ]
　　L [ lib ]
 　　　L Core.ts 
　　　L Controller.ts
　　　L Database.ts
　　L bootstrap.ts
　　L index.ts

``` Core.ts
// 他のクラスは割愛
export class Core {
    name: string
    constructor(name: string) {
        this.name = name
    }
}
```

``` bootstrap.ts
export { Core } from './lib/Core'
export { Controller } from './lib/Controller'
export { Database } from './lib/Database'

/*
　　ダメだったコード：
    export * as Core from './lib/Core'
    export * as Controller from './lib/Controller'
    export * as Database from './lib/Database'
*/
```

``` index.ts
import { Controller, Core, Database } from './bootstrap'

class Hoge {
    constructor() {
        let core = new Core('テキストテキスト')
        console.log(core.name)

        /*
          ダメだったコードはこれでクラスにアクセスできる：
　　　　　 let core: Core.Core = new Core.Core('テキストテキスト')
        */
    }
}
```

#結論

要するに、exportする際に、＊だと一段深くなるようでした。今回はclassが一つしか無かったですが、＊というくらいなので、場合によってはたくさんあります。
考えてみたら、当たり前ですね・・。
Laravel5.5でメール送信ができないよ？

さくらインターネットのレンタルサーバーで、稼働中の Laravel5.5 で作成したサービスが特定のページで突如エラー。
エラーログをたどっていくと、どうやらメール関連でエラーが...

```
Trying to access array offset on value of type null in /project/vendor/egulias/email-validator/EmailValidator/Parser/Parser.php
```

だがどうして突然・・・気づいたらレンタルサーバーのPHPが7.4に上がってた。
これが原因か。
~~じゃぁPHPを7.3固定で！~~

egulias/email-validator のバージョンが 2.1.3 だったが composer update で 2.1.20 になった事で
解決できた。

こんな状況に遭遇する人少なそうだけど...
useRefをTypeScriptで使うと Object is possibly 'null'. と怒られる件の対策

TypeScript で useRef を使おうとすると初期値に null を渡していることもあり useEffect の中で Object is possibly 'null'. 怒られてしまう

個人的なケースとして、 hogehoge.current.scrollTo(0, 0) を要素に適用したかったのだがタイトルの通りとなった

```
Object is possibly 'null'.
```

1. useRefにDOMの型をつける
2. nullの場合の処理をいれる

上記ですぐに解決できた。

## 今回のサンプル
scrollTo()を使うサンプルです。

```sample.tsx
import React, { FC, useRef } from "react";
import "./styles.css";

const App: FC = () => {
  const refSample = useRef(null);
  const resetScroll = () => refSample.current.scrollTo(0, 0);

  return (
    <div ref={refSample} className="scroll">
      <div className="scroll__box">スクロールできます</div>
      <button onClick={resetScroll}>スクロールトップ</button>
    </div>
  );
};

export default App;

```
```style.css
.scroll {
  width: 300px;
  height: 100px;
  background-color: #e0e0e0;
  overflow-x: scroll;
}

.scroll__box {
  width: 300px;
  height: 500px;
  color: #fff;
  background-color: blue;
}

```
この状態ではタイトルのエラーが生じます。


## 1. useRefを使うタイミングで型をつける
 
```sample.tsx
  const refSample = useRef(null); //からの
  const refSample = useRef<HTMLDivElement>(null);
```
useRef を初期化するには null が一般的で、 null に対して HTMLDivElement の型付けを行う。
初期化された後にDOMの中で ref={sampleRef} として HTMLDivElement が sampleRef.current の中に格納されることとなる。
.current は useRef のデフォルトで決まっているプロパティのキーのこと。

しかしこれだけではまだエラーは消えない。

## 2. nullの場合の処理をいれる

TypeScriptの型推論として HTMLDivElement or null の可能性があるため、まだ怒られてしまう。

```sample.tsx
  const resetScroll = (): void => refSample.current.scrollTo(0, 0); //からの
  const resetScroll = (): void => refSample.current?.scrollTo(0, 0); 
``` 
そのため refSample.current?.hogehoge と ? を追加することで短いコードで null の可能性を表すことで怒られなくなる。

codesandbox: https://codesandbox.io/s/vigorous-bas-e3f5l?fontsize=14&hidenavigation=1&theme=dark
bigqueryから抽出したビッグデータを、csvでダウンロードするの面倒じゃない？

bigqueryでは、抽出したデータをcsvダウンロードすることができるが、
16,000行以上ある場合、一度、ストレージに格納してからダウンロードする必要がある。

今回は、それらを自動化する方法をクラウドシェルで実現・実装する。

個人メモ
※自動化ポイント１：テーブル名を指定する
※自動化ポイント２：ストレージのパスを指定する
※自動化ポイント３：csvのファイル名を指定する
※自動化ポイント４：utf8からsjisへの文字コード変換
※クラウドシェルは無料だよ！

```shell
#変数 --------------------------------------------------------
DATASET="sample_dataset" # BigQueryのデータセットを指定
BUCKET="gs://sample_bucket/sample_folder" # ストレージバケットを指定
TODAY=`date "+%Y%m%d_%H%M%S"`
OUTPUT=${HOME}"/output" # ホームディレクトリのフォルダを指定

#処理 --------------------------------------------------------
#テーブルリストを表示
echo テーブルリストは、下記です。
bq ls $DATASET |awk '{print $1}'
#入力
#※ここでテーブルを指定します。
echo -n ダウンロードするテーブル名を入力してください。:  
read INP
FILE=${INP}_${TODAY}
#GCSにエクスポート
bq extract ${DATASET}.${INP} ${BUCKET}/${FILE}
#VMにコピー
gsutil cp ${BUCKET}/${FILE} ${OUTPUT}/${FILE}
#UTF8からsjisに文字コード変換
iconv -f UTF8 -t SJIS ${OUTPUT}/${FILE} > ${OUTPUT}/${FILE}.csv
#ローカルPCへダウンロード
cloudshell dl ${OUTPUT}/${FILE}.csv
```
【Excel家計簿】ピボットテーブル_一部だけを小計したい

#1.はじめに
＃YoshiTech Round1 DAY3でサポート役のYさんがおすすめされていたこちらの本。
[『30時間でマスター　Excel2019』(実教出版)](https://www.amazon.co.jp/30%E6%99%82%E9%96%93%E3%81%A7%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC-Excel2019-%E5%AE%9F%E6%95%99%E5%87%BA%E7%89%88%E4%BC%81%E7%94%BB%E9%96%8B%E7%99%BA%E9%83%A8/dp/4407348372/ref=pd_lpo_14_t_1/357-0306587-2708477?_encoding=UTF8&pd_rd_i=4407348372&pd_rd_r=01d402b5-6830-4b9b-b534-2e4a5a10b3c1&pd_rd_w=i0hEB&pd_rd_wg=7FvFU&pf_rd_p=4b55d259-ebf0-4306-905a-7762d1b93740&pf_rd_r=HNR482MB4EXA3SSXDPBM&psc=1&refRID=HNR482MB4EXA3SSXDPBM)
やってみました。

この本の中でピボットテーブルを使ったクロス集計の方法が紹介されていました。

家計簿との相性が良さそうだったので、
早速、普段つけているExcel家計簿に使ってみました。
本の説明だと表全体の集計はできるのですが
任意の一部を小計する方法が書かれていなかったのでここにまとめたいと思います。


#2.前提条件
Excel2019を使用します。


#3.作業

やりたいこと＝↓赤枠の部分だけ小計したい。
<img width="300" alt="スクリーンショット (9)a.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/c22502ca-3cca-d37a-d471-9d7cd1984a30.png">

1）まず①の部分を選択し、分析タブの②「グループの選択」をクリックする。
 
<img width="300" alt="a.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/4381d86e-e736-ba82-1804-e9236f85ea2d.png">

2）すると下記のようにグループが作成される。
<img width="300" alt="b.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/15340470-a5a2-b78e-c79c-edef8ce8b12c.png">

3）「グループ1」となっているグループ名を「小計_主要費」に変更する。
<img width="300" alt="c.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/88b65420-7814-a87c-bf69-29c895902028.png">

以上！


#おわりに
ピボットテーブル。
Excel画面でその字面を見てはいたものの、使ったことはありませんでした。
「+」「-」で項目をまとめられるので、データが見やすく、且つ扱いやすくなり、とても便利でした。グラフ含めまだまだ設定をしたい部分があるので、引き続きいじっていきたいと思います。

####今後やりたいこと
① クレジットカード明細のCSVデータをもとに、自動で費目振り分けをして家計簿に反映させる
② 紙の給与明細を文字認識して、家計簿に反映させる (控除分の明細を記録しておきたい)

①はVBAで実現できそうです。②はどうでしょう…。方法もまだ見えていません。
とにかく、次はVBAを学んでみようと思います！

#参考
・書籍[『30時間でマスター　Excel2019』(実教出版)](https://www.amazon.co.jp/30%E6%99%82%E9%96%93%E3%81%A7%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC-Excel2019-%E5%AE%9F%E6%95%99%E5%87%BA%E7%89%88%E4%BC%81%E7%94%BB%E9%96%8B%E7%99%BA%E9%83%A8/dp/4407348372/ref=pd_lpo_14_t_1/357-0306587-2708477?_encoding=UTF8&pd_rd_i=4407348372&pd_rd_r=01d402b5-6830-4b9b-b534-2e4a5a10b3c1&pd_rd_w=i0hEB&pd_rd_wg=7FvFU&pf_rd_p=4b55d259-ebf0-4306-905a-7762d1b93740&pf_rd_r=HNR482MB4EXA3SSXDPBM&psc=1&refRID=HNR482MB4EXA3SSXDPBM)
・Qiitaに投稿する画像の大きさ調整方法→[Qiita(28)画像の大きさ調整](https://qiita.com/kaizen_nagoya/items/cef6ae1fcbdbec9e7be2)
備忘録　VS CodeとHTMLとCSSの使い方リンク集

##前提

HTMLやCSSを始める前にVS Codeをマスターするのが最優先



#おすすめリンク


##VS Code 

［Ctrl］＋［Shift］＋［@］キーを押すとVS 
Codeの下部のパネルにターミナルウィンドウが開く

Ctrl+Shift+Pキーを押すとコマンドパレットを開く

Ctrl+Pキーを押すとファイルを検索して開く

####ショートカット集
[キーボードから手を離さずにVS Codeで開発したいという気持ちを大切にしています](https://insider.10bace.com/2019/02/22/vs-code%E3%81%A8%E3%81%8B%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%81%AE%E3%81%AF%E3%81%AA%E3%81%97/)


####VS Codeについてはこちらの動画でさっと勉強するのが良いかな
[Visual Studio Code入門 #01：環境設定と、VSCodeの起動方法いろいろ](https://www.youtube.com/watch?v=e3DmHK2PDGA)
####Emmetめちゃ大事！これないとHTMLとCSSいまだにかけないかも(というかやりたくない)笑

以下も結構まとまってる
[Visual Studio Codeのうれしい機能を使いこなして、初心者を最速で脱出する！《VSCode実践入門》](https://employment.en-japan.com/engineerhub/entry/2019/06/21/103000#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%B9%E3%83%8B%E3%83%9A%E3%83%83%E3%83%88)

[HTMLとCSSをEmmetで書いてみる！：Visual Studio Code](https://mmorley.hatenablog.com/entry/2016/10/15/221750)


####VS Codeのショートカットがまとまってる！コード書く前にこっちをやる！

[【Mac版】 VisualStudioCode キーボードショートカット](https://qiita.com/naru0504/items/99495c4482cd158ddca8)

####拡張機能大事！これないと無理ゲー!

[フロントエンジニア必須の拡張機能7選](https://ics.media/entry/18544/)

[VSCodeのオススメ拡張機能 24 選 (とTipsをいくつか)](https://qiita.com/sensuikan1973/items/74cf5383c02dbcd82234)

####デバッグできるようにならないとどこでNGかわからん(これはRubyとかJSのためだけど)。
Rails用で場違いですが。。VS Codeの使用方法として。。

[Visual Studio CodeによるRubyのデバッグ](https://dev.classmethod.jp/articles/visual-studio-code-ruby-debug/)


####VS Codeの操作方法が一通りまとまってる
[VSCode初心者のための、絶対覚えておきたい便利機能まとめ](https://homupedia.com/editor-vscode-features.html#:~:text=%E4%BE%8B%E3%81%88%E3%81%B0%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%86%85%E3%81%AE%E5%90%8C%E3%81%98,%E9%81%B8%E6%8A%9E%E7%AF%84%E5%9B%B2%E3%82%92%E4%BD%9C%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82)

####インデントについて
[Visual Studio Codeのインデントサイズが望みのものにならない時に見るべき箇所](https://one-it-thing.com/1575/#i)

##HTML

####このサイトみて主要なものをひたすらググってVS Codeで試す！

[HTML5の主要タグ一覧](http://www.shurey.com/html/maintags5.html)

####idとclassの違い
[HTMLのdiv classとは？５分でわかる事例付き解説](https://udemy.benesse.co.jp/development/web/html-div-class.html)

####idとnameの違い
[input typeタグで、idとnameは同じ名前にしなければいけないの？](https://www.web-officer.com/html-css/in-the-input-type-tag-do-i-have-to-make-id-and-name-attributes-the-same-name.html#:~:text=%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82id%E3%81%A8name%E3%81%A7%E3%81%AF,%E3%81%A6%E3%82%82%E6%A7%8B%E3%81%84%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82)
##CSS

####MarginとかPaddingとかの理解
これはChromeで検証ツールで試行錯誤するしかない！
見れば一髪！


####CSSのwidthとheighの関係性がとても分かりやすかった。

[CSSのwidth（幅）とheight（高さ）の指定方法をマスターしよう](https://saruwakakun.com/html-css/basic/width-height)



####CSSのdhisplayの概念がとても分かりやすくまとまっていた。

[【CSS】displayの使い方を総まとめ！inlineやblockの違いは？](https://saruwakakun.com/html-css/basic/display)

####画面分割の方法
[CSS入門：「display: table」を使って要素を横に並べる方法](https://proengineer.internous.co.jp/content/columnfeature/6190)

##おわりに
自分で書きたくないのでメモとしてリンクを貼った。良いサイトがあれば追記していこうと思う。
vectorのsize()の型の注意！！！

競プロをしていて、

```cpp
vector<int> v;
int ans;
//処理
ans=max(v.size(),ans); //error🥺🥺🥺
```

の様に書いたらコンパイラに怒られたので備忘録として。(<strike>初心者がバレる</strike>)

どうやら <strike><strong>v.size()</strong>は<strong>unsigned long型</strong>らしい。</strike>
<b>(補足:コメントで、戻り値の型は処理系依存であるとのご指摘をいただきました。)</b>
max()の第一引数と第二引数の型が違うと怒られてしまった。

```cpp
ans=max((int)v.size(),ans); //error🥺🥺🥺
```
の様にキャストして書きましょう！<b>(あくまでも競プロでのお話です)</b>
、、、というお話。
【PowerShell】配列内の文字列を検索する個人的メモ

#配列内の空文字列を除外したい。
テキストのフィルタリングをできるだけ軽くしたい。
パイプラインでWhere-ObjectやSelect-Objectを使用すると非常に遅くなる。
なので、できるだけパイプラインを使用しない形で配列内の空文字列を除外したい。
#現状で思いつく最適解。
```powershell
# 配列の要素が空文字であるインデックス番号を配列として取得する
[Array]$text = @("aaa","aaa","","aaa","aaa","","aaa","","d","")
[Array]$text2 = @("aaa","aaa","","","aaa","","aaa","","d","")
[Array]$ArrayList = @( $text, $text2 )

# 空文字列のインデックス番号を取得する。
[int[]]$NullStringIndexList = @()
for($i=0; $i -lt $ArrayList.Length; $i++){
    [int]$index = -1
    while($TRUE){
        $index = [Array]::IndexOf($ArrayList[$i], "", $index + 1)
        if($index -ne "-1"){
            $NullStringIndexList += $index
        } else {
            break
        }
    }
}
$NullStringIndexList = $NullStringIndexList | Sort-Object -Unique

#空文字列でないインデックス番号を取得。$IndexListへ格納する。 
[int[]]$IndexList = 0..($ArrayList[0].Length -1)
$NullStringIndexList.ForEach({ $IndexList = $IndexList -ne $_ })
```
railsアプリで simple calendar を使ったページにて、undefined local variable or method `block' for 

#環境
```
ruby 2.5.1
rails 5.2.4

gem 'simple_calendar', '~> 2.0'
```

# 背景
1. Docker+ CircleCiを導入し、ローカルでCircleCIによるrspecが正しく機能するかテスト
2. 以前にはなかった箇所でrspecがfalseになる
3. simple-calendarを使ったページにて、エラーが発生していた


```
ActionView::Template::Error - undefined local variable or method `block' for #<#<Class:0x00007ffddca4a6a0>:0x00007ffddc568d58>:
  app/views/simple_calendar/_month_calendar.html.erb:25:in `view template'
  app/views/application/_calendar.html.erb:1:in `_app_views_application__calendar_html_erb___1293910406710393037_70364149977560'
  app/views/events/index.html.erb:4:in `_app_views_events_index_html_erb___316186926983959569_70364150058740'

```

```_month_calendar.html.erb
    <% week.each do |day| %>
            <%= content_tag :td, class: calendar.td_classes_for(day) do %>
              <% if defined?(Haml) && respond_to?(:block_is_haml?) && block_is_haml?(block) %>
                <% capture_haml(day, sorted_events.fetch(day, []), &block) %>
              <% else %>
                <% block.call day, sorted_events.fetch(day, []) %> #この行にある"block"が定義されていないらしい
              <% end %>
            <% end %>
          <% end %>
        </tr>
      <% end %>
```

#試したこと
1.以下のsimle calenderのviewを生成するコマンドで初期のhtmlを作成

```
rails g simple_calendar:views
```
2.カスタマイズしていたhtmlを初期のhtmlに置き換える
3.正常にカレンダーが表示された

#結論
HTMLの記述が違っていた。
"block" ではなく、 "passed_block" にしなければならない

```_month_calendar.html
#エラーが出たhtml
<% block.call day, sorted_events.fetch(day, []) %>


# 正常に動作するhtml
<% passed_block.call day, sorted_events.fetch(day, []) %>
```
"passed_"の部分を間違って消してしまったのか？？？
githubで過去に正常に動いていた時のバージョンを調べても、"block" と記載となっていたのだが、、、
simple calendar側で変更があったのだろうか？

#simple calendar 側で view の一部に変更があった

simple calendarのgithubを調べたところ、最新の変更にて"block"から"passed_block" になっていた。
[simple calendarのgithub](https://github.com/excid3/simple_calendar/commit/77ca99e146477d4c37d2db23786121b473d4f3df#diff-449dbc51b04e54ec54788690c1590fae #)

```app/views/simple_calendar/_month_calendar.html.erb
        <tr>
          <% week.each do |day| %>
            <%= content_tag :td, class: calendar.td_classes_for(day) do %>
 -            <% if defined?(Haml) && respond_to?(:block_is_haml?) && block_is_haml?(block) %>
 -              <% capture_haml(day, sorted_events.fetch(day, []), &block) %>
 +             <% if defined?(Haml) && respond_to?(:block_is_haml?) && block_is_haml?(passed_block) %>
 +              <% capture_haml(day, sorted_events.fetch(day, []), &passed_block) %>
              <% else %>
 -              <% block.call day, sorted_events.fetch(day, []) %> #　削除された
 +              <% passed_block.call day, sorted_events.fetch(day, []) %>　# 追加された
              <% end %>
            <% end %>
          <% end %>
```

こういったgem側の変更によって、自分のアプリに影響が及ぶケースは, "impressionist"と言うgemでのエラーで経験していたので、
そんなに詰まることなく、原因究明できました。
VirtualBoxでホスト側(windows)とゲスト側(CentOS7)で共有する方法

## VirtualBoxでホスト側(windows)とゲスト側(CentOS7)で共有する方法

- 共有フォルダ

```
VirtualBoxで
- ホスト(windows)側
- ゲスト(CentOS7)側
で、フォルダーを共有する方法があります。
```

## Guest Additionsをインストール

- ライブラリのインストール

```sh
# yum update
# yum install gcc make bzip2 kernel-devel
```

- Virtualboxの画面で
	- デバイス > Guest Additions CDイメージの挿入 を選択

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/cad53c6c-aead-5a4c-f395-f11c1a4c194f.png)


- CDイメージのマウント

```sh
# mount /dev/cdrom /mnt/
mount: /dev/sr0 is write-protected, mounting read-only
# cd /mnt
# ./VBoxLinuxAdditions.run
# shutdown -h now
```

## VirtualBoxで共有設定を行う

- ホスト側で共有するフォルダの作成

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/8d6cecfa-cc2d-2b4f-1a11-8eb9e19b4b3b.png)

- 共有フォルダーの設定

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/72d2dfab-e056-b9be-f927-ed6f3f331eee.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/147d0dbb-e6cb-9c0f-45e9-226885cc3704.png)

1. 設定に移動
2. 共有フォルダーに移動
3. 右にあるフォルダーの+キーをクリック
4. 「共有フォルダーの追加」に設定を記載
    - フォルダーのパス : C:\home_dir
    - フォルダー名 : 自動で入る
    - 自動マウントにチェック
    - マウントポイント : /mnt/home_dir
5. サーバを起動させる

## ゲスト側で確認

- home_dirディレクトリの確認

```sh
# ls -l /mnt/
合計 0
drwxr-x---. 2 root root 6  9月  1 21:33 home_dir
```

## 共有の確認

- [ホスト側]ファイル作成(test.txt)

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/8d75229a-106f-013a-bfed-d0d0cd08c086.png)

- [ゲスト側]ファイル確認(test.txt)

```
# ll /mnt/home_dir/
合計 0
-rwxrwx---. 1 root vboxsf 0  9月  1 22:03 test.txt
```

- [ゲスト側]ファイルの作成(test1.txt)

```sh
# touch /mnt/home_dir/test.txt
# ll /mnt/home_dir/
-rw-r--r--. 1 root root 0  9月  1 21:54 /mnt/home_dir/test.txt
```

- [ホスト側]ファイル確認(test1.txt)

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/259226c8-fa79-f932-1486-d145a1ad0aa2.png)

## 参考

- [VirtualBox 共有フォルダー設定 - ホストとゲスト間でフォルダーを共有](https://pc-karuma.net/virtualbox-folder-share/)
rsyncをパスワード入力なしで実行する方法

# 概要
Linux系OSでバックアップを行う際、rsyncをよく使用するが、rsyncを実行する際、デフォルトではSSHパスワード入力が必須となる。
その為、cron等で実行が出来ないため、rsyncをパスワード入力なしで実行する方法を下記に記載する。

## 前提環境
- Ubuntu 18.04

## 結論
- 下記の通り、コマンドを実行
    - `sshpass -p "{パスワード}" rsync -ahv --delete --progress {送信元ユーザ}@{送信元ホスト}:{送信元パス} {送信先パス}`

## 作業前準備
- `apt install sshpass`

## 注意事項
- パスワードを平文で記載する為、セキュリティとはトレードオフ。
    - 実行可否についてはセキュリティ要件と相談すること。

### 参考資料
- [パスワードを要求せずに、公開鍵認証を使用せずにrsyncするにはどうすればよいですか？](https://qastack.jp/unix/111526/how-can-i-rsync-without-prompt-for-password-without-using-public-key-authentica)
[Laravel] Facade作成の流れ

#今回の題
Facadeの作成方法を復習がてらメモとして書き残します。

#バージョン
Laravel6.8

#大まかな流れ
1. クラスの作成
2. サービスプロバイダーを通し、クラスをサービスコンテナへ登録
3. Facadeを作成し呼び出す


##クラスの作成
クラスを配置するディレクトリの作成

```terminal
$ mkdir app/Services
```

``app/Services/``以下に``GreetingService.php``を作成し、クラスと適当なメソッドを定義。

```php
<?php
namespace App\Services;

class GreetingService {

  public function hello() 
  {
    return 'hello';
  }

}

```

##サービスプロバイダーを通し、クラスをサービスコンテナへ登録
自前のサービスプロバイダーを作成

```terminal
$ php artisan make:provider GreetingServiceProvider
```

上のコマンドで、``app/Providers/``以下に作成された``GreetingServiceProvider.php``を以下のように編集。

```php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class GreetingServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
      $this->app->bind('greeting', 'App\Services\GreetingService'); // 追記
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

```

###サービスプロバイダーを登録
``config\app.php``を開き、以下のように追記。

```php
    'providers' => [
        
        // 略
         
        /*
         * 自作のサービスプロバイダー
         */
        App\Providers\GreetingServiceProvider::class, // 追記
    ],
```


###サービコンテナに登録されたか確認する
サービコンテナの実体は、``Illuminate\Foundation\Applicationクラス``。
Illuminate\Foundation\Applicationクラスは、ヘルパ関数``app()``で呼び出せるので以下のようにして中身を確認。

```php
dd(app());
```

色々出てきた中の``bindings``を開いて、
![スクリーンショット 2020-09-06 23.26.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546124/2c451e0d-1a2a-8f1c-4fba-04d0d1435a7c.png)

さらに色々出てきた中に、先ほど登録した``greeting``があればOK。
![スクリーンショット 2020-09-06 23.29.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546124/020ca0e0-0f3e-8920-7d31-6f5583d4d7a7.png)


##Facadeを作成する
Facadeを配置するディレクトリを作成。

```terminal
$ mkdir app/Facades
```

``app\Facades``以下に``Greeting.php``を作成し以下のように編集。

```php
<?php
namespace App\Facades;

use Illuminate\Support\Facades\Facade;

class Greeting extends Facade
{

  protected static function getFacadeAccessor()
  {
    return 'greeting'; // サービスコンテナに登録した名前。
  }

}
```

###Facadeのエイリアスを登録
``config\app.php``を開き、以下のように追記。

```php
    'aliases' => [

        // 略

        /*
         * 自作のFacade
         */
        'Greeting' => App\Facades\Greeting::class, // 追記

    ],
```

###Facadeを呼び出す

```php
Greeting::hello(); // 結果 hello
```

コントローラーなどのnamespaceの中から使おうとする場合は
グローバルプレフィックス演算子``\``をつけてあげるか、
(namespace中からグローバルなクラスなどを使おうとする場合に必要。 [参考](https://www.php.net/manual/ja/language.namespaces.global.php))

```php
\Greeting::hello(); // 結果 hello
```
もしくは、

```php
use Greeting;

Greeting::hello(); // 結果 hello
```
でOK。
React Appを新規作成してHerokuにデプロイ

Reactで新規アプリを作成して、Herokuにデプロイするまでの手順をメモ。

## 環境

macOS Catalina 10.15.6

# Herokuの導入

せっかくなのでHerokuの導入から書きます

### Herokuをインストール

**brew**で **Heroku** をインストール

```
$ brew install heroku/brew/heroku
```

**Heroku** がインストールできたか確認

```
$ heroku --version
```

### Herokuのユーザ設定

**Heroku** にログインしてそれぞれ入力

```
$ heroku login
Enter your Heroku credentials:
Email: katsube@example.com
Password: ****************
Logged in as hogehoge@example.com
```

公式サイト https://devcenter.heroku.com/articles/heroku-cli
参考 https://blog.katsubemakito.net/macos/setup_heroku-cli
# React Appを作成

ReactでAppを新規作成するところから

### Node.jsをインストール

以下の公式サイトからインストーラをインストールして、ダウンロードを実行
公式サイト https://nodejs.org/ja/

### Yarnをインストール

**yarn** は **brew** でインストール（楽だから）

```
$ brew install yarn
```

### Reactアプリを新規作成

アプリの名前は **my-app** で新規作成

```
$ npx create-react-app my-app
& cd my-app
```

### Gitのステージングまであげる

```
$ git init.
$ git add .
$ git commit -m 'create: myapp'
```

### サーバーを起動

```
$ yarn start
```

以下にアクセス
http://localhost:3000/

参考 https://qiita.com/taskooh/items/f67d34f9f5c8eab08dc0

# Herokuにデプロイ

### Herokuにログイン

```
$ heroku login   // Enterを押す
```

### Herokuアプリ作成

```
$ heroku create
```

### Heroku buildpacks

```
$ heroku buildpacks:set https://github.com/mars/create-react-app-buildpack.git    
```

### デプロイ

```
$ git push heroku master
$ heroku open
```

以上です！

# 起きたエラーたち

### 画面が真っ白

![スクリーンショット 2020-09-07 0.31.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319526/c6b891b8-1ff3-b323-c955-660f76cb2c30.png)

原因: rootを設定していない
対策: rootを設定する

```package.json
  "homepage": "./"                  # 追加
```

### Two different lockfiles found: package-lock.json and yarn.lock

```
remote: -----> Build failed
remote:  !     Two different lockfiles found: package-lock.json and yarn.lock
```

原因: **package-lock.json** と **yarn.lock** が競合
対策: package-lock.jsonを削除してデプロイ

```
$ rm -rf package-lock.json
$ yarn install
$ git add yarn.lock
$ git commit -m "Updated Yarn lockfile"
$ git push heroku master
$ heroku open
```
Mac版 path_helperはどの様に動作すべきか？ （path_helper問題３）

## 過去、あるべきだった動作仕様

path_helperはどの様に動作すべきだったか？

(1) pathsの行を読み取り/use/local/binを先頭側にする
(2) paths.dのファイルの行を読み取りそれぞれを先頭側にする

「/usr/bin:/bin:/usr/sbin:/sbin」よりも(1) (2) は先頭に連結される。
（LinuxのPATH生成と同等の仕様）

## あるべき動作仕様をみたせば、ユーザーの手間が省けた。

あるべき動作仕様をみたせば、ユーザーの手間が省け path_helper が高く評価されていたかもしれない。
具体的には、次のような良い評価がエンジニアから言われたかもしれない。

(3)Mac版path_helperはpaths.dのファイルを読み取って高速にPATH生成する。
(4)ターミナルを使用するエンドユーザーはexport PATHを追加分だけ最低限に書けば良い。
（ホームディレクトリの.zshenv .bash_profileなど）

pathsやpaths.dのBSD系UNIXシステムを考案したエンジニアの考えと同じかは分からないが、筆者は調べていて上記のように考えた。読者に押し付けるつもりは無い。

## 今後の未来において、Mac版path_helper仕様はどうあるべきか？

昔のLinux、UNIXのディレクトリ構成は固定されていなかったらしい。
現代では殆ど固定され変更がなさそうだ。
(5)「path_helperのpathsを読み取りPATHに追加する」は廃止すべき。
替わりに、/etcファイルのどこかで
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
と一行だけ書けば高速動作すると思われる。（参考ubuntu , Sparky Linux）

(6)path_helperはpaths.dのファイルを読み取ってPATH生成することは残すべきだろう。

(7)検討や洗い出しを全くしておらず案だけを書く。
configure --prefixでディレクトリを決めた時に、
LDFLAGS、CPPFLAGS、PKG_CONFIG_PATHもディレクトリであることが殆どで各ソフトウェア毎に一つに決まることが多い。
「path_helperのpaths.dのファイルを読み取りPATHに追加する」
path_helperはLDFLAGS、CPPFLAGS、PKG_CONFIG_PATHもPATH生成できたほうがいい。
ユーザーがLDFLAGS、CPPFLAGS、PKG_CONFIG_PATH管理せずに済む。

(8)Linuxに近いことが望ましい。

筆者が調べた所、Mac版10.9のzshのvim（8.2.1471）からターミナルを呼び出すか又は（:terminal）とGNUscreen（4.08.00 05-Feb-20）は起動すると/etc/zshenvのPATH設定（/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin）だけを返す。unsetopt GLOBAL_RCS や setopt no_global_rcsの設定はコメントアウトした状態だ。
ホームディレクトリの .zshenv　.zshrc等々を読み込まず結果として「ユーザー追加のPATH設定を無視」してしまう。
ホームディレクトリの .zshenv　.zshrcのPATH設定を追加するにはsourceするか自分でPATH追加が必要だ。
これらはバグでは無いが、やや使いにくい。
クライアントだからこれで良いだろうが、サーバー側ではもっとlinux寄りか高度でないとダメだろう。

Linux版だと、vimとscreenの起動時のPATH設定値はホームディレクトリの.zprofile .zshenv .bash_profile .bashrc等「ユーザーが追加した最終的なPATH設定値と同じ」である。

以上、path_helper問題の記事、終了。
Swift で map, compactMap, flatMap を使いこなそう

今回は初学者向けに、Swift からプログラミング言語を学び始めた人が必ずいだく `map`・`compactMap`・`flatMap` の違いについて簡単に解説をしていきたいと思います。また、これらの関数は積極的に使っていくことで状況に応じた使い分けなどがうまくできるようになっていくので積極的に使っていきましょう！

### map

`map` は主に配列のデータを別の配列データに変換したい時などに使用する関数です。たとえば、整数の配列を文字列の配列として変換する時のサンプルコードは下記のようになります。`$0` でクロージャでの引数を参照することができます。クロージャーが分からない方は[こちら](https://techacademy.jp/magazine/14499)の記事を見ていただければ把握できるかと思います。

```swift
let numberList: [Int] = [1, 2, 3, 4, 5, 6]

let numberStringList: [String] = numberList.map { "\($0)" }

print(numberStringList) // ["1", "2", "3", "4", "5", "6"]
```

### compactMap

`compactMap` は配列のデータから `nil` を取り除きたい場合に使用する関数です。`nil` を含む配列から `nil` を取り除いた配列を取得するサンプルは次のようになります。

```swift
let optionalNumberList: [Int?] = [1, 2, nil, 4, 5, nil]

let numberList: [Int] = optionalNumberList.compactMap { $0 }

print(numberList) // [1, 2, 4, 5]
```

また、`compactMap` は配列で `nil` を取り除いてくれるので、配列のデータを使用して `nil` になる可能性のある別の型のデータ配列に変換する時などによく使用されます。また、偶数値を渡された時のみ初期化できる `Event` を整数値の配列から `nil` の値を取り出すして配列に変換するサンプルコードは下記になります。


```swift
struct Even {
    let evenString: String

    init?(number: Int) {
        if number % 2 == 0 {
            evenString = "\(number)"
        } else {
            return nil
        }
    }
}

let numberList: [Int] = [1, 2, 3, 4, 5, 6]

let eventList: [Even] = numberList.compactMap { Even(number: $0) }

print(eventList.map { $0.evenString }) // ["2", "4", "6"]
```

### flatMap

`flatMap` はクロージャー内で返された配列たちを(多次元配列)一次元配列に変換する際に利用します。サンプルコードとして、理解しやすいように `map` の結果と比較しています。

```swift
let numberList: [[Int]] = [[1, 2, 3], [1, 2, 3], [1, 2, 3]]

let numberStringListWithFlatMap: [String] = numberList.flatMap { $0.map { "\($0)"} }
let numberStringListWithMap: [[String]] = numberList.map { $0.map { "\($0)" }}

print("flatMap: \(numberStringListWithFlatMap)") // flatMap: ["1", "2", "3", "1", "2", "3", "1", "2", "3"]
print("map: \(numberStringListWithMap)") // map: [["1", "2", "3"], ["1", "2", "3"], ["1", "2", "3"]]
Atomでパッケージの検索ができなくなった時の対処法

#はじめに
Atomでパッケージをインストールしようとして検索しても検索が上手く出来なかったので、その問題点と改善方法を個人用のメモとして残そうと思います。
#スペック
PC：Macbook　Pro
OS：Catalina10.15.6
Atom：1.50.0
#原因
WiFiの接続はされていてWebの閲覧は出来ていましたが、Atomのパッケージの検索が出来ていませんでした。以前は検索出来ていました。出来なくなる前後でのことを考えたら、直近でプロキシの設定を行っていました。
#対処
「設定」→「ネットワーク」→「詳細」の順で開いていき、プロキシタブを開く。設定してある必要ないプロキシのチェックを外して「OK」をクリック、最後に適応をクリックしてプロキシの設定を解除しました。
これだけで、Atomのパッケージの検索とインストールができるようになりました。
あまりないとは思いますが、困っている人がいたら助けになればと思います。
【Java】finalのオーバーライドのエラーはコンパイル時には表示されない

###パッケージ化してる場合

親クラスにfinal修飾子を設定したメソッドを子クラスでオーバーライドしても、コンパイル時にはエラーが表示されず、コンパイル後の実行の段階でエラー表示される。

###パーケージ化していない場合
コンパイル時にエラーが表示されるみたい。


教材と挙動が違ったのでメモしておきます。
Mutationsにcommitする2パターン

１つ目はVueファイルからコミットする方法。

```index.vue
<script>
export default {
  fetch ({ store }) {
    store.commit('index/setData',1)
  }
}
</script>
```

２つ目はVuexのActionsからコミットする方法。

```index.js
export const actions = {
  async fetchData({ commit, state }) {
    const resp = await this.$axios.$get('URI')
    commit('setData',resp)
  } catch (error) {
    console.log(error)
  }
}
```
サーバーに必要になる２種類のネットワークについて

サーバーは、１台のサーバーに２本(またはそれ以上)のLANケーブルを接続し、2台(またはそれ以上)のスイッチに接続することが多い。

これは、`サーバーの機能を利用する為のルート(ユーザー用)`と、`サーバーを管理するためのルート(管理者用)の２つのルート`を確保する為である。

#管理者用ルートとは？

- リモート管理アダプタに直結する通信を担当するルートのこと

- サーバーシステムを管理するために、管理者だけがアクセスできるネットワークであり、「管理用LAN」「裏LAN」などと呼ばれることがある
Qiita投稿テンプレート

```
## 結論

## 環境
- Mac
- Ruby 2.6.3
- Rails 6.0.2.2

## 問題点

## 解決法

### 要所

問題か、解説か選ぶ

## 解説

### 要所

## 参考記事
[リンク名](http://...)
```


```
**太字**

[リンク名](http://...)

ネスト
## test
### test
#### test
```



```
| 列名 | 列名 |
|:--|:--|
| 要素 | 要素 |
| 要素 | 要素 |
| 要素 | 要素 |
```

| あ | あ |
|:--|:--|
| あ | あ |
| あ | あ |
| あ | あ |
「' '」はString、「` `」は実行。

**「''」**はStringで文字列などを入れますが、**「``」**は実行するためのもの（※文字列も入れられる）です。
この中ではプロパティのデータを持ってきたりすることができます。

Vue.jsでVuexを使っている時を参考にあげると、
下記のような実装が可能です。

```index.vue
this.$router.push(
  `/${this.$store.state.hoge.fuga}/index`
)
```

pushのパス内でstateのプロパティを引っ張ってきて参照したりすることができます。
１つ目のAPIが通った場合のみ次のAPIを実行するエラーハンドリング

１つ目のAPIを実行してうまく通った場合にのみ、
次のAPIを実行するような処理を実装する一例。

※下記のサンプルではVuex、Axiosで実装しています

```index.js
async getData({ commit, state }) {
  try {
    await this.$axios.
      $get('URI')
      .then(() => {
        this.$axios
          .$get('URI')
          .then((resp) => {
            commit('setData', resp)
          })
          .catch((error) => {
            console.log(error)
          })
      } catch((error) => {
        console.log(error)
      })
    } catch (error) {
      console.log(error) [
    }
  }
}
```

Actiosの中での実装を想定しているので、
commitでMutationsにある（想定）setDataにデータを渡しています。
【Laravel】テスト用DBの環境設定でつまずいた


PHPUnitを使ったテストを実施しようとして、エラーは出るは、SQLiteのテーブルのレコードは消えるは、
つまずいてしまったので忘備録として書き留めておきます。

##テスト用DBの定義追加
`config/database.php` の `connections` にテスト用DBの定義を追加します。

```php:database.php
'connections' => [
    // ここから
    'testing' => [
        'driver' => 'sqlite',      // SQLite指定
        'database' => ':memory:',  // SQLiteのインメモリ機能を使用
        'prefix' => '',            // 接頭辞
    ],
    // ここまでを追加

    //省略
]
```

##テストで使用するDBの指定
`phpunit.xml` に `DB_CONNECTION` の設定を追加します。

```xml:phpunit.xml
<php>
    <!-- 省略 -->
    <server name="DB_CONNECTION" value="testing"/>
    <!-- 省略 -->
<php>
```

##テストケースの作成
環境設定はできたので、下記のコマンドでテストコードを作成します。
`tests/Feature/`にテストコードが作成されます。

```console
php artisan make:test TempTest
```

テストケースを作成します。

```php:TempTest.php
<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;

class TempTest extends TestCase
{
    /* テストケース毎にデータベースをリフレッシュしてマイグレーションを再実行する */
    use RefreshDatabase;

    /**
     * 各テストメソッドの実行前に呼ばれる
     */
    public function setUp(): void
    {
        parent::setUp();

        // テストケース実行前にフォルダデータを作成する
        $this->seed('BookingSeeder');
    }

    /**
     * "@test"はテストメソッドとして認識されるために必要
     * @test
     */
    public function reservation_date_should_be_date()
    {
        /* 第一引数：アクセスする URL */
        /* 第二引数：入力値 */
        $response = $this->post('/', [
            'reservation_date' => 123,
        ]);

        /* エラーになるべきデータを指定 */
        $response->assertSessionHasErrors([
            'reservation_date' => '予約日 は日付を入力してください',
        ]);
    }
}

```

##いざ、テスト実施
下記コマンドでテストコードのテストケースを全て実施します。

```console
./vendor/bin/phpunit ./tests/Feature/TempTest.php --testdox
```

```console
PHPUnit 8.5.8 by Sebastian Bergmann and contributors.

Temp (Tests\Feature\Temp)
 ✘ reservation date should be date
   ┐
   ├ Session is missing expected key [errors].
   ├ Failed asserting that false is true.     
   │

   //省略
```

あれ、エラーが。。。テスト用DBではないSQLiteのテーブルの中身が綺麗まっさらになってるし。。。
どういうことだ。。。

色々調べたところ、最初に修正した`config/database.php`がうまく反映されていなかったぽい。
内部キャッシュをクリアして再度configファイルを読んでもらいました。

```console
php artisan config:clear
```

もう一度テスト実施コマンドを実行したところ、正常に動作しました。

部分的にコンパイルしてリンカの生成がうまくいっておらずエラーになる、
そんな感じのエラーだなと思いました。