OmniAICreator/Qiita-1.07M huggingface dataset:
value-domainでやってはいけない設定

# value-domainでドハマリしました。

AWSのWorkMailと、value-domainを繋ごうと思っていたのですが、
何時間もハマってしまい、なかなかドメイン部分がVerifyになりませんでした。
MXレコードが怪しいと思ってずっとやっていたのですが全然そこじゃありませんでした。

## ハマっていたDNS設定

```
cname www xxxxlb.ap-northeast-1.elb.amazonaws.com.
cname @ www
txt _amazonses.xxxxxx.com. SCvxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
mx inbound-smtp.us-east-1.amazonaws.com. 10 @
他は略
```

## 悪い部分

患部はここでした。
サブドメインなしの部分にCNAMEは、使ってはいけないようでした。
この部分を削除してあげることにより、WorkMailは有効になりました。

```
cname @ www
```
SwiftUI Image(systemName:)で使用するアイコン名の一覧

## はじめに

SwiftUIのImage(systemName:)で使用できるアイコン名ってどこに書いてあるのかわからないかったので調べてみましたので備忘録兼ねて残します。
SF Symbolのものが使えるようです。

## SF Symbolとは?
新しくアプリで使用可能なシンボルセットが公開されました。
San Francisco システムフォントと親和性の高いシンボルセットです。
（アプリ内のボタンやツールバー、アラートなど様々な場所で使われるアイコンセットのこと）

>SF Symbolsは、アプリで使用できる1,500を超える一貫した高度に構成可能なシンボルのセットを提供します。
>Appleは、サンフランシスコのシステムフォントとシームレスに統合するようにSFシンボルを設計しました。
>そのため、シンボルは、すべての重量とサイズのテキストと光学的に垂直に自動的に整列します。SFシンボルは、幅広い重量とスケールで利用でき、適応可能なデザインを作成するのに役立ちます。

## 一覧の場所

以下のヒューマンインターフェースガイドラインの中からSF Symbolアプリをダウンロードして使用できるアイコンの一覧を確認することができます。

ダウンロードのリンクは以下にあります。
https://developer.apple.com/design/human-interface-guidelines/sf-symbols/overview/

### SF Symbolアプリの対応環境

- iOS 13以降
- watchOS 6以降
- tvOS 13以降

## カスタムシンボル

なお、SF Symbolに、必要なシンボルが存在しない場合は、カスタマイズ可能です。
シンボルをテンプレートとして再利用可能なベクターベースのファイル形式でエクスポートすることができるので、編集アプリで目的に似たデザインのSFシンボルを元にカスタムできます。

(一部のシンボルは、カスタマイズ用のテンプレートとしてエクスポートできないようです。)


## ライセンスについて
>すべてのSFシンボルは、XcodeおよびApple SDKのライセンス契約で定義されているシステム提供のイメージであると見なされ、そこに記載されている契約条件が適用されます。アプリのアイコン、ロゴ、またはその他の商標関連の用途では、SFシンボル（または実質的または混乱を招くような類似のグリフ）を使用できません。Appleは、前述の制限に違反して使用されたシンボルのレビューおよび独自の裁量での使用の変更または中止を要求する権利を留保し、お客様はかかる要求に速やかに準拠することに同意します。

## SF Symbolアプリのスクリーンショット

<img width="1196" alt="スクリーンショット 2019-09-26 16.51.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184792/8445987d-ecfe-4c7d-3ffd-430508931aa5.png">

このように一覧で見れるようになります。

以上です。
ご覧いただきありがとうございました。
KubeEdge環境をk3sで構築してみた

## TL;DR

k3s上でもKubeEdgeを動かすことができる！(すごい)
kubeadmで構築するよりも簡単(個人の感想)で、より「エッジ」に適したk3s上に構築する方がいいのかもしれません

## はじめに

<p><b>「次はKubeEdgeのExampleを試すと言ったな、あれは嘘だ。」</b></p>

はいどうも
[前回の記事](https://qiita.com/S-dwinter/items/f1e92f21d4b23fbbba80)でKubeEdgeをEC2インスタンス上に構築してみましたが、あるお方が言いました

???「k3s上でも動かないのかな」

確かに気になりますね！
ということで、早速試してみました

## 環境

前回に引き続き、AWSのEC2インスタンス上に構築します

### バージョン

今回も現時点(2019/09)での最新版を使用しました
前回からKubeEdgeのマイナーバージョンが上がっています

* k3s: 0.9.1
* KubeEdge: 1.1.0

### マシンスペック

前回の反省を活かし、今回はスペックを落としました
マスタとエッジ両方同じスペックです

* OS: Ubuntu 18.04 LTS
* CPU: 2
* Memory: 4GB
* Storage: 8GiB

## 構築手順

構築手順は基本的には前回と変わりませんが、k3sで動かすために少し変更を加えています
今回は差分を示しながら解説したいと思いますので、割愛部分は前回と同じと思って下さい
※バージョンが書かれたところは適宜、読み替えて下さい

では早速、解説していきます

### マスタ

まずは、k3sをインストールします
と言っても、用意されたスクリプトを実行するだけです(便利)

```bash
sudo su -
curl -sfL https://get.k3s.io | sh -
```

無事インストールできたら、KubeEdge用に少し変更を加えます
`server \`の次の行に以下を追記し再起動します

```bash
vim /etc/systemd/system/k3s.service
+ --http-listen-port 8080

systemctl daemon-reload
systemctl restart k3s

# 確認
kubectl get nodes
ss -ntlp | grep 8080
```

これでk3sの構築は完了です
あとで必要になるので`/var/lib/rancher/k3s/server/node-token`の文字列を控えておきます

あとは前回と同じ手順でマスタ側のKubeEdgeを構築するだけです
ただし、バージョンが上がったことで実行コマンドが少し変わっています

```bash
cd /etc/kubeedge/cloud
nohup ./cloudcore/cloudcore > cloudcore.log 2>&1 &
tail cloudcore.log # 確認
```

### エッジ

次はエッジ側です
こちらでもk3sをインストールします
先程控えておいた文字列を使ってk3sクラスタに参加させます

```bash
sudo su -
curl -sfL https://get.k3s.io | K3S_URL=https://<マスタのIP>:6443 K3S_TOKEN="<先程控えた文列>" sh -
```

エッジ側のk3sのインストールはこれで完了です(簡単)

あとは前回と同じ要領でKubeEdgeを構築するだけですが、ここでもひと工夫が必要です
追加で編集した部分のみ抜粋します

```bash
cd /etc/kubeedge/edge
vim conf/edge.yaml
- runtime-type: docker
+ runtime-type: remote
- remote-runtime-endpoint: unix:///var/run/dockershim.sock
+ remote-runtime-endpoint: unix:///var/run/k3s/containerd/containerd.sock
- remote-image-endpoint: unix:///var/run/dockershim.sock
+ remote-image-endpoint: unix:///var/run/k3s/containerd/containerd.sock

nohup ./edgecore > edgecore.log 2>&1 &
tail edgecore.log # 確認
```

今回はDockerを使っていないので、k3sが利用しているcontainerdのソケットを指定します

## テスト

最後にk3sクラスタが正しく動いているか確認します
が、前回と同じ手順だと上手くいかないので少し変更します

```bash
# 一旦ファイルとして保存
wget -L https://raw.githubusercontent.com/kubeedge/kubeedge/release-1.1/build/deployment.yaml
vim deployment.yaml
- hostPort: 80
+ hostPort: 9080

kubectl apply -f deployment.yaml
kubectl get pods
kubectl get deploy
```

k3sでは`hostPort`の80番はすでに使われているので、適当なポートに書き換えます
問題なくPodがデプロイできればOKです

## 最後に

いかがだったでしょうか
筆者的には、前回と同じ部分があるとはいえ、kubeadmよりも簡単に構築できた気がします
しかし気になるのはマスタ側もk3sでなければならないことですね
k8sとk3sがクラスタを組めれば万々歳なのですが、それは贅沢ってもんですかねw

そしてやはり残る疑問は**「KubeEdge自体がちゃんと動いているのか」**です
なので次こそはExampleを試したいと思います！
ではでは〜
【Cakephp2.x】HABTMの関係にある別モデルのpaginationをする

# 状況
PostとTagが多対多の関係で、
TagsController内で指定したTagのidに該当している全てのPost達でPaginationをしたい。
# やった方法

```TagsController.php
    $tagId = 1; 
	$this->Paginator->settings = array(
		'conditions' => array('PostsTag.tag_id' => $tagId),
		'limit' => 5,
		'joins' => array(
			array(
				'table' => 'posts_tags',
				'alias' => 'PostsTag',
				'type' => 'INNER',
				'conditions' => array(
					'PostsTag.tag_id' => $tagId,
					'PostsTag.post_id = Post.id'
				)
			)
		),
	);
	$posts = $this->Paginator->paginate('Post');
	$this->set('posts', $posts);
```


自分のモデルに合わせて書き換えて頂ければサクッとpaginationが出来るはずです。
hasManyならjoinsは要りませんのでconditionsでそのまま別モデルの_idを指定すれば取って来れます。

参考にさせて頂いたサイト様
[CakePHP how to retrieve HABTM data with conditions?](https://stackoverflow.com/questions/12450707/cakephp-how-to-retrieve-habtm-data-with-conditions)
[アソシエーション: モデル同士を繋ぐ - 2.x - CakePHP Cookbook]
(https://book.cakephp.org/2.0/ja/models/associations-linking-models-together.html#)
Hyper-VでのNAT構成について

# はじめに
今までVMware workstationやOracle Virtual Boxを利用して足下環境としてローカルPCに開発用VMを作っていましたが、Windows 10ではHyper-Vが標準で利用出来るため、Hyper-Vに移行した際のメモ。

色々VMware workstation/Oracle virtual Boxと違う点はもちろんあるが、一番困ったのがNAT環境の構築でした。

# NAT環境の構築方法
PowerShellをたたけばいけるそうで。

```
Get-NetAdapter
New-NetIPAddress -IPAddress 192.168.137.1 -PrefixLength 24 -InterfaceIndex 67
New-NetNat -Name MyNATNetwork -InternalIPInterfaceAddressPrefix 192.168.137.0/24
```

# 参考情報
- https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/user-guide/setup-nat-network
RailsじゃないRspec3環境でDatabasecleanerがうまく動かない時の暫定対処法

# 背景
業務でRailsではないRubyプログラムの改修を行うことになりました。
既存のテストを実行してみると、Rspec実行後にDBの値が書き換えられていて2度目のテスト実行でDB側で重複エラーになってしまいました。

デバッグを進めていくとDatabaseCleanerが正常に動作せず、トランザクションが張られていないことが原因のようでした。

そこからググりまくって色々試してみたのですが(バージョンが古く、use_transactional_fixturesの設定もできない)うまくいきませんでした。
そこで、暫定対処としてRspecからDBをCreateした場合、Rspecのexampleごとに削除する処理をサクッと入れることにしました。(トランザクションは使用しない)

とりあえずDatabaseCleaner入れるのめんどくさいという人や、環境が原因でうまくDatabaseCleanerが動いてくれない人等に暫定対処としてサクッと書ける処理を共有できればと思います。

# 暫定対処法
**処理フロー**
beforeで配列を作成してその中にCreateしたオブジェクトを追加していきます。
afterで配列をループさせdeleteを行います。

```SQL:specファイル内
before :each do
  # FactoryGirlでクリエイトしたオブジェクトを配列に入れておく
  @data_obj = Array.new

  @data_obj << create(:factory)
  @data_obj << create(:factory)
end


after do
  # オブジェクトに対してdeleteメソッドを実行
  @data_obj.each do | delete_obj |
    delete_obj.delete
  end
end
```

超絶簡単ですが、これでDatabaseCleanerを使えるように環境を再構築したり、環境のバージョン差分を解消するまでの間の暫定対処としてうまく動作させられるようになると思います。

# まとめ
- Railsを使用しない場合の情報がかなり乏しい。
- 自分で構築した環境ではないので原因を特定しにくい。
- レガシーな構成なものを改修する時、不具合が起きやすい。

- 構成を好き勝手にいじることができない場合(根本的な解決ができない)、自分で処理を書くことでお茶を濁すしかない。

誰かが困ったときの一時的な助けとならんことを祈ります。
Log.vとかLog.dが出力されない！HUAWEI製

Log.vとかLog.dがLogcatに出ないなーなんて思っていたら・・・・

[参考先](http://sanzo83.hatenablog.com/entry/2016/02/01/184352)

電話アプリで`*#*#2846579#*#*`入力して、

Background Settings　-> LOG Settings
- AP Log」「CP Log
- Charge Log
- Sleep Log
をチェックしてCLOSE！

おっさん備忘録！
Amazon ForecastをAWS Lambdaで叩く方法

# 今回のケース
今回のケースは学習したAmazon ForecastをAWS Lambdaで指定時刻になったらS３にCSVファイルを出力することです。
本記事ではそのための方法を説明します。

![lambda_forecast.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33329/ce8dabc8-85f7-e4a5-14c6-790e32cd6465.png)

# 前提
予測子(Predictorの作成)の作成、モデル(Forecast)の作成が終わっていることとします。

# 流れ
- Lambdaに権限を与える。
- Lambdaにコードを書く
- トリガーを設定する
- 実行されるのを待つ  

という流れです。

# Lambda Function

``` python:execution_forecast
import json
import boto3
# リージョンを指定する
session = boto3.Session(region_name='us-east-2') 
forecast = session.client(service_name='forecast') 
forecastquery = session.client(service_name='forecastquery')

def lambda_handler(event, context):

    forecastArn = 'モデル(forecast)のArnを記入する'
    forecastResponse = forecastquery.query_forecast(
    ForecastArn=forecastArn,
    # item_idのIDを指定する。
    Filters={"item_id":"0001"}
)
    formatted = json.dumps(forecastResponse, indent=4, sort_keys=True, separators=(',', ': '))
    # バケット名を記入する
    s3_bucket = "forecastbucket"
    # S3のフォルダ構造を記入する
    s3_key_prefix = "projects/0001/models/0001/predictedData/"
    # ファイルの名前を書く
    filename = 'predict0926.json'
    s3_client = boto3.client('s3')
    s3_client.put_object(
        Bucket=s3_bucket,
        Key = s3_key_prefix + filename,
        Body = formatted
    )
    
    return {
        'statusCode': 200,
        'body': json.dumps('Success')
    }
```

boto3とjsonは最初からForecast内にあるので、自分でimportする必要はありません。

# 実行するために権限を与える

画像の5つを追加
サービス => IAMと入力　=> ロール =>  ポリシーのアタッチ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33329/104ecc78-6b00-034e-c336-47fd9580ae0b.png)

lambdaのダッシュボードから、CloudWatch Eventsをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33329/f4e90585-9565-38e7-9552-e8364b8c61af.png)

例えば毎週の17時に実行したい場合は次のように入力します。
※これはUTC(協定世界時)時間で設定する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33329/1f879550-063e-3059-62a1-ac5984da806a.png)

今回のケースのフォーマットは

``` 
分(mm) 時刻(yy) * 繰り返したい曜日の範囲 * 
 ```
になっております。

これらを入力して時刻になると指定したフォルダに予測結果のCSVが出力されます。
画像投稿機能　rmagickがインストールに失敗する時　備忘録

## 画像投稿機能のgemである`rmagick`をインストールした時に怒られたエラー
```terminal
An error occurred while installing rmagick (4.0.0), and Bundler cannot continue.
Make sure that `gem install rmagick -v '4.0.0' --source 'https://rubygems.org/'` succeeds before
bundling.
```
エラー文の内容に沿って

```terminal
gem install rmagick -v '4.0.0'
```
を実行するするも

```terminal
ERROR: Can't install RMagick 4.0.0. Can't find ImageMagick with pkg-config
```
と言って怒られた。

そこで、ImageMagick（バージョン7）をアンインストール

```terminal
brew install imagemagick@6
```

アンインストールが終わったら、 ImageMagick（バージョン6）をインストール

```terminal

brew install imagemagick@6
```

パッケージを有効化するために下記を実行する

```terminal

brew link --force imagemagick@6
```

最後に`bundle install`を実行する
今度はPHP(LAMP)環境をDockerで再発明してみた

# はじめに

以前、DockerでRubyやRailsの雛形環境をDockerで作ってみようという試みをやってそれをQiitaに書きました。

* [Ruby2.6.4+Rails6(+Node.js8)+MySQL8+Redis5がすぐにいじれるDockerコンテナを作ってみた](https://qiita.com/cyross4vocaloid/items/9482c5d4d66f235aaacf)

これで懲りたかと思っけど、

**やっぱりPHP(LAMP)も勉強しておかなきゃねー！！！**

という意欲が湧いてしまい、性懲りもなく第2弾としてLAMP環境を構築してしまいました。

# 構成

今のサービスの構成は以下となっています。

* PHP5.5
* PHP5.6
* PHP7.3
* MySQL8

サービスPHP*にはComposer(Symfonyも？), Laravelも同時にインストールします。

# GithubのURL

* [cyross/PHPSandboxByDocker](https://github.com/cyross/PHPSandboxByDocker)

# 現状

* とりあえず、エラーなくインストールが終わる所まで来ています。試しにPHP5.5環境でサーバーが動くことは確認しています。

```
PS L:\DockerContainers\PHPSandboxByDocker> docker-compose exec php5_5 bash
[root@4094e550dd63 /]# php -S 0.0.0.0:8000
PHP 5.5.38 Development Server started at Thu Sep 26 07:02:54 2019
Listening on http://0.0.0.0:8000
Document root is /
Press Ctrl-C to quit.
[Thu Sep 26 07:02:58 2019] 172.26.0.1:50790 [404]: / - No such file or directory
[Thu Sep 26 07:02:58 2019] 172.26.0.1:50792 [404]: /favicon.ico - No such file or directory
```

![php_sandbox_result_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101034/ca628fc1-b0f1-4ca6-08c0-f4d7d53b5eac.png)

ホスト側のブラウザからアクセスできるところまでです。
新しいウィンドウに移動

idで指定しても、xpathでも、要素を取得できなかった。
どうやら、新規タブが開くとそのタブに移動しなければ行けなかったみたい。

開いてるウィンドウを

` tabs = drive.window_handles`

で、arrayにして

`driver.switch_to.window(tabs[1])`

で、移動したいとこのインデックス番号入れる。
ifupdownとnmcliの競合

# connection activation failed no suitable device found for this connection

ifupdownで使っている/etc/network/interfaceに設定が残っていると、nmcliでコネクションをupするときにエラーがでるようです。

```sh
nmcli con up connection activation failed no suitable device found for this connection
connection activation failed no suitable device found for this connection
```

## 対処
/etc/nework/interfaceから
upできないデバイスを削除する
itamae で読み取り権限のないファイルの編集

itamae で下記のように書いた時、対象のファイルの読み取り権限がないと失敗する。

```ruby
file "/path/to/file" do
  action :edit
  block do |s|
    # ...
  end
end
```

内部では net-scp を使ってファイルを取得 → 変更してアップロードしているので、ファイル取得時に読み取り権限がないと失敗する。

net-scp にモンキーパッチをあてて、sudo を使うようにすればよい。

```ruby
require "net/scp"

module Net
  class SCP
    module Sudo
      def scp_command(*args)
        command = super
        "sudo " + command
      end
    end
  end
end

Net::SCP.prepend Net::SCP::Sudo
```

下記のテンプレートでは `lib/sudo_scp.rb` にこのコードを保存し、`roles/*` から `require` している。

- [labocho/itamae-template](https://github.com/labocho/itamae-template)
Unityで通信対戦ゲームを作った話２

今回は攻撃関連についての話

##攻撃の種類について
- 近接
- 遠隔
- 爆発
- 追尾
以上４通り

攻撃の大まかな流れ
1. アクション始動
2. アクション再生
3. ヒット
4. リアクション計算
5. リアクション

近接であれ遠隔であれ通る工程は変わらない
ただし、それぞれのところに通信が挟まってくるので、ゲームの気持ちよさを担保できるように、また、やられた側の理不尽感も軽減するように実装する

では順番にどうやったか書いていく

#####1. アクション始動
これはもちろん技出す人が実行する
ボタンを押す→通信
以上終わり

#####2. アクション再生
通信がくるので、受け取ったら再生
ただし、発動者はすぐ受け取れるので、自分の通信状況によってラグが発生するため
**自分のキャラの初期再生速度だけゆっくりにする**ことで対応
こうすることによって、例えば剣を振るモーションだった場合
発動者と、受け取った側で剣のコリジョン発生のタイミングをできるだけ近くした

#####3. ヒット
攻撃があたったと通知する処理部分
ここで問題になるのは、**誰があたったと判定するか**というところ
例えば剣を振る場合と、魔法の弾の場合を考えたとき
目の前に敵がいて剣を振ってるのに相手は悠然とすり抜けていく、また反対に
まだ5mぐらい離れているのに、いきなりあたったことになる弾などのプレイしている人が不快になる現象が起きてしまう

なので、近接関係は攻撃を出した人、遠距離関係は攻撃を受けた人があたったと判定するようにした

#####4. リアクション計算
ここでは、攻撃を受けたときのリアクションや、ダメージを計算する
前述の通りにヒットの通信が飛ぶので、攻撃された側が計算をする
正しい現在のHPを持っているのは本人なので、計算してもらう
そして、食らったダメージ値、その時のリアクション（ひるみとか）を通信で送信

#####5. リアクション
受け取ったそれぞれが、通信情報をもとに画面に表示や、アニメーションを取らせる



以上が実装の流れとなる
もしもここにバフの計算などを乗せるとしたら、大体は４の工程に混ぜ込んでしまえばうまくいくと思う
ただし、攻撃側の情報はどこに混ぜるかはケースによるだろう
近接の場合は３だし、遠隔の場合は１のほうがゲームの整合性としては正しそう
vue.js で v-lazy img

vue.jsを使っているときに lazyload をしたい時がある。

参考
https://github.com/hilongjw/vue-lazyload

# 画像を直接指定

```

<div v-lazy-container="{ selector: 'img' }">
    <img data-src="/img/info1.png">
</div>

```


# ループ の中で使う

```

<ul>
  <li v-for="img in list">
    <img v-lazy="img.src" >
  </li>
</ul>

```


こんな感じでどちらでも使うことができる。
始めにQiitaの書き方

#目的
Qiitaを始めてみたはいいものの何を書いていいかわからない…
のでとりあえずQiitaの書き方をまとめてみることにする
主に使うであろうものを中心にまとめて必要になり次第追記


#見出し
「\#」を前につけることで見出しになる
「\#」の数でサイズが変わる
htmlタグのh1~h6に対応
目次ではネストになるらしい

>\#見出し
\#\#\#数を増やしてサイズ変更

#h1(\#)
##h2(\#\#)
↓ここから下線がなくなる↓
###h3(\#\#\#)
####h4(\#\#\#\#)
#####h5(\#\#\#\#\#)
######h6(\#\#\#\#\#\#)

#引用
「\>」をつける
効果範囲は空行が開くまで

>\>引用
複数行でも可



#コードを挿入
「\`」(バッククオート)３つで囲んだ範囲
Shift+@でバッククオートが入力可能
>\`\`\`
>print("hello Qitta!")
>\`\`\`

```
print("hello Qitta!")
```



最初のバッククオート３つの横に言語名をつけるとハイライトされる
>\`\`\`python
print("hello Qitta!")
\`\`\`

```python
print("hello Qitta!")
```

コロンで仕切るとファイル名も入る
>\`\`\`python:Qiita.py
>print("hello Qitta!")
>\`\`\`

```python:Qiita.py
print("hello Qitta!")
```

ファイル名だけでもハイライトされるらしい
言語を指定しておいた方が確実かも
>\`\`\`Qiita.py
>print("hello Qitta!")
>\`\`\`

```Qiita.py
print("hello Qitta!")
```

#リンクの挿入
リンクにしたい部分を\[\]で囲み、URLを\(\)で囲む
>\[Qiita](https://qiita.com/)

[Qiita](https://qiita.com/)

URLだけそのまま書くと自動でリンクになる
https://qiita.com/

#打消し線
\~\~(波ダッシュ)2つで囲む
>\~\~ここは間違い\~\~
\~\~複数行
も可\~\~

~~ここは間違い~~
~~複数行
も可~~

#太字
\_\_(アンダーバー２つ)で囲む

>\_\_太字\_\_
\_\_複数行
も可\_\_

普通文字
__太字__
__複数行
も可__

#エスケープ
\#などの文字を表示したい場合は「\」(バックスラッシュ)を入れる
>\\#見出しにならない

\#見出しにならない


#空行
空行は1行まで
2行以上空行を入れても反映されない


#参考文献
Qiita書き方メモ
https://qiita.com/hiroyuki_hon/items/f2a779bb295fd12646ab
Qiita Markdown 書き方 まとめ
https://qiita.com/shizuma/items/8616bbe3ebe8ab0b6ca1
Qiita Markdown 記述メモ
https://qiita.com/yuto-naga/items/49bbda0ebd7e9489bc7e
Laravel5.5でNotificationを指定のメールアドレスに送信したい

# Laravel5.5で普通にNotificationを使う場合

```php
$user->notify(new InvoicePaid($invoice));
```
または

```php
Notification::send($user, new InvoicePaid($invoice));
```

こんな感じのコードを書くと思います。

がUser情報を取得せずにNotificationを実施する方法がありました。

公式ドキュメントにそのままですが、気が付かなかった。

## 指定のメールアドレスに送信

```php
Notification::route('mail', 'taylor@example.com')
            ->notify(new InvoicePaid($invoice));
```

## 参考

[Laravel5.5公式ドキュメント](https://laravel.com/docs/5.5/notifications#on-demand-notifications)
Excelで任意の細かさの方眼用紙を作る

#趣旨
私は図を描くとき、Excel上で作業することが多いです。複数の図形が整然と並ぶように、以前は、列幅を「1.63」にして、方眼用紙を作って作業していました。ご存知の方が多いと思いますが、Altキーを押しながらマウスをドラッグすると、図形の位置やサイズがセルの位置に揃います。
手元の環境（Windows10+Excel2016）だと、フォントが「游ゴシック」に代わったためか、セルが正方形になりません。そこで、vbaを使い、任意の目の細かさの方眼用紙を作ったので、その方法をご紹介します。
#手順
1. Excel上で、「alt+F11」を押下すると、VBEが開く
2. VBE上で、「Ctrl+G」を押下すると、イミディエイトウィンドウが開く
3. イミディエイトウィンドウで、次のコマンドを実行する（貼り付けて、その行にカーソルを置き、改行キー押下）

```
cells.columnwidth=2:cells.rowHeight=range("A1").width
```
※ 別のサイズが良ければ、上の「2」を任意の数値に置き換えて実行する
#補足
罫線に強弱をつけるには、次のようなコマンドで罫線を書くことができます。「100」や「5」を変更すると、範囲や細かさが変わります。

```
for i=1 to 100:columns(i).Borders(xlEdgeleft).LineStyle=iif((i-1) mod 5,xlNone,xlContinuous):next
```

```
for i=1 to 100:rows(i).Borders(xlEdgetop).LineStyle=iif((i-1) mod 5,xlNone,xlContinuous):next
```
nilをチェックするのにpresent?は使わないこと

あるRailsアプリケーションでRubyのバージョンを上げたところ、妙な症状が出ました。`Pathname`のオブジェクトに対して`present?`メソッドを使うと常にfalseが返るというものです。

```ruby
FileUtils.mkdir('foo')
path = Pathname.new('./foo') # #<Pathname:./foo>
path.present?                # Ruby 2.3まではtrue, 2.4からfalse
```

原因は、Ruby 2.4から`Pathname`に`empty?`メソッドが追加されたせいでした。`Pathname`が表すパスが空のディレクトリかサイズ0のファイルだと、`empty?`はtrueを返します。

ActiveSupportの`present?`メソッドの中身は`!blank?`で、`blank?`メソッドの中身は`empty?`です。なので、空ディレクトリを指す`Pathname`の`present?`はfalseとなります。

```ruby:activesupport-5.2.3/lib/active_support/core_ext/object/blank.rb
class Object
  # コメントは略
  def blank?
    respond_to?(:empty?) ? !!empty? : !self
  end

  def present?
    !blank?
  end
```

なお、`String`では`blank?`に「空白文字だけの文字列ならtrue」が加わります。

```ruby:activesupport-5.2.3/lib/active_support/core_ext/object/blank.rb
class String
  # コメントは略
  def blank?
    empty? ||
      begin
        BLANK_RE.match?(self)
      rescue Encoding::CompatibilityError
        ENCODED_BLANKS[self.encoding].match?(self)
      end
  end
```

というわけで、「**よく分からないオブジェクトを指す変数がnilかどうかをチェックするのにpresent?を使ってはいけない**」という知見が得られました。`blank?` / `present?` を使うのは、次の場合に限ったほうがよさそう。

- ActiveRecordのカラムが空かどうかチェックする。
- nilまたは空文字列または空白文字だけの文字列かどうかチェックする。

Railsアプリケーションが `blank?` / `present?` だらけだったら気を付けましょう。
HTML5/CSS3　ギャラリーレイアウトの書き方　詳細度（CSS優先順位）について

<h1>ギャラリーレイアウトの書き方</h1>
<p>タイトルなどを書き換えて、段落を１つ追加する</p>
<p>画像とキャプションのセットを追加する</p>
<p>ギャラリーレイアウトを完成させる</p>
<h2>☆HTML5</h2>

```html:base-fair.html
...
<article>
	<h1>......</h1>
	<p>......</p>
	<div class="gallery_box">
		<figure>
			<img src="images/gallery_photo1.jpg" alt="">
			<figcaption>......</figcaption> <!-- figcaptionはimgの前に置いても、後に置いても、どちらでも構いません。書いた前後通りに表示されます。 -->
		</figure>
		<figure>
			<img src="images/gallery_photo2.jpg" alt="">
			<figcaption>......</figcaption>
		</figure>
		<figure>
			<img src="images/gallery_photo3.jpg" alt="">
			<figcaption>......</figcaption>
		</figure>
	</div>
	<div class="gallery_box">
		<figure>
			<img src="images/gallery_photo4.jpg" alt="">
			<figcaption>......</figcaption>
		</figure>
		<figure>
			<img src="images/gallery_photo5.jpg" alt="">
			<figcaption>......</figcaption>
		</figure>
		<figure>
			<img src="images/gallery_photo6.jpg" alt="">
			<figcaption>......</figcaption>
		</figure>
	</div>
</article>
...
```
<h2>☆CSS３</h2>

２．figureの親要素に、フロートを解除するCSSを設定する。

```css:base-fair.css
/* すべての<figure>にフロートを適用して横に並べる ここから↓ */
.gallery_box {
	overflow: hidden;
} 
	/* .gallery_box figureの書いた後に書き足す。figureの親要素に、フロートを解除するCSSを設定する。② */
```

１．最初の書き出しはここから始める。fugureにfloatプロパティ、widthプロパティを指定する。


```css:base-fair.css
.gallery_box figure {
	margin: 0 0 15px 15px;
	width: 180px;
	float: left;
}
	/* 最初はここから書く① */
```

３．レイアウトの崩れを解消する。最初のfigureにマッチするCSSを記述する

```css:base-fair.css
.gallery_box figure:first-child {
	margin-left: 0;
}
	/* レイアウトの崩れを解消するために書き足す。③ */

```

４．最初のdiv class="gallaery_box"に上マージンを設定する。

```css:base-fair.css
.gallery_box:first-of-type {
	margin-top: 30px;
}
	/* 最初の<div class="gallery_box">に上マージンを設定する。④ */

/* すべての<figure>にフロートを適用して横に並べる ここまで↑ */
...
```

<h2>☆CSS　全貌　上のCSSと同じ内容</h2>

```css:base-fair.css
...
/* すべての<figure>にフロートを適用して横に並べる ここから↓ */
.gallery_box {
	overflow: hidden;
} 
.gallery_box figure {
	margin: 0 0 15px 15px;
	width: 180px;
	float: left;
}
.gallery_box figure:first-child {
	margin-left: 0;
}
.gallery_box:first-of-type {
	margin-top: 30px;
}
/* すべての<figure>にフロートを適用して横に並べる ここまで↑ */
...
```

<h2>☆詳細度</h2>
・タグのstyle属性に書かれたCSSルール......1000点
・IDセレクター１個につき......100点
・タイプセレクター、疑似要素※１個につき......1点
・全称セレクター......0点
　　※::after、::beforeなどコロン（:）が２つ付くセレクターのこと。clearfixテクニックなどで使う。「フロートを解除する他の方法」で使う。
JsonServerでレスポンスをカスタマイズする




# JsonServer is なに？
* APIモックツール。
  * https://github.com/typicode/json-server

# 使い方

* Node.jsを入れる
  - https://nodejs.org/en/
* コマンド試してバージョンでてくればインストール成功
  - `node --version`  、`npm --version` 
* Json-serverをローカルにいれる
  - `npm install -D json-server`
* リソースを作成する(サンプルは下記)
  - server.js
  - db.json
* 起動する
  - `node server.js`
* リクエストを投げる
  - http://localhost:3003/api/get/users


# サンプルリソース

``` server.js
const jsonServer = require('json-server');
const server = jsonServer.create();
const router = jsonServer.router('db.json');
const middlewares = jsonServer.defaults();

// ルータ↓↓↓ ここを修正↓↓↓***************************************************************
server.use(jsonServer.rewriter({
  /** ユーザー情報取得API */  
  "/api/get/users*": "/get_users_v1"
  //,"/api/get/users*": "/get_users_v1_ZERO"
  //,"/api/get/users*": "/get_users_v1_ERROR"
}))
// ルータ↑↑↑ ここを修正↑↑↑***************************************************************

// ミドルウェアの設定 (コンソール出力するロガーやキャッシュの設定など)
server.use(middlewares);
var num_get_users = 1;
var num_get_name = 1;
server.use(function (req, res, next) {
//    req.query = {};
//    console.log(req.query);
//    console.log(req.body);
//    console.log(req);
//    console.log(res);
  if (req.method === 'POST') {
  
    // POST送信を受ける場合、受けたPOSTレスポンスをGETに変更する
    req.method = 'GET';
  } else {
  
    req.query = req.params;
    req.params = null;
  }
  
  //↓↓↓↓↓↓カスタマイズはここで変更↓↓↓↓↓↓******************************************
  // 返却ステータス設定---------------------------------------
  //console.log(req.originalUrl);
  if (req.originalUrl=='/api/get/users*') {
  res.statusCode=400;
  } else if  (req.originalUrl=='/api/get/name*') {
  res.statusCode=200;
  } else if  (req.originalUrl=='/api/get/age*') {
  res.statusCode=200;
  } 
  
  // 同一APIを複数回呼び出す場合、レスポンス設定-------------
  if (req.originalUrl=='/api/get/users') {
      // 奇数回目アクセスの場合
      if (num_get_users % 2 == 0) {
      res.req.url = '/get_users_v1_ZERO';
      //res.req.url = '/get_users_v1_ERROR';
      }
      num_get_users++;
  }
  
  if (req.originalUrl=='/api/get/name') {
      // 二回目アクセスの場合
      if (num_get_name == 2) {
      //res.req.url = '/get_name';
      }
      num_get_name++;
  }
  //↑↑↑↑↑↑カスタマイズはここで変更↑↑↑↑↑↑******************************************
  // Continue to JSON Server router
  next()
})
// db.json をもとにデフォルトのルーティングを設定する
server.use(router);
// サーバをポート 3003 で起動する
server.listen(3003, () => {
  console.log('JSON Server is running');
});
```

``` db.json
{
  "get_users_v1_ERROR":
{
    "error": {
      "message":"We are sorry, this Error should never happen to you",
      "tip":"Please contact support",
      "code":500
    }
}
  ,"get_users_v1_ZERO": 
{
    "success": {
      "code":200
    }
}
  ,"get_users_v1": 
{
    "success": {
      "code":200
      ,"name":"hanako"
    }
}
}
```
Poetry0.12.0へのアップグレードに失敗した

Poetryがなにもしていないのに壊れた。
結論から言うと再インストールしたら直ります。

```shell
pip uninstall poetry
pip install poetry
```

### エラー内容

```shell
$ poetry -V
Traceback (most recent call last):
  File "/usr/local/bin/poetry", line 6, in <module>
    from poetry.console import main
  File "/usr/local/lib/python3.7/site-packages/poetry/console/__init__.py", line 1, in <module>
    from .application import Application
  File "/usr/local/lib/python3.7/site-packages/poetry/console/application.py", line 7, in <module>
    from cleo.formatters import Formatter
ModuleNotFoundError: No module named 'cleo.formatters'
```

### 原因
Poetryは 0.11.5から0.12.0にアップグレードできない。
どこかで0.11.5からアップグレートを実行してしまったため、壊れてしまった。
リリースノートにできないという有無が記載されている
https://poetry.eustace.io/blog/poetry-0-12-0-is-out.html

```
It is not possible to use the self:update command to upgrade Poetry from 0.11.5 to 0.12. Use the installer to upgrade.
```

### 参考
エラーメッセージで検索すると下記のissueがヒットし解決しました
https://github.com/sdispater/poetry/issues/553
AWSサービス、カスタマーエンゲージメント

# カスタマーエンゲージメント

カスタマーエンゲージメントについての備忘録
サービスの概要・特徴・料金などを簡潔（できれば）に記載します。

### Amazon Connect
### Amazon Pinpoint
### Amazon Simple Email Service (SES)

## 概要
クラウドベースのEメール送受信サービス

### 特徴

* 送信アクティビティのモニタリング
* オープントラキング（開封）
* クリックトラッキング、Eメール内のリンク
* テンプレートを作成しパーソナライズされたEメールを送信できる
* Spam, ウィルス、マルウェアのフィルタリング機能

### メール送信方法

* Amazon SES コンソール
* Amazon SES API(SendMail API
  * From, To, Subject, Bodyをアプリケーション準備して送信
* Amazon SES API(SendRowEmail API
  * メッセージ全体をアプリケーション側で生成して送信  
* SMTPインターフェース

### ユースケース

* トランザクションメッセージの送信
  * 購入確認、出荷通知、注文状況の更新、ポリシー変更通知
* マーケティングコミュニケーション送信
  * 広告、ニュースレター、特典情報、製品やサービスの宣伝
* 通知の送信
  * システムヘルスレポート、アプリケーションアラート、ワークフローステータス
* 既存の送信用SMTPサーバからリレー
Datadog  の Metric Correlation 機能がすごいぞ！

# 概要
Datadogの進化は早いですね。
今回は、`Metric Correlation`という機能についてご紹介です。

# Metric Correlation について
[AWS Dash](https://www.datadoghq.com/blog/dash-2019-new-feature-roundup/#metric-correlation)や夏のDatadogまつりMeetup でも紹介されていましたが、
「[[レポート] 夏のDatadogまつりMeetup に参加してきました](https://dev.classmethod.jp/report/datadog-summer-meetup-2019/)」によると

> 機械学習を活用し、異常が見られるメトリクスと同じ挙動しているメトリクスを探してくる（相関）

とあります。便利そう。

# 使い方
2019/9/26時点では、まだBetaという位置付けです。

[こちら](https://app.datadoghq.com/metriccorrelation/2019signup)のBetaリクエストページからリクエストすることが可能です。

機能が有効になると、相関関係を調査したいグラフの`show this widget in full screen`ボタンを押すと、
<img width="527" alt="スクリーンショット 2019-09-26 14.21.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95324/53fb973a-fa2b-45af-4464-fd68b3085202.png">

タブメニューに`Correlation Beta`が追加されます。
<img width="272" alt="スクリーンショット 2019-09-26 14.25.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95324/8e03f8c5-17ce-2bda-e9bb-436250ec98a4.png">


# 使ってみた
今回は、`aws.applicationelb.target_response_time.maximum`というALBインテグレーションのメトリクスを例に使用してみます。

## 1. 時間帯を選択
相関関係を調査したグラフを選んだら、調査したい時間帯を選びます。
<img width="982" alt="スクリーンショット 2019-09-26 14.31.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95324/d3db68d3-9926-64f9-ff8d-2dddbdbcc836.png">

調査対象の時間帯を調整したい場合は、`Edit Search`ボタンを押せば調整可能です。

## 2. 調査対象の選択
相関関係を調査したいデータを選択します。
選択肢としては、

* インテグレーション（AWSやGCP等の各サービスごとのインテグレーションを指定可能）
* ダッシュボード（自前で作成したダッシュボードを指定可能）
* カスタムメトリクス

が選択可能です。

例） インテグレーションを指定したい場合
<img width="540" alt="スクリーンショット 2019-09-26 14.34.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95324/5491e940-1a07-c5ca-b98d-65c33abbab2a.png">

## 3. 検索実行
最後は、`Search`ボタンを押すだけ。
しばらくとすると、相関関係のあるメトリクスが表示されるので、クリックしてみます。
<img width="1283" alt="スクリーンショット 2019-09-26 14.38.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95324/4e3ddd69-9fba-6787-f662-1708cddc2c9c.png">

すると、相関関係のあるグラフの詳細が表示されました。
<img width="1379" alt="スクリーンショット 2019-09-26 14.40.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95324/c1498b65-fc2e-d28f-71b7-e5a2fdb52151.png">

## 4. 原因調査
ここからの調査は、自分でやることになります。
今回例だと

• LAが上昇
• io waitが上昇
• メモリが解放
• 12時ちょうどという時間帯

という事象からlogrotateが怪しいという仮説を導き出せました。

# まとめ
レスポンスタイムが跳ねるという1つの事象だけだと、いろんな視点で調査することになると思いますが、
この`Metric Correlation`を使うと相関関係があるメトリクスが取得できるので、トラブルシューティング時に役に立つなと思いました。
これがボタン1つで可能とは、Datadog恐るべしですね。
今後の進化にも期待です。
WSLにCUDAとcuDNNをインストールする

~~※現在WSLがGPUに対応していないので意味ないです。~~
WSL2がGPU対応したのでWSL2を使いましょう。
WSL2では下記のワークアラウンドも不要です。

Ubuntu on WSLにCUDA 10.0とそれに対応したcuDNNをインストールする際にいろんなページを見回ることになったので手順をまとめておきます。

# CUDAのインストール

基本的には[公式サイト](https://developer.nvidia.com/cuda-downloads)のネットワーク版の手順と同じですがWSL用の対応とバージョン指定の部分だけ変えてあります。

## インストール

まず実際にCUDAをインストールする際のコマンドを書いておきます。

```bash
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
$ sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
$ sudo apt-key add 7fa2af80.pub
$ rm 7fa2af80.pub
$ sudo add-apt-repository "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/ /"
$ sudo apt-get update
$ sudo apt-get -y install cuda-10-0
```

## 変更点

```bash
$ sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
```

がWSLではうまくいかないのでファイルを落としてそれを `apt-key add` し削除するように変更しています。

```bash
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
$ sudo apt-key add 7fa2af80.pub
$ rm 7fa2af80.pub
```

もう一つ、最後の行で `sudo apt-get -y install cuda-10-0` とバージョンを指定するようにしています。
ここで単に `sudo apt-get -y install cuda` とすると最新のCUDAがインストールされます。

## パスを通す

次の一行を.bashrcに追記してください。

```
export PATH=/usr/local/cuda-10.0/bin:$PATH
```

# cuDNNのインストール

[cuDNN Download](https://developer.nvidia.com/rdp/cudnn-download)から自分のCUDAのバージョンに対応したものをダウンロードし、それをインストールします。
ダウンロードサイトではログインを求められるのでNVIDIAのアカウントを用意しておいてください。

```bash
$ wget ${ダウンロードURL}
$ dpkg -i ${ダウンロードしたファイル名}
```
AWSサービス、アプリケーション統合

# アプリケーション統合

アプリケーション統合についての備忘録
サービスの概要・特徴・料金などを簡潔（できれば）に記載します。


## Amazon EventBridge
## Amazon MQ

## Amazon Simple Notification Service (SNS)

### 概要
高可用性で、耐久性に優れたセキュアな完全マネージド型 pub/sub メッセージングサービス

### 特徴

* 送信されたすべてのメッセージは、直ちに配信される
* Subscribeは、購読単位でRetry Policyを設定できる
* 配信ステータス機能により成功率・失敗率に関する情報を収集できる

### ユースケース

* Cloudwatch アラーム通知
* 配信タイミングを制御する為、Amazon SQSにキューイング
* Lambdaと連携し DynamoDB,S3を制御する

### 通知先（Subscriber）

* HTTP/S
* Eメール
* SQS
* Mobile Push(プッシュ通知)
* SMS
* Lambda

## Amazon Simple Queue Service (SQS)
## AWS AppSync
【Android】アプリのスクリーンショットを撮影してリサイズするスクリプト

# 背景
ひょんなことから、Android StudioのLogcatタブが表示されなくなってしまい、スクショが取れなくなってしまいました。
今まで`Logcatで撮影 > 保存した画像を開く > サイズ変更`を手動で行なっており手間に感じていたため、これを機にスクリプトで撮影からサイズ変更まで行うようにしてみました。

# 実装

```sh:takeScreenshot.sh
adb shell screencap -p /sdcard/screen.png
adb pull /sdcard/screen.png Downloads/screenshot.png
adb shell rm /sdcard/screen.png
sips -Z 600 Downloads/screenshot.png
```

`./takeScreenshot.sh`をターミナルで実行することで、Downloadsフォルダにスクリーンショットが保存されます。
実行権限が付いていない場合は`chmod +x takeScreenshot.sh`で権限を付与してください。

# 追記(2020/08/04)
上記のスクリプトだと連続でスクショを撮ると前の画像が新しい画像に上書きされてしまいます。
連続して複数画面のスクショを撮るにはちょっと不便だったので、ファイル名にタイムスタンプを含めるように改良しました。

```sh:takeScreenshot.sh
adb shell screencap -p /sdcard/screen.png
fileName=screenshot_$(date "+%Y%m%d%H%M%S").png
adb pull /sdcard/screen.png Downloads/${fileName}
adb shell rm /sdcard/screen.png
sips -Z 600 Downloads/${fileName}
```
Swiftチェックテスト(初心者用)

初歩的なことが意外と説明できないと気づいたので復習。
---

###プログラミング問題基礎(Swift)###
**(1)**オブジェクト指向とは、データや動作の塊をオブジェクトとして考える方法のこと。

そのオブジェクトにどんなデータと動作があるか定義した設計図となるものを**クラス**という。
その設計図から作られた実態を**インスタンス**という。

インスタンスの持っているデータや、動作を表す**メソッド**にアクセスするときは**ドット(.)**という記号を用いる。
例えば、UILabelのインスタンスをlabelという名前で作成したとき、labelに文字を表示させたいときは **text**というプロパティに値を代入する。

---

**(2)「処理Aを150回繰り返す」というプログラムを完成させろ。**

```swift
(for文の場合)

func loop(){

for _ in..<150{
//処理A
}
```

```swift
(while文の場合)

func loop(){
var number : Int = 0
while number <=150{
//処理A
number += 1
}
```
for 文では条件を記述する代わりに、繰り返しの元となる範囲や配列を in の後に記述します。

範囲は 0…10 や 0..<10 のように 「…」「..<」を使った記法を利用できます。

前…後 : 「前」で始まり「後」まで続く範囲を指定します。「後」も範囲に含まれます。
前..<後 : 「前」で始まり「後」のひとつ前まで続く範囲を指定します。「後」は範囲に含まれません。
範囲や配列から元になる値が生成されて、それが for の後ろに記述した定数に代入されます。


while に続けて、条件式を記述して、 { } で繰り返し行う実行プログラムを記述します。
while の後の条件が満たされる限り、 { } 中のコードが繰り返し実行されます。

----

**(3)変数の中身をコンソールと言われる部分に出力するためのコードを書け。**
変数名をtext、String型と仮定する。

```swift
print("String")
```

---

**(4)float型とDouble型の違いは？**
浮動小数点型は、小数点以下の値を持つ数値（実数）を表すための型です。SwiftではDouble型とFloat型の2種類の構造体が用意されています
・Float ..32bit
・Double..64bit

型アノテーションなしで宣言するとDouble型になります

```swift 
var number = 3,14 //Double型
```

Float型の変数を宣言するには、明示的に型を指定する必要があります。

```swift
var number : Float = 3,14
```
---
swift は型に厳格な厳格な言語なため型の違うもの同士で計算するとコンパイルエラーを起こしてしまいます。Int型の値をDouble型の変数に入れたい場合は、次のようにDouble型のイニシャライザを使用して、Int型をDouble型に変換してから代入する必要があります。

```swift
b = Double(a)
```

---
**(5)nilとは何？**
nilは「何もない」ことを表す特別な値です。
nilを日本語に訳すと「無』という意味になります。整数や文字列と同じ「値」です。

```swift
var <変数名>:<型名>? = nil
```
ex)変数ageにnilを代入

```swift
var age : Int? = nil
```
年齢を表すageの型は整数型です。整数型の変数にはnilという値を代入できませんが、「Int」の後に「?」を付け足すと、−１、０、１、２といった整数値の他にnilも格納できるようになります。
この「Int?」は**オプショナル整数型**と呼ばれます。
「nilを取りうる整数型」という意味です。



---
**(補講)テーブルビューまとめ**
TableViewを使うためにはUITableViewもしくはUITableViewControllerを使用していく。
TableViewを使う際必ず実装しなければならない2つのDatasourceメソッドがある。
また、TableViewが持っているDelegateメソッドを実装するとTableViewを削除したりアクションを起こすことができるようになる。
TableViewにはCellの個数とCellに乗せる情報が必要。
このようなCellが持つ情報に関するメソッドを**データソース(Datasource)メソッド**という。

TableViewのCellと配列は順番どうりに連動させることができるので配列のcountメソッドや何列目かを格納したindexPath.rowなどもよく使われます。
Composerの使い方についての日本語資料集

PHPのパッケージ依存関係管理ツールである「Composer」(公式サイト：https://getcomposer.org )。
Laravelや多くのパッケージの導入に使われていますが、公式のマニュアルは英語だったり、日本語の情報は古かったりします。
個別に調べる方法もありますが、体系的に学べる資料は少ないものです。
そこで、日本語でそれなりにまとめられている資料を一覧にしています。

# Composerドキュメント日本語訳

Kohki Makimotoさんによる資料です。
すべてが日本語化されているわけではありませんが、無料で読むことができます。
https://kohkimakimoto.github.io/getcomposer.org_doc_jp/doc/

# Composerの教科書

技術書同人誌博覧会（技書博）や技術書典にて頒布された資料です。
パッケージの利用だけでなく、パッケージの作成から公開まで一冊で読める。
現在はBOOTHにて電子版をダウンロードできます。
https://booth.pm/ja/items/1458660

# CodeZineでの連載

Composerを使ってPHPのパッケージを簡単インストール
https://codezine.jp/article/detail/7827

Composerを使ってPHPのプロジェクトを管理する
https://codezine.jp/article/detail/7887

Composerのプロジェクトを公開して使う
https://codezine.jp/article/detail/7991

# WEB+DB PRESS Vol.110

雑誌「WEB+DB PRESS」での記事。
「モダンPHPエンジニアへの道」のコーナーで「Composer実践活用術」として紹介。
https://gihyo.jp/magazine/wdpress/archive/2019/vol110

# その他ブログ記事やQiita

https://www.sejuku.net/blog/82454
https://qiita.com/niisan-tokyo/items/8cccec88d45f38171c94
brew installしたkibana@5.6が動かない

# 問題
```
brew install kibana@5.6
```

のあと、

```
$ kibana
zsh: command not found: kibana
````

となり、kibanaをstartできない。


# 対処

`brew install`したので、brewでinstallしたserviceが動いてるかを確認するために、
`brew services list`を実行した。

```
Name              Status  
elasticsearch@5.6 started
kibana@5.6        stopped               
memcached         stopped               
mysql@5.6         started
```

kibanaはstopped、止まっている。
これをstartできないかと考えコマンドを調べたところ、
`brew services start XXX`が使えると知る。

version: 5.6が指定されているので、

```
$ brew services start kibana@5.6
==> Successfully started `kibana@5.6` (label: homebrew.mxcl.kibana@5.6)
```

無事起動完了

<br>

※ちなみに、このあと `localhost:5601`にアクセスしてkibanaが動いてるのを確認しました。
行コンテキストとフィルターコンテキストについて 2（コンテキストのネスト）（PowerBI/PowerPivot/DAX）

PowerBI/PowerPivot（以下、総称してDAXと呼びます）における「行コンテキスト」と「フィルターコンテキスト」という2つのコンテキストについて[書きました。](https://qiita.com/zaboom/items/ecf290a3b3fc80406292)
今回は、コンテキストのネストについて書いてみたいと思います。また、行コンテキストを計算列以外の方法で作成し（つまり、DAX関数で作成し）、繰り返し処理を行う方法について見ていきます。


## 行コンテキストを作成する
前回の記事で見てきたように、計算列を作ることで、行コンテキストを作成することができます。今回はDAX関数で行コンテキストを作成してみます。
例えば、SUMXなどの末尾がXになっている関数群は、処理の過程で行コンテキストを作成し反復処理を行います。また、FILTER関数も同じく行コンテキストを作成して反復評価します（紛らわしいですがフィルター「コンテキスト」とは違います。FILTER「関数」の話です。）

例えば、次のような式を考えてみます。メジャーとして定義します。

[売上額] = SUMX(
    '売上明細',
    [販売数量] * [販売単価]
)

SUMXの最初の引数は、テーブルかテーブルを返す式を取ります。上記の例ではテーブルがそのまま引数に設定されているため、フィルターコンテキストで評価されたテーブルを引数として渡しています。
2番目の引数は、最初の引数として渡された対象を、行単位で繰り返し処理する内容を指定します。ここでは、販売数量列と販売単価列を掛け合わせる処理を行っています。そして、SUMX関数はこの処理結果を足し合わせる処理を行います。

処理の順序としては、以下のようになります。

１：最初の引数として与えられた対象を行単位で評価します（新たに行コンテキストを作成します）
２：行コンテキストにおいて、2番目の引数で与えられた処理内容を実行します
３：２で処理した内容を集計します

ここで着目して欲しい点は、コンテキストのネストが行われているというところです。上記の項番１で作成される行コンテキストは、最初の引数で与えられるコンテキスト（フィルターコンテキストで評価されたテーブルなど）に対して、新たな行コンテキストを追加しています。

## ネストを操る
前の例で、仮に、最初の引数で与えられるコンテキストが行コンテキストであった場合、新しく追加した行コンテキストに差し替えられます。
次のようなテーブルがあったとします。（「商品」テーブルです）
![20190926コンテキストのネスト1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499774/fc278d06-3ced-cb26-8d6e-276c9d6103d5.png)



このテーブルに対して、「定価」のランキングを新たな計算列として作成する場合を考えてみます。DAX式は次のようなものが考えられます。

[定価ランキング] =
VAR
	CurrentPrice = [定価]
Return
COUNTROWS(
	FILTER(
		'商品',
		[定価] > CurrentPrice
		)
) + 1

順に見ていきましょう。
まず、FILTER関数は引数で受け取ったテーブルに対して、行コンテキストを作成します。しかし、この式は計算列として定義されています。したがって、元の行コンテキストの上に、新たに同じテーブルの行コンテキストを作成していることになります。この場合、FILTER関数の中では元の行コンテキストは無視され、新たな行コンテキストが評価されます。
ここで問題になるのが、FILTER関数の中にあるCurrentPriceです。これは、元の行コンテキストにおける[定価]を参照していなければなりません。そのため、上記の例では変数を定義し、それを使用することで元の行コンテキストの[定価]を参照することでこの問題を解決しています。
これにより、現在の[定価]よりも高い価格の商品をカウントし（COUNTROWS）、最後に+1しています（+1しないと0始まりのランキングになってしまうためです）

このように、コンテキストがネストされている場合には「現在どのコンテキストで評価されているか」を意識し、場合によってはネストを抜け出して処理させる必要があります。

上記の例では変数で解決していますが、もう少しスマートに解決する方法もあります。

[定価ランキング] =
COUNTROWS(
	FILTER(
		'商品',
		[定価] > EARLIER([定価])
		)
) + 1

EARLIER関数は、現在評価対象になっているコンテキストの「前の」コンテキストを呼び出します。ここでは、FILTER関数の呼び出し元のコンテキストである、計算列の行コンテキストを参照することになります。最初の例では同じ処理を変数を使って行っていましたが、EARLIER関数は「コンテキストのネストを1段階前に戻る」という指定ができます。（2番目の引数に数値を与えることで、2段階、3段階、、、とネストを上に辿ることもできます）

今回は主に行コンテキストのネストについて見てみましたが、フィルターコンテキストをネストしたり、フィルターコンテキストを無視したい場合はどうなるのでしょうか。次回はこのあたりについて書いてみたいと思います。
【UiPath】Excelアプリケーションスコープのエラーで検証/パブリッシュできないときの対処法


# 現象
Excelアプリケーションスコープを含むワークフローを、検証またはパブリッシュしようとすると、エラーになる。
エラーメッセージ：`型 'UiPath.Excel.WorkbookApplication が定義されていません` 

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/2fea9354-311d-8a01-4069-c038598c489a.png)

# 原因
2019年9月時点での最新バージョン、v2019.8.0 の不具合と思われる。UiPathのForumに、現象と対策についての投稿がある。
https://forum.uipath.com/t/how-to-solve-the-recent-validation-error-in-excel-application-scope/146919

元々問題なかったワークフローでも、UiPath Studioのバージョンが上がるとパブリッシュできなくなる。

# 対策
Excelアプリケーションスコープのプロパティ「出力」-「ブック」に、仮に作った変数を指定する。
(必要性があって元から変数の指定がある場合は、エラーにならないはずなので対応の必要なし)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/706399b6-8c57-8590-2f05-1d024204afe7.png)

ただ、このプロパティを指定すると、Excelアプリケーションスコープで開いたブックが閉じるタイミングが、「Excelアプリケーションスコープ終了時」から「ロボット完了時」へ変わるため、それで不都合がある場合は、Excelアプリケーションスコープの後に「ブックを閉じる」アクティビティを追加する必要がある。

UiPath Studio のバージョンが上がって、不具合が直れば必要なくなる対策と思われる。
Ubuntu18.04 + bitnami Redmineのネットワーク経由のバックアップ（SSH利用）

## この記事の対象者
* Redmineでバックアップしたい人
* バックアップをせっかくなので別のネットワーク経由のマシンにバックアップしたい

## 前提条件

* bitnami Redmineが導入されている事
* 接続先に公開鍵方式でSSH接続出来ている事

## バックアップ方法

下記スクリプトをご覧下さい（丸投げ）

## バックアップスクリプトの流れ


1. データベースのバックアップ
2. redmineのファイル群をZipに固めてバックアップ
3. scpコマンドで転送先へバックアップファイルのリネーム（日付ベース）を行い転送
4. 転送後、利用ファイルを削除
 
```sh:redmine_backup_template.sh

# !/bin/bash
# データベースのパスワード、転送先ユーザー名、転送先IPについては適宜変更してお使い下さい
# bitnami redmineでのインストール前提です

# database backup
/opt/redmine-3.4.3-1/mysql/bin/mysqldump -u bitnami -pデータベースのパスワード bitnami_redmine > /home/redmine/redmine_backup.sql
# redmine files backup
zip -r /home/redmine/redmine_files.zip /opt/redmine-3.4.3-1/apps/redmine/htdocs/files

# Transfer SQL file to file server
scp -i ~/.ssh/id_rsa -r /home/redmine/redmine_backup.sql 転送先ユーザー名@転送先IP:/home/samba/share/98.backup/redmine/sql/redmine_backup_`date "+%Y%m%d_%H%M%S"`.sql
# Transfer Attachment file to file server
scp -i ~/.ssh/id_rsa -r /home/redmine/redmine_files.zip 転送先ユーザー名@転送先IP:/home/samba/share/98.backup/redmine/files/redmine_files_`date "+%Y%m%d_%H%M%S"`.zip

#delete backup files.
rm /home/redmine/redmine_backup.sql
rm /home/redmine/redmine_files.zip

echo "redmine backup finish!"

```

データベースパスワードは

```
redmineインストールフォルダ/apps/redmine/htdocs/config/database.yml
```
に記載してあると思うので、そちらを参考に入力しましょう。

一応スクリプトファイルを[こちら](https://github.com/win-chanma/RedmineBackup)にアップしてます
【Android】Android9でカメラ起動ができないときの解決法

## 3行まとめ
1. Fragmentにカメラ起動の処理を追加した
2. 「Didn't find class "android.support.v4.app.CoreComponentFactory"」  
というエラーがでた
3. androidXとandroid.support.compatライブラリの競合を解消して解決した

[参考サイト1: android.support.v4.app.CoreComponentFactoryエラーについて](https://stackoverflow.max-everyday.com/2019/05/android-didnt-find-class-android-support-v4-app-corecomponentfactory/)
[参考サイト2:  tools:replace="android:appComponentFactory"について](https://kurutabrog.hatenablog.com/entry/2019/05/04/133140)

## 解決方法
①gradle.propertiesに下記を記載。
※gradle.appでもgradle.projectでもないので注意！

```
android.useAndroidX=true
android.enableJetifier=true
```
②MainActivity等の、AppCompatActivityを継承しているファイルを開き、
 下記をインポートする。
※ここで赤線エラーが出たら、macのalt+enterで解決する。

```
import androidx.appcompat.app.AppCompatActivity
```
突然のApple Tier変更に伴い過去の増税や歴史をまとめてみたよ

2019年10月1日より消費税が8%から10%に増税されますが、
9月23日に突然AppleからTier変更の発表がありました。

それも10/1から。

遅すぎる…

一例はこちら
<img width="842" alt="スクリーンショット 2019-09-26 12.17.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/0a6f5830-5bea-9932-3df8-82bacd0a5ef7.png">

詳細は下部参照ください。

## 価格変更されるタイミングは？

増税だけでなく外国為替相場の変動に伴って変更されることもあります。
ですのでサービスイン中にTier変更・増税の影響を受けにくくする設計は今後より重要になってきそうですね。

アプリによってはGoogle Play側との統一を図るためにそちらの対応が必要なものもあるでしょうし、
片方のPlatformだけの話にとどまるものでもないので大変です。

## 過去のTier変更時期は？

- 2011年7月
- 2013年10月
- 2015年4月

ほぼ２年おきに改定されていますが、ここ最近はなかったので油断していました。

### 消費税の歴史はこちら

- 1989年4月 消費税法施行 3%で開始
- 1997年4月	消費税率を5％に引き上げ
- 2014年4月	消費税率を8％に引き上げ

前回の8%への増税時はTier変更がすぐにはなかったので油断していました。

アップルはいつも突然に（映画のタイトルみたい）

## 蛇足

ちなみに余談ですが消費税は
1989年4月に消費税法が施行され、税率は3％でした。
当時の首相は「竹下 登」で、ウィッシュでおなじみのDAIGOさんの祖父にあたります。

## 参考

https://developer.apple.com/news/?id=09232019a
https://itunespartner.apple.com/assets/downloads/180919Japan.pdf
Nuxt.jsで開発時のみ見たいページをつくる方法

開発時だけ見たいテスト画面を作るとかってありませんか？
そういった画面のコードはソース管理にも残しておきたかったりしますよね。
でもうっかり本番で見れちゃうのは避けたい。

Nuxt.jsだといろいろやり方はありますが、今回の要望だとmiddlewareを使うと良さそうです。

# middleware
nuxtのmiddlewareは、`middleware`というディレクトリの中に、任意のファイル名でjsファイルを作り、それを呼び出すとOKになります。（直接書く方法もあります）
呼び出す方法は2つ用意されています。

 1. `nuxt.config.js`に記述する
 2. vueコンポーネントに記述する

1.の方法は全てのURLでmiddlewareが適用されます。
今回の場合だとテストページだけで良いので、2.の方法でテストページのvueコンポーネントにmiddlewareを呼び出す記述をします。

## 使い方
お作法としては、`middleware/xxx.js`を用意し、以下のような形で関数を`export`するようにします。

```js:middleware/xxx.js
export default function() {}
```

作ったファイルをvueコンポーネントで以下のように記述すると呼び出すことができます。

```vue:pages/test/yyy.vue
<script>
export default {
  middleware: 'xxx'
}
</script>
```

たったこれだけ。
あとは、`middleware/xxx.js`で本番時は404にリダイレクトさせるという記述をかけばOKです。

## middlewareの第一引数
先程の例の`middleware/xxx.js`は最低限の記述で、実際処理をなにも書いていません。
この関数は第一引数に情報が入ってくるので、

```js
export default function(param) {
  console.log(param)
}
```

と記述を変えてみましょう。
これでテストページにアクセスし、この`param`をみると以下のような形で出力されます。
（※大部分を省略して載せています。）

```js
{
  isStatic: false,
  isDev: true,
  isHMR: false,
  app:
  store:
  redirect:
  route:
  error:
}
```
なるほど。なるほど。このような情報が渡ってくるようになってるんですね。

今回は

 1. 本番かどうかの判定
 2. 404にリダイレクト

ができれば良いので、`isDev`と`error`が使えそうです。
[昨日書いた分割代入](https://qiita.com/gungungggun/items/03e47d40085b3f37a2e7)（コメントで教えてもらいました）で以下のように記述しましょう。

```js

export default function({ isDev, error }) {
  if (!isDev) {
    error({ statusCode: 404, message: 'Page not found' })
  }
}
```

これで本番（`isDev`が`false`）のとき`error`を発生させ404ページに遷移させることができます。
`redirect`とかを使ってもできそうだけど、404とかだったら多分`error`を使ったほうが良いです。

## ちなみに
以下は[API: middleware プロパティ - Nuxt.js](https://ja.nuxtjs.org/api/pages-middleware/)にあるサンプルです。

```js
export default function ({ store, redirect }) {
  // ユーザーが認証されていないとき
  if (!store.state.authenticated) {
    return redirect('/login')
  }
}
```
これはstore(vuex)に認証情報を入れておくようにして、認証されていなかったらログインページにリダイレクトするようなmiddlewareです。
この引数も分割代入になっているのがわかります。
この第一引数に色々情報が渡ってくるので、用途に合わせて自分の使いたいものを選びましょう。

nuxt.jsもvueもやりたいことが簡単に実現できて良いですね！
【FactoryBot + RSpec】パスにクエリを渡すのに苦労した話

Webエンジニア１年生がRSpecで
「パスにクエリを渡したい！
でもFactoryBotで作成したテストデータの中身をどうやってパスに渡すの？」
と苦労したけど、実がとても簡単だった話

##開発環境
- Ruby 2.5.5
- Rails 5.2.3
- RSpec 3.8

##実現したいこと
FactoryBot + RSpecでページ遷移の際にパスにクエリを渡し、それが正しいことをexpectしたい
(http://○○.com/reviews/new **?item_id=20**)←クエリ

##先に結論
**assignsメソッド**を使う！

##例
とある商品のレビューをするサイトを作っているとする
商品検索画面から商品を選択後、その商品のレビュー投稿ページへ商品IDをパスに持たせて遷移する場合

```ruby:assets/controllers/items_controller.rb
class ItemsController < ApplicationController
  def search
    @item = #(フォームから送られてきた商品情報)

    # 〜中略〜

    redirect_to new_review_path(item_id: @item.id)
    # 商品idを渡してレビューページへ遷移する
    # /reviews/new?item_id=20
  end
end
```

これが正しく遷移することをRSpecでテストします。

```ruby:spec/factories/item.rb
FactoryBot.define do
  factory :item, class: Item do
    id { 1 }
    name { 'ボールペン' }
    # 〜中略〜
  end
end
```

```ruby:spec/controllers/items_controller_spec.rb
require 'rails_helper'

RSpec.describe ItemsController, type: :controller do
  describe 'POST #search' do
    before do
      post :search, params: { item: attributes_for(:item) }
      # attributes_for(:item) = { id: 1, name: 'ボールペン', ・・・〜中略〜・・・ }
    end

    it '選択された商品のレビューページへ遷移する' do
      expect(response).to redirect_to new_review_path(item_id: assigns(:item).id)
    end
  end
end
```

##assignsメソッドとは
> コントローラのインスタンス変数に代入されたオブジェクトは、コントローラの assigns メソッド経由で参照できます。
参照する場合には、インスタンス変数名から “@” を除いたものをシンボルまたは文字列にしたものをキーとして指定します。

`@item`を`assigns(:item)`に書き換えることで使えるようになるんですね！

```
redirect_to new_review_path(item_id: @item.id)
↓
redirect_to new_review_path(item_id: assigns(:item).id)
```

##参考記事
・ スはスペックのス 【第 2 回】 RSpec on Rails (コントローラとビュー編)
　　https://magazine.rubyist.net/articles/0023/0023-Rspec.html#assigns-%E3%81%AB%E3%82%88%E3%82%8B%E5%8F%82%E7%85%A7
[The action 'アクション名' could not be found for コントローラ名]が出てくるとき

とても下らない理由でエラーが出たので、備忘録と反省的な意味を込めて残しておきます。

<img width="599" alt="Screen Shot 2019-09-26 at 12.11.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312001/120fddfa-9fc3-efef-deb2-b8e4ae4638c5.png">

ArticlesControllerを見て、createアクションあることを確認したのにも関わらず、こんなエラー（画像はRailsガイドから拝借してきました）が出たので結構な時間ルーティング見たり、色々悩んだ結果、privateメソッドに入ってました。

```ruby
#　本来こうなっているはず
def index

end

def create

end
```

```ruby
#　それがこうなってたのでエラー
def index

end

private

def create

end
```
たくさんメソッドがあってわかりづらくなっていたのもありますが、
インデントを1段深くしてればすぐ気づけたかもです。

## 結論
privateメソッドはインデントを1段深くしとこう。
本当は Python がいいと思うけど Excel で頑張ってみる

# 第１回講義（９月２６日）

* Excel 関数の基本の復習
  * https://qiita.com/maskot1977/items/6a2dea23f97dd42a48db

* Excel を使った線形回帰、4つの方法
  * https://qiita.com/maskot1977/items/31046a66c4bdb6b2ec82

* <b>課題</b>
  * 上記２つの記事に従って Excel で作業を行い、指定したメールアドレスに送信する。複数のExcelファイルに分かれても構いません。
  * メール中に学籍番号と氏名を明記のこと。
感想・要望・不明点などありましたら併記してください。
  * 提出期限： １週間後

# 第８回講義（１１月２８日）

* 休講

# 第９回講義（１２月５日）

* 主成分分析をExcelで理解する
    * https://qiita.com/maskot1977/items/eb695b516fd320aad495

# 第１０回講義（１２月１２日）

* 因子分析をExcelで理解する
    * https://qiita.com/maskot1977/items/ab6d038d622ecbb0730d

# 第１１回講義（１２月１９日）

* ロジスティック回帰をExcelで理解する
    * https://qiita.com/maskot1977/items/3abe57187721258691cc

# 第１２回講義（１２月２６日）

* 多層パーセプトロン (Multilayer perceptron, MLP)をExcelで理解する
    * https://qiita.com/maskot1977/items/5871e0b1b6a44f17c327

# 第１３回講義（１月９日）

* 最終回
* 授業評価アンケート（公式のやつ）
* 演習用アンケート解析
    * https://docs.google.com/forms/d/e/1FAIpQLSf4yvNCXQRRuhwSxB5KyBDjL6RLbcPyilSKpI6tiUy7Vad2Pg/viewform
    * アンケートに答えると、集計結果のスプレッドシートが得られます。
    * アンケート集計結果を、今まで学んだ方法も使ってデータ解析しなさい。この講義で学んだ方法以外の方法を使っても構いません。何か面白いものを見つけてほしいです。
* <b>締め切り</b> は来週ではなく、1月20日月曜日21時にしたいと思います。
git stash についてメモる。


## 機能概要

```stash``` を利用することで、コミットしていない変更を一時的に退避し、後ほど復活させることが可能。


## 利用シーン

- とあるブランチで作業中だが、別ブランチで作業する必要が発生した。でもまだコミットしたくない。

- 誤ったブランチで作業していて、コミット前の修正内容を意図するブランチに持っていきたい。

  といったところでしょうか。


## コマンド一覧

（自分のために、）コマンドを整理しておく。

### 一時退避

```$ git stash save "コメント"```

※save以降は省略可能。

### stashリストの表示

```$ git stash list```

※ハッシュ、コミットコメントはstashを行った時のHEADのもの。



### stashリスト（内容込み）の表示

```$ git stash list -p```

### stashリスト（詳細）の表示

```$ git stash show <stash名>```

### stashの復活

```$ git stash apply stash@{0}```

※stashの指定を省略した場合、最新のstashが復旧される。

### stashの復活＆削除
```$ git stash pop stash@{0}```


### stashの削除（stash指定）

```$ git stash drop <消したいstash名>```
####※stash削除を行う際の注意：
stashの削除と共に、修正内容も削除されてしまうので気軽にやらないように。（私の場合、保存時のメッセージが気に入らなかったので削除→再stashを試みるも、そこにstashするもの[差分]が無いという地獄を。。）
と、言いたいところですが、、後述する「stashメッセージの修正」手順にて復旧可能なので参考までに。


### stashの削除（全体）

```$ git stash clear```

### stashメッセージの修正

```
// 一旦、stashを削除する。
$ git stash drop stash@{0}
Dropped stash@{0} (1234567890a1b2c3~~~~)

// 削除時に表示された情報（カッコ内の英数字）を利用して、storeを実行する。
$ git stash store -m "新たなメッセージ" 1234567890a1b2c3~~~~
```