OmniAICreator/Qiita-1.07M huggingface dataset:
GoogleSpreadSheetで横（行）方向にまとめてデータを取得する方法

# はじめに

スプレッドシートの値をまとめて配列で取得したい時、「横（行）をまとめて取得したい」と思ったらよく解らなかったので覚書としてまとめておきます。

# getRange("A2:2")で１行全部取得

一番簡単な方法は１行全部取得する方法です。

```
var row = 2;
var range = sheet.getRange("A"+row+":"+row);
var cells = range.getValues()[0];
```

２行目を指定すると、範囲が[A2:2]となり２行目のデータが全部取れます。
（getValues の返り値は２次元配列のため[0]のみ取得）

しかし、不要な範囲（何も入っていないセル）を大量に取得する事になるのはいただけないので必要な範囲を取得します。

# getLastColumn()で列の最大値を得る

```
var lastColumn = sheet.getLastColumn();
```

これで現在のシートの列の最大値（値の入っているセルの範囲）が得られます。

ですが、これだと先程の指定方法[A2:2]は使えなくなるため別の方法を使います。

# getRange(row,1,1,lastColumn)で１行中の指定範囲を取得

```
var range = sheet.getRange(row,1,1,lastColumn);
var cells = range.getValues()[0];
```

範囲の指定方法が全て数値指定（開始位置の行値,列値・そこからの範囲で行数,列数）になるので、lastColumn が使えるようになります。

# 終わりに

getRangeの中には、getRange(row,column,numRows） という引数のものがあり縦（列）をまとめて取得は簡単なのですが、横（行）をまとめて取得する場合わかりずらかったのでまとめてみました。
【Junit5】不安定なテストを自動でリトライする

# 概要

junitで記述しているテストがcicdでたまに落ちる…
しかも、リトライすれば解決する一時的なエラー…
自動でリトライしたい！！！

そんなときに`test-retry`というGradleプラグインを見つけました！！

https://github.com/gradle/test-retry-gradle-plugin

# `test-retry`の機能

テストが失敗した場合、失敗したテストだけリトライしてくれる!
しかも、クラス単位ではなくメソッド単位で！！！

# 使い方

以下のようにプラグインを導入します

```groovy:build.gradle
plugins {
    ...
    id 'org.gradle.test-retry' version '1.2.1'
    ...
}

...

test {
    ...
    retry {
        // リトライが発生した場合に、ビルトを失敗させるかどうか（リトライで成功してもビルド失敗）
        failOnPassedAfterRetry = false
        // この値よりも多くのテストが失敗した場合は、リトライを実行しない（一時的ではない別の問題があると判断される）
        maxFailures = 3
        // １テスト当たりの最大リトライ回数（途中で成功したらリトライ終了）
        maxRetries = 5
    }
    ...
}
```

これだけでOK！

パッと見た感じ、以下のような動作をしてそうです。

1. 通常のテスト実行
2. `maxFailures`の判定
3. 失敗したテストのみ`maxRetries`までリトライ
Python lambdaでの処理

# はじめに
Pythonのlambda式を自身がよく忘れてしまいがちなので， メモとして残しておきます．
他の方の参考にもなればと思います．
`間違っている箇所もあると思いますので， コメントしていただけると幸いです．`


Pythonはdef()で関数を定義しますが， lambda式で無名関数を定義することができます．
**def()** を用いた関数の場合、引数として直接他の関数に渡すことができず， 違う場所で定義してから値を渡す必要があるのに対して， **lambda式**は， あくまで「式」であるので， 関数の引数として直接渡すことができます！！！！

次の節から例を紹介していきます．

# def文とlambda式の対応関係

```python
def add(x, y=1):
    return x+y

print(add(1,2))
# 3

print(add(100))
# 101
```

上記のdef文を， lambda式に変換した場合

```python
f = lambda x, y=1: x+y

print(f(1,2))
# 3

print(f(100))
# 101
```

**`しかしながら， 上記のようにlambda式を変数に代入している記法は， PEP8では非推奨となっているので
注意してください`**


# lambda式でif文処理

for文で一つ一つ処理する際に， if文の条件分岐が入るケースでもlambda式を活用することができます！

```python
number_list = [1,2,3,4,5]

odd_number = []
for i in number_list:
    if i % 2 == 0:
       print(f"{i}は偶数である")
    else:
       print(f"{i}は奇数である")
       odd_number.append(i)

print(odd_number)
# [1,3,5]
```

上記のfor文を， lambda式を使って書き直した場合

```python
number_list = [1,2,3,4,5]
odd_number = filter(lambda i : i % 2 != 0, number_list)

print(list(odd_number))
# [1,3,5]
```

# sorted関数

リストをソートする組み込み関数には引数keyがあります．
keyには， ソートの前にリストの各要素に適用される関数を指定します．

```python
a = [[0,7,4], [2,5,6], [7,4,2]]
b = sorted(a)

print(b)
# [[0,7,4], [2,5,6], [7,4,2]]
```
上記のsorted関数で， lambda式を活用した場合

```python
a = [[0,7,4], [2,5,6], [7,4,2]]
b = sorted(a, key=lambda x: x[-1]) 

print(b)
# [[7, 4, 2], [0, 7, 4], [2, 5, 6]]
```

# map関数

リストの各要素に対して， 一定の処理を行った値を使用する場合はmap関数を適用します．

```python
def doubler(x):
    return x*2

L = [1, 2, 3, 4, 5, 6]
mod_list = map(doubler, L)

print(list(mod_list))
# [2, 4, 6, 8, 10, 12]
```

上記のmap関数で， lambda式を活用した場合

```python
L = [1, 2, 3, 4, 5, 6]
doubler = map(lambda x: x*2, L)
print(list(doubler))
# [2, 4, 6, 8, 10, 12]
```

# まとめ
今回はlambdaでの処理について記事にしました．
間違っている部分があった場合はコメントしていただけると幸いです．
今後もpython tipsを記事にしていこうと思います:smile:

# 参考文献
* [pythonにおけるlambda式の使い方](https://www1.gifu-u.ac.jp/~fujilab/lambda_html/2.html)
Ruby技術者認定試験silverで中々覚えにくいやつメモ

表題の通りです。Rubysilver取得の学習中ですが、なんか覚えにくいなあというものをここに吐き出せばきっと覚えられるんじゃないか、と思ったので。
RExとかで9割超えてきたし、合格教本の問題も9割くらいできるようになったのでそろそろ受けようかなと思っているが、まあ最後の詰めです。

# Stringオブジェクト

```
strip	文字列の先頭と末尾の空白文字(\t\r\n\f\v)を取り除く。
chomp	末尾から改行コードを取り除く。
chop	末尾の文字を取り除きます。ただし、文字列の末尾が"\r\n"であれば、2文字とも取り除く。
```
上記について破壊的に実行したい場合は!をつける

# Arrayオブジェクト
```
pop  selfの末尾より1要素を取り出す(LIFO)。
push | selfの末尾に引数の値を追加します(LIFO)。
unshift | selfの先頭へ引数の値を追加します(FIFO)。引数が指定されていない場合は何もしない
shift | selfの先頭より1要素を取り出します(FIFO)。 
```
上記はすべて破壊的に実行される。

# ファイル操作関連
File.openの2番目の引数について

```
r  読み込み。
w  書き込み。既存ファイルの場合はファイルの内容が空になる
a  追記。追加位置はファイルの末尾
r+ 読み書き。ファイルの読み書き位置は先頭
w+ 読み書き。既存ファイルの場合はファイルの内容が空になる
a+ 読み書き。ファイルの読み込み位置は先頭、書き込み位置は末尾
```

ファイルポインタのseekメソッドの引数について

```
IO::SEEK_SET ファイルの先頭からの位置を表す
IO::SEEK_CUR 現在のファイルポインタからの位置を表す
IO::SEEK_END ファイルの末尾からの位置を表す
```
Rubyの配列について

配列とは複数のデータ(要素)をまとめて格納できるオブジェクトのことです。
配列内のデータは順番に並んでおり添字を指定することでデータを取り出すことができます。
添字とは配列の各要素に割り振られた番号のことです。これは0から始まります。

書き方としては

[データ1,データ2,データ3]
と書きます。
データの取り出し方としては

```:ターミナル
irb(main):002:0> a = [1,2,3,"aaa"]
=> [1, 2, 3, "aaa"]
```
まずirbモードにして変数aに配列を定義します。
次に先頭の1を取り出します。

```:ターミナル
irb(main):004:0> a[0]
=> 1
```
配列の添字は0から始まるのでa[0]となります。
次に配列aは空であるかを確認する方法としては

```:ターミナル
irb(main):005:0> a.empty?
=> false
```
aには要素が入っているのでfalseと返ってきます。

aの中に特定の値が入っているか確認するときは

```:ターミナル
irb(main):007:0> a.include?('aaa')
=> true
```
aaaは入っているのでtrueが返ってきます。

```:ターミナル
irb(main):008:0> a.reverse
=> ["aaa", 3, 2, 1]
irb(main):009:0> a
=> [1, 2, 3, "aaa"]
irb(main):010:0> a.reverse!
=> ["aaa", 3, 2, 1]
irb(main):011:0> a
=> ["aaa", 3, 2, 1]
```
reverseと打つと配列の要素を逆に返すことはできますが、並び替えられていません。
reverse!と打つことで配列内の要素を逆に並び替えることができます。

```:ターミナル
irb(main):012:0> a.shuffle
=> [3, 1, "aaa", 2]
```
shuffleと打つとランダムに順番を並び替えることができます。

配列内に多数の要素を定義したいときは範囲オブジェクトというものがあります。

```:ターミナル
irb(main):013:0> (0..25).to_a
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]
```
0..25とすることでこの範囲を一気に指定することができます。

```:ターミナル
irb(main):014:0> aa = (0..99).to_a.shuffle
=> [76, 62, 67, 35, 60, 65, 26, 68, 69, 58, 25, 39, 73, 55, 43, 41, 54, 
0, 37, 70, 1, 34, 95, 27, 92, 53, 56, 82, 18, 36, 44, 49, 84, 94, 59, 
33, 6, 38, 64, 87, 15, 10, 32, 97, 96, 79, 5, 21, 46, 45, 89, 22, 16, 
98, 42, 80, 12, 40, 4, 61, 30, 72, 47, 50, 8, 75, 83, 48, 11, 51, 78, 
52, 24, 85, 19, 63, 28, 90, 2, 77, 20, 3, 88, 99, 17, 91, 57, 13, 14, 
7, 81, 23, 93, 74, 71, 31, 29, 66, 9, 86]
```

このようにshuffleも記述すると0から99
までの数字をランダムに配列することができます。

```:ターミナル
irb(main):015:0> z = (0..10).to_a
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
irb(main):016:0> z << 20
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20]
irb(main):017:0> z.push(30)
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30]
```
配列の末尾に加えたいときはz<<20、またはpushメソッド
z.push(30)と書きます。

配列の要素を削除したいときは

```:ターミナル
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30]
irb(main):018:0> z.pop
=> 30
irb(main):019:0> z.shift
=> 0
irb(main):020:0> z
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20]
```
z.popで末尾の要素を、z.shiftで先頭の要素を削除します。

重複する要素を削除したいときは

```:ターミナル
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 3, 6]
irb(main):023:0> z.uniq
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20]
irb(main):024:0> z
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 3, 6]
irb(main):025:0> z.uniq!
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20]
irb(main):026:0> z
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20]
irb(main):027:0> 
```
z.uniqで重複する要素を削除し、完全に配列から削除するときはz.uniq!と書きます。

```:ターミナル
irb(main):027:0> s = ['my','name','is','nanashi']
=> ["my", "name", "is", "nanashi"]
irb(main):028:0> s.join
=> "mynameisnanashi"
irb(main):029:0> s.join(' ')
=> "my name is nanashi"
irb(main):030:0> s.join(' ')
=> "my_name_is_nanashi"
```
次に結合の方法です。

s.joinと書くことで書く要素を結合することができます。
s.join(' ')やs.join(' ')とすることで各要素間にスペースなどを入れることができます。

```:ターミナル
irb(main):031:0> s.sort
=> ["is", "my", "name", "nanashi"]
```
s.sortで若い順にソートすることができます。
```:ターミナル
irb(main):032:0> s.size
=> 4
```
s.sizeで要素の個数を返すことができます。
VBA入門サイトを比較してみた

# 概要
題名の通りですが、VBAの入門サイトを比較してみました。

# 背景
「プログラム未経験者におすすめのVBA入門サイトない？」と聞かれました。
個人的には最初の言語にVBAを選んでほしくない気もしますが、仕事の都合でそうなったのであれば仕方ないです。

# 考慮点
1. プログラム未経験者が対象なので、プログラムの基本（構造化とか、一通りの条件分岐・繰り返し）を学べること
1. VBA未経験者が対象なので、VBEの起動方法から始まってくれること
1. 個人的思想として「動作の記録」を調査に使うことは必須なので、それが含まれること

# 対象抽出
「VBA入門」でぐぐって、ExcelVBAの入門サイトであると思われるものを上から順に10個ほど選びました。

# ざっくり選別
URLを書いておいてこきおろすような結果になるのもどうかと思ったので闇に葬りました。
おもしろくなくてすいません。

以下は除外しました。

- 書籍紹介
- AccessVBA
- 「ひとまずHelloWorld＋αまで」くらいの超入門のやつ
- 選択・繰り返しといった構文を一通り説明してなさそうなやつ
- 有料っぽいやつ

以下は除外しました。

- 実際に読んで、最初の実行までにつまづきそうなやつ
    - ページ間の遷移が面倒なやつ
    - リボンの設定すら言及ないまま、マクロの自動記録を指示してきたやつ
    - 最初の実行までにWith句の説明とかが入ってきたやつ(そんなVBA独自構文はもっと後にしてくれ)
- 説明がふわっとしていて、学習者向けの説明としてはどうなのと思わされたやつ

残ったのは以下です。
[エクセルの神髄 / 鵜原パソコンソフト研究所](https://excel-ubara.com/excel_vba1.html)

背景にある質問を受けたあと数分で「とりあえずこれかな」と返したのがこのサイトなので、結論変わらなくてよかったというのが半分。
内容の詳細を選別する前に1個に絞れてしまったので企画倒れ感がすごいというのが半分。・・・比較になってねえΣ(￣ロ￣lll)ｶﾞｰﾝ

個人的には関数名に全角文字を使うことは肯定してほしくないのですが、使えるということを知っておくのは悪いことではないですし、そこは学習者さんに委ねます。。。

# 追記
おすすめあったら教えていただきたいですｍ（。。）ｍ
テスト33

```vb

Sub Ct_If()

Dim i As Long
Dim Last_Row As Long
Dim Ans As Long

With ThisWorkbook.Sheets("表1")

    Last_Row = .Cells(Rows.Count, 1).End(xlUp).Row

    For i = 2 To Last_Row
    
        Ans = WorksheetFunction.CountIfs(.Columns("A:A"), .Cells(i, 1), .Columns("B:B"), .Cells(i, 2), .Columns("C:C"), .Cells(i, 3))
        
        If Ans > 1 Then
            '3つの条件で同じものがあった場合、その条件で別の表をチェックしていく
            Call Another_Table(.Cells(i, 1), .Cells(i, 2), .Cells(i, 3))
        
        End If
    
    Next i

End With


End Sub


Sub Another_Table(ByVal Name As String, ByVal Amount As Long, ByVal Time As Long)

Dim i As Long
Dim Last_Row As Long
Dim myRange As Long
Dim Ans As Long

With ThisWorkbook.Sheets("表2")

    Last_Row = .Cells(Rows.Count, 1).End(xlUp).Row

    For i = 2 To Last_Row
    
        Ans = WorksheetFunction.CountIfs(.Columns("A:A"), .Cells(i, 1), .Columns("B:B"), .Cells(i, 2), .Columns("C:C"), .Cells(i, 3))
        
        If Ans > 1 Then
        
            If .Cells(i, 1) = Name _
            And .Cells(i, 2) = Amount _
            And .Cells(i, 3) = Time Then
            '3つの条件で同じものがあって、なおかつ表1で3つの値で一致するものが複数あるものと一致した場合ここを通る
            
                If .Cells(i, 4).Value = "" Then
                    '入力箇所がまだ空欄だった場合、○を入力する
                    .Cells(i, 4).Value = "○"
                
                End If
            
            End If
        
        End If
    
    Next i

End With

'---------------------------
'メモ
Dim i As Long
Dim test As Variant

test = ThisWorkbook.Sheets("再帰テスト").Range("A1:A2000")

For i = 1 To 2000

    test(i, 1) = test(i, 1) & vbCrLf & vbCrLf
     
Next i

ThisWorkbook.Sheets("再帰テスト").Range("A1:A2000") = test
'---------------------------
'メモ
With ThisWorkbook.Sheets("重複削除")
    'コード(A列)を基準に重複データを削除
    .Range("$A$1:$C$23").RemoveDuplicates Columns:=1, Header:=xlYes
    
End With
'---------------------------

End Sub
TextFieldDelegateメソッドの呼ばれるタイミングをまとめてみた[Xcode/Storyboard]

TextFieldのDelegateメソッドの呼ばれるタイミングについての備忘録としてアウトプットしようと思います。

#環境
・Mac Book Pro(macOS:BigSur)
・Xcode(ver:12.5)

#TextFieldのDelegateメソッド

TextFieldDelegateの中を覗いたら下記のメソッドがありました。
それぞれのメソッド内にprintを書いてどのタイミングで呼ばれるのかを確認しました。
自分なりに理解して説明文を加えています。

・textFieldShouldBeginEditing
(TextFieldに入力するタイミングで呼ばれるが、キーボードはまだ出てこない)

・textFieldDidBeginEditing
(TextFieldに入力するタイミングで呼ばれる。このメソッド内の処理が終わればキーボードが出てくる)

・textFieldShouldEndEditing
(入力後にキーボードを閉じようとするタイミングで呼ばれるが、キーボードは隠れない)

・textFieldDidEndEditing
(キーボードを閉じようとするタイミングで呼ばれる。このメソッド内の処理が終わればキーボードが閉じられる)

・textField
・textFieldDidChangeSelection
(文字を入力する度に呼ばれるメソッド)

・textFieldShouldClear
(clearボタンが押されたら呼ばれるメソッド)

・textFieldShouldReturn
(returnキーを押したら呼ばれるメソッド)

上記のメソッドの呼ばれるタイミングについて記載してみたが、個人的によく使うのは、
textFieldShouldReturnメソッドですね。
returnキーが押されたらキーボードを閉じたいときに使われることが多いように思います。

他のメソッドも自分のアプリ開発で使うことがあれば、記事にしてみようと思います。
railsでDM機能搭載　userコントローラー＆ビュー

忘れないための備忘録です。
railsのDM機能
（参考：https://qiita.com/nojinoji/items/2b3f8309a31cc6d88d03）

アソシエーションは
ルームとユーザーが　エントリーとメッセージに対して１：多の関係

まずユーザーコントローラーのShow

  def show
    @user=User.find(params[:id]) #詳細ページのメイン（DMしたい相手）
    @currentUserEntry=Entry.where(user_id: current_user.id)　#ログインしている人が入っているルーム情報
    @userEntry=Entry.where(user_id: @user.id)　#詳細ページの人が入っているルーム情報
    if @user.id == current_user.id　#ログインしている人が自分のページを見ている
    else
      @currentUserEntry.each do |cu| #二人のルーム情報の中に
        @userEntry.each do |u|
          if cu.room_id == u.room_id then　#二人のルームがあるなら
            @isRoom = true　　
            @roomId = cu.room_id　#この時にはcu,uともにお互いのルーム
          end
        end
      end
      if @isRoom　#ないなら
      else
        @room = Room.new
        @entry = Entry.new
      end
    end
  end

user/show.html.erb のビュー


<h2><%= @user.email %></h2>

<% if @user.id == current_user.id %>　　#自分が自分のﾏｲﾍﾟｰｼﾞをみている

<% else %>
  <% if @isRoom == true %><p><a href="/rooms/<%= @roomId %>">チャットへ</a>　#二人のルームがあるなら二人のルームへのURLへ
  <% else %>
    <%= form_for @room do |f| %>　 #@room = Room.new
      <%= fields_for @entry do |e| %>  #@entry = Entry.new
        <%= e.hidden_field :user_id, :value=> @user.id %>　#新たなentryのユーザーIDにshowのページの人（DMする相手）のIDを渡す役割
      <% end %>
      <%= f.submit "チャットを始める" %>
    <% end %>
  <% end %>
<% end %>

<%= link_to "ユーザー一覧に戻る", users_path %>
Rubyのハッシュでno implicit conversion of symbol into integerがでたがintegerでなく自分のミスだった件について

# はじめに
今回は初のRubyの記事を書きたいと思います。
Rubyは記事がたくさんあるイメージですが、この問題の原因はみつからなかったため記事にします。
いろいろな言語をやっていたりすると起きるミスなのかなとも思いました。

# 問題
以下のハッシュを定義して"サイン"を表示しようとしました。

```
def subject
  {
    math: {
      sin: "サイン",
      cos: "コサイン",
      tan: "タンジェント",
    },
    science: {
      viology: "植物学",
      biology: "生物学",
    }
  }
}  
```

```
# サインと表示したい
select = subject[:math[:sin]]
```

すると以下のエラーが発生します。

```
no implicit conversion of symbol into integer
```
文字列にしろとでているので、`subject["math"["sin"]]`など確かめたが表示されませんでした。

# 解決策
そもそもハッシュの表示の仕方を間違っていました。
エラー文が原因を表していると思っていましたが、それ以前の問題でした。

以下のコードで動きました。

```
select = sebject[:math][:sin]
puts(select)

# サインと表示される
```

# この原因によるエラーのほうが多いかも

先ほども述べましたが、このエラーが出た場合は多くは文字型で指定すると治るかと思います。

```
def subject
  {
    "math": {
      "sin": "サイン",
      "cos": "コサイン",
      "tan": "タンジェント",
    },
    "science": {
      "viology": "植物学",
      "biology": "生物学",
    }
  }
}  

# keyを文字型で定義している (ex "math"など)
```

エラー通り文字型でハッシュを表示します。

シンボルでなく文字列で指定しなければならないので以下のようにする

```
select = subject["math"]["sin"]
```

# さいごに
エラーの内容に気を取られて、文字列にしたりシンボルにしたりを繰り返していましたが、まさかの表記の仕方自体が違っていたことにはなかなか気づきませんでした。リストやらハッシュやらわからなくなることがあります。エラー文を気にする前に表記が正しいか確認するのも大事です。
Rubyドリルを解く時に使うおすすめサイト

##はじめに##

テックキャンプ で学習する際、毎朝rubyドリルを時ます。

その際に私が挙動を確認する際に使うサイトをご紹介します。

##おすすめサイト##


https://paiza.io/ja/projects/new

paiza.IOは、ブラウザ上でコードを書け、書いたコードをその場で実行できるオンラインのプログラム実行環境です。
最初はrubyドリルを解く際にターミナルで記述し、確認をしていたましたがこのサイトを見つけ使っております。

![スクリーンショット 2021-05-12 20.06.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264460/79df7c85-45ad-9808-e10d-730d769f00eb.png)

このように言語を選択して記述ができます。

![スクリーンショット 2021-05-12 20.12.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264460/b465bc90-9f94-2ede-a04a-b40ecee5834a.png)

実行をクリックすると実際の挙動を確かめることできます。
VSCodeでProject Managerを使っている場合にgoplsが動かない現象を解消する

# _VSCode_ で _Project Manager_ を使っている場合に _gopls_ が動かない現象を解消する

動作環境
- macOS: Catalina
- VSCode: 1.56.1
- gopls: v0.6.11
- GO: go1.16.3 darwin/amd64

## _Project Manager_ を使って開発スペースを立ち上げるとエラーが発生する

``` text
Error loading workspace: gopls requires a module at the root of your workspace.
You can work with multiple modules by opening each one as a workspace folder.
Improvements to this workflow will be coming soon, and you can learn more here:
https://github.com/golang/tools/blob/master/gopls/doc/workspace.md.
```

エラーメッセージの[参照先](https://github.com/golang/tools/blob/master/gopls/doc/workspace.md)を見ると、_workspace_ を設定しろと言われる。

一つの開発スペースの中に、複数のmodules(_go.mod_)が含まれているとエラーとなる。

基本的には_Project Manager_ を利用して開発スペースを切り替えるのが好きだったので、ここは遵守したい。

VSCodeでは複数のルートディレクトリーをワークスペースに出来る([Multi-root Workspaces](https://code.visualstudio.com/docs/editor/multi-root-workspaces))

[_Project Manager_ を利用して、複数のワークスペースを紐付ける方法](https://yosiakatsuki.net/blog/visual-studio-code-open-multi-dir/)が記載されているので、こちらの方法を参考にする。

_go.mod_ ファイルがルートディレクトリーになる様にFolderをワークスペースに追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56472/ee9c80aa-e3d3-8dbb-d648-aed7241e4346.png)

ワークスペースを保存する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56472/2b327d17-5ddc-4830-16ff-50217a71f47b.png)

_Project Manager_ の _projects.json_ を編集し、rootPathに保存したワークスペースのファイルを指定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56472/f540cb1c-fde9-25a4-6623-bcd82c06cdaf.png)

これで、_Project Manager_ から開発スペースを切り替えても、_gopls_のエラーが出なくなりました。
[AWS_13.1]php -vで「No such file or directory」のエラー

##環境
MacBook Pro (13-inch, 2016, Four Thunderbolt 3 Ports)
macOS 11.3.1（20E241）
AWS EC2 t2.micro

##エラー
```terminal
# php -v
-bash: /usr/bin/php: No such file or directory

# which php
/usr/bin/which: no php in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
```
<br>
どうやら[AWS_13]でPHP既存の削除して、新しいバージョンのPHPを有効化したものの、新しいバージョンそのものはダウンロードできていなかったらしい。

##PHPをダウンロードして、確認

```terminal
# amazon-linux-extras install php7.4
(省略)

# php -v
PHP 7.4.15 (cli) (built: Feb 11 2021 17:53:39) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies

# which php
/usr/bin/php
```
React NativeでLINEアプリを起動

React NativeでLINEアプリを起動するには、[URLスキーム](https://developers.line.biz/ja/docs/line-login/using-line-url-scheme/)を利用すれば簡単だった。
（てっきりUniversal Linkの設定するかと思っていた）

### テキストメッセージを送る例

```tsx
<Button
  onPress={() => {
    const text = 'シェアする内容'
    const url = `https://line.me/R/share?text=${text}`
    Linking.canOpenURL(url)
      .then(supported => {
        if (supported) {
          return Linking.openURL(url)
        }
      })
      .catch(err => console.error('URLを開けませんでした。', err))
  }}
  title="シェアする"
/>
```

#### 挙動

| Android | iOS |
|:------------:|:------------:|
| ![Screenshot_20210512-191538.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42540/f28b74d1-b50f-21b8-d545-3b10dab5b7d0.png) | ![IMG_2359.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42540/6920a273-c905-5574-f3b2-d46c4697d2aa.png)
 |
[AWS_13]PHPのアップデート

##環境
AWS EC2 t2.micro
PHP 7.2.34

##作業内容
PHPを 7.2→7.4へアップデート

##PHPのアップデート

1.EC2インスタンスへssh接続する

```terminal
ssh -i <秘密鍵ファイル> ec2-user@<パブリックIPアドレス>
```
<br>



2.管理者権限に遷移

```terminal
sudo su -
```
<br>



3.既存のPHPを削除

```terminal
yum remove php*
```
<br>



4.確認

```terminal
# amazon-linux-extras list | grep php
 15  php7.2=latest            enabled      \
 17  lamp-mariadb10.2-php7.2  available    \
  _  php7.3                   available    \
  _  php7.4                   available    [ =stable ]
  _  php8.0                   available    [ =stable ]
```
<br>



5.既存のPHPをdisableにして、PHP7.4をenableにする。

```terminal
amazon-linux-extras  disable php7.2
amazon-linux-extras  enable php7.4
```
<br>



6.確認

```terminal
# amazon-linux-extras list | grep php
  _  php7.2                   available    \
  _  lamp-mariadb10.2-php7.2  available    \
  _  php7.3                   available    \
 42  php7.4=latest            enabled      [ =stable ]
  _  php8.0                   available    [ =stable ]
```
<br>

##（追記）
1.PHPのインストールが抜けていたことが発覚し、インストールした。
https://qiita.com/yoshiki_mbp/private/cd39014bb22ea13a303b

2.モジュール等のインストールが漏れていたので、インストールした。
https://qiita.com/yoshiki_mbp/private/482610a32a69d6498914
インターネットの仕組み（プロトコルスタック、IP、TCP、パケットルーティング）

#インターネットとは
ウェブを可能にする技術インフラの総称で通信するコンピュータの大規模なネットワークをインターネットと言います。複数のコンピュータの混線を解決するためにルータと呼ばれる小さなコンピュータを利用します。ルータは駅の信号機のようにメッセージを適切な宛先コンピュータに確実に送信します。ルータをシステムに追加することによってネットワークに必要なケーブルは少なくて済むことになります。ルータは無限に拡張されモデムを通じてISP（インターネットサービスプロバイダ）に接続します。そしてISPのネットワークから宛先のネットワークに送信される

#歴史
1969年アメリカの軍事機関ARPANETと呼ばれる組織が４つの研究所をネットワークで接続開始（当初、インターネットは、コンピュータの専門家、科学者、エンジニア、図書館員が使用していました。今では全地球的に不可欠なツールになりましたが当時は内部的に情報を送信していた。）
1970年代には、電子メールが導入され、TCP/IP という仕組みの導入
1980年代、PCが生まれ、日常に使われるコンピュータが生まれた
1990年代は、商用利用の制限が解除され、９０年代後半にはWiFiとWindows98の誕生しました。商業的要素を開発するIT業界の取り組みが行われるようになりました。

#インターネットの仕組み
相互接続されたデバイス間でさまざまなデータとメディアを送信する世界的なコンピュータネットワークです。デバイスや場所に関係なく、インターネットを介したデータ転送の一貫性と信頼性を確保しています。メッセージは送信される前にパケットと呼ばれる小さな部分に分割されます。データがインターネット経由で転送される時、メッセージはパケットで配信されます。IPとTCPを使用して、インターネットで接続された別のコンピュータに情報を送信します。数値によるIPアドレスを使用して、IPシステムはデータの転送方法に関する詳細な指示を受け取ることができます。TCPはパケットが失われたり、適切な順序で再構築したり、遅延が発生しないようにデータ転送の信頼性を確保します。
##プロトコルスタック
・メッセージはテキストから電気信号に翻訳されてインターネットを介して送信されてから、またテキストに戻す仕組み
・通常はOSに組み込まれています。
・インターネットで重要なプロトコルスタックはTCP層とIP層（TCP/IP）


|  プロトコル層 |  コメント  |
| ---- | ---- |
|  アプリケーション層  |  www、電子メール、FTPなどのアプリケーションに固有のプロトコル  |
|  伝送制御プロトコル層（TCP）  |  TCPは、ポート番号を使用して、コンピュータ上の特定のアプリケーションにパケットを送信します。  |
|  インターネットプロトコル層（IP）  | IPは、IPアドレスを使用してパケットを特定のコンピュータに転送します。 |
|  ハードウェア層  |  バイナリパケットデータをネットワーク信号に変換し、元に戻します。（例：イーサネット、電話回線モデムなど）  |


1. メッセージはプロトコルスタックの一番上から下に向かって機能します。
2. 送信するメッセージが長い場合、パケットと呼ばれる小さな塊に分割されます。
3. パケットがTCPそうに進むと各パケットにポート番号が割り当てらられます。
4. IP層にパケットが進むと宛先のIPアドレスを受信します.
5. ここからハードウェア層でメッセージを電子信号に変換してISPを通じてインターネットに直接属します。
6. この後、受信先のコンピュータにパケットが到着したら、プロトコルスタックの一番下から上に向かって機能します。


##IP
インターネットに接続している場合、コンピュータには一意のIPアドレスがあります.
インターネットアドレスの形式はnnn.nnn.nnn.nnnでnnnは0から255の数値である必要があります。
このアドレスはIPアドレスと呼ばれます.
ISPを介してインターネットに接続する場合、一時的なIPアドレスが割り当てられます。LANからインターネットに接続する場合、永続的なIPアドレスがあるかDHCPサーバーから一時的なIPアドレスを取得します。

##TCP
TCPは、宛先コンピューター上の正しいアプリケーションにアプリケーションプロトコルをルーティングする責任があります。
これを実現するために、ポート番号が使用されます。ポートは、各コンピューター上の個別のチャネルと考えることができます。たとえば、電子メールを読みながらWebを閲覧できます。
これは、これら2つのアプリケーション（Webブラウザーとメールクライアント）が異なるポート番号を使用したためです。パケットがコンピュータに到着してプロトコルスタックを上るとき、TCP層はポート番号に基づいてどのアプリケーションがパケットを受信するかを決定します。

##パケットルーティングネットワーク
通常、ルーターはネットワーク間に接続され、ネットワーク間でパケットをルーティングします。
パケットがルーターに到着すると、ルーターは発信元コンピューターのIPプロトコル層によってそこに配置されたIPアドレスを調べます。ルーターはルーティングテーブルをチェックします。
IPアドレスを含むネットワークが見つかった場合、パケットはそのネットワークに送信されます。
IPアドレスを含むネットワークが見つからない場合、ルーターはデフォルトルートでパケットを送信します。
モデル単体テストコードの書き方

# はじめに
プログラミング初学者のため、自分の理解できている範囲内で言語化しています。
何か間違っている情報や改善点などありましたら、コメントいただけますと幸いです。🙇‍♂️

# 手順
**導入/設定**
・ RSpecの導入
・ FactoryBotの導入
**下準備**
・ テストコード記述ファイルの作成
**FactoryBot**
・ ファクトリーボットファイル記述
**Spec**
・ テストコード記述

# 実装

## 導入/設定
ポイントは**:development,:test**のところに書くこと

```ruby:Gemfile
group :development, :test do
 gem 'factory_bot_rails'
 gem 'rspec-rails', '~> 4.0.0'
end
```
の後に**bundle install**を忘れない

次に、RSpecのインストール

``` :ターミナル
% rails g rspec:install
```
ここでインストールができないなどのエラーが出る場合はこの記事を参照
https://qiita.com/tech_hack_Rich/items/c8e12f5d9d3e9d677ed7

次に、テスト結果をターミナルで可視化するための設定をする

``` :.rspec
--require spec_helper
--format documentation    ---追記する
```
これで導入と設定は完了

## 下準備
テストコードファイルの作成

``` :ターミナル
% rails g rspec:model user
```
これでテストコードを書くためのファイルを作成する、
同時にfactorybotのファイルもここで生成される

下準備OK

## FactoryBot

こんな感じで記述

``` spec/factories/users.rb
FactoryBot.define do
  factory :user do
    nickname              {'test'}
    email                 {'test@example'}
    password              {'000000'}
    password_confirmation {password}
  end
end
```

## Spec

``` spec/models/user_spec.rb
require 'rails_helper'
RSpec.describe User, type: :model do
  before do
    @user = FactoryBot.build(:user)
  end

  describe 'ユーザー新規登録' do
    it 'nicknameが空では登録できない' do
      @user.nickname = ''
      @user.valid?
      expect(@user.errors.full_messages).to include "Nickname can't be blank"
    end
    it 'emailが空では登録できない' do
      @user.email = ''
      @user.valid?
      expect(@user.errors.full_messages).to include "Email can't be blank"
    end
  end
end
```

完成🎉
【TypeScript】TypeScript の型ガード



# 型ガード ( Type Guards )
* 型ガードとは、オブジェクトにメソッドやプロパティが存在することをチェックし、特定の処理を実行する方法です。
* 主に以下演算子を使用します
    * `typeof` 
    * `in`
    * `instanceof`

# `typeof` で型ガード
* 引数がunion型の場合、`typeof` で型をチェックして、型によって実行する処理を変更します

```ts

type Combinable = string | number;
type Numeric = number | boolean;
type Universal = Combinable & Numeric;

function add(a: Combinable, b: Combinable) {
  if (typeof a === 'string' || typeof b === 'string') {
    return a.toString() + b.toString();
  }
  return a + b;
}

```

## オブジェクト型で型ガード
* オブジェクト型を `typeof` 演算子で判定することは不可能
    *   `if ( typeof emp == ‘Employee’) { }` //NG
        * typeof の型チェックは runtime 上で実行できるので、JavaScriptに存在する型でないといけないため失敗します
* `in` でプロパティが存在するかを確認できる
    * `  if ('privileges' in emp) {  }` //OK

```ts
type Admin = {
  name: string;
  privileges: string[];
}

type Employee = {
  name: string;
  startDate: Date;
}

type UnknownEmployee = Employee | Admin;

function printEmployeeInformation(emp: UnknownEmployee) {
  console.log(emp.name);  //AdminでもEmployeeでも存在
  if ('privileges' in emp) {     //Adminのみのプロパティ
    console.log('Privileges: ' + emp.privileges);
  }
  if ('startDate' in emp) {
    console.log('Start Date: ' + emp.startDate);
  }
}

printEmployeeInformation({ name: 'Neko', startDate: new Date() });
```


## クラスの型ガード
* `instanceof` でクラスの型を判定する
    * `  if (vehicle instanceof Truck) {}`//Truckコンストラクタ関数によって作られたオブジェクトであるかどうか判断できる
        * インターフェースで `instanceof` を使うことはできないので、`in`を使う
    *  `if ('loadCargo' in vehicle) { }` // loadCargoメソッドが存在したら

```ts
class Car {
  drive() {
    console.log('運転中です…');
  }
}

class Truck {
  drive() {
    console.log('トラックを運転中です…');
  }

  loadCargo(amount: number) {
    console.log('荷物を載せています...' + amount);
  }
}

type Vehicle = Car | Truck;

const v1 = new Car();
const v2 = new Truck();

function useVehicle(vehicle: Vehicle) {
  vehicle.drive();

  if (vehicle instanceof Truck) {  //Truckコンストラクタ関数によって作られたオブジェクトであれば
    vehicle.loadCargo(1000);       //Truckにしかないメソッド
  }
}

useVehicle(v1);
useVehicle(v2);

```
【TypeScript】TypeScript の null合体演算子


#null合体演算子
* nullか、undefinedの場合に値を代入することができます
    * オブジェクトが null か undefined の場合のみ、右辺の値が代入されます
    * オブジェクトが 0、""、false など、条件式で false と判定される値の場合は、代入されません

##二項論理演算子 の使い方
* 条件式で false と判定される値を判定し、代入したい場合、二項論理演算子`||`を使って、二番目の引数の値を設定できます
    * `const storedData = userInput  || 'DEFAULT’;` 　//DEFAULT
* この方法では、null以外 ( 空文字,　0,　false, undefined など) でも2番目の値を取得します

```ts
const userInput = null;
//一番目の値がnullの時、2番目の値を取得する
const storedData = userInput  || 'DEFAULT';
```

##null合体演算子の使い方
* null合体演算子`??`を使うことで、nullか、undefinedの場合のみ値を設定することが可能になります

```ts
const userInput = undefined;
const storedData = userInput ?? 'DEFAULT'; // DEFAULT
console.log(storedData);
```
Flask-RESTX Swagger ドキュメント表示を無効にするいくつかの方法

FlaskでRest APIを実装するための拡張 Flask RESTX には、Rest API仕様を表示してくれる機能が内蔵されています。その実態はSwaggerというAPI仕様を記述するJSONドキュメントと、それを見やすく表示してくれるSwagger UIの組み合わせ。ほかの多くのWebフレームワークにも同じ機能が載っています。

```python
from flask import Flask
from flask_restx import Api, Resource, fields


app = Flask(__name__)
api = Api(app)

@api.route("/sample")
class SampleResource(Resource):
    def get(self):
        """ サンプル """
        pass

    @api.expect(api.model("Sample", model={"name": fields.String}))
    def post(self):
        """ サンプルを追加 """
        pass
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549855/ca482a25-fe6e-6cf0-6dd8-804426b0756a.png)


開発時には便利ですが、公開環境ではAPI仕様を見れるようにはしたくないケースも多くあります。そのためにとれる方法を紹介します。

# 引数 doc にFalse 指定

Apiクラスの引数 `doc` に False を指定することで、Swagger UI を無効にできます。

```python
api = Api(app, doc=False)
```

ただし、表示されなくなるのはSwagger UIだけで、JSONで配信されるSwaggerドキュメントは `/swagger.json` は依然として公開されたままです。

# nginxでHTTP/404 へrewrite

nginxでプロキシしてるならその設定のなかで、swaggerドキュメントへのリクエストをHTTP/404にリライトすることで、JSONファイルへのアクセスを防げます。

```
location ^~ /swagger.json {
  rewrite ^(.*)$ /404 redirect;
}
```

次に述べるやりかたを知るまでは、この方法しかないと思っていました。


# init_app で引数 add_specs を指定

Flask拡張は、インスタンス作成時にFlaskオブジェクト (app) を渡して有効にする方法と、インスタンスを作ったあとにinit_appにFlaskオブジェクトを渡す方法どちらかを選べるようになっています。

```python
app = Flask(__name__)

api = Api(app)
# あるいは
api = Api()
api.init_app(app)
```

init_appの引数に `add_specs=False` を指定すると、swagger JSONファイルの配信も止めることができるみたいです。

```python
api = Api()
api.init_app(app, add_specs=True)
```

みたいです、というのはdocコメントにその記述がないんですよねえ……。

```
In [10]: api.init_app?
Signature: api.init_app(app, **kwargs)
Docstring:
Allow to lazy register the API on a Flask application::

>>> app = Flask(__name__)
>>> api = Api()
>>> api.init_app(app)

:param flask.Flask app: the Flask application object
:param str title: The API title (used in Swagger documentation)
:param str description: The API description (used in Swagger documentation)
:param str terms_url: The API terms page URL (used in Swagger documentation)
:param str contact: A contact email for the API (used in Swagger documentation)
:param str license: The license associated to the API (used in Swagger documentation)
:param str license_url: The license page URL (used in Swagger documentation)
File:      ~/.local/share/virtualenvs/restx-7s1H6SJg/lib/python3.9/site-packages/flask_restx/api.py
Type:      method
```

使っていいオプションなのかどうか、よくわかりません。


# 参考

https://github.com/python-restx/flask-restx/issues/116
[Laravel][Docker]DBコンテナが正常に立ち上がっているのにLaravel側で接続できない場合の対処法


#正常にDBコンテナは動いているのにLaravelでは接続できない！

結構この罠に引っかかる人多いんじゃないかなと思って書きました。

#環境
Laravel8
docker-compose 3.8

##エラー(Laravel)
```
SQLSTATE[08006] [7] could not connect to server: Connection refused Is the server running on host "127.0.0.1" and accepting TCP/IP connections on port 5432?
```

##直接DBには接続できる
![スクリーンショット 2021-05-12 18.01.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361269/c2ccdb9e-2a81-f363-b9ba-a452bcb58cc2.png)

#解決策

Laravelのデフォルトのdbホストが127.0.0.1になっています。
dbクライアント(tableplus)で繋がるんだから、なんかこれでいけそうな気がするんですけど、無理です。
→理屈は分からないのでわかる方教えてくだせえ！

##env
```
$ docker-compose ps
      Name                     Command               State            Ports         
------------------------------------------------------------------------------------
api_project_app_1   docker-php-entrypoint php-fpm    Up      0.0.0.0:19000->9000/tcp
api_project_db_1    docker-entrypoint.sh postg ...   Up      0.0.0.0:5432->5432/tcp 
api_project_web_1   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:80->80/tcp   
```

DBコンテナのホスト名をLaravelの.envに。

```
DB_HOST=127.0.0.1
```

↓

```
DB_HOST=api_project_db_1
```

####これでいけます
システムエンジニアが自作デザインでポートフォリオサイトを作成しました

###記事はこちらに移動しました。

https://murakamiaya.com/rastaya/%e3%82%b7%e3%82%b9%e3%83%86%e3%83%a0%e3%82%a8%e3%83%b3%e3%82%b8%e3%83%8b%e3%82%a2%e3%81%8c%e8%87%aa%e4%bd%9c%e3%83%87%e3%82%b6%e3%82%a4%e3%83%b3%e3%81%a7%e3%83%9d%e3%83%bc%e3%83%88%e3%83%95%e3%82%a9/
Nginxのconf.dとsites-availableとsites-enabledの違い

## はじめに
Nginxのデフォルトで読み込まれる追加設定ファイルの置き場として`/etc/nginx/conf.d/`と`/etc/nginx/sites-available/`と`/etc/nginx/sites-enabled`があるが、それらの違いについて調べてみたことをまとめる。

## /etc/nginx/conf.d/
メイン設定ファイル(`/etc/nginx/nginx.conf`)から読み込まれる。
デフォルトの設定(`/etc/nginx/nginx.conf`)を上書きする設定を記述するファイルの置き場。`/etc/nginx/conf.d/`配下に`*.conf`という名前の設定ファイルを作成すると、設定を追加できる。

## /etc/nginx/sites-available/
バーチャルホストの追加設定を記述するファイルの置き場。運用したいドメインごとにファイルを作成して設定を記述する。
ここには利用可能な設定ファイルが置かれるだけで、ここに置いたファイルが直接Nginxの設定に反映されるわけではない。

## /etc/nginx/sites-enabled/
メイン設定ファイル(`/etc/nginx/nginx.conf`)から読み込まれる。
`/etc/nginx/sites-enabled/`配下で`/etc/nginx/sites-available/`配下のファイルへのシンボリックファイルを貼る。設定を無効にしたい場合はシンボリックリンクを削除すれば、設定ファイルは`/etc/nginx/sites-available`に残したままにできる。

## 使い分け
`/etc/nginx/conf.d/`以下に置かれた設定ファイルは常に適用されるのに対し、`/etc/nginx/sites-available/`以下のファイルは`/etc/nginx/sites-enabled/`にシンボリックリンクを貼るかどうかで設定を使用するかどうかを切り替えられる。

後者の方が柔軟に設定を変更できるので、バーチャルホストの設定を追加する際はそちらを使う方がいいのかな。面倒くさいから全部`/etc/nginx/conf.d/`に置くって人もいるみたいだけど。

## 参考リンク
- https://serverfault.com/questions/527630/difference-in-sites-available-vs-sites-enabled-vs-conf-d-directories-nginx
[Rails]Basic認証について

#はじめに
こんにちは、docker導入によってテストコードが動かなくなるというエラーのために寝れなくなるほど悩んでいるとちです。息抜きに、ちょっと全然違うことについてまとめてみました。ぜひご覧ください

#Basic認証とは
Basic認証とは、HTTP通信の規格に備え付けられている、ユーザー認証の仕組みのことです。閲覧できるユーザーを制限するために使用します。

少ない手間で認証を実装できるため便利ですが、安全性という観点から、完全に信頼できる認証方式ではありません。
HTTP通信で定義されている仕様上、ユーザー名とパスワードが通信経路上にそのまま送られるため、漏洩のリスクがあります。また、ログアウトの概念が定義されていないため、もし必要になる場合は自力で実装する必要があるほか、複数のサーバーをまたいだ認証が難しいといった特徴も問題になります。


#実装について簡単にまとめ

はい、これで完成なんですね、実は。

```app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :basic_auth


  private

  def basic_auth
    authenticate_or_request_with_http_basic do |username, password|
      username == ENV["BASIC_AUTH_USER"] && password == ENV["BASIC_AUTH_PASSWORD"]  # 環境変数を読み込む記述に変更
    end
  end
end
```

一応、味気なさすぎるので解説します。
そんなに難しいわけではないですが、、鬼長い名前のメソッドがありますね！そう！authenticate_or_request_with_http_basicメソッドです。
RailsアプリケーションでBasic認証を実装するために使用する、Railsのメソッドで、ブロックを開き、ブロック内部でusernameとpasswordを設定することでBasic認証を利用できます。

**ただし、ここで注意なのは、それぞれの値は環境変数で設定してください。**でないと、github上にあげてしまうと誰でも認証できてしまうということになります！

ちなみにローカル、AWS、herokuそれぞれで環境変数は設定する必要があります

###herokuの場合

herokuの場合は、heroku configで設定できます。以下のコマンドで設定しましょう

```terminal
% heroku config:set BASIC_AUTH_USER="admin"
% heroku config:set BASIC_AUTH_PASSWORD="2222"
```

###ローカルの場合

macOSがCatalina以降の方は、以下のコマンドです。

```terminal
% ~/.zshrc
```
Mojave以前の方は以下のコマンドです。

```terminal
% source ~/.bash_profile
```

(以下、macOSがCatalina以降の方と仮定して説明、基本変わりないです)
以下のように環境変数を設定してやってパスを通しましょう

```terminal
export BASIC_AUTH_USER='admin'
export BASIC_AUTH_PASSWORD='2222'
```

```terminal
% source ~/.zshrc
```

とこんな感じです！！

#参考

###zsh
「zsh」はログインシェルと呼ばれるもので、プログラムを実行する時に、ユーザーの要求に一番最初に対応する役割を担います。隠しファイルなので、特別な設定なしではFinderなどには表示されていません。
環境変数を記載する場所は、設定ファイルである「.zshrc」の中です。

###bash
「bash」とは、zsh同様、ログインシェルの1つです。zshとの違いは、OSがCatalina以降であれば「zsh」、Mojave以前であれば「bash」が自動で適用されます。
環境変数を記載する場所は、設定ファイルである「.bash_profile」の中です。



#おわりに

いい感じに息抜きできたので再度エラーと戦ってきます！行ってきます！笑
【HTML】tableについてまとめてみた

# はじめに
HTMLを使っていると使う機会が多いtableタグについて徐々にまとめていこうと思います。

# 基本的なタグ
```
<table> </table>    テーブルの始まりと終わりを示す
<th> </th>          見出し（talbe header）をつける
<tr> </tr>          行（table row）を定義している
<td> </td>          データセル（table data）を定義し、1つ1つのセルの内容を示す。
```
単純なマスであれば、上記の4つで作成することができます。
例えば、1〜9の数字を3x3で表すとすると以下になります。

```html
<!DOCTYPE html>
<html>
--省略--
<body>
    <table>
        <tr>         <!--1行目-->
            <td>1</td>
            <td>2</td>
            <td>3</td>
        </tr>
        <tr>         <!--2行目-->
            <td>4</td>
            <td>5</td>
            <td>6</td>
        </tr>
        <tr>         <!--3行目-->
            <td>7</td>
            <td>8</td>
            <td>9</td>
        </tr>
    </table>
</body>
</html>

   実行結果
    1 2 3    <!--1行目-->
    4 5 6    <!--2行目-->
    7 8 9    <!--3行目-->
```
このままではマスにはなりませんがCSSでborderを与えてあげることで3x3のマスが完成します。

```sample.css
table{
    border-collapse: collapse;
}

table td{
    border: solid 1px #000000;   
}
```
※```border-collapse: collapse;```を使うことでborder同士の隙間をくっつけて表示することができます。

# マス目をカスタムする
#### 横に繋げる```colspan```
![tes3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1063385/41b34074-6587-d03b-9da0-0b8c1294be2a.png)

上の画像の1と2のマスを横に繋げて表示したいとします。
その際に役立つのが```colspan```です。
```colspan```で指定した数だけ横向きにマスが拡張されます。
例えば、1番の```<td>```タグに```colspan="2"```を追加してあげると
表示結果は下のようになります。

![tes4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1063385/c56713de-eb62-3528-7101-9cecbc20f3db.png)

 ```colspan="2"``` としたことで1番のマスが横に拡張され2マスとなったため、3番のマス目がはみ出てしまいます。
そのため、3番目のセルは削除してしまいましょう。

#### 縦に繋げる```rowspan```

![tes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1063385/cc5817ae-fe4f-ba7b-22da-cde6d726b43a.png)
今度は上の画像の1と4のマスを縦に繋げて表示したいとします。
1番の```<td>```タグに```rowspan="2"```を追加してあげます。
```<td rowspan="2">1</td>```
表示結果はこちらです。
![tes2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1063385/87884779-89b4-37a3-c37a-405f5ee51a09.png)

今度は6番がはみ出てしまっています。
```rowspan=""```は```<tr>```タグをまたいでセルを追加されるため、2列目のセルが1つ不要になるのです。
【Laravel】ログイン時の追加処理

ログイン時に追加処理をするためのメモ。

#前提
バージョン：Laravel6

#LoginControlerの中身
```php:LoginController.php
<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\AuthenticatesUsers;

class LoginController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers;

    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = RouteServiceProvider::HOME;

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }
}
```
デフォルトの状態ではログインコントローラーは上のようになっている。
今回重要なのは`use AuthenticatesUsers;`。ログイン時の処理内容も本体はこの`AuthenticatesUsers`トレイトの中にある。
`AuthenticatesUsers`は`vendor/laravel/framework/Illuminate/Foundation/Auth`の中にある。

```php:AuthenticatesUsers.phpから抜粋
public function login(Request $request)
{
    /* 割愛 */

    if ($this->attemptLogin($request)) {
        return $this->sendLoginResponse($request);
    }

    /* 割愛 */
}

protected function sendLoginResponse(Request $request)
{
    /* 割愛 */

    return $this->authenticated($request, $this->guard()->user())
            ?: redirect()->intended($this->redirectPath());
}

protected function authenticated(Request $request, $user)
{
    //
}
```
`AuthenticatesUsers`の中を見ると`login`ではログインをする（`attemptLogin`）ときに`sendloginResponse`が呼び出されている。
さらに`sendloginResponse`では`authenticated`と`redirect()...`が三項演算子`?:`で比較されている。
つまり、`authenticated`を実行してその返り値が存在しない、または`false`の場合は`redirect()...`でログイン先のページへと移動する。
この`authenticated`は中身が空なので`LoginController`側で上書きすればログイン実行時の処理を追加できる。
なお、`$request`はログインフォームの入力値、`$user`はログインしたユーザーが入る。
返り値があれば`redirect()...`は実行されないので、ユーザーごとにログイン先を変えるといった処理も可能。
注意点として、`use Illuminate\Http\Request;`も追記しないと`LoginController`側で`Request`が呼び出だせずエラーになってしまう。

#サンプル　ログイン時の時間を記録する
`users`テーブルに`login_at`カラムを追加してユーザーごとにログインした時間を記録する。

##①マイグレーション
```php:add_login_at_to_users_table.php
public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->dateTime('login_at')->nullable();
    });
}

public function down()
{
    Schema::table('users', function (Blueprint $table) {
        $table->dropColumn('login_at');
    });
}
```

##②コントローラー
```php:LoginController.php
<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request; // 追記

    /* 割愛 */

protected function authenticated(Request $request, $user)
{
  $user->login_at = now();
  $user->save();
}
[AWS_12]WordPressをダウンロード&インストール

##環境
MacBook Pro (13-inch, 2016, Four Thunderbolt 3 Ports)
macOS 11.3.1（20E241）

##EC2に PHP,apache,SQLをインストール

1.EC2インスタンスにSSH接続する。

```terminal
ssh -i <秘密鍵ファイル> ec2-user@<パブリックIPアドレス>
```
2.管理者権限に遷移する。

```terminal
sudo su -
```

3.EC2内のパッケージを最新にする。

```terminal
yum -y update 
```

4.PHPのインストール

```terminal
amazon-linux-extras install php7.2
```

5.apache , SQL , PHPの諸々をインストール

```terminal
yum -y install mysql httpd php-mbstring php-xml gd php-gd
```

6.再起動時にapacheが自動的に起動するようにする

```terminal
systemctl enable httpd.service
```

7.apacheを起動する。

```terminal
systemctl start httpd.service
```

8.apacheが起動しているかステータスを確認する。

```terminal
systemctl status httpd.service
```

<br>
##WordPressをインストールする



####1.最新のWordPressをダウンロードする。

```terminal
wget http://ja.wordpress.org/latest-ja.tar.gz ~/
```



####2.ダウンロードできているか確認する。

```terminal
ll
```



####3.圧縮されているwordpressのパッケージを展開する。

```terminal
tar zxvf ~/latest-ja.tar.gz
```
|オプション|意味|
|-|-|
|z|「gzip」コマンドで伸張処理を行う|
|x|展開する|
|v|処理したファイルを出力する|
|f|アーカイブファイルを使う|



####4.展開したWordPressをドキュメントルートにコピーする

```terminal
cp -r ~/wordpress/* /var/www/html/
```
|オプション|意味|
|-|-|
|r|ディレクトリごとコピーする|



####5.Apacheユーザにドキュメントルートのアクセス権・所有権を与える

```terminal
chown apache:apache -R /var/www/html/
```
chown ユーザー[:グループ] [オプション] ファイル

|コマンド|意味|
|-|-|
|chown|指定したファイルやディレクトリの所有権を変更する|
|R|再帰的にディレクトリ以下のディレクトリやファイルも変更する|



##WordPressの初期設定
1. WEBサーバのEC2インスタンスのパブリックIPアドレスをコピーする。
1. ブラウザにペーストしてアクセスする。
1. WordPressの初期設定の画面が表示されることを確認する。
1. `さぁ、始めましょう`をクリックする。

データベース名:　wordpress
ユーザー名:　(RDSで設定した値)
パスワード:　(RDSで設定した値)
[GCP]死活監視のベストプラクティス

- ヘルスチェックAPIはプロダクトに関連するすべてのサービスを網羅させる

- vCPU,memoryの監視に加えてdisc使用量も監視したほうがよい

- Monitoringのダッシュボードを新規作成する（カスタマイズダッシュボード）

- Monitoringのトレースからレイテンシを確認する
作業ファイルをそのまま本番用に出力するだけのGulpの設定

## やりたいこと

作業用フォルダから本番用フォルダにファイルを出力するだけの設定メモ。

mapファイルだけ追加で生成する。

簡単に書くと以下のようなイメージ。

### 作業用フォルダ

- src
    - js
        - script.js

### 本番用フォルダ

- dest
    - js
        - script.js
        - script.js.map

## Gulp ソースコード

Gulp 4ならオプションでsourcemapsを生成できるので以下のように書ける。
よって、gulpだけインストールしていればよい。
※Gulp 3ならgulp-sourcemapsのインストールも必要になる。

```js:gulpfile.js
const gulp = require('gulp');

// 【例】jsをsrcディレクトリからdestディレクトリに出力するだけのタスク
gulp.task('js', function () {
	return gulp
		.src('./src/js/*.js', { sourcemaps: true })
		.pipe(gulp.dest('./dest/js/', { sourcemaps: './' }));
});

// watchタスク
gulp.task('watch', function () {
	gulp.watch('./src/js/*.js', gulp.task('js'));
});

// defaultタスク
gulp.task('default', ['watch']);
```
[python] リスト内包表記内でprintしたい

小技です。
検索してもそれっぽい感じの記事があまり出なかったので投稿。


# 前提
リスト内包表記内で時間のかかる処理を行っているとき、進捗状況を`print`したい！
ということが人によってはあると思います。ないかも。

```python:print_in_list_test.py
import time
def heavy_function(num):
    time.sleep(1)  # めちゃんこ時間かかる処理
    return "かたつむりが{num}匹".format(num=num)

def print_in_list_test():
    #print()  # 進捗状況を出力したいけど、全部やった後かやる前しか出力できない
    outputs = [heavy_function(num)
               for num in range(1, 10)]  # ここでめっちゃ時間かかる…
    print("、".join(outputs))

print("処理開始")
print_in_list_test()
print("処理終了")
```

```text:out
処理開始
かたつむりが1匹、かたつむりが2匹、かたつむりが3匹、かたつむりが4匹、かたつむりが5匹、かたつむりが6匹、かたつむりが7匹、かたつむりが8匹、かたつむりが9匹
処理終了
```

# 解決策
あまり綺麗ではないですが、

- `tuple`を一時生成する
- `tuple`内で`print`した後に、メインのデータを選択

というようにすることで、リスト内包表記内での`print`が実現できます。

```python:print_in_list_test2.py
import time
def heavy_function(num):
    time.sleep(1)  # めちゃんこ時間かかる処理
    return "かたつむりが" + str(num) + "匹"

def print_in_list_test2():
    outputs = [(print("\r処理中：" + str(num), end=""),
                heavy_function(num))[1]  # 一時tuple を作成して即廃棄
               for num in range(1, 10)]
    print()  # ↑のprint内で \r を使ってるので行を改める
    print("、".join(outputs))

print("処理開始")
print_in_list_test2()
print("処理終了")
```

```text:out
処理開始
処理中：9
かたつむりが1匹、かたつむりが2匹、かたつむりが3匹、かたつむりが4匹、かたつむりが5匹、かたつむりが6匹、かたつむりが7匹、かたつむりが8匹、かたつむりが9匹
処理終了
```

# 追記：カウンター側で出力する
コメントで頂いた情報です。（ありがとうございます！）
関数を用意する必要がありますが、余計な処理が無くて自然です。

ライブラリもあるんだそうな。
[GitHub - tqdm_tqdm A Fast, Extensible Progress Bar for Python and CLI.html](https://github.com/tqdm/tqdm)

```python:print_in_list_test3.py
import time
def heavy_function(num):
    time.sleep(1)  # めちゃんこ時間かかる処理
    return "かたつむりが{num}匹".format(num=num)

def progress(seq):
    for num in seq:
        print("\r処理中：{num}".format(num=num), end="")
        yield num
    print()  # ↑のprint内で \r を使ってるので行を改める

def print_in_list_test3():
    outputs = [heavy_function(num) for num in progress(range(1, 10))]
    print("、".join(outputs))

print("処理開始")
print_in_list_test3()
print("処理終了")
```

# 感想
べんり！！
LeapMotion使った指のanimをbvhにした

#UnityからBlenderにモーション持っていきたいんだけど

この一言から検証が始まった。
なんとなくできそうなことだけがわかっていたので、安請負をしたところ結構ハマったのでメモとして残しておく。

###使用したもの

1. LeapMotion
1. Unity 2019.3
1. LeapMotionUnityDevKit(こんな名前かはしらない)
1. uniVRM(0.55以上がよさそう？)
1. FinalIK
1. EasyMotionRecorder
1. BVH Tools
1. 適当なVRMのモデル

###使用しなかったもの

2. uOSC
2. EVMC4U
2. FBX Exporter

ほぼこの記事を参考に書かせていただいております。
https://note.com/361yohen/n/na74a81db00f4

###苦戦したこと

3. uniVRMのバージョン0.46を使っていたことで、FinalIKのFull Body Biped IKが半分ぐらいしか見えない状態だった
3. FBXにするつもりでFBXExporter使っていたんだけど、コマみたいにしか動かなかった
3. BVH Toolsの使い方が全く不明

##手順

####LeapMotionのセットアップ
なんか、前はあったかわかんないけど、SDKなどを取得するのにアカウント登録が必要なのでする。
https://developer.leapmotion.com/unity#116
これから、coreを使うのでダウンロードしておく。
unitypackageの中に入っている、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11300/d4a2ebc0-c295-76fa-5c1f-b2409175d22d.png)
これをヒエラルキーに置く。
leapmotionがつながっていると、再生ボタンを押すとなんか動く。

RigRoundHand_L及びRigRoundHand_Lにいかのような空のケームオブジェクトをつけておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11300/cd4a0ac0-5407-a53d-9cf0-a9bb0910ac39.png)

このとき動きが鈍いようだったら、leapmotionが汚れてないかを確認。

####UniVRMを読み込みついでにVRMを読み込む
割愛

####FinalIK（課金要素）をインポート
LeftArmの三角を押すと、LeftHandEffectorというものが出てくるので、Targetにさっきの殻のオブジェクト（例ではHandL1）を指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11300/cda5d1f4-084f-2da9-1994-59076f0dc8ea.png)
これで位置合わせをすると、leapmotionの手首に追従してくねくねと動くようになる。

####指の設定
指が動いてほしい気持ちがあるので、配置したVRMモデルに小細工する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11300/3a48520e-aef4-41d3-5d1d-f5f8c677d56f.png)

手首と思われる骨に、Rigged Fingerをアタッチ、指の第1関節を設定。
そのあと、LeapMotionのサンプルの中に入ってる、RigidRoundHand_RのRigedHandの値を更新。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11300/0b8e0cb2-9273-1df7-0699-c99287e21cbe.png)
指は一本一本丁寧にやる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11300/22f4d524-a627-9c1f-19d1-8a0389de2648.png)


これでたぶんLeapMotionでVRMのモデルが動くはず。

####モーションデータの収録
EasyMotionRecorderをヒエラルキーにおいて、Animatorを設定。
VRM指定するだけでいい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11300/4df8d0c7-8cda-9127-09d3-28feeeacf5a1.png)

再生ボタン押したあと、Rでデータ保存開始、Xで終了。
よくUnityの再生ボタンを切り忘れるので注意。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11300/b01e5d60-278c-2a95-705c-f2ead8add1be.png)
Resourcesのなかに保存されたものが溜まっていく。
空白の立方体みたいなアイコンみたいなものをインスペクタで変換する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11300/9384b2c1-d983-19c5-eb04-2117279c2146.png)
これで.animデータができる。

####animデータをbvhに変換する
アニメーターコントローラー作って、animを設定。
モデルをもう一体立てて、アニメを埋め込む。
BVHTools内の、BVHRecorderというものを空のゲームオブジェクトにアタッチする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11300/c8549585-abce-9786-9eb3-66a410309122.png)
MotionTargetを設定。
保存先のディレクトリ(存在しているもの)と、使っていない名前をつける。（上から2つのDirectoryとFileName）
再生ボタン押したあと、Save Motion to BVH を押す。
再生ボタンをもう一度押して画面を止めると、指定したディレクトリにBVHファイルができている。

めでたしめでたし。
Blenderなどで読み込めるので活用ください。

疲れたー。。。
もっといいほうほうあれば教えて下さい。
「とりあえず論理削除」をやめる

##はじめに
この記事はプログラミング初学者による備忘録用の記事であり、また、少しでも他の初学者のお役に立てればと思い書いています。

今回は、ユーザーデータ等を削除する際に論理削除ではなく物理削除を選択した理由について記事として記録したいと思います。

間違いなどがございましたら、ご指摘のほどよろしくお願い致します。

##論理削除とは
||論理削除|
|:--|:--
|概要|テーブルに削除フラグ的なものを立てて見かけ上はデータが消えている様に管理する|
|メリット|削除されたデータの復元が簡単にできる|
|デメリット|データは蓄積するので処理速度等の性能低下に繋がりかねない|
|SQL|UPDATE|

上記の特徴から、論理削除を導入する際のケースとして以下のようなケースが想定されます。

・ユーザーが誤って削除操作をしてもデータを復元できる様にするケース

・削除後もユーザーの投稿内容などを確認できる様にするケース

・削除処理後もバックエンドではデータとして残しておきたいケース

・誤って削除した場合の保険という意味合いで使用するケース

##物理削除とは
||物理削除|
|:--|:--
|概要|テーブルのデータ自体を削除する|
|メリット|データが削除される為、ストレージを圧迫しにくい|
|デメリット|一度削除してしまうとデータを復元できない|
|SQL|DELETE|

上記の特徴から、物理削除を導入する際のケースとして以下のようなケースが想定されます。

・設計時に削除しても大丈夫と決めたデータを削除するケース

##本当に論理削除が最適解なのか

私自身、論理削除と向き合うまでは、論理削除か物理削除のどちらかを選択しないといけない場合、誤って削除した場合の保険として論理削除を選択することがほとんどでした。いわゆる**「とりあえず論理削除」**です。

しかし、論理削除について調べていく中でこの**「とりあえず論理削除」**はいくつかの危険性を孕んでいることに気がつきました。
危険性について箇条書きでまとめておきます

``危険性:``

**1.パフォーマンスに影響を及ぼす可能性**
・データ量増大やそれに伴うパフォーマンスの劣化　※論理削除データが多い場合

**2.バグを生み出す原因になる**
・WHERE句への論理削除フラグの付け忘れをしてしまう可能性がある。
・論理削除を適用したモデル以外のモデルと間接的に関連付ける場合に、適用が漏れてしまう可能性がある。

**3.論理削除の「削除フラグ」は、「現在の状態」を表現するテーブルに過去の状態の一部を表現する機能を付与しているので煩雑なテーブルになる**
・開発途中に論理削除の導入が決定した場合、データベース設計を1から見直さなければならない可能性も出てくる。

**4.更新、削除をせず参照も少ないデータとして大量のデータが残ってしまう**
・1と同様にデータ量増大やそれに伴うパフォーマンスの劣化が起きる可能性がある。

他にも色々あると思いますが上記のような危険性について全く意識せずとりあえず論理削除を選択していた自分が恐ろしいです...。

##現段階では物理削除を選択する
現在の私のスキルでは、誤った操作を無かったことにしたり、データを復元する最適解を見つけることができないので、**UIを工夫して誤操作を防ぎながら物理削除でデータを削除する**ことを最適解とします。

##参考文献
・[SQLアンチパターン 幻の第26章「とりあえず削除フラグ」](https://www.slideshare.net/t_wada/ronsakucasual)
・[DELETE_FLAG を付ける前に確認したいこと。](https://qiita.com/Jxck_/items/156d0a231c6968f2a474)
・[1分でわかる論理削除 -メリットとデメリットを考える-](https://qiita.com/wanko5296/items/f1af9c7bf020e867c2dd#%E3%81%AA%E3%81%9C%E8%AB%96%E7%90%86%E5%89%8A%E9%99%A4%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%AA%E3%81%AE%E3%81%8B)