OmniAICreator/Qiita-1.07M huggingface dataset:
先祖返りが発生する理由がわからないIT部のPMがGit / GitHub を整理してみた

Git / GitHubがよくわからなかったので整理してみた。
元々の整理の発端はなぜベンダーが納品してくる成果物が頻繁に先祖返りするのかわからなかったから。GitHubで管理しているというが、なぜだ〜って感じ。調べてみたところ、Subversionと昔使われていたツールにしても最近使われているGitHubないしは類似サービスにしても人に依存する部分もあり先祖返り完全防止機能はないことがわかった（管理を間違えれば先祖返りはありうるということ）。
GitHub はコマンドベースで動く Git が使いやすくなっているサービスということも理解できた（メールで言うとGmail的な感じ）。この手の話題はネット上の資料だと日英問わず間違っている物や不完全な説明も多そうで、実際のところ私のまとめもただしいかどうかわからない状況。様々な文献をベースに図式化してみると次のようになった。 

![git.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/aaadd73d-7a48-65a1-f082-12c7d9de7271.png)

・リモートレポジトリと呼ばれるものが正、作業用としてローカルレポジトリがある。
・ローカルにはUpstreamブランチ、Trackingブランチと呼ばれる中継がある（一つのブランチ名が両方を指していることがあるが、別々にすることもでき、このことについて言及されていない記事が多い）
・実際のローカルで作業を行うブランチは中継目的のUpstreamブランチ、Trackingブランチとは異なる
・pull = fetch、merge の同時実行
・pullとrebaseの違いは他の記事を参照、履歴の残し方の問題でrebaseだと簡略化されたイメージ（履歴は少なくなるがバグが発生するとどこが原因だか追いづらい）

#先祖返り問題・・・結局なんで？防止策？
これについてはネット検索してもいまいち確実な理由がわからなかったが、いくつかのパターンは考えられた。
・fetch+merge/pull/rebaseからmerge, pushで確定するまでの間で同一ファイルの複数作業（複数人または同一人だが別々の端末など）が発生の原理原則
・コード数が多いファイルで起きやすい（コード数が小さいファイルに分割されている環境では同一人物ないしは異なる人物が一つのファイルで同時多発的に作業をするケースが少なくなるため（競合発生が低くなり、commmitの撤回（reset）による影響度合いも必然的に少ない））
・意図してreset を流すが（その後必要でpushし上書きもするが）、意図された事項以外も元に戻ってしまうケースがありうる
・merge/push時にエラー/警告がでて解決が面倒である際に
git push 時に-f ないしは --force で強制上書きできる（複数人作業でローカルにコピーをしまくりこれをされると先祖返りが極めて発生しやすい）

防止策：
・一つのソースファイルで全てを抱え込まないようにする
・まずは単独作業者自身においてこまめにcommitさせる
・互いに声をかけ短時間の間隔で、こまめにmerge/pull, pushする
　
ベンダーに依頼するとなるとこんな感じですかね。。。？
　
参考資料
https://qiita.com/wann/items/688bc17460a457104d7d
https://teratail.com/questions/79531
https://kray.jp/blog/git-pull-rebase/
https://blog.codecamp.jp/git_rebase
https://www.clear-code.com/blog/2016/9/2.html
https://www.ricksoft.jp/blog/archives/9483/
https://dev.classmethod.jp/tool/git/development-flow-with-safty-merge/
https://frasco.io/why-you-should-stop-using-git-rebase-535fa30d7e25
https://qiita.com/seri1234/items/e651b3e108a695a92809
https://yu8mada.com/2018/08/11/how-to-confirm-and-set-up-tracking-branches-in-git/
https://codeday.me/jp/qa/20190104/109718.html
【初心者向け】vagrant例え話

# はじめに
この記事は**DMM WEBCAMP**アドベントカレンダー14日目の記事です。

こんにちは！12月14日、年末まで17日、みなさまいかがお過ごしでしょうか！？
今回は「vagrantってどこかで聞いたけど何だったっけ？」と考えている皆様に、例を交えながらお伝えしたいと思います。

# だいたいのイメージ
用語|イメージ
:--|:--
プログラム|店
開発環境|サービスエリア

# むかしむかし
そこはラーメン屋でした:ramen:。今まではA県の国道沿いに、ぽつぽつと店舗を営業していましたが、薄暗い事務室では他県への展開が計画されていました。
「ラーメンだけを考えれたらいいのに:cry:」
というのが店主Bの口癖でした。Bはこんな苦労を想定しています。

- 水質の違いでラーメンに影響がでる可能性がある。味が悪化するかもしれない。
- 隣県はラーメン文化が弱い。ラーメン調理可能なスタッフを集めきれないかもしれない。

苦慮した店主は知り合いのラーメン店に相談し続けました。その噂を聞きつけ、登場したのがサービスエリアを手掛けるvagrant営業担当のCでした。

## vagrantの登場
vagrantの営業Cは、課題一つ一つに太鼓判を押しました。

- ~~水質の違いで味に影響がでる可能性がある。~~
    - :point_right:全国で水質が同一になるように施設で水質調整がされていて、素材の違いはない。
- ~~ラーメン調理可能なスタッフを集めきれないかもしれない。~~
    - :point_right:バイト採用や教育もvagrantが行うので、スタッフのスキルが同じになる。
- :point_right:あなたはラーメンだけに集中できる。

早速店主Bはスタッフ要望やその他についてまとめた資料をCに渡しました。Cはそれを見事に叶え、見事全国展開を可能としたのでした:smiley:。

# vagrantは何をするのか
vagrantは要望書を受け取り、要望通りのサービスエリアを建設します。例えばラーメン店が安定稼働するスペック（RAM、CPU）を決めたり、必要な設備（プログラミング言語など）を用意してくれます。
同じ要望書をみんなに配れば、全員が全く同じサービスエリアを建設できます。そして全く同じサービスエリアのため、中のラーメン店（プログラム）は環境を気にすることなく作業できます。
また、同じサービスエリアのため、ラーメン店にアクセスする方法（ネットワーク設定）も同じです。そのためみんな同じ方法でサイトにアクセスできるのです。

## vagrantが必要なもの
### vagrantfile
例えでいう要望書です。ここに書くとvagrantが代わりに実行します。書いてあることは命令集のようなもので、エディタで編集できます。
### ボックス
サービスエリアの原型のようなものです。ボックスは以下を含ませることができます。

- OS
- ミドルウェア
    - Webサーバ
    - アプリケーションサーバ
    - DB
    - プログラミング言語
    - 他ソフトウェア

どの程度をボックスで用意するべきでしょうか？
vagrantfileで毎回発電機をインストールして時間がかかるより、予め発電機付きのボックスを用意しておけば建設時間は短くて済みます。ただし、その分ボックスの容量が大きくなるので注意です。インストールに1時間もかかるようになれば、ボックスを用意することを検討しましょう。

## vagrantの営業Cさんへの依頼リスト
※コマンドのことです。vagrantには様々なコマンドが用意されているので、決まりきったコマンドを打つだけで環境を構築できます。
### vagrant up
サービスエリアを建設します。vagrantはvagrantfileをまず確認して、そこに指定されているボックスを元に建設を行います。

### vagrant provision
サービスエリアの設備を整えます。vagrant upの途中にprovisionを実行してね！と言われることがあるので、そのときに実行します。やっているのはソフトウェアのインストールなどです。

### vagrant status
サービスエリアの状態を確認できます（未建設なのか、営業中なのか、準備中なのか）。

### vagrant halt
サービスエリアの電源を落とします。正常に電源が落とせなかった時は強制的に電源が落とされます。やっていることは通常のPCと同じシャットダウンです。
もう一度開店させるには、vagrant upが必要となります。

### vagrant suspend
現在の状況を保存した後、サービスエリアを閉店にします。haltと違い、電源はつきっぱなしなので、仕事の再開はとても早く、キャッシュやデータベースもそのままの状態で残っています。

### vagrant resume
閉店にしたサービスエリア（vagrant suspend）を開店させます。閉店していなければエラーが出力されます。

### vagrant ssh
サービスエリアに接続します。接続後webサーバの立ち上げやログの確認などができます。

### vagrant destroy
サービスエリアを更地にします。サービスエリアの痕跡は何も残りません。

## 便利機能：共有フォルダ
vagrantには共有フォルダの機能があり、サービスエリアを建設しているPC（以下PC）とサービスエリア内（以下vagrant環境）の一部分が共有されています。
vagrant環境はmacやwindowsなどのOSが別に入っているため、PCに入れているソフト（エディタ等）は使えません。
そのため、PCの共有フォルダをPCのエディタを使って編集し、vagrant環境でラーメン店（ソフト）の営業指示を出す、という方法が一般的です。
順序としては
1. PCのエディタでプログラミング
2. vagrant環境でwebサーバ起動や更新
3. PCのブラウザでvagrant環境のwebサーバにアクセス

という感じです。


## vagrant upしたら.vagrantってディレクトリができるんだけど？
vagrantの状態の一部を管理するために作られます。触らないようにしましょう。
また、gitには含めないようにしましょう。これが誰かに共有されてしまうと、共有された先で設定を上書きする可能性もあります。

# まとめ
例え話でいくと、あなたはラーメン店の店主です。ラーメンをつくるために様々な道具があるように、アプリ開発にも様々なツールが存在します。
そして問題なのは、**ツールが目に見えないため**にイメージしづらい点にあるのです。
あなたは道具に振り回されるべきではありません。あなたは道具を使いこなし、あなたが一番と思う何かをつくるためにいるのです。さぁ、偉大なものをつくりあげましょう！楽しいhack lifeを！:ramen:

# 参考文献
[実践 Vagrant](https://www.oreilly.co.jp/books/9784873116655/)
slideUp slideDown

slideUpとslideDownを使って要素を出したり消したりする

```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>slideUpDown</title>
<link rel="stylesheet" href="assets/style.css">
<!-- グーグルからライブラリを取得 -->
<script <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
<p class="click-here">押</p>
<div class="youso"></div>

<script>
$(function() {
	$(".click-here").click(function () {
	  if ($("div:first").is(":hidden")) {
            //1秒かけてスライドダウン・アップ
	    $("div").slideDown(1000);
	  } else {
	    $("div").slideUp(1000);
	  }
	});
});
</script>

</body>
</html>
```

```css
.click-here{
	dsplay: inline-block;
	width: 50px;
	height: 50px;
	background-color: pink;
	text-align: center;
	line-height: 50px;
	border-radius: 30px;

}
.youso { 
	background:#3d9a44; 
	margin:3px; 
	width:80px;
	height:40px; 
	/* 最初は要素を隠しておく */
	display: none;
}

```
Rails ビューファイルのHTMLにRubyのコードを書く時の<% %>と<%= %>の違い

# 目的

- あんまりわかっていないビューファイル(HTML)内にRubyのコードを書く時の<% %>と<%= %>の違いをまとめる

# 簡単に言うと？

- ビューファイルが司るWebページ(以降、Webページと記載する)内に表示したいものは<%= %>の中に記載する。
- Webページに表示したくないものは<% %>の中に記載する。

# ちょっとだけ詳しく言うと？

- <%= %>は中に書かれた内容を実行し、結果を評価し、文字として出する。
- <% %>は中に書かれた内容を実行する。

# 使い分けは？

- あまり難しい事は考えず、ビューファイルに記載するRubyのメソッドやコードの結果をそのWebページに表示したいのか、表示したくないのかで判断する。
- 例えば、とあるテーブル情報を`モデル名.all`で取得し、each文で取得内容を全て出力したいときの`変数名A.each do |変数名B|`の処理はWebページに出力する必要はないので<% %>で囲む。
- 前述の処理で変数Bに入った内容をWebページに出力したいときは<%= %>で囲む。

# 書き方の例

- 変数Aにはとあるデータベースのとあるデータが格納されているものとする。
- 変数Bの内容をWebページに出力したい。
- each文を使用した書き方の例を下記に記載する。

    ```html
    <!-- 下記の処理は出力したくないので<% %>で囲む --> 
    <% each.変数A do |変数B| %>

      <!-- 変数Bを出力したいので<%= %>で囲む -->
      <%= 変数B %>

    <!-- each文の終了を意味するendも出力したくないので<% %>で囲む -->
    <% end %>
    ```

# より具体的な例

- usersにはuserテーブルのすべてのデータが格納されているものとする。(`users = User.all`を実行した状態)
- userの内容をWebページに出力したい。
- each文を使用した書き方の例を下記に記載する。

    ```html
    <!-- 下記の処理は出力したくないので<% %>で囲む --> 
    <% each.users do |user| %>

      <!-- userを出力したいので<%= %>で囲む -->
      <%= user %>

    <!-- each文の終了を意味するendも出力したくないので<% %>で囲む -->
    <% end %>
    ```
HTML/CSS 基本の復習

ポイントポイント自分に必要なとこだけをただただ書き出し。

####ブロックレベル要素とインライン要素
ブロックレベル要素は並べると、改行される。
インライン要素は並べると、改行されない。
しょっちゅう出てくる\<div>はブロックレベル要素

曖昧なイメージで、ブロックライン要素はhtml作成に必ず必要な分。
インライン要素は必ずしも必要でないが、見た目を整えるのに寄与している。

####セレクタとプロパティと値
cssの書き方

```css
セレクタ {
   プロパティ : 値 ;
}
```

####class

```class1.html
<p class="class1">class1</p>
```

```class1.css
.class1{
  color: red;
}
```

####id

```id.html
<p id=id1>id1</p>
```

```id1.css
#id1{
  color: red
}
```
classの方が一般的なので、とりあえずclass使っておけばOK

####リセットCSS
ブラウザ毎の変化を抑えるために必要。

####float
要素を指定位置表示。

####clearfix
floatの副作用を解決。

```clearfix.html
<div class="aaa clearfix"></div>
```

```clearfix.css
.clearfix::after {
  content: "";
  clear: both;
  display: block;
}
```

####リスト
ul 順序なしリスト
ol 順序ありリスト
li リスト中のブロック
list-style: none; 先頭の記号消し

####表
table 一番外
th 見出し
tr 横定義
td ブロック

####GUI
form 操作フォーム
input 入力フォーム
textarea 広い入力フォーム
placeholder 仮表示文字列
label 見出し

####Flexbox(floatと同じ)
justify-content: **; 横並びのしかた
align-items: **; 縦並びのしかた

####ブロック配置位置 position [図解があって分かり易いページ](https://saruwakakun.com/html-css/basic/relative-absolute-fixed)
position: absolute; 要素の絶体位置指定(親要素基準)
　※absoluteを使う時は、必ず親要素にはrelativeもしくはfixedを指定しておかねばならないらしい。
position: relative; 要素の相対位置指定(自身の本来の位置基準)
position: fixed; 画面固定(ウィンドウ全体基準)
【SQL】ビュー、サブクエリ、スカラ・サブクエリ、相関サブクエリ

## ビュー

ビューはSELECT文においてはテーブルと同じ。
任意のテーブルが作成できる。
データを更新(Create, Update, Delete)する際は条件あり。
基本的にビューからデータの更新はしない。

## サブクエリ

サブクエリは揮発性のあるビュー。
一時的にほしいテーブルがあるときに使う。
ビューはSELECT文が終了しても残るが、サブクエリはSELECT文が終了したらサブクエリも終了する。
他のところでも使うならビューを作る。

## スカラ・サブクエリ

スカラ・サブクエリはサブクエリの一種。
AVG()やCOUNT()など、１行１列の値（スカラ）を返すサブクエリ。
サブクエリはテーブルなので（n行m列なので）、「=」や「>」などの比較演算子が使えないが、スカラ・サブクエリは単一の数値（スカラ）なので比較演算子が使える。
「販売価格が平均販売価格以上の商品を取得したい」みたいなときに使う。

## 相関サブクエリ

相関サブクエリは"サブクエリ"とついているが、サブクエリよりGROUP BYに近い。
グループごとに小分けにして、そのなかでSELECTを実行できる。
「商品ジャンルごとに平均値を計算し、その商品ジャンルの中でその平均値を超えるレコードを出力する」みたいなときに使う。
個人的な感想だが、相関サブクエリはPyhtonのforに似ている。

## 参考書籍
[SQL ゼロからはじめるデータベース操作](https://www.amazon.co.jp/SQL-%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E6%93%8D%E4%BD%9C-%E3%83%9F%E3%83%83%E3%82%AF-ebook/dp/B00ESXY9FM/ref=as_li_ss_tl?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=sql+%E3%82%AD%E3%83%AA%E3%83%B3&qid=1573532117&s=books&sr=1-1&linkCode=ll1&tag=y063-22&linkId=5e4171e0e2fa55476a4ead9a62c6cd88&language=ja_JP)
Rust のウェブフレームワーク「Rocket」とたわむれてみた。

## 諸注意

- Rust超初心者です。お手柔らかにお願いします。
- いつもはpythonとC++を使うことが多いですが、Rust書いてみたかったので触ってみました。
- これを書く前に同じくRustのウェブフレームワークの「Iron」を触ってみましたが（この記事=>[test](test)）、なかなか難しいなという印象でしたので、一種の希望を持って「Rocket」も触ってみました。


## やったこと

- キータに上がっていたすばらしい記事([RustのRocketでWebアプリケーションを作ってみる](https://qiita.com/yukinarit/items/c5128e67d168b4f39983))を追いかけてみました。
    - レコード（ストラクト）をjsonとして返す。
    - jsonをpostで受け取る。
    - getリクエストからidを受け取り、それに対応したレコードを返す。
    - 202をつけてレコードを返却する。


##rustの環境
```bash
$ rustc --version
rustc 1.40.0-nightly (1423bec54 2019-11-05)
```

## 感想
- RocketのドキュメンテーションはIronに比べてとてもわかりやすい、すばらしい！（[Rocketドキュメント](https://rocket.rs/)はこちら）

やっぱり新しい言語勉強する時に、チュートリアルが動かないと辛いですよね、、
下のコードは下の環境下で動くことを確認済みなので、ぜひ使ってみてください！

これからRustを勉強して更新してけたらと思います！
「いいね」や「コメント」お待ちしております！！

## Rocket
いつものごとくプロジェクトを作ります。

```bash
cargo new web_rocket
```

```bash
$tree src
src
├── main.rs
├── models.rs
└── routes.rs
```

Cargo.toml
```
[dependencies]
rocket = "0.4"
rocket_contrib = { version = "0.4", features = ["json"] }
# serdeのcrateを追加する
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0.0"
```

main.rs

```rust 
#![feature(proc_macro_hygiene)]
#![feature(decl_macro)]

#[macro_use]
extern crate rocket;

mod models;
mod routes;

// WebAPIのURLルーティングはroutes.rsに移動する
use routes::*;

// rocketにルーティングをマウントして、開始する。
fn main() {
    rocket::ignite()
        .mount("/", routes![index, todos, new_todo, todo_by_id,todos_accepted])
        .launch();
}
```


routes.rs

```rust
// JSONを返すのに必要
use rocket_contrib::json::Json;

//models.rsからToDo(テーブルに相当するストラクト)をインポートする。
use crate::models::ToDo;


// hello world を返却する
// flaskと似た感じで書ける。
#[get("/")]
pub fn index() -> &'static str {
    "Hello, world!"
}

/// TODOリストを返す。
/// Jsonの型がResponderをimplしているので、JSON文字列を返すことができる
#[get("/todos")]
pub fn todos() -> Json<Vec<ToDo>> {
    Json(vec![ToDo {
        id: 1,
        title: "Read Rocket tutorial".into(),
        description: "Read https://rocket.rs/guide/quickstart/".into(),
        done: false,
    }])
}

/// 新しいTODOを作成する
/// POSTの時はこうする
#[post("/todos", data = "<todo>")]
pub fn new_todo(todo: Json<ToDo>) -> String {
    format!("Accepted post request! {:?}", todo.0)
}

/// TODOをidを指定して取得する
#[get("/todos/<todoid>")]
pub fn todo_by_id(todoid: u32) -> String {
    let todo = ToDo {
        id: 1,
        title: "Read Rocket tutorial".into(),
        description: "Read https://rocket.rs/guide/quickstart/".into(),
        done: false,
    };
    format!("{:?}", todo)
}

//Acceptedで202を付加してTODOを返却する。
use rocket::response::status::Accepted;
#[get("/todos_accepted")]
pub fn todos_accepted() -> Accepted<Json<Vec<ToDo>>> {
    Accepted(Some(Json(vec![ToDo {
        id: 1,
        title: "Read Rocket tutorial".into(),
        description: "Read https://rocket.rs/guide/quickstart/".into(),
        done: false,
    }])))
}

```


models.rs

```rust
use serde::{Deserialize, Serialize};

/// TODOのモデルはmodels.rsに定義
#[derive(Debug, Serialize, Deserialize)]
pub struct ToDo {
    pub id: u32,
    pub title: String,
    pub description: String,
    pub done: bool,
}
```
少ないコンテンツでもフッターはスクリーンの一番下に表示する簡単なやり方CSS Flex

[Demo](https://codepen.io/softjapan/pen/vYYawLR)

```html:HTML

<body class="Site">
  <header class="Site-header">ヘッダー</header>
  <main class="Site-content">少ない中身</main>
  <footer class="Site-footer">Footer</footer>
</body>

```

```css:CSS
.Site {
  display: flex;
  min-height: 100vh;  /*ビューポートの高さに対する割合100*/
  flex-direction: column;
}

.Site-header,
.Site-footer {
  flex: none; 
  background-color: #99cc00;
}

.Site-content {
  flex: 1 0 auto;  /*flex: flex-grow flex-shrink flex-basis|auto|initial|inherit; shrinkしないように*/
  padding: var(--space) var(--space) 0;
  width: 100%;
  background-color: #666666;
}
.Site-content::after {
  content: '\00a0'; /* &nbsp; */
  display: block;
  margin-top: var(--space);
  height: 0px;
  visibility: hidden;
}
@media (--break-lg) {
  .Site-content {
    padding-top: var(--space-lg);
  }
  .Site-content::after {
    margin-top: var(--space-lg);
  }
}

.Site-content--full {
  padding: 0;
}
.Site-content--full::after {
  content: none;
}
```
Pepper for Biz 3.0のAI会話アプリカスタマイズで、ボタン表示の実現

#AI会話アプリとは
Pepper for Biz 3.0のお仕事かんたん生成3.0に標準搭載している機能の1つ。
ユーザがPepperに話しかけたときに、Pepperが自動で回答する機能である。
＜参考＞
[Pepper for Biz 3.0取扱説明書ーAI会話ボックスー](https://doc.robot.softbank.jp/pepper_biz_3/manual/index/topics_detail171/id=1654)

#今回、実現しようとしたこと
AI会話アプリを活用したFAQ対応。
口頭ベースのFAQだけでは面白くないので会話の内容によっては
ボタンを表示させるといったことも試みた。

#実際に作成してみた
▼AI会話アプリカスタマイズを作成
こちらのページを参考に、AI会話アプリを作成する
[Pepper for Biz 3.0取扱説明書ーAI会話ボックスカスタマイズー](https://doc.robot.softbank.jp/pepper_biz_3/manual/index/topics_detail171/id=1854)
・下図のとおり、ダウンロードしたテンプレートファイル(xlsx)を編集します
![template1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531792/43ee8c33-f0b2-7aa4-c32f-ed25effe9135.png)
・続けて手順通り最後まで進めます
・実際にPepperで動作確認します
　　ユーザ発話：ご飯食べたい
　　↓
　　Pepper発話：何を食べたいですか？
　　↓
　　Pepperタブレット：ボタン表示

　ボタンが非活性で押せない・・・
![DSC_0016.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531792/b7afa4f3-ce4e-f1ec-aeef-7db057a5dbd5.jpeg)
▼解決方法
・どうやらPepperの発話とモーションが関係しているようです。
　そこでモーションをなくしてみました。
![template2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531792/27c9ac12-034d-d28b-7c66-d67359c7d356.png)
・再度、DialogFlowへIMPORTして動作確認します。
![DSC_0018_CENTER.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531792/c32df6ba-d0fd-86bf-00ec-bae4ab0aee37.jpeg)
・ボタンが押せるようになりました！

#まとめ
今回はモーションを無くすことで正常に動作するようになりましたが、
モーションありの場合も、正常に動作することがあるようなので、もう少し検証が必要そうです。
同様の事象でお困りの方がいらっしゃいましたら、
一度モーションを変更してみてください。

以上
ダブルイコールの使い方　備忘録

今思うとなんでこんなので躓いたのか馬鹿らしくなるが自分の経験の少なさから手間取ってしまった問題について。

ダブルイコールを使ってTrue Falseを if文で判断しようとした時、
３行目のような書き方をしてしまった。
これでは lists == True　で計算されてしまうためFalseが返ってくる。
よって（）を使うことにより解決した。


```list.py
lists = ["a","b","c"]
print("a" in lists)             >>> True
print("a" in lists == True)     >>> False
print(("a" in lists) == True)   >>> True
```
[ReactNative]WebViewでアプリとWebで値をやりとりする。

WebViewを使いたいので調査
やりたいことはWebViewから値をもらって、それをアプリにわたす。
逆にアプリからWebView側に値を渡すということ。


### コンポーネントの情報
[公式：WebView](https://facebook.github.io/react-native/docs/webview.html)

[github](https://github.com/react-native-community/react-native-webview
)

※バージョンとか注意..

## App→webViewで値を渡す

①injectedJavaScriptでjsコードを渡す。
WebViewのpropsにinjectedJavaScriptがあり、これは文字列でJsのコードを渡すとweb側で実行してくれる。

以下 Googleを表示してフォームに文字列をセットするサンプル。

```Javascript

export default class Sample extends React.Component<Props, State> {
  message = "hello world"
  js = `
    const inputs = document.getElementsByName("q") 
    inputs[0].value = "${this.message}"
  `

  render() {
    return (
    
      <WebView
        source={{uri:'https://www.google.co.jp/'}}
        injectedJavaScript={this.js}
      ></WebView>
    
    )
  }
```

②postMessage()を使う
App->WebViewでもpostMessageはできそうだけど、こっちはなんか面倒くさそうなので割愛。jsコードを渡せればなWeb側で実行する関数を定義しておいてくれれば、それに引数を渡して実行できるしね


## WebView→Appで値を渡す
HTML側で実行するpostMessage()の呼び出し方が変わっている。自分のreact-nativeのバージョンに合わせて変更。

```Javascript
//Web側で動かすスクリプト
window.postMessage('OK'); //0.59はこっちでうごく
window.ReactNativeWebView.postMessage("OK"); //最新はこっちみたい
```

さらに、iOSは上記の記述でよかったのだけど、アンドロイドで上記をinjectしたらonMessageが反応しなかった。
setTimeoutで囲ったらうまくいったので、最終的に動いたコードは以下のようになった。

```Javascript
//App側
  js= `
    setTimeout( function(){window.postMessage("ok") }, 0 )
  `

  onMessage = (event) => {
    const {data} = event.nativeEvent
    alert(data)
  }

  render() {
    return (
      <WebView
        source={{uri:'http://example.co.jp/'}}
        injectedJavaScript={this.js} 
        onMessage={this.onMessage}      
      />
    )
  }
```

これでWeb側のpostMessage()が実行されたときに、WebViewのonMessageに設定した処理が動く。


## 参考リンク

https://qiita.com/ozaki25/items/9da8e313e026f447c421

https://qiita.com/wawoon/items/3d81b52891ba78c16689
safari環境などをWindowsから最速で検証するツール - ITP対応メモ

#概要
safari環境などでWebサイトがどういった動きをしているのかをWindows環境から検証する方法を見つけたのでメモ


#動機
リターゲティング広告のリーチを蓄積するため、SafariのITP対応を行っておく必要があります。もちろん、ITP対応を行った際に、その実装が上手くいっているのか確認する必要もあります。ITP対応の検証方法はGoogle,Yahooなどの広告媒体により異なりますが、その対応中、正規のSafariでしかページ(JavaScript)の挙動を確認できないものがありました。

※Chromeの開発者ツールから「ipad」環境で確認してみるとITP対応の挙動が確認できる場合もありましたが、、確認できない場合もあって結果が安定しませんでした。
![chrome_test_ipad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521810/f91ba37d-69f1-6364-af62-f9237573dc95.png)


#Windows環境からSafari環境を検証するツール
[自分で仮想環境を立る方法](https://www.google.com/search?q=windows+%E4%BB%AE%E6%83%B3%E7%92%B0%E5%A2%83+mac&oq=windows+%E4%BB%AE%E6%83%B3%E7%92%B0%E5%A2%83%E3%80%80&aqs=chrome.2.69i57j0l5.5847j0j7&sourceid=chrome&ie=UTF-8)でもできそうでしたが、環境構築が面倒そうなので無料ツールを使いました。
↓
https://app.saucelabs.com/
というツールを利用することで、最新バージョンのSafariブラウザ同様のもので検証できました。
![yahoo_ydn_testing_for_itp_using_a_tool.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521810/73e233dc-a877-2604-1f7a-7a93e3829726.png)

#memo
追記：
無料版では2週間しか使えない模様
必要に応じて他のメアドで登録しなおす予定
→追記：エイリアスを付けたら同じメールアドレスでもいけた
PHPで週を扱う場合の注意点（ISO8601）

PHPに限った話ではないと思いますが、、、
他社実装のカレンダーにバグがあって、調査していて知ったので備忘録です。

2018年12月最終週のカレンダーは以下の通り

|  日  |  月  |  火  |  水  |  木  |  金  |  土  |
| ---- | ---- | ---- | ---- | ---- | ---- | ---- |
|  **30**  |  **31**  |  1  |  2  |  3  |  4  |  5  |

これを踏まえ、2018年の12月30日（日）、12月31日（月）がそれぞれ年の何周目かを表示します。
まずは12月30日（日）から。

```php
echo (new \DateTime('2018-12-30 00:00:00'))->format('W');
```

これは52が返ってきます。2018/12/30は年の52週目なんですね。
次に、2018/12/31について表示します。52を期待しましょう。

```php
echo (new \DateTime('2018-12-31 00:00:00'))->format('W');
```

「01」
何ということでしょう。
2018/12/31は年の1週目ということです。

これは、ISO8601に基づいているのでこのようになります。
同様に、2012/1/1は1周目ではなく52週目になります。

プログラムで週を扱うときは注意が必要ですね。

【参照】
https://ja.wikipedia.org/wiki/ISO_8601#%E5%B9%B4%E3%81%A8%E9%80%B1%E3%81%A8%E6%9B%9C%E6%97%A5
[Unity] [SkinnedMeshRenderer] Humanoidで使われるMesh

Humanoidで使われるMeshに関する情報をまとめておきます。
Humanoidで使うということでboneへウェイトが塗られていたり, blendShapeが設定されていたりするものを想定しています。
(このようなMeshは毎フレーム、ボーンの変化に対する頂点位置の計算などをする必要があるのでMeshRendererではなく必ずSkinnedMeshRendererに設定されている必要があります)

[SkinnedMeshRenderer　公式リファレンス](https://docs.unity3d.com/ja/2018.2/ScriptReference/SkinnedMeshRenderer.html)

# Mesh
[Mesh 公式リファレンス](https://docs.unity3d.com/ja/2017.4/ScriptReference/Mesh.html)
`SkinnedMeshRenderer.mesh`と`SkinnedMeshRenderer.sharedMesh`から取得できるが
前者はそのオブジェクト特有のメッシュで、変更しても他に影響がない
後者は変更によって同じメッシュを共有するオブジェクトに影響を与える

これを変更しただけではUnity再起動時に初期化されてしまうので
新しいMeshアセットとして書き出しておく必要があります。

### vertices
verticesに頂点の位置(Vector3)が入っている
Vector3の配列
`vertices.Length`が頂点数

メッシュ内のローカル座標なのでワールド座標として扱いたい場合は
`Transform.TransformPoint(Vector3 localPosition)`で変換する

normals(法線), uvs(uv情報), boneWeights(ウェイト情報)はindexでverticesと対応させている
(vertices配列のindex0のところに入っている頂点の法線はnormals配列のindex0に入っている)
`normals.Length` == `uvs.Length` == `boneWeights.Length` == `vertices.Length`

### triangles
trianglesはverticesのindex情報を持っている
(3つの頂点で1つのポリゴンとしているため, `triangles.Length`は3の倍数)
([0, 1, 2]や[3, 4, 5]が一つのポリゴン)
Unityでは時計回りがポリゴンの表側を表す

### SubMesh
小さなメッシュの単位。1つのSubMeshには必ず1つのマテリアルが適用されている
Meshのマテリアル数==submeshの個数==`Mesh.subMeshCount`

`Mesh.GetIndices(int submesh)`で特定のSubMeshに所属する頂点のindex配列を取得できる
（頂点そのものの情報ではない。あくまでMesh.verticesと対応付けられたindex）
`SkinnedMeshRenderer.sharedMaterials`で得られるMaterials配列のindexを引数に入れるとそのMaterialsに対応したSubMeshの情報を取得できる
頂点以外にもポリゴン(`Mesh.GetTriangles(int submesh)`)なども取得できる

### boneWeights
SkinnedMeshRendererしか持ちえない
boneIndex0~3は`SkinnedMeshRenderer.bones`のindex情報を持っている
weight0~3はウェイト情報(0~1)
`Mesh.boneWeights`で得た配列を変更した場合元データも変わってしまうため, 
元は変更させたくない場合は`Mesh.GetBoneWeights(List<BoneWeight> boneWeights)`を使う

### blendShape
SkinnedMeshRendererしか持ちえない
`SkinnedMeshRenderer.blendShapes`で取得可能

存在するblendShapeの名前や変化量の変更はできないので
`Mesh.ClearBlendShapes()`で一度削除して
新しい名前や変化量を設定して`Mesh.AddBlendShapeFrame()`で作成する必要がある

# 関連リンク・参考
http://edom18.hateblo.jp/entry/2017/06/09/080802
https://qiita.com/keito_takaishi/items/8e56d5117ee90502e864
【jsなし】Laravel でチェックボックス未選択時にデフォルト値(false)を使う

checkboxは選択外した時にリクエストには含まれません。
調べたところ`hidden`にし`js`で選択、非選択時に書き換えてそれを使うのを見ましたが、
Laravelならこれで出来そうっていうのがあったので、やってみます。

ミス、別の手法等がありましたら、ご指摘いただけますと幸いです。

#view
まずはview側
普通に何個かチェックボックスがあるのみ

```html:blade

<form action="{{route('test')}}" method="post">
    @csrf
    <input type="checkbox" value=1 name="c1">
    <input type="checkbox" value=1 name="c2">
    <input type="checkbox" value=1 name="c3">
</form>
```

#Request
FormRequestを作成します。

```
php artisan make:request CheckRequest
```

作成したら、`getValidatorInstance`をオーバーライドします。
送信されたものの値を優先するので、デフォルト側に上書きするようにmerge

```php:CheckRequest.php
    
    protected function getValidatorInstance()
    {
        // デフォルト
        $default = [
            'c1' => 0,
            'c2' => 0,
            'c3' => 0,
        ];
        $data = array_merge($default,$this->all());

        $this->getInputSource()->replace($data);

        return parent::getValidatorInstance();
    }

```

`dd($this->all(),$default,$data);`で
送信されたリクエスト、デフォルト、マージ後を出してみると下記のようになる。
`c3`は未選択なので送信されず、デフォルトのが使われています。
![SC000010.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174757/025f44bf-a906-fe38-9cde-68621051ca7b.jpeg)

あとは、バリデーションして登録するだけです。
SwiftDate の使用方法について (1)

# SwiftDateとは
説明：
（1）SwiftDateはSwift言語で開発されたDateライブラリーで、凄く簡単に日時処理が可能になります 。
主な機能：
（2）SwiftDateはほどんとの日時関連機能が揃えて、簡単な日時計算を含め、複雑な業務ロジックの簡単に実現できます。
例え： 
	•	演算子符の日時加減計算が可能です（例え：curDate + 2.week + 1.hour)
	•	比較演算子を対応します（例え <、>、==、<=、>=）
	•	簡単に日時の指定部分の取得修正操作ができます（例え、日時の月分のみ修正又は取得したい）
	•	通常、又は任意指定されたフォマットで日時出力できます
	•	.toString()メソットで、色んなフォマットの文字列形式の表示が可能です
	•	yesterday、tomorrowなど、特別な計算無しで、簡単な方法で取得できます
# インストールと初期設定
インストール
SwiftDateはSwift4.xから５まで対応されており、最新版は以下のUrlから取得可能です。
　https://github.com/malcommac/SwiftDate
上記URLから案内する通り、CocoaPods、Carthage、Swift Package Manager等のツールを利用してインストールする方法もありますが、以下ようにソースを直接追加する方法もあります。

ソースを直接追加してインストールする：
１、上記github.comから最新版のソースをダウンロードする。
２、ダウンロードされたソースのSwiftDate.xcodeprojを自分のプロジェクトにマウス操作で引張り込む。
３、プロジェクト -> General -> Embedded Binaries 項目中、iOS 版のSwiftDate.frameworkを追加する。
4、最後、ソースにSwiftDateを利用する部分で、importして宣言する。

但し、Regionの初期設定を行わないと時刻表示が現在地の時刻とずれるので、以下ように初期化処理が必要であります。
例え、日本時間の表示を設定したい場合は

```swift:AppDelegate.swift
    let japan = Region(calendar: Calendars.gregorian, zone: Zones.asiaTokyo, locale: Locales.japanese)
    SwiftDate.defaultRegion = japan
```

次回はSwiftDateの基本使用方法について説明いたします。

>iOS、Androidアプリの制作なら、https://origon.co.jp にお任せください
>信頼且つ満足できる製品を納品いたします

- [ ]  SwiftDate の使用方法について(2)　[引き続きを読む](https://qiita.com/ENIX/items/80a0cb29a439f11a76f3)
【DB】ACID特性についてまとめ【トランザクション】

最近DB ( SQL ) を勉強しているのですが、DB はすごくよくできたシステムだなーと思っています。（何様）

いままでは漠然と「すごいなー」とアホみたいな感想しかもっていなかったのですが、2分前に**『 ACID 特性』**という重要な概念を知り、「なにがすごいのか？」がある程度言語化できるようになったので、メモがてら Qiita に書くことにしました。

[こちらの書籍](https://www.amazon.co.jp/SQL-%E7%AC%AC2%E7%89%88-%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E6%93%8D%E4%BD%9C-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%AD%A6%E7%BF%92%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E3%83%9F%E3%83%83%E3%82%AF/dp/4798144452/ref=as_li_ss_tl?ie=UTF8&linkCode=ll1&tag=y063-22&linkId=2c2b3534cde2b572a0ba9fc8c711e105&language=ja_JP)を大いに参考にして書いていきます。

僕のように DB を学び始めたばかりの人に役立つような記事にしたいと思います。
DB 玄人の方々は、ミスを発見したら指摘していただけると嬉しいです。

## ACID 特性とは？

トランザクションが守るべき約束事です。
MySQLやPostgreSQLなど、さまざまなDBMS(データベースマネジメントシステム)がありますが、どのDBMSも守らなければならない絶対的な約束事、それが**ACID特性**です。

ちなみに、トランザクションとは、**データの更新単位**です。
例えば、「Aさんのemailアドレスを変更する」や、「Bさんがツイ消しする」が１つのトランザクションです。
厳密には違うのですが、この記事ではこのような理解で問題ありません。

**ACID** は **酸** という意味の英単語でもありますが、DBにおけるACIDには特に酸っぽさは感じませんでした。酸っぽさを感じた方はその酸っぽさをコメントしていただけると嬉しいです。

### 原子性 ( Atomicity )

トランザクションの実行時、そのトランザクションがすべて完了して終了するのか、一切なにも実行せず終了するのか、という **" ALL or NOTHING "** な性質が原子性です。

「これ以上分割できない単位」という意味で原子性という名前がつけられたそうです。やたらかっこいいですね。

### 一貫性 ( Consistency )

DBにあらかじめ設定されている制約を必ず守るという性質です。
例えば NOT NULL 制約が設定された列に NULL を入れることはできません。

当たり前といえば当たり前ですが、その当たり前を当たり前にしているのが一貫性です。当たり前ですね。

### 独立性 ( Isolation )

トランザクション同士が互いに干渉を受けないことを保証する性質です。

例えばAさんがトランザクション実行中のときに、Bさんもトランザクションを開始したとします。
そのときにAさんのトランザクションの中にBさんのトランザクションが入らないように隠蔽するのが **独立性** です。

これのおかげでデータが入れ子にならず、いい感じにデータを更新できるようにしてくれています。

### 永続性 ( Durability )

システム障害が起こってデータが消えても、なにかしらの方法で復元できるような機能を有している必要があるという性質です。

データ自体は消えてしまっても、そのデータを復元する機能をもっているというのが永続性です。

## おわりに

書いていて思いましたが、ACID特性はプロトコルのようなものですね。
どれも当たり前ではあるけれど、その当たり前があるからこそその上に立っていろいろなことができるようになります。

SQLはまだまだわからないことだらけですが、引き続き勉強がんばっていきます！

## 参考書籍

[SQL 第2版 ゼロからはじめるデータベース操作](https://www.amazon.co.jp/SQL-%E7%AC%AC2%E7%89%88-%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E6%93%8D%E4%BD%9C-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%AD%A6%E7%BF%92%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E3%83%9F%E3%83%83%E3%82%AF/dp/4798144452/ref=as_li_ss_tl?ie=UTF8&linkCode=ll1&tag=y063-22&linkId=2c2b3534cde2b572a0ba9fc8c711e105&language=ja_JP)
LeptonをPureThermal2とRaspberry Piで動かす。

# はじめに
　Leptonを触る機会があったのでRaspberry Piと組み合わせて，ドローンにのっけてみようかなと思い色々調べてみましたのでまとめます。

# 準備するもの
- Raspberry Pi 3 Model B
- Lepton3.5
- PureThermal2

# 結論から
　できてません・・・。PureThermalは，I2Cとシリアルによる制御にのようで，公式のクイックスタートでは全然始められません。時間がかかりそうなので，一旦終了で・・・。
　USB接続のGetThermalは普通に動きました。

# 参考記事
- [Lepton FLIR を Raspberry Pi で（ちゃんと）動作させる](https://qiita.com/yyasuda/items/338abfe812806e8e9357)
- [Raspberry PI で Lepton3.x を使う](https://qiita.com/higuchi-toshio-intec/items/da4f12e3e09426f45812)
Ruby Dateクラスの使い方2

# 今日の日付のDateインスタンスを取得する
Dateクラスのインスタンスを作るためにDate.newを使ってきたが、Dateクラスでは、```Date.today```とすることで、今日の日付のインスタンスを作ることができるようになっている。

```ruby:date.rb
require "date"
date1 = Date.today
puts date1
```
#### 結果
```
2019-11-12
```
Mac Catalinaでブラウザが重すぎになる


# はじめに

研究室のMacをCatalinaにしたところ、すべてのブラウザで

- ページが開けない
- 開くのに２０秒かかる
- 画像表示されない

など、重すぎ案件が発生しました。

そもそも研究室で使用しているMacが

- 2013
- 8G RAM
- HDD

のため、かなり厳しいスペックなのですが（家のほうが断然良いので、研究室でやりたくない）

Catalinaにする前は普通に動いていたのでなんか不具合っぽいので直すことにしました。

# 試したこと

## セーフモード

溜まったキャッシュを消して、カーネルの重要な部分のみで起動できる。


**電源を消した状態で「Shift」を押しながら起動すれば**、セーフモードになる。
その後、ログインしなくても、起動した時点でキャッシュは一新されているっぽい。

## NVRAMリセット

https://gori.me/mac/mac-tips/115967
によると

> NVRAMとは、Macの電源が入っていなくても特定の設定情報を保存しておく特殊なメモリ領域のことを指す。かつてはPowerPCベースのMacがあり、その場合は同じ領域がPRAMと呼ばれていたが、現在はすべてのマシーンがIntelベースとなっているため、NVRAMに保存されている。

Macの設定がNVRAMに保存されているらしい。
以前、家のPCでWindowsとデュアルブートしたとき、Windowsがデフォルトで起動され始めたときも、NVRAMリセットでなんか治った。

やり方は

**電源を消した状態で「Command Option P R」を押しながら起動すれば**、セーフモードになる。
長押しする。

## SMCリセット

Macの挙動がやばいときに実行する。
自分の環境では、「Shift Command Option」を押しながら起動する。

https://gori.me/mac/mac-tips/115967
> SMCのリセットを実行する場合、Macの種類によってやり方が異なる。デスクトップ型Macとノート型Macで異なるだけではなく、「Apple T2」チップを搭載しているモデルとそうではないモデルでやり方がさらに異なる。


やり方が異なり、あまり行わないほうが良いっぽい？


# 最後に

セーフモードとNVRAMリセットを行うと、挙動が改善されました。
おそらく、キャッシュらへんで変なゴミが溜まっていたのかと思います。

# 参考サイト

- https://gori.me/mac/mac-tips/115967
MacとWindowsでそれぞれ画面キャプチャ（スクリーンショット）を撮るショートカット

Macとwindowsを両刀使いしているとショートカットがごっちゃになることがありますが、
画面の画像を撮りたい時にスクショのショートカットもよく忘れるのでメモです。

## スクリーンショットのショートカット

### Mac（Mojave）

- 画面全体のスクショをファイルに保存する
``「command」＋「shift」＋「3」``

- 画面全体のスクショをクリップボードにコピーする
``「command」＋「shift」＋「control」+「3」``

- マウスで選択した範囲のみのスクショをファイルに保存する
``「command」＋「shift」＋「4」``

- マウスで選択した範囲のみのスクショをクリップボードにコピーする
``「command」＋「shift」＋「control」+「4」``

### Windows10

- 画面全体のスクショをクリップボートにコピーする
``「PrtScr」``
※ノートPCなどの場合は``「Fn」＋「PrtScr」``の場合もあります

- 手前にあるアクティブなウィンドウ（モーダル）のみのスクショをクリップボードにコピーする
``「Alt」＋「PrtScr」``

- 画面全体のスクショをファイルに保存する
``「Win」＋「PrintScreen」``
「ピクチャ」フォルダにファイルが自動保存されます。

- アクティブなウィンドウのみのスクショをファイルに保存する
``「Win」＋「PrintScreen」＋「Alt」``
「ビデオ」→「キャプチャ」フォルダにファイルが保存されます。
（スクショは「ピクチャ」でなぜかこちらは「ビデオ」「キャプチャ」です…）

- 「切り取り＆スケッチ」で範囲選択したスクショをクリップボードに保存する
``「Win」＋「Shift」＋「S」``
範囲選択すると右下に通知が出るので通知をクリックするとスケッチでファイル保存できます。


Macはファイル自動保存がデフォルトなので便利だなと思っていましたが、
windows10になってからスクショ機能もパターンが増えたので使ってみると意外に便利ですね！
jQueryで右クリックと左クリックを取得

jQueryで右クリックと左クリックを取得するメモ
右クリックの場合は、コンテキストのキャンセルが肝てきな

<p class="codepen" data-height="446" data-theme-id="dark" data-default-tab="js,result" data-user="mmt-codepen" data-slug-hash="gOOjyZe" style="height: 446px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="jQueryで右クリックと左クリックを取得">
  <span>See the Pen <a href="https://codepen.io/mmt-codepen/pen/gOOjyZe">
  jQueryで右クリックと左クリックを取得</a> by MMT (<a href="https://codepen.io/mmt-codepen">@mmt-codepen</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

##参考サイト
https://teratail.com/questions/2094
強化学習３　OpenAIインストール

強化学習２までが前提になります。
py37envにOpenAIをインストールします。

```bash
pip install gym
pip install gym[atari]
```
さらに、openGLなどもインストールしておきます。

```bash
sudo apt install python-opengl cmake zlib1g-dev
```

windowsは少し違うので、強化学習12にまとめて書きます。
RockyLinux 8にblast+をインストール

## 環境
* RockyLinux 8.9 (Core) minimal installationからを想定
* root権限あり

## インストール方法

```bash
# インストール先のディレクトリを指定する。自由に指定して良い。
BLASTINSDIR="/usr/local/package/blastplus/2.15.0"
# 事前に必要なパッケージを入れておく
dnf -y install wget perl libnsl
dnf -y install perl-Archive-Tar perl-List-MoreUtils
# あらかじめインストール先のディレクトリを作っておく。
mkdir -p ${BLASTINSDIR}
wget https://ftp.ncbi.nlm.nih.gov/blast/executables/blast+/LATEST/ncbi-blast-2.15.0+-3.x86_64.rpm
#blast+ 2.15.0 のインストール
rpm -Uvh --prefix=${BLASTINSDIR} ncbi-blast-2.15.0+-3.x86_64.rpm
```
あとはこのインストール先`${BLASTINSDIR}`にPATHを通し、必要であればデータベースもインストールしておく。
VSCodeで、cmd+Pでファイルを開く時に常に新しいタブで開く

# はじめに
VSCodeで開発してて、あのファイルを開きたいなぁ・・・
毎回ツリーから探すのはめんどくさい、cmd+Pで検索して
開いt・・・おい、さっきまで開いてたタブの上に展開されてる！
さっきのも見ながら作業したいのに！！！

というわけで、cmd+Pでファイル検索して開く時に、
常に新しいタブで開くやり方です。

# cmd+Pで開かれたファイル
添付写真の左は普通にツリーからダブルクリック開いたファイルで
右がcmd+Pで検索（もしくはシングルクリック）して開いたファイルです。
<img width="413" alt="new_html_haml_—_checkme.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489761/3f167d22-eac4-9558-5fb8-05195383d393.png">
よく見ると、右のファイル名がイタリック（斜め）になっているのが確認できます。

VSCodeでは「プレビューモード」が備わっており、イタリック表示になっているのは
プレビューモードで開かれていることを意味しています。
プレビューされているファイルは、他のファイルをクリックしたり、検索して開いたり
すると今のプレビューを閉じて新しいファイルをプレビュー表示するという動きをします。

一方、左側のタブは「編集モード」になっており、他のファイルを開いても
勝手に閉じられることはありません。

# プレビューモードを解除して編集モードにする
プレビューモードを解除するには、以下の２つのやり方があります。

- ツリーから、今開いているファイル名をシングルクリックする
- ファイルを開く時、ツリーにあるファイルをダブルクリックする

# 毎回編集モードで開くには
そうはいっても、cmd+Pで開いた後にまたツリー上のファイルをクリックするのは
非常にめんどくさいので、プレビューモードをオフにしてしまいます。

左上のCode → 設定 →　基本設定
もしくは、「cmd + ,」
で設定画面を開き、下記画面のように設定します。
<img width="1061" alt="設定_—_checkme.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489761/0b6128e3-dfc9-af41-d79d-ce73dc2d0a3d.png">

これで、毎回編集モードでファイルが開かれるため、
勝手に閉じられることを防げます。

# 参考
https://stackoverflow.com/questions/38713405/open-files-always-in-a-new-tab
強化学習２　chainerrlのインストール

強化学習１が終了しているのが前提です。

anacondaに環境を作ります。

```bash
conda create --name chainer python=3.7
conda activate chainer
```

今後は、chainerで作業を進めます。

```bash
conda install cupy chainer
```
chainerはcondaインストールできますが、rlはダメです。
クイックタートガイドに沿ってインストールします。

```bash
sudo apt install xvfb freeglut3-dev ffmpeg
pip install chainerrl
pip install pyglet
pip install pyopengl
pip install pyvirtualdisplay
```

windowsは少し違うので、まとめて強化学習１２に書きます。
※一部書き直しました。(11/13)
Selenium php-webdriverでよく使うChromeオプション

php-webdriverを使ってChrome操作する時によく使うオプションメモ

```selenium.php
$options = new ChromeOptions();

//ヘッドレスモードを有効にする
$options->addArguments( [ '--headless' ] );

//シークレットモードを有効にする
$options->addArguments( [ '--incognito' ] );

//プロキシサーバーを設定する
$proxy = "xxx.xxx.xxx.xxx:xxxx";
$options->addArguments( [ '--proxy-server='.$proxy] );

//ブラウザデータ保存先を任意指定する
$tmp = "/tmp/chrome/";
$options->addArguments( [ 'user-data-dir='.$tmp]);

//言語を指定する(日本語)
$options->addArguments( [ '--lang=ja-JP' ] );

//UserAgentを指定する
$UserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36";
$options->addArguments( [ '--user-agent=' . $UserAgent ] );

//起動時の画面幅を指定する
$width  = 1280;
$height = 1024;
$options->addArguments( [ "window-size={$width},{$height}" ] );

$capabilities = DesiredCapabilities::chrome();
$capabilities->setCapability( ChromeOptions::CAPABILITY, $options );
try{
   $driver = RemoteWebDriver::create( $this->selenium_server, $capabilities );
〜〜以下略〜〜

//ヘッドレスモードでファイルをダウンロードする場合の問題を回避
//クラスを継承しておく必要があります extends Facebook\WebDriver\Remote\HttpCommandExecutor
$commands = parent::$commands;
$commands['chromiumSendCommand'] = [ 'method' => 'POST', 'url' => '/session/:sessionId/chromium/send_command' ];
self::$commands = $commands;
//DL場所を指定する
$dl_path = "/tmp"
$driver->execute('chromiumSendCommand', [
   'cmd'    => 'Page.setDownloadBehavior',
   'params' => [ 'behavior' => 'allow', 'downloadPath' => $dl_path ],
]);


```


参考リンク
[php-webdriver](https://github.com/facebook/php-webdriver)
Bitnami RedmineにTestLinkを追加

# 前提
- VirtualBox
- Debian10
- Bitnami Redmine

# やりたい事
- Bitnami RedmineにTestLikを共存させて、連動設定を行う

## TestLinkのインストール

※rootでのインストールを前提としています

### インストールファイルの用意

```shell:command
# homeへ移動
cd /home
# Githubからインストールイメージをダウンロード
wget https://github.com/TestLinkOpenSourceTRMS/testlink-code/archive/1.9.19.tar.gz -O testlink_code-1.9.19.tar.gz
# 解凍
tar -zxvf /home/testlink_code-1.9.19.tar.gz
# インストールディレクトリを用意
mkdir /opt/[redmine]/apps/testlink
mkdir /opt/[redmine]/apps/testlink/htdocs
mkdir /opt/[redmine]/apps/testlink/conf
# インストールディレクトリへ移動
mv /home/testlink-code-1.9.19/* /opt/[redmine]/apps/testlink/htdocs/
```

### 設定ファイルの作成

- 公開ディレクトリに設定

```shell:command
nano /opt/redmine/apps/testlink/conf/httpd-testlink.conf
```

```conf:httpd-testlink.conf
Alias /testlink "/opt/redmine/apps/testlink/htdocs"
<Directory "/opt/redmine/apps/testlink/htdocs">
    AllowOverride None
    Options None
    Require all granted
</Directory>
```

- TestLink設定ファイルの読み込み設定

```shell:command
nano /opt/redmine/apache2/conf/httpd.conf
```

```conf:httpd.conf
Include "/opt/redmine/apps/testlink/conf/httpd-testlink.conf"
# ↑この一文を最後に追加
```

- TestLinkの設定変更

```shell:cmmand
nano /opt/redmine/apps/testlink/htdocs/config.inc.php
```

```php:config.inc.php
// $tlCfg->log_path = '/var/testlink/logs/'; /* unix example */
$tlCfg->log_path = '/opt/redmine/apps/testlink/htdocs/logs/';

// $g_repositoryPath = '/var/testlink/upload_area/'; / unix example */
$g_repositoryPath = '/opt/redmine/apps/testlink/htdocs/upload_area/';
```

### オーナーとアクセス権限の変更

※アクセス権限を変更しておかないと後でコケます

```shell:command
chown -R root:daemon /opt/redmine/apps/testlink/
chmod -R 777 /opt/redmine/apps/testlink/
# ↑apache2に書き込み権限が無いとコケるっぽい
```

### Bitnami Redmine(apache2のみでも可)を再起動

```shell:command
/opt/redmine/ctlscript.sh restart
```

### インストール

- http://[localhost]/testlink　にアクセスして画面の指示に従ってインストール
※以後はインストールガイダンスに従ってのインストールなので割愛。
aws-lambda-go/cmd/build-lambda-zipをgo get時のエラー

何をしていたか
-------------

* https://qiita.com/shunp/items/52ee20278e02e29ef3e8

此方の記事を参考に、sam cliにてgolang, API gateway を試用していたところ、エラーに遭遇しました。

環境
------

* windows10 Pro

```
>sam --version
SAM CLI, version 0.31.0
```

詳細
-------

*  https://qiita.com/shunp/items/52ee20278e02e29ef3e8#%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E5%AE%9F%E8%A1%8C

ローカル実行は問題無し。API gatewayからRequestしたところ、502エラーが出ました。

[もろもろの記事][1]を見ると、`build-lambda-zip` をbuild時に実行し、zipファイルをS3へuploadすればよさそうです。

```makefile

build:
        GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o hello-world/hello-world ./hello-world
        ${GOPATH}\bin\build-lambda-zip.exe -o hello-world/hello-world.zip hello-world/hello-world
```

こちらの`build-lambda-zip.exe` をinstall。

* https://github.com/aws/aws-lambda-go#for-developers-on-windows
* `go.exe get -u github.com/aws/aws-lambda-go/cmd/build-lambda-zip`

エラー。

```
>go.exe get -u github.com/aws/aws-lambda-go/cmd/build-lambda-zip
# github.com/aws/aws-lambda-go/cmd/build-lambda-zip
src\github.com\aws\aws-lambda-go\cmd\build-lambda-zip\main.go:19:17: cannot use cli.StringFlag literal (type cli.StringFlag) as type cli.Flag in array or slice literal:
        cli.StringFlag does not implement cli.Flag (Apply method has pointer receiver)
```

解決策
------

* v2ブランチである `github.com/urfave/cli` が不安定なので、v1をinstallすればよいとのこと。
* https://github.com/urfave/cli/issues/459

1. `go get gopkg.in/urfave/cli.v1`
1. `src\github.com\aws\aws-lambda-go\cmd\build-lambda-zip\main.go` を下記のように変更
1. `go.exe get -u github.com/aws/aws-lambda-go/cmd/build-lambda-zip`

```golang
import (
	"archive/zip"
	"errors"
	"fmt"
	"io/ioutil"
	"os"
	"path/filepath"

	// "github.com/urfave/cli"
	"gopkg.in/urfave/cli.v1"
)
```

これで問題なくexeファイルが作成されました。

補遺
-----

最後に、makeファイルを変更し、zipファイルをuploadしてあげます。

```makefile
build:
	GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o hello-world/hello-world ./hello-world
	${GOPATH}\bin\build-lambda-zip.exe -o hello-world/hello-world.zip hello-world/hello-world
package:
	sam package --template-file template.yaml --output-template-file output-template.yaml --s3-bucket sam-template-store-dev-kubosuke --profile *****

deploy:
	sam deploy --template-file output-template.yaml --stack-name kubosuke --capabilities CAPABILITY_IAM --profile *****
```

`SAMご利用の方は` `CodeUri: hello-world/hello-world.zip` を忘れずに

[1]:https://github.com/awslabs/aws-sam-cli/issues/274
Ansible Towerで追加したAnsibleモジュールを動かす方法

# Ansible Towerとは
AnsibleをWeb GUIで実行できるRed Hatの製品です。
動作部分では同じくAnsible Enginが動いていますが、サーバーの中に入ってAnsibleを動かすのとは少し勝手が違いました。
Ansibleをインストールすると使える標準モジュールではなく、追加で入れたモジュールを動かす為にどうしたら・・・となったのでメモ。
環境は以下です。

* RHEL: 7.7
* Ansible Tower: 3.5.3
* Ansible version: 2.8.2
* Python: 2.7.5 & 3.6.8

# Ansible モジュールの追加について
標準のAnsibleでモジュールを追加するお作法については[公式の手順](https://docs.ansible.com/ansible/latest/dev_guide/developing_locally.html
)ですんなりいきます。
今回ハマったのは、サーバーの中に入ってAnsibleを実行すると上手くいくけど、Towerからじゃうまくいかない。。
他のエラーも併発したのではげそうでした。

# Ansible TowerでのPlaybook実行にPython3を使用する時の落とし穴
モジュールの追加には関係ありませんが、私が追加したモジュールでは使用するPythonが2ではなく3系ではないといけなくて、["ansible_python_interpreter"](https://docs.ansible.com/ansible/latest/reference_appendices/python_3_support.html)でRHEL7に追加インストールしたPython3を使うように指定していました。
普通のAnsibleでは正常にpython3で実行できていたのですが、Towerで動かすとこんなエラーが。。。

~~~jinja
AttributeError: module 'enum' has no attribute 'IntFlag'
~~~

結論、私の環境では以下のenum34が悪さしていましたのでバルスすることでfixしました。
※サーバーローカルのpipではなく、Ansible Towerのvenvで入ってきたpipのenum34です

~~~console
# /var/lib/awx/venv/ansible/bin/pip uninstall enum34
~~~

# Tower上に追加したモジュールの環境変数を追加
ようやく本題ですが、上のenumバグをfixすると、次はこのエラーです。

~~~jinja
<module>ImportError: cannot import name 'ModuleName'
~~~
ここで初めて、***あ、読み込めてないんだ***と察した結果、Ansible Towerの設定に環境変数を追加する箇所があり、["ANSIBLE_LIBRARY"の設定](https://docs.ansible.com/ansible/latest/dev_guide/developing_locally.html)をJSONにして登録する事でめでたく正常に実行する事ができました。

~~~json
{
 "ANSIBLE_LIBRARY": "/usr/share/ansible/plugins/modules/<added module name>",
 "ANSIBLE_MODULE_UTILS": "/usr/share/ansible/plugins/modules/<added module name>/module_utils/"
}
~~~

設定する場所は、Ansible Towerの設定>ジョブ>追加の環境変数です。
JSでHTMLのvideoタグをコントロールで頭出し再生

jqueryで指定したら上手くいかなかったので
バニラJSしたら上手くできたメモ。。

###HTML
```html
<video id="video-target" autoplay muted playsinline loop poster="/assets/img/video.png">
<source src="/assets/mov/video.mp4" type="video/mp4" />
<img src="/assets/img/video.png" />
</video>
```

###JS
```js
var media = document.getElementById("video-target");
if (media) {
  console.log(media);
  media.currentTime = 0; //先頭へ
}
```

###JS(jQuery)
```js
var media = $("#video-target");
if (media) {
  console.log(media);
  media.currentTime = 0; //先頭へ
}
```


##参考サイト
https://msdn.microsoft.com/ja-jp/windows/hh924823(v=vs.110)
fadeIn addClassを使用したスライドインアウト

```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>SlideIn_Out</title>
<link rel="stylesheet" href="assets/style.css">
<!-- グーグルからライブラリを取得 -->
<script <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>

<body>
 
<button class="button-fade">フェードイン</button>
<div class="fade youso">
  <p>Fade In !</p>
  <p>Fade In !</p>
  <p>Fade In !</p>
</div>

<button class="button-slidein">スライドイン</button>
<div class="showDown youso">
  <p>Fade In !</p>
  <p>Fade In !</p>
  <p>Fade In !</p>
</div>

<button class="button-slideout">スライドアウト</button>
<div class="showUp2 youso">
  <p>Fade Out !</p>
  <p>Fade Out !</p>
  <p>Fade Out !</p>
</div>

<button class="button-repeat">インアウト</button>
<div class="showDown3 youso">
  <p>Fade Out !</p>
  <p>Fade Out !</p>
  <p>Fade Out !</p>
</div>

<script>
$(function() {
  //'フェードイン'をクリックしたら発動
  $('.button-fade').click(function() {
    // 0.5秒でフェードイン
    $('.fade').fadeIn('0.5');
    //フェードアウトしたい場合はfadeOut('任意');
  });
  
  //'スライド'をクリックしたら発動
  $(".button-slidein").click(function(){
  //.showUpクラスを追加することで.slideのcss設定を上書き
  	$(".showDown").addClass("showUp");
  });
  
  //'フェードアウト'をクリックしたら発動
  $(".button-slideout").click(function(){
  //.showUpクラスを追加することで.slideのcss設定を上書き
  	$(".showUp2").addClass("showDown2");
  });
  
  //'インアウト'をクリックしたら発動
  $(".button-repeat").click(function(){
  //.toggleClassで動作を繰り返すことができる
  	$(".showDown3").toggleClass("showUp3");
  });
  	
});
</script>

</body>
</html>
```

```css
/* フェードイン */
.fade{
	display: none;
}

/* スライドイン */
.showDown{
  opacity: 0;
  transition: .7s;
  margin-top: 60px;
}
.showUp{
  opacity: 1;
  margin-top: 0;
}

/* スライドアウト
   cssの記述順をスライドインの場合と逆にしなくてはいけない
*/
.showUp2{
  opacity: 1;
  transition: .7s;
  margin-top: 0;
}
.showDown2{
  opacity: 0;
  margin-top: 60px;
}

/* インアウト */
.showDown3{
  opacity: 0;
  transition: .7s;
  margin-top: 60px;
}
.showUp3{
  opacity: 1;
  margin-top: 0;
}

button{
	display:block;
}
.youso{
	width: 150px;
	height: 150px;
	overflow: hidden;
	background-color: pink;
}
```
実用性の高いslideUp,slideDownについては以下を参照
[slideUp slideDown](https://qiita.com/Shororo/items/2bd8f67160ae487f6a34)
Railsのparamsはキーのstringとsymbolの違いを隠蔽してくれる

私が今日知ったプチ衝撃の事実！

Railsの```params```では、<b>Hashの機能が拡張されているためキーの型に関係なく値を取ってくることができる！！</b>
つまり…

```ruby
h = { :last_name => "山下", "first_name" => "智久" }

#キーに指定した要素の型で値を取ってくることができる
h[:last_name]   #=> "山下"
h["first_name"] #=> "智久"

#指定した要素とは違う型で値を取ってくることはできない
h["last_name"] #=> nil
h[:first_name] #=> nil
```
stringとsymbolが間違っていると取ってくることができない。

```ruby
#(railsの場合)
#railsで受け取ったparams
params
　　=> <ActionController::Parameters {"last_name"=>"山下", "first_name"=>"智久"}>

#paramsの見た目はHashだが、ActionController::Parametersのインスタンス
params.class
　　=> ActionController::Parameters

#キーの型に関係なく値を取ってくることができる！
params["last_name"]  #=> "山下"
params["first_name"] #=> "智久"
params[:last_name] #=> "山下"
params[:first_name] #=> "智久"
```

railsを書いている限りは、コントローラでparamsを受け取って処理をするときなどキーの型を気にしなくてもよしなにやってくれる。怖い…

### ちなみに
string => symbolに変換してくれるmethodは```to_sym```

```ruby
god = "tomohisa"
p god.to_sym
     => :tomohisa
```

paramsの中身を眺めていたときに、なんでこれまでsymbolとstringテキトーにやってきたのに値がとれてたんだ？と思って知ったことでした。
クッキーとかセッションとか🍪🗝

クッキーやセッションについて、本で読んでも「へぇ〜〜〜」みたいな感じで終わってしまうので手を動かして学んでみた。

## そもそもクッキーとセッションとはなんなんだ？
### クッキー
クライアント側にデータを保持する仕組みのこと。
### セッション
サーバー側にデータを保持する仕組みのこと。
この保持したデータを取り出すには```session_id```が必要。この```session_id```をcookieとしてクライアント側に保持する。
つまり、```session_id```は鍵🗝でこれを使うことでサーバー側のデータにアクセスすることができる！

なぜこうしてデータを保持しなければいけないかと言うと、例えば「ログイン状態を保持する」みたいな機能をつくりたいときに、HTTPにはデータを保持する仕組みがない。なので一時的/少量のデータをサーバーに持たせる必要がある。

## PHPでわかるクッキーとセッション
サーバーにログインして```session_test.html```とかテキトーな名前のファイルを作成し、以下のページを見ながら
`session状態を開始し、session_idを画面に表示する、セッション変数を決めて保存してみる`
というのを一通りやってみた。
めちゃくちゃシンプルに`サーバー側とクライアント側で保持する`部分がわかる！
ブラウザ側のURL窓の横からcookieを確認しておくとなお◎

## Railsでもやってみよう
coming soon...
rails 発展その10 レシーバ　self

コードを書いていくと内容の繰り返しが多くなりやすくなるので
それを省略できる方法のまとめを使用と思います。

## レシーバ
インスタンスメソッドを利用するインスタンス自身のことです。

```ruby
   re = "9"
   #以下の式のレシーバはstr
   re.to_i #=> 9
```

## self
インスタンスメソッドの中でselfと書くと
そのメソッドを利用したレシーバ自身が代入された変数のように扱うことができます。

```ruby
  class Integer
    def kake?
      if self * 10 == 1
        return true
      else
        return false
      end
    end
  end
  10.kake?  #=> false(*は乗算を求めるもので、1ではないのでfalseが返ってくる)
```

## railsでの使用例

ポイントの平均を求めたいメソッドを打つ場合

```ruby:controller
  class Product < ApplicationRecord

  def point_average
    self.points.average(:rate).round
  end

  # selfの省略も可能
  def point_average
    points.average(:rate).round 
  end
end
```

仮にクラス名をその都度合わせるコードを描きたい場合は

```html:view
   <i class="point rate-<%= product.point_average %>0"></i>
　　
   <!--これでコントローラーからproductをレシーバとしてpoint_averageのメソッドを使うことができます。-->
```
vim terminalでデフォルトのターミナル幅を、縦横で分けたい

++rows, ++cols で制御してるらしい。

なので、.vimrcに以下のように書く

```
nnoremap <C-x>s :bot  term ++close ++rows=12<CR>
nnoremap <C-x>v :vert term ++close ++cols=66<CR>
```

以上です
bundle execとは

```rails s bundle exec```の```bundle exec```、聞いたことあるけど特に書かなくても問題なく動いてきたのでずっと「なんかgemをいい感じにしてくれるもの」くらいの認識でいました。
多分、そろそろきちんと知っておいた方がいいので調べてみた。

[bundle execはなぜ必要なのか](https://qiita.com/diskkid/items/0d000a42df04c561ca0f)

要するに、gemをいい感じにしてくれるものでした。

…それでは何もアップデートがないので、もう少し踏み込んでまとめると、```gem A```と```gem B```があるとする。
```プロジェクトA```ではA,B両方使っていて依存関係があり、```プロジェクトB```ではAだけ使っている場合、```gemB```にアップデートがあるなんてことがあると```プロジェクトB```では勝手にアップデートしてくれという感じだが```プロジェクトA```では```gem A```に影響が出てしまうのでそれは困る。
ここら辺を、プロジェクトごとに臨機応変にバージョン管理してくれるのがbundlerの役割らしい。

便利やん！！

今作っているようなプロダクトだとほとんどgemを使っていないので特に問題ないが、gemがいっぱいあるときには必須なのだと思いました。
Heroku入門(Windows)

#1.Heroku Sign up
https://signup.heroku.com/

#2.Git及びHeroku CLIインストール
- [Gitインストール](https://devcenter.heroku.com/articles/heroku-cli)
- [Heroku CLIインストール](https://devcenter.heroku.com/articles/heroku-cli)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/526d47cc-0085-f9f4-9e62-0e16ec79d689.png)

##4.アプリ作成
##4.1.Herokuにログイン
```
Microsoft Windows [Version 10.0.18362.418]
(c) 2019 Microsoft Corporation. All rights reserved.

C:\Users\bjo>heroku login
heroku: Press any key to open up the browser to login or q to exit:
Opening browser to https://cli-auth.heroku.com/auth/browser/4d922b8e-78ce-4756-adf6-e190494bbc77
Logging in... done
Logged in as xuwenzhen2020+heroku@gmail.com
```
##4.2.ロカールアプリ作成
```
C:\Users\bjo>mkdir heroku1
C:\Users\bjo>cd heroku1
C:\Users\bjo\heroku1>notepad index.php
C:\Users\bjo\heroku1>type index.php
<?php

echo "Hello, Heroku!!!";
C:\Users\bjo\heroku1>notepad composer.json
C:\Users\bjo\heroku1>type composer.json
```
##4.3.Gitリポジトリ初期化
```
C:\Users\bjo\heroku1>git init
C:\Users\bjo\heroku1>git add .
C:\Users\bjo\heroku1>git commit -m "hello heroku commit"
```
##4.4.Herokuにアプリ作成
```
C:\Users\bjo\heroku1>heroku create
```
##4.5.アプリをデプロイ
```
C:\Users\bjo\heroku1>git push heroku master
```

##4.6.アプリをブラウザで確認
```
C:\Users\bjo\heroku1>heroku open
```

##5.参照資料##
- [Heroku初心者がHello, Herokuをしてみる](https://qiita.com/arashida/items/b2f2e01259238235e187)

`Command`

- git --version
- git --help
- heroku version
- heroku help
- **[Gitコマンド早見表](https://qiita.com/kohga/items/dccf135b0af395f69144)**
- **[Heroku操作 CLI](https://qiita.com/ntkgcj/items/9e812220881d671b6bff)**

`基礎知識`

- [Salesforce と Heroku のインテグレーション](https://trailhead.salesforce.com/ja/content/learn/trails/heroku_enterprise)
rebaseとは

![IMG_20181025_170659.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356480/e58b8301-2c08-adc5-bdc1-d54065c3de1b.jpeg)

ブランチ切って作業をしているときに、他の人がmasterに変更を加えていた場合に、シレッと今のmasterの先頭から自分がそのブランチを切って作業しているような状態にしたい。という場合はrebaseする。

### 手順
①```git checkout master```
masterにチェックアウト
②```git pull```
まずはmasterを最新の状態に進める
③```git checkout topic```
topicに戻る
④```git rebase  master```
今のtopicをぎゅいんと最新にしたmasterの先にくっつける
（⑤masterのどこかのcommitでconflictした場合は、それを修正してrebaseを繰り返す）