OmniAICreator/Qiita-1.07M huggingface dataset:
Deviseでユーザー情報の編集


### ★User新規登録同様に編集しようとすると…

Current password can't be blankとエラーメッセージが。。。
※deviseを使用し、ユーザー情報を編集する際にデフォルトのままだと
パスワードの入力を求められる。

### ❶Deviseをカスタマイズする為にControllerを作成

### rails generate devise:controllers users
```ruby
      create  app/controllers/users/confirmations_controller.rb
      create  app/controllers/users/passwords_controller.rb
      create  app/controllers/users/registrations_controller.rb
      create  app/controllers/users/sessions_controller.rb
      create  app/controllers/users/unlocks_controller.rb
      create  app/controllers/users/omniauth_callbacks_controller.rb
```

### ❷update_resourceメソッドをオーバーライド

```ruby
#registrations_controller.rb

class RegistrationsController < Devise::RegistrationsController

  protected

  def update_resource(resource, params)
    resource.update_without_password(params)
  end
end
```

### ❸ルーティングに追記
```ruby
devise_for :users, controllers: { registrations: 'users/registrations' }
```

### ❹パスワード入力フォームを削除
```ruby
#views/devise/registrations/edit.html.erbから削除
```

### ↓忘れがちな部分

![425bd06c483f34fe28dc03a14824df75.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/935594/17790601-07b5-d6e6-ab4e-2e0c46fe0cf2.png)

### ★ユーザーのcurrent_passwordが不明と言われている…

### ❺attr_accessorを使用して記載
(Userモデルに指定した値をインスタンス変数として取り扱ってくれる)
※編集時にはバリデーションが働かないように記載

```ruby
#省略
attr_accessor :current_password

with_options format: { with: /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]{6,}+\z/i } do
  validates :password, presence: true, on: :create
  validates :password_confirmation, presence: true, on: :create
end
```

### ❻ApplicationControllerにaccount_updateを追記

```ruby
#app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  private
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [#省略])
    devise_parameter_sanitizer.permit(:account_update, keys: [#省略])
  end

end
```

## ★Devise少し理解…

## ★ [今回の教科書はこちら](https://github.com/heartcombo/devise "教科書")
CSS 長さの単位　備忘録

#はじめに
CSS3の長さの単位のまとめ。
備忘録用

##分類
CSS3で長さを表す単位は下記に分類できる。

<ul>
  <li>相対的な長さを表す単位</li>
  <ul>
    <li>フォントに対する相対的な長さを表す単位</li>
    <li>ビューポートにに対する％で表す単位</li>
  </ul>
  <li>絶対的な長さを表す単位</li>
</ul>

###※ビューポートとは？
Webページを表示する領域のこと。
PCブラウザであればウィンドウの表示領域全体のこと。
SPであれば画面の表示領域全体のこと。

##フォントに対する相対的な長さを表す単位

###em
要素のフォントサイズを1とする単位

###rem
html要素のフォントサイズを1とする単位
→root要素のem

###ex
要素のフォントのx-heightを1とする単位
#####x-heightとは?
→アルファベットの基準となる高さの1つで小文字「x」の高さ


###ch
要素のフォントの0の幅を1とする単位
chはcharacterの略


##ビューポートに対する%で表す単位 viewport

###vw
ビューポートの幅の1%を1とする単位
※使用機器の縦置き、横置きで変化

###vh
ビューポートの高さの1%を1とする単位
※使用機器の縦置き、横置きで変化

###vmin
ビューポートの幅と高さのうち、短い方の1%を1とする単位

###vmax
ビューポートの幅と高さのうち、長い方の1%を1とする単位

##絶対的な長さを表す単位

###px ピクセル
1/96インチを1とする単位

###pt ポイント
1/72インチを1とする単位

###pc パイカ
12ポイントを1とする単位

### in インチ
2.54センチメートルを1とする単位

###cm センチメートル

###mm ミリメートル

###q クォーターミリメートル
1/4ミリメートルを1とする単位
Typescriptでタイムゾーンを扱う

## はじめに
Typescriptのバックエンドでタイムゾーンを扱った時のメモです。

## タイムゾーンを扱う場面

バックエンドでタイムゾーンを扱う場合、サーバーのタイムゾーン設定に依存しない実装が必要です。日本のタイムゾーンにおける特定の時間でDateオブジェクトを作る場合は、ライブラリに頼らなくてもISO8601形式で以下のように対応ができます。

```typescript
new Date("2021-01-01T10:00:00+09:00") // 日本時間の 2021/01/01 10:00
```

では以下のような場合はどうでしょうか？

- ファイル生成時に現在の日本時間をファイル名に入れたい
- 現在の日本時間から見た、その月の末日をサーバから返却したい

これらを自前の関数でやろうとすると結構面倒だったりします。そこで今回はタイムゾーンを簡単に扱うことができる`dayjs`の機能をご紹介します。

## dayjsをインストール・初期化
`dayjs`は軽量の日付操作用ライブラリです。以下のようにインストールして対象のファイルからimportします。

```bash
npm i dayjs
```
```typescript
import dayjs from "dayjs";
import timezone from "dayjs/plugin/timezone";
import utc from "dayjs/plugin/utc";

dayjs.extend(timezone);
dayjs.extend(utc);
```

これで`dayjs`オブジェクトを使って自在にタイムゾーンが扱えるようになります。

## サンプル
### ファイル生成時に現在の日本時間をファイル名に入れたい
```typescript
const filename = `${dayjs().tz("Asia/Tokyo").format("YYYY-MM-DD-HH-mm-ss")}.jpg`;
```
`tz`の後のタイムゾーンを例えば`America/New_York`とすれば、現在のニューヨークの時間をもとにファイル名が生成されます。

### 現在の日本時間から見た、その月の末日をサーバから返却したい
```typescript
const lastDayOfMonth = dayjs()
  .tz("Asia/Tokyo")
  .endOf("month")
  .startOf("date")
  .format("YYYY/MM/DD");
```

### デフォルトのタイムゾーンを設定
```typescript
dayjs.tz.setDefault("Asia/Tokyo");
const currentTokyoTime = dayjs().tz().format("YYYY-MM-DD-HH-mm"); // 現在の日本時間が表示される
```

### 特定のタイムゾーンにdayjsオブジェクトを変換
以下の通り、`tz`メソッドの第二引数に`true`を渡すと時刻はそのままで、timezoneだけがJSTに変更された形のDateオブジェクトを`toDate`メソッドで返却することができます。ただしこの第二引数を渡すとformat関連のメソッドにJSTが考慮されなくなってしまいます。

```typescript
const sampleDate = new Date("2021-05-01T00:00:00+09:00");

console.log(dayjs(samepleDate).tz("Asia/Tokyo").format(`YYYY年M月`)); // 2021年5月
console.log(dayjs(samepleDate).tz("Asia/Tokyo", true).format(`YYYY年M月`)); // 2021年4月
console.log(dayjs(samepleDate).tz("Asia/Tokyo").toDate().getTime()); // 1588258800000（日本時間 2021/05/01 00:00）
console.log(dayjs(samepleDate).tz("Asia/Tokyo", true).toDate().getTime()); // 1588226400000（日本時間 2021/04/30 15:00）
```


## まとめ
以上、dayjsでタイムゾーンを扱った際のメモでした。dayjsはimmutableなのでその辺りも踏まえて扱いやすいライブラリかと思います。
連続するデータの変化の回数を数える

#連続するデータの変化の回数を数える。
以下のテストデータでarea毎にvalの値が変化する回数を数える
#テストデータ
```python
import pandas as pd

dt={
    "area" :[1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2],
    "seq"  :[1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8],
    "val"  :[1,2,2,1,3,3,3,1,1,1,2,2,2,1,1,2]
    }
df=pd.DataFrame(dt)

print(df.to_markdown()) 
```
|    |   area |   seq |   val |
|---:|-------:|------:|------:|
|  0 |      1 |     1 |     1 |
|  1 |      1 |     2 |     2 |
|  2 |      1 |     3 |     2 |
|  3 |      1 |     4 |     1 |
|  4 |      1 |     5 |     3 |
|  5 |      1 |     6 |     3 |
|  6 |      1 |     7 |     3 |
|  7 |      1 |     8 |     1 |
|  8 |      2 |     1 |     1 |
|  9 |      2 |     2 |     1 |
| 10 |      2 |     3 |     2 |
| 11 |      2 |     4 |     2 |
| 12 |      2 |     5 |     2 |
| 13 |      2 |     6 |     1 |
| 14 |      2 |     7 |     1 |
| 15 |      2 |     8 |     2 |


#期待する答え 
 area 1:5個
 area 2:4個

#変化の回数のカウント
```python
#変化点を求める
df.sort_values(["area" , "seq"] ,inplace=True)
df["cnt"]=df.groupby(["area"])["val"].diff().apply(lambda x:0 if x==0 else 1 )
print("変化点") 
print(df.to_markdown()) 

#変化の回数
df2=df.groupby(["area"]).cnt.sum()
print("変化の回数")
print(df2.to_markdown()) 
```
#変化点
|    |   area |   seq |   val |   cnt |
|---:|-------:|------:|------:|------:|
|  0 |      1 |     1 |     1 |     1 |
|  1 |      1 |     2 |     2 |     1 |
|  2 |      1 |     3 |     2 |     0 |
|  3 |      1 |     4 |     1 |     1 |
|  4 |      1 |     5 |     3 |     1 |
|  5 |      1 |     6 |     3 |     0 |
|  6 |      1 |     7 |     3 |     0 |
|  7 |      1 |     8 |     1 |     1 |
|  8 |      2 |     1 |     1 |     1 |
|  9 |      2 |     2 |     1 |     0 |
| 10 |      2 |     3 |     2 |     1 |
| 11 |      2 |     4 |     2 |     0 |
| 12 |      2 |     5 |     2 |     0 |
| 13 |      2 |     6 |     1 |     1 |
| 14 |      2 |     7 |     1 |     0 |
| 15 |      2 |     8 |     2 |     1 |
#変化の回数
|   area |   cnt |
|-------:|------:|
|      1 |     5 |
|      2 |     4 |
macでいきなりはじめるPHPにチャレンジする！(2) PHP開発環境編

#VScodeを使用して開発を進める
前回の記事ではMAMP導入までを書きました。これでPHP、mySQLを開発するにあたって最低限必要な物はPCにインストールしました。
ここからは実際に開発するにあたって必須なテキストエディタについて書いていきます。内容はかなり初心者向けとなっていますが、振り返りとして書いていきます。

「いきなりはじめるPHP」の本に書かれているテキストエディタは現在ではあまり使われていないそうです。今回はすでに某プログラミングスクールにて推奨されているエディタを導入しているので、それを元に進めていきたいと思います。僕が導入しているのはVScodeと呼ばれる「Visual Studio Code」です。半年以上前に導入したので、バージョンは1.44です。VScode自体は以下のURLで手に入ります。
https://code.visualstudio.com/

![PHP7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891157/6bd8a896-83b1-d042-86c9-73bcb01cc6b3.png)
VScodeを開くと、こんな感じの画面が表示されます。そのままでも使えますが、四角が4つある部分をクリックすると、拡張機能をインストールできます。日本語化できるものから、全角を入れるとチェックを入れてくれるものなどいろいろなツールがありますね。僕はすでにHTML、hamlのサポートツールを入れています。スペルチェックや、かっこの数を元にしたチェックで引っ掛けてくれるのでとても使いやすいです。

そしてPHPにも拡張機能があります、一応基本機能でもPHPのスペルチェックはあるそうですが・・・拡張機能の方が使い勝手がいいそうです。PHPで検索をかけるとたくさんの拡張機能が出てきますが、その中でも上位に出てくるのが、PHPと書かれたロゴの「PHP Intellisense」と象さんが書かれたロゴの「PHP Intelephense」です。二つはとても名前が似ていますが・・・どうやら象さんの「PHP Intelephense」の方が使い勝手いいそうです。

なぜかというと、「PHP Intellisense」の方はエラーが比較的起きやすいという情報があるのと、「PHP Intelephense」は使用していない変数がわかりやすくなっていたり、検索の使い勝手がいいそうなので、僕は「PHP Intelephense」をインストロールしました。僕は同時に「PHP debug」もインストールしました。こちらはあまり使い勝手がわかりません・・・

#実際にコードを入れてみる
では実際にプログラムを書いていきます。VScodeだとcommandとnで新規作成、commandとsで保存ができるなどショートカットキーがいろいろあります。把握すべきだと思いますが、僕はなかなか覚え切れていません・・・
MAMPのローカルサーバーでアプリを動かすには、アプリケーション(などMAMPのあるフォルダー)→MAMP→htdogsに保存する必要があります。

```php:test.php
<html>
  <head>
    <meta charset="UTF-8">
    <title>練習</title>
  </head>

  <body>
      <?php print 'これは練習です';
      ?>
      <br>
      <?php print '<strong>これは練習です</strong>';
      ?>
  </body>
</html>
```

今回は練習としてこんな文章にしました。いろいろと突っ込みどころあるかもしれませんが、とりあえず練習としてこんな内容にしています・・・
そして、前回の記事のようにMAMPをスタートさせて、今回はtest.phpというファイルなので、「http://localhost/test.php」にアクセスすると・・・(localhostのポートを80にしている場合のURLです)

![PHP14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891157/8e769b46-7e21-600b-d2be-5eba8ba23e75.png)

殺風景ながらちゃんと表示されます。HTMLに埋め込めんで使えるので、HTMLと同様の書き方ができるということで、学習を進めるにあたって少し希望を持つことができました。
次回は話が進んで、mysqlを弄ることについて書いていきます。
電源回路の「しくみ」と「基本」2章 (1)電源とはなにか

電気回路、中でも特に電源回路を勉強したい。
[『電源回路の「しくみ」と「基本」』](https://gihyo.jp/book/2012/978-4-7741-5350-6)という本をを読み始めたのでまとめていく。
「Tina」という回路シュミレーターを使って解説するそうなので良さそう。

## 電源回路の基本
- 電源：電子機器を動かすための電気の供給源
- 電源回路：電子回路が要求する電圧を作り出す回路
- 電源回路に要求されること
 - 安定した出力
 - 小型・軽量・高効率
 - 安全性
- 電源回路の構成の種類
 - トランス方式：変圧→整流回路(正負片側のみにする)→平滑回路(波の間を埋める)→安定化回路(整える)
 - スイッチング方式：整流・平滑回路→スイッチング回路（細切れにする）→変圧→整流回路→LC回路（連続させる）
 
## トランスを用いた簡単な電源回路
__①トランスで変圧する__
トランスは、磁束を通しやすいコアと呼ばれる鉄心に電線を巻いただけのもの。
電圧とコイルの関係は `V1 / V2 = N1 / N2`で表されるため、コイルの巻数に応じて変圧が可能となる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/5dfddb88-cc01-2706-812d-be5df54acd39.png)
引用元：[変圧器とは？原理や構造をわかりやすく解説](https://www.daihen.co.jp/technologygeeks/cat01/cat01_01/29/)

__②ダイオードで片側のみにする（整流）__ 
交流は時間とともに正負が入れ替わるのに対し、直流は一方向にしか電流が流れない。
電流の流れを一方向にすることを「整流」という。

整流にはダイオードが使われる。ダイオードは電流を一方向にしか流さないという特性を持っている。
![2020-12-16_23h25_33.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/c52d2ff7-d308-22f0-64fb-6543f9fe3d6d.jpeg)

__③平滑回路で直流にする__
平滑回路とはコンデンサのこと。コンデンサは電気を蓄えるため、ぽこぽこした脈流波形の中にコンデンサを挿入すれば、出力が一定電圧に平滑される。
電源電圧が負荷にかかる電圧より高い間、コンデンサは充電され、電源電圧が負荷にかかる電圧より低い間、（ダイオードによって負荷に電流は流れないため、代わりに）コンデンサが放電して負荷に電圧がかかる。

## 上記の電源回路の問題点
上記で作成した回路の出力波形は波打ってきれいな波形とはいえない。この波部分を`リプル`という。
出力電圧の平均に対してどの程度の大きさのリプルがあるかを表したものを`リプル含有率`という。

リプル含有率は以下の式で求められる。
**リプル含有率 = リプル部分の実効値 / 直流電圧 × 100％**
リプル部分の実効値は、リプル時のピーク電圧から÷2√2で求めることが多い。

ダイオードを1本で整流していたので、入力波形の半分だけが出力されていた。この方式を半波整流と呼ぶ。
これに対し、上下(正負)の波形全部を一方向に揃える方式を全波整流と呼び、中でもダイオードを4つ使った方式の以下のような回路はブリッジ整流回路と呼ばれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/6728ad18-b4e7-2000-2dd0-82372c065327.png)
notionテンプレートではじめるアジャイルなスプリントレトロスペクティブ

この記事は [GLOBIS Advent Calendar 2020](https://qiita.com/advent-calendar/2020/globis) の16日目の記事です。 

今回の記事では、自分の所属しているチームでのスプリントレトロスペクティブ(振り返り)の方法について紹介したいと思います。

## スクラムイベントは形式的になりがち
スクラムを導入したチームが陥りがちな状態のひとつが、**スクラムイベントが形式的なものになってしまう**ことです。
「デイリースクラムでメンバーが3つの質問に答える」「レトロスペクティブでKPTをする」のようなプラクティスは導入したものの、そのプラクティス自体の効果測定や見直しはあまり出来ておらず、毎スプリント表面的にスクラムイベントの手順をなぞるだけ、という状況を自分もよく見てきました。

先月アップデートされたスクラムガイド[^1]は、スクラムイベントの指示的な内容が削除され、それぞれのチームがイベントの目的を踏まえて最適なやり方を議論し、改善していけるようなガイドになっています。

また、スクラムイベントの手順の見直しがされているチームでも、いつもスクラムマスターが改善を主導しており、**主体的に自分たちのスクラムを改善する動きがまだ少ない**、というチームもあると思います。

こういった状態に陥らないよう、自分のチームではスクラムイベントの進め方を自分達で改善し続けるための「**議事録テンプレートによるスクラムイベントの手順管理**」を行っています。

## 議事録のテンプレートとしてレトロスペクティブの手順を管理する

自分のチームではドキュメントツールとしてnotionを利用しています。notionにはテンプレート機能があり、柔軟にドキュメントの雛形を作成することができます。
レトロスペクティブの記録もnotionに残しており、そのテンプレートの一部はこんな風になっています。

![レトロスペクティブのテンプレートの例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19366/e66efeff-4b79-2767-3a9c-d55bca3a2f42.png)

テンプレートは以下のように運用します。

- テンプレートには、チームがレトロスペクティブで行う**検査と適応のための手順をすべて書き出す**
    - 手順に従えば誰でもイベントの進行ができるように書く
- スプリント毎のレトロスペクティブではテンプレートから議事録を作成し、手順に沿ってイベントを進める
- レトロスペクティブでイベントの手順自体の変更が提案されたときは、**その手順変更をテンプレートに反映する**


## 議事録テンプレートのメリット
テンプレートとしてレトロスペクティブの手順を管理することには、いくつかのメリットがあります。

### 今チームが採用しているイベントの進め方を、参加者全員が意識できる

議事録に検査や議論の結果を残すだけではなく、どんな手順を踏んでいるかが議事録の見出しとして参加者の目に入ることで、**「今自分たちはどんな進め方でチームを改善しようとしているのか」を常に意識することができます。**チーム改善の主体をスクラムマスターでなくチームメンバー全員とする第一歩として、自分たちがどういう進め方をしているのかを客観的に意識できることは大きなメリットでした。

この効果をより高めるため、自分のチームでは必ず議事録を全員で見ながらイベントを進めています。Zoomなどのビデオ会議なら、ファシリテーターや書記が議事録を常に画面共有します。オフラインならプロジェクターで投影するなど、全員が議事録に視線を向けながら議論できる状態をつくります。議事録に書かれた手順を全員で見ながらイベントを進めることで、イベント中も自分たちがどういう手順を採用したか？なにか改善の余地はないか？を意識できるようになり、チームの改善もより進むようになりました。

### イベントの手順変更のハードルが下がる

手順の変更は容易です。「次スプリントから○○という指標を計測したい」とチームが考えたとき、やることはテンプレートに手順を一つ追加するだけです(もちろん計測するための記録は別途考える必要があります)。この手軽さはチームがスクラムイベントの手順を変更するハードルを大きく下げていると思います。
また、手順の削除も簡単にできるため、効果が期待できない検査プロセスがイベントに残りつづけてイベントの時間を浪費することも少なくなりました。

また、決めた手順がそのままイベントの運用の議事録となるため、決めたルールと実運用の乖離が防ぎやすいのもメリットのひとつです。

### スクラムチームの誰でもイベントの進行ができるようになる

テンプレートの運用が回れば、書かれた手順に従ってスクラムチームの誰でもイベントの進行ができるようになります。**自己管理型**のチームを目指す上では、スクラムイベントの運用はスクラムマスターだけではなく、メンバーの誰でもできるようにしておきたいところです。

## notionならレトロスペクティブの手順のほとんどが1サービスで完結する（かもしれない）

notionにはデータベースの機能があり、そのデータをドキュメントやテンプレートから柔軟に参照することが可能です。それを活かし、レトロスペクティブで継続してウォッチしたい指標を議事録テンプレートにあらかじめ埋め込んでおくと、イベント中他サービスを参照する必要がなくなり便利です。

![velocity](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19366/ba22916b-eed0-5167-fa62-162b4f193ec9.png)

こちらは直近一ヶ月のベロシティ一覧をテンプレートに埋め込んだ例です。議事録のドキュメントから直接ベロシティを登録することもできます。
notionのデータベースはGoogleスプレッドシートなどと比べると機能は限られますが、複雑な集計などを必要としないデータの蓄積であれば利用できるケースも多いと思います。

![スクリーンショット 2020-12-16 23.48.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19366/8577eba4-5ebb-a9aa-c7f5-547b5b2bf595.png)

KPTボードも作れ、もちろんこのままテンプレートに埋め込むこともできます。

notionデータベース以外にもnotionのドキュメントに埋め込めるサービスは複数あり、「notionの議事録上のみでレトロスペクティブのすべてが完結する」ことも頑張れば可能です。ぜひチームのレトロスペクティブの進め方に合わせてカスタマイズしてみてください。

## おわりに
今回の記事では、notionのテンプレート機能を使ったスプリントレトロスペクティブの改善方法について紹介しました。
何かの参考になれば幸いです。

[^1]: https://scruminc.jp/?p=2885
[Ruby on Rails] macで環境構築をしよう

#環境
macOS Catalina バージョン　10.15.7

今回インストールするバージョン
`Ruby 2.6.6` 
`Ruby on Rails  6.1.0`

#手順

##`Homebrew`のインストール
Homebrewは、macOSオペレーティングシステム上のパッケージ管理システムのひとつです。
`Rails`で必要なものをインストールするために`Homebrew`を使うので入っていない場合はインストールしましょう。

```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

インストールされたか確認するコマンド

```
$ brew help
```

`Homebrew`で使えるコマンド一覧が表示されればインストール成功です。

##`rbenv`のインストール

`rbenv`は、複数のRubyのバージョンを管理し、プロジェクトごとにRubyのバージョンを指定して使うことを可能としてくれるツールです。 

```
$ brew install rbenv ruby-build
```

インストールされたか確認するコマンド

```
$ rbenv --version
```

`rbenv 1.1.2` などと表示されればインストール成功です。（数字はバージョンによって異なります）

次にターミナルを起動した際にrbenvの初期化を自動で行うように設定をします。

```
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi' >> ~/.bash_profile
$ source ~/.bash_profile
```

##`Ruby`のインストール

インストール可能なRubyのバージョン確認をします。

```
$ rbenv install -l
```

インストールしたいバージョン(今回は`2.6.6`)が一覧に表示されていたらインストールを続けていきます。
他のバージョンをインストールする場合は`2.6.6`の部分を置き換えればそのバージョンがインストールされます。

rubyのインストールは少し時間がかかるので注意！

```
$ rbenv install 2.6.6
```

インストールされたか確認するコマンド

```
$ rbenv versions
```

`system
* 2.6.6 `

このように表示されればインストール成功です。

次に`ruby`のバージョンを確認してみます。

```
$ ruby -v
```

rubyのバージョンを確認してみて`2.6.6`になっていない場合は、先程インストールした`2.6.6`に切り替える作業をしていきます。

```
$ rbenv global 2.6.6
$ rbenv rehash
```

使用するバージョンを切り替えることができたのかを確認するコマンドを実行してみましょう。

```
$ ruby -v
```

`ruby 2.6.6p146`

このように表示されれば成功です。

##bundlerをインストール

###Gemとは？
`ruby`のパッケージ管理ツールです。gemを容易に管理でき、gemを配布するサーバの機能も持ちます。

例えばWebアプリケーションにユーザー登録やログイン機能などのユーザー認証機能を実装したい時、これらを一からコードを書くのはとても時間がかかってしまいますが、「devise」と呼ばれるgemをインストールするだけで簡単にユーザー認証で必要な機能が使えます。

###bundler とは
bundlerとは、gemのバージョンやgemの依存関係を管理してくれるgemの一つです。 bundlerを使うことで、複数人での開発やgemのバージョンが上がってもエラーを起こさずに開発できます。

以下を実行することによって、bundlerをインストールできます。
インストールしていない場合はインストールしましょう。

```
$ gem install bundler
```

インストールされたか確認するコマンド

```
$ bundler -v
```

##Railsのインストール
次に、　`Rails` のインストールです。まだしていない場合はインストールしましょう。

```
$ gem install rails
```

インストールされたか確認するコマンド

```
$ rails -v
```

##Railsアプリケーションの開発
作成するアプリケーション用のディレクトリを作成します。今回はsampleという名前で作成します。
作成したらそのディレクトリの中に移動しましょう。

```
$ mkdir sample
$ cd sample
```

Railsで開発を始めるには、`rails new アプリケーション名`　というコマンドを実行します。
このコマンドを実行することで、入力したアプリケーション名と同名のフォルダが作成され、その中に開発に必要なフォルダやファイルが用意されます
今回はsample_appという名前のアプリケーションを作成していきます。

```
$ rails new sample_app
```

開発中のアプリケーションをブラウザで表示するためには、サーバーを起動する必要があります。サーバーの起動は、以下のコマンドを実行するだけで完了です。
（サーバーを起動する場所に注意！！　`cd sample_app` 　でカレントディレクトリを変更して起動）

```
$ rails s
```

サーバーを起動した後、ブラウザで`localhost:3000`というURLにアクセスすると、Railsの初期画面が表示されるようになります。
【ポートフォリオ】概要編_その2

[link-1]:https://qiita.com/HIDE03/items/26cf57a7a7f8fe79c1d5
[link-2]:https://qiita.com/HIDE03/items/263f15c0c994fa569944

# はじめに
[前回][link-1]の続きです。
実際にどんなブログを作るか内容を決めます。

# 1. 成果物について
ブログを作ります

# 2. どんなブログを作るか
記事まで考えるのはさすがに面倒です。
ということで、以前からもうちょっとUIが自分好みだったら良いのにと思っていた、パーソルテクノロジースタッフの案件紹介ページをブログ記事と見立ててブログにまとめたいと思います。

__※注釈※__
一応、登録者のみの公開情報があるとよくないので、ログアウトしている状態の案件情報を利用します。
内容自体は量が多いので__Selenium × python__で取得します。
そのうえで、担当営業の人にも確認します。

# 3. 実装する機能（設計）
ブログとして必要な機能を考えます

* ログイン機能
* 記事投稿機能
* 記事編集（削除）機能
* 記事の検索機能
* 記事一覧表示機能
* 記事の詳細表示機能

=================== +αの壁 ===================

* タグ
* コメント
* ユーザ登録


# 4. 構成
機能を考えつつ、ブログの全体的な構成を考えます

* 記事一覧
* 記事詳細ページ
* ログイン画面
* 管理画面
* 記事編集ページ

# 5. ポートフォリオ制作の流れ
具体的な制作の流れは下記の通り

1. AWSにてWEBサーバを利用する
* Dockerで開発環境を構築する
* 簡単なHTMLページを作成してみる
* ブログを作成する
* 記事を投稿する

# まとめ
* どんなブログを作るか決めました
* どんな流れで制作するか決めました

[次回][link-2]から環境構築を始めます
JSONについてまとめ

JSONについて調べたことをまとめました。

#JSONとは

**JavaScript Object Notaiton**の略語

**データを表示するための表記法**の一種

他に**XML**や**yml**などがある

#JSONの特徴

###扱えるデータの種類

- 文字列
- 数値
- オブジェクト
- 配列
- 真偽値
- null


###jsonのデータ表記例

```json:山田太郎さんのデータの例
{
  "first-name": "太郎",
  "last-name": "山田",
  "age": 25,
  "height": 170,
  "weight": 65 
}
```

###その他

- JavaScriptのオブジェクトの書き方と似ているが、**別物**
- キー、文字列はをダブルクォーテーションで囲む必要がある（シングルはNG）

#JSONの用途

- API通信時
  - **Reqest**、**Response**のデータに使用
  - 以前までは**XML**を使用していた
- DBの形式
  - **firebase**、**MongoDB**等のデータ保管
- package.json
  - Node.jsパッケージのメタデータ保管
GitHubをダークモードで使う

#はじめに
　なんかお洒落に感じる「ダークモード」が最近GitHubにも実装されました。

##手順

![](https://i.gyazo.com/9f360b19be428e6652004e544a98625d.png)
GitHubの右上にある「月」のスイッチを入れるだけ！
![](https://i.gyazo.com/e2b023d0abdf4a6e4c730ed063e8b43d.png)

ダークモードになると、ネオンの猫が現れます。…かわいい❤️
Rubyのコードで「ハッシュっぽいのに括弧は配列？」と一瞬混乱

Rubyでこんなコード片を見かけて混乱した。

```ruby
obj = [ a: "b", x: "y" ]
```

括弧は**配列**のものだが、中身は**ハッシュ**の書き方になっている。

業務で実際に動いているコードなので、文法エラーでないことは確か。

## 答え
irbなどで実行してみればすぐにわかる。同等のコードは以下の通り。

<details><summary>クリックして展開</summary><div>

```ruby
obj = [{ a: "b", x: "y" }]
#=> [{:a=>"b", :x=>"y"}]
```

要するに「ハッシュを要素とする配列」。

---

思い返してみると、メソッド呼び出しの引数の最後では**ハッシュの波括弧を省略**できていた。配列リテラルの中も、引数と同じような扱いなのだろう。

```ruby
def mtd(*args)
	p args
end

mtd 1, 2, a: "b", x: "y"
#=> [1, 2, {:a=>"b", :x=>"y"}]
```

</div></details>
[Rails] renderとredirect_toの違い

render
---
**・部分テンプレートファイル**
`_form.html.erb`のように_から始まります。

**・ビューファイル内で部分テンプレートを呼び出すとき**
`<%= render partial: "form"  %>`　_と拡張子を除いた形で呼び出します。
partialは部分テンプレートを指定するオプションです。

**・部分テンプレート内で変数を使いたい時**
`<%= render partial: ‘form’, locals: { form: @form } %>`
のように、localsオプションを用いて、
locals: { 部分テンプレート内で使いたい変数: 持っていきたい値 }
と記述します。

**・部分テンプレート内で繰り返し処理を行いたい時**
`<%= render partial: ‘form’, collection: @forms %>`
collectionオプションに@formsと複数形の変数を渡すと、部分テンプレートでformが個別のインスタンスとして呼ばれる変数となり、さらにeach文を使用せずに繰り返し処理も行ってくれます。

<%= render @forms %>
と略して書くことも可能です。

redirect_to
---
`redirect_to root_path`のように使います。

違い
---
`render　　　→　　ビュー
redirect_to　　→  　ルーティング　→　コントローラー　→　　ビュー`

表示されるまでのプロセスが違います。
既存の生産管理システムからアラートを飛ばしたい

## 生産管理システムに一切手を入れないでアラートが欲しい

生産現場の生産管理システムとは製造しているものによって多少異なりますが、 ERP と呼ばれる基幹的のものと、 MES と呼ばれる工程管理的なものがあります。

私の肌感ですが、明示的に ERP や MES と意識して開発・導入して使っているのは大手中心に数としては少数で、中小規模の生産現場では会計ソフトと紙と Excel を使ったマニュアルな工程管理だったり、フルスクラッチで開発したアプリケーションが知らず識らずのうちに ERP + MES のモノリシックな巨大なものになっていたりします。

そして、Web アプリケーションであることの方が珍しく、そもそもウイルスが怖くてインターネットにも繋げていないことも多く、システムやプロセスの状態変化をユーザに知らせる気なんて毛頭ありません（もちろんアラート飛ばす際にはインターネットに繋いでいただきます）

一方、現場の皆さんはプライベートでクラウドサービスをはじめとした Web のユーザ体験をするようになり、なんで仕事ではプッシュ通知来ないの？と不思議に思うわけです。

## 人間がシステム様に使われる構図

生産管理システムは原料や仕掛品・製品の在庫をそれぞれ把握したい、そこから生産計画を立て実際の製造装置のスケジューリングまでしたいという経営の切なる願いによって開発され、更にはマスカスタマイゼーションの波によって品番や SKU が果てしなく増加していきました。

こうしてアプリケーションもデータも肥大化した仕組みは改修費用が巨額になり、現場のアラートが欲しいってだけの要望では稟議が通らなくなります。

そして「情報が欲しければコノ観音扉を開きなさい」と言わんばかりに、システム様は人間にアプリケーションの起動・データの抽出・目視による確認・帳票出力・紙と口頭による伝達を強います。

## 生産管理システムに一切手を加えずアラートを投げる方法

触らぬ神に祟り無し、システム様に気付かれないようにアラートを投げる方法はないか？

頭を捻らせて出てきた答えはシステム様が吐き出す CSV や Excel ファイルです。

こういったシステムの共通点である「人間に紙を出力させて回覧させる」という風習を利用します。この紙は表形式であることが多いので Excel で出力してプリントアウトすることが多いです。この隙きを突きます！

## CSVなら話は簡単だ

ご存知、Node-RED には標準で CSV ノードがあります。 CSV ファイル読込後このノードにデータを流すだけで JSON に変換してくれる優れものです。

![qCqw2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21109/2235025d-242c-b131-099d-3d1cb38fa875.png)

後は良しなにデータを解析・整形してメール送信すればアラートの出来上がり！

## Excelの解析って大変そうじゃない？

[node-red-contrib-spreadsheet-in](https://www.npmjs.com/package/node-red-contrib-spreadsheet-in) 使うと良いです。README のサンプル動かすと以下のようになります。

![Screen Shot 2020-12-16 at 23.31.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21109/d5962915-4539-3c32-1d07-a878250ed513.png)

簡単に言うと book ノードで読み込んだ Excel ブックのシートが配列で取得でき、 sheet ノードで指定したシートのデータが取得でき、 cell ノードで指定したセルのデータが取得、 sheet to json ノードで JSON 変換できます。

ここまでくれは CSV ノードと同様ですね！

## ファイルは手動で出力するの？

しているところもあります。

終業時にファイルを吐き出しといて翌朝アラートを見るだけ充分という現場もあります。ただ、これはアラートというよりレポートと呼んだ方が相応しいですけどね。

自動化したければ流行りの RPA 使うと良いです。[SikuliX](http://sikulix.com/) とか OSS の RPA ツールでやったりします。

## まとめ：費用対効果抜群！

これまで生産現場で色々とやってきましたが、少ない労力で大勢に喜んでもらえるという意味で費用対効果抜群です！

enebular は今後リモートアクセス系のサービス拡充も計画していますので、まさにオンサイト作業も減らして開発する側のコストを削減し、更に費用対効果を上げて現場の皆さんの心を鷲掴みにしましょう！
ジャンクションを使ってWindowsのRubyのバージョンを雑に切り替える

Windowsの複数のRubyのバージョンを検証したいときに、ジャンクションにパスを通すことでうまくいったので投稿。

例えば、Ruby2.6(x86) と Ruby2.7(x64) の検証をしたいとする。
まず、[RubyInstaller](https://rubyinstaller.org/downloads/) から Ruby2.6(x86) のインストーラーをダウンロードし、インストール先に `C:\Rubies\Ruby26` を選択してインストールする。この時パスは通さない。
同様に 2.7(x64)を `C:\Rubies\Ruby27-x64` にインストール。

`C:\Rubies` に以下のバッチファイルを作成する。

```bat:use_26.bat
rmdir RubyCurrent
mklink /J RubyCurrent Ruby26
```

```bat:use_27_x64.bat
rmdir RubyCurrent
mklink /J RubyCurrent Ruby27-x64
```

`use_27_x64.bat` をダブルクリックして実行すると `RubyCurrent` という名前のジャンクションが作成される。
最後に、PATHに `C:\Rubies\RubyCurrent\bin` を追加する。

これにより、バッチファイルを実行することで、Rubyのバージョンを好きに切り替えることができるようになった。
Ruby2.7(x64) を使いたいときは `use_27_x64.bat` をダブルクリックし、 Ruby2.6(x86) を使いたいときは `use_26.bat` をダブルクリックすればよい。
【FileMaker】割と書いていない自動修正の話し

FileMaker Goの謎の設定、「自動修正」です。
![IMG_3459.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/7ce9ea75-7f7c-0b87-0bd8-c3e8acf21e79.png)
各ファイルごとに設定項目としてあるこれ↑です。

過去のFileMaker Goガイドを遡っても、設定のオンオフができるよくらいにしか書いていないのですが、この自動修正という言葉自体の説明は皆無です。

# これはなんだ？
これ、実は（もったいぶってもしょうがないけど）文字入力の候補が出てくるかどうか、というもののようです。
文字入力の時にしか実感していないので、なんとも言えませんが。

# ONにすると
候補が出てきます。
ちょっと単語間違ってるよ、と出ます。
![IMG_3465.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/775bfc82-9993-7b52-2848-eeafab725865.png)

# OFFにすると
![IMG_3461.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/d292fe80-feb0-04bc-57c5-dfeb57de0cbe.png)
候補が出てきません。
![IMG_3466.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/6db2f135-fd97-5d7f-96c1-ff1a428dff69.png)

# PCでは、、、
PCでは、OS自身の言語設定などでライブ変換できたりしますが、それに相当するもので、ファイルごとに設定するものでもありません。

# 日本語では、、、
日本語の場合は漢字変換で候補があらかじめキーパッドに出てくるので、FileMakerアプリケーションではこの自動修正設定はそもそもありません。

# 結論から言うと
設定したらありがたいのかもしれませんが、なくてもあまり困らない場面が多いような気がします。
公式の方、どうなんでしょう。。。？
謎すぎて、いつもデフォのON設定ですが、英語圏や英語を激しく入力する場面だとONOFFで助かる人がいるのでしょう。（例えば単語の間違いで１０億の契約吹っ飛びましたとか飛行機が違う空港に降り立ちましたってなったら洒落になりませんね）
VSCodeのキーボードショートカットカスタマイズ

##モチベーション
秀丸をEmacsライクのキーバインドで使ってきた私がVSCodeに乗り換えの際に実施したもろもろをまとめておく。

##環境
VSCode
Win10

##キーボードショートカット

File->Preference->Keyboard Shortcuts->Show user keybidings で表示

###emacs流カーソル移動
| key | command | when |
|:-----------|:------------|:------------|
| ctrl+n | cursorDown | editorTextFocus |
| ctrl+p | cursorUp   | editorTextFocus |
| ctrl+f | cursorRight | editorTextFocus| 
| ctrl+b | cursorLeft | editorTextFocus |
| ctrl+a | cursorHome | editorTextFocus |
| ctrl+e | cursorEnd | editorTextFocus | 
| ctrl+t | cursorTop | textInputFocus |
| ctrl+shift+e | cursorBottom | textInputFocus |
| ctrl+d | deleteRight | editorTextFocus |
| ctrl+k | editor.action.deleteLines | textInputFocus && !editorReadonly |
| ctrl+h | actions.find | editorFocus||editorIsOpen |
SublimeText3でLinterを動かす備忘録

# 読まなくていいまえがき
課題が終わらなすぎて逃避エネルギーが溜まっていたので環境周りを整備しようと一念発起
そろそろ命名規約とかそういうの気にし始めないとなと今更思ったのでSublimeLinterを使ってみることに
```pip install linter_name```でいけるって記事多いけどさっぱり動かなかったので設定を直しましたとさ

# TL;DR
- SublimeLinterのPATH設定を直した（だけ）

```
"linters": {
        // The name of the linter you installed
        "linter_name": {
            // Disables the linter. The default here is 'not set'
            "disable": false,
            // Path to the executable to be used. Either a string or an
            // array. E.g. ['nvm', 'exec', '8.6', 'eslint']
            "executable": ["path/to/linter_name.exe", "-m", "linter_name"]
        }
    },
    "paths": {
        "linux": [],
        "osx": [],
        "windows": ["path/to/linter_name.exe"]
    }
```

# 環境
- Win10
- Anaconda（多分このせいで色々面倒になった）
- SublimeText3

# やったこと
- SublimeLinterを入れる（ここは他にもっとわかりやすい記事があるので省略）
- ```pip install linter_name```で好きなLinterを入れる
- ```where linter_name```でLinterの実行ファイルを探す
- 実行ファイルへの絶対PATHをコピってきてTL;DRのように設定(Preference>PackageSetting>SublimeLinter)
- SublimeText3再起動

# おまけ（ノウハウと言うにはお粗末なナニカ）
うまく動かないときは表示＞show consoleからコンソールを出して、エラーを見るのが良いよ
英語や公式ドキュメントはめんどくさがらず読もうね
（SublimeLinter-pylintのドキュメントちゃんと読んだらこうしてねって書いてあったよ…）

そもそもSublimeくんがどこにエラー吐くのか知らなかったとか色々あって思ったよりつまりましたとさ

# あとがき
なんかkiteとか言うのがPythonの補完に役立つらしいので調べてみたりしたい
そんなことしてると課題終わらないんだけどさ
オープンソース標準がISOになった日

皆さん、こんばんは。
今夜の名古屋は雪です。

2020年12月15日はオープンソースの世界の新たな歴史がまた一つ刻まれた日になりました。
Linux FoundationのOSSライセンスコンプライアンスの標準であるOpenChain2.1が、
ISO/IEC 5230:2020が国際規格として承認されたことが、
日本時間の15日夕方から16日午前中にかけて6ヶ国語で次々とプレスリリースされたのです。
オープンソース標準のISO化は14年間のLinux Foundationの歴史の中ではじめてのことです。

（原文）[ISO/IEC 5230:2020 Is The International Standard For Open Source Compliance]
(https://www.einpresswire.com/article/532725924/iso-iec-5230-2020-is-the-international-standard-for-open-source-compliance)
（日本語版）[オープンソース コンプライアンスの国際規格 ISO/IEC 5230:2020](https://www.einpresswire.com/article/532734989/iso-iec-5230-2020)

ISO/IEC 5230:2020は、
「組織がライセンスを遵守してオープンソースソフトウエアを適切に利用するための仕組み」について
規定されており、組織が各項目の要求を満足する場合認証を取得することができます。
今回のISO化と共に、トヨタ自動車がISO/IEC 5230適合を発表した初めての企業になったこともプレスリリースされました。

（原文）
[Toyota Is The First Company To Announce Adoption Of ISO/IEC 5230, The International Standard For Open Source Compliance](https://www.einpresswire.com/article/532724757/toyota-is-the-first-company-to-announce-adoption-of-iso-iec-5230-the-international-standard-for-open-source-compliance)
（日本語版）
[トヨタ自動車株式会社がオープンソースコンプライアンスの世界標準であるISO/IEC 5230適合を発表した初めての企業に]
(https://www.einpresswire.com/article/532723669/iso-iec-5230)

OpenChain Projectについて詳しく知りたいという方は

・OpenChainの活動については[昨年のOpenChain JWG Qiita Advent Calendar](https://qiita.com/advent-calendar/2019/openchainjapanswg)
・ISO標準については[本年のOpenChain JWG Qiita Advent Calendar](https://qiita.com/advent-calendar/2020/openchainjapanwg)

でプロジェクトメンバーが解説していますのでご覧ください！
libeditで頑張る〜GNUのreadlineっぽくキーバインドを設定する〜

この記事は、[上智大学エレクトロニクス研究部Advent Calendar](https://qiita.com/advent-calendar/2020/sophia_ele_lab)第16日目の記事です。

## はじめに

この記事はキーバインドがイマイチな `libedit` をカスタマイズする方法について解説します。
そもそも `libedit` とは何なのかわからないという方は同じくラインエディタである [`readline` についての解説記事](https://qiita.com/tomtsutom0122/items/60f0ab22771a8c65247a) を参照してください。

## `libedit` のキーバインドがイマイチな話

標準の設定のままだと、以下の問題が発生します。

### <kbd>^</kbd> + <kbd>R</kbd> でインクリメンタルサーチができない

割と使うインクリメンタルサーチ、しかし、 `libedit` ではショートカットキーが設定されていないため標準のままだとインクリメンタルサーチが使えません。キーバインドを設定するだけで使えるなら標準状態でサポートしてもいいはずなのに不思議ですね。

### <kbd>^</kbd> + <kbd>U</kbd> が行の文字をすべて削除になっている

これが地味に困ります。途中までカーソルをあわせてそれよりも前の文字を消したかっただけのはずなのに、すべての文字が消されてしまいます。

### <kbd>⌥ opt</kbd> + <kbd>←</kbd> が使えない

カーソル移動を早くしたいとき、このショートカットキーは割と便利です。しかし、標準設定ではサポートされていないので、 `[D` や `[C` と出力されるだけです。これも別の機能の被っているわけではないのに標準で設定されていません。

## どんなとき困るのか

`libedit` がどんなところで使われているかという話をします。 MySQLクライアントの `mysql` コマンド、 XCode Command Toolsに同梱されている `python3` コマンドなどがあります。python3は別のインストール方法があるので回避できますが、MySQLは使用頻度が高いため回避しにくいです。特にSQLでは複雑なコマンドを打つ機会が多く、昔のコマンドを使いまわしたいのにインクリメンタルサーチができないというのは痛いです。

## `~/.editrc` の中身

上記の問題をすべて解決するにはキーバインドの設定を変える必要があります。ホームディレクトリ直下に `.editrc` というファイルを作り、以下の内容を書き込めば設定完了です！

```
bind "^A" ed-move-to-beg
bind "^B" ed-prev-char
bind "^C" ed-tty-sigint
bind "^D" em-delete-or-list
bind "^E" ed-move-to-end
bind "^F" ed-next-char
bind "^I" rl_complete
bind "^K" ed-kill-line
bind "^L" ed-clear-screen
bind "^N" ed-search-next-history
bind "^O" ed-tty-flush-output
bind "^P" ed-search-prev-history
bind "^R" em-inc-search-prev
bind "^S" em-inc-search-next
bind "^T" ed-transpose-chars
bind "^U" vi-kill-line-prev
bind "^W" ed-delete-prev-word
bind "^X" ed-sequence-lead-in
bind "^Y" em-yank

bind "\e[1;5C" em-next-word
bind "\e[5C" em-next-word
bind "\e\e[C" em-next-word

bind "\e[1;5D" ed-prev-word
bind "\e[5D" ed-prev-word
bind "\e\e[D" ed-prev-word
```

## おまけ

おまけに `readline` をカスタマイズする `~/.inputrc` を晒しておきます。<kbd>⌥ opt</kbd> + <kbd>←</kbd> や <kbd>⌥ opt</kbd> + <kbd>→</kbd> で単語飛ばしでカーソル移動ができます。

```
"\e[1;5C": forward-word
"\e[1;5D": backward-word
"\e[5C": forward-word
"\e[5D": backward-word
"\e\e[C": forward-word
"\e\e[D": backward-word
```
rails:db:migrateを実行すると「Directly inheriting from ActiveRecord::Migration is not supported.」と出た

＜この記事について＞
自作のアプリ製作中にカラムを追加する流れで「rails:db:migrate」を実行すると「Directly inheriting from ActiveRecord::Migration is not supported.」と表示されエラーに。
初歩的なミスでしたが備忘録として投稿！

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

```
rake aborted!
StandardError: An error has occurred, all later migrations canceled:

Directly inheriting from ActiveRecord::Migration is not supported. Please specify the Rails release the migration was written for:
```

調べてみると、原因はマイグレーションファイルがrailsのバージョンに対応していないことが原因のようでした。。

対象のマイグレーションファイルの1行目末尾にrailsのバージョンを追加。

```
class AddAttachmentImageToPosts < ActiveRecord::Migration[6.0] #←[6.0]を追加
  def self.up
    change_table :posts do |t|
      t.attachment :image
    end
  end

  def self.down
    remove_attachment :posts, :image
  end
end
```

その後、再度以下を実行すると解決しました。

```
$ rails db:migarate
```
＜最後に＞
実装してエラーが出る、思うような結果が得られないことは多々あると思います。
そんな時は冷静な気持ちでエラー文と丁寧に向き合うようにしましょう！
Elasticsearch > Logstash > TSVを読む



pipeline config file(logstash.conf)を以下のように設定する

# 方法1

columnsにカラム名を設定する

```:logstash.con
input {
  file {
    path => ["/usr/share/logstash/data-path/*"]
    start_position => "beginning"
  }
}


filter {
  csv{
    separator => "	" # tab文字をセット,`\t`をセットしてはいけない    
    columns => ["column1", "column1", "column3"] # ファイルの1行目と同じカラム名と列数にする必要あり
    skip_header => false
    skip_empty_rows => true
    skip_empty_columns => true
    remove_field => "message"
  }
}

output {
  stdout {codec => rubydebug }
}
```



# 方法2

カラム名を設定せずに`autodetect_column_names`をTrueにして自動検出する
※ ファイル内の行処理順が保証されないので、logstash.ymlに設定を追加する必要がある。


```:logstash.con
input {
  file {
    path => ["/usr/share/logstash/data-path/*"]
    start_position => "beginning"
  }
}


filter {
  csv{
    separator => "	" # tab文字をセット,`\t`をセットしてはいけない    
    autodetect_column_names => true
    skip_header => false
    skip_empty_rows => true
    skip_empty_columns => true
    remove_field => "message"
  }
}

output {
  stdout {codec => rubydebug }
}
```

```:logstash.yml
pipeline.workers: 1
```


### separator


TSVのときはseparatorにタブ文字を入力する。
`\t`をセットしてはいけない


```
separator => "	"
```




### autodetect_column_names (自動カラム検出)

autodetect_column_names => true


1行目をヘッダー列として自動で列名を設定する機能

のはずが、実行する度に1行目が列名と認識したり、2行目が列名と認識されたりばらばらな挙動となった。

以下の情報で解決した。要はマルチパイプラインがファイルの1行単位で動作しているので処理順はファイルの行の通りにならないとの事。

[Autodetect_column_names take header from second row · Issue #67 · logstash-plugins/logstash-filter-csv](https://github.com/logstash-plugins/logstash-filter-csv/issues/67)
[`autodetect_column_names` does not work with multiple worker threads · Issue #65 · logstash-plugins/logstash-filter-csv](https://github.com/logstash-plugins/logstash-filter-csv/issues/65)


よく見たら以下の公式マニュアルにも書いてあった。（見過ごしていた）
パイプラインワーカーを1に設定せよとのこと。

[Csv filter plugin | Logstash Reference [7.10] | Elastic](https://www.elastic.co/guide/en/logstash/current/plugins-filters-csv.html#plugins-filters-csv-autodetect_column_names)

> Logstash pipeline workers must be set to 1 for this option to work.


logstash.ymlに設定するか、素直に[columns](https://www.elastic.co/guide/en/logstash/current/plugins-filters-csv.html#plugins-filters-csv-columns)を設定したほうがよさそうです。

```:logstash.yml
pipeline.workers: 1
```



# 参考


https://gist.github.com/carrotsword/1824c1fe79d1cc3270ba17e615388faa#file-logstash-conf
https://www.elastic.co/guide/en/logstash/current/plugins-filters-csv.html
【個人アプリ作成】情報管理アプリ制作16日目


昨日は仕事に１００％割いたので悔いなし。今日の実績。

#今日やったこと

>・ 顧客データ登録画面の作成
・ 中間テーブルの保存の復習
・ JavaScriptで装飾（ボタンをクリックするとメニューが出る）


#中間テーブルの保存

createアクションに対して、{:users_id []}の記述で自動で連携・保存される（ストロングパラメーターは必須だけど）

アソシエーションを組んでいるためのなのか、保存される仕組みは完璧には分からないかったが、仕組みは理解。明日から実装していく。


#JavaScriptが全然うまくいかない

Id属性の情報は取れているのに、Chromeでデバックするとすぐリロードされて消える、、、、

```
function clickbutton(){
  const pushPlusButton = document.getElementById("index-plus")
  
  pushPlusButton.addEventListener('mouseover', function(){
    console.log("aaaa")
  })
}

window.addEventListener('load', clickbutton)
```

console.logの記述が一瞬だけ出てすぐ消える、、、
turbolinksの記述は消した方がいいはずなんだけど、ダメだったのか、、、

実装苦戦中です。。。。
[Linux] VirtualBoxにCentOSをインストールしました


自分のPC(Windows10)にVirtualBoxをインストールし、CentOSをVirtualBoxにインストールしてみました。という完全な個人的なメモでございます。すみません。

ダウンロードしたもの
・VirtualBox : VirtualBox 6.1.16
　　VirtualBoxのページ：[VirtualBox](https://www.virtualbox.org/)

・CentOS : CentOS-8.3.2011-x86_64-dvd1.iso
　　CentOSのページ：[CentOS](https://www.centos.org/)

そして、インストールしてみたのですが、いちおうCentOSは起動したのですが、きちんと（？）インストールできたのか自分でも良くわからない状態です。

何の役にも立たない記事ですね。明日、もう一度やり直してみようと思います。
エラーメッセージの日本語化（rails）

## rails-i18n（Gem）
　日本語に対応できるようになるGemのこと。


## localeファイル
　エラーメッセージを全て日本語にするために必要なファイルで、さまざまな言語に対応できるファイルのこと。この中に日本語化用のファイルを作成することで、英語を日本語に翻訳できる。

## 実装方法
#### ①日本語の言語設定

```ruby:config/application.rb

require_relative 'boot'

require 'rails/all'

Bundler.require(*Rails.groups)

module Asakatu5757
  class Application < Rails::Application
    config.load_defaults 6.0
    config.i18n.default_locale = :ja

    config.time_zone = 'Tokyo'
  end
end
```
　今回追加した記述は「**config.i18n.default_locale = :ja**」で、標準言語の日本語にすることができる。

#### ②rails-i18nの導入
```ruby:Gemfile
gem 'rails-i18n'
```
```ruby:ターミナル
% bundle install
```

#### ③locales内に日本語化用のファイルを作成し、編集する。

例）Userモデルのnicknameカラムを日本語化する場合。

```ruby:config/locales/ja.yml
ja:
 activerecord:
   attributes:
     user:
       nickname: ニックネーム
```
gitのバージョンアップ

## はじめに

gitちゃんと勉強して使えるようになろう！　
と思ってバージョン確認してみたら古かった。で，バージョンアップしようとしたけど手こずったのでメモします。でもちゃんと自分で解決できた！嬉しい！
ちなみにMacです。

そもそもよく理解してないままQiitaとかの記事見てそのままコピペするからいけないんだよね。。

## で，本題
まずはバージョン確認

```
$ git --version
git version 2.20.1 (Apple Git-117)
```
今2.29.2とかなんで古いですね。

```
$ brew update 
```
これはこのまま戻ってこなくなった。よくわかってないです。
あんまり待っても返ってこないから ctrl+C しました。

```
$ brew install git
Updating Homebrew...
...
```
ここから下つらつらつらーっと続きます。
どうやら上の２行だけでできるらしいんですが。

```
$ git --version
git version 2.20.1 (Apple Git-117)
```
変わってないじゃん！！！
で，よくわかってないからインストールできてないのかなってまた同じことしたりしてました。。

```
$ which git
/usr/local/bin/git
```
よくわからないままパスがなんちゃらって読んで，確認して，わからん！！ってなり。
Summaryにどこにインストールされたかが書いてあることを知り，遡って探して…
（無駄にいじったんで探すの大変でした笑）

インストール文の途中，

```
==> Summary
🍺  /usr/local/Cellar/git/2.29.2: 1,480 files, 39.2MB
```
見つけた！
そこだけコピペして，ちょっと付け足して，

```
$ /usr/local/Cellar/git/2.29.2/bin/git --version
git version 2.29.2
```
できてたーー!

で，多分このデフォルトになってるApple Gitじゃなくこれにパス指定した方がいいんだよね？ってことで

```
$ echo 'export PATH="/usr/local/Cellar/git/2.29.2/bin:$PATH"' >> ~/.zshrc
$ source ~/.zshrc
```
```
$ git --version
git version 2.29.2
```

## 終わりに

一応，インストールは初めにできてたんだけど，確認ができなくて手こずった，って話でした。
簡単に言うと場所が違ったってことですね。
ひとつ成長！
Flash Advent Calendar 13日目 - テキスト入力の再現方法 -

Flashでは任意の箇所にテキスト入力ができます。
ただ、Canvasは画像なので、テキスト入力には対応していません。
なので、HTMLのTextAreaを駆使して再現する必要があります。

方法を記載すれば、なんだ、そんな事かとなるのですが
派手な実装ではないのと意外と管理が面倒なので、後回しにされがちです。

# 目次

* テキストエリアにヒットした時にマウスのカーソルを変化させる
* 発火するイベントは全て移植する

# テキストエリアにヒットした時にマウスのカーソルを変化させる

スマホでは見れないのですが、PCだとここが記入エリアだよって事が分かりやすので
意外と必要な機能でした。

1. MOUSE_MOVEで座標情報取得して、エリア内の座標が入ったらカーソルを変えて
2. MOUSE_DOWNでTextAreaをCanvasの上に透過して設置して文字の入力を行えるようにする
3. エリアから外れると、TextAreaを削除してカーソルを元に戻します。

![2020-12-16-224830.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80502/9dabedbb-9db2-dd94-e039-4a5ee667c95c.gif)


# 発火するイベントは全て移植する

FlashでTextFieldクラスに定義されてるイベントは全て移植してcanvasに反映する
文字制限などあれば入力のイベントの度に文字データを受け取り処理を行い、またTextAreaに結果を反映していく

例)入力制限a-zのみ入力可能

```actionscript
textField.restrict = "a-z";
```

![2020-12-16-230014.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80502/68484fec-3983-c34c-9106-a2f4974c6db0.gif)

便利な機能なのですが、意外と日の目をみない機能なので
せめてここで披露したいと思い記事にしました。

明日はWebSocketのハンドシェイクをエミュレートした話を書こうと思います。
cssでよく見るサイトまとめ

#display:flexの使い方
https://www.webcreatorbox.com/tech/css-flexbox-cheat-sheet

#ニューモフィズムデザインのCSSガイド
https://neumorphism.io

#CSSで要素を上下や左右から中央寄せする7つの方法
https://www.granfairs.com/blog/staff/centering-by-css
チームに「こうなってほしい」を実現する

今年度に入ってから、我々のチームは自己組織化が進み、チームとしていかにして目標を達成するかを考えながら動くようになってきた気がします。その中で、私がエンジニアリングマネージャーとしてチームに「こうなってほしい」と考えたことがどうやって実現したのかについて語りたいと思います。

きちんと体系化せず、自分の想いだけで書くのでポエムと思って読んでいただければ幸いです。

## 課題例
かつて私がチームに「こうなってほしい」と考えたことの例を一つ挙げてみます。

企画者がある機能の要件を検討し、開発者がそれを実装するシーンを思い浮かべてみてください。企画者は詳細に要件を検討したつもりでしたが、どのようなエラーケースがありえるかをすべて洗い出すことはできておらず、いくつかのエラー時のUI表示に関する要件を決めきれていない状態で開発者に実装を依頼しました。企画者は実際に開発を行うわけではないので、このようなことはしばしば発生すると思います。しかし、実装者は要件定義されていないエラーケースがあることに気づきながらも、その部分は適当な処理にして実装を完了させました。リリース後、そのエラーケースが発生した際のUIを目にした企画者は、これはUXを大きく損なうものだと気づき、頭を抱えました。

このようなことがしばしば発生していたので、私は開発者に、企画者が検討した要件に抜け漏れがあった場合には、素晴らしいUXのプロダクトをユーザーに提供するために、企画者に報告をし、もし更に可能なら、こういう要件・仕様にしたらどうかという提案をしてほしいと考えました。

## どうやったら「こうなってほしい」が実現したか
結論から書いてしまうと以下のようなことをしたところ「こうなってほしい」が実現したように思います。

1. なりたいチーム像を共有する
2. なりたいチーム像になるための望ましい行動をチームメンバーがしたときに感謝の意を示す
3. どうしたら、なりたいチーム像に近づけるかをチームメンバーと話す
4. チームみんなで感謝し合う

感謝って大事。本当に。
人間の原動力です。

具体的にどうやったかを一つずつ説明します。

### 1. なりたいチーム像を共有する
タイトルの通りなのですが、自分が考えている、なりたいチーム像を思う存分チームの前で語ります。思っているだけでは伝わらないので、ちゃんと言語化して伝えるのが大事。

例えば私は以下のようなことを語りました。

- このチームが結成されている目的はなにか
- 目的を達成するためにチームとしてどうあるべきか

「このチームが結成されている目的はなにか」はインセプションデッキの質問の１つと同じです。チームが同じ方向を向いて開発を進めるために語ります。

最初に挙げた課題例のようなことは、例えば開発者が「ある機能の開発を期限までに終わらせること」を目的としていた場合には起こってしまうと思います。しかし、本来チームが結成されている目的はそれほど小さなことではなく、「プロダクトをユーザーや自社にとってより価値あるものにすること」くらいには大きいものだと思います。目的がはっきりしていると、何かに悩むたび、チームはその目的に立ち返り、本当に目的のために正しいことをしているかを考えられます。

「目的を達成するためにチームとしてどうあるべきか」は具体的にチームとしてどういう動きをしてほしいかを伝えました。

「プロダクトをユーザーや自社にとってより価値あるものにすること」を目的とした場合、課題例では、開発者が「この機能の要件満たせているし、企画者から要件が来ていないところは適当な実装で済ませて完了にしよう」ではなく「ユーザーにこのエラーがそのまま出てしまうとUXを損ねるから、こういう表示にするのはどうか提案してみよう」と考え行動するほうが、チームの目的にはあっているはずです。

こういうことをいくつか素直にチームに伝えてみました。

### 2. なりたいチーム像になるための望ましい行動をチームメンバーがしたときに感謝の意を示す

なりたいチーム像を共有したら、その後誰かが少しずつ「こうなってほしい」を実践し始めてくれました。このとき大事なのが感謝の意を示すことでした。

例えば先程の例で、開発者が「ユーザーにこのエラーがそのまま出てしまうとUXを損ねるから、こういう表示にするのはどうか提案してみよう」と考え、実際に提案をしてくれたとします。その時はまず提案をしてくれたことに対してとにかく感謝の意を示します。もちろんその提案が企画者によって採用されない場合もありますが、その場合もまずは「ありがとうございます。提案してもらえてとても嬉しいです。おかげチームが課題に気づけました。また課題を見つけたら積極的に提案していただけるとありがたいです」のように感謝をきちんと伝えます。

これには次のような効果がありそうです。

- やってみた行動が正しかったことを伝えられる
- 次もやってみようというモチベーションを与えられる
- 他のメンバーにもその行動が評価されることを伝えられる

### 3. どうしたら、なりたいチーム像に近づけるかをチームメンバーと話す

トップダウンで理想のチーム像を語り、こうなってほしいと伝えてもうまく行かないことももちろんたくさんありました。そういう場合はメンバーに、なぜうまく行かないのか、どうやったらうまく行きそうかを直接聞いてみるのが手っ取り早いと思います。私は特に1on1の場で個々人に相談するのが好きです。

相談してみると、「そもそもそんな話があったことを忘れてて普段意識していなかった」と言われて継続的な呼びかけが不足していることに気づくこともあれば、「実行するのにこういう部分で障害を感じてしまう」と言われて、では解消方法を一緒に検討しましょうとなる場合もあります。このときどんな返事が返ってくるかはもちろん大事なのですが、それよりも、なりたいチーム像に近づくためにどうすべきかを定期的に考える機会があることがもっと大事だと考えています。

### 4. チームみんなで感謝し合う

我々のチームでは毎週レトロスペクティブを実施しています。レトロスペクティブではチームメンバーにその週良かったことや、課題に感じていることなどを挙げてもらいます。良かったことには、チーム全体での試みとしてうまく行ったことも挙がりますが、誰かが何かをしてくれたことへの感謝も挙がってきます。この、チーム内での感謝をレトロスペクティブの場で伝えあえたことが非常に良かったです。

「Aさんがエラーケースのハンドリングの要件漏れを伝えてくれたおかげでUXを損なわずに済んだ」みたいなことをチームメンバー同士で言い合うことによって、お互いが更にチームに貢献してプロダクトを良くしていこうというモチベーションにつながったと思います。

## まとめ

長々と書きましたが、我々にとって大事だったことは本当に少しだけでした。

- なりたいチーム像を共有すること
- 望ましい振る舞いに対しては感謝を伝えること
- なりたいチーム像に近づくためにどうすべきかを継続的に考えること

この一年は感謝によって回りだしたように感じます。
今後もチームに感謝しながら仕事できたら幸せです。
IchigoJam のプログラムをシンタックスハイライトしてみる

この記事は、[IchigoJam Advent Calendar 2020](https://qiita.com/advent-calendar/2020/ichigojam) の 18 日目です。

# きっかけ

IchigoJam の画面は白黒です。なので、`LIST` 命令でプログラムを出力しても当然白黒で表示されます。
まぁ、それはそういうものだと割り切ってしまえばいいのですが、プログラムをウェブページなどに載せる時くらいは、シンタックスハイライトされてたら見やすくなるかな、と思ったわけです。

# シンタックスハイライトとは

言わずもがなと思いますが。

[シンタックスハイライト - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%B3%E3%82%BF%E3%83%83%E3%82%AF%E3%82%B9%E3%83%8F%E3%82%A4%E3%83%A9%E3%82%A4%E3%83%88)

[Qiita にはソースコードをシンタックスハイライトする機能がある](https://qiita.com/Qiita/items/e84f5aad7757afce82ba)ものの、BASIC 言語はサポートされていません。まぁ、一口に BASIC 言語と言っても実際にはかなりのバリエーションがあるわけで、なかなか汎用的には作れないという事情があるのかもしれません。

# とりあえず作ってみました

前置きはこのくらいにしておいて、とりあえず、[CodePen 上でデモを公開しました](https://codepen.io/obonokun/pen/WNGpVBy)。
HTML で `<div class="sh4ij">` ～ `</div>` で囲んだ範囲が以下のような感じで表示されます。
![プレビュー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152579/b86ea35c-daca-c8b3-5d10-c838c965f994.gif)
HTML なので、不等号については、`&lt;` `&gt;` と書く必要があります。あと、絵文字については Kidspod に倣って `(#16進数)` と書けば、対応する文字に置換されます。

# 解説

ウェブサイトに載せるということで、HTML + CSS + JS の組み合わせで実現するならば、

[コードのハイライト表示 JS ライブラリ ３種](https://qiita.com/tadnakam/items/1323d03743fc0101aa50)

このあたりを使えばサクッとできそうなのですが、IchigoJam の BASIC 言語は割と文法が緩い部分があるため(これは古い BASIC 言語全般に言えます)、もう一工夫する必要があります。
例えば、

```
100 IF A THEN GOTO 10
```

というような行儀の良いコードなら問題ないのですが、スペースとかが無くてもインタプリタがよしなに解釈してくれるため、

```
100 IFATHENGOTO10
```

と書いても動作してしまいます。このような行儀の悪い書き方をされてしまうと、上記の記事内で紹介されているライブラリではうまく対応できないのです。

公開しているデモでは、「正規表現 `[A-Z][\.2A-Z]+\$?` でマッチした文字列に対し、特定のキーワードと前方一致したら、一致した範囲をハイライトする」という処理を、解析対象の文字列の先頭から順繰りに適用することで、上記のような行儀の悪いコードにもそれなりに対応しています。
あとは IchigoJam ならではの改修点としては、数値リテラルの判定を以下のようにしています。

* 整数のみしか扱えないので、小数点 `.` は対象外
* 16進数の接頭文字は `&H` ではなく `#`
* 2進数の接頭文字は `&B` ではなく `` ` ``

前述のように、絵文字の置換処理も入れているので、もはや汎用性は度外視で、IchigoJam に特化した実装となっています。

# 感想

正直なところ、シンタックスハイライトしたところで大して見やすくはなりませんでした。色のチョイスが悪いのかな。
[IchigoJam 公式 Twitter](https://twitter.com/IchigoJam_JP) からも、

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">（見やすくなったかどうかはさておき…🤫）<br>IchigoJamのロゴカラーっぽく、かつ、クリスマス時期に合っていてかわいいです！^^ <a href="https://t.co/SkSWjHFyaq">https://t.co/SkSWjHFyaq</a></p>&mdash; こどもパソコン「IchigoJam」公式 (@IchigoJam_JP) <a href="https://twitter.com/IchigoJam_JP/status/1336811230162341888?ref_src=twsrc%5Etfw">December 9, 2020</a></blockquote>
<!--script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script-->

という、微妙な評価をもらいました。

単に色分けするだけではなく、

* 命令にカーソルを当てたら、その命令の説明文を表示する
* 変数にカーソルを当てたら、プログラム内のすべての登場個所を一斉にハイライトする
* `GOTO` や `GOSUB` の後のラベルや行番号にカーソルを当てたら、飛び先の行をハイライトする

という具合に、インタラクティブな反応をするようにしたら、もっと意義のあるものになるのかもしれません。
Timeshiftのバックアップ対象にホームディレクトリを含める方法

## 実行環境

* Ubuntu Server 20.04 LTS

## 前置き

Linux版「システムの復元」または「TimeMachine」と名高い（？）[Timeshift](https://github.com/teejee2008/timeshift) ですが、
本家のReadmeも使い方をまとめた記事もGUI操作が前提のものばかりで、CUIでの実行は中々ヒットしません。

今回はタイトルの通り「バックアップ対象にホームディレクトリを含める方法」が分からなくて苦労したので、自分と同じようにCUIで操作する方の為に残しておきます。


**※注意※**
[user-data-is-excluded-by-default](https://github.com/teejee2008/timeshift#user-data-is-excluded-by-default) に書いてある通り、
Timeshiftでは意図的にホームディレクトリをバックアップ対象から除外しています。

ホームディレクトリのバックアップが必要かどうかはご自身の判断でお願いします。


## 結論

結論から言うと、バックアップ対象に含めたいディレクトリの先頭に `+ ` を付けて下さい。

```
  "exclude" : [
    "/root/**",
    "+ /home/piyo/**"
  ],
```


## 基本

前提として、CUIで操作する場合は設定ファイル (`/etc/timeshift/timeshift.json`) を直接変更します。
このファイルの中身は以下の通りです。

```
{
  "backup_device_uuid" : "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "parent_device_uuid" : "",
  "do_first_run" : "false",
  "btrfs_mode" : "false",
  "do_first_run" : "true",
  "btrfs_mode" : "false",
  "include_btrfs_home" : "false",
  "stop_cron_emails" : "true",
  "schedule_monthly" : "false",
  "schedule_weekly" : "false",
  "schedule_daily" : "false",
  "schedule_hourly" : "false",
  "schedule_boot" : "false",
  "count_monthly" : "2",
  "count_weekly" : "3",
  "count_daily" : "5",
  "count_hourly" : "6",
  "count_boot" : "5",
  "snapshot_size" : "0",
  "snapshot_count" : "0",
  "exclude" : [
    "/root/**",
    "/home/piyo/**"
  ],
  "exclude-apps" : [
  ]
}
```

大体の設定方法は項目名を見ればなんとなく分かるんじゃないかと思います。

こちらの記事に一部ですが記載があったので参考にどうぞ。
[弐号機　システムバックアップ
](https://blog.office-iwakiri.com/archives/linux/ubuntu-1042)


## 本題

バックアップ対象に含めたいホームディレクトリを「/home/piyo」とします。

ホームディレクトリを除外している設定は `/etc/timeshift/timeshift.json` の "exclude" の部分です。

```
  "exclude" : [
    "/root/**",
    "/home/piyo/**"
  ],
```

exclude（除外）の指定なんだからそこから消せばいいじゃん！ってことで

```
  "exclude" : [
    "/root/**",
  ],
```

こんな感じに変更しても、piyoユーザーのホームディレクトリはバックアップ対象になりませんでした。

ではどうすればバックアップ対象に出来るのか。
調べても中々ヒットしませんでしたが、GitHubのIssueに答えがありました。
[Added filters appear to not be working](https://github.com/teejee2008/timeshift/issues/145)

正しい設定方法は

```
  "exclude" : [
    "/root/**",
    "+ /home/piyo/**"
  ],
```

「先頭に`+ ` を付ける」です。

変更後、バックアップ取得コマンドを実行すると`/home/piyo/`以下のディレクトリもバックアップ対象になっていることを確認しました。


## 感想

exclude で指定しているのに`+`を付けるとバックアップ対象に含まれるのはとても分かりづらい。


## 参考

https://github.com/teejee2008/timeshift/issues/145
忘れ物タグで、娘のお気に入りのプテラノドンをすぐ見つけられるようにした

好きなモノは酒と女とラーメン、LIFULLのてぃば(@rechiba3)です。
この記事は、[LIFULLその2 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/lifull2)の16日目の記事です。

#はじめに
我が家に舞い降りたエターナル可愛い大天使にはお気に入りのプテラノドンのお友達、通称「プテラ」ちゃんがいます。

![20201216_friends.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86461/cfcffe61-8e6d-65ee-52fd-ca888ee97e03.jpeg)

寝るときも一緒、水族館も一緒、旅行でも、どこに行くにも一緒です。
一緒すぎて、先日は保育園に持っていこうとしていたところで自転車置き場に落として来てしまう・・・なんて大事件も発生しました。

家の中でも、布団の下、ソファの隙間、カーテンの裏などいたる所に隠れています。
これじゃあいつか、行方不明になってしまって3歳児大騒ぎだなと思ってついにお試し購入しました！

忘れ物タグ、「tile」！

![20201216_title.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86461/9f18cfc3-950d-02ae-b0dc-c8b3f66f5326.jpeg)

ノーコード開発のため、キャプチャ画像多めで紹介します。

#1.tileアプリをダウンロード
![20201216_tile01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86461/6864475d-3bba-f6ca-0d5f-bb02476732ff.png)

公式アプリがあるので、ダウンロードします。
位置情報の使用を許可します。
「tileを追加」をタップして、買っておいたtitleを起動します。

#2.titleにプテラちゃんを登録する
![20201216_tile02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86461/359b0883-4cc8-26f9-af69-f7b006a3b885.png)
手持ちのtileを登録したら次へ進み、試しに探した後にtileをつけるジャンルを選びます。

![20201216_tile03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86461/5f05bba7-19c2-5a63-1828-95c1d5e5e7d5.png)

おもちゃを選び、完了。次に、登録した「おもちゃ」をタップして詳細内容を編集します。
おもちゃの写真をプテラちゃんに。名前も「プテラちゃん」にしてばっちりです。

#3.Google Homeスピーカーと連携
![20201216_tile04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86461/95400735-7074-12bd-cf59-6fdedb283aef.png)
「Google Home Tile」でググると、すぐに公式ヘルプがでてきます。
書かれたとおりにGoogleアシスタントにリンクして、一瞬で登録が完了しました！https://support.google.com/googlenest/answer/9586755?hl=ja

#さっそくデモ！

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">プテラちゃんテスト <a href="https://t.co/enTyUOyhBi">pic.twitter.com/enTyUOyhBi</a></p>&mdash; てぃば │ Web事業のサービス企画職 (@rechiba3) <a href="https://twitter.com/rechiba3/status/1339209053130506241?ref_src=twsrc%5Etfw">December 16, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
おや・・・鳴らない・・・
と思って、動画を止めた途端、！

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">プテラちゃんテスト2 <a href="https://t.co/ZyTKRHEGKI">pic.twitter.com/ZyTKRHEGKI</a></p>&mdash; てぃば │ Web事業のサービス企画職 (@rechiba3) <a href="https://twitter.com/rechiba3/status/1339209127474593799?ref_src=twsrc%5Etfw">December 16, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
鳴った〜〜！あんしん〜！
ノーコードで成功！

今回はGoogle Homeで鳴らしましたが、スマホアプリ上で鳴らすこともできるし、Bluetooth®通信が最後に接続した場所を記録してくれます。

いざってときのために、活用し続けたいです◎