OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby on Railsのkaminari導入手順


## Railsのgemであるkaminariを導入します。

Gemfileに'kaminari'を記載

```ruby:Gemfile
gem 'kaminari'
```

インストールする

```ruby:コマンドライン
$ bundle install
```
scaffoldでデータ用のモデル等を作成する

```ruby:コマンドライン
$ rails g scaffold data_page data:text
```

マイグレーションする

```ruby:コマンドライン
$ rails db:migrate
```

ダミーデータを入れる

```ruby:db/seed.rb
data = ['one','one','one','one','one','one','one','one','one','one','one','one','one']

for i in 1..100 do
  DataPage.create date:data.sample
end
```

```ruby:コマンドライン
$ rails db:seed
```

kaminariの設定ファイルを作成

```ruby:コマンドライン
$ rails g kaminari:config
```

設定ファイルの編集

```ruby:config/initializers/kaminari_config.rb
# frozen_string_literal: true
Kaminari.configure do |config|
  config.default_per_page = 10 #1ページに表示される数
  # config.max_per_page = nil #1ページの最大表示数
  config.window = 3            #現在のページの左右に表示する数
  # config.outer_window = 1
  # config.left = 0
  # config.right = 0
  # config.page_method_name = :page
  # config.param_name = :page
  # config.params_on_first_page = false
end
```

コントローラーの修正

```ruby:app/controllers/data_pages_controller.rb
  def index
    #修正前 @data_pages = DataPage.all
    @data_pages = DataPage.page params[:page]
  end
```

ブラウザに表示されるindexファイルの修正

```erb:app/views/data_pages/index.html.erb
<p id="notice"><%= notice %></p>

<h1>Data Pages</h1>

<

<table>
  <thead>
    <tr>
      <th>ID</th>
      <th>Date</th>
      <th>Create at</th>
      <th colspan="3"></th>
    </tr>
  </thead>

  <tbody>
    <% @data_pages.each do |data_page| %>
      <tr>
        <td><%= data_page.id %></td>
        <td><%= data_page.date %></td>
        <td><%= data_page.created_at %></td>
        <td><%= link_to 'Show', data_page %></td>
        <td><%= link_to 'Edit', edit_data_page_path(data_page) %></td>
        <td><%= link_to 'Destroy', data_page, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>
</table>

<br>
<%= paginate @data_pages %>
<br>
<%= link_to 'New Data Page', new_data_page_path %>
```

ブラウザで確認するとこんな感じです。

![スクリーンショット 2019-06-11 22.13.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420746/6f969294-b87b-b5bb-dcc3-fa373b066a42.png)

それでは！！
Leetcode #213: House Robber II

```swift
func rob(_ nums: [Int]) -> Int {
    if nums.isEmpty {
        return 0
    }
    if nums.count == 1 {
        return nums[0]
    }
    if nums.count == 2 {
        return max(nums[0], nums[1])
    }
    var robFirst = Array(repeating: 0, count: nums.count)
    var notRobFirst = Array(repeating: 0, count: nums.count)
    robFirst[0] = nums[0]
    robFirst[1] = nums[0]
    notRobFirst[1] = nums[1]
    var answer = 0
    for i in stride(from: 2, to: nums.count, by: 1) {
        if i == nums.count - 1 {
            robFirst[i] = robFirst[i-1]
        } else {
            robFirst[i] = max(nums[i]+robFirst[i-2], robFirst[i-1])
        }
        notRobFirst[i] = max(nums[i]+notRobFirst[i-2], notRobFirst[i-1])
        answer = max(answer, robFirst[i], notRobFirst[i])
    }
    return answer
}
```
JavaScriptのfor-inとfor-ofの違い

#for-in
オブジェクトの列挙可能プロパティに対して、順不同で反復処理を行う。オブジェクトの中身を取得するのに使用する。

```html:forInTest.html
<!DOCTYPE html>
<html>
  <head>
    <script>
     var string1 = "";
      var object1 = {a: 1, b: 2, c: 3};

      for (var property1 in object1) {
        string1 += object1[property1];
      }

      alert(string1);
      // 123と表示される
    </script>
  </head>
  <body></body>
</html>

```

#for-of
iterableオブジェクトの個々のプロパティに対して反復処理を行う。(iterableオブジェクトにはArray,NodeList,Mapなどが含まれる)

```html:forOfTest.html
<!DOCTYPE html>
<html>
  <head>
    <script>
      function* foo(){
          yield 1;
          yield 2;
      }

      for (let o of foo()) {
        //1 -> 2 と表示される
        alert(o);
      }
    </script>
  </head>
  <body></body>
</html>
```
Leetcode #209: Minimum Size Subarray Sum

```swift
func minSubArrayLen(_ s: Int, _ nums: [Int]) -> Int {
    var answer = Int.max
    var left = 0
    var sum = 0
    for i in stride(from: 0, to: nums.count, by: 1) {
        sum += nums[i]
        while sum >= s {
            answer = min(answer, i + 1 - left)
            sum -= nums[left]
            left+=1
        }
    }
    return answer != Int.max ? answer : 0
}
```
スクラム勉強会「[すくすくスクラム仙台]スクラムガイドを読んでみよう」に参加した話

5/23にスクラム勉強会のイベント「[すくすくスクラム仙台]スクラムガイドを読んでみよう」に参加してきました。
スクラムの知識が浅いため、体系的に勉強することで理解を深めたいと思い参加しました。
https://suku3rum-sendai.connpass.com/event/129483/

## 当日のイベントの流れ
参加者は10名。
内訳はIT系が7名、電機系が2名、教育関係者が1名。

「Active Book Dialogue」という手法で進めました。
www.abd-abd.com/
具体的な流れは以下の通りです。

## その１：スクラムガイドのチャプター(全10章)ごとに担当者を決める。
https://scrumguides.org/docs/scrumguide/v2017/2017-Scrum-Guide-Japanese.pdf

## その２：15分で紙5枚以内に要約する。
担当者が各々のチャプターを要約しました。
1 スクラムガイドの目的、スクラムの定義
2 スクラムの用途、スクラムの本質、スクラムの理論
![IMG_0515.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243408/d6c9ab27-3a08-3f38-2916-646b5293d35d.jpeg)

3 スクラムの価値基準、スクラムチーム
4 プロダクトオーナー、開発チーム　←　私が担当しました
5 スクラムマスター、スクラムイベント
![IMG_0516.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243408/df03c715-bb75-1619-8b2b-ad091a087f6a.jpeg)

6 スプリント、プランニング
7 デイリースクラム、スプリントレビュー
8 スプリントレトロスペクティブ、スクラムの作成物
![IMG_0517.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243408/1a31024c-4021-3ac9-d211-6792403aa842.jpeg)

9 プロダクトバックログ、スプリントバックログ
10 インクリメント、作成物の透明性、「完成(Done)」の定義
![IMG_0518.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243408/a5d0f46f-f0dc-b2a4-018d-507b5afcbaf3.jpeg)


## その３：リレー方式でプレゼンをする。一人90秒。
時間が足りず、途中で終わってしまう方が多かったです。
（私は時間内になんとかプレゼンを終えました）

## その４：気になった・もっと知りたいと思った箇所をマーク。

プレゼン後、気になった箇所をマークします。
特に
・5章(スクラムマスター、スクラムイベント)
・10章(インクリメント、作成物の透明性、「完成(Done)」の定義)
にマークがつきました。


## その５：特にマークが多い章2つを取り上げ、グループに分ける。15分間質疑応答をする。
ここから5章と10章、2つのグループに分かれて質疑応答をします。
私は5章のグループに行きました。

5章をざっくり要約すると以下の通りになります。
```
開発チームにおける開発の流れはざっくり言うと、
「レビューをする→チーム全体でレビューをする」こと。
この流れをできるだけ早いスパンでやると良い。
5章ではスクラムマスター・イベントが果たす役割の話をしている。
スクラムマスターは開発チーム、プロダクトオーナー、組織を支援する。```

質疑応答では以下の質問と回答が出ました。
Q1.
スクラムの「イベント」とは何か？イベントという単語だけでは抽象的で分かりにくい。
A1.
規則的/一定にサイクルでやる、会議や打ち合わせなどのようなもの。

Q2.
スクラムの効果があることを証明するにはどうしたらいいか。
A2.
・残業時間が減ったか
・ソースコードが綺麗になったか
・バグが減ったか
等にフォーカスを当てると良い。
組織を上手く回して、メンバーの力を引き出せるようにするとなおよい。

Q3.
スクラムマスターが開発チームの支援でするべきこととして、
「進捗をさまたげるものの排除」とあるが、具体的にはどういうことをするのか？
A3.
作業の優先順位をつけ、優先順位の高い作業からやる。
優先順位の低い作業が溢れて「進捗を妨げる」ことを防ぐ。

## その６：最後に質疑応答の内容やでた意見を発表する。
最後に5章、10章のグループでどんな質問や意見が出たか発表します。
10章のグループ(インクリメント、作成物の透明性、「完成(Done)」の定義)では、以下の内容を発表していました。

Q.
完成(Done)の定義において、リリースをするかしないかの判断はどうやってするのか。
A.
クライアントと事前に認識あわせをする。
認識合わせのずれを防ぐためには、
・カテゴライズ
・コミュニケーション
・プランニング
などの手段で見積もりのミスを防ぐことが大事。

## 感想
・スクラム開発を体系的に学ぶことができたため、「感覚として知っているけど概念的にはよく知らない」状態から理解が深まりました。
・スクラム＝webシステムの開発に主に使うイメージがありましたが、勉強会を通じ製造・教育など幅広い分野に応用できるものであることが分かりました。
・整理してプレゼンしたり、気になった点を質問して掘り下げたり、どんな質疑応答や意見が出たかをまとめたりすることで、ただ本を一人で読むのに比べ効果的に学習することができました。
「YAMLで履歴書を作る」をDockerでマイクロサービス化しました

# TL;DL
これは@kaityo256氏が開発した**[YAMLで履歴書を作る](https://github.com/ikasam/docker-yaml_cv)**の上級互換版です。
スタイル等の書き方は@kaityo256氏の**[記事](https://qiita.com/kaityo256/items/e3884d0109223c324baf)**をご覧ください。

- **~~DEMO: https://yaml-2-resume.herokuapp.com/~~** (Herokuの公開が終了したため、[文末のJS版](#20241223更新)をご利用ください)
- **GitHub: https://github.com/jerrywdlee/yaml_2_resume**
- **DockerHub: https://hub.docker.com/r/jerrywdlee/yaml_2_resume**

![yaml-2-resume.herokuapp.com_(iPad).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87438/f0842304-dd46-3c69-44f2-26c210b6efda.png)

## コマンドラインアプリとして使う場合
- [Dockerを利用する](https://github.com/jerrywdlee/yaml_2_resume#cmd%E3%83%A2%E3%83%BC%E3%83%89)
- [ローカルでインストールする](https://github.com/jerrywdlee/yaml_2_resume#%E4%BE%9D%E5%AD%98%E3%83%91%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

# [kaityo256/yaml_cv](https://github.com/kaityo256/yaml_cv)と主な変更点　(2020/01/23更新)

- `data.yaml`の`photo`フィールドは、URLも使えることになった。
- 提供された画像は向きを補正し、サイズも自動調節することになった。
- コマンドモードを使う際、`data.yaml`と`style.txt`の中に、`erb`文法が書けるようになった。
- `data.yaml`に`@date`で現在の年月日を出していて、[和暦](https://github.com/sugi/wareki)も使えることになった。
  - セキュリティの観点で、WEB版では`erb`文法の利用ができません。
- `data.yaml`の `date: 令和2年1月14日現在` は空白の場合、和暦で本日の日付が入れられます。
- `data.yaml`の `birth_day` Field「日付」はのみ記入した場合、年齢が自動で計算されます。
  - 「日付」の書式については、[和暦](https://github.com/sugi/wareki#%E3%83%91%E3%83%BC%E3%82%B9)または[西暦](https://docs.ruby-lang.org/ja/latest/class/Date.html#S_PARSE)が使えます。
- サンプルデータとスタイルは`templates/`配下に置いた。
- サンプルデータを当たり障りのない文章に再構成した。
- サンプル写真を[StyleGAN](https://github.com/NVlabs/stylegan)で生成された偽の人物像を使用した。

# システム構成
## PDFの作成
PDF作成には基本、[kaityo256/yaml_cv](https://github.com/kaityo256/yaml_cv)のロジックをそのまま利用しました。テストしやすいために、一部ロジックはモジュール `lib/util.rb` に移動しました。

## Web Server
- フロント: [Bulma](https://bulma.io/) / jQuery
- サーバー: [Sinatra](http://sinatrarb.com/intro-ja.html)
- インフラ: Docker / Heroku

## CI
[Travis CI](https://travis-ci.org/) / [Code Climate](https://codeclimate.com/quality/)

# 参考
https://qiita.com/kaityo256/items/e3884d0109223c324baf
https://ikasamak503.hatenablog.com/entry/make-resume-by-yaml-with-docker
https://qiita.com/jerrywdlee/items/859682ec15e71c3c0ec9

# 2024/12/23更新
Herokuの無料枠の提供が終了したため、下記のJS版を提供いたします。

- **Demo: https://jerrywdlee.github.io/yaml-2-resume-ts/**
- **Repo: https://github.com/jerrywdlee/yaml-2-resume-ts**
rspec-retryを導入しようとしたらaggregate_failuresによって動作しなかった話

# 概要

RSpecのオプション`aggregate_failures`と`retry`を同時に設定すると動作しなかったため、検証内容と対策を記載します。


## aggregate_failures

通常、expectの結果がエラーとなった場合はそこで検証が終了しますが、オプション`aggregate_failures`を付けた場合は最後まで検証を続けてくれるようになります。
`aggregate_failures`は標準で使用可能です。

以下の解説がとてもわかりやすかったです。

RSpecでテストをまとめて検証する方法
https://qiita.com/yshz/items/21162a9ffeb51fbcbe36

## retry

オプション`retry`はテストが失敗した時、成功するまで指定回数だけ再実行するというものです。
`retry`はrspec-retryの導入によって使用可能となります。

GitHub
https://github.com/NoRedInk/rspec-retry

以下の解説がとてもわかりやすかったです。

rspec-retryを使ってテストを再実行するときの設定方法
https://daipresents.com/2017/rspec-retry/

# 今回問題となったこと

rspec-retryを導入したところ、それが機能しない場合がありました。
調査した結果、`retry`と`aggregate_failures`を同時に設定した場合、リトライされないとわかりました。

# 検証

検証に使用したコードは以下です。
「1は2と等しいか？」という必ずエラーとなるテストを書いて実行しています。

```ruby
it '1回しか検証されない場合', :aggregate_failures, retry: 2 do
  # aggregate_failuresをメタデータとして書いた場合はリトライされない
  expect(1).to eq(2)
end

it '2回検証される場合 その1', retry: 2 do
  # aggregate_failuresをブロックとして書いた場合はリトライされる
  aggregate_failures do
    expect(1).to eq(2)
  end
end

it '2回検証される場合 その2', retry: 2 do
  # aggregate_failuresが未設定の場合はリトライされる
  expect(1).to eq(2)
end
```

# 原因

ざっくりと原因を説明すると、

- retry側「テストは成功した？(失敗なら再実行するよ)」
- rspecの本体側「(aggregate_failuresのために、エラーを一時的に退避させているから)失敗してないよ」

というような会話をしている状況でした。

このエラーを退避させるかのような動作についてはGitHubにissueがあり、「これは仕様」という結論となっていました。
https://github.com/rspec/rspec-core/issues/2289

また、このissueには対策が記載されていましたが、それを`retry`に適用することは、私がコードを確認した限りではできないようでした。

`aggregate_failures` + `retry` という組み合わせは相性が悪いと結論付け、その場合の対策を施すことにします。

# 対策

検証コードのように、`aggregate_failures`をメタデータでなくブロックで設定してあげれば、`retry`オプションが正しく動作するようになります。

ですが私のプロジェクトの場合、以下のコードによって`aggregate_failures`が全てのテストに適用されていました。

```ruby
RSpec.configure do |config|
  config.define_derived_metadata do |meta|
    meta[:aggregate_failures] = true unless meta.key?(:aggregate_failures)
  end
end
```

ちなみに、これはRSpecの公式にもほとんど同じコードがあるので正しい使い方なのだと思います。
https://relishapp.com/rspec/rspec-core/docs/expectation-framework-integration/aggregating-failures#enable-failure-aggregation-globally-using-%60define-derived-metadata%60

そのため、以下に修正することによって`aggregate_failures`と`retry`が同時に適用されないようにして運用することにしました。

```ruby
RSpec.configure do |config|
  config.define_derived_metadata do |meta|
    meta[:aggregate_failures] = true unless meta.key?(:aggregate_failures)
    meta[:aggregate_failures] = false if meta.key?(:retry)
  end
end
```

# 最後に

理想的な対策までたどり着けませんでしたが、「相性問題だからしょうがない」と言えるところまで調査できたと感じています。
実用レベルではほとんど問題ないと思いますので、これでしばらく様子を見てみたいと思います。
Linux  基本コマンド（オプション付き）

##はじめに

Linuxの標準コマンドを備忘録としてまとめておきます。

##ファイルの操作コマンド（ls,cp,mv,rm）

###ls(LiSt)

ファイルやディレクトリの参照。*と?をワイルドカードとして使うこともできる。

###オプション

-a
.で始まる隠しファイルも全て出力する(all)

-l
長形式(long)で出力する

-t
最終更新時間(time)も出力する

-r
逆順(reverse)で出力する

ワイルドカードを用いて特定のファイル表示

```
$ ls *.png
$ ls ???.png
```
*は任意の文字列を表すので、.pngを全て出力する
文字数が特定できている場合は?で数を指定する

###cp(CoPy)
ファイルを複製したり、その複製したファイルの名前を指定することができる。

###オプション

-i
処理を行う時に確認する。謝ってコピーしないように用いる。

-r
ディレクトリをコピーする。cpは基本的にファイルのみだが-rを用いることでディレクトリ内のすべてのファイル、ディレクトリがコピーできる。

-p
元ファイルの情報（更新日時、所有者など）を保持したままコピーできる。

```
$ cp exam test
```
examがファイル名、testがファイル名でない→examのコピーとしてtestが生成される。
examがファイル名、testがディレクトリ名→test下にexamがコピーされる。
examがファイル名、testが存在するファイル名→testはexamにコピーされる。

###mv(MoVe)
ファイルを移動したり、ファイル名を書き換えることができる。

###オプション

-i
同上。確認を行う。

-f
一部の確認がある操作の場合も強制的に実行する。

```
$ mv exam test
```
examがファイルまたはディレクトリ、testがディレクトリ→examがtest内に移動
examがファイルまたはディレクトリ、testが存在しない→examがtestに名前変更

###rm(ReMove)
ファイルを削除する。

###オプション

-i
同上。確認する。

-f
同上。強制的に実行する。

-r
ディレクトリを対象にし、その中のファイルも削除される。


##ディレクトリの操作コマンド（pwd,cd,mkdir,rmdir）

###pwd(Print Working Directory)

ディレクトリの階層構造のなかで現在どの位置にいるか表示する。

###cd(Change Directory)

現在いるディレクトリを変更することができる。

###mkdir

ディレクトリを作成する。

###オプション
 -p
指定されたディレクトリの上位ディレクトリも作成する。

```
$ mkdir -p dir1/dir2/dir3
↓
$ mkdir dir1
$ mkdir dir1/dir2
$ mkdir dir1/dir2/dir3
```

###rmdir

ディレクトリを削除する。

###オプション

-p
オプションをつけない場合は最下層のディレクトリのみ削除になるが-pをつけた場合は指定した階層までのディレクトリを一括で削除する。

⚠︎rmdirは中が空の場合だけディレクトリを削除できる。
ファイルが存在する場合は```rm -r```を用いる。
AWS Lambda のローカル開発環境を serverless-offline で構築して VSCode でデバッグできるようにする

AWS Lambda の node.js による API 開発のために SAM Local を使っていたのだけど、リクエストの度に docker コンテナを起動しなおすその仕組みは、FaaS のコンテナ実行を模している点はよいのですけど、レスポンスが遅くて、開発を加速させるには足かせになっていました。

そこで Serverless Framework の serverless-offline を使用して、 docker を使わずに Lambda を模することにしました。

## Serverless Framework の導入

その導入方法は、

* [Serverless + TypeScript + AWS Lambdaの開発環境構築 - Melchior](http://suguru03.hatenablog.com/entry/2019/01/16/150326)

を参考にしました。

同じことを書けば、

テンプレで作成された ``serverless.yml`` を下のように修正。

1. plugins に serverless-offline を追加
2. handler を、 tsc の出力先に変更 (tsconfig で sourcemap も有効にしておくとデバッグできる)
3. path にワイルドカードを指定できるよ(この場合 ``http://localhost:3000/api/hogehoge`` に反応する)

```yaml
service: myservice

provider:
  name: aws
  runtime: nodejs10.x

plugins:
  - serverless-offline

functions:
  my-api:
    handler: build/my-api/src/app.handler
    events:
      - http:
          method: ANY
          path: 'api/{proxy+}'
          cors: true
```

## VSCode でデバッグできるようにする

``.vscode/launch.json`` に以下のように記述。

1. preLaunchTask: tsc で実行前にビルド
2. node_modules の serverless を起動、引数は ``offline start`` で。 
3. protocol: inspector でデバッグ監視しまーす

```json
{
  "version": "0.2.0",
  "configurations": [
  {
    "name": "Debug",
    "type": "node",
    "request": "launch",
    "preLaunchTask": "tsc",
    "protocol": "inspector",
    "cwd": "${workspaceRoot}",
    "program": "${workspaceRoot}/node_modules/.bin/serverless",
    "args": [
      "offline",
      "start"
    ]
   }
  ]
}
```

これで F5 でデバッグ実行。ハンドラーにブレークポイントを仕掛けて、 ``curl http://localhost:3000/api/hello`` でも呼び出せば、VSCode で中断されるはずです。
サーバー作業計画書テンプレ

我々サーバーサイドの開発者は、時にターミナルからサーバーにログインし、地味な作業しなければならない事があーる！
どういう準備をするか、どのような点に注意するかは、だいたい決まっているのでまとめてみるのであーる！

## 前置き

サーバー作業を計画しよう。大まかな流れは次の通り。

1. 作業内容を整理する
2. 計画書と手順書を作り、レビューしてもらう
3. 作業を実施する
4. 作業を終了する

そして作業にはいくつか原則がある。

- ログを記録する。
- バックアップをとる。
- 2人以上で実施し、確認をとりながら進める
- エビデンスを残す。

これらの準備や原則が存在するのは、次の理由から。

(1)作業者間での情報共有と作業イメージの一致させ、
(2)計画した作業を想定どおりに実施し、
(3)事故を防止するため。


## サーバー作業計画書テンプレ

2人程度で行うようなボリュームの作業向け。[^1]
足りない作業があったならば適宜追加・補完して欲しい。
なお、作成した作業計画（手順も含む）は、レビューをしてもらおう。

作業計画のうち、コマンドなどの手順については、基本的には応答内容も含めて想定して計画しなければならない。
想定外の事象・結果や計画外の作業などが発生した場合は、作業を中止するぐらいのポリシーで進めなければならない。[^2]

[^1]: もっと大規模な作業については、さらに準備準備や作業、承認フローなど、それぞれの会社でのフォーマットがあると思うので、それに従おう。

[^2]: インパクトが少ない場合はアドホックな対応が求められる時もあるが、基本的には責任者に判断してもらう。作業者は判断してもらうための正確なステータスや情報を伝えるようにすること。

~~~markdown:テンプレ（マークダウン形式）。適宜書き換えて使われたし。
# （例）バッチのログファイルの退避作業計画

## 概要
（例）設計不備によりバッチ処理のログが肥大化していることが健在化した。
　　暫定対応としてそのログファイルをローカル環境に退避し、サーバからは削除する対応を行う。

## 作業計画

作業場所： （例）５Fチームデスク
作業日時： （例）2019/7/8 14:00~15:30
作業者： （例）XXXXX、YYYYY
対象サーバ： （例）バッチ用サーバ prj-batch-001
作業概要：
    1. 事前準備
    2. 作業実施
    3. 動作確認
    4. 事後作業

### サービスについて

- 利用ユーザーへのアナウンスあり
    - 作業の前日と、作業直前に関係者にSlackでアナウンスを行う。
    - 作業直前にXXX部署へ作業開始連絡をする。
- メンテナンスモードはなし 

---

## 事前準備
（解説）事前に準備するもの、行うことにに関してメモる。
- ホワイトボード
- システム構成図
- XXX部署への作業内容共有と許可

## 作業実施

1. 事前準備
[ ] (例)ブリーフィング
[ ] (例)作業開始連絡（Slack周知）
[ ] (例)作業開始連絡（XXX部署電話連絡）

### ログイン〜コマンド実行

[ ] (例)ターミナルのログ記録開始 

[ ] (例)ログインしてサーバホストを確認する
```　
# ログインする
ssh xxx.xxx.xxx.xxx
...
```　

[ ] (例)退避し、対象のプログラムを削除する。
```　
$ cd ~/myworkdir
$ pwd
/home/myname/myworkdir

$ cp -p /path/to/target.log ~/myworkdir/target.log-backup
...

# （解説）基本的に予想されるコマンドの応答内容も含めて想定しておく。

...
... (コマンドレベルの手順書続く)
...
```　

[ ] (例)削除されているか確認する。
```　
$ ls -l /path/to/target.log
（ファイルが見つかりません、のエラーとなる）
```　

### 切り戻し手順
（解説）切り戻し手順に関しては、場合によっては複数のパターンが必要になることもあるだろう。

```　
$ cd ~/myworkdir
$ pwd
/home/myname/myworkdir
$ cp -p ~/myworkdir/target.log-backup /path/to/target.log
$ diff -u /path/to/target.log ~/myworkdir/target.log-backup
```　

## 動作確認
(解説)動作確認は、事前に用意されている回帰テストを行うなど、目的にあった確認をしよう。

[ ] （例）ブラウザで動作確認を行う。（キャッシュをクリアしてアクセス）

## 事後作業
(解説)主たる作業が終わった後の、まとめ作業やらを行う。

[ ] (例)作業終了連絡（Slack共有）
[ ] (例)作業終了連絡（XXX部署電話連絡）
[ ] (例)作業ログの保存
[ ] (例)エビデンス資料の保存

~~~

## 終わりに

こんなのもあったほうがいいよとか、みなさんの経験や知見、実践内容など教えてもらえると嬉しいですぞい！
【WordPress】ハッキング候補をググる（Google Dorks）

Google 検索は、世界トップレベルの天才達が開発を続けている、非常に優れた検索エンジンです。

私のような凡人は、何をするにも分からない事だらけですので、困った時はすぐ、この天才達が生み出した Google 大先生へ聞きます。

そうすると、大抵の事は解決まで導いてくれます。ありがたや～。

今回は、そんな Google 大先生があまりにも賢すぎて、ハッキング（クラッキング）[^1]できそうな WordPress を効率よく探すためにも使えてしまうという話です。

[^1]: WordPress の利用者層を考慮して、タイトルはあえて「ハッキング」という表現に変更しました。

--------------------------------------------------------------------------------

## Google Dorks(Google Hacking)

Google Dorks と書いた方が、日本語の情報が少なくて何だかカッコイイ気がしたので、記事タイトルにはこちらを採用しただけなのですが、手法としては 10 年以上前から知られているものです。

Google Hacking と書けば、「何だその事か…」という方も少なくないと思います（ゴメンナサイ）。

概要は、下記 Wikipedia の説明が簡潔だと思います。※残念ながら日本語版は無いようですので、英語が苦手な方は Google 翻訳をどうぞ！

- https://en.wikipedia.org/wiki/Google_hacking

要するに、Google 検索の賢いオプション検索機能を活用すれば、**見れちゃいけない筈のファイルを、全世界へ「公開」してしまっているサイト**を、効率よく探せます…という事です。

--------------------------------------------------------------------------------

## 実際に試してみる

適当に思いついたものを 3 つだけ…。

- [`intext:bak intitle:Index of "wp-config.php"`](https://www.google.co.jp/search?q=intext%3Abak+intitle%3AIndex+of+%22wp-config.php%22&ie=utf-8&newwindow=1)
    - `bak` という名前でバックアップしたものが、Apache のお節介機能のせいで丸見えになってしまっているサイトを探す。

- [`intext:define('DB_PASSWORD', ' "wp-config.php" filetype:txt`](https://www.google.co.jp/search?q=intext%3Adefine%28%27DB_PASSWORD%27%2C+%27+%22wp-config.php%22+filetype%3Atxt&ie=utf-8&newwindow=1)
    - サーバーの設定ミスで、`wp-config.php` の中身がテキストとして出力されてしまっているサイトを探す。

- [`inurl:"/wp-content/uploads/db-backup"`](https://www.google.co.jp/search?q=inurl%3A%22%2Fwp-content%2Fuploads%2Fdb-backup%22&ie=utf-8&newwindow=1)
    - アップロードディレクトリに保存された、データベースのバックアップっぽいものが、公開されてしまっているサイトを探す。

極めた人であれば、もっとエレガントな例を書けるのでしょうが[^2]、この程度のものでも意外と引っかかってしまうようですね…。

[^2]: このような検索例をデータベース化しているサイトもありますが、記事での紹介は差し控えさせていただきます。

--------------------------------------------------------------------------------

## 何でも公開ディレクトリに置く事の危険性

WordPress デフォルトの状態では、全てのファイルを「公開ディレクトリ」にアップロードして運用するようになっています。

昔ながらの、zip ファイルをダウンロード ⇒ 解凍して FTP でアップロード…のような方法でセットアップする方にとっては、扱いやすいファイル構成です。

しかし、何でも公開ディレクトリに置く事は、上記のような危険性もはらんでいるという事を、知っておいて欲しいなと思います。

[【WordPress】WordPressのここがダメ](https://qiita.com/fallout/items/3de7ece4acd3ae968628#3%E5%85%A8%E3%81%A6%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8C%E5%85%AC%E9%96%8B%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AB%E7%BD%AE%E3%81%8B%E3%82%8C%E3%82%8B) でも触れていますので、注意喚起として参考になれば幸いです。
【Scala】Tryクラスと通常のthrowのおすすめの使い分け方

# 問題

Scalaでは通常の throw / try / match による例外のハンドリング手法の他に、便利 [scala\.util\.Try](https://www.scala-lang.org/api/2.12.7/scala/util/Try.html) クラスというものがある。

この2つはどう使い分ければいい？
常に `Try` クラスでOK?
それとも `Try` クラスは使うべきではない？
Java の検査例外の代替として使える？

# 回答

## この2つはどう使い分ければいい？

基本的にその変数を返す先で例外のハンドリングを強制したい場合は `Try` クラスで包めば良いと思います。
Tryクラスで包むと中の値を取り出すときに例外が発生した場合のハンドリングを強いられますので、例外を考慮し忘れてエラーハンドリングが書かれていないということを避けられます。

また、例外発生時のデフォルト値などを与える処理がスマートに書ける[recoverメソッド](https://www.scala-lang.org/api/2.12.7/scala/util/Try.html#recover[U%3E:T](pf:PartialFunction[Throwable,U]):scala.util.Try[U])を使いたいときやモナドライクに複数の例外が発生しうる処理をforで書く場合にも便利かもしれません。

## 常にTryクラスでOK?

悪くはない気がしますが、DBとの接続エラーやネットワークエラーなど復旧する手段がなくハンドリングもしないのであれば `Try` を使うより単なる `throw` をしたほうがプログラムの見通しがよくなるでしょう。
いわば大域脱出的に使う感じになります。

## それとも `Try` クラスは使うべきではない？

`Try` クラスを禁止して従来の throw / try / match のみを使うことも全然悪くありません。
ですが、`Try` クラスは[Try はモナドじゃない \- tkawachi Blog](http://tkawachi.github.io/blog/2013/11/24/try-is-not-monad/)などと批判されることもあるものの基本的には良い便利クラスだと思います。
チーム内でモナド/型クラスの利用を禁止しているのでない限り、積極的に使ってよいかと。

## Javaの検査例外の代替として使える？

だいたい使えると思います。

# 蛇足

`Try` クラスを使う場合、入っている例外は `Throwable` を継承しているクラスであればどんな例外クラスのインスタンスでもあり得ます。
これが気持ち悪いと感じて明確に例外のクラスを1つにしぼりたい場合は [Scala Standard Library 2\.12\.7 \- scala\.util\.Either](https://www.scala-lang.org/api/2.12.7/scala/util/Either.html) を使うことができます。
例外クラスのパターンが2つ以上ある場合は `Either` が使えませんので [shapelessのHList](https://github.com/milessabin/shapeless/wiki/Feature-overview:-shapeless-2.0.0#heterogenous-lists) を使えばいいと思います。

Scala3(dotty) が来れば [union type](https://dotty.epfl.ch/docs/reference/new-types/union-types.html) でもっと楽に書けるでしょう。

# 参考ページ

* [Javaの検査例外は、呼び出し側で「どんなに注意しても防げない」異常系 \- Qiita](https://qiita.com/yuba/items/d41290eca726559cd743)
* [Swiftのエラーハンドリングはなぜ最先端なのか \- Qiita](https://qiita.com/omochimetaru/items/c30f7a021fb9b8f0fa92)
このアカウントについて

コンピュータの仕組みについて詳しくなりたいため、自分でweb等で検索して知識をつけています。
しかし、その知識が正しいものなのか、正しい認識なのかわからない。

また、自分で学んだことを発信しないと技術者として成長しないと言われた。
なのでQiitaという場を借りて今後、自分の得た知識や疑問に思ったことなどを発信するとともにログとして残していこうと思う。
CCNAが変わる件

##概要
CiscoからCCNAなどの認定資格試験の変更(アップデート)の発表がありました

##変更内容
以下メールから引用
>* アソシエイト／プロフェッショナル レベル認定取得に必要な前提条件の廃止
>* 継続教育オプション：すべての受講者が利用可能に
>* CCNA 認定の集約化と改定
>* 認定20 年以上の CCIE ホルダーのための新たな有効期間
>* 新しい DevNet トレーニング （アソシエイト、スペシャリスト、プロフェッショナルの各認定）

個人的にかかわってきそうなのは表題の通りCCNAの変更です
今までCCNAは

|||
|-------------------|-------------------|
|CCNA Cloud|CCNA Industrial|
|CCNA Collaboration|CCNA Routing and Switching|
|CCNA Cyber Ops|CCNA Security|
|CCNA Data Center|CCNA Service Provider|
|CCDA|CCNA Wireless|

といったように多くの分野ごとに分かれていました (おそらく一番メジャーなのはRouting and Switching)
これらが統合されて　新CCNAに1本化されるようです

##いつから変わるか？
2020年02月24日から新CCNA試験に置き換わる

##注意点
2020年2月23日までは現行のCCNAを実施する
現行のCCNAに合格した場合は新しいCCNAの認定をされ、対応するトレーニングバッジを受け取れるらしいです
ただし、CCENT(ICND1)所持者は新試験に置き換わる前にICND2を取得しないと
新試験からはICND2は無くなるようなので新たに新CCNAを受けないといけなくなる

##感想など
前述したようにCCNAは様々な種類があったのでややこしかったですが
一つに統合されるのは受験者にとってはありがたいんじゃないかな？
(特に試験を受験する際の申し込みも種類が多いと若干分かりづらい、、)

ただ、統合されるってことは出題範囲は広くなるのではないかと予想

自分は今月～来月あたりに受験予定でまだまだ時間的に余裕はあるけど
最近勉強を始めた～って人やCCENT所持者の人は注意が必要ですね
JavaScript 基礎

JSは少しだけやったことあるけど、体系的には学んでないのでここで整理。

# JavaScriptの身近な使用例
- WEBページを再読込無しで新しいコンテンツを読み込み、サーバーにデータを送信する。
- WEBページ要素のアニメーション、フェードイン、フェードアウト
- フォーム入力値の動的なチェック

##　後置演算、前置演算

###後置演算
yにxを代入してから、xに1を足す。

```js
var x= 10;
var y= x++;

console.log(x); => 11
console.log(y); => 10 
```

###前置演算
iに1を足してから、jにiを代入。

```js
var i = 10;
var j = ++i;

console.log(i); => 11
console.log(j); => 11
```

## == と　===
- ==: 等しい（変数の型は評価しない）
- ===: 厳密に等しい（変数の方も考慮する）

```js
var i = "1"; // 文字列
var j = 1;  // 数値

if (i == j){} // True
if (i === j){} // False
```

## Switch

===で評価される。

```js
var n = 3;
switch(n) {
    case 1:
        console.log("数値は1です");
        break;
    case 2:
        console.log("数値は2です");
        break;
    case 3:
        console.log("数値は3です");
        break;
    default:
      console.log("範囲外です。")
}
```


#繰り返し処理
- for
- while
- do while

## for
```js
for (初期化式; ループ継続条件式; 増減式){
  //繰り返したい処理を記述
} 
```

## while

```js
while (条件式){
  //条件式がTrueのとき実行したい処理
}
```

## do while
条件の判断が後ろにあるので、最低一回はループを実行する。

```js
do {
  //条件式がTrueのとき、実行したい処理
} while(条件式)
```

# 配列
- 複数のデータの集合を扱える。
    - 一つの変数に対して、複数の値を格納できる。
- 要素には、インデックス番号でアクセスできる。

## 多次元配列

```js
var scores = [
 [98, 88, 100],
 [80, 81, 97],
 [70, 85, 95]
]
```

[参考サイト](https://programmercollege.jp/column/6849/)


## 連想配列
- 各要素に文字列キーでアクセス可能な配列
- Hash, Dictionary, mapとも呼ばれる。


## 関数
- 標準関数 => JSｇ標準で用意している関数
- ユーザー定義関数　=> ユーザーがつくった関数

###　関数の定義方法
1. function命令で定義する。
2. 関数リテラルで定義する。
3. Funtionコンストラクターで定義する。

## function命令で定義する。

```js
function 関数名(引数1, 引数2,....){
  //任意の処理
  return 戻り値
}
```

## 関数リテラル
関数名を持たない。

```js
function(引数1, 引数2, ... ){
  //実行する処理
}
```


## Function コンストラクタ
```js
var 変数名 = new Function (引数1, 引数2, ..., 関数本体の処理);
```


## まとめてみると。

```js
//function命令
function getRectangle(height, width){
    return height*width
}

console.log(getRectangle(4,5))

//関数リテラル
var getRectangle = function(height, width){
    return height*width
};

console.log(getRectangle(5,4))

// Functionコンストラクタ
var getRectangle = new Function("height", "width", "return height*width")
console.log(getRectangle(3,4))
```
Java開発の基本~プログラムの書き方（フローと条件分岐）~

# Java開発の基本~プログラムの書き方（フローと条件分岐）~
前回の記事[Java開発の基本~プログラムの書き方（変数と型）~
](https://qiita.com/teachi15/items/64052798c787d27bf862)の続きです。
1から10までを足していくプログラムを引き続き使います。

---
```java
package lessons;
public class L1 {
    public static void main(String[] args) {
        int startNum=1;
        int endNum=10;
        int resultNum=0;
        int count=0;
        while(startNum<=endNum) {
            resultNum=startNum+resultNum;
            startNum=++startNum;
            ++count;
        }
        startNum=startNum-count;

        System.out.println(startNum+"から"+endNum+"まで足した結果は"+resultNum);
    }
}
```

---
## アルゴリズムとフローチャート
ちょっと脇道にそれますが、フローチャートがどのようなものか説明します。  
プログラムとは水のように上から流れていくものです。水と同じように色々な道を通っていきます。プログラミングをする前にどんな道を通るべきかあらかじめ考えます。
その考えられた道筋のことを<b>アルグリズム</b>と言います。アルゴリズムを他人と共有するときに利用するのがフローチャートです。
フローチャートについては[これ](https://it-koala.com/flowchart-2241)を参考にしてください。

----

今回の1から10まで足すプログラムのフローチャートを起こしてみます。
![Untitled Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292795/94dffb2f-5ed0-76dd-da9f-f830b4bf44aa.png)

----
プログラミングをするときには、これをそのまま言語のルールに当てはめていくだけです!!
実際の開発ではあまり綺麗にフロー図を書くことはないかもしれませんが、この考え方がないとプログラミングすることができません。できても穴だらけのものになってしまうので、最初のうちは特に意識しておきましょう。

----

## 条件式
今回使った例では`while`という繰り返し処理の条件式を利用しています。
下記のような形式で使います。

```java
while(<条件式>){
   処理の内容
}
```

条件が一致するまで処理を行います。
なので例えば以下のような処理を行うと、いつまでたっても処理が終わらずパソコンが止まります。

```java
int a = 1;
int b = 2;
while(a == b){
    System.out.println("終わらないよー");
}
```
条件の判定は基本的に数学と同じです。ただ、上の例でもわかる通り、イコールの場合には`==`と2個繋がります。
条件が正しい場合には<b>true</b>、誤っている場合には<b>false1</b>を返します。
数学と使い方が違うものがいくつかあるので、少し紹介しておきます。

| オペレータ | 意味 |
|:-:|:-:|
| a == b | aとbが同じであればtrueを返す |
| a != b | aとbが異なっていればtrueを返す |
| a <> b | aとbが異なっていればtrueを返す |
感のいい人はすでに気づいていると思いますが、プログラムは<b><font color="red"> true</font></b>か、<b><font color="red"> false</font></b>しか返せません。なので条件分岐は必ず<b><font color="red"> YES NO 問題</font></b>にしましょう。

----

ifというのもよく使う条件判定式なので紹介しておきます。

````java
//ifによる条件分岐
if(<条件式>){
   //tureの場合の処理
}

if elseによる条件分岐
if(<条件式1>){
   //<条件式1>がtureの場合の処理
   //ここの条件に一致したら、この先の条件判定は行われない
}else if(<条件式2>){
   //<条件式2>がtureの場合の処理
   //ここの条件に一致したら、この先の条件判定は行われない
}else{
   //条件1,2のいずれにも当てはまらない場合
}
````
-----

複数の条件を扱うケースも紹介します。
いきなり例えますが、例えば`お腹が空いていて、かつ、お金を持っているなら、コンビニに行く`という処理をプログラムに起こしてみましょう
今までの知識だとこの場合にはこんな風に書くことができます。
```java
if(お腹が空いている){
   if(お金を持っている){
     コンビニに行く
   }
}
```
これは一行で書くことができます。
```java
if( お腹が空いている && お金を持っている ){
  コンビニに行く
}
```

似たような形で、現代っ子的な思想ですが、`お腹が空いている、もしくは喉が渇いている場合、コンビニ行く`というのは下記のように表せます。

````
if( お腹が空いている || 喉が渇いている ){
  コンビニに行く
}
````

これを一覧にまとめると下記の通りになります。
これは論理式という話の一端なのですが、長くなってしまうので各自調べてみてください。
| 1 | 2 |
|:-:|:-:|
| a && b  | aがture かつ　bがture の場合tureを返す |
| a || b  | aかbいずれかがtureの場合tureを返す |

-----

## 確認チェック
* 3の倍数を小さい順から好きな回数だけ足すプログラムを書いてみよう(whileの代わりにforを使ってもいいです。むしろそっちの方が楽。。。)
(3+6+9+12+...+3n)
出力結果は「3の倍数をXからY回足すとZになる」（X、Y、Zは整数）

* 次のプログラムが何をしようとしているものか考えて、かつ間違っているところを治してください。


```
執筆中
```

-----
lombok.Data　Boolean型の値がとれず途方にくれた話

<img width="227" alt="lombok2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426556/a3a04363-7526-88a1-dff1-25e7a53264bc.png">


記事を書いたときのlombokのバージョンは1.18.8です。
@Lombokとは、Javaのライブラリで、自動的にエディターとビルドツールとつながり、あなたのJavaをスパイスアップ（風味を添えて）くれるらしい。


`Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.
Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.`

[公式ページ](https://projectlombok.org/)より引用
要はgetterやsetterやequalsを自動的に生成してくれるライブラリです。
しかし自動で色々とやってくれてしまうため
例外的な動きをしてくれると困ってしまいます。

"Boolean型の変数名が勝手に書き換えられている"
"なんでGetterが作られてないんだ！"
とあらぬ誤解をうけ、ぼくの頭の中をスパイスで充満させてくれました。
Lombok Dataでgetter/setter生成時
boolean型のときは、少し命名の方法が異なるようで注意が必要です。メモ代わりに書いてみました。

```java
@data
TestDao
{
boolean isExhausted;//getExhausted() ではなくisExhausted()というメソッドができる。@getter設置をしてもget〇〇はできない。
boolean exhausted;//自動的にisが付与されisExhausted()というgetterができる。
}
```
まとめ
・lombokでは、どうしてもboolean型でget〇〇というgetterを作りたくないらしい。
・取得したデータをJSON形式で返したとき、変数名の頭にisがあるとき、このisはなぜか取り除かれていた。
・JSON形式でどうしても"is"を先頭につけてKey名で返したい場合は、直前に@JsonProperty("isExhausted")を置く。
・生成されてないじゃん と自分でGet〇〇()などのメソッドを作るとローマッパーでのデータ取得時無視される(setterがつくられてない？)。←ここではまる。

憶測で物事を進めてはいけないと感じたこの頃でした。
【個人的メモ】Javaのデータ型がめんどくさいって話

# Math.round()がわかんなかった

Progate進めてた時の話

身長(height)と体重(weight)がdouble型で定義されていて、それを使ってBMI(bmi)を計算しなさいってことに。
BMIは整数型なので、計算した値を四捨五入する必要がある。
Math.round()メソッドを使えってことだった。

##最初どうしたか

```Java
public static int bmi(double weight,double height){
 int bmi=Math.round(weight/height/height);
 return bmi;
}
```
こんな感じで書いてた。
Math.round()メソッドで四捨五入したら当然int型になるもんだと思ってた。
しかしエラーを返されちゃう。

##調べてみたら

どうやらMath.round()メソッドで四捨五入した値はlong型になっちゃうようで、int型で使いたい場合は変換しなきゃいけないらしい。
ということで

```Java
public static int bmi(double weight,double height){
 int bmi=int(Math.round(weight/height/height));
 return bmi;
}
```

と書き直した。
これでMath.round()で四捨五入した値がint型になったと思ったら、またエラー。

Pythonと勘違いしてしまい、型変換の方法を間違っていました。

最終的に

```Java
public static int bmi(double weight,double height){
 int bmi=(int)Math.round(weight/height/height);
 return bmi;
}
```

とすることで、ようやくエラー無く処理してくれました。
めでたしめでたし。

という備忘録的メモでした。

##今回の学び

- ~~Math.round()メソッドで四捨五入したら、long型になっちゃうよ~~
    - Math.round()メソッドにはMath.round(float)とMath.round(double)があり、(float)の場合はint型に、(double)の場合はlong型になっちゃうよ 
- Javaでデータ型の変換をするときは「(データ型)変数名;」ってしないとダメだよ

ということでした。

###参考にしたページ

色々を対処法を探していた時にまったくおんなじ状況の質問をしていたteratailのページを見つけて、事なきを得ました。
URL:[https://teratail.com/questions/114663](https://teratail.com/questions/114663)
Rails Tutorial（2週目）-11-

#アカウントの有効化
Userモデルにactivation_digestとactivated属性を追加する

```app/models/user.rb
class User < ApplicationRecord
  attr_accessor :remember_token, :activation_token
  before_save   :downcase_email
  before_create :create_activation_digest
  validates :name,  presence: true, length: { maximum: 50 }
  .
  .
  .
  private

    # メールアドレスをすべて小文字にする
    def downcase_email
      self.email = email.downcase
    end

    # 有効化トークンとダイジェストを作成および代入する
    def create_activation_digest
      self.activation_token  = User.new_token
      self.activation_digest = User.digest(activation_token)
    end
end

```

before_createコールバックによりオブジェクトが作成される前に有効化トークンの作成、トークンの暗号化を行っている。

##メイラーの作成
メイラーはコントローラーとよく似た構成
`rails generate mailer 名前（キャメルケース）　メソッド名`で生成できる

コントローラーの作成と同時にビューのテンプレートがテキストメール用のものとHTMLメール用のものの2つが作られる。

```app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
  default from: "noreply@example.com"
  layout 'mailer'
end
```
fromのところで送信元アドレスの指定。


```app/mailers/user_mailer.rb
class UserMailer < ApplicationMailer

  def account_activation(user)
    @user = user
    mail to: user.email, subject: "Account activation"
  end

  def password_reset
    @greeting = "Hi"

    mail to: "to@example.org"
  end
end
```

mail:toで送信先のアドレスを指定。subjectはメールの件名

アカウントの有効化はユーザーのメールアドレスから検索して有効化トークン認証するので、URLにはメールアドレスと有効化トークンの両方を含ませる必要がある。

`edit_account_activation_url(user)`で`http://www.example.com/users/1/edit`というURLが生成されるので、同じ要領で`edit_account_activation_url(@user.activation_token, email: @user.email)`というURLを指定することで`account_activations/q5lt38hQDc_959PVoo6b7A/edit?email=foo%40example.com`といったURLが生成される。

##メール送信後のアカウント有効化
URLからparams[:id]とparams[:email]で有効化トークンとメールアドレスのそれぞれを取得することができる

##seldメソッド
>このメソッドは、渡されたオブジェクトに「メッセージを送る」ことによって、呼び出すメソッドを動的に決めることができます。

sendに引数として渡した文字列やシンボルを、sendメソッドのレシーバのオブジェクトに対してメソッドとして実行する
SpringSecurityとPOSTで嵌った話

# SpringSecurityとPOSTで嵌った話
SpringSecurity＋SpringBootでRestAPIサーバーを作っていたのですが、
ブラウザからPOSTを投げてみると、GETでは認証OKな状態でも403エラーになってしまう現象にぶつかりました。
結構原因究明に苦労したので、備忘も兼ねて書いておきます。

## そもそもなぜ弾かれたか？
SpringSecurityは厳重なCSRF対策を行っており、有効化されている場合にPOSTやPUTと言ったリクエストメソッドに対してトークンを要求するため。
トークンを何らかの方法で取得した上で、HttpRequestのHeaderに詰めてやらないと問答無用に403エラーで弾いてきます。

## トークンの取得方法
デフォルトではサーバーサイドにリクエストスコープで保持されるだけなのでクライアントサイドからはログインしていてもトークンは見えません。
手動でクライアントサイドに渡して管理しておくか、設定を切り替えてCookieに入るようにする必要があります。

具体的にはWebSecurityConfigで以下のような形にします。

```java

@Override
	public void configure(HttpSecurity http) throws Exception {
		http.oauth2Login().and().authorizeRequests().antMatchers("/**")
　　　　　　　　　.authenticated()
　　　　　　　　　.and()　//ここからが問題の部分
　　　　　　　　　.csrf()
　　　　　　　　　.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
	}


```
こうすることで、CookieにXSRF-TOKENという名前でトークンが入ってくるようになります。

## トークンを入れてPOSTを投げる
取得したトークンは`X-XSRF-TOKEN`という名前でヘッダに入れます。
Cookieに入っていた時のキー名とは微妙に異なるので注意です。

実際のコードは大体以下のような形になります。
なお、Cookieからの値の取り出しにjs-cookieを使っています。

```js
import Cookie from 'js-cookie';
//中略
        const xsrf = Cookie.get('XSRF-TOKEN');
        const resp = await fetch(url),{
            method: 'POST',
            credentials: 'same-origin',
            headers: {
                "Content-Type": "application/json; charset=utf-8",
                'X-XSRF-TOKEN': xsrf
            },
            body:JSON.stringify(param)
        });
```

ちなみに、axiosなどライブラリによってはここを自動でやってくれるものがあるそうです。

## 余談
逆に、外部からWebHookなどのPOSTリクエストを認証無しで受けたい場合は、ignoringの方を使うとうまく行きます。
別途アクセス制御はかけないと危険ですが。

```java
	@Override
	public void configure(WebSecurity web) throws Exception {
		web.ignoring().antMatchers("/css/**", "/image/**", "/js/**").antMatchers(HttpMethod.POST, "/api/outer/**");
	}
```

## まとめ
* SpringSecurityを使っている場合POSTにはtokenが必要
* WebSecurityConfigで設定しないとtokenはCookieに乗ってくれない
* テスト用にRestClientから手動で叩く場合でも同じ手法でOK
【VB.NET】WPFでClickを使いこなしたい！

#一番簡単な方法でイベントを発火
本当はClickもvb側に記述したい※JSでいうdocument.on("click",function(){});
だが、できないものは仕方ないので一番簡単な方法から確認していきます。

###XAML側のButtonにClickイベントハンドラを設定し、発火
####XAML側
Buttonを作って「Click="Button_Click"」と書いてあるだけ
表示用にName="test"のLabelを作りました。

####vb側

```vb:フォーム.xaml.vb
Class MainWindow
    Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
        test.Content = "情報なさすぎないか？？？？？"
    End Sub
End Class
```

なんでtest.Textじゃないの？？？？？という思いは抑えつつ、最低限はできました。

###vb側でボタンのクリックを検知し、発火
要するにすべてVB側に記述してやろうという魂胆ですが、やり方がわかりません！！！
やろうとしたのは

```vb:やろうとしたvb
Class MainWindow
    Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
        test.Content = "難しすぎんか？？？？？"
    End Sub
    Public Sub a()
        AddHandler Click_Site.Click, AddressOf Button_Click
    End Sub
End Class
```
で、Name="Click_Site"のボタンをクリックしたら同じことが起こることを期待ましたが、起こらず。
多分読み込み時に読み込まれるわけではないことが原因
やり方わかったら追記します

#参考
C#だけど、senderとRoutedEventArgsの正体が書かれている
C#の"object sender"==VB.NETの"sender As Object"と読み替えれば良い
https://qiita.com/Ich_wei_/items/1e5993c316f4a78fac79
RailsチュートリアルでRSpecを使用する前に知っておきたいこと

#はじめに
こんにちは！先日Railsチュートリアルを完走したばかりの初心者です。

私はRalisチュートリアルを開始する際にRSpecを使用すべきか悩みました。
本記事では私が当時知りたかったRSpecについての情報をまとめております。
導入を検討されている方のお役に立てればと思います。


※本記事ではRSpecの導入方法については記載しておりません。
　導入方法をお探しの方は以下の記事が参考になるかと思います。

　[○RailsアプリへのRspecとFactory_botの導入手順](https://qiita.com/Ushinji/items/522ed01c9c14b680222c)



#RSpecとは
RSpecとは、RubyでBDD (ビヘイビア駆動開発) を実施するためのテストフレームワークです。
プログラムのふるまいを記述するためのドメイン特化言語（DSL）を提供します。
簡単に言うとRSpecは「プログラムのふるまいをコードで記述して、正しく動作しているか確認するテストフレームワーク」です。

RSpecの特徴として、書き方が特殊であるため学習コストが高いと言われていますが、習得後はかなり直感的にテストが書けるようになります。
また、Railsを扱う多くの企業で採用されており、Rubyのテストフレームワークのデファクトスタンダードとなりつつあるため、Railsエンジニアになる上で避けて通れないものになっているようです。

#RSpecとMiniTestの違い

###Rspecの特徴
・DSLで記述
・DSLであるためロジックの自由度が低い
・学習コストが高い
・採用している企業が多い
・情報が豊富
・最初から様々な機能が入っていて便利

###MiniTestの特徴
・純粋なRubyで記述
・Rubyの言語機能が使えるためロジックの自由が高い
・学習コストが低い
・Railsの標準のテストフレームワークとして採用されている
・採用している企業が少ない
・情報が少ない
・実行速度が早い（RSpecと体感で違いがある程ではない？）
・複雑なテストを行う場合、多くのプラグインが必要となる

#RailsチュートリアルでRSpecの使用が推奨される方
下記に該当する方はRSpecの使用を推奨します。

　○Railsチュートリアルが２周目以降の方
　○Web系他言語の経験があり、そのテストフレームワークを習得している方

上記以外の方については、Railsチュートリアルで採用されているMiniTestをそのまま学習されることをオススメします。

１つ目の理由としては、Railsチュートリアル自体の難易度が高く挫折する可能性が高いためです。初心者である場合、Railsチュートリアルの１周目は内容を追うだけで手一杯になりがちです。また、RSpecを導入する場合Gemを追加する必要があり、互換性の問題で苦しむ可能性もあります。

２つ目の理由は、RailsチュートリアルをMiniTestで実施したとしても、テストの流れや考え方は変わらないため習得した知識が無駄にならないためです。MiniTestで学習した内容はRSpecを使用する際に確実に活きてきます。また、RSpec習得後でも簡単なテストはシンプルなMiniTestで行う人もいます。


#RailsチュートリアルをRSpecで進める際の心構え
最も大事なことは完璧主義にならないことだと思います。
Railsチュートリアルに記載されているMiniTestのコードのロジックをそのままRSpecで再現することは難しいです。MiniTestとRSpecではテストの分類が異なります。（例えばMiniTestのIntegrationテストは、RSpecではRequestテストとFeatureテストで分けて実施することになるかと思います。）
テストをRSpecに置き換える際は、「何を検証するためのテストなのか」を意識して柔軟にテストロジックを構築していくことを推奨します。

#知っておきたかったRSpecのこと
###RSpecのテストの種類
####Model テスト
Modelに関連するテストを行う。
・モデルの状態が有効(valid)となっているか。
・バリデーションによりモデルの状態が無効となるか。
・クラスメソッドとインスタンスメソッドの動作。

####Request テスト
ルーティングを含めたコントローラー、モデル、ビューを通したテストを行う。
また、リクエストに対して正しいレスポンスが返されることを確認する。

####Controller テスト
アクセス権限の正当性を確認する。
Requestテストへの置き換えが推奨されているみたいなので、
あまり使わない方がいいかも。

####Feature テスト
ブラウザ上の動作をシミュレートして動作結果を検証する。(ボタンクリックやフォーム入力などをシミュレートする)
一般的な統合テストに該当する。
Systemテストに置き換えることが可能。
使用するためには「Capybara」というGemをインストールする必要があるので注意。

####System テスト
Rails 5.1から使用可能となった統合テスト。
役割はFeatureと同じ。


主にModel、Request、Featureテストを使用すれば、Railsチュートリアルは完走可能だと思います。

#RSpecの学習で使用した記事
以下の記事がRSpecの使用方法を大変分かりやすく解説してくださっています。

　[○使えるRSpec入門・その1「RSpecの基本的な構文や便利な機能を理解する」](https://qiita.com/jnchito/items/42193d066bd61c740612)



実際にRailsチュートリアルをRSpecでテストしている方の記事です。
詰まった時に参考にすると良いと思います。

　[○Railsチュートリアルの第４版をRSpecでテスト-1](https://qiita.com/yano12/items/eba8693272c31d6af7f0)

#さいごに
Railsチュートリアルの２周目行う方は、是非RSpecを導入してみてください。
記法を覚えるのは大変ですが、それに見合うリターンはありますし、Railsチュートリアルもより楽しいものになります！
SVNをGitに移行するときにsvn.authorsfileに設定するファイルを作る方法

- 環境
    - Windows10 64bit
    - コマンドを使うのはGit Bash for Windows

# 作りたいのはSVNとGitでのユーザ情報のマッピングファイル
> ubversion ではコミットした人すべてがシステム上にユーザーを持っており、それがコミット情報として記録されます。たとえば先ほどの節のサンプルで言うと schacon がそれで、blame の出力や git svn log の出力に含まれています。これをうまく Git の作者データとしてマップするには、Subversion のユーザーと Git の作者のマッピングが必要です。
> [Git - Git への移行](https://git-scm.com/book/ja/v1/Git%E3%81%A8%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%AE%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E9%80%A3%E6%90%BA-Git-%E3%81%B8%E3%81%AE%E7%A7%BB%E8%A1%8C#Subversion)

```text:作りたいのはこんなファイル
schacon = Scott Chacon <schacon@example.jp>
selse = Someo Nelse <selse@example.jp>
```

# 1.SVNコマンドをインストールする
- 参考 : [TortoiseSVNを既にインストールしてるときのコマンドラインツールの取得・設定方法 - Qiita](https://qiita.com/daria_sieben/items/8b1a7e19f6394b388ff5)

1. [サイトから`Apache Subversion command line tools`をダウンロードする](https://www.visualsvn.com/downloads/)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/ac30c245-fae3-bd0b-6f0a-e45a67185f3f.png)
2. ダウンロードした.zipを解凍して任意のディレクトリに格納する
3. `.bash_profile`にPATHを通す

```bash
$ cat ~/.bash_profile
SVN_PATH="C:\任意のディレクトリ\Apache-Subversion-1.11.1\bin"
export PATH=$PHP_PATH:$PATH:$SVN_PATH

# .bash_profileを反映する
$ source ~/.bash_profile

# 確認する
$ svn --version
svn, version 1.11.1 (r1850623)
   compiled Feb  1 2019, 13:37:32 on x86/x86_64-microsoft-windows6.1.7601

Copyright (C) 2019 The Apache Software Foundation.
This software consists of contributions made by many people;
see the NOTICE file for more information.
Subversion is open source software, see http://subversion.apache.org/

The following repository access (RA) modules are available:

* ra_svn : Module for accessing a repository using the svn network protocol.
  - handles 'svn' scheme
* ra_local : Module for accessing a repository on local disk.
  - handles 'file' scheme
* ra_serf : Module for accessing a repository via WebDAV protocol using serf.
  - using serf 1.3.9 (compiled with 1.3.9)
  - handles 'http' scheme
  - handles 'https' scheme

The following authentication credential caches are available:

* Wincrypt cache in C:\Users\ponsuke\AppData\Roaming\Subversion
```

# 2.履歴情報を加工して
- 参考 : [現場がSubversionでつらい貴方へ…自分だけこっそりGitで開発する方法 - interprism&#39;s blog](http://interprism.hatenablog.com/entry/git-svn)

```bash
$ svn log --xml https://{SVNのパス} | grep "<author" | sort -u | perl -pe 's/<author>(.*?)<\/author>/$1 = $1 <$1\@example.jp>/g' > users.txt
```

> まずログを XML フォーマットで出力します。その中から作者を捜して重複を省き、XML を除去します (ちょっと見ればわかりますが、これは grep や sort、そして perl といったコマンドが使える環境でないと動きません)。この出力を users.txt にリダイレクトし、そこに Git のユーザーデータを書き足していきます。
> [Git - Git への移行](https://git-scm.com/book/ja/v1/Git%E3%81%A8%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%AE%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E9%80%A3%E6%90%BA-Git-%E3%81%B8%E3%81%AE%E7%A7%BB%E8%A1%8C#Subversion)

# 3.使う
```bash
# クローンの時に使ったり
$ git svn clone http://my-project.googlecode.com/svn/ --authors-file=users.txt --no-metadata -s my_project
# 設定ファイルに設定したりして使う
$ git config --global svn.authorsfile ~/.svnauthors
```
~を含まない正規表現

### 目的
>test = """\<cat>\n{% cat %}\n{{ cat1 }}\n{% cat %}\n{{ dog }}\n{{ cat2 }}\n{{ fish }}\n\<fish>"""

この文字列を {{.*?}} が含まれている行を削除したい。
ただ、catが含まれてたら、残したい。
> """\<cat>\n{% cat %}\n{{ cat1 }}\n{% dog %}\n\n{{ cat2 }}\n\n\<fish>"""

### 結論
>In[]: re.sub(r'{{(?!.\*cat.\*).*?}}', r'', test)

### 実験
#### case1
>In[]: re.sub(r'{{.\*(?!.\*cat.\*).\*?}}', r'', test)
>In[]: re.sub(r'{{.\*(?!cat.\*).\*?}}', r'', test)
>In[]: re.sub(r'{{.*(?!cat).*?}}', r'', test)
>Out[]: '\<cat>\n{% cat %}\n\n{% dog %}\n\n\n\n\<fish>'

- {{ }} のやつ全部消える

#### case2
>In[]: re.sub(r'{{.\*(?!.\*cat.\*)?}}', r'', test)
>Out[]: '\<cat>\n{% cat %}\n\n{% dog %}\n\n\n\n\<fish>'

- "cat"じゃないとダメ
install-gnome-themesを実行して失敗するときの対処法

# 概要
[install-gnome-themes](https://github.com/tliron/install-gnome-themes)を実行しようとして、```install-gnome-themes failed!```とだけ表示されて失敗する場合やったことを書いておく。~~readmeに同じこと書いてあるんだけど~~

# 内容
下の様にして実行すると詳細なログを出力することができる。

```bash
sudo LOG=/dev/stdout ./install-gnome-themes
```

ログから失敗した原因を探して解決していく。大体はパッケージ不足なので、そういう時は適宜必要なパッケージをインストールする。
New Relicで収集したメトリクスで、JOINっぽくしたい

New Relicでチャートを作成する時に、NSQLを使用しますが、こちらはJOINのようなものはサポートしていません。

JOINをシミュレートするために、カスタム属性を使ましょう、ということがドキュメント上記載されています。

[Simulate SQL JOIN functions in Insights](https://docs.newrelic.com/docs/insights/nrql-new-relic-query-language/using-nrql/simulate-sql-join-functions-insights)

APMでのイベントに対して、カスタム属性を追加して絞り込み…が正論なようです。

ですが、カスタム属性を含められないものは、それでは困ります。

もう少し調べてみると、イベントを`,`区切りで並べることで複数のイベントを同時に扱えるようです。

[Join with NRQL two different custon events](https://discuss.newrelic.com/t/join-with-nrql-two-different-custon-events/31379)

ドキュメントは、このあたりを。

[Syntax](https://docs.newrelic.com/docs/insights/nrql-new-relic-query-language/nrql-reference/nrql-syntax-components-functions#commas)

[Multiple events query examples](https://docs.newrelic.com/docs/insights/nrql-new-relic-query-language/using-nrql/introduction-nrql#query-multiple-events-columns)

以下のように、複数のイベントに対して、`,`区切りでイベントを並べることができ、

```sql
SELECT count(*) FROM Transaction, PageView SINCE 3 days ago
```

`SELECT`句などに、各イベントの属性を利用することができます。

```sql
SELECT average(duration) FROM Transaction, PageView FACET deviceType SINCE 3 days ago
```

正確にはJOINでないのですが、保持しているイベントの活用として…。
wordpress で構築したサイト内で POST しようとしたら予約語でハマった

## なにがあったのか
wordpress で構築したサイト内で POST する必要があったので実装を進めていたところ、あるパラメーターを渡したときに 404 を吐くようになった。

## 結論
wordpress には予約語があり、それらの名前は GET や POST で使うと不具合の原因になる。
今回のケースでは 404 を吐くパラメーターで用いていたパラメーターの名前が予約語と衝突してしまっていた。(このとき衝突していたのは `author`)
パラメーターの名前を変更して予約語との衝突を回避することで 404 は出なくなった。

## もうちょっとくわしく
wordpress での開発は素人同然だったので色々ハマりながら試行錯誤していたが、原因がすぐに出てこなかったのが今回の件。

[関数リファレンス/register taxonomy - WordPress Codex 日本語版](http://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/register_taxonomy) には以下のような記述がある。
>以下の予約語を避けることが非常に重要です。特にタームを `$_GET` や `$_POST` 配列を使って引き渡す場合は注意してください。もし重複すると、WordPress は何のヒントも説明も無しに 404 エラーを返します。

何のヒントも無しに 404。まさに今回のケースである。無慈悲。
wordpress に慣れている人からすれば常識なのだろうけれど、予約語にはわたしが引っかかった `author` の他にも `year` や `tag` といった汎用性が高い名前が並んでいるので、wordpress でサイト構築するときには常に注意する必要がある。~~めんどくさい~~

あと、wordpress には今回引っかかった `author` の罠の他にも `サイトのURL?author=1` で ID が漏洩する問題があったりするらしいので、わたしもこうして罠を踏み抜きながらワードプレス・サホウをマスターしなければならない。

## ということで
wordpress の予約語には注意しましょうね。
【VB.NET】ほかのクラスのメソッドを呼び出す方法

#他のクラスのメソッド呼び出し
お仕事でマイナー突くことになったので、しばらく後に取り組む人が困らないように単発記事が続きます。VB.NETでWPFつかったアプリケーション作ります。

###インスタンス生成編

```vb:呼び出されるクラス.vb
Public Class common
    Public Sub a()
        Console.WriteLine("commonからきた")
    End Sub
End Class
```

```vb:呼び出すクラス.vb
Module Module1
    Sub Main()
        Dim com As New common
        com.a()
    End Sub
End Module
```

Dim ○ As New △でクラスインスタンスを生成して、
○.メソッドで呼び出せる模様

###所謂static（静的）に呼び出す

```vb:呼び出されるクラス.vb
Public Class common
    Shared Sub a()
        Console.WriteLine("commonからきた")
    End Sub
End Class
```

```vb:呼び出すクラス.vb
Module Module1
    Sub Main()
        common.a()
    End Sub
End Module
```

static=sharedといったところ。
今のレベルならこっちで事足りることが多い

#後記
WPFの記事C#のやつしかなくて泣きそう
初めてのRuby　〜３ヶ月前の自分へ〜

##３ヶ月前の自分へ
３ヶ月前初めてプログラミングの勉強をはじめました。
パソコン自体苦手なので意味がわからなすぎて大変でした:joy:
また時間が経つと忘れるだろうし、ちょうどキリがいいところなのではじめたての頃の自分に向けて書きます:open_hands_tone1:

##はじめに
```
puts "Hello World"

```

:star2:puts →メソッド = 命令
:star2:"Hello World" →引数 = メソッドに渡すデータ（オブジェクト）

##irbの世界とshellの世界

:point_up_tone1:irbの世界（２〜3行目）
Ruby語が通じる

:point_up_tone1:shellの世界(1,4,5行目）
OSとお話ができる

```example.rb
$ irb
irb(main):001:0> puts 3+5
=> 8
irb(main):002:0> exit
$pwd
/Users/shibuya
```

#linuxコマンド
linexコマンドとはターミナルからのPC操作のための命令をするもの
全てターミナル上から操作します

####・ls
:hatched_chick:ファイル一覧をみる

$ls -a　→隠しファイル（ファイル名が.で始まる）も表示
$ls -l　→詳細情報（ファイル作成日など）表示

####・cd フォルダ名
:hatched_chick:フォルダ移動

$cd..　→親フォルダへ移動

:four_leaf_clover:絶対パス
ルートディレクトリ（階層構造の一番上にあるディレクトリ）から指定する。パスの最初は/から始める。
```
$cd /Users/Desktop
```

:four_leaf_clover:相対パス
カレントディレクトリ（現在いるディレクトリ）から指定する。パスの最初に/はつけない。
```
$cd Desktop/file


####・mkdir　フォルダ名
:hatched_chick:フォルダ作成

:point_up_tone1:空のフォルダを消すとき : rmdir フォルダ名
フォルダの中が空でないと削除できない

:point_up_tone1:中身があるフォルダを消すとき : rm -rf フォルダ名
中にファイルがあるときでも消せる
:skull_crossbones:削除したファイルは復元できないので注意！！


####・pwd
:hatched_chick:今いるフォルダ名を表示

####・cat
:hatched_chick:ファイルの中身を表示


#変数
```
name = neko
puts name
=> neko
```

変数 = オブジェクト
変数にオブジェクトを代入する
:thinking:変数はカメレオン人間
オブジェクトは環境
環境によってカメレオン人間が変化する感じかな・・・ちょっとわかりづらいな:sweat_smile:

##if文
```
if 条件
　条件が正しかった時に実行する処理
end

if　条件
　条件が成立した時に実行したい処理
else
  条件が不成立の時に実行したい処理
end
```

```
x = 3-2
if x == 1
 puts "x is 1"
end 
```

##メソッドの定義
メソッドを定義する時にはdefを使う
```
def メソッド名
　メソッドで実行したい処理
end
```

```
def hello
 puts "hello world"
end

hello
↑呼び出し
```
Salesforceのプロセスビルダー の設定を簡単に確認する方法

Salesforceでプロセスビルダーを作成するときに、詰まったのでメモとして残しておきます。

#プロセスビルダーの確認が難しい

すでにリリースされているプロセスビルダーを確認する際、演算子は下記のような表記になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97162/4f7dd925-bbf0-9cd4-c59c-06c3d6e46390.png)

これは実は「次の文字列と一致する」か「次の文字列と一致しない」のどちらかなのですが、有効化済みのプロセスビルダーだとこれ以上確認することができないため、プロセスをコピーして編集可能にしたうえで確認するなどを行なっていました。

しかし、もっと簡単な方法がありました。

#困ったときの英語表記

Salesforceの言語設定を英語表記にするだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97162/8fdc209f-fe76-3357-513a-210786f6acce.png)

すると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97162/e87326a7-f565-d2e5-fb59-c18d47a9a362.png)

一目瞭然ですね。

今までレビューにかなり苦労していたので、今後は英語表記でレビューしようと思います。
JavaScript で immutable にオブジェクトからプロパティを削除する方法

[分割代入 (Destructuring assignment) 構文](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment) を使って以下のように簡潔に書ける

```javascript

const foo = {
  a: 1,
  b: 2,
  c: 3,
  x: 9 // 取り除きたいプロパティ
};

const { x, ...bar } = foo;

console.log(bar); // { a: 1, b: 2, c: 3 }
```
linux ipアドレスを追加する

#Linux環境においてIPアドレスを追加する

##今回IPを追加する目的
標準ではLinuxマシンには一つのネットワークインターフェースに一つのIPアドレスが割り当てられている．
今回は弊ラボ内の別のネットワークグループに所属するマシンたちにwakeonlanコマンドを使用するためにIPアドレスを追加した．

##現在のIPの状態を確認
```
ip a
```
と打つと

```
1: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether hogehoge
    inet hogehoge brd hogehoge scope global enp2s0
       valid_lft forever preferred_lft forever
    inet6 hogehoge scope link
       valid_lft forever preferred_lft forever
```
といような出力がされるであろう．

このenp2s0が今回のIPの追加先である（ここは人によって異なるネットワークインターフェースの名前）

##IPの追加
```
 ip addr add xxx.xxx.x.xx/xx dev enp2s0
```
追加したいIPアドレス(xは任意のIPの意)と追加先のネットワークインターフェースを指示．

##IPの削除
```
 ip addr del xxx.xxx.x.xx/xx dev enp2s0
```
addをdelに変えるだけ．

####注意
再起動などをすると追加したIPが消えてしまうので，何かおかしいなと思ったらIPの状態を確認！