OmniAICreator/Qiita-1.07M huggingface dataset:
Gitのcommitとbranch：あなたのクソコミットはrebaseしても残っています

先日アイリッジの社内勉強会でgitの基礎概念を学んできたのでその共有です。初心者向け記事です。私自身が初心者なので不理解もあるかと思われます。間違ってたら編集リクエストを投げていただければ幸いです

## はじめにコミットがあった

コミット、ブランチ、タグなどgitにはいろいろな概念があります。しかし、gitにおいて最も基本的な存在はコミットです。ブランチやタグのないコミットは存在しますが、コミットのないブランチは存在しません。

コミットが持つ情報ら主に以下の二つです。（時刻みたいな基礎情報は飛ばします）

* コミット自体のid
* 直前のコミットid
* 直前との変更差分

直前との差分比較を繰り返して現状を表現するのがgitの基本です。直前のコミットidを持たないコミットは基本的に一つしか存在しません（二つ作った場合にはマージできない）。直前のコミットidを二つ持つコミットをマージコミットと言います（後述）。

## ブランチはコミットとともにあった

では、ブランチとはなんでしょうか？ ブランチは簡単にいえば、一連のコミットに名前をつけたものです。コミットは前にしか辿れないため、一つのコミットを決めると必然的に歴史は一つになります（マージは後述）。その一つの歴史に名前をつけたものがブランチです。


## ブランチはコミットであった

ブランチに対して、コミットを保存するワークスペースのようなイメージを初心者は持ちがちです。しかし、正しくは、ブランチは一つの最新コミットその自体です。本質的には、最新のコミット情報があれば、ブランチの基本的役割は果たせます。

## その他のgit操作

### mergeとは？

マージとは、二つのコミットを親にもつコミットのことです。コンフリクトを解消してあれば、途中が二つに分岐していても最新状態の再現は可能です。


### rebaseとは？

　rebaseは既存のコミットを元に新しいコミットを作り直すコマンドです。簡単にいえば、コンフリクトを解消して、別の親コミットを持った一連のコミットを作るだけです。

#### あなたのクソコミットはrebaseしても残っています

よくrebaseのことを歴史改変という人がいますが、それは正確ではありません。rebaseはコミットを作り直して、ブランチ名をつけ直すだけです。つまり、歴史を改変しているのではなく、新しい歴史書を作ってこれが正典だと主張しているだけです。本当の歴史はちゃっかり残っています。

## まとめ

* gitはコミットありき
* ブランチはコミットにわかりやすい名前をつけたもの
* rebaseしてもクソコミットは消えない
linux：scpコマンド備忘録

たまに使うけど絶妙な頻度なのでいつも忘れてる

# アップロード（ローカルのファイルをリモートに送る場合）

書式

```
scp ローカルのファイルパス リモートのユーザー名@リモートのアドレス:リモートのディレクトリ
```

使用例

```
$ scp hoge.txt admin@192.168.1.100:/home/admin/work
```

# ダウンロード（リモートのファイルをローカルに落とす場合）

書式

```
$ scp リモートのユーザー名@リモートのアドレス:リモートのファイルパス ローカルのディレクトリ
```

使用例

```
$ scp admin@192.168.1.100:/home/admin/work/hoge.txt /tmp
```
Chromium コードレビュー用拡張をいれる

これは[Chromium Browser アドベントカレンダー](https://qiita.com/advent-calendar/2017/chromium)の６日目の記事です。[Chromium Code Review Advent Calendar 2017](https://qiita.com/advent-calendar/2017/chromium-codereview)の「[コミット説明文(CL説明文)の書き方](https://qiita.com/nyaxt/items/a1a812b9bc1dccb3a935)」エントリもよろしくお願いします。

# Chromium コードレビュー用拡張をいれる
Chromiumのコードレビューは、Gerrit (+Polygerrit-ui プラグイン)を用いて行われていますが、[ダッシュボードページ](https://chromium-review.googlesource.com/dashboard/self)はそのままではわりと使いづらいです。具体的には、"Incoming reviews"に表示されているCLのうち、どれが自分のレビュー待ちなのかがわかりません。

[Chromite Butler](https://chrome.google.com/webstore/detail/chromite-butler/bhcnanendmgjjeghamaccjnochlnhcgj) というChrome拡張機能を入れるとこの問題が解決します：

Before（拡張なし）:
![before.png](https://qiita-image-store.s3.amazonaws.com/0/48831/be026606-6303-b9ec-bf0c-6529a93b5c72.png)

After（拡張あり）:
![after.png](https://qiita-image-store.s3.amazonaws.com/0/48831/074c00cc-a624-429a-409c-a2ba87c5a480.png)

拡張をいれると、自分がレビューアとして承認したCL (CR+1したCL) は緑で表示されるようになり、また他のレビューアのレビュー進捗状況も表示されるようになります。
コミット説明文(CL説明文)の書き方

[Chromium Code Review Advent Calendar 2017](https://qiita.com/advent-calendar/2017/chromium-codereview)の６日目の記事です。[Chromium Browser Advent Calendar 2017](https://qiita.com/advent-calendar/2017/chromium)の６日目の記事「Chromium コードレビュー用拡張をいれる」も合わせてご覧ください。 

# なぜCL説明文は重要なのか
良いCL説明文を書くことは、オープンソースプロジェクトの生産性に大きく貢献します。

まず、CL説明文がキッチリ書かれていると、コードレビューを効率的にすすめることができます。たとえば、コードレビューを行う際に心がける点としては、以下があります。

- CLで提案されている変更が必要かどうか
- CLで提案されている変更方法が妥当かどうか
- 変更後のコードで新たに問題が発生してはいないか
- コーディング規約、テスト配備など体裁がととのっているか

しかし、コード変更diffを一回読むだけでは、これらの点を全てチェックするのはなかなか困難です。よく書かれたCL説明文があると、このプロセスにおいてかなり助けになります。理想的な場合、「変更の必要性」「変更方法の妥当性」に関しては、CL説明文のみを用いて議論できます。また、コード変更の背景を予めレビューアと共有しておくことで、コード変更diffのチェックも、すばやく行えます。

また、CL説明文は、後からコードに変更を加える際に、大きな助けになります。なるべくそういう事態が発生しないように、日々気をつけてコードを書いていますが、残念ながら、「間違った処理をしているように見えるコード」や「なぜ必要なのかわからないコード」、「より良い手段が明らかなのに変なことをしているコード」に遭遇することがあります。これらのコードに遭遇した場合、`git blame`をかけ、そのコードが導入されたコミットを調べていくことになります。この際、CLの説明文やコードレビューのやりとりがはっきりと読みやすい形で残されていると、リファクタリングを効率的に、自信を持って行うことができます。

# CL説明文おすすめテンプレ
以下のテンプレで書くのがおすすめです。

```
[機能名] CL一行説明サマリ

他CLへの強い依存関係
CLの背景説明

CL前のコード説明。なぜそのコードを変える必要があるのか。
CL後のコード説明。この変更はなぜ必要なのか。

Test: テスト
Bug: crbug番号
```

## 一行サマリ
CL説明文の先頭の行には、CLの内容を一行に簡潔にまとめたものを書きます。この一行サマリは、レビューア依頼メールのタイトル、`git log --oneline`、bisectツール表示などで抜粋されて表示されます。つまり、一番使われるのは、ある範囲のCLに対してこの一行説明文のみをざっと眺めて、探している問題に関連していそうかどうかを確かめる用途です。

まず、[ES6 module], [HTML parser]など、巨大な Chromium コードのどの機能に関わるのかをヘッダタグとして書きます。

次に、実際の変更に関して書きます。使う動詞によって、どのような種類のコード変更かの意思表示ができます。
- バグ修正: "Fix A", "B should be C"
- コード削除: "Remove D", "Clean-up unused E"
- 新規機能実装: "Introduce F", "Implement G"
- レアケース修正: "Handle case where..."

コード変更がごく小さい場合、一行サマリに変更内容を全て書くこともできます。

## 他CLへの強い依存関係
他のCLのコード変更に強く依存したCLを書く場合、CL説明文に明示的にかかれていると、誤ってバグを混入してしまいCLをrevertする必要が出てきた場合の助けになります。Chromiumではこのrevert作業が別のエンジニアによって行われるケースが多いため、これは特に重要です。

この依存関係の例としては、たとえば、あるCLで挙動変更をし、次のCLでその挙動変更によって冗長になった処理を削除する、といったケースが挙げられます。

## CL前後の挙動説明
コード変更前の状況を書きます。"Before this CL, ..." で書き始めることが多いです。

変更前のコードにどのような問題があり、なぜコード変更が必要なのかを書きます。"However, ..."

最後に、このCLが問題をどのように解決するのか書きます。"This CL ..."

また、リファクタリングなど、実行時の挙動を変えないコード変更の場合、このことを明示しておくのが望ましいです。例えば、"No behavioral change."と書いておきます。レビューアはこれを踏まえて、本当に動作結果を変えない変更なのかどうかのダブルチェックと、変更がコードの可読性を実際に向上させるものかどうかを議論できます。

## テスト
CLで解決した問題に対するリグレッションテストを書きます。

javascriptで挙動が確認できる場合、 [web platform test](https://github.com/w3c/web-platform-tests) もあると良いです。

## バグトラッカー(crbug)番号参照
関連するバグ番号をすべて書きます。CLがlandしたとき、crbug側に自動で通知されるので便利です。

Chromium以外のプロジェクトのMonorailで管理されているバグの場合、[プロジェクト名]:idと書くのが一般的です。
例えば、v8バグの場合、 ```v8:1569```などと書きます。

github issueを参照する場合、```https://github.com/whatwg/html/issues/2630``` など issue の URL を書くと良いです。
ionic serveで Node Sass does not yet support your current environment

## ionic serveで Node Sass does not yet support your current environmentのエラーの対処方法

たまに古いionicを動かそうとすると、以下のようなエラーに当たる。
３かいくらい当たったので、メモとして残しておきます。

```
Error: Node Sass does not yet support your current environment: OS X 64-bit with Unsupported runtime (59)
```

node-sassを再ビルド

```
npm rebuild node-sass 
```

それでもダメなら、node_modulesを一旦削除して、もう一度npm installかと。
Kotlin学習覚書

## クラスにコロン（:）がついてたら「継承」を表す

```kotlin
class BaseClass

class SubClass : BaseClass // SubClassはBaseClassを継承している
```

## メソッドにコロン（:）がついてたら「戻り値」を表す
```kotlin
fun methodHoge : int a {
    // 何らかの処理

    return a  // aを返す処理
    }
はじめてのDocker～導入編

#はじめに
いままで大抵のプロジェクトで、開発環境やサーバーがうまく作れなかったり、泣かされてきました。いい加減、Dockerを取り入れなくてはと思い、調べるもWindows環境はあまりにも情報が少ないので記事にしました。

#インストール
[Install Docker for Windows](https://docs.docker.com/docker-for-windows/install/)からダウンロードします。

念のため安定版のGet Docker for Windows(Stable)を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/80457/878f0b4b-adb4-6b1a-ae29-e7a72c8babd5.png)

あとはダウンロードした"Docker for Windows Installer.exe"を実行するだけです

#確認
Hyper-Vマネージャで確認します
※Windowsの機能の有効火または無効化であらかじめHyper-Vを有効化しておく必要があります。

Hyper-Vマネージャは

- スタートボタン
    - アプリ一覧
        - Windows管理ツール

にあります。

Hyper-Vマネージャーを起動すると実行マシン名を選択してみてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/80457/b5f29a8e-12d7-767e-2422-439c8c05d1a1.png)

MobyLinuxが追加されているのがわかりますね。

##動作確認
window Powershell ISEで確認していきます

```
docker version
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/80457/486494b3-a546-b284-d096-22cea853e022.png)

各種情報が表示されればOKです。

#おわり
Dockerの導入は簡単でしたね。次回はDockerを使って何かしてみようと思います。
メルカリの分析チームとは？その全ての疑問にひとつひとつ答えます

社内のメンバーでやっているAdvent Calendarに参加しました。
いろんなチームからの色んな話があって面白いです。
[Qiita- Mercari Advent Calendar 2017](https://qiita.com/advent-calendar/2017/mercari)

私自身は、分析チームのあれこれについてこの機会に超仔細に書いてみました。
何かの参考になれば幸いです。

URL
http://tech.mercari.com/entry/2017/12/06/091807
iOS11 Safari でテキスト入力のカーソルがずれる問題

iOS11 Safariではテキスト入力要素である\<input type="text">や\<textarea>タグをfocusした際にカーソルがずれる不具合があるようです。

![Dec-06-2017 01-17-23.gif](https://qiita-image-store.s3.amazonaws.com/0/138265/7aa7d3de-5a8b-e232-e19f-78d1e1aafcff.gif)

シミュレータでも再現します

見た目がずれているだけならまだいいのですが、タッチしてコピーや切り取りをする場合に思うようにテキストが選択できないのは問題です。

必ず発生しているわけではなく、再現にはどうやら条件があるようで

 - 「position: fixed」を指定している要素の配下に入力要素があること
 - 入力項目にfocusが当たった際に、ソフトウェアキーボードによって項目の位置が押し上げられること

この2点を満たしていると発生しているように見えます。

---

色々と試行錯誤してみたところ、以下の方法でズレなく正常に動作しました。

- ソフトウェアキーボードに押し上げられないページ上部にfixedの要素を置く
    * UIを既存から大きく変えることになるため、あまり現実的ではなさそうです。   
- position: fixedを使わずに、position: absoluteなどで代用する
    * fixedの挙動を再現したい場合は、JavaScriptで動的にstyleを指定してもよいかと思います。

自分は後者で対応しました。
そもそもfixedを使わないようにするくらいしか、対応方法がなさそうなのがつらい...:innocent:

早くバージョンアップで修正されてほしいものです。

参考記事
https://hackernoon.com/how-to-fix-the-ios-11-input-element-in-fixed-modals-bug-aaf66c7ba3f8
https://stackoverflow.com/questions/46339063/ios-11-safari-bootstrap-modal-text-area-outside-of-cursor

未確認ですが、どうやらbootstrapのmodalでも起きている様子。
こちらは親要素にposition: fixedを当てることで直ると書いてありますが、bootstrapを使用していない自分の環境では修正を確認できませんでした。
Cordovaで使えるBLE(Bluetooth Low Energy)対応プラグイン一覧

※ 2020-02-24 最新状況を調べ直したのと、jins-meme-pluginの記述を削除しました

#はじめに
BLE(Bluetooth Low Energy)のプラグインの状況をまとめてみました。結論から言うと、cordova-plugin-ble-central/cordova-plugin-ble-peripheralとcordova-plugin-bluetoothleは使用上の差は殆どないので好きな方を使ってくださいになりますが、多少cordova-plugin-bluetoothleのほうが高機能なので、新しく触る方はcordova-plugin-bluetoothleをオススメします。

#前提知識（１）～BLEのP2PとBroadcast
BLE(Bluetooth Low Energy)には接続方式としてそもそも2種類（1対1通信、Broadcast）あります。ここでは1対1通信に特化して説明していきます。この2つの違いですが以下の記事が詳しいので参照してみてください。Broadcastはその名の通り暗号化せず内容を垂れ流すものですので、重要なデータを扱うデバイスではあまり使用されていないと思うので、ここでは1対1通信に特化して説明していきます。
[Bluetooth Low Energy（BLE）/ iBeaconとは](https://qiita.com/miyatay/items/4d4ce4ccd7905ddc0144)

#前提知識（２）～CentralとPeripheral
1対1通信の場合役割が明確に決まっており、BLE接続する機器は必ずどちらかがCentralになり、どちらかがPeripheralになります。通常スマホがCentralとなりデータを受け取ることが多いですが、スマホがPeripheralとなれるプラグインも公開されています。

#プラグイン
それではプラグインを３つ紹介させていただきます。

##cordova-plugin-ble-central
- 対応OS: iOS/Android
- 対応モード: centralのみ
- 概要: サンプルが揃っていて使いやすいプラグインです。私も個人的に[Realtime Running Dashboard Lite](https://play.google.com/store/apps/details?id=com.mau_cat_uacmlite)というアプリでBLE心拍計を使用しましたが、とても簡単にインテグレーションできました。

##cordova-plugin-ble-peripheral
- 対応OS: iOS
- 対応モード: peripheralのみ
- 概要: 通常スマホをCentralにすることがほとんどなので、「なぜわざわざスマホをPeripheralにするんだ？」という疑問が湧くかもしれません。その問いに関して「やってみたいから」以外の明確な答えが出せないのですがw、例えば「XXのデバイスのフリをさせる」みたいなことをやろうとしたけどハードウェアは大抵configurableではないので、そういうものをエミュレーションする用途に使用したりします。

##cordova-plugin-bluetoothle
- 対応OS: iOS/Android/Windows10UWP
- 対応モード: CentralとPeripheralの両方
- 概要: かなり高機能なプラグインで、CentralとPeripheralの両方になることができます。

# 制約

##Central共通（cordova-plugin-ble-central/cordova-plugin-bluetoothle）

- Android: Bondingをしていないデバイスで接続済みのデバイスを取得することはできない（ネイティブ機能ではLEではないクラスで実施できます）
- iOS: MACアドレスは取れない（ネイティブ機能でも取れません）

##Peripheral共通（cordova-plugin-ble-peripheral/cordova-plugin-bluetoothle）

- Android: 独自のServiceUUIDを割り当ててアドバタイズすることはできない

#おまけ1～プラグインを使わないという選択肢(Web Bluetooth API)
- 対応ブラウザ: [Can I use](https://caniuse.com/#feat=web-bluetooth)
- 対応モード: centralのみ
- 概要: まだ出始めたものなのでサポートブラウザは少ないのですが、ブラウザのみ・プラグイン不要で使う技が出始めています。Web技術の進歩は本当にすごいですね。
- 参考資料
[Web Bluetooth](https://webbluetoothcg.github.io/web-bluetooth/)

#おまけ2～Capacitorではどうなの？

IonicがCapacitorへの置き換えを進めている状況ですので、Capacitorでの状況も気になるところです。今の所、Capacitorで使えるプラグインは以下になります。
[BluetoothLEClient](https://github.com/robmarti/cap-bluetooth-low-energy-client)
現在はWebとAndroidにのみ対応とのことです。
/:usernameなroutingにするときに考えるべきこと

# はじめに
`to_param`を用いて`/:username`なルーティングを作る記事はよくみるのですが、`/:username`なルーティングにする際に、考慮すべきことまで書いてある記事がなかったので簡単にまとめることにしました。

# ステップ
## 1. ルーティング、to_paramを定義する

まずは、`/:username`なルーティングになるようにルーティングを定義し、`to_param`を対象モデルに定義します。

```ruby:routes.rb
Rails.application.routes.draw do
  resources :users, only: :show, path: '/', param: :username
end
```

```ruby:user.rb
class User < ApplicationRecord
  def to_param
    username
  end
end
```

こうすることで、URLのidの部分にusernameを指定することができます。

```ruby
user = User.find_by(username: 'hc0208')
user_path(user)  # => "/hc0208"
```

## 2. URLが被らないようにする
ルーティングを`/:username`にすると、usernameが他のルーティングの名前(例えば何かのランキングを表示するようなパス`/ranking`など)とかぶってしまう可能性があるため、usernameを登録する際にそれらのルーティングの名前はusernameとして登録できないようにする必要があります。

まずは、lib以下にトップレベルのルーティングを取得し、正規表現をつくるモジュールを配置します。

```ruby:route_recognizer.rb
module RouteRecognizer
  extend self

  INITIAL_SEGMENT_REGEX = %r{^\/([^\/\(:]+)}

  def top_level_path
    routes = Rails.application.routes.routes
    routes.collect { |r| match_initial_path(r.path.spec.to_s) }.compact.uniq
  end

  def match_initial_path(path)
    if match = INITIAL_SEGMENT_REGEX.match(path)
      match[1]
    end
  end
end
```


```ruby:path_regex.rb
module PathRegex
  extend self

  TOP_LEVEL_ROUTES = %w[404.html 500.html] # etc...

  def root_namespace_path_regex
    Regexp.new(Regexp.union(top_level_routes).source, Regexp::IGNORECASE)
  end

  def top_level_routes
    TOP_LEVEL_ROUTES.push(RouteRecognizer.top_level_path).flatten.freeze
  end
end
```


そして、カスタムバリデータを定義し対象モデルにバリデーションを追加しておきましょう。

```ruby:namespace_validator.rb
class NamespaceValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    if value =~ PathRegex.root_namespace_path_regex
      record.errors.add(attribute, "#{value}はすでに使用されています")
    end
  end
end
```

```ruby:user.rb
class User < ApplicationRecord
  
  validates :username, namespace: true, uniqueness: true # 必要に応じてlengthやformatオプションなども追加

  def to_param
    username
  end
end
```

これでトップレベルのルーティングをバリデーションではじくことができるようになります。

## 3. controllerにアクセスできないようにする

例えば`/items`というパスがあった際、ルーティングの書き方によっては/:usernameのルーティングに当てはまってしまう可能性があります。/:usernameのルーティングを一番下に書けば解決するのですが、気づかずその下にルーティングを追加しまったり、そもそも一番下にはおきたくなかったりする可能性もあるので対策しておきます。

railsのルーティングにはconstraintsという機能があり、アクセスの制限をかけられるのでかけます。lib以下にurl_constrainer.rbを配置します。

```ruby:routes.rb
require 'url_constrainer'

Rails.application.routes.draw do
  constraints(UrlConstrainer.new) do
    resources :users, only: :show, path: '/', param: :username
  end
end
```

```ruby:url_constrainer.rb
class UrlConstrainer
  def matches?(request)
    User.find_by(username: request.params[:username]).present?
  end
end
```

これで完了です。

# おわりに

「to_paramで/:usernameを作っておわり」ではなく、このあたりまではぜひやっておきたいところです。
facebook APIのトークンを取得する方法


####1. facebook開発者向けページへアクセスhttps://developers.facebook.com/?locale=ja_JP

<img width="1189" alt="スクリーンショット 2017-06-17 16.22.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/186100/49c35c58-77f2-77a5-2953-7aa6c60a8f5b.png">

####2. 右上のスタートボタンをクリックしてログイン

<img width="1228" alt="スクリーンショット 2017-06-17 16.23.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/186100/9cd453e6-640b-9225-c0b5-517826e65950.png">

####3.規約等に同意をして開発者としてアカウント登録

 <img width="1207" alt="スクリーンショット 2017-06-17 16.23.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/186100/2355d16f-b4b8-4abf-c916-b89c72fc76cf.png">

####3.アカウントの認証が必要です。

<img width="1200" alt="スクリーンショット 2017-06-17 16.23.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/186100/9de86a31-be0b-6493-a5ac-8ba12ed0ae07.png">

####4.アプリを作成します。名前は適当につけてください。

<img width="1189" alt="スクリーンショット 2017-06-17 16.25.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/186100/25c68d5a-0f9f-6b87-8438-ba7887c432d5.png">

####5.セキュリティチェックがあります。

<img width="1202" alt="スクリーンショット 2017-06-17 16.25.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/186100/58bc22d8-d5f5-06d4-b2b1-03ea1449aa86.png">

####6.作成したアプリのダッシュボード場でアプリのIDとSecretを確認することができます。これは今後クローリングする際に必要となります。このIDとSecretは他の人と共有しないでください。

<img width="1335" alt="スクリーンショット 2017-06-21 08.34.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/186100/74b95f57-9d91-3774-582a-44fff68ed86f.png">



####7. どのような内容をクローリングできるか試してみましょう。ツールとサポート中の「グラフAPIエクスプローラー」を開き、右上の　アプリに先ほど作ったアプリを選びます。

<img width="1052" alt="スクリーンショット 2017-12-06 午前8.36.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/186100/4d121ea2-ede4-6fa3-e665-b349415a2303.png">


####8. 次にクローリングしたいFacebook Pageのアドレスを入力します。アドレスは、Facebook Pageのトップページのページ名の下にある@から始まるアルファベットです。ホンダのページの場合"HondaJP"です（入力する際@はいりません）。
<img width="722" alt="スクリーンショット 2017-12-06 午前8.38.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/186100/cf87ce03-df30-9137-c458-b6eeb3bcbfd9.png">

####8. クローリングしたいページの名前をグラフAPIエクスプローラーの「v2.11/」のあとへ入力して（下図赤下線部）、どんな情報が手に入るか試してみましょう。下図の赤で囲ったプラスボタンで、入手したい情報を選ぶことができます。それぞれの項目がどんな情報なのかは、Facebook APIをドキュメントを確認しましょう（https://developers.facebook.com/docs/graph-api/reference/ ）

<img width="1048" alt="スクリーンショット 2017-12-06 午前8.46.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/186100/a72880b7-5df1-1498-b30d-946cd188c822.png">
社内勉強会を運営してみてわかった勉強会成功の3つのコツ！

DMM.com #1 Advent Calendar 2017 の8日目を担当させていただきます、@anbhtsです。
前日の記事は、@teru855 さんの【Kaggle】メルカリのコンペに出してみました でした
これは DMM.com #1 Advent Calendar 2017 - Qiita の7日目の記事です

カレンダーのURLはこちら
DMM.com #1 Advent Calendar 2017 - https://qiita.com/advent-calendar/2017/dmm
DMM.com #2 Advent Calendar 2017 - https://qiita.com/advent-calendar/2017/dmm2

#はじめに
エンジニアとして入社しまして、自分の学習の幅を広げたり、大人数で楽しいことやりたい（学びたい）ってのがありまして、定期的に月２で勉強会やったり、スポットで別の勉強会をやりました！
自分が参加者だったり主催者だったりして得たものを
今後の勉強会へ更に活かせるようまとめます！

（。。。余談ですが、勉強会やっていくなかで教育にも興味を持ち、今は教育をメインとした業務しています！）
#早速ですが、勉強会成功のコツを
##1.勉強会の目的を定義しよう
以下の内容を決めてから実施してみましょう（出来るだけ多く）

+ 実施の目的（何を伝えたい？学びたい？）
+ どんな人に参加してほしいか
+ 参加者が得られるもの
+ 勉強会がもたらすメリット
+ この勉強会でやること、やらないこと

##2.勉強会の成功を定義しよう
どうなったら成功か？ってのを決めておくと振り返りやすいですね。
たとえば、以下のようなものを設定し、勉強会後に振り返りを行うと良いですね。

+ 予定していたことが全部完了できる
+ 目標の参加者数を達成する
+ 参加者がブログ書いたり職場に伝達してくれる

##3.何よりもやる気と継続が大事！
主催者も参加者も目的を持って実施することはもちろん、やる気も大事です！
やる時には講師も参加者も動機付けをしっかりして臨みましょう！

また、人は何かを習慣にするには３週間続ける必要があります！
先ずは「やること」を目的にやっても良いと思います。
自分たちで達成できるゴールを作り。「小さな成功」を増やしていきましょう！

#最後に
終わってすぐと、終わって数カ月後に効果測定をやってみるのも面白いです。
参加者の周りの人に聞いてみて、会社や職場に何かしら良い変化が起きてたら嬉しいですね。

軽い内容で恐縮ですがこの内容意識してやってみてもらえたらと思います＾＾
Apache JMeter の自作サンプラーにパラメータを渡したい

Apache JMeter の AbstractJavaSamplerClient を拡張した自作サンプラにパラメータを渡したかったのだけれど、いろいろなやり方があって、どれが有効なのかよくわからないので整理してみる。

# TL;DR

- 同じ種類の Config Element が複数ある場合
    - User Parameters は Test Plan > Thread Group
    - User Defined Variables は Test Plan < Thread Group
- 異なる種類の Config Element が混在するる場合
    - User Parameters > User Defined Variables > Test Plan

# 実験

こんな構造にした:

```
+- Test_Plan
|  +- User_Parameters_0
|  +- User_Defined_Variables_0
|  |
|  +- Thread_Group_1
|  |  +- User_Defined_Variables_1
|  |  +- User_Parameters_1
|  |  +- Java_Request_1
|  |
|  +- Thread_Group_2
|     +- Java_Request_2
|
+ WorkBench
```

複数の Config Elements 上で同じ名前のパラメータを定義しておき、どの値が採用されるかを調査した。

# 結果

| TP | UP0 | UDV0 | + | UP1 | UDV1 | JR1 | + | JR2 |
|:--:|:---:|:----:|:-:|:---:|:----:|:---:|:-:|:---:|
| ✔ |  ✔ |      | + | ✔ |      | UP0 | + | UP0  |
| ✔ |     |   ✔ | + |     |  ✔ | UDV1| + | UDV0|
| ✔ |     |      | + |     |     | TP | + | TP  |

(くたびれた、あとでかく)

# 参考実装

```java
import (省略)

public class UserParameterReportSampler extends AbstractJavaSamplerClient {
    
    @Override
    public void setupTest(JavaSampleContext arguments) {
        arguments.getParameter("TheParameter");
        JMeterVariables variables = JMeterContextService.getContext().getVariables();
        variables.get("TheParameter");
    }

    @Override
    public SampleResult runTest(JavaSamplerContext context) {
        SampleResult result = new SampleResult();
        result.sampleStart();
        JMeterVariables variables = JMeterContextService.getContext().getVariables();
        result.setSamplerData(variables.get("TheParameter"), null/*encoding=DEFAULT*/);
        result.setSuccessful(true);
        result.sampleEnd();
        return result;
    }
}
```


# remote_host に異なるパラメータを渡したい

各々のJMeter Server が同期して動作するだけ。単純に2倍とかの負荷がかかるだけ。サーバごとに異なるパラメータを渡してくれるなんていう気の利いたことはしてくれない。

## サーバごとに異なる設定を仕込みたい場合
JMeter-Serverの起動パラメータで `-JserverID=001` のように指定すると、その文字列を User Parameters から `${__P(serverID)}` のように参照できる。

## サーバごとサンプリングごとに異なる設定を仕込みたい場合
CSV Import を使う。各サーバを起動したディレクトリにある CSVファイルを読むので、各サーバに異なる内容のファイルを置いておく。

# まとめ。

よくわからん……。とりあえず User Defined Variables を使っておこう。
Eclipse(STS)でTerminalを使う

私は・・・自宅では「IntelliJ IDEA(Ultimate版)」を、会社では「STS(Eclipse)」をメインIDEにしています。IDEAには「Terminal」機能が組み込まれており、この機能を使用してIDEA上でコマンド操作をすることがよくあります。STS(Eclipse)にも同じ機能ないかな〜と思って調べたら、（ふつうにw）「[TM Terminal](http://marketplace.eclipse.org/content/tm-terminal)」というプラグインが提供されていました！！

ということで、今回はEclipseの「TM Terminal」プラグインを簡単に紹介しようかと思います。

# 動作検証環境

## OS

* Mac
* Windows 10

## IDE

* Spring Tool Suite. Version: 3.9.1.RELEASE
* Eclipse Java EE IDE for Web Developers. Version: Oxygen.1a Release (4.7.1a)

> **NOTE:**
>
> 「Eclipse IDE for Java Developers」だとデフォルトでは「TM Terminal」プラグインが入っていないので、Eclipse Marketplace（Top Menu Bar > Help > Eclipse Marketplace）で「TM Terminal」を検索してインストールしてください。

# ローカルターミナルを開く

Terminalを開きたい場所を選択し、以下の要領でEclipse上にローカルターミナルを開くことができます。

<img width="1399" alt="スクリーンショット 2017-12-05 11.33.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/117313/33ea245d-910b-9f7d-a1f4-e22c038aa835.png">


<img width="1393" alt="スクリーンショット 2017-12-05 11.36.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/117313/bbd7bf2c-c697-2198-21da-280b48d3503c.png">

# リモートターミナルを開く

上記の開き方ではローカルターミナルが起動しますが、SSHやTelenetを使用してモートターミナルにアクセスすることもできます。

<img width="1399" alt="スクリーンショット 2017-12-05 11.48.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/117313/50366d5b-baf5-6ecd-915d-e742c0fcde5c.png">

# WindowsでGit Bashを開く

私が「おー」と思ったのは、Windows環境で「[Git Bash for Windows](https://git-for-windows.github.io/)」が認識された点です。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/117313/d6305b38-bfcd-061f-d05c-f523aba2e2b9.png)

以下のような操作を行うと、ローカルターミナルと同様に任意の場所でGit Bashを開くこともできます。

![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/117313/92424664-0746-7384-2fb8-f902215884b6.png)


![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/117313/0e5bd1f7-6ebe-9f6d-4e6a-59454cba1e93.png)

# まとめ

特にまとめることはありませんが、Eclipseライフが少しよくなりそうでうれしいです。
YubiKeyを実用面から機能別レビュー

#前書き
この投稿はSilbird Advent Calendar 2017の6日目の記事です。
FREEDOMな感じで良いとのことだったのでとりあえずまずはYubiKeyのおはなし

物理的なセキュリティキーに憧れて、とりあえず買ってみたYubiKey4
買ってから1年ぐらいたった今、実際に使ってみてどんな使い方がいいのか、逆にこんな用途には使えないとかをYubiKeyの機能別につらつらとまとめる
購入を検討している方や、手軽にセキュリティーを高めたい方、あと物理キーに魅力を感じる方の一助となれば幸いです
Windows機しか使ってないのでUnixまわりは触れていないのでご了承ください
~~ステマじゃないよ！~~

#便利
Yubikey単体で使えたり、現在常用してるもの等
##FIDO U2F
既にいろんなところでまとまってるが、GoogleやGithubなどで二段階認証の方式の一つとして使用可能
https://qiita.com/yugui/items/382275bb04c3fad09ff7

一番ポピュラーな6桁のワンタイムコードを入れるタイプは一々スマホなりを取り出す手間が結構めんどくさかったが、YubiKeyを使うと刺してあるYubiKeyのゴールドディスク(金色の電極)に触れるだけで二段階認証が完了する
本人の操作を求められるのは安心だし、その操作はワンタップなのでかなりお手軽
ぶっちゃけこれだけのためにYubiKeyを買ってもいいレベル
U2Fしか使わないなと思ったらU2Fにのみ機能を絞った青色の廉価版があるのでそちらを購入するとよい
ちなみにもしYubiKeyがなくても、ほとんどのサイトで別の二段階認証の方式が使えるので安心

##Windows Hello
Windows機のロック解除をWindows Helloデバイスとして振舞わせることにより可能
要サポートアプリインストール
https://www.microsoft.com/ja-jp/store/p/yubikey-for-windows-hello/9nblggh511m5
なおロック解除のみでログインには使用できない
刺してある状態だと特に何も操作することなくロック解除できるので便利
抜いておくと普段通りPINやパスワードでの認証を求められる

##Static Password
ただ単に設定したキーフレーズを吐くだけの機能だが、普段使いのパスワードと組み合わせて強固にしたり色々使える

#未検証
##PIV and OpenPGP SmartCard
私の環境だと使用していないが、OS上で何もしなくてもスマートカード+カードリーダーとして認識されるのでAD環境とかなら便利そう


#難アリ
基本的にYubikey単体で使えない or 別途実装が必要等
##OATH-TOTP
よくある時間ベースのワンタイムコード…なのだが別途サポートアプリが必要なのと、基本的にU2Fでほとんど事が足りるため使用していない
必要な時は既存のGoogle Authenticator等を使用している

##OATH-HOTP
こちらはYubiKey単体で動作するが、現在よく見かけるハードウエアトークンの代わりになるわけではない
上手に設定すれば使用できるのかもしれないがさらりと調べたところ特に見つからなかった

##Yubico OTP
Yubikey単体で使えるうえ、YubiKey4には標準でこの設定がSlot1に書き込まれているが、YubiKeyの独自実装なので使えるサービスは基本的に皆無

##Challenge-Response
YubiKey単体で使えるが、そのまま使用できる実装があまりないのがネック

#まとめ
U2FとWindows認証ぐらいでしか使ってないのが悲しい
結局現在普及しててまともに使えるのがその2つぐらいなので、残りの機能を使おうと思ったら自分で実装が必要になったり中々めんどくさい
まだPIVで証明書格納してSSH時に使用する等はできるがそれでも基本的によくあるSSHクライアントでは対応してないので実用面では不安が残る
ただ、U2Fでスマホを出さなくていいのはなかなかにストレスフリーなのでここはお勧め
WindowsHelloでのロック解除機能が必要ないなら青キー(FIDO U2F Security Key)を買った方が良いと思う
2018年、今年までとは違うWeb系プログラミングを始めようと考えている人達へ

[LIGのアドベントカレンダー](https://qiita.com/advent-calendar/2017/lig)6日目の記事です。
アドベントカレンダーが始まったという事は、もう2017年も終わってしまいますね。。。

もうすぐやってくる新年、きっと新しい事を始めようかなぁと考えている人も多いのではないでしょうか。
新しい言語を覚える事で出来る事の幅が広がるのはもちろん、今書いている言語でも新たな考え方が出来るようになると思います。
かくいう私も、色々と思うところがあり2018年はPythonをやろうと考えています。


まったくプログラミング言語に触れた事が無いという方は、ドットインストールの初心者向けの動画などから始めるのがわかりやすくて良いと思いますが、既に何かしらのプログラミング言語に触れた事がある人が新しい言語を始める場合、ドキュメントを読むほうが習得が早いのではないかと思います。

今回は、後者のタイプの人達が代表的なWeb系のプログラミング言語５つを始めるにあたり、個人的に必要になりそうだと思う情報をまとめてみました。
各言語、一番重要なの公式ドキュメントとデファクト・スタンダードなコーディング規約、そしてコメントに関するドキュメントの３つのリンクを記載しています。


## Javascript
Document : [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference)
CodingStyle : [GoogleCodingStyle](https://google.github.io/styleguide/jsguide.html)
Comment : [JSDOC](http://usejsdoc.org/index.html)

## PHP
Document : [日本語ドキュメント](http://php.net/manual/ja/index.php)
CodingStyle : [SymfonyCodingStyle](http://symfony.com/doc/current/contributing/code/standards.html)
Comment : [phpDocumentor](https://phpdoc.org/)

## Ruby
Document : [日本語ドキュメント](https://www.ruby-lang.org/ja/documentation/)
CodingStyle : [SymfonyCodingStyle](http://airbnb.io/projects/ruby/)
Comment : [YARD](http://yardoc.org/)



## Python
Document : [日本語ドキュメント](https://www.python.org/doc/)
CodingStyle : [PEP8](https://www.python.org/dev/peps/pep-0008/)
Comment : [PEP257](https://www.python.org/dev/peps/pep-0257/)

## Go
Document : [日本語ドキュメント](http://golang-jp.org/)
CodingStyle : [Go Wiki](https://github.com/golang/go/wiki/CodeReviewComments)
Comment : [godoc](https://blog.golang.org/godoc-documenting-go-code)

## おわりに
今回、各言語向けのコーディング規約やコメントの書き方などの情報を調べる際にざっと読んでみたのですが、ある程度似たような内容だったことも一つの収穫でした。
読みやすさを重視するには、どんな言語でも同じような点を注意するべきだという事がわかりました。

2018年、これらのドキュメントを読んで新しい言語を習得しスキルアップを図りましょう。
iBeaconでフィンガープリンティングな屋内測位

# iBeaconでフィンガープリンティングな屋内測位

この記事は[WHITEPLUS Advent Calendar](http://qiita.com/advent-calendar/2017/whiteplus "")  2017 6日目になります。

---

こんにちは。株式会社ホワイトプラス、エンジニアインターンの @ksbababa です。


いまさらですが、簡易的にBLEで屋内測位みたいなことをしてみたのでメモを残しておきます。
（文字ばかりになってしまって申し訳無いです……）
この記事ではBLEビーコンとiOSデバイスを用いて屋内測位を行う方法と簡易的なテスト結果を示します。
また、この検証はWHITEPLUSとは一切関係なく行ったものであることを申し添えておきます。

## 屋内測位とは
今となっては全く珍しい話では無くなりましたが、GPSの使えない屋内でも位置測位をする技術です。
これによって屋外と同じように目的地案内や人の動いた軌跡の記録などが行えるようになります。

## 手法
BLEに限らず、屋内測位の手法は数多く提案されています。
BLEビーコンに似たものだと音波を用いたビーコンや既存のWifiルータを用いたものがあります。
また、加速度などを利用してスタート地点からの差分を求めるPDRという手法もあります。
もちろんそれぞれの手法には精度や遮蔽物への強さなど利点不利点がありますので、現実的にはそれぞれを組み合わせて精度を上げるのが一般的です。

## iBeacon
今回はBLE、つまりBluetooth LEを用いたビーコンの電波強度を利用した測位を行います。
また、位置推定の手法も三点測位的な方法や、場所ごとに記録した電波強度を基に推定を行うフィンガープリンティグ法がありますが、今回はフィンガープリンティグ法を採用しました。
フィンガープリンティグ法を利用して実際に導入された例としては[コレド室町の歩行者ナビゲーションシステム](https://internet.watch.impress.co.jp/docs/column/chizu3/1045688.html)などがあります。

## 検証システム
### 環境
4[m]x6[m]程度の空間で行いました。空間の中央に6[m]の金属棚があり、2[m]x6[m]の空間2つに区切られています。

### BLEビーコン送信側
市販品を利用しました。1個1000円程度で、10m程度電波が飛ぶものです。
今回は8個を等間隔に2x4の形で設置しました。

### 受信側
iOSアプリで受信と位置推定を行いました。
実装については詳しく書かれている方がたくさんいらっしゃるのでそちらを参照ください。

[Swift2でビーコン受信](https://qiita.com/teradonburi/items/6b6838150ccfe395ffb6)

[(初心者向け)Swift3.0で初アプリ - ビーコンを検出してみる](https://qiita.com/egplnt/items/b9deefa85992bdad356f)

（※swift2で書かれているものは一部関数名や引数名が違うものがあります）

CoreBluetoothを利用してビーコンの受信を行っている記事もありますが、CoreLocationを使用しないとmajor, minor値などiBeacon特有の値が取得できない為ご注意ください。
また、CoreLocationを使用する場合、指定したUUIDのビーコンしか受信できませんのでこの点もご注意ください。
(逆にCoreBluetoothを使えばUUIDの指定無しでRSSIの値は取得できるが、iBeacon以外のBluetoothデバイスの電波強度も取得してしまうので恐らく面倒くさい）

## 準備
フィンガープリンティグ法の場合、位置推定を行う前に各点でのビーコンの電波強度を記録する必要があります。
今回は仕切りとなっている棚からそれぞれ1m離れた地点において、10cmずつ、合計2x60=120点程度で記録を行いました。
各点10回ずつ測定して、その平均値を推定に使っています。

## テスト
計測した120点で10回ずつ位置推定を行ってみました。
位置推定は記録した電波強度と受信した電波強度の距離を愚直に計算して用いました。
はじめはユークリッド距離でやっていましたが、cos類似度でも計算してみました。
120点程度だとリアルタイムで問題なく計算できました。（1秒毎）

## 結果
平均誤差を示しておきます。

|計算方法|平均誤差[cm]|
|-------|------:|
|ユークリッド距離|101|
|コサイン類似度|85|

概ね一般的に言われるように1m程度の誤差になりました。

## 最後に
最初は受信したビーコンの値のうち、強度が低いものを切り捨てたり、上位数個の値のみを使って推定した方が精度が上がるかと思いましたが、今回テストした限りでは全ての値を用いた方が結果的に誤差は小さくなりました。
また、単純な誤差のみで検証しましたが、これだけ単純にやってもそれなりの値が出てくるので、通常ではあり得ない距離の移動を制限したり、PDRと組み合わせたり、推定に機械学習を用いれば誤差はもっと小さくなるだろうと思います。

何かツッコミやアドバイス、疑問点があればコメントお願いします。

---



#ホワイトプラスではエンジニアを募集しています
ホワイトプラスでは、[新しい技術にどんどん挑戦したい！という技術で事業に貢献したいエンジニアを募集](https://www.wantedly.com/projects/169974)しております。
0からのブロックチェーン勉強法

##はじめに

ここ1年くらいビットコインやブロックチェーンの面白さに目覚めてコツコツと勉強してます。
今回は0から今までどのように学んできたのかリンク集です。
主に6つの方法を実践してきて今も継続しているものです。

- 本を読む
- 有料サロンに入る
- 実際に触ってみる
- 勉強会に参加する
- SNSで情報を入手する
- その他

具体的にどのように実践してるか簡単にまとめます。

##本を読む
簡単な順に並べてみました。

まずは基本から。
[ビットコインはどのようにして動いているのか？](http://amzn.asia/7lChQjQ)
[ブロックチェーンの衝撃](http://amzn.asia/cXWKxvz)

ここから難しくなりますがざっくりでも読むだけでも十分だと思います。
あとから必要に応じて読み返せばOK！
[Mastering Bitcoin](http://amzn.asia/f4Rj1EI)
[はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門](http://amzn.asia/1k8cQyq)
[ブロックチェーン・プログラミング 仮想通貨入門](http://amzn.asia/7u0cIh8)

##有料サロンに入る
有料なので情報が豊富だったり他にはない情報が蓄積されてます。
「ビットコイン＆ブロックチェーン研究所」は15~20ページほどのレポートが90本ほどあるなど技術的に理解を深めることが出来ます。また「即戦力ブロックチェーン技術者養成道場」はEthereum,Hyperledger Fabricについて実績的な情報がまとめられてます。
[ビットコイン＆ブロックチェーン研究所](https://synapse.am/contents/monthly/bitcoin)
[即戦力ブロックチェーン技術者養成道場](https://lounge.dmm.com/detail/469/)

##実際に触れてみる
勉強を目的でビットコインを少額購入して送金したり、利用したりしてすると理解がより深まります。
ビットコインが店舗で直接使えなくてもVISA加盟店で利用できるVISAプリペードカードがあります。
これはビットコインでチャージが出来ます。
[バンドルカード](https://vandle.jp)

##勉強会に参加する
[暗号通貨読書会／勉強会](https://cryptocurrency.connpass.com)
使用した資料は各回のcommpassにあります
[BLOCKCHAIN EXE](https://blockchainexe.com/category/event/)
使用した資料がslideshareにあります
[BLOCKCHAIN EXE資料](https://www.slideshare.net/blockchainexe/presentations)

##SNSで情報を入手する
Facebookばかりですが・・・
[ビットコイン研究所（無料版）](https://www.facebook.com/groups/bitcoinresearch/)
[仮想通貨勉強会](https://www.facebook.com/groups/592411710814685/)
[Ethereum Japan](https://www.facebook.com/groups/543860925720864/)
[Crypto Currency Magazine](https://www.facebook.com/cryptocurrencymagazine/?hc_ref=ARRc3jYrkWwhyV87sqe13NKqMTZNnPuDsVmnocub3POefX3Ph4HfGeTEocFKFrIxDw8)

[ブロックチェーン最前線](https://www.facebook.com/blockchainforefront/?hc_ref=ARTwhqTV_72byF44EmUuXtl8ahfTowGyuncJmAnJl3npvixtHjJOsyjAAyHIaKVqG8k&fref=nf)

##その他
####ニュース
[BTCN](https://btcnews.jp/category/news/)

####用語集
[Blockchain Bizの用語集](http://gaiax-blockchain.com/glossary)
[bitFlyerの用語集](https://bitflyer.jp/Glossary/Index?top_link&footer)

####自主学習用
デジタルガレージのワークショップは動画、資料、テスト環境も無料提供
[BC2 (Blockchain Core Camp) Season 1](https://bc-2.jp/season1/)
[BC2 (Blockchain Core Camp) Season 2](https://bc-2.jp/season2/)

####YouTube
[ビットコイナー反省会](https://www.youtube.com/channel/UCRP9Ij6gL9IViB7MS3Ez9aw/videos)
[暗号通貨読書会／勉強会の勉強会動画](https://www.youtube.com/channel/UCy5ewZM2cyLqQ9ZiEBvnZqw)

####エクスプローラ
ビットコインのデータを調べることができる
[blockchain.info](https://blockchain.info)
イーサリアムのブロックその２

[イーサリアムのブロック構造と合意するアルゴリズム - Qiita](https://qiita.com/blueplanet/items/89e5cee98e3a44ad1d48)　ではブロック構造を調べてみたが、下記の２つは疑問でした。

```
receipts_root: ???
logs_bloom: ???
```

## receipts_root
- 各トランザクション毎に、トランザクションを実行する時、発生した下記の各種データをレシート（receipt）として記録される。
    - ブロック番号
    - ブロックハッシュ
    - トランザクションハッシュ
    - 使われた gas
    - 該当トランザクションを実行した後、ブロック内に使われたガス
    - 該当トランザクションを生成した時に作られたログ
    - etc
- ブロックにある全てのトランザクションのレシートを基づいて、マークル木構造を作成し、最終的にrootノードのハッシュ値を `receipts_root` とする

## logs_bloom
- ブロックチェーンで発生した各種のイベント（普通のトランザクションやコントラクト間でのやり取りなど）をトラッキングできる
- ログには概ね下記の情報を含めている
    - ログを取っているのアカウントアドレス
    - トランザクションによって実行されるイベントを表すトピック
    - それらのイベントに関連するデータ
- `bloom` というのは、`ブルームフィルター` であり、`ある情報を含めているかどうかを効率よく、確率的に判定できる` データ構造である
- これがあるため、ログを検索したい場合、ブロック全体ではなくヘッダー部だけ取得し、この `logs_bloom` の部分を使って、検索したいキーワードを含めるかどうかを判定できる


## 参考記事
- [Ethereumはどのように動いているのか - The Coffee Times](http://coffeetimes.hatenadiary.jp/entry/2017/11/07/082426#Transacton-receipt)
- [ブルームフィルターとは](https://bitflyer.jp/glossary/bloomfilter)
最近使ってるツールや開発環境など

最近業務で使ってるツール、開発環境についてまとめる機会があったので、ログを残しておきます。

前提として普段業務では以下の感じの技術を使ってます。位置情報使ったプロダクト作ってます。

#### データ処理
- Apache Spark 
- EMR
- Scala

#### Webアプリ
- Rails
- React
- MySQL

#### その他
- Python (Lambda書くときだけ使ってます)


## 使ってるエディタ
#### Ruby
- RubyMine
  - 安定のJetBrains製のIDEです。有償版しかないっぽいです。
  - Gitクライアントが結構優秀
      - diff, commit, push等ほぼなんでもやってくれます。
      - SourceTree等が不要になります。アプリケーション切り替えのコストもなくなります。
  - Rubyの作法を指摘してくれるので、特にRuby初めて触るときに助かる。
  - 定義元へのジャンプがめっちゃ楽。メタプログラミングしてる箇所以外はほぼ完璧です。
  - デバッグが楽
  - IDE自体がリソースの編集履歴を持っているため、gitにコミットしてなくてもなんとか復元できる。


#### Scala
- IntelliJ IDEA CE
  - 無償版です。
  - RubyMineと同じくJetBrains製です。
  - JavaとScalaはIDE必須です。

#### Python
- PyCharm
  - たまに使ってますが、PythonはLambda以外で使わないので、Lambdaのエディタで直接編集してしまってます。そのうちCloud9とか使っていきたい。

## MySQL クライアント
- MySQL WorkBench
  - 正直なんでも良いとは思いますが、最初に使ってたツールです。たまに急に止まってしまうので、不安になることがあります。
- Sequel Pro
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132840/5ef055ff-6e84-a3d8-a929-1b44b6e9fe83.png)
  - 接続先のホストに応じて色変えられるのは良いです。
  - わりと直感的に使えます。社内ではほとんどこちらが使われてます。

## Git クライアント
- TIG
  - テキストベースのGitクライアント。
  - 環境の制約上、SourceTree等が使えない場合に使えます。
  - git pushはできません。
- SourceTree
  - Gitクライアントの中では有名所。ブランチの数が多くなると遅くなる。
- GitKraken
  - 商用利用は有償
  - Electron使って作られる
  - サクサク動く
  - UIが直感的。SourceTreeよりおすすめ
  <img width="1422" alt="スクリーンショット 2017-12-06 5.10.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/132840/896406fb-1d1f-6984-681f-9fbbe89f6daa.png">

- RubyMine
  - 正直GitKrakenが一番使いやすいが、アプリ立ち上げ、切り替えのコストを考えると、IDEの中で使えるのはメリット
  - 機能的にはほとんどできないことはなさそう

## まとめ
言語初心者等はJetBrains製のIDE使って、言語のお作法学ぶのが楽かなと思います。RubyMineやPHPStormなんかは有償ですが、お金払う価値はあります。Gitクライアントにお金払うかは微妙なところですが、プライベートでの開発なら無償なのでGitKraken使うのありかなと思います。

位置情報系のプロダクトのエンジニア、PMともに募集してるので、気になる方はメッセ等ください！
micro:bit で FizzBuzz

# はじめに
これは [FizzBuzz Advent Calendar 2017](https://qiita.com/advent-calendar/2017/fizzbuzz) 21 日目の記事となります。
micro:bit で FizzBuzz をやってみます。micro:bit が何なのかについては [Wikipedia を参照](https://ja.wikipedia.org/wiki/BBC_Micro:bit)してみてください。

# コード

## ブロックエディタ

ブロックエディタ (https://makecode.microbit.org/) で FizzBuzz を書いてみました。

![FireShot Capture 23 - microbit_FizzBuzz - makecode.microbit.org - https___makecode.microbit.org_.png](https://qiita-image-store.s3.amazonaws.com/0/21785/24fe530c-8866-ff3d-9a36-c32975620a8d.png)


JavaScript に切り替えるとこのようなコードに展開されるようです。

```js:microbit_FizzBuzz.hex
let v = 0
basic.forever(() => {
    for (let i = 0; i <= 99; i++) {
        v = i + 1
        if (v % 3 == 0 && v % 5 == 0) {
            basic.showString("Fizz Buzz")
        } else {
            if (v % 3 == 0) {
                basic.showString("Fizz")
            } else {
                if (v % 5 == 0) {
                    basic.showString("Buzz")
                } else {
                    basic.showNumber(v)
                }
            }
        }
    }
})
```

冗長だからとコードを直接書き換えてブロックエディタに戻すとうまくブロックにならないと思います...そこは妥協しましょう (w

**See Also:**

 - [micro:bit (microbit.org)](http://microbit.org/ja/)
 - [Microsoft ブロックエディタ](https://makecode.microbit.org/)


## Arduino IDE

別途ライブラリを導入することによって、Arduino IDE でも micro:bit のプログラムを行う事ができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21785/37e120fd-5840-b6f6-a939-ec567cc3e39d.png)

LED スクリーンライブラリもある (作った) ので簡単に文字列表示できます。

```cpp:microbit_fizzbuzz.ino
#include "microbit_Screen.h"

void setup() {
  SCREEN.begin();
}

void loop() {
  for (int v = 1; v <= 100; v++) {
    if (v % 3 == 0 && v % 5 == 0)
      SCREEN.showString("Fizz Buzz");
    else if (v % 3 == 0)
      SCREEN.showString("Fizz");
    else if (v % 5 == 0)
      SCREEN.showString("Buzz");
    else
      SCREEN.showNumber(v);
  }
}
```

**See Also:**

 - [Arduino (arduino.cc)](https://www.arduino.cc/)
 - [Arduino Core for Nordic Semiconductor nRF5 based boards (GitHub)](https://github.com/sandeepmistry/arduino-nRF5)
 - [BBC micro:bit (DEKO のアヤシいお部屋)](https://ht-deko.com/arduino/microbit.html)
 - [micro:bit with Arduino (Adafruit)](https://learn.adafruit.com/use-micro-bit-with-arduino/)
 - [LED Screen library for micro:bit (for "Arduino Core for Nordic Semiconductor nRF5 based boards") (GitHub)](https://github.com/ht-deko/microbit_Screen)

# おわりに

[micro:bit](https://qiita.com/advent-calendar/2017/microbit) や [Arduino](https://qiita.com/advent-calendar/2017/arduino) のアドベントカレンダーも開催されているようなので、興味のある方は是非！
ちょっと気になった『ポリモーフィズム』

###[妖精](https://jp.leagueoflegends.com/ja/game-info/champions/Lulu/)「かわいくなーれ！」
![65ef1069-s.png](https://qiita-image-store.s3.amazonaws.com/0/146678/ae8ea2e3-634a-a3e0-3e5f-91deca7ef6c5.png)

冗談はさておき…
今日授業で気になった単語にメモ書き

##ポリモーフィズムとは？
プログラミング言語の型システムの性質を表すもので、プログラミング言語の各要素（定数、変数、式、オブジェクト、関数、メソッドなど）についてそれらが複数の型に属することを許すという性質を指す。ポリモルフィズム、多態性、多相性、多様性とも呼ばれる。

対義語も存在するみたいで、**モノモーフィズム**、単態性、単相性で、プログラミング言語の各要素が唯一つの型に属するという性質を指す。

今回はポリモーフィズムについて話します。

##ポリモーフィズムをRubyで考える

同じメソッドを実行してもオブジェクトの種類によって, 振る舞いが異なる(違うメソッドが実行されている)。

引数として動作しているは代入されたオブジェクト(のクラス)によっていろいろな振る舞いをする。


**そのメソッドが呼びだされたときにどう振舞えばいいかをオブジェクトが知っていると言える**

```ruby:qiita.rb
#屈強な戦士
class Garen
    def shout
       puts "デマーシアー！"
    end
 end
 
 #形や構造などが可愛い獣な戦士
 class GarenWhimsy < Garen
    def shout
       puts "キューン、キューン"
    end
 end

 #叫ぶ！
 def exclaim(who)
    who.shout
 end

 garen = Garen.new
 garenWhismy = GarenWhimsy.new

 exclaim garen #デマーシアー！
 exclaim garenWhismy #キューン、キューン

```

これがやりたかった…
ネタが趣味によってしまっているので、汎用的な例は参考文献でご確認ください！

##思った事
今回題材にした妖精のさんスキル「Whimsy」ですが[ブログ](http://noiselessworld.hatenablog.jp/entry/2017/01/30/002252)を読む感じ生物学のポリモーフィズムになるのかなと思います。

##参考文献
[Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%95%E3%82%A3%E3%82%BA%E3%83%A0)
[Ruby入門 オブジェクト指向](http://masa.o.oo7.jp/ruby/ruby2.htm#chap5)
[騒音のない世界 BLOG](http://noiselessworld.hatenablog.jp/entry/2017/01/30/002252)
ちょっとずつ読むドメイン駆動設計 第三部 より深い洞察へ向かうリファクタリング 第十一章 アナリシスパターンを適用する

あちこちにブログを書いていて、本日3本目。

ドメイン駆動設計の効果的な点の１つとして、ドメインの問題に対して、以前にどう解決したかという記録を活用できるところがあります。

また、過去の試行錯誤が、新しい状況と関連付けられ役に立つこともあります。

そういったモデルは既に表現力豊かで、実装可能であり、すぐにリファクタリングや実験が行えます。

なので、同じドメインの複数のプロジェクトに関われるというのは、とても有利なことだと思います。
自分自身、人材系の複数のドメイン駆動設計プロジェクトに関われたり、今でもEC系の複数のプロジェクトに関われているのはとても有効で過去の経験が役に立っています。

# アナリシスパターン
とはいえ、初めて携わるドメインにおいて、有効な方法が全くないかというとそういうことはありません。

別の人が携わった過去のプロジェクトが役に立つことがありますし、パターンとしてまとめられた書籍もあります。
マーチン・ファウラーの「[アナリシスパターン](https://www.amazon.co.jp/dp/4894716933)」や、Pavel Hrubyの[ビジネスパターンによるモデル駆動設計](https://www.amazon.co.jp/dp/4891005513)など役にたつと思います。
（アナリシスパターンは現在絶版中なのがもったいない・・・図をUMLにして再出版して欲しい><;)

で、実際これらを使ったことがあるかというと、実は、自分はまだないです。。。
ただ、さっきちょっとアナリシスパターンを読み返してみたところ、ちょっと読んでおいたほうがいいかもというところもありました。

ECのドメインを今扱っているので、在庫管理や会計のあたりは役に立ちそう。
とはいえ、実際には配送があったり、支払い方法が多数あったりなどでそのまま使えるかと言われるとやはりそうでもないです。

使えそうなのは、アナリシスパターンにある知識、語彙、概念です。

ここを知っていることで深いモデルへの発想につながるかもしれません。

改めて、アナリシスパターン読んでおこうと思いました。
AWS Cloud9でpythonライブラリを含めたLambdaのデプロイ

# はじめに
AWS Cloud9でライブラリを含めたデプロイが出来ました。
slackwebを使って動作検証したものをメモとして残します。


### ■ 環境(以下を参照)
[AWS Cloud9を動かしてみた](https://qiita.com/icck/items/7705ef6871e261d6535e)
### ■ Lambdaの基本的なデプロイ検証(以下を参照)
[AWS Cloud9でLambdaの作成、テスト、デプロイまでの手順まとめ](https://qiita.com/icck/items/4c2fa4e0bd87ce214c92)

# 内容
## 事前準備
* SlackのWebフック取得
* 「λ+」ボタンからlambdaの作成を実施

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/cb262ea8-2a09-0a2d-62a4-9e0b53dfa159.png)

## slackwebをpip
lambdaを作成したディレクトリにpip。
「pip install slackweb -t .」

```bash:bash
user:~/environment/slackwebtest $ pip install slackweb -t .
Collecting slackweb
  Using cached slackweb-1.0.5.tar.gz
Installing collected packages: slackweb
  Running setup.py install for slackweb ... done
Successfully installed slackweb-1.0.5
user:~/environment/slackwebtest $ 
```
![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/61bc4b28-67ab-3895-78b9-b768884581c1.png)




## lambdaソース
ライブラリが使える事に目的絞って内容はシンプルに。

```python:lambda_function.py
import slackweb
def lambda_handler(event, context):
    slack = slackweb.Slack(url="webフック")
    slack.notify(text="pythonからslackさんへ",
                 username="monkey-bot",
                 icon_emoji=":monkey_face:"
                )
```

## デプロイ

* 対象ディレクトリを選択してデプロイ。
* Lambda側のコンソール関数コード以下に複数ファイルデプロイされたように表示されないのですが、ちゃんとデプロイされています。


![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/076bf642-daa5-90eb-1b43-8e0fa06982d8.png)


## テスト
Lambda(**remote**)で実行。

![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/1b56ee56-4610-0d7b-9be1-4c02be723d66.png)

Slack投稿を確認

![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/44aab898-c352-95ff-222e-13f5d2bb53bf.png)


# まとめ
* ライブラリを含む複数ファイルでもデプロイできた。
* デプロイしたファイルがLambdaのコンソール関数コード以下に正しく表示されないことが不安になる。私の中で未解決。(1ファイルのデプロイの場合は正しくコンソールに表示される)

* クライアント端末を汚さず、手軽にLambda出来ることはAWS Cloud9のメリット。
PHPでExcel

PHPExcelの使い方メモです。

# 補足

* PHPExcelの新バージョンとして[PhpSpreadsheet](https://phpspreadsheet.readthedocs.io/en/develop/)が出ているようです。
* PhpSpreadsheetでもメモリの問題はあるようで、メモリ消費の少ない[PHP_XLSXWriter](https://github.com/mk-j/PHP_XLSXWriter)というのもあるみたいです。
[php-excel-writer-performance-comparison](http://www.zedwood.com/article/php-excel-writer-performance-comparison)
* 性能なら[LibXL](http://libxl.com/php.html)　[PHP](https://github.com/iliaal/php_excel/)　[LICENSE](http://libxl.com/purchase.html)

# インストール

```
composer require phpoffice/phpexcel
```

# 基本的な使い方例
https://github.com/PHPOffice/PHPExcel/blob/1c8c2379ccf5ab9dd7cb46be965821d22173bcf4/Examples/01simple-download-xlsx.php

上記の例ようなB5等のセル位置を指定する方法よりも以下の列と行をしていする方法の方が便利そうです。

```php
// Set cell B5 with a string value
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(1, 5, 'PHPExcel');
```

https://github.com/PHPOffice/PHPExcel/blob/1c8c2379ccf5ab9dd7cb46be965821d22173bcf4/Documentation/markdown/Overview/07-Accessing-Cells.md#setting-a-cell-value-by-column-and-row

# メモリ設定
PHPExcelはメモリを多く使うので使用する際には以下の設定を行っておくと良さそう。

```php
// ファイルキャッシュに変更（遅くなるがメモリを大幅に減少）
PHPExcel_Settings::setCacheStorageMethod(PHPExcel_CachedObjectStorageFactory::cache_to_discISAM, ['dir' => '/tmp']);
```

https://github.com/PHPOffice/PHPExcel/blob/1c8c2379ccf5ab9dd7cb46be965821d22173bcf4/Documentation/markdown/Overview/04-Configuration-Settings.md#phpexcel_cachedobjectstoragefactorycache_to_discisam

# まとめ

```php
// Excel作成
PHPExcel_Settings::setCacheStorageMethod(
    PHPExcel_CachedObjectStorageFactory::cache_to_discISAM,
    ['dir' => '/tmp']
);
$objPHPExcel = new PHPExcel();
$objPHPExcel->setActiveSheetIndex(0);
$objSheet = $objPHPExcel->getActiveSheet();

$xlsx_data = [
    ['A1', 'B1', 'C1'],
    ['A2', 'B2', 'C1'],
];

foreach ($xlsx_data as $row_index => $row_data)
{
    foreach ($row_data as $column_index => $column_data)
    {
        $objSheet->setCellValueByColumnAndRow($column_index, $row_index + 1, $column_data);
    }
}

$current_datetime = new DateTimeImmutable(date('Y-m-d H:i:s'));
$file_name = 'test_' . $current_datetime->format('YmdHis') . '.xlsx';
$file_path = '/home/public/app/tmp/' . $file_name;

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save($file_path);
```

# 参考

https://qiita.com/nwsoyogi/items/a25d2bc050d53a79ab93
http://www.zedwood.com/article/php-excel-writer-performance-comparison
Splatoon2のステージ情報LINE botを作ったお話

[ボットアドベントカレンダー](https://qiita.com/advent-calendar/2017/bot)の6日目です。  

# Splatoon2 bot作成の経緯
私は友人とLINEのグループを作ってプレイ開始時間の調整や作戦会議等行うことが多いのですが、
その際イカリング2の情報をLINEに貼り付けたいと思うことが多々あったので、
今回BOTを作ってみました。

**利用してみたい！という方がいたら下のほうに友達追加のリンクを貼っておくので友達追加してくれると嬉しいです。**

まずはこちらをご覧ください。
<img width="265" alt="intro.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/17012/bdf10a08-c3ea-c12c-8e2c-01c1e69497b2.png">

LINEのMessagingAPIと[Spla2](https://spla2.yuu26.com/)を利用したLINE botです。

ご覧の通り、Splatoon2のステージ情報を教えてくれます。
取得できる情報は基本的にはイカリング2と同様ですが、
イカのような用途を想定しています。
- スプラトゥーンプレイヤーグループにBOTを参加させて、リーグマッチの待合せ、作戦会議
- 特定の時間のガチマッチのルール/場所をさっと検索
- ブキのサブ、スペシャルを取得またはサブ、スペシャルからブキの検索


# 構成情報
---
Webhookを受け取るプログラムをHeroku上に設置し、LINEとやり取りさせています。
処理としては特に難しいことは行っておらず、後述するコマンドをトリガーとして[Spla2](https://spla2.yuu26.com/)から情報を取得しパースしてLINEに投稿しているイメージです(雑)。

- 利用しているもの一部
  - [LINE Messaging API](https://github.com/line/line-bot-sdk-python)
  - [line/line-bot-sdk-python](https://github.com/line/line-bot-sdk-python)
  - [Flask](http://flask.pocoo.org/)
  - [Spla2](https://spla2.yuu26.com/)

ソースコードは[こちら](https://github.com/nohararc/Splatoon2-linebot)

# コマンド一覧
冒頭でも少し例をご紹介しましたが、ここでは種類別に紹介したいと思います。
※カッコ内()は省略名

### ステージ情報関連

1. 現在のステージ情報を取得 
    - 書式： ルール名(短縮名も可) 
    - 例： レギュラーマッチ  
<img width="266" alt="レギュラーマッチ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/17012/d1c2b0ee-90cc-1f16-7419-ceca9e5b8a25.png">


2. 指定時間のステージ情報を取得
    - 書式： ルール名(短縮名も可)時刻
    - 例： リグマ23  
<img width="265" alt="リグマ23.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/17012/bf419c43-98b2-4b2c-4881-4cadd1bf47cb.png">

### サーモンランの情報関連
  - 書式： サーモンラン  
<img width="261" alt="サーモンラン.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/17012/23f2e1a5-6b4e-2016-3ce8-7b98b23299e6.png">

### ブキの情報
1. ブキのサブ、スペシャル情報を取得
  - 書式： ブキ名(短縮名も可)
  - 例： ケルビン  
<img width="270" alt="ケルビン.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/17012/58dd157e-2d1d-b92f-d9c2-39c9e61ca7ee.png">

1. サブ、スペシャルからブキ情報一覧を取得
  - 書式： サブ、またはスペシャル名(短縮名も可)
  - 例： ジェッパ  
<img width="264" alt="ジェッパ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/17012/65e89e67-0f76-bfd9-78e9-4c979af16910.png">

# まとめ
Messaging APIを利用し、splatoo2のステージ情報等を返すLINE botを作ってみました。
今回はpythonで実装しましたが、各種言語の[SDK](https://developers.line.me/ja/docs/messaging-api/line-bot-sdk/)も公開されているため、LINE botに興味がある方は実装してみてはいかがでしょうか。  

今回作成したBOTへの友達追加、ご意見ご要望お待ちしております。
[twitter: noharatan](https://twitter.com/noharatan/)
<a href="https://line.me/R/ti/p/%40epv9030p"><img height="36" border="0" alt="友だち追加" src="https://scdn.line-apps.com/n/line_add_friends/btn/ja.png"></a>
ひとりslackの使い方を改めて考えてみる

#Slackをさらに便利な秘書にする
前回[私のブログ](http://shutaka785719.hatenablog.com/entry/2017/11/14/170000)にてSlackを秘書にするファーストステップを考察しました。
今回、さらに踏み込んでみます。

#amazonの注文メールを連携する
amazonの発注を寝ぼけてしてしまうということはありませんか？
私はよくありますｗ
考えた結果、「Mything」というアプリでamazonからの注文メールを連携し、毎朝チャックするようにしました。

#kinoppyのセール情報を連携する
kinoppyユーザなのですが、ポイント25倍がいつ行われるのかわかりませんｗ
（kinoppyのおいしいところは25倍になる時があることです）

これもMythingを使っています。@Kinokuniyaのツイートより、「25倍」というツイートを抜き出して連携するように設定しています。

ちなみに、期間中めちゃくちゃ連携されてくるので、salesというチャンネルを作って、そこに連携しています。

※随時更新します
svnとコマンドプロンプトだけで削除されたファイルをバージョン管理から削除する

需要があったので書いておく。

# 目的

Subversionで管理対象のファイルが削除されている時に、そのファイルをバージョン管理からも削除したい。
ただし、外部ツールに依存したくないのでsvnとコマンドプロンプトだけで実現する。

# 方法

バージョン管理中のファイルを削除した場合は紛失扱いになる為、```svn status```の結果、先頭文字が!になる。
これを利用して、先頭文字が!かつ、存在しないファイルを``` svn delete```すればよい。
具体的には以下の様なコードである。

```bat
for /F "usebackq delims=" %%i in (`svn status`) do call :check "%%i"
exit

:check
set TARGET=%~1
if "%TARGET:~0,1%"=="!" if not exist "%TARGET:~8%" svn delete %TARGET:~8%

```

以上
単発繰り返し(ドット)を使って置換する

# 概要
この記事は[Vim Advent Calendar 2017](https://qiita.com/advent-calendar/2017/vim)の6日目の記事です。

vimの操作は覚えたけれど、上手く編集できない人に向けて、**単発繰り返し**を使っての置換について書きます。

# 「単発繰り返し」について
直前の動作を繰り返すことができるので便利です。※詳しくは、ヘルプ参照 `:h .`

# サンプル

説明で使用するテキストになります。

```html
<form>
  <div class="form-group">
    <label for="exampleInputEmail1">Email address</label>
    <input type="email" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" placeholder="Enter email">
    <small id="emailHelp" class="form-text text-muted">We'll never share your email with anyone else.</small>
  </div>
  <div class="form-group">
    <label for="exampleInputPassword1">Password</label>
    <input type="password" class="form-control" id="exampleInputPassword1" placeholder="Password">
  </div>
  <div class="form-check">
    <label class="form-check-label">
      <input type="checkbox" class="form-check-input">
      Check me out
    </label>
  </div>
  <button type="submit" class="btn btn-primary">Submit</button>
</form>
```

https://getbootstrap.com/docs/4.0/components/forms/ より

# 置換の手順

1. `/ex` 検索
2. `ciw` 入力へ
3. `sample<esc>` 置換
3. `n.` 繰り返し

`n.`は、よく使うのでmapにすると便利です。

私は、次で登録しています。

```vim
nnoremap <c-k> n.
```

# 検索について
単語検索は、`*`を使います。`*`を使うとカーソル下の単語を単語で検索することができます。カーソル下に単語がない場合は、移動して`*`を実行します。`*`で入力ミスを確認できるので便利です。また、単語以外の場合は、`vi"y/<c-r>"`などカッコを利用して検索もできます。

## `exampleInputEmail1`の検索

手順

1. `/ex` 短い単語で、exampleInputEmail1を探します。
2. `n` 到達するまで繰り返します。
3. `*` で単語検索を開始します。

# 入力について

## 単語を入れ替える場合

exampleInputEmail1　→　sample

`ciwsample<esc>n.`

`c`を使って削除後に入力モードにし、入力しています。

`ciw<c-r>0<esc>n.`

ソース上に単語が存在する場合は、あらかじめヤンクしておけばペーストするだけで修正できます。入力モードでは、`<c-r>0`でペーストできます。

## 単語以外を入れ替える場合

form-control → sample

`ci"sample<esc>n.`

""で括られている場合は、`ci"`を使って置換します。

`12ssample<esc>n.`
""などで指定できない場合は、文字数を使います。

`ct"sample<esc>n.`
検索を使う方法もあります。数がわからない場合に使います。

## 先頭に追加する場合

exampleInputEmail1　→　sample-exampleInputEmail1

`isample-<esc>n.`

## 末尾に追加する場合

exampleInputEmail1　→ exampleInputEmail1-sample

`ciw<c-r>"-sample<esc>n.`

削除してから入力します。


## 先頭を修正する場合

exampleInputEmail1　→　form-InputEmail1

`7sform-<esc>n.`

## 途中に文字を入れたい場合

exampleInputEmail1　→　example-InputEmail1

`7sexample-<esc>n.`

先頭部分は、打ち直します。打った方が早いことは、よくあります。

# 最後に
vimは色々なコマンドがあるので、色々探してみるのも面白いです。ドットでは難しいことは、マクロや正規表現を使うことで解決できるのでまたの機会に。

ありがとうございました。