OmniAICreator/Qiita-1.07M huggingface dataset:
Webデザイナーが初めてrailsのviewを書くときに覚えておくと便利なコードまとめ

# はじめに
会社で普段デザイナーも含めrailsのviewを書いているんですが、
デザイナーの子がわからない...っていう状況に陥ってるのをよく見るので、
自分がviewを書き始めたときにこれを覚えておけばなんとかなったってものをまとめました。

## <% ~ %>
出力結果を出力しないコード。
制御構文(if文、each文)などの記述に利用します。

**具体例**

```erb:sample1.html.erb
<% if hoge.present? %>
<p>ふが</p>
<% end %>
```

**出力結果**

```html
<p>ふが</p>
```


## <%= ~ %>
結果を出力するコード。
変数を出力するときなどに使います。

**具体例**

```erb:sample2.html.erb
<%= "ほげ" %>
```
**出力結果**

```html
ほげ
```

## <%# ～ %>
コメントを書くときに使います。

## link_to

```erb
<%= link_to 文字列, リンクのパス, option %>
```
リンクの生成に使用します

**具体例**
`https://www.google.com/`を別窓で開くリンクを作成

```erb:sample3.html.erb
<%= link_to "リンクのテスト", "https://www.google.com/", target: :_blank %>
```

**出力結果**

```html
<a href="https://www.google.com/" target="_blank">リンクのテスト</a>
```

参考
http://railsdoc.com/view#%E3%83%AA%E3%83%B3%E3%82%AF%E3%82%92%E7%94%9F%E6%88%90(link_to)


## image_tag
```erb
<%= image_tag 画像のパス, alt: "", option %>
```
画像の出力

**具体例**

```erb:sample4.html.erb
<%= image_tag "hoge.png", alt: "hoge", class: "image" %>
```

**出力結果**

```html
<img src="hoge.png" alt="hoge" class="image">
```


## if文

```erb
<% if 条件文 %>
　条件文がtrueだったときの処理
<% end %>
```

条件に対して
その条件が成り立つときに処理を実行します。

**具体例**

```erb:sample5.html.erb
<% cat = "cute" %>
<% if cat == "cute" %>
  <p>猫は可愛い</p>
<% end %>
```

**出力結果**

```html
<p>猫は可愛い</p>
```


## each文
```erb
<% オブジェクト.each do | 変数 | %>
　実行する処理
<% end %>
```
オブジェクト内の要素を順番に処理を行うメソッドです。

**具体例**

```erb:sample6.html.erb
tag_list = ["犬","猫","うさぎ"]

<% tag_list.each do | tag | %>
  <p><%= tag %></p>
<% end %>
```

**出力結果**

```html
<p>犬</p>
<p>猫</p>
<p>うさぎ</p>
```


# 参考サイト
Ruby on Railsドキュメント
http://railsdoc.com/
#NoMethodError in Messages#index  -undefined method `format_posted_time'

ActionView::Template::Error (undefined method `format_posted_time' for #<#<Class:0x007ff1a676f6c0>:0x007ff1a69035b8>):
    3:     .upper-message__user-name
    4:       = message.user.name
    5:     .upper-message__date
    6:       = format_posted_time(message.created_at)
    7:   .lower-meesage
    8:     - if message.content.present?
    9:       %p.lower-message__content

helper method　`format_posted_time'が定義されていない。

 6:       = format_posted_time(message.created_at)


1.app/helpers/application_helper.rb
2.定義を記述
  module ApplicationHelper
    def format_posted_time(time)
      time.to_s(:default)
    end
  end
scikit-learn入門

## イントロ
今回のレッスンはscikit-learnという機械学習用のライブラリについての概要の説明と実際の使い方を簡単に紹介したいと思います。

## 準備
コンソールやターミナルから下記のコマンドを実行して、ライブラリを取得するだけです。

```bash
pip install scikit-learn
```

## 公式サイト
http://scikit-learn.org/stable/

## 一般的な評価
下記の記事にもある通り、機械学習のライブラリの中ではやはり随一の知名度を誇り、アルゴリズムのバラエティにも富んでいます。
また、使い方も非常に簡単で、理論を勉強しながら実際にそれを現実的な問題に適用してみるということを簡単に行えるようにしてくれるライブラリです。
https://www.quora.com/What-are-the-best-open-source-machine-learning-libraries-written-in-Python

## 機械学習のモデル構築プロセス
![ml.png](https://qiita-image-store.s3.amazonaws.com/0/240801/19b63421-c969-5bc7-5c69-5491d44e720b.png)

画像引用：https://www.cloudpulsestrat.com/posts/googles-new-cloud-automl-broader-role-automated-machine-learning-ai

1. データ・課題の整理をする  
ちょっと長くなってしまいますが、一番大事な部分ですので書きます。
まず、機械学習を使って解きたい問題や実現したいサービスを定義してみます。データはあるんだけど何をして良いかわからない、という場合もあるかもしれません。例えばですが、未来の株価の予測、画像や音声の判別、欠損データの補間、異常値の特定など、これらはすべて未知の事象に対する予測問題として定義することができます。
一旦課題が決まれば、次第に必要なデータは明らかになってきます。例えば、明日の東京都全体の電力需要を予測したいのであれば、過去の需要データに加え、その日の天気や曜日の情報（平日or休日）なども予測に役に立つでしょうし、その日に起こる予定のイベントとかも考慮しておいた方が良いかもしれません。この辺りはデータの収集コストと相談する必要もあるかと思います。また、データそのものの収集に伴って、データに関する周辺的な知識（よく知られた法則、物理的な制約など）も色々仕入れておけば、後のモデル構築の段階に役立てられる可能性が高いです。
2. データ収集  
集めたデータの形式や粒度がバラバラだったりする場合はこの時点で揃えておくのが良いかもしれません。ただし、欠損値の補間や異常値の除去、データサイズの補正などのいわゆる「**前処理**」をここで行ってしまうと、後段のアルゴリズムに対する情報欠損に繋がる可能性があります。手間とコストを十分に考慮する必要があります。
3. モデルのトレーニングと評価  
この段階では、1と2を経て行ってきた問題定義とその課題解決をするために収集したデータを用いて実際のモデルを作ることをしていきます。トレーニングといってもまずはどういったモデルを使用していくのかを決める必要があります。一つのモデルで問題が解決できる場合もありますし、いくつかのモデルを使い分けて問題を解決していく場合もあります。例として下記のマイクロソフトの研究がわかりやすいかもしれません。
URL: https://www.microsoft.com/en-us/research/project/deep-reinforcement-learning-goal-oriented-dialogue/
![composite-dialogue-1024x459.png](https://qiita-image-store.s3.amazonaws.com/0/240801/85358ad0-8725-fe77-4778-a24cd19cc0c8.png)
ここではチャットボットを作るためのロジックが説明をされてます。音声認識や自然言語理解、ひいては強化学習を用いてuser simulatorを作成して、作成後のモデルの検証やトレーニングを自動化するということなど、決して一つのモデルでは終わっていないことがわかるかと思います。
ここまで大規模なアプリケーションの作成にかかわることは多くはないかもしれませんが、実際の現場ではこういった大きなビジョンの元様々なモデルが使用されています。
4. モデルのアプリケーション等での適用  



## 基本的なモデルクラスの使い方
1. モデルインスタンス生成
2. fitさせる (学習)
3. predictする (予測)

scikit-learnはAPIが統一されていて、とてもわかりやすいです。

## データセット一覧

| API       | 説明　　　　| 　|
|:-----------------|:--------------------------|:------------------:|
| load_boston　　| 米国ボストン市郊外における地域別の住宅価格  | 回帰 |
| load_iris　　　| 3 種類の品種のアヤメのがく片、花弁の幅および長さ　| 分類 |
| load_diabetes　　　| 糖尿病患者の検査数値と1年後の疾患進行状況　| 回帰 |
| load_digits　　　| 0~9の手書き文字の8×8画像　| 分類 |
| load_linnerud　　　| 成人男性の生理学的特徴と運動能力 | 回帰 |
| load_wine　　　| 3種類のワインの科学的特徴　| 分類 |　
| load_breast_cancer　　　| 乳がんの診断結果 | 分類 |
google-api-ruby-clientでrefresh tokenだけ使ってapi叩く方法

rubyでGoogleDriveApiをrefresh tokenだけ渡して叩きたい。

公式のサンプルコード等は認証情報をjsonやyamlから読み込む方法しか書いてなくて、refresh token単体で読み込む情報が少なかったのでメモ。

DriveApiを叩くとする。

```ruby
authorization = Google::Auth::UserRefreshCredentials.new(client_id: ENV['GOOGLE_CLIENT_ID'],
                                                         client_secret: ENV['GOOGLE_CLIENT_SECRET'],
                                                         refresh_token: リフレッシュトークン)

service = Google::Apis::DriveV3::DriveService.new.tap do |me|
  me.authorization = authorization
end

service.list_files(fields: 'next_page_token, files(id, name)')
```

こんな感じで、認証してapiを叩くことができた。
Play Framework 2.6(Scala)をeclipseで使えるようにする

## 概要
ScalaのPlay Frameworkで遊んでみようと思ったのですが、まず環境構築で仕様変更等あり、どれが2.6で使えるのか分からなかったので、素人ながら情報整理をしてみました。

## 前提
よくネットにある手順のactivatorコマンドはsooogleさんの[EclipseでPlay Framework 2.6 (Java) の環境構築](https://qiita.com/sooogle/items/807c4fb2ac6bfeaacd41)に記載の通り、2.5でEOLをむかえてしまっています。したがって2.6以降はsbtコマンドを使って、環境構築等を行っていく必要があります。
ちなみに、私が今回試した環境は以下の通りです。
　・Java 1.8
　・sbt 1.1.6
　・Scala 2.12
　・Eclipse 4.7 Oxygen

## やったこと
※JavaとEclipeはインストール済みの前提とします。
###1.sbtのインストール
まずは[こちら](https://www.scala-sbt.org/download.html)よりsbtをダウンロードしインストールします。

###2.Play Framework(Scala)のプロジェクトを作成
lunaliceさんの[Play Framework 2.6 (Java) の環境構築](https://qiita.com/lunalice/items/26a1690101172f70eda7)の記事の通り、sbtコマンドを発行していきます。eclipseで取り込めるようsbt eclipseのコマンドまで発行します。

###3.EclipseのScala・Plugin追加
[Eclipse 4.3 (Kepler)にScalaプラグイン導入](https://open-groove.net/scala/eclipse-kepler-scala-plugin/)の記事を参考に、Scalaのプラグインを追加します。

###4.Eclipseへの取り込み
[プロジェクトをインポート](https://www.javadrive.jp/eclipse3/project/index4.html)の記事を参考に、「既存プロジェクトをワークスペースへ」で上記2で作成したプロジェクトをインポートします。

###5.Eclipseの設定
javaと同様、sooogleさんの[EclipseでPlay Framework 2.6 (Java) の環境構築](https://qiita.com/sooogle/items/807c4fb2ac6bfeaacd41)の記事の一番最後にあるビルドパスの設定をします。
また、上記2で作成したプロジェクトがEclipseでScalaプロジェクトとして認識されない場合は、xawa雑記帳さんの[[Scala] Eclipse の Java プロジェクトで Scala を使えるようにする。](http://xawa99.blogspot.com/2012/09/Scala-JavaProject2ScalaProject.html)の記事を参考に、.project ファイルと .classpath ファイルに設定追加をします。
機械学習用語まとめ001

機械学習用語まとめ001

昨今のAIブームを受け、機械学習やAIで出てくる用語をまとめてみました。
理解の誤りがあれば直したいと思いますので、ご指摘いただけると幸いです。

なお、数学的記載を楽したいためにななめ文字などを使っていないケースなどもあるので、
悪しからず。


## <a id="index" href="#index">目次</a>
* [線形回帰](#section1)
* [ロジスティック回帰](#section2)
* [確率的勾配法](#section3)


# <a id="section1" href="#section1">線形回帰</a>  
線形回帰は教師あり学習の1つであり、目的変数が説明変数の計数に対して線形なモデルを学習するものである。線形回帰では訓練データに適合する回帰を学習する際、二乗誤差の最小化を行う。
換言すると、線形回帰では訓練データに適合する回帰を学習する際、尤度関数の最大化を行う。
線形回帰の種類として、有名なものにリッジ回帰とラッソ回帰がある。
・リッジ回帰は、直線回帰に正則化項の概念を加えた回帰分析手法である。最小二乗法の指揮に正則化項(L2ノルム)を加え、その最小を求めることで、モデル関数を発見する。
・ラッソ回帰は、直線回帰に正則化項の概念を加えた回帰分析手法である。最小二乗法の指揮に正則化項(L1ノルム)を加え、その最小を求めることで、モデル関数を発見する。
・リッジ回帰は縮小推定が特徴として挙げられ、過学習を抑えられる。つまり、正則化項を十分に大きくすると、一般に回帰係数は、一部0に近づくが、完全な0にはならない。
・ラッソ回帰はスパーク推定が特徴として挙げられ、不要なパラメータをけずれる。つまり、正則化項を十分に大きくすると、一般に回帰係数は、一部完全な0になる。
線形回帰では、モデルの複雑性(表現力)が大きくなると、バイアスは小さくなるが、バリアンスは大きくなる。

<p class="ec__link-index"><a href="#index">[↑ 目次へ]</a></p>

# <a id="section2" href="#section2">ロジスティック回帰</a>
ロジスティック回帰は名前ゆえに間違われやすいが、教師あり学習の分類手法であり、2値分類では、入力が一方のクラスに属する確率を出力するように学習する。ロジスティック回帰では学習の際、尤度関数の最大化を行う。
注意として、二乗誤差という単語は、回帰手法でのみ使われる言葉なので、二乗誤差の最小化という概念はない(ハズ)。
ロジスティック回帰では、シグモイド関数を利用することが多い。シグモイド関数(y=1/(1+exp(-x))は0<y<1の間をとる特徴があるためである。

<p class="ec__link-index"><a href="#index">[↑ 目次へ]</a></p>

# <a id="section3" href="#section3">確率的勾配法</a>
確立的勾配降下法(SGD)とは最適化手法の一つであり、バッチ学習である最急降下法をオンライン学習に改良したものである、つまり、最適化するパラメータをθ、最小化する目的関数をL(θ)=i=1nLi() (iは学習サンプルのインデックス)
とすると一回の更新が最急降下法ではθ←θ-η▽θL(θ)であるが、確率的勾配降下法ではθ←θ-η▽θLi(θ)
SGDは、トレーニングサンプルごとにコスト関数の勾配を求め、重みを更新してやる方法である。パラメータの更新が小刻みに実施されるため、学習経過を細かく監視可能である。また、訓練データの冗長性をうけなく、局所的な極小解に陥りにくい
パラメータ更新の際に、学習速度を早める慣性項を追加するモメンタムという手法がある。

<p class="ec__link-index"><a href="#index">[↑ 目次へ]</a></p>


編集後記
初めてのQiitaへの投稿ですので、優しくしていただけると幸いです。

初稿：2018-07-29
lazuriteでlcd

#概要
lazuriteでlcdやってみた。

#写真
![CIMG2666.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/cf070d7d-d552-3507-5c06-6bb295b03f86.jpeg)

#回路図

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/fe11d077-f056-d7e3-6d4c-1c60b00f1132.png)


#サンプルコード

```

void setup()
{
	Serial.begin(115200);
	lcd_begin(16, 2, 1);
	lcd_setCursor(0, 0);
	lcd_print("start!");
	lcd_setCursor(0, 1);
	lcd_print("hello, world!");
}
void loop()
{
	static int i = 0;
	uint8_t msg[16];
	Print.init(msg, sizeof(msg));
	if (i < 10)
	{
		Print.p("0");
	}
	Print.l(i, DEC);
	lcd_setCursor(0, 1);
	lcd_print(msg);
	delay(500);
	i++;
	if (i >= 100) i = 0;
}



```


以上。
UIButtonのImageとLabelを縦積み配置にする

# はじめに
UIButtonはImageとLabelに関してデフォルトでは以下のような配置を行います

```
Image Label
```
Imageが左に、Labelが右に、という感じです。しかし、時々以下のような配置をしたくなるときがあります。


```
Image
Label
```

Imageの下にLabelを配置しています。AndroidのButtonであれば、drawableTopを使ってやることで簡単にこのような見た目を実現できるのですが、iOSではそうもいきません。少し工夫が必要だったので方法を共有します。

# やり方

`UIEdgeInsets`を使用してLabelとImageをそれぞれのサイズ分ずらしてやります


```swift
if let titleLabel = button.titleLabel, let titleImage = button.imageView {
    button.titleEdgeInsets = UIEdgeInsets(top: 0,
                                          left: -titleImage.bounds.size.width,
                                          bottom: -titleImage.bounds.size.height,
                                          right: 0)
    button.imageEdgeInsets = UIEdgeInsets(top: -titleLabel.bounds.size.height,
                                          left: 0,
                                          bottom: 0,
                                          right: -titleLabel.bounds.size.width)
}
```

UIEdgeInsetsにわたすパラメータを調整することで、ImageとLabel間のマージンを設定してやることも出来ます。
Swiftでclassを参照してくれないところで詰まった

Swiftで、classを宣言したのにclassを参照してくれないところでちょっと詰まりました。
一箇所で宣言したクラスが他のファイルで参照してくれないんですよね。
結論から言うと、classの前にpublicを付けることで解決しました。

```
import UIKit

class SomeClass: NSObject {

}
```

こうなってたのを

```
import UIKit

public class  SomeClass: NSObject {

}
```

このように、publicを付けることで解決しました。
問題は、なぜクラスを宣言した時にpublicがデフォルトでついていないかですが、これよくわからないです。
詳しい人教えて欲しい。
WindowsにVirtualBoxを再インストールしようとしてはまったこと

#概要
今時開発環境を作る時にWindowsでVMをたてて。。。なんて人はそういないと思うが
先日VirtualBoxを使わないといけない状況になりインストールしようとしてはまったのでそのメモ

#環境
- Windows10 Home
- Oracle VM VirtualBox 5.2.16

#状況
以前VirtualBoxを入れていたが不要になったのでアンインストールしていた。

#問題
インストール時に
「この接続の名前を変更することはできません。指定した名前の接続が既に存在します。別の名前を指定してください。」
というエラーが出る

#原因
Windowsにこの手のツールをインストールすると仮想NICなるものが作られる。
これはVMを立てたときに使われるものだが、この情報はレジストリに書き込まれており
アンインストール時も残ってしまう（現在は検証していないので不明、以前入れたのは5.0系）
レジストリの情報が残っており、再インストール時にレジストリに書き込もうとして既に情報があるためエラーがでると思われる。

#解決方法
いったんVirtualBoxをアンインストールしてからレジストリを削除する（誤って別の情報を削除すると影響が出るので注意）
1. regeditでレジストリのエディタを立ち上げる
2. レジストリの中で「HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Control¥Network¥interface」を探し当てる
3. 様々なキーが存在しているがその下のConfigの中にインターフェイスの名前が存在している
4. この中からVirtualBoxインストール時に作られるインターフェイス名のものを削除するもしくはリネーム
5. 今回の自分のケースだとイーサネット2およびVirtualBox Host-Only Ethernet Adapter
6. もう一回インストールしてみる

以上
JMeterでHTTPプロキシサーバーを使いHTTPSサイトでもシナリオの自動作成を行う

JMeterにはプロキシを使ったシナリオの自動作成機能があります。

プロキシの使い方を紹介しているサイトによってはHTTPSはJMeter単体ではできないと書いてあるのですが、単体でできたので手順をメモします。

## 手順

### 1. 記録するHTTPSリクエストを置く空のスレッドグループを作成

<img width="664" alt="スクリーンショット 2018-07-29 10.43.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/27674/78979195-c0fb-340f-375b-35b212f61f8b.png">

### 2. 記録用のプロキシサーバを作成

<img width="631" alt="スクリーンショット 2018-07-29 10.42.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/27674/2b834393-15c0-82d5-c40d-39358f0c235d.png">

### 3. プロキシサーバの設定

"対象となるコントローラ"に、先の手順で作成したスレッドグループを指定します。

その後"開始"ボタンを押下します。

<img width="682" alt="スクリーンショット 2018-07-29 12.52.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/27674/76f12c0e-049c-0abb-07a9-8b18191d5fb4.png">

プロキシ用のダミー証明書についての説明が書かれています。OKボタンを押下します。

<img width="789" alt="スクリーンショット 2018-07-29 10.47.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/27674/d9f6632f-b0c6-a6c6-0109-d846405b1513.png">

### 4. ダミー証明書をインストール

JMeterのbinディレクトリ内に生成されたApacheJMeterTemporaryRootCA.crtファイルをダブルクリックで開きます。

<img width="445" alt="スクリーンショット 2018-07-29 10.48.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/27674/11574979-ffe0-ccf9-469a-a6e3577acff4.png">

キーチェーンが開きますので、選択されている```_ DO NOT INSTALL```で始まる証明書ファイルを右クリックして"情報を見る"を押下します。

<img width="727" alt="スクリーンショット 2018-07-29 10.49.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/27674/fcbac631-2ff7-3fe3-cefb-89499f50fb6c.png">

### 5. 証明書を信頼

開いたウインドウの"信頼"タブの"この証明書を使用する時"のプルダウンで"常に信頼"を選択します。

<img width="600" alt="スクリーンショット 2018-07-29 10.49.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/27674/cc2ecbb5-bdad-a8c1-3b3d-5de6067391b3.png">

ウインドウを閉じるときにパスワードが求められるので入力します。

<img width="449" alt="スクリーンショット 2018-07-29 10.49.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/27674/05579ef4-bfc6-ba3b-ed5d-1bf14060ed7f.png">

### 6. プロキシ設定

システム環境設定のネットワークを押下します。

<img width="672" alt="スクリーンショット 2018-07-29 10.51.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/27674/9132f4fc-e08f-cd81-1e1e-3b11e056b7ee.png">

詳細ボタンを押下します。

<img width="668" alt="スクリーンショット 2018-07-29 10.51.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/27674/a118cb8d-f9ea-e1de-b871-a9e4e290bcf7.png">

"プロキシ"タブを開き、"保護されたWebプロキシ (HTTPS)"を選択し、"保護されたWebプロキシサーバ"に```localhost```を入力し、OKを押下する。


<img width="671" alt="スクリーンショット 2018-07-29 10.52.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/27674/45000c79-7dcd-b629-5fbb-a1973a684303.png">

### 7. プロキシを通じてページにアクセスする

プロキシの設定ができたのでWebページにアクセスします。

するとスレッドグループの配下にHTTPリクエストが追加されます。

<img width="1337" alt="スクリーンショット 2018-07-29 10.54.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/27674/142d4924-388a-1645-7668-5eba605b488d.png">

### 8. 最後に

プロキシの利用が終わったら環境設定の"保護されたWebプロキシ (HTTPS)"のチェックを外します。
Github — PullRequest / Issue / コメントでコードを引用・埋め込みする

# 引用とハイライト

( PullRequest の差分などではなく ) コードページで、左側の数字をクリックしてハイライトする。
Shift + クリックで範囲選択が出来る。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/c5d3cb9f-1412-abbf-1c59-e9c2dd429f2f.png)

ページのURL例:
https://github.com/YumaInaura/study/blob/master/ansible/inventories/different_ports_on_same_host.txt#L3-L7

# パーマリンクをコピー

この状態のままで操作ボタンから「Copy permalink」を選ぶ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/e92cb30e-9af9-b4f5-a96f-7a38962bb207.png)

こんなURLがクリップボードに入る。

https://github.com/YumaInaura/study/blob/bb718de7e48eb2244261fbfff691eaf7f4d4e668/ansible/inventories/different_ports_on_same_host.txt#L3-L7

この例ではブランチ指定のページからパーマリンクを取得したが、コピーされるのはコミットハッシュが含まれるURLであることが分かる。


# PullRequest や Issue や コメント欄にURLを貼り付ける

コードが展開される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/51b73384-2787-1bb5-ad37-7c5ffab46bfc.png)

# 対応していないもの

- Wikiには対応していない。
- Gistでは対応していない。

# その他

- URLから行数指定 ( `#L3-L7` ) を消すとコードが展開されない
- URLの行数指定が元コードの行数を超えると展開されない ( 例 `#L3-L9999` )
- 「ブランチ指定のURL」を貼り付けても展開されない
  - 何故なら仮にブランチ指定が出来ても、コードの状態は更新され得るし、正しい引用にならないからだと理解した








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Hexoを使って個人ブログ作成, Github Pagesにデプロイするまで

## モチベーション
・自分のWebページが欲しいけど、レンタルサーバ代は払いたくない
・動的なページである必要性はない
→ Github Pagesでいい感じのものを作ってしまえばいいじゃん！
という感じ

## どうやって作るか
https://qiita.com/okmttdhr/items/82ecb0332835472e905f
にあるように、Github Pagesでブログ構築ができる静的サイトジェネレーターはたくさんあるっぽい。
Railsベースのものはなんとなく使いたくないので、ノリでHexoを選んだ。

## 制作環境
MacOS Sierra 10.12.6
Homebrewはインストール済

## 作っていく
### Github Pages用のRepository作成
Githubにアクセス → 右上の「+」ボタンから「New Repository」を選択
Repository Nameは username.github.io にすること！
URLがめんどくさくなります。
※この記事内でusernameと書かれているところは適宜Githubのユーザ名に置き換えて実行してください。

### Hexoのインストール
nodebrewとかいうバージョン管理ツール?(RubyのrbenvとかPythonのpyenvみたいな立ち位置のもの)があるらしいのでそれを使っていく
Homebrewを使ってnodebrewをインストール

```
$ brew install nodebrew
```
今時の若者のShellはfishなので、`~/.config/fish/conf.d/config.fish`に以下の通り追記する。

``` ~/.config/fish/conf.d/config.fish
set -x PATH $HOME/.nodebrew/current/bin $PATH
```
Shellを起動し直してから、最新のNode.jsをインストール

```
$ nodebrew setup
$ nodebrew install-binary latest
$ nodebrew list
v11.9.0

current: none
$ nodebrew use v11.9.0
$ nodebrew list
v11.9.0

current: v11.9.0
$ npm -v
6.5.0
```

npmを更新しておく

```
$ npm update -g npm
$ npm -v
6.7.0
```
Node.jsが入ったのでHexoとデプロイツールを入れていく

```
$ npm install -g hexo
$ sudo npm install hexo-deployer-git --save 
```
### とりあえず立ち上げてみる
適当なディレクトリを作ってそこに環境を構築する

```
$ mkdir blog
$ cd blog
$ hexo init
$ hexo server
```
localhost:4000にアクセス出来たらとりあえず成功です。


### configの修正
以降では`hexo init`を実行したディレクトリ下で作業する
デプロイ先などの設定が_config.ymlにあるので修正する

``` _config.yml
# Site
title: hoge
subtitle: hogefuga
description: 
keywords:
author: piyo
language: ja
timezone: Asia/Tokyo

# URL
## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/'
url: https://username.github.io/
root: /
permalink: :year/:month/:day/:title/
permalink_defaults:

# Deployment
## Docs: https://hexo.io/docs/deployment.html
deploy:
  type: git
  repo: git@github.com:username/username.github.io.git
  branch: master
```
この辺を修正してあげれば良い

### デプロイしてみる

```
$ git init
$ git remote add origin git@github.com:username/username.github.io.git
$ hexo deploy -g
```
しばらく待って、https://username.github.io にアクセス出来たら成功です！
お疲れ様でした。

## 新しい記事を作る場合
`hexo new <記事名>`と打てば`source/_posts/<記事名>.md`というものが生成されるので、生成された<記事名>.mdにMarkdown形式で入力すれば良い。
記事が完成したら`hexo deploy -g`と打てば良い感じにデプロイしてくれます。
筑波大学のUbuntuリポジトリが調子悪い件

Ubuntu 16.04ベースのLinux Mint 18.3を使っているのだが、最近、アップデートマネージャでエラーが発生するようになった。
デフォルトのUbuntuリポジトリとして指定されている筑波大学の http://ftp.tsukuba.wide.ad.jp/Linux/ubuntu にアクセスすると、「メンテナンスで停止中か、サーバの処理能力の問題のため、 現在リクエストに応じることができません。 後ほど再度お試し下さい。」とメッセージが表示された。
そこで、北陸先端科学技術大学院大学の http://ftp.jaist.ac.jp/pub/Linux/ubuntu/ にUbuntuリポジトリを変更した。

```変更前の　/etc/apt/sources.list.d/official-package-repositories.list
deb http://ftp.jaist.ac.jp/pub/Linux/linuxmint/packages sylvia main upstream import backport 

deb http://ftp.tsukuba.wide.ad.jp/Linux/ubuntu xenial main restricted universe multiverse
deb http://ftp.tsukuba.wide.ad.jp/Linux/ubuntu xenial-updates main restricted universe multiverse
deb http://ftp.tsukuba.wide.ad.jp/Linux/ubuntu xenial-backports main restricted universe multiverse

deb http://security.ubuntu.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://archive.canonical.com/ubuntu/ xenial partner
```

```変更後の　/etc/apt/sources.list.d/official-package-repositories.list
deb http://ftp.jaist.ac.jp/pub/Linux/linuxmint/packages sylvia main upstream import backport 

deb http://ftp.jaist.ac.jp/pub/Linux/ubuntu xenial main restricted universe multiverse
deb http://ftp.jaist.ac.jp/pub/Linux/ubuntu xenial-updates main restricted universe multiverse
deb http://ftp.jaist.ac.jp/pub/Linux/ubuntu xenial-backports main restricted universe multiverse

deb http://security.ubuntu.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://archive.canonical.com/ubuntu/ xenial partner
```

これでアップデートマネージャもソフトウェアの管理も問題なく動作するようになった。
Vue.jsで繰り返し表示部分をコンポーネントに切り出す

# はじめに

[以前の記事](https://qiita.com/FrozenVoice/items/cbfa6d3f611a87b57cf4)の繰り返し表示部分をコンポーネントとして切り出してみる。

## コンポーネント

下記のjsを用意

```javascript:item.js
var ItemComponent = Vue.extend({
    template:
        '<div class="item">' +
            '<div>ID: {{item.id}}</div>' +
            '<div>名前: {{item.name}}</div>' +
            '<div>値: {{item.value}}</div>' +
        '</div>',
    props: ['item']
})
```

## コンポーネントの登録

index.jsで`components`を指定してコンポーネントを登録

```javascript:index.js
var app = new Vue({
    el: '#app',
    data: {
        results: []
    },
    components: {
        'item-component': ItemComponent
    },
    mounted () {
        axios
            .get("api.php")
            .then(response => {this.results = response.data})
    }
});
```

## HTMLでコンポーネントを使う

```html:index.html
    <body>
        <div id="app">
            <div class="itemContainer">
                <item-component v-for="result in results" :key="result.id" v-bind:item="result"></item-component>
            </div>
        </div>
        <script src="item.js"></script>
        <script src="index.js"></script>
    </body>
```
numpy.isnan()するときは、文字列を混じらせない

タイトル通りだが、下記のように文字列が混じったarrayに対し

```py
import numpy as np
arr = np.array([0.2, 0.4, np.NaN, 0.3, np.NaN, '0.5', 2])
print(arr.dtype)
print(arr)

#出力結果
<U32
['0.2' '0.4' 'nan' '0.3' 'nan' '0.5' '2']
```

numpy.isnanメソッドを呼び出すとエラーとなる。

```py
np.isnan(arr)

#出力結果
TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''
```

事前に、全データを数値型にすることで

```py
arr = arr.astype(np.float32)
print(arr.dtype)
print(arr)

#出力結果
float32
[0.2 0.4 nan 0.3 nan 0.5 2. ]
```

numpy.isnanメソッドが正しく動作する。

```py
np.isnan(arr)

#出力結果
array([False, False,  True, False,  True, False, False])
```
要件、仕様を削る技術

#64%の機能はほぼ使われない
<img src="https://qiita-image-store.s3.amazonaws.com/0/59686/f78ea5d7-a011-db8a-bf91-f6b6259efa7a.png" width=40%>

---
#エンジニアが足りていない
どこの勉強会に行っても、
「We are hiring!!」

ABテストしたけれど全面展開できなくて、モチベーションなくす
→離職率の低減
楽しい仕事したいでしょ！？

---
#要件、仕様を削ることが必要だ！

---
# 5W1Hで確認
*    Why?
        なぜ必要か
*   How?
        どうやって
        How often? どのくらい
        How much?
            いくらまで出せるか
            お金、リソース
        How many?
            いくつ
*    Who?
        誰が使うのか
        誰がやるのか
*    What?
        何が必要か
*    When?
        いつまでに必要か
*    Where?
        どこでやるか

---


# Why? なぜ必要か

## 質問例

* その機能の背景にある課題は何ですか？
* その機能があることによって、誰がどの程度幸せになりますか？
* その機能がないことによって、致命的な問題、課題はありますか？

---

## やり取り例
「こういう条件の帳票を出力して欲しい」
→「何のための帳票ですか？」
→業務の流れをよく確認したら、とあるデータの準備・整合性をあわせるための帳票だった。データ発生時に対応すれば帳票は不要だし、業務の流れもシンプルに

「このメールを配信して欲しくないというクレームが来ているので、配信設定で外せるようにして欲しい」
→「致命的ですか？」
セキュリティ、致命的なクレームに発展する可能性がある場合、利用頻度は少なくても、必要性は高いので、対応する

---

# How? どうやって
Howに加えて、

* How often
        どのくらいの頻度
* How much?
        いくらかかるか？
        どの程度？
* How many?
        いくつ

## 質問例
*        いったん人が運用してみて効果を測ることは可能ですか？
*        それはどのくらいの頻度がありますか？
*        それはユーザの8割は使うような機能ですか？
*        機能を追加するにしても、どこまで対応する必要がありますか？

---

## やり取り例
「ユーザとのやり取りの記録を管理したいんだけど・・」
→「いったんスプレッドシートで管理できませんか？」

「XXを一括登録する機能が欲しいのだけど」
→「項目が多く、複雑なので、1人月くらい必要なのですが、それでもやりますか？」

---

# Who? 誰がやるのか  誰が使うのか
## 質問例
*        その機能を作るとして、誰が初期データを用意するのか
*        その後、誰がデータを更新するのか

---
##    やり取り例
「ユーザにXX希望設定ができるようにするといいんじゃない？」
→ユーザはわざわざ設定しますかね？最初に設定したとして、データが古くなりません？
→ユーザの操作ログデータを使う方がよっぽどスジがよい

「XXデータにYYな項目を追加したいんだけど・・」
→元データってあります？無かったら、用意できますか？更新どうします？
→要望出した人が別の興味に移って、対応はお流れに

---
# What? 何が必要か
## 質問例
*        具体的な機能の仕様はありますか？
*        具体的な利用シナリオはありますか？

---
## やり取り例
「うちのサービスもAIでなにかできないかな」→
「どういう点で利用しようと思っています？もうちょっと詰めてから持ってきてもらえますか？」

---
# When? いつまでに必要か
##    質問例
*        その機能を使う繁忙期はいつですか？
*        優先順位はどの程度ですか？

---
##    やり取り例
「この機能ないと困るんだけど」
→「今、事業として、XXを最優先事項としているのですが、XXよりも重要ということを事業責任者に承認取ってもらえますか？」
→後回しにしていたら、要望を出していた人の熱が下がったり、異なる運用方法を思いついて、対応できていたり、そもそも事業の優先順位が変わっていたりする
→後回しにできるものは後回しに

---
# Where? どこでやるか どのシステムで対応するか
##    質問例
*        その機能はXXというサービスでできるんじゃないですか？

---
##    やり取り例
「こんな文面でユーザに同時に一括メールを送信したいんだけど・・」
→その都度配信するメールであれば、独自システムに組み込むより、会社全体で使っているメール配信システム使っては？

---
# 最後に注意点
* 要件、仕様を切るだけだと、信頼関係が崩れるので、代替案、たまにはこちらから要件案を出すのが大事
* 信頼関係によって、さらに要件、仕様を切りやすくなる
lazuriteでi2c

#概要
lazuriteでi2cやってみた。

#サンプルコード
i2cscanner

```
void setup()
{
	Wire.begin();
	Serial.begin(115200);
	Serial.println("I2C Scanner");
}
void loop()
{
	byte error,
		address;
	int nDevices;
	Serial.println("Scanning...");
	nDevices = 0;
	for (address = 1; address < 127; address++)
	{
		Wire.beginTransmission(address);
		error = Wire.endTransmission(false);
		if (error == 0)
		{
			Serial.print("I2C device found at address 0x");
			if (address < 16) Serial.print("0");
			Serial.print_long(address, HEX);
			Serial.println("  !");
			nDevices++;
		}
		else if (error == 4)
		{
			Serial.print("Unknow error at address 0x");
			if (address < 16) Serial.print("0");
			Serial.println_long(address, HEX);
		}
	}
	if (nDevices == 0) Serial.println("No I2C devices found\n");
	else Serial.println("done\n");
	delay(5000);
}




```

以上。
lazuriteでライブラリ

#概要
lazurite ideで、ライブラリやってみた。

#嵌ったポイント
cソースを１つ、以上使いたい時、ライブラリにしなければいけない。

#手順

ヘッダーを書く。
Cソースを書く。
C:\LazuriteIDE\librariesに、フォルダ作って、上記を置く。
ideのライブラリに、出てくるので、チェックを入れる。

以上。
Firebase Hosting出会って3分でDeploy

Firebaseを初めてすぐにデプロイできたので記録しておきます。

Vue.jsであらかじめ作成しておいたアプリのデプロイを
AWSのS3でホスティングするか迷っていましたが、せっかくなのでFirebaseを利用してみることにしました。


hostのPCに
`npm install -g firebase-tools`

※最初にDockerの中でやってしまって認証失敗とかしてたので、すっとホストマシンにインストールしました。時間3分しかないし！

CLIツールの認証を行います。これはfirebaseのプロジェクトを読み込んでいろいろしてくれるので最初に必要です。
`firebase login`
お使いのブラウザでログイン画面が立ち上がります。
利用したいアカウントをクリック！


CLIに戻ってプロジェクトを初期化します

`firebase init`
hostingを選択

もしくは `firebase init hosting` とすると自動でhostingのinitフローに移ります

```
firebase init

     ######## #### ########  ######## ########     ###     ######  ########
     ##        ##  ##     ## ##       ##     ##  ##   ##  ##       ##
     ######    ##  ########  ######   ########  #########  ######  ######
     ##        ##  ##    ##  ##       ##     ## ##     ##       ## ##
     ##       #### ##     ## ######## ########  ##     ##  ######  ########

You're about to initialize a Firebase project in this directory:

  /path/to/app

? Which Firebase CLI features do you want to setup for this folder? Press Space to select features, then Enter to confirm your choices. Hosting: Configure and deploy Firebase Hosting sites

=== Project Setup

First, let's associate this project directory with a Firebase project.
You can create multiple project aliases by running firebase use --add, 
but for now we'll just set up a default project.

? Select a default Firebase project for this directory: project-name (project-name-xxxxxxx)

=== Hosting Setup

Your public directory is the folder (relative to your project directory) that
will contain Hosting assets to be uploaded with firebase deploy. If you
have a build process for your assets, use your build's output directory.

? What do you want to use as your public directory? dist                 // Vuejsでビルドすると作成されるディレクトリを指定=dist
? Configure as a single-page app (rewrite all urls to /index.html)? Yes  // VueがSPAなのでyes
? File dist/index.html already exists. Overwrite? No                     // 既存のプロジェクトなのでNo
i  Skipping write of dist/index.html

i  Writing configuration info to firebase.json...
i  Writing project information to .firebaserc...

✔  Firebase initialization complete!

```

デプロイします
`firebase deploy`

https://[プロジェクト名].firebaseapp.com/

でアクセス！

表示されましたね！
NetBeans上で既存ROSパッケージをcatkin_makeする方法

新しくROSのパッケージを作ってNetBeans上でcatkin_makeするやり方は見つかりましたが、既存のROS projectをインポートする方法はわからなかったので、Using NetBeans IDE to Develop ROS packages (MakerLab, Department of Computer Science, HKU)[ここ](http://makerlab.cs.hku.hk/index.php/en/using-netbeans-ide-to-develop-ros-packages)の2.2だけメモとして要約して書きました。

1. File > New ProjectでCategories: C/C++, Projects: C/C++ Project with Existing Sourcesを選択してNext.
2. インポートしてきたいソースコードのあるワークスペースのフォルダを選んで、Select Configuration mode: Customにする。
3. Pre-Build Actionは何も選ばずにNext.
4. Clean Command: devel/env.sh catkin_make clean, Build Command: devel/env.sh catkin_makeを選んでNext.
5. Source Filesも何も変更せずにNext.
6. Code Assistance Configurationも変更しないでNext.
7. Project Locationを指定する。既存のワークスペースをそのまま使いたければそこを選択。
8. Finishすると同時にcatkin_makeをしてくれます。その後も金槌アイコンでcatkin_makeできるようになります。

以上です。
勉強会アンチパターンへの対処例（随時更新）

# はじめに
本記事は、「[有志の社内勉強会を1年で50回くらいやった結果 伝えたいこと](https://qiita.com/nh321/items/f7e20c7ba737ff5c0f60)」で書いた「勉強会アンチパターン」の対処例についてです。

自分自身あれからいろんな勉強会を見てみて、いろいろなやり方があるよな・・・と、認識を改めたものです。
また、自分の記事で定義した『アンチパターン』は、「絶対にダメ！」というほどのものではないため、誤解を解く意図もあったりする。

# 宿題を出す
「モチベーションの低い奴はやってこないから、宿題は準備するコストに対して見合うほどのリターンはないよ」ということで、アンチパターン定義していた。

### ゲーミフィケーション化
「[勉強会をゲーミフィケーションする](https://qiita.com/asucii/items/cf55007e65cf49e470c2)」を読んで、「確か」にと思った。

ついて来れる人を対象に、フィードバックループを回すことで、効果を最大化するってのは、ありだな。と。

# 強制する
「強制はモチベーション下げるから、継続性の観点からNGやで」ってことで、アンチパターン定義していた。

### 仕事にする
「勉強会」というよりは「調査報告会」みたいな形。
実際に部門でやってて、ある程度うまく行った気がする。（自分は運営側じゃなくて参加者側で参加した）

1. テーマ選定（運営の仕事）
2. チームにテーマを割り振る（部門のメンバ全員が対象）（運営の仕事）
3. 必ず外部の研修に参加してもらう
4. チームごとに発表内容をまとめる（チームごとに責任持ってやる）
5. チームごとに発表する（偉い人の講評あり）

4〜5人で1チーム。5チームくらいできた。
発表は1組1時間程度なので、発表の日は1日かけてのイベントになる。
仕事なので、ちゃんと業務時間内にやってもらう。（有志とか、自己啓発とか、そういうのじゃなくて、仕事の一つ。）

イベント頻度としては半期に1回程度。
外部研修への申し込みは、テーマ発表から1ヶ月以内にやってもらう。（運営でチェックする）

テーマは、
「テスト自動化」や「UML」など、今の現場に馴染みが無いだけの一般技術や、
「ディープラーニング」とか、「ブロックチェーン」とかの先端系技術など、様々。
「競合他社のソリューション情報」などのビジネス系のテーマもあった。

発表は、
研修の内容をそのまま発表されてもしょうがないので、
「何かしら実践してみる」とか、「部門への適用方法の検討」とか、「この先、部門としてどう取り組んでいくべきかの考察」などを加えなさい、
っていう条件がついた。

結果としては、
「部門のメンバーの、新しい技術への感度が上昇した」感があった。

実践・検討・考察の深さはかなりメンバーに依存しており、「素晴らしい発表だな！」ってのもあれば「これは・・・」ってのもあった。
まぁ別に全部が当たりの発表になるわけがないので、運営側も特に気にしてない感じだった。
また、発表の仕方もかなり癖が強く、発表に「慣れている人」「慣れていない人」の差がかなり浮き彫りになった。
（今まで発表の機会がほとんど無いエンジニアにやらせるわけだし、そんなものだろう。）

色々な発見がありつつも、業務ピークと重なると動けないチームもあり、現場負荷はそこそこ高い。
現場負荷の解消に関しては、業務量自体のマネジメント話になるので、ここでは割愛するが、「勉強会があることを前提に、仕事を調整した」という考え方の転換が大きかった様に感じる。


前記事で書いてた「動機付け云々の話」に関しては、これは「仕事なんだからやりましょう」で押し通せるのが強み。
上司からの指示で、「勉強会しなさい！」と言われたら、この形にしようかなと思う。

ちなみにこれの運営は「部門で2・3番目に偉い人」がやっていた。


以上です。（気が向いたら追加していきます）
ログイン機能の実装


@qwertyuiopngsdfg様の記事が非常にわかりやすかったです。ありがとうございます。
https://qiita.com/qwertyuiopngsdfg/items/597da67387723a5aedad

本日学んだコード
-
htmlspecialcharsー特殊文字をHTMLエンティティに変換する

HTMLエンティティとは・・・ HTMLの記号は、そのまま書いてもブラウザに正しく表示されない。
正しく表示するにはエンティティと呼ばれるコードを書く必要がある

&=&amp

"=ENT_NOQUOTESが指定されていない場合、&quot

'=&#039 ENT_QUOTESが指定されている場合に限る

＜=&lt

＞&gt

PDO=PHPとデータベースサーバーの間の接続を表す。
shellscriptを使って、sshの引数にtab補完を効かせる

https://unix.stackexchange.com/questions/11376/what-does-double-dash-mean-also-known-as-bare-double-dash

ぶっちゃけ上の記事で全部事足ります。少し難しいけど。

#やりたいこと

自分の環境を晒すわけにもいかないので、例えの話。

ip: 192.168.0.1のホスト[hogehost]と、
ip: 192.168.4.2のホスト[hugahost]があるとします。

いちいち `ssh username@192.168.0.1`と打つのは面倒です。
`ssh hogehost`と打ったら、勝手に`ssh username@192.168.0.1`とコマンドを発行してほしい！！！

これに関しては、`.ssh/config`というファイルを設定することで達成することができました。
詳しくは検索してみてくださいね。
https://webkaru.net/linux/ssh-config-file/
この記事、簡潔でわかりやすかったですね。

さて、次は、、、

`ssh <tab>`と打った時に、host名で補完を効かせたい！

```
ssh <tab>
 hogehosy hugahost
```

ずばりこうしたい！！

#どうやるか
-> [説明要らない人はこっち](https://qiita.com/hidaro/items/384cc8dd156364cb035f#%E3%81%9D%E3%81%AE%E7%B5%90%E6%9E%9C%E3%81%8C%E3%81%93%E3%81%A1%E3%82%89%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99)

せっかく.ssh/configを作ったので、これを使いましょう。
うれしいことに、きれいな規則に沿って並んでくれてます。

先ほどの記事の一部を引用すると

>\#Aサーバー
Host sakura
  HostName aaa.bbb.ccc.ddd
  Port 22
  User root

これですね。

この例で言うと、 'sakura'の部分が欲しいです。.ssh/configのおかげで、
`ssh sakura`と打つと`ssh root@aaa.bbb.ccc.ddd:22`と発行してくれます。

では、まずgrepで'^Host 'とついてる行を抜き出しちゃいましょう。
`grep '^Host '  ~/.ssh/config`
そして、その結果をawkコマンドで出力します。
`grep '^Host ' ~/.ssh/config | awk '{print $2}'`

これでsakuraがとれたはず。

んじゃあ、それを関数化して...

```
ssh_get () {
  COMPREPLY=(`grep '^Host ' ~/.ssh/config | awk '{print $2}'`)

complete -F ssh_get ssh
```

こんな感じに.bashrcにぶち込み（追記し）ます（忘れずに `source .bashrc`発行して読み込みなおしてね）

そうすると、`ssh <tab>`とするたびに .ssh/configに記載されたホストが表示されるはずです！感動！

しかし、このままでは`ssh s<tab>`としても、`ssh a<tab>`としても全てのホストが表示されてしまいます。

そうじゃない！僕らは`ssh s<tab>`と押したら

```
sakura saku_host sakana
```
みたいに補完してくれるタブ補完を求めている！！

まあ、
`grep '^Host ' ~/.ssh/config | awk '{print $2}'`
にgrepをかければいいんですが、

`ssh s<tab>`としたときの's'が、どのような形で取得できるのかが謎でした。

そこで一番最初の記事。
https://unix.stackexchange.com/questions/11376/what-does-double-dash-mean-also-known-as-bare-double-dash

そして、
<b>`${COMP_WORDS[COMP_CWORD]}`</b>

ずばりこれです。
これでgrepすればいけるわけですね。

`grep '^Host ' ~/.ssh/config | awk '{print $2}' | grep '^'$curw`

これをCOMPREPLY=()の中にぶち込みましょう。

#####その結果がこちらになります。

```
ssh_get_m () {
  local curw
  curw=${COMP_WORDS[COMP_CWORD]}
#COMPREPLY=($(compgen -W `grep '^Host ' ~/.ssh/config | awk '{print $2}'` -- $curw))
  COMPREPLY=(`grep '^Host ' ~/.ssh/config | awk '{print $2}' | grep '^'$curw`)
}
complete -F ssh_get_m ssh
```

これを.bashrcに追記して読み込んでやれば、.ssh/configに記載さえしていれば補完を効かせることができます。
コメントアウトしている部分は、冒頭の記事で紹介されていた方法です。compgenという関数があるので、それを利用しています。

自分の中での整理もかねて、少し丁寧目に説明しましたが、上の関数をそのまま使っていただければ無事に動くと思います。（.ssh/configがちゃんと記載されていれば）
ただ、できればぜひ自分で理解したうえで使ってくださいね。

次はこれに続けてパスワード入力も自動でしてもらうようにするのが目標。だれかいい記事教えてくんろ...

-> しました。
https://qiita.com/hidaro/items/d65079adcfc44511e3bf
WSLのディストリビューションを切り替える方法

WSL(Windows Subsystem for Linux)は複数のディストリビューションを持つことが出来ます。
各ディストリビューションはMicrosoft Storeから入手可能です。

どのディストリビューションをデフォルトにするかは`wslconfig`を使って設定をします。
それ以外にもディストリビューションの登録を解除することも出来ます。

PowerShellかコマンドプロンプトを開いて、`wslconfig`と打つとコマンドの説明が出てきます。

```
> wslconfig
Linux 用 Windows サブシステムの管理操作を実行します

使用法:
    /l、/list [/all] - 登録されたディストリビューションを一覧表示します。
    /all - すべてのディストリビューションを一覧表示します (オプション)。
           現在インストールまたはアンインストール中のものも含まれます。
    /s、/setdefault <DistributionName> - 指定のディストリビューションを既定として設定します。
    /u、/unregister <DistributionName> - ディストリビューションの登録を解除します。
```

ここにすべて書いてありますが、一応説明を書いておきます。

## ディストリビューション一覧

```
> wslconfig /l
Windows Subsystem for Linux ディストリビューション:
Ubuntu (既定)
Legacy
```

アンインストールされた物も含めたい場合は`/all`をつけます。

## デフォルトのディストリビューションを切り替える

```
> wslconfig /s Ubuntu
```

## ディストリビューションの登録を解除する

```
> wslconfig /u Legacy
```

これで登録解除は出来るみたいですが、念のため自分はLegacyは残しておきます。

---

`wslconfig`の存在に気が付かないで、しばらくはまっていたので記事にしました。
それにしても、windowsでlinuxが使えるのは本当に便利ですね。
アプリのAndroid Oreo対応状況をアプリアイコンから推測する

# はじめに
[今後の Google Play でのアプリのセキュリティおよびパフォーマンスの改善について](https://developers-jp.googleblog.com/2017/12/improving-app-security-and-performance.html)
上記のGoogle Developersのブログ記事によると、
> 2018 年 11 月: 既存のアプリのアップデートで、ターゲット API レベル 26 以降が必須になります。

とあります。2018/07/29現在、アプリアップデートのための Oreo（APIレベル26以降）対応の期限が近づいています。

この記事では、ホームアプリに表示されるアプリアイコンから、自分がよく使うアプリのAndroid Oreoへの対応状況を推測してみたいと思います。

なお、この記事ではAndroid Oreo対応済み=targetSdkVersionが26以上である、と定義します。Notification Channelsやバックグラウンド動作の制限に対応しているかなどは考えません。

# Adaptive Icons
[Adaptive icons](https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive)

まず、今回の推測に使う Adaptive Icons について簡単に説明しておきます。Adaptive Icons は Android Oreo からの新機能で、ホームアプリごとに丸や角丸といった一貫したアプリアイコンの形を提供するための機能です。

# 推測手順
## STEP1: 端末を用意する（エミュレータでもOK）
Adaptive Iconsを利用して独自のアイコン形状を提供しているホームアプリが入った端末を用意します。Adaptive Icons利用なので、Android Oreo以降の端末になるでしょう。
どの端末を使えばいいかわからない方は、公式のエミュレータを使うと確実です。今回はAPIレベル27のPlay Storeが入ったエミュレータを使いたいと思います。以下のように、ほとんどのアプリアイコンが丸い形状になっています。

<img src="https://qiita-image-store.s3.amazonaws.com/0/98669/25eb2fe0-f8a5-2a7e-a17b-af52b1b35acc.png" width=300/>

## STEP2: アプリアイコンの見た目から推測する
アプリアイコンの見た目から、以下の3種類に分類できます。

1. targetSdkVersion 26 以上、Adaptive Icons 対応済み
2. targetSdkVersion 26 以上、Adaptive Icons 未対応
3. targetSdkVersion 26 未満

私のよく使うアプリを上記のカテゴリに分類してみました。
以下、注意：

- あくまで推測です。
- 記事執筆時の2018/07/29現在のものです。
- どのアプリも好きです。めっちゃ使ってます。

### 1. targetSdkVersion 26 以上、Adaptive Icons 対応済み
<img src="https://qiita-image-store.s3.amazonaws.com/0/98669/52155030-4d85-c1ee-f8d9-b073a3e2739a.png" width=180 />　<img src="https://qiita-image-store.s3.amazonaws.com/0/98669/87f37c5a-ddb9-44f0-4b99-817d5652be3b.png" width=180 />　<img src="https://qiita-image-store.s3.amazonaws.com/0/98669/a2801355-5024-0da9-251c-db77c026f9f0.png" width=180 />

Android Oreo にも Adaptive Icons にも対応済みと推測されるアプリです。3つ目のPICTLINKは私がtargetSdkVersionを27まであげました。
アイコンがホームアプリの提供する形状（今回だと丸）になっており、違和感なくフィットしています。

### 2. targetSdkVersion 26 以上、Adaptive Icons 未対応
<img src="https://qiita-image-store.s3.amazonaws.com/0/98669/b6aa1c78-9c27-83ba-bbce-6f2488648d11.png" width=180 />　<img src="https://qiita-image-store.s3.amazonaws.com/0/98669/ae0c628c-9acb-eb8e-d642-ace466e13854.png" width=180 />

Android Oreo に対応しているが、Adaptive Icons には未対応と推測されるアプリです。
アイコン全体の形状は丸ですが、白い丸の中にAndroid Oreo未満用のアイコンが表示されていると考えられます。

### 3. targetSdkVersion 26 未満
<img src="https://qiita-image-store.s3.amazonaws.com/0/98669/f0233730-b96b-fa9b-4111-816c80762118.png" width=180 />　<img src="https://qiita-image-store.s3.amazonaws.com/0/98669/3fe9a64f-8052-81d9-76f9-8eedaa627a81.png" width=180 />

Android Oreo 未対応と推測されるアプリです。
アイコンの形状が丸くなく、Android Oreo未満用のアイコン形状でそのまま表示されています。

### 例外
今回の推測方法で100%当たることはありません。例外もあります。
たとえばSlackのAndroidアプリは通知チャンネルに対応していないのでAndroid Oreo 未対応と思われますが、もともとアイコンが丸いので見た目としてはパターン1のものと同じになります。

# まとめ
今回の検証端末では、以下のような分類ができます。

- アイコンが丸くて、違和感なくフィットしている → targetSdkVersion 26 以上、Adaptive Icons 対応済み
- アイコンは丸いが、白い丸の中にAndroid Oreo未満用のアイコンが表示 → targetSdkVersion 26 以上、Adaptive Icons 未対応
- アイコンが丸くない → Android Oreo未対応
- 例外もある（Slack など）

# さいごに
Oreo対応してるかどうかは、一目で推測できてしまうので、みなさん早く対応しましょう。
nodejs requestモジュールをpromise化してasync/awaitで呼び出し

```node.js

const request = require(`request`);

function doRequest(options) {
  return new Promise(function (resolve, reject) {
    request(options, function (error, res, body) {
      if (!error && res.statusCode == 200) {
        resolve(body);
      } else {
        reject(error);
      }
    });
  });
}
```

とすれば

```node.js
const hoge = async () =>{
  const requestOptions = {
      url: url,
      method: "POST",
      headers: headers,
      json: payload
    }
  const res = await doRequest(requestOptions)
}

```
10分で NUXT 入門してみる


新規プロジェクトで [Vue.js](https://jp.vuejs.org/) を使うなら [NUXT](https://ja.nuxtjs.org/) がおすすめとの記事を見かけたので
[html5experts.jp](html5experts.jp) さんのページを参考に入門してみました。

必要なコマンドがインストールされていたら、新規プロジェクトの作成〜ルーティングしたページ表示まで 10 分ほどでできたので、おすすめされているのもたしかにな感じでした。

## **今回参考にさせていただいたページ**

[Vue.js製フレームワークNuxt.jsではじめるUniversalアプリケーション開発](https://html5experts.jp/potato4d/24346/)

「NUXT とは」 からユースケースやデータバインディングなどなど、NUXT 初心者の私でもわかりやすい内容でとっても助かりました :pray:

## **環境**

* **OS** : macOS High Sierra 10.13.6
* **node** : v10.7.0
* **npm** : 6.2.0
* **vue-cli** : 2.9.6

NUXTの node.js バージョンについて（[NUXT - モジュール](https://ja.nuxtjs.org/guide/modules/) より抜粋）

> async/await は Node.js 7.2 より上のバージョンでしかサポートされていないことに注意してください。


備考：インストールコマンド
>
nodebrew: $ curl -L git.io/nodebrew | perl - setup
node/npm: $ nodebrew install-binary stable
vue-cli: $ npm install -g vue-cli

## **プロジェクト作成**

```
$ vue init nuxt-community/starter-template sample
$ cd sample
$ npm install
$ npm run dev
```

ローカルサーバが起動したら http://localhost:3000 にアクセスしてサンプル画面が表示されたら OK です。

<img width="987" alt="スクリーンショット 2018-07-29 9.48.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/13105/4fea08cf-85c9-c6c4-5940-be74af643f53.png">

## **表示用ページの作成**

GitHub のユーザー情報を参照する API からデータを取得してプロフィール画像を表示するページを作ります。今回は [vuejs](https://github.com/vuejs) ユーザーのプロフィール画像を表示してみます。

<img width="987" alt="スクリーンショット 2018-07-29 10.12.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/13105/b1644e54-1e0e-26c5-8a91-64a7c387403a.png">

### **API との通信用に axios をインストール**

```
$npm install axios
```

### **表示用のページを作成**

サンプルプロジェクトルート/pages ディレクトリ内に `users` ディレクトリを作成後に `_id.vue` という名前のファイルを作成します（ファイルの内容は参考にさせていただいたサイトと同じ内容です）。

このファイル構成によって自動的にルーティングが作成されてページが表示されるようになります。

> http://localhost:3000/users/:id

```pages/users/_id.vue
<template>
  <section class="container">
    <img :src="`https://github.com/${user.login}.png`" :alt="user.name">
    <h1>{{user.name}}</h1>
  </section>
</template>
 
<script>
import axios from 'axios'
 
export default {
  async asyncData ({ params }) {
    const { data: user } = await axios.get(`https://api.github.com/users/${params.id}`)
    return {
      user
    }
  }
}
</script>
 
<style>
.container {
  min-height: 100vh;
  display: flex;
  justify-content: center;
  align-items: center;
  text-align: center;
  flex-direction: column;
}
 
.container img{
  margin-bottom: 20px;
  border-radius: 50%;
  overflow: hidden;
}
</style>
```

ファイルができたら、 http://localhost:3000/users/vuejs にアクセスして vuejs ユーザーの画像が表示されていたら OK です。

<img width="987" alt="スクリーンショット 2018-07-29 10.10.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/13105/daff4d9d-9cb8-9e2d-8449-6a1dd6a405e5.png">

## さらなる参考ページ

* [NUXT - ルーティング](https://ja.nuxtjs.org/guide/routing)
* [NUXT - ビュー](https://ja.nuxtjs.org/guide/views)
* [NUXT - 非同期なデータ](https://ja.nuxtjs.org/guide/async-data)
* [NUXT - アセット](https://ja.nuxtjs.org/guide/assets)
* [NUXT - モジュール](https://ja.nuxtjs.org/guide/modules)
* [NUXT - エンドツーエンドテスト](https://ja.nuxtjs.org/guide/development-tools#%E3%82%A8%E3%83%B3%E3%83%89%E3%83%84%E3%83%BC%E3%82%A8%E3%83%B3%E3%83%89%E3%83%86%E3%82%B9%E3%83%88)
nvmとnodebrewについて自己整理用メモ

基本的にバージョンがバンバンあがっていくnode.js。
趣味関心でいじっているだけの日曜グラマはなかなか最先端に触れらない。仕事で使う技術でもないし…

node.jsには代表的なバージョン管理として**nvm**と**nodebrew**なるものがある。
どっちを使うと幸せなの…？

## 結論
Macユーザーはどちらでもいい。むしろnodebrewの方が今はブログやQiitaの記事が多いかも？
Linux派はnvmの方が良い。というのもどうやらperlが必要なようだ。
http://var.blog.jp/archives/75607669.html
Linuxのディストリビューションの中にはperlがデフォルトで入っていないものもあるようなので、
環境やOSに少しでも依存を避けたいのであればnvmの方が良さそう。
この理由からするとWindows派もnvmの方がいいのかも。


ちなみに**anyenv**なるものもあることは一応付け加えておく。
このブログではnodebrewから移行する手順がまとめられていた。
https://mseeeen.msen.jp/anyenv-ndenv-replace-nodebrew/
クラロワ(Clash Royale)のクランの情報やメンバーの情報を自動で蓄積する(WEB API) ～APIキー作成編～

#１．やりたいこと
スマホゲームのクラッシュロワイヤル(クラロワ)でクラン（チーム）メンバーの管理を楽にやりたいと思います。
アプリ内でメンバー一覧から1人1人のレベル、勝ち数、トロフィー数など各種情報を確認できるのですが、
以下の課題があります。
　①1人ずつタップして確認の必要があり、めんどくさい
　②現在の情報しか見れないため、過去からの推移がわからない(最近活動してるのかの生存確認)

クラロワの開発元supercellから公式APIがあるようなので、そちらを利用して、上記課題を解決していきたいと思います。


#２．はじめに
公式APIを使用するには、アカウント登録が必要になります。
アカウント登録は以下のURLから行います。任意の名前を決める事と、E-Mailアドレスがあればすぐに登録できるようです。

　https://developer.clashroyale.com/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/227396/19f05788-9ffc-c6fe-e6a3-ad3f967b963b.png)



アカウント登録後、右上の「Log in」からログインすると、入門ページが出てきますが、すべて英語なので、日本語翻訳しながら
確認する必要があります。

APIにアクセスするためには、APIキーが必要なため作成します。

#３．API KEYの作成
ログイン後、右上のセレクトボックスから「My Account」を選び、「Create New Key」のボタンを押します。
すると、以下の画面が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/227396/edf65fdb-63f1-6eb3-6e7a-62b99a97939a.png)


KEY NAME、DESCRIPTIONは任意の内容で入力します。
ALLOWED IP ADDRESSは、接続許可のIPアドレスを入力します。
今回は自宅からのアクセスを想定しているので、自宅のIPアドレスを指定します。

グローバルIPアドレスは以下で確認できます。
　https://www.cman.jp/network/support/go_access.cgi


#４．APIの利用について
Documentationのページから、APIの使い方や試用方法がわかります。

個人的に、情報収集したいのは、クランメンバーの最高トロフィー、勝数、寄付数、戦闘日の勝利数なので、
そのあたりをAPIを使用して、定期的に収集していきたいと思います。

情報定期収集のプログラムは、出来次第また公開していきたいと思います。
pythonかGoogle Action Scriptあたりで作成予定です。
DockerでRails5.2開発環境を構築

# はじめに

学習で使用する為、DockerでRails環境を構築した時のメモです

こちらのサイトを参考にさせて頂きました
[総合的な学習のお時間](http://tomerun.hatenablog.com/entry/2017/03/25/192841)


今回は学習用にRails環境を使いたかったので一つのコンテナで複数のアプリケーションを何個も作ることが可能なワークスペースのようなイメージをつくりました

# 環境
Windows 10 Pro
Docker for Windows
Windows PowerShell

# バージョン
Rails 5.2.0
Ruby 2.5.1
※2018/7/26 時点での最新安定バージョンを使いました

# Dockerのインストール
こちらのサイトからダウンロードしてインストールすると起動します
https://www.docker.com/docker-windows

# Dockerfileの作成

```Dockerfile

FROM ruby:2.5.1

ENV APP_ROOT /usr/src/workspace

WORKDIR $APP_ROOT

RUN apt-get update && \
    apt-get install -y nodejs \
                       default-mysql-client \
                       postgresql-client \
                       sqlite3 \
                       --no-install-recommends && \
    rm -rf /var/lib/apt/lists/*

COPY Gemfile $APP_ROOT
COPY Gemfile.lock $APP_ROOT

RUN \
  echo 'gem: --no-document' >> ~/.gemrc && \
  cp ~/.gemrc /etc/gemrc && \
  chmod uog+r /etc/gemrc && \
  bundle config --global build.nokogiri --use-system-libraries && \
  bundle config --global jobs 4 && \
  bundle install && \
  rm -rf ~/.gem
```

# Gemfileの作成
```
source "https://rubygems.org"
gem 'rails', '5.2.0'
```
さらに空の**Gemfile.lock**も作成しました

# dockerイメージの作成
上記手順で作成したDockerfileを基にdocker imageを作成します
```docker build -t [イメージ名] .
```※右辺の「.」はDockerfileのあるディレクトリを指定しています


```docker images
```でimageが出来ていることを確認できます

# dockerコンテナの作成
```
docker run -d -p 3000:3000 -it -v [連携したいホストマシンのディレクトリ]:/usr/src/workspace [イメージID]
```

# dockerコンテナに入る
```docker exec -it [container_id] /bin/bash```

# コンテナ内でGemfileの作成
```
source "https://rubygems.org"
gem 'rails', '5.2.0'
```
※Gemfileを作成したディレクトリを指定してコンテナを作成した場合はすでに存在しているので不要です

# Railsアプリケーションを作成
```rails new [appName]```

# Railsアプリケーションを起動

```cd [appName]
rails server -d -b [dockerゲストのIPアドレス]
```


ipアドレスは
```ip a```
で確認できます

# 起動確認
ホストマシンから
```http://localhost:3000```
へアクセス

![rails.jpg](https://qiita-image-store.s3.amazonaws.com/0/198272/6ea46812-afee-9deb-8e1b-ead1d222bc21.jpeg)


# railsサーバの停止
プロセスIDの確認
```ps -ef | grep puma```

```kill -9 [プロセスID]```

# おわり
お手軽にrailsアプリケーションを作成することが出来るようになりました

完成したイメージはこちらにありますのでもし必要な方がいましたら使っていただけたら幸いです
```docker pull amnihs/rails_5_2_0```
dockerfileでPHPのzip拡張を導入するメモ

dockerfileによってphpのzip拡張を導入するときのメモ。

以下のようにzlib1g-devをインストールしてから`docker-php-ext-install zip`を実行する。
（zlib1g-devがインストールされていないと、エラーになる。）


```dockerfile

FROM php:7.2
RUN apt-get install -y zlib1g-dev \
    && docker-php-ext-install zip
```

参考：https://github.com/docker-library/php/issues/60
ラズベリーパイでリモートデスクトップ

ラズベリーパイ3 Bでリモートデスクトップを接続するには以下のやり方が簡単でした。
tightvncserverをインストールするやり方もありましたが、こっちのが楽です。

ラズベリーパイ側でインストール

```
sudo apt-get install realvnc-vnc-server
```

ビューアインストールしてIPを設定して実行
https://www.realvnc.com/en/connect/download/viewer/
プログラミングの英語表現 / 文章作成に迷ったら「クオートで囲ってGoogle検索」

人に話すと、意外と知られていない方法。

「こんな英文の書き方あるの？」と思ったら、文章をクオートで囲って Google 検索してみよう。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/26c6c1f2-c66b-a76f-49fb-eb5f771316be.png)

# ヒットした場合

あとは検索結果を軽くチェックしよう。

- どのぐらいのヒット数があるか
- どんな用例で使われていそうか
- 文章のつなぎ目などで、たまたまヒットしただけじゃないかどうか

# ヒットしなかった場合

表現を変えたり、センテンスを短くしたりするなどして、他のキーワードで検索してみよう。

# メリット

ヒットした文章は「誰かが実際に使ったことのある文章」なので、単純な自動翻訳よりも信頼感がある。









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
SwiftでUITableViewCellの中にUIButtonを置いてタッチイベントを取得

前提としてButton自体は、カスタムのCellクラスの中にあります。
いくつかやり方はあると思いますが、今回は呼び出し元のViewControllerの方に記述をしています。

```
extension ViewController:UITableViewDataSource {
   func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

       ... 省略

       cell.someButton.addTarget(self, action: "pushButton:", for: .touchUpInside)

       ... 省略
    }

    ... 省略

}

@objc private func pushButton(_ sender:UIButton)
{
        
}
```
privateってのを記述しないといけないってわかるまでSIGBRTしまくってました。手こずりました。

ただこのままだと、どのCellをタップしたかはわからないので、indexPath.rowを渡してあげます。UIButtonのカスタムクラスを作って渡す方法もありますが、行番号だけ渡せれば問題ないので、tagを使って渡すことにします。

こんな感じ。

```
       cell.someButton.tag = indexPath.row
       cell.someButton.addTarget(self, action: "pushButton:", for: .touchUpInside)
```
取り出す方は、

```
@objc private func pushButton(_ sender:UIButton)
{
    let row = sender.tag
    let data = self.jsonData[row]
}
```

あとは、Cellに表示させているデータから該当のデータを取得すればOK。
アセットを変更せずに、Unityプロジェクトのバージョンを上げる方法


## 現象

Unity Hubに新しいバージョンのUnityをダウンロードして、それを使ってプロジェクトを開こうとしています。

![choice](https://qiita-image-store.s3.amazonaws.com/0/10290/62692f33-2be9-ab4a-bc67-8ad3154bb6c5.png)

`Open`をクリックした後、以下の警告ダイアログが出て、インポートしているような挙動がしばらく続きます。

![dialog](https://qiita-image-store.s3.amazonaws.com/0/10290/f0405cb7-206f-17e6-5d5f-13d1c862e9bf.png)

開かれたプロジェクトを見ると、警告メッセージが表示されています。

![errors](https://qiita-image-store.s3.amazonaws.com/0/10290/d8bd4400-ad88-c4ff-7d20-45a9070aab08.png)

```例
The AssetDatabase contains a timestamp for '/Applications/Unity/Hub/Editor/2018.2.0f2/Unity.app/Contents/UnityExtensions/Unity/UnitySpatialTracking/Editor/UnityEditor.SpatialTracking.dll', but no mapped GUID. This timestamp will be removed from the database.
```

次回Unity Hubで開こうとしても、また↓のダイアログを出して選択しないと、バージョンアップ前のUnityで開こうとしてしまいます。新しいバージョンのUnityで開くたびに、インポートでしばらく待たされることになります。

![choice](https://qiita-image-store.s3.amazonaws.com/0/10290/62692f33-2be9-ab4a-bc67-8ad3154bb6c5.png)

## 原因

[何か変更して保存しなければプロジェクトのバージョンが上がらないのは、Unityの仕様](https://issuetracker.unity3d.com/issues/unity-project-detected-as-opened-with-an-older-version-of-unity-if-project-isnt-saved-in-newer-version)のようです。

## 対処

`ProjectSettings/ProjectVersion.txt`をエディタで開き、目的とするバージョンの番号に修正して保存します。

```ProjectVersion.txt
m_EditorVersion: 2018.2.1f1
```

新しいバージョンで開いた後でアセットを変更して保存すると、自動的に`ProjectVersion.txt`が変更されますので、通常はそれで良いはずです。アセットを直す必要がないと確信していて、アセット自体への変更は避けたい時は、上記の手順で。