OmniAICreator/Qiita-1.07M huggingface dataset:
LinuxサーバーをTimeMachineのバックアップ先にしてみる(Ver. 2020)

この記事は[琉大 Advent Calendar 2020](https://adventar.org/calendars/5231)の12/15分の記事です。
(そして[琉大 Advent Calender 2019](https://adventar.org/calendars/4060)の12/21分の記事の2020年 Ver.です。~~手抜きともいう~~)

この時期ぐらいから年度末にかけて起こりそうなことで、怖いこと

- **論文やレポート作成中にPCが壊れる**
- **PCの中のゴミファイルを掃除してたら、間違って必要なファイルを消してしまった**

Macの場合、TimeMachineでバックアップしておくことで、こういったときにバックアップからファイルを復元できたりします。
外付けHDDを常時繋いでおけばそれでいいですが、常時接続は何かと面倒なので、ネットワーク経由でしてほしいなと
Macをネットに繋いでおくだけでバックアップしてくれるようにもなるし...

## TimeMachineを用いてネットワーク経由でバックアップするのに必要なもの
- Unix・Linux系サーバー
- Macの容量以上のストレージ
- Samba バージョン4.8以降

ハード面に関しては自宅サーバーをやったことがある人や研究室に余っているPCがある人なら、既にこの環境整っている人多そうだなと思います。(Raspberry Piとかを使ったら1万円でお釣りがきそう...
ソフトに関してはCentOSならCentOS 7以降、Ubuntuなら20.04 LTS以降の場合はクリアしてます。(Ubuntu 18.04 LTSの場合はイメージのベースがubuntu:focalやalpine:latestなdockerイメージを使えば大丈夫だと思います。)

ちなみに去年の記事ではAFP(netatalk)を用いたやり方を紹介していますが、Appleは2018年8月以降 **SMB(Samba)を用いるように推奨**しています。([Apple、Time MachineバックアップをサポートするネットワークボリュームからAFPを削除し、「Time Machine over SMB」のNASへ変更。 | AAPL Ch.](https://applech2.com/archives/20180818-time-machine-over-smb-support-nas.html))

## SambaをTimeMachine対応にしていく
1. avahiをインストール(`sudo yum install avahi`や`sudo apt install avahi-daemon`などを実行)して、有効にする

2. Sambaをインストール(`sudo yum install samba`や `sudo apt install samba`などを実行)

3. 設定ファイルの変更

追加する設定は以下の通り

```
[TimeMachine over SMB]   # エクスプローラーやFinderでの表示名
   comment = TimeMachine Folder   # コメント
   path = /mount/backup  # 保存先
   writable = Yes        # 書き込みできるようにする
   browsable = Yes       # Windowsのエクスプローラーなどに表示する
   fruit:time machine = Yes   # TimeMachineを有効にする
   fruit:time machine max size = 1T   # TimeMachineで使用する最大容量
```
保存したら、sambaを再起動します
後は[Appleのサポートの記事](https://support.apple.com/ja-jp/HT201250)の手順に従って設定してください。


##  最後に
明日の担当は[Hardwolf](https://adventar.org/users/40923)さんです。
Visual Basic Advent Calendar 2011

# はじめに
これは、[Visual Basic Advent Calendar 2020](https://qiita.com/advent-calendar/2020/vb)の14日目の記事となります。

テック系イベント支援サービス「ATND」が、2020年4月14日を最後にサービスを終了しました。
Visual Basic Advent Calendar 2011はATNDを使用していましたので、インターネットアーカイブから取得してきました。
https://web.archive.org/web/20130313055135/http://atnd.org/events/23108

[日本における技術系アドベントカレンダーの歴史](https://yhara.jp/2016/12/01/history-adcal-jp)
他の言語など記事が多くなったのは、2011年あたりからですね。

# Visual Basic Advent Calendar 2011
|日付|発表者|タイトル|
|:--|:--|:--|
|12月1日|-|-|
|12月2日|-|-|
|12月3日|-|-|
|12月4日|-|-|
|12月5日|-|-|
|12月6日|-|-|
|12月7日|KeiichiHara|[新しいプロジェクト作成時にVisual Basicを一番上に表示させる](http://codeseek.net/wordpress/?p=15) (リンク切れ)|
|12月8日|ちゅき|[Visual Basic .NETにおけるコンストラクタとデストラクタ](http://blogs.wankuma.com/chuki/archive/2011/12/08/221097.aspx)|
|12月9日|Ahf|[VB の xaml と C# の xaml](http://blogahf.blogspot.com/2011/12/vb-xaml-c-xaml.html)|
|12月10日|はつね|[[VB]Visual Basicには非同期が似合う](http://blogs.wankuma.com/hatsune/archive/2011/12/10/224915.aspx)|
|12月11日|tkinugaw|[VBで書くラムダ式](http://blog.tk-engineering.com/2011/12/11/vb%E3%81%A7%E6%9B%B8%E3%81%8F%E3%83%A9%E3%83%A0%E3%83%80%E5%BC%8F/) (リンク切れ)|
|12月12日|karuakun|[With](http://karuakun.wordpress.com/2011/12/12/with/)|
|12月13日|KeiichiHara|[Windows Phone 7開発もVisual Basicでね](http://codeseek.net/wordpress/?p=35) (リンク切れ)|
|12月14日|yoshioms2|[簡単にVBコードを確認するには](http://d.hatena.ne.jp/yoshioms/20111214/1323834792)|
|12月15日|ちゅき|[楽しい楽しい Visual BasicのNothing](http://blogs.wankuma.com/chuki/archive/2011/12/15/229573.aspx)|
|12月16日|Ahf|[文字列で指定した VB ソースを実行する](http://blogahf.blogspot.com/2011/12/vb.html)|
|12月17日|はつね|[[VB]非同期にはRxがあるじゃなか](http://blogs.wankuma.com/hatsune/archive/2011/12/18/230364.aspx)|
|12月18日|tkinugaw|[VB.NET で Razor記法を試す](http://blog.tk-engineering.com/2011/12/18/vb-net-%E3%81%A7-razor%E8%A8%98%E6%B3%95%E3%82%92%E8%A9%A6%E3%81%99/) (リンク切れ)|
|12月19日|karuakun|[Mono DevelopでVBのソースをコンパイルする。](http://karuakun.wordpress.com/2011/12/19/mono-develop%e3%81%a7vb%e3%81%ae%e3%82%bd%e3%83%bc%e3%82%b9%e3%82%92%e3%82%b3%e3%83%b3%e3%83%91%e3%82%a4%e3%83%ab%e3%81%99%e3%82%8b%e3%80%82/)|
|12月20日|masak|[Console.WriteLine(Nothing) を紐解いてみる](http://d.hatena.ne.jp/masa-k/20111220/1324382862)|
|12月21日|yoshioms2|[VBで型を省略したときの振る舞い](http://d.hatena.ne.jp/yoshioms/20111221/1324483979)|
|12月22日|Ahf|[VB6 でもクラスは役に立つ](http://blogahf.blogspot.com/2011/12/vb6.html)|
|12月23日|-|-|
|12月24日|-|-|
|12月24日|mihoch@nnel|[VB6アプリの延命を試みる](https://mihochannel.wordpress.com/?p=1522) (リンク切れ)|
|12月25日|tkinugaw|[今更な文字列長の話](http://blog.tk-engineering.com/2011/12/25/%E4%BB%8A%E6%9B%B4%E3%81%AA%E6%96%87%E5%AD%97%E5%88%97%E9%95%B7%E3%81%AE%E8%A9%B1/) (リンク切れ)|
|12月26日|はつね|[[VB]Windows Phoneアプリの実行時エラーを一元処理する](http://blogs.wankuma.com/hatsune/archive/2011/12/26/239621.aspx)|

# 最後に
2011年は私はまだ参加していませんでした。
【Swift】ぼんやりとDelegateの流れをつかむ

# 委任とは

考えるとややこしくなってきたがぼんやりと流れをつかむ。

## 委任側

「メソッドを使わせてくれ」とお願い**する**側。

```swift:NextViewController.swift
// 1. 規則を決める
protocol CatchProtocol {
  func catchData(count:Int)
}

class NextViewController: UIViewController {

  var count:Int = 0

  // 2. 1を deledele という名前の変数にする
  var deledele:CatchProtocol?

  @IBAction func push(_ sender: Any) {
    
    // 3. 発動する。引数が必要であれば渡す
    deledele?.catchData(count:count)
  }
```

## 受託側

「メソッドを使わせてくれ」とお願い**される**側。

```swift:ViewController.swift
// 1. 宣言する
class ViewController: UIViewController, CatchProtocol {

  @IBOutlet weak var label: UILabel!
  
  var count:Int = 0
  
  override func viewDidLoad() {
    super.viewDidLoad()
  }

  // 2. デリゲートメソッド。宣言したときのエラーで fix 押したら作られる
  func catchData(count: Int) {
    label.text = String(count)
  }
  
  @IBAction func next(_ sender: Any) {
    performSegue(withIdentifier: "next", sender: nil)
  }
  
  override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let nextVC = segue.destination as! NextViewController

    // 「NextViewControllerのdeledeleを任されました」という記述
    nextVC.deledele = self
  }
}
```

- ホントは `deledele` なんてトンチキな名前じゃなくて `delegate` とかにしたほうがチームメンバーなど他の人が見たときにわかりやすい
- 流れはなんとなくわかったけど最後の `self` がぼんやりしてる
エンジニア４５歳定年説についてちょっと思うこと


今はまだ２０代ですが、自分が４０代になったらどうなっているか、どうなっていたいかを考えることがあります。
また、実際に会った４０代でちょっとこうはなりたくないなと思う人もいます。
ちょっとそれをまとめておきます。

#自分が気になったアラウンド４５歳

我慢ができない
人の話を聞けない
人を待てない
すぐイライラする
態度が大きい
自分が正しいと思っている
若手を見下している
マウントを取りがち
人を小馬鹿にする
常に物事を自分主体に考える
新しいものやことに対して否定的

年齢を重ねると我慢が効かなくなってくるのかもしれません。
自分のことばかりでなく、しっかり相手に思いやりを持って接することが大事だと思います。
上記のような４０代になると定年（クビ）なのかなと思います。
そうならずに働き続けたいですね。

#今日の名言
You're never too old to learn. 
（学びに老い過ぎているということはない）
- ジョン・レイ (博物学者)
実務に入って足りないと感じたこと、それをどう乗り越えようとしているか

### はじめに 
<a href="https://qiita.com/advent-calendar/2020/gaogao">GAOGAO Advent Calendar 2020</a>の15日目を担当させて頂きます。イバです。

実務に入って半年が過ぎましたので、「実務に入って足りないと感じたこと、それをどう乗り越えようとしているか」についてまとめます。
「いや、それエンジニアとして当たり前やん!」と思われることばかりだと思いますが、あたたかく見守ってくだされば幸いです。

### ①もっとユーザー目線になる
実務に入って圧倒的に足りないなと感じたのが「ユーザー目線になる」ことです。
今までWebサービスを消費者側として使っていた人が生産者側になるのは想像以上の違いでした。

例えば、僕が使いやすいだろうと思って開発した機能も「こっちのほうが使いやすくない?」とPMの方からフィードバックを頂き修正することが多々ありました。

この点に関してPMと僕との違いは、技術力の違いというよりかは「よりユーザー目線に立てているか」それと、「他のサービスでは一般的にどのように作られているかを知っている」ことかなと思います。なのでこの差を埋めるためにすることは

- 本当にユーザーにとって使いやすい機能なのか自問を繰り返す
- 他のサービスを調査する

ことで改善していこうと思います。

### ②計画力をつける
着手しているタスクで精一杯で視野が狭くなってしまい「いつまでにこのタスクを終わらすのか」等、計画をせずに進めて、進捗が悪くなってしまうことがありました。

個人のサービスならまだいいのですが、チームで動いていたりクライアントさんがいる場合、進捗が悪いのは迷惑をかけてしまうので避けなければいけません。よって、

- 機能を実装する前に「いつまでに完成させるか」を明確にしてから実装に入る
- 進捗を細かく報告する

最近これらをすることによって少しずつ実装スピードが改善してきたので、引き続き取り組んでいきます。

### まとめ
半年の実務を通して「もっとユーザー目線になる」「計画力をつける」の2点が足りていないため伸ばしたいと思いました。

また、普段このようなアウトプットはあまりしないのですが、今回してみて頭の中の整理になったと感じているので、続けていければと思っています。
他言語の視点で見るRuby

# はじめに

[Ruby その2 Advent Calendar 2020 15日目の記事](https://qiita.com/advent-calendar/2020/ruby2)です！！


今年の秋頃に、[Ruby Association試験](https://www.ruby.or.jp/ja/certification/examination/
)を受けました。


その時の試験勉強中に、「Rubyだとこう書くのか〜〜」とか「Rubyだとこの意味になるのか〜〜」みたいなことがただあったので、本当に軽く紹介しておきます！！

（全然知らないことが多いので、多めにみてください。。。）


勉強した時の教材はこちらから。気になったは人はやってみてください！！
https://gist.github.com/sean2121/945035ef2341f0c39bf40762cd8531e0


# begin ~ resucue

Rubyの例外処理と言いたら、これ。
`begin`ブロック内で発生したエラーを`resucue`で拾い、エラーハンドリングをするものです。

```ruby
begin
  1 / 0
rescue ZeroDivisionError => error
  p error
end

# => #<ZeroDivisionError: divided by 0>

```

他の言語では、`try ~ catch`が大半だと思います。

```javascript
try {
  nonExistentFunction();
} catch (error) {
  console.error(error);
}

// > ReferenceError: nonExistentFunction is not defined
```


## Rubyでのtryとcatch
### try

Rubyにも`try`はありますが、例外処理のメソッドではなく、オブジェクトに対してのメソッドです。
https://www.rubydoc.info/docs/rails/4.1.7/Object:try


Rubyでの`try`は、`&.`と**ほぼ**同意義です。(`&.`のことを**nilガード**と呼ぶことが多いです。)
**「ほぼ」**なので、少しだけ違いがあります。

`&.`は、オブジェクトが**nilでない場合にメソッドを呼び出します。**
`try` は、オブジェクトの**メソッドを呼び出すことができるときにメソッドを呼び出します。**

```ruby
# &.
10&.to_s        # => "10"
10&.hoge        # => Error: undefined method `hoge' for 10:Fixnum (NoMethodError)
nil&.to_s       # nil

# try
10.try(:to_s)   # => "10"
10.try(:hoge)   # => nil
nil.try(:to_s)  # => nil
```


### catch

Rubyでの`catch`は、ブロック内で`throw`が走った時にその引数と一致していれば、抜けることができるものです。
`throw ~ catch`でワンセットですね。

```ruby
catch :error do
  puts "hoge"
  throw :error
  puts "fuga"
end
# => hoge
```

これはこれで、`begin ~ rescue`と書き方が似てはいますが、だいぶ違います。
詳しくはこちら。
https://qiita.com/harvath/items/e716179538bc1da30f88

例外処理よりかは、C言語の`goto`に近いものですね。


# *変数

C言語やGo言語を書いている人にとっては、`*変数`はかなり見覚えがあると思います。

みんな大好き、**ポインタ**です！

```go:tour_of_go.go

import "fmt"

func main() {
	i, j := 42, 2701

	p := &i         
	fmt.Println(*p) 
	*p = 21         
	fmt.Println(i)  

	p = &j         
	*p = *p / 37   
	fmt.Println(j) 
}

/*
42
21
73
*/
```

ポインタは、**値のメモリアドレス**を指します。
簡単に表すとこんな感じです。（例：go）

```go
i := 42
p := &i
	
fmt.Println(p)  // 0xc000122020
fmt.Println(&p) // 0xc000124018
fmt.Println(*p) // 42

fmt.Println(i)  // 42
fmt.Println(&i) // 0xc000122020
fmt.Println(*i) // エラーになる
```

|変数|値|アドレス値|
|:-:|:-:|:-:|
|i|i = 42|&i == p = 0xc000122020|
|p|*p == i = 42|&p = 0xc000124018|


ポインタについてはこちら。
https://qiita.com/yz2cm/items/01908cdfe56c304f2a14



ただ、Rubyでの`*変数`は**ポインタではありません！！**(初めて知った時、めっちゃポインタだと勘違いしていた。。。)

Rubyでは、**変数を配列にする**ものです。つまり、`to_a`メソッドと同じ意味のものです。
メソッドのキーワード引数につけると、**可変長引数**として利用できます。

```ruby
def foo (a, *b)
  p a, b
end

foo(1, 2, 3, 4)

# => 1
# => [2, 3, 4]
```


## **変数

ちなみに、Rubyでは`**変数`も書くことができます。これは、`Hash`を意味していることが多いです。

```ruby
def variadic_keyword(**hash_args)
  p hash_args
end

variadic_keyword(april:"spring", july:"summer")

# => {:april=>"spring", :july=>"summer"}
```

# 終わりに

本当にざっくり簡単に軽くまとめました！！

これ以外でもいろいろあると思うので、その都度更新していきます。
（試験の結果は聞かないでください。。。。）
呼び出すごとに１増える関数作りたい！ので作ってみた

```test.py
def fueru():
    global TanakaAtomicBomb
    if 'TanakaAtomicBomb' in globals():
        TanakaAtomicBomb += 1
        return TanakaAtomicBomb
    else:
        TanakaAtomicBomb = 0
        return TanakaAtomicBomb
```

# 使い方
下記の通り

```
print(fueru())
print(fueru())
print(fueru())
print(fueru())
print(fueru())
print(fueru())
```

```
$ python test.py
0
1
2
3
4
5
6
```
EKSへのkubectl get svcで｢error: You must be logged in to the server (Unauthorized)｣

# 症状
マネジメントコンソールでEKSを作成した時に

```
> kubectl get svc
error: You must be logged in to the server (Unauthorized)
```
となって確認ができない。

# 解決方法
コンソールにIAMのユーザーでサインインしてクラスタを作成し、同じユーザーでkubectlを実行する。

```
> kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.100.0.1   <none>        443/TCP   46m
```

# 説明
>Amazon EKS クラスターが作成されたら、クラスターを作成する IAM エンティティ (ユーザーまたはロール) は、system:masters アクセス許可が付与された管理者として Kubernetes RBAC 認証テーブルに追加されます。最初は、その IAM ユーザーのみが kubectl を使用して Kubernetes API サーバーを呼び出すことができます。

クラスタを作成した直後は、作成したユーザでのみ呼び出しが可能です。
**サインインするときに** IAMユーザーで入り、そのユーザーで操作を実施しましょう。

自分は同じユーザーだとすっかり勘違いをして、ルートユーザーでクラスタ作成を行っていました。
もし同じ症状の場合は、今一度の見直しを…。

他にもロールの設定不備でも同じ様なエラーが出るようなので、一つ一つ確認して解決されるとよいかと思います。

# 参考
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/create-cluster.html#create-cluster-console
プリザンターとPowerShellでパソコンの起動時間を記録する

#概要

パソコンが起動した時間をPowerShellを使ってプリザンターに記録してみましたので紹介します。

#前提条件

###プリザンター

- .NetFrameWork版

###ぱそこん側

- Windows 10 Pro


#プリザンターにテーブルをつくる

記録テーブルをあらかじめ作成しておきます
今回はテンプレートを設定せずにまっさらな状態で作りました。
![2020-12-23_00h21_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167316/c829f87e-5986-9771-8d99-506a080affc7.png)
変えた部分

- [分類A]を一覧に表示
- タイトルに　[担当者][分類A]　がセットされるようにする
- [作成時間]を起動時間という名前に表示変更


#PowerShellでスクリプトをつくる

プリザンターの分類Aに「かいはつパソコン」という文字列をセットしてレコードを新規作成する。というサンプルです

公式マニュアルのサンプルを参照しています
https://pleasanter.net/fs/publishes/1830428/edit

下記サンプルのURLとAPIKEYを環境に合わせて変更し、.ps1形式で保存します

### サンプルソース

``` StartupPC.ps1
Add-Type -AssemblyName "System.Web"
$error.Clear()

$requestUrl = "http://[プリザンターのアドレス]/api/items/[サイトID]/create"
$apiKey = "[プリザンターのAPIKEY]"

trap [Net.WebException] { continue; }
try{
    $json = @{
        ApiVersion = 1.1
        ApiKey = $apiKey
        ClassHash = @{
            ClassA = 'かいはつパソコン'
        }
    }
    $requestBody = $json | ConvertTo-Json -Depth 2

    #UTF-8にエンコード　これがないとプリザンター上で日本語が文字化けします
    $convertBody = [System.Text.Encoding]::UTF8.GetBytes($requestBody)

    $res = Invoke-RestMethod -Uri $requestUrl -ContentType "application/json" -Method POST -Body ${convertBody}
    Write-Output $res
}
catch {
    Write-Output $_.Exception
}
```

#起動用ショートカットを作成

PowerShell(.ps1形式）はWindowsデフォルトだとダブルクリックしても起動してくれません。

レジストリをいじる、など色々方法はありますが手っ取り早い方法として
ショートカットを作るという方法があります。

以下の記事でとてもわかり易く解説されています。
https://qiita.com/tomoko523/items/df8e384d32a377381ef9

|設定項目|設定例|
|:---|:---|
|リンク先|C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy RemoteSigned -File D:\test\StartupPC.ps1|
|作業フォルダー|（空白）|

![2020-12-23_00h32_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167316/d058de0c-7238-de8d-635d-ea9d0dc96a30.png)

.ps1ファイルは必ずフルパスで指定してください

#スタートアップに登録

Windows10のスタートアップフォルダに作成したショートカットを配置します
アドレスは

```
C:\Users\[ユーザ名]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
```

です。（いつも忘れる・・・）


#結果

再起動するたびにドンドンレコードが追加されていきます。
![2020-12-23_00h06_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167316/1e6dff75-7856-1848-c40f-9eb3c581073a.png)
プリザンターの「作成時間」をパソコンが起動した時間としています
（仕事中に再起動しまくってる）

#さいごに

シャットダウンの時間も取れればいなと思ったのですが、少しコツがいるようです。
進捗があれば記事にしたいと思います。
ファイルを探すときは人から「Delve」

## はじめに
　当記事はこちらのOffice 365 アドベントカレンダーに参加しています。[Office 365 Advent Calendar 2020 - Adventar](https://adventar.org/calendars/5362)

　いつ、どのような環境でもよくあるのが「ファイルを探す」ということですね。特に自分が作ったのならまだしも、仲間が作ったものだと、SharePointなのか、OneDriveなのか、それとも....とちょっと大変です。
Micorosoft 365環境下では、ファイルを、ファイル名や置き場所から探すのではなく、「あの人が書いていたファイル」と**人**から探すことが多くなりました。

### Delveを使う
 Microsoft 365 ポータル（[Microsoft Office ホーム](https://www.office.com/)）からアプリの一覧を出し、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/5b87a110-0ee8-3450-72d2-1b91e9d3c043.png)

この赤いルックスのアイコンを呼び出します。
Delveのトップ画面では「アクセス数が多いドキュメント」ということで、最近の更新かつアクセス数が多いドキュメントが表示されます。
各ドキュメントには「○○個のビュー」としてアクセス数が表示され、よく使われているファイルがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/22d86905-c320-b4f5-7ed0-086fad410499.png)

そして自分がアクセス権がある共有されているファイルのみ表示されます。

### 人からファイルを探す

左上の検索欄で、同じ組織の仲間を検索してファイル候補を出します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/1143ec76-070c-39cc-f1af-fef0b7c549d1.png)

そうすると、その方と共有しているファイルに絞られます。
ここでもアクセス数もわかりますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/f68e65e2-dd15-2dd6-b12b-e6b0041fb44e.png)

このようにして目的のファイルに早くたどりつけます。

## おわりに
　慣れると、何かと Delveからとなってきました。Delveは「掘り下げる」という意味ですね。助かります。
CentOS7環境でzipからのOracle Database 19c インストールでつまづいた点

# CentOS7環境でzipでのOracle Database 19c インストールでつまづいた点

##目的
Bronze DBA Oracle Database Fundamentalsの資格取得の為。
RPMからのインストールの方が恐らく楽ではあるが、黒本でのインストール手順を参考にzipでの
インストール→データベース作成→sqlplus起動確認　まで。


##インストール・DB作成時エラー
```Can't connect to X11 window server using 〇〇 as the value of the DISPLAY variable.
```
oracleユーザーでecho $DISPLAY　にてDISPLAY関数を確認しようとするも、空白を返される。

###対処方法
#####<1>rootにてログインし、

```database:root
$ echo $DISPLAY
〇〇(rootでログインしている時のDISPLAY関数が表示される)

$ xhost +

（access control disabled, clients can connect from any host.
と出ればOK）
```


#####<2>oracleユーザーに戻り

```database:oracle
$ cd /u01/app/oracle/product/19.3.0/dbhome_1(zipファイルを解凍した場所)

$ export DISPLAY=〇〇(rootで確認したDISPLAY関数)

$ echo $DISPLAY
〇〇(先ほど打ち込んだDISPLAY関数が反映される)

インストーラー or dbcaが問題なく起動すればOK

```

##SQL*Plusのコマンドが見つからない
####対処方法

```database:oracle
 $ sqlplus
コマンドが見つかりませんでした
↓
$ORACLE_HOME/bin/sqlplus　で起動確認
```
環境変数が正しく設定されていなかったのが原因。

##環境構築参考
[【oracle】Oracle19cインストール](https://ameblo.jp/yukozutakeshizu/entry-12492290572.html)
[VirtualBox上のLinuxにコンパクトにオラクルデータベース（19c）を構築](https://qiita.com/FiftyStorm/items/9d4c2142b7aa0c212afc)
[Docker]dokcer-compose run で Please run `yarn install –check-files` to update.エラー

##はじめに
Docker環境を構築してる際にエラーが出たので、その解決方法をメモととして記事に残します。


##Docker内の環境
ruby 2.6.3-alpine3.10
rails 6.0.1
 

##事象
dokcer-compose run を実行すると下記エラーコードが出た。

エラーコード

```
Please run `yarn install –check-files` to update.
```

 

##対処方法
config/environmet/development.rb に下記のyarnの設定に関するコードを追加する

```
config.webpacker.check_yarn_integrity = false
```
 

以上で解決できると思います。
【備忘】

【備忘】
IDE とコンパイラーの関係性


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956223/69f0a7de-cadc-cc5f-3baf-817b434c53d9.png)

https://ednjapan.com/edn/articles/1306/17/news003_2.html
Power BI上のPower Appsのシンプルな使い方案

## はじめに
　先日、 [Power BI上にPower Appsを表示させてリアルタイムに更新、反映させよう! Dataverseで - Qiita](https://qiita.com/ishiayaya/items/94c764723333d25221bf) という記事を書きました。
この中では、

- Dataverseを使う
- TDS endpointをオン
- Power BIのDirectQueryモードを使う

等ややごちゃごちゃした内容になりましたので、よりPower BIからPower Appsをシンプルに使う例を説明します。

### テキストが多くある部分をPower Appsに

Power BIで作ったビジュアルで、最後に1レコードのカード形式のようなデータを出す場合、テキストが多くなるよという例を考えます。できあがりはこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/93035fdf-68af-f0d7-23d7-09850ed4c38f.png)

左の「分類」はPower BIのスライサーで、そこで絞りこまれたデータが右のPower Appsです。

### 視覚化からPower Appsのビジュアルを呼び出し

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/9b19fd88-2109-8f9b-2065-1fefecd4fc55.png)

実際にPower Appsで使う項目を呼び出します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/522869c8-5cc5-d6bc-6126-f37a12ac4fe2.png)

それで新規作成ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/0f475f7d-393e-7b22-61e8-53e532074863.png)

一度保存したものを呼び出すには編集からです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/11ea6417-d4f6-348f-94b1-1d69bcfd0c2c.png)

### キャンパスを空にしてスタート

最初に絞り込まれた複数候補を呼び出すために、ドロップダウン等を指定します。
その後、Itemプロパティに「PowerBIIntegration.Data」を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/ac8c997a-0a94-5471-7728-3db497855c62.png)

そこで選択されたデータをラベル等に表示するために、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/3367c03a-fa51-77f4-d793-047c202250f0.png)

といった形で指定します。Power BIの視覚化で読み込まれたフィールドが
表示されるわけです。

## おわりに
　Power BIが好きなことからPower Appsも使いシンプルに容易に連携できることに感心します。
もちろんこの延長で、（[前回書いたように](https://qiita.com/ishiayaya/items/94c764723333d25221bf)）データの中身を更新する等もできますが、テキストが多いような場合にシンプルに表示するだけでも使えるなぁと思いました。
[Jest]document.activeElementを使えるようにする方法


##はじめに
document.activeElementのテストをJestで書いていた時に沼にハマったので備忘録として残す

##モック方法
mountでtemplateを定義した後、attachToでdocument.bodyを定義することでdocument.activeElementを使う事が出来るようになる

```component.spec.js
const wrapper = ('component', () =>
    mount({
      template: `<div>
        <input type='text' />
        <input type='text' />
        <input type='text' />
      </div>`,
    },
    {
      attachTo: document.body,
    })
```

##参考
https://qiita.com/ykhirao/items/8e8a9547a693c677813c
https://vue-test-utils.vuejs.org/ja/api/options.html#attachtodocument
[HTML] レスポンシブデザインのためのmetaタグ viewport

###metaタグ viewport

HTML 自分用の覚え書きです。

レスポンシブデザイン（タブレット、スマホの場合に表示を変えたい場合）には、metaタグ viewport を指定します。

CSSのメディアクエリにて、ウインドウ幅の指定により表示が変わるように記述します。

```html:index.html
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
```

```CSS:stylesheet.css
/* PC向けのCSS */
/* menuクラスに適用されるCSS */
.menu{
  background-color: #00FFFF;
}

/* ウインドウ幅が1000px以下のとき */
@media (max-width : 1000px) {
  /* menuクラスに適用されるCSS */
  .menu{
    background-color: #00FF00;
  }
}

/* ウインドウ幅が500px以下のとき */
@media (max-width : 500px) {
  /* menuクラスに適用されるCSS */
  .menu{
    background-color: #FF0000;
  }
}
```
【初心者でもわかる】1文字だけ〇〇する方法

# どうも7noteです。1文字だけにいろいろなCSSを当てる方法について書いていきます。

## 1.「1文字目を大きくする」

![sample1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/0e9bc48e-6514-0d18-6248-ae126b4db979.png)

文中の一番最初の文字を大きくします。
例では文字サイズを2倍にして、太字と赤文字にしています。

```style.css
p:first-letter{
  /*適用したいCSS*/
}

/* 記述例 */
p:first-letter{
  font-size: 200%;
  font-weight: bold;
  color: #f00;
}
```

※疑似セレクタ`:first-letter`はインライン要素には効かないので注意！

## 2.「1文字だけ回転・反転させる」

![sample2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/d2f5f95c-a3a0-8dfe-46ed-04535ad553c8.png)

たまに回転していたり、反転していたりする文字を見かけます。（例えが思いつかない・・・）
CSSで文字の反転や回転を表現する時は`transform`を使うのがよいでしょう。

```index.html
<p>あいう<span>え</span>お</p>
```

```style.css
/* 180度回転 */
p span {
  transform: rotate(180deg);
  display: inline-block;
}

/* 左右反転 */
p span {
  transform: scale(-1,1);  
  display: inline-block;
}
```

※trnasformを複数重ねがけする時は半角スペースで繋ぎます。

```
p span {
  transform: rotate(180deg) scale(-1,1);
}
```

## 3.「1文字だけ消す」

![sample3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/27631a1a-deae-5f0d-857f-d7f419d85198.png)

2でやった`<span>`でくくる方法と同じです。
当てるCSSを変えるだけで様々なCSSに対応させることができます。

```style.css
/* 消した空間は残す場合 */
p span {
  visibility: hidden;
}

/* 消した空間も消す場合 */
p span {
  display: none;
}
```

## まとめ

1文字だけや部分だけ変更してアクセントをつけたりする方法でした。
インパクトをつけたり、他とは差別化を図れるちょいテクです。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
画像リンク付Markdownの表をexcelで編集できるようにする方法

# モチベーション

画像を貼り付けたマークダウンの表をエクセルで編集したい！ということがありました。（トレードオフ表や台帳）
ところが、VScodeのプレビューをエクセルにコピペしても、画像のリンクを持ってくることが出来ませんでした。
画像のリンクが付いてこないと、編集後エクセルからマークダウンにコピペした後、画像のパスを打ち直す必要があり、大変です。
ということで、pythonでスクリプトを作ることとしました。（かなり、やっつけ仕事ですが）

# やったこと

1. VScodeのマークダウンの表をコピー
1. 下記のコードを実行
2. エクセルへ貼り付け
3. エクセルで編集
4. エクセルでコピー
5. VScodeに貼り付け

画像のリンクが付いているので、何もしなくても画像が表示される！素晴らしい

```md_table2df.py
import mistune
import pyperclip
import pandas as pd
import re

md = mistune.Markdown()
res = md(pyperclip.paste())#クリップボードからテキストを取得して、HTMLに変換
pattern = '<img src="(.*)" alt="(.*)">'
rep = '![\\2](\\1)'
rep_tex = re.sub(pattern,rep,res)#画像の部分をマークダウン記法に変換
df = pd.read_html(rep_tex)[0]#dataframe作成
df.to_clipboard(index=False)#エクセルに貼り付けるため、クリップボードへコピー
```
【コードの説明】
手順は正直まどろっこしい。。。もっといい方法ありそう

1. マークダウンのテキストをクリップボードから取り出し
2. 取り出したテキストをHTMLへ変換
3. HTMLの画像の箇所を正規表現を使用してマークダウン記法に置換
4. pandasでHTMLから表を作成
5. その表をクリップボードへ入れる

# 感想
ググってもありそうで、なかったです
プレビュー画面をコピペすれば、大部分はエクセルに持ってこれるので、あんまり需要ないのかな
それとも他に良い方法があるのかなぁ
Google Maps SDKをWebGLで動かす

本記事は、株式会社ピー・アール・オーアドベントカレンダーの15日目です。
# 単なるTipsです。
表題のとおりです。実際にやってみたらハマったので備忘録を兼ねて書いておきます。

# 基本的なやりかた
## Unity側でWebGLを有効にします。
File > Build Setting...から、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221091/ed115d4b-09f1-3c41-0602-7489146a1077.png)

## WebGLを選択し、Development Buildにチェック入れます。
WebGL有効にしてなかった人はここでインストール求められるはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221091/b09c21a9-1f06-2c2a-5c9b-6f5ca86db261.png)

## Build And Runで実行
出力先フォルダ指定したら、ビルドが始まります（結構待たされる）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221091/6aa7a921-365b-b462-e209-e463fb64fe7c.png)

## ブラウザ起動
ビルドが終わると勝手にブラウザが立ち上がってビルドしたものが見れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221091/61a027f9-6ad2-689b-c5f3-cb49f3947150.png)

## うまくいかないとき
### 何のエラーも出ないけど描画がされない
Cache OptionのMax Disk Bytesをゼロにするといいらしいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221091/b55a51f3-7eca-b083-bef2-21252139fa77.png)

### CORS関連のエラーが出る
これが厄介かもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221091/eaf76365-52a6-765c-b522-86ffa9374592.png)

とりあえず動かしたいという向きには、[こちら](https://qiita.com/shika-e/items/808ccdd047133315b95c)を参考にブラウザの方でチェック無効にしちゃうと言う手があります。

# 最後に
Google Maps SDKはWebGLは公式にはサポートされてないらしいので、その前提で使いましょう。

![ダウンロード.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221091/bb27123e-c98f-18b9-6860-d5d350299852.gif)
【FileMaker】某Youtubeみたいにピクチャ・イン・ピクチャで動画再生

某Youtubeなどで動画を観ていると、動画をスワイプすることでピクチャ・イン・ピクチャモードで動画再生が続いていて他の動画を探せる、というような動作ができますね。

FileMakerでも、もちろんできます。

# FileMaker バージョン
このピクチャ・イン・ピクチャができるのは、バージョン16以降です。
[16で新規追加の機能](https://support.claris.com/s/article/FileMaker-Go-16-AV-Player-%E3%81%AE%E6%A9%9F%E8%83%BD%E5%BC%B7%E5%8C%96-1503693095916?language=ja)です。

# 動きを確認
では、どんな動きか見てみましょう。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">意外と知らない人もいるかもしれない。。。<a href="https://twitter.com/hashtag/FileMaker?src=hash&amp;ref_src=twsrc%5Etfw">#FileMaker</a> <a href="https://twitter.com/hashtag/FileMakerGo?src=hash&amp;ref_src=twsrc%5Etfw">#FileMakerGo</a> <a href="https://t.co/aViAyv22Fd">pic.twitter.com/aViAyv22Fd</a></p>&mdash; Guppy Web Service (@GuppyWebService) <a href="https://twitter.com/GuppyWebService/status/1338823232573435904?ref_src=twsrc%5Etfw">December 15, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# どこをタップすればいい？
ここです。
湯婆婆に睨まれてますが、負けずにアイコンをタップします。
![スクリーンショット 2020-12-15 21.13.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/5979ae1d-a932-ca2b-cb04-41007193f4ad.png)

つまり、[iOSで標準で実装されている、ピクチャ・イン・ピクチャ機能](https://support.apple.com/ja-jp/guide/iphone/iphcc3587b5d/ios)を使っているわけです。

ということは、iPhoneやiPadを普段使い慣れていれば、FileMakerで再生される動画の操作は某Youtubeと同じように使えるわけです。

FileMaker Goでも動画を観ながら他の作業をできる、ということが誰かに刺さりますように。
macでGNUコマンドを使う

## 背景
Unixコマンドを書籍やブログ通りに実行しても同じ結果にならない。。。ので調べていると、UnixコマンドはBSD系のOS（macOSやFreeBSD）とLinux系のOS（GNU）で異なる実装がされているのですね。
自分の環境（macOS）でもGNUコマンドが使用できるようにします。

参考：[Homebrew で macOS に GNU コマンドをインストールする](https://yu8mada.com/2018/07/25/install-gnu-commands-on-macos-with-homebrew/#article-title)

## 環境
PC: MacBook Pro 2020
OS: macOS Catalina (10.15.5)
shell: zsh (5.7.1)

## 方法
Homebrewでインストールします。

```sh
brew install coreutils
brew install grep
```
coreutilsではcutやsortなど複数のコマンドがインストールされます。
![root_cb6ba2bbd7c6___Users_tt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/dfa4d32a-2f4e-d73c-4e8c-e050651e2805.png)
既存のコマンドと区別するためGNUコマンドはgを先頭につけるようにとあります。すなわちGNUのcutやsortを使う場合はgcutやgsortと入力します。
coreutilsでインストールされたコマンドは「/usr/local/Cellar/coreutils/8.32/bin」にあります。
![root_cb6ba2bbd7c6___Users_tt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/f4179974-638f-5fbf-ebb8-373617ebaabd.png)
個人的に使いたかったgrepはcoreutilsには含まれていないので別途インストールしています。

## 結果
grep（BSD grep）とggrep（GNU grep）のバージョン情報を表示させてみます。問題なくインストールできているようです。

```sh
grep --version; ggrep --version
```
![root_cb6ba2bbd7c6___Users_tt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/d6050b04-7170-d64c-d1cd-a75ceb140c2a.png)
（解決方法）Mysql2::Error: Field 'カラム名' doesn't have a default value

ユーザ管理機能実装にあたって、deviseを導入し、いざ新規登録をしようとすると、タイトルのエラーが発生した。
その解決方法と原因について記す。

## 解決方法
deviseのストロングパラメーターを設定する。
以下にコード例を示す。

```rb:application_controller
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  private
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname, :first_name, （複数のカラム名）])
  end
end
```


## エラーが発生した原因
エラー文の内容は、『mysqlに指定したカラム名はデフォルトの値で設定されていません』というもの。
deviseにデフォルトで設定されているカラムは、emailとpasswordだけである。そのため、それ以外のカラムをdeviseを通じて保存しようとしても、当然ユーザ情報を保存できない。

## なぜ解決されるのか
上記のコードにより、emailとpassword以外のカラムをユーザ情報として、deviseを通じて保存できるようにしている。
したがって、デフォルトで設定されていないカラムも保存できるようになり、エラーは解決される。
マイグレーション後のテスト反省点

# はじめに
これは、[ソフトウェアテスト Advent Calendar 2020](https://qiita.com/advent-calendar/2020/softwaretesting)の15日目の記事になります。
最初は「[組み合わせテストツール](http://yaju.sakura.ne.jp/wiki/doku.php?id=it%E6%8A%80%E8%A1%93:%E3%83%86%E3%82%B9%E3%83%88:%E7%B5%84%E3%81%BF%E5%90%88%E3%82%8F%E3%81%9B%E3%83%86%E3%82%B9%E3%83%88%E3%83%84%E3%83%BC%E3%83%AB#%E7%B5%84%E3%81%BF%E5%90%88%E3%82%8F%E3%81%9B%E3%83%86%E3%82%B9%E3%83%88%E3%83%84%E3%83%BC%E3%83%AB)」について書こうと思っていたのですが、たんなるリンク集っぽくなってしまったので切り替えました。

# 移行作業
2018年からサーバーリプレース作業でWindows Server 2008R2 + Oracle 11g から Windows Server 2016 + PostgreSQL 9.6 に移行作業をし、コロナ禍で出張が延期になるなど影響がありましたが、1年(月1〜3拠点)かけて全国25箇所の導入作業が2020年9月に完了しました。
[OracleからPostgreSQL移行について](https://qiita.com/yaju/items/7cf5ab6987ecd1d83b13)

移行検討するアプリケーションは40ほどありましたが、廃止および新規作り替えなどがあり最終的には30くらいになりました。この中にはDelphi 5(1999年に発売)で作成されたアプリケーションは結構あり、C#に切り替えるようにしていきました(全部は無理だった)。私が現在の会社に2009/09に来たのですが、その時点で未だにDelphi 5を使用しているのは驚きでした。まーこういう機会でもないと作り替えできないよね。
使用するユーザーは同じグループ会社ということもあって、テスト環境は幅広く考える必要はない。

# 作り替えのテスト
当時作成した担当者は別のチームに移動していたり退職されてしまっており、仕様書は一応あるものの心許ない状態です。テスト仕様書についても改善した機能のみのテスト仕様書がバージョンごとにExcelシートになっている状態です。
Delphi 5のソースコードを元にC#(ASP.NET Web API)に移植していきました。テスト仕様書は改善部分のシートになっていたのを精査して1つにまとめ上げたものでテストしてなんとか移植作業は終えました。
今度はサーバーとデータベースに切り替わるので、社内環境でテストしたもののユーザー側にはそのまま本番導入になります。

# 問題発生
## 問題①
ユーザー検証でインターフェイスのアプリケーション(Delphi→C#変更)の１回ごとの起動処理が３秒ほどかかるとして、当初は原因が不明でDBを使わないアプリケーションだったこともあり、従来のDelphi版で使用することになりました。

その後にいろいろ調査して、固定IPアドレスとプロクシの自動検出が原因でした。
[【.NET】HttpClientの初回が遅いのはプロクシの自動検出が原因](https://qiita.com/yaju/items/771bdf1eddcd2f35bf06)

## 今後の改善①
ユーザーの環境にもっと寄り添って考えるべきであった。ネットワーク環境という観点は漏れていた。
解決方法も分かったのだが未だにDelphi版のまま。最初のつまづきが尾を引いてしまった。来年こそはC#版に切り替えてもらうぞ。

## 問題②
今まで読めていたデータの1つが、エラーになって読めないようになった。
原因は性能検証した際にインデックスが使われないことが分かりSQLの内容を変更したが、そのSQL自体に間違いがあった。

## 今後の改善②
性能検証した後にSQLを変更したのだから、簡易テストに留まらずに再度テストすべきでした。

## 問題③
バーコードを読むアプリケーションでデータが登録されないことがあるとの報告が挙がりました。
原因はバーコードの種類や読む順番にパターンが多くあり、とあるパターンではデータ登録処理が呼ばれず画面だけが戻ることが分かりました。

## 今後の改善③
テスト用のきれいなパターンでのみテストして、実践で使用されるパターンが漏れてしまっていた。
ユーザーの読み込みログやデータベースのデータは取得できるのだから、何日分かの実際のデータを使用して問題ないか確認する必要があった。
大量のデータを順次読めるように自動化するアプリケーションを開発する。

# 最後に
上記以外にも幾つか問題があったのですが、何とかやってます。
当日書くもんではないですな。うまく文章が纏まらない。
APIをお手軽にコマンド化する方法

ある日、`pip search`コマンドを打ってみたらエラーが出ました。


```sh
> pip3 search pymongo
ERROR: Exception:
# -- 中略 --
 'RuntimeError: This API has been temporarily disabled due 
to unmanageable load and will be deprecated in the near future. 
Please use the Simple or JSON API instead.'
```

色々書いてあるけど要するに「apiあるからそっち使いな」ってことかな。
調べてみたらpipには`Simple`と`JSON`のapiがあるようです。

[https://pypi.org/simple/env-paths/](https://pypi.org/simple/env-paths/)
[https://pypi\.org/pypi/env\-paths/json](https://pypi.org/pypi/env-paths/json)


これならサクッと必要な情報だけ抜いてスクリプト化できそう。
`Simple`はhtmlが返ってきて使いにくそうなので`json`の方を使います。

pythonで書こうかと思ったんだけど、簡単そうなので慣れないシェルスクリプトで書いてみます。

## 完成品

結論から言うと、以下のコードを`.zshrc`に書くだけです。

```sh
function pips() {
  curl -s https://pypi.org/pypi/$1/json | sed '2,$d' | sed 's/^[^{].*/{"info":{"package_url":"404 not found"}}/' | jq --raw-output .info.package_url
}
```

機能が`pip search`の代替えなので名前は`pips`にしました。
jsonの処理に`jq`コマンドを使うのでインストールしました。ほとんどの環境でワンライナーインストールできます。

[Download jq](https://stedolan.github.io/jq/download/)

## 解説

```sh
curl -s https://pypi.org/pypi/$1/json
sed '2,$d'
sed 's/^[^{].*/{"info":{"package_url":"404 not found"}}/'
jq --raw-output .info.package_url
```

この4つをパイプで繋いでるだけです。2行目3行目はエラー処理しているだけなので必要なかったら`curl`と`jq`を`|`で繋げればOK

1行ずつ解説します。

```sh
curl -s https://pypi.org/pypi/$1/json
```

ご存知`curl`でapi取得してます。`$1`は探したいパッケージ名なので引数として渡してます。
`pips hoge`とコマンドを打ったら`$1`に`hoge`が入ります。
オプション`-s`でログが出ないようにしています。

```sh
jq --raw-output .info.package_url
```

ちょっと飛ばして4行目。apiから返ってきたjsonをjqに渡します。jsonは色々書いてあるけど省略するとこんな感じ。

```json
{
  "info": {
    "author": "atu4403",
    "name": "env-paths",
    "package_url": "https://pypi.org/project/env-paths/",
    "platform": "",
    "project_url": "https://pypi.org/project/env-paths/",
    "project_urls": {
      "Homepage": "https://github.com/atu4403",
      "Repository": "https://github.com/atu4403/env-paths"
    }
  }
}

```

この中の`package_url`だけ欲しいので`jq`に渡すのは`.info.package_url`となります。ちなみに`.`はrootになります。
通常ならダブルクォーテーション付きの文字列が返ってきますが、`--raw-output`オプションでrawなoutがputします。

これだけでも実行できますが、この状態では登録されていない文字列でコマンド実行した時にエラーになります。apiが返すhtmlをjqに渡してもjsonじゃないので処理できない為です。
そもそもの目的が`pipに登録する為にパッケージ名が使われていないか調べたい`なので、ここはキッチリ処理したいところです。


```sh
sed '2,$d'
```

apiから返ってきたテキストの2行目以降を削除しています。エラーの場合、複数行のhtmlが返ってくるので次の処理を行数分行ってしまいます。正しくjsonが返ってきた時は1行なのでこの処理は影響しません。

```sh
sed 's/^[^{].*/{"info":{"package_url":"404 not found"}}/'
```

正規表現`/^[^{].*/`で処理を分けています。ザックリ言うと`{`で始まってない場合は
`{"info":{"package_url":"404 not found"}}`という文字列を返します。
jsonなら`{`で始まっているので何もしません。

---

以上を`function`で囲んだのが冒頭のコードです。これを`.zshrc`や`.bashrc`の適当な場所に置いて完成です。
実行結果はこちら。


```sh
> pips

> pips tdst
404 not found

> pips pymongo
https://pypi.org/project/pymongo/
```

## まとめ

私はシェルスクリプトあんまり知らないのですが、結構簡単にできました。
認証が必要ならcurlで処理する方法もネットには溢れています。
シェルスクリプトに苦手意識持っている方も是非チャレンジしてみてください！
【Ruby ~繰り返し処理~】勉強メモ4

Rubyの復習。
ほぼ自分の勉強メモです。
過度な期待はしないでください。


繰り返し処理
-
- eachメソッド

eachメソッドを使うと、配列の要素を順番に取り出して処理を行うことが出来る。
使用方法は、「配列.each do |変数名|」と書き、「end」までの間に実行したい処理を書く。

```.text:書き方
配列.each do |変数名|
  # 処理
end
```

eachメソッドは、配列の要素の数だけ繰り返し処理を行う。
「|　|」で囲まれた変数に配列の要素が1つずつ入っていき、その上でeachメソッドの中の処理が実行される。
eachメソッド内の変数名は、好きな名前をつけられますが、配列の変数名の単数形にすることが慣習上多い。

```.ruby:使用例
colors = ["赤色", "青色", "黄色"]
colors.each do |color|
  puts "色: #{color}"
end
```

```.text:出力結果
色: 赤色
色: 青色
色: 黄色
```
カテゴリーデータを数値データに変換する

### 1. はじめに
文字で与えられるカテゴリーデータを数値データに変換するやり方の一例として、指定した数字に置き換える方法、カテゴリーのカウント数に置き換える方法、についてメモしておきます。

### ２. ライブラリ、データを読み込む
データ例として、KaggleのTitanicデータを使用します。

```python
import numpy as np
import pandas as pd

train = pd.read_csv("./input/train.csv")
test = pd.read_csv("./input/test.csv")
data0 = pd.concat([train, test], sort=False)
```

```python
data0.columns

#  Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
#         'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'], dtype='object')
```

### 3. 空欄（nan）を埋める
'Embarked'のデータで変換してみます。

```python
data0['Embarked'][0:6]

#   0    S
#   1    C
#   2    S
#   3    S
#   4    S
#   5    Q
#    Name: Embarked, dtype: object
```


```python
#文字データの種類を調べる
data0['Embarked'].unique()

#array(['S', 'C', 'Q', nan], dtype=object)
```


```python
#nanを数える
data0['Embarked'].isnull().sum()

#2
```


```python
#文字データをカウントする(before)
v0 = data0["Embarked"].value_counts()
v0

#    S    914
#    C    270
#    Q    123
#    Name: Embarked, dtype: int64
```


```python
#nanを'S'で埋める
data0['Embarked'].fillna(('S'), inplace=True)
```


```python
#文字データをカウントする（after）
v1 = data0["Embarked"].value_counts()
v1

#    S    916
#    C    270
#    Q    123
#    Name: Embarked, dtype: int64
```

### 4-1. 文字データを指定した数字に置き換える 

```python
data = data0
v2 = { 'S':0, 'C':1, 'Q':2 }
data['Embarked_1'] = data['Embarked'].map(v2)
data['Embarked_1'][0:6]

#    0    0
#    1    1
#    2    0
#    3    0
#    4    0
#    5    2
#    Name: Embarked_map, dtype: int64
```

### 4-2. 文字データをカウント数に置き換える

```python
data=data0
vc = data['Embarked'].value_counts()
vc

#    S    916
#    C    270
#    Q    123
#    Name: Embarked, dtype: int64
```


```python
data['Embarked_2'] = data['Embarked'].map(vc)
data['Embarked_2'][0:6]

#    0    916
#    1    270
#    2    916
#    3    916
#    4    916
#    5    123
#    Name: Embarked_count, dtype: int64
```
Rails それぞれの命名規則をまとめみた

ControllerやModelをコマンドで作成する際に
単数形だっけ、複数形だっけ？となるのでまとめました

##概要
Railsでは、
基本理念の1つ **CoC (Convention over Configuration, 設定より規約)** が定義されています

CoCとは、初心者が意識しなくてもよく
>熟考をしなくてよくなるだけでなく、より深い抽象化を育ててくれる

と、記事に書いてあります
[引用記事](https://postd.cc/rails-doctrine/#convention-over-configuration)

つまり、開発者の決定すべきことを減少させ、単純にするということ

##Controller編
**複数のactionを持つ**ため、**複数**系

|種類                |例                 |説明                |
|:-:                |:-:                |:-:                |
|コントローラー名      |users              |複数形              |
|ファイル名           |blogs_controller.rb|複数形              |
|コントローラークラス名 |UsersController    |キャメルケース        |
|**コマンド**         |rails g **controller users**|複数形       |::

```rb:app/controllers/users_controller.rb
class UsersController < ApplicationController
  def index
  end
end
```

##Model編
Modelは設計書のようなもの
**設計書は1つ**なので**単数**形

**テーブルには複数の情報**が保持されているので**複数**形
マイグレーションファイルや、クラスはテーブルを作るものなので
それに関連して、同じく**複数**形

|種類                |例                 |説明                |
|:-:                |:-:                |:-:                |
|モデル名             |user              |単数形              |
|ファイル名           |blog.rb            |単数形      |
|モデルクラス名       |User                |単数系、頭文字大文字  |
|テーブル名名           |users            |複数形      |
|マイグレーションファイル名       |☓☓☓_create_users.rb  |複数形|
|**コマンド**             |rails g **model User**|単数形          |

```rb:app/models/user.rb
class User < ApplicationRecord
  has_many :articles
end
```

```rb:db/migrate/2020☓☓☓_create_users.rb
class CreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      t.string :name
      t.string :email

      t.timestamps
    end
  end
end
```


##View編
**フォルダ配下に複数のViewファイルを持つ**ため、**複数**形

|種類                |例                 |説明                |
|:-:                |:-:                |:-:                |
|フォルダ名             |users              |複数形              |

##Routing編
Routingの**リソース名はController名**に基づいているため、**複数**形

|種類                |例                 |説明                |
|:-:                |:-:                |:-:                |
|リソース名             |users              |複数形              |

##参考記事
https://diveintocode.jp/blogs/Technology/NamingRole
Rubyのネイティブ拡張をRustで作成する

昨日、[Mac環境でRubyのネイティブ拡張を作る記事](https://qiita.com/irxground/items/50ceea8fdb20c1e56828)を投稿したが、WindowsとLinuxでも動く設定が確認できた。

## 構成

基本は前回と同じ。

まず変わったのは `build.rs` で、ライブラリ名もRubyのコンフィグからWin, Mac, Linux共通の値が取得できた。

```rust:build.rs
use std::process::Command;

fn rb_config(key: &str) -> String {
    let output = Command::new("ruby")
        .args(&["-e", &format!("print RbConfig::CONFIG['{}']", key)])
        .output()
        .expect("failed run ruby");

    return String::from_utf8(output.stdout).unwrap();
}

fn main() {
    println!("cargo:rustc-link-search={}", rb_config("libdir"));
    println!("cargo:rustc-link-lib={}", rb_config("RUBY_SO_NAME"));
}
```

次が `Rakefile` で、Windowsでも動かしやすいようにMakefileから変更した。
RustがサポートするWindows環境はmingwとmsvcがあるが、mingwを強制している。

```ruby:Rakefile
require 'fileutils'
require 'json'

NAME = JSON.parse(`cargo metadata --format-version=1`).dig("packages", 0, "name")
TARGET_SO = "#{NAME}.#{RbConfig::CONFIG["DLEXT"]}"

desc "Delete artifacts"
task :clean do
  sh "cargo clean"
  FileUtils.rm_f(TARGET_SO)
end

desc "Create native extension"
task :build do
  env = {}
  case RUBY_PLATFORM
  when /mingw/
    env = {"RUSTUP_TOOLCHAIN" => "stable-#{RbConfig::CONFIG["host_cpu"]}-pc-windows-gnu"}
    cargo_out = "target/release/#{NAME}.dll"
  when /darwin/
    cargo_out = "target/release/lib#{NAME}.dylib"
  when /linux/
    cargo_out = "target/release/lib#{NAME}.so"
  else
    raise "Platform #{RUBY_PLATFORM} is not supported"
  end
  sh env, "cargo build --release"
  cp cargo_out, TARGET_SO, preserve: true, verbose: true
end

desc "Run Ruby script"
task :run => [:clean, :build] do
  ruby "run.rb"
end
```

他は変更なし

## 今後

gemとして公開するには gemspec 等が必要なので今後調べていくつもり。
【Ruby】メソッドの引数名を指定する。後ろにつくコロン（：）の意味

個人メモです。

メソッドの引数に後ろにコロンのつく変数が指定されている記述の意味について。

**▼こういうの**
`def jadge(x:)`

```ruby:
def jadge(x:)
  p "exist x" if x.present?
end
```


##引数の後ろにつくコロンの意味
引数の中で後ろにつくコロンは、**変数名を指定**している。（**キーワード引数**と呼ぶ）

通常、引数は渡された順に、第一引数、第二引数、、、に代入されるが、後ろにコロンをつければ、その変数名と合った引数の値を渡すことができる。

特に扱う変数が複数の場合は変数名で指定できるので便利。

```ruby:コロンで変数名を指定
#関数定義
def jadge(x:, y:)
  p "exist x" if x.present?
  p "exist y" if y.present?
end


#関数実行
jadge(y: false, x: true)
=> "exist x"
```

<br>
**▼通常**

```ruby:
def jadge(x, y)
  p "exist x" if x.present?
  p "exist y" if y.present?
end

y = false
x = true
jadge(y, x)
=> "exist y"
```

変数名ではなく、渡した順番で値が入る。
django [Errno 61] Connection refusedの対処法（アカウント認証テストで、、、）(備忘録)

##djangoで[Errno 61] Connection refusedになった時の対処法

エラー文の意味は直訳だと＃接続が拒否された”と言っている。
sign_upページからテスト情報を入力してうまく登録出来るか確認しようとした段階のエラー。


##解決方法

以下をsettings.pyに追加したら直った。

````
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' 
````

これはメールを実際には送らずに、コンソールに表示してくれる設定らしいです。

実際に送信するには以下のように書き換えが必要とのこと。


````
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
````
ArchUnit 実践：同一パッケージからのみ依存されるクラスの可視性をパッケージプライベートに強制する

```
// 実行環境
* AdoptOpenJDK 11.0.9.1+1
* JUnit 5.7.0
* ArchUnit 0.14.1
```

## アーキテクチャテストのモチベーション

* パッケージ内に閉じた関心事を、パッケージ外に対して隠蔽したい
* パッケージ外からの想定外の依存（結合）が生まれることを言語仕様レベルで防止したい
* 公開範囲を限定することで、保守性（理解容易性、変更容易性）を向上したい

## アーキテクチャテストの実装

```java
package com.example;
　
import com.tngtech.archunit.base.DescribedPredicate;
import com.tngtech.archunit.core.domain.Dependency;
import com.tngtech.archunit.core.domain.JavaClass;
import com.tngtech.archunit.core.domain.JavaClasses;
import com.tngtech.archunit.core.importer.ClassFileImporter;
import com.tngtech.archunit.core.importer.ImportOption;
import org.junit.jupiter.api.Test;

import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes;

class ArchitectureTest {

    // 検査対象のクラス
    private static final JavaClasses CLASSES =
            new ClassFileImporter()
                    .withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_TESTS)
                    .importPackages("com.example");

    @Test
    void 同一パッケージからのみ依存されるクラスはパッケージプライベートにする() {
        classes()
            .that()
            .arePublic()
            .and(new DescribedPredicate<>("only have dependent classes that reside in same package") {
                @Override
                public boolean apply(final JavaClass clazz) {
                    return clazz.getDirectDependenciesToSelf()
                        .stream()
                        .map(Dependency::getOriginClass)
                        .allMatch(dependentClass
                            -> dependentClass.getPackageName().equals(clazz.getPackageName()));
                }
            })
            .should()
            .notBePublic()
            .check(CLASSES);
    }
}
```
Herokuでデプロイをやり直す方法

＜この記事について＞
Herokuでデプロイした後に、本番環境に反映されていなくて再度デプロイをやり直す
ことで無事に解決できたので備忘録として投稿！

[環境]
・Ruby 2.6.5,
・Rails 6.0.0
・macOS

＜状況＞
railsでアプリを制作時に、本番環境での動きを確認するために、Herokuでデプロイを実施。
一度目は問題なく動作したが、2回目で不具合発生。ビューについて、ローカル環境と同様の
実装となっていないため、試行錯誤するも解決できず。メンターに質問したところ、
新たに１つの操作をすることで解決できました。

以下、全てターミナルで操作となります。

```
$ git commit --allow-empty -m "任意のコミットメッセージ"
```
→通常、差分がないとcommit/pushできないが、差分がなくても強制実行してくれるコマンド

あとは、通常のHerokuへのデプロイと同じ流れです。

```
$ git push heroku master
```
```
$ heroku run raills db:migrate
```
本番環境で確認して問題なければ完了。

＜終わりに＞
ローカル環境で問題ないのに本番環境で同じように動作しないと焦りやすいですが、
このようなコマンドで解決できることを知っているだけで精神的にも安定すると思います！
【Android】ConstraintLayoutの制約エラー

#プログラミング勉強日記
2020年12月15日
Android StudioでConstraintLayoutの制約を設定するエラーが出たのでこのエラー内容と解決方法を示す。


#ConstraintLayoutの制約エラー内容

```
This view is not constrained. It only has designtime positions, so it will jump to (0,0) at runtime unless you add 
the constraints  
The layout editor allows you to place widgets anywhere on the canvas, and it records the current position with
designtime attributes (such as layout_editor_absoluteX). These attributes are not applied at runtime, so if you
 push your layout on a device, the widgets may appear in a different location than shown in the editor. To fix this, 
make sure a widget has both horizontal and vertical constraints by dragging from the edge connections.  Issue id: MissingConstraints
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/2fff3756-46d6-85fd-e198-a037f08ed81a.png)

　ボタンやテキストなどのビューに対して水平方向や垂直方向の制約の定義をしないと左上の0.0の位置に配置されるエラーである。

#解決方法
　エラーを解決するためには、様々な方法があり、簡単にいくつか紹介する。

- ビューを画面に配置し、idとテキストを変更する
- 水平・垂直軸に制約する
- マージンとバイアスを設定する
- 制約の推論アイコンから自動で制約をする
- 制約を削除する
- 属性を手動で追加する
- ベースラインで位置揃えする
- バイアスでセンタリングする
- ガイドラインに制約する


　私の場合は、垂直軸に制約することでエラーをなくすことができた。垂直軸と水平軸を制約するためには、ビューを選択して、位置揃えアイコンから設定する。

```
// 水平の場合
layout_constraintStart_toEndOf
layout_constraintStart_toStartOf
layout_constraintEnd_toStartOf
layout_constraintEnd_toEndOf

// 垂直の場合
layout_constraintTop_toTopOf
layout_constraintTop_toBottomOf
layout_constraintBottom_toTopOf
layout_constraintBottom_toBottomOf
```

```xml:変更前(activity_main.xml)
<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World" />
```

```xml:変更後(activity_main.xml)
<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent" />
```

#参考文献
[[Android] ConstraintLayout による制約を設定するには](https://akira-watson.com/android/constraintlayout.html)
[Android StudioでConstraintLayoutの制約を設定する方法を配置パターン別に解説](https://yoruhi.net/archives/android-studio-constraintlayout/)
Notion使う上での小ネタや注意点など

本記事は、株式会社ピー・アール・オーアドベントカレンダーの16日目です。

# Notion、気に入って使ってるんですが
[アドベントカレンダー初日](https://qiita.com/pro_matuzaki/items/084887a0c597b7caf33b)でも取り扱ったように、Notionは個人的なメモ帳としてかなり気に入ってます。
利用する上での小ネタや注意点などで気づいたところを書き残そうかと思います。

# アップロードしたファイルはURLベース認証となる
例えばこんな画像があったとして
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221091/c92ef4fa-dfda-c3c7-ca60-6f94f1697fe5.png)

画像選んで「original」選ぶと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221091/3d4d6110-a659-e39e-0e82-ff2583106506.png)

S3のURLですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221091/76951b93-2305-f3b1-b8b0-f6f3f039c91d.png)

お察しのとおり、認証付きURLなので、このURL自体は有効期限内であれば誰でも開けます（↓は別ブラウザで開いた）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221091/46454993-779e-3675-4025-12f6a3ca0b5a.png)

画像を張った記事自体は、非公開にしてありますのできっちりログイン必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221091/cd5c7c53-66dd-4236-a27e-1b9c78804da4.png)

ちょっと補足すると、S3のURL自体は認証情報付きURLで、有効期限付きになっているのでノーガードってわけじゃないです。ただ、これおそらく利用者側が明示的にファイル削除することって不可能そうに思える・・・。Notionにアップしたファイルやページ消したらファイル消してくれるとかだったら最高なんですが、手元で試した限りではそのような感じではないので、このあたりは公式に問い合わせ出してみようかと思ってます。

※2020/12/16追記
URLの有効期限は1日の模様です。この記事書いたときに取得したURLは1日でexpireしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221091/a605d9a6-7175-631b-806f-f4270bbfc04c.png)

2024/06/11追記
この問題は解消され、画像のURLはS3直接ではなく、notionを経由した表示に変更になったようです。認証が有効になるのでセキュリティ上の懸念は無くなったようです。（よかった！）

# 数式も書けるよ
まあ、これはQiitaでも書けるんで当然かもしれませんが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221091/51708221-745d-9cec-cb61-895fc3ea8880.png)
内部的にはKaTexってのを採用して描画パフォーマンスがいいらしい。ほーん。

# 表を何とかMarkdownで書かせてもらえませんか？
これはダメみたいですね・・・
まあtableをデータベースとして可塑的に扱えるのがNotionの設計思想なんでわからなくはないです。
（でもMarkdownとの互換性も残しておいてほしかったというのは正直なところ・・・）

※2024/06/11追記
"table"というのが追加になり、databaseでない表を作成することができるようになりました。

現場からは以上です。
テレワークで楽しくアジャイル開発を進める方法

この記事は「いのべこ（富士通システムズウェブテクノロジー）Advent Calendar 2020」の15日目の記事です。記事の掲載内容は私自身の見解であり、所属する組織を代表するものではありません。
# はじめに
　価値のあるものを継続的に素早く提供することを重視するアジャイル開発では、対面でのコミュニケーションが重視されます。
　それは、アジャイル開発をする上でのルールであるアジャイルソフトウェアの12の原則にも、「情報を伝えるもっとも効率的で効果的な方法はフェイス・トゥ・フェイスで話をすることです。」という原則があることからも分かります。
　しかし、コロナウィルス対策により外出の自粛が求められるこのご時世では、チームのメンバーと集まってフェイス・トゥ・フェイスで話をすることが難しくなってしまいました。
そこで、テレワーク中でも効率の良いコミュニケーションを取り、快適に楽しく開発を進める方法を考えたのがこの記事です。
# テレワークでコミュニケーションを取るためのツール:notebook_with_decorative_cover:
- Web会議ツール
   - まずは、通話や画面共有ができるWeb会議ツールが必要です。Web会議ツールには多くの種類がありますが、操作が直感的で音質が比較的良いため、私は[Zoom ミーティング](https://zoom.us/jp-jp/meetings.html)をおすすめしています。
- オンラインホワイトボード
   - スプリント計画やタスク管理のために、チームメンバーが共同で編集できるオンラインホワイトボードを使用するといいでしょう。スケジュールやメモなどを、メンバーが気づいたときに編集できる状態が理想です。こちらも種類は多くありますが、[miro](https://miro.com/)が自由度が高くおすすめです。上で説明したZoomにもホワイトボード機能はありますが、画像を保存しないと会議後に消えてしまうため注意が必要です。
- 課題管理ツール
   - プロダクトバックログやバーンダウンチャートを管理できるツールがあると便利です。[Jira Software](https://www.atlassian.com/ja/software/jira)はオンラインホワイトボードのmiroと連携することもできるため、スケジュールやプロダクトバックログなどをmiroで一元管理することができます。(一部有償)

# オンラインでアジャイルのセレモニーを行う
　アジャイル開発ではチームで集まり、ミーティングをする機会が多くあります。
対面でのセレモニーにはチームメンバーで集まり、ホワイトボードに付箋を貼りながら話題を書き出すスタイルがありますが、ここからはそれをオンラインで再現する方法を紹介します。
例として、オンラインで振り返り会をする方法を以下に説明します。

## オンライン・振り返り会
- 出席者
   - プロダクトオーナー・スクラムマスター・開発者チーム
- タイミング
   - スプリント終了時 1時間程度
- 使用ツール
   - Web会議ツール・オンラインホワイトボード・課題管理ツール
- おまけ
   - お酒を飲んだり、お菓子を食べながら振り返り会をするのもありです
- やり方

1. まずは振り返り会の出席者がWeb会議ツールに集合し、オンラインホワイトボードを画面共有します。
2. 出席者で話し合い、振り返り会のフレームワークを決めましょう。[「ふりかえりの手法をたくさん学ぼう」で紹介された手法まとめ](https://qiita.com/98lerr/items/423a3e8ee44e118091bf)の記事に、たくさんの振り返り会のフレームワークが詳しく説明されているので、自分たちのチームに合った物を選ぶのも楽しいです。
3. フレームワークに合わせて、オンラインホワイトボードに枠を作りましょう。KPTなら3つの枠にそれぞれ「K」「P」「T」と見出しを付けるなど、メンバーが分かりやすい方法でOKです。
4. 時間を決めて、メンバーが3で作った枠の中に関連する話題を書き出します。miroであれば付箋機能を使うなど、後で動かしたり編集がしやすい機能を使うと便利です。
5. 同じ内容や近い内容の話題はまとめて、グルーピングをします。このときに、共感した話題にはスタンプを付けるなどの反応をしておくとよいです。
6. ファシリテーターが中心となり、チームメンバーの意見を確認します。5で近い内容や共感の多い話題は、チームメンバーの多くが重要だと思っている話題であると分かります。
7. 最後に解消したほうがいい課題、継続するべきことなどを書き出します。次回の振り返り会で確認するための枠を作ると見やすく便利です。


# さいごに
　人と顔を合わせて話すことが大変な世の中になってしまいましたが、ツールを上手く使うことで快適にアジャイル開発を進めることはできると思っています。
　これからもちょっとした工夫を見付けて、テレワークでのアジャイル開発をどんどんカイゼンしていきたいです！