OmniAICreator/Qiita-1.07M huggingface dataset:
【AWS認定資格】AWS CloudPractitioner合格体験記（2021/01/05）

#合格しました！
本日午前にAWSクラウドプラクティショナーを受験し、無事合格しました！
記憶が新しいうちに実際に受験した**所感**と、AWSクラウドプラクティショナー受験にあたっての**勉強法・申し込み方法・当日の心構え**を紹介します。

#筆者のバックグラウンド
文系大学出身の20卒です。都内のIT企業で働いています。

◆業務経歴
　4月　　　　主にPython初級レベルの新人研修を受ける
　5月　　　　部署でJava研修を受ける
　6月～　　　環境移行・オープン化案件でテストや運用監視業務を担当
　11月末　　 AWSのAPNパートナー向け新人研修を受け、AWSに出会う

実はAWSを業務・プライベート共に**全く触ったことがありません**。
弊社がAWSの**[APNパートナー](https://aws.amazon.com/jp/partners/)**であり、動画研修が無料で受けられたので、ちょっとやってみようかな、くらいのノリで勉強を始めました笑

私のIT知識は基本情報レベルです。
クラウドプラクティショナーは基本情報レベルのIT知識があれば、AWSのことが何も分からなくても恐れるに足りない試験だと思います。

#所感
試験時間90分で65問でした。
かなりゆっくり解きましたが、1周終わった時点で50分残っていました。
一問一答形式で、長い文章の設問や選択肢は少なかったです。


**[公式のサンプル問題](https://aws.amazon.com/jp/certification/certified-cloud-practitioner/)**や[ネットに転がっている問題](https://aws-exam.net/clf/)等いくつか見ましたが、それらに比べると本番の試験の方が難しく感じます。
ただ問題自体のレベルが高いというよりは、「聞かれ方が複雑」という感じでした。
日本語訳が間違っている出題もちらほらあるので、変な文章があったら「原文を見る」ボタンで英語の設問を確認した方が良いです。

#勉強法
勉強を始めたのは12月から、期間は**1か月**です。
その間JavaSilverや基本情報の勉強をメインで行っていたので、クラウドプラクティショナー対策に費やした総学習時間は**30時間**くらいだと思います。

おすすめ教材はAPNパートナー向けになってしまいますが、**[AWS CloudPractitioner Essentials](https://aws.amazon.com/jp/training/course-descriptions/cloud-practitioner-essentials/)**の動画です。図や例を用いてわかりやすく説明してくれます。
AWSが何も分からなくても勉強を始められ、これだけやれば合格できるレベルに達せる良い教材です。

#申し込み方法
割と簡単に申し込めました。

1. **[AWS認定クラウドプラクティショナー](https://aws.amazon.com/jp/certification/certified-cloud-practitioner/)**のページ
2. 「試験のスケジュールを立てる」
3. サインイン
4. 「新しい試験の予約」
5. 試験形態を選択

といった流れです。

私は**ピアソンVUE**のテストセンターで受験しました。

#当日の心構え
10日前に**[JavaSilver](https://qiita.com/chiiirotty/items/a612f9a24d691c1e1580)**の試験を受験したときと同じ会場(地元のテストセンター)での受験でした。

ピアソンVUEテストセンター受験における注意点としては、以下の3点です。

###①身分証明書は2種類必要
有効な身分証明書を確認し、必ず2種類持っていきましょう。

###②試験会場では勉強不可
早めに到着することは大事ですが、会場に入ってしまうともう勉強できないので注意。


###③証明書に掲載される写真撮影がある
メイクはちゃんとしていきましょう！

#おわりに
現時点で伝えたいことは以上です！

クラウドプラクティショナーの試験はかなり初歩的なので、それ自体にあまり価値はないかもしれません。

しかし「クラウド初心者でも少し勉強すれば合格できる試験」という点でハードルが低く、資格勉強の過程でAWSの全体像がつかめるようになるので、**クラウドの世界に一歩踏み出したい人には最適な試験**なのではないかと思います。

次は1月10日に基本情報技術者試験を受験します。
シラバス改定後初回かつ基本情報史上初のCBT試験となるのでドキドキですが、合格目指して頑張ります！
Amazon AthenaのDDL(CREATE TABLE)でパーティションを指定してもパーティションが利用できない問題

### 事象
AthenaのDDLでパーティションを指定しても、それだけでは実際のSELECTクエリで結果は返ってきません。これはGlueのAPIでCREATE TABLEした場合でも同様です。

### 解決策
DDL実行後に下記クエリを実行する。

```
MSCK REPAIR TABLE table_name
```

これは解決策というよりか普通に必要な手順になります。以下公式Docsにも記載されています。
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/partitions.html

### 解説
CREATE TABLEしただけでは、そのパーティションキーがこのテーブルにはあるよ、という情報がデータカタログに渡されるだけで、実際にそのパーティションキーにはどんな値のものがあるかということが知らされないため、パーティションキーはスキーマに記載されているがパーティションはカタログ上存在しないという状態になります。
例えば`name`というパーティションキーがスキーマに登録されても、実際のパーティションに`name=yamada`とか`name=sato`があるかどうかはカタログ側はまだ知らないのでパーティション使えませんという状態ということです。
なので`MSCK REPAIR TABLE`コマンドでS3パスと照合して実際に存在するパーティションをスキャンしてメタ情報がカタログに登録され、ようやくクエリできるということです。

### その他
上記のコマンドは自動的にパーティションをスキャンさせる方法ですが、単体のパーティションを個別で登録するには`ALTER TABLE table_name ADD PARTITION xxxxxx`を使う方法があります。
MVVMって？

今まで雰囲気でMVVMしてたのですが、身近でMVVMちゃんとやろうぜみたいな流れになったので学び直したメモです。
「ちゃうやんけ！」みたいなのがあれば、コメントでご教示いただけますと助かります。

# はじめに

MVVMと聞くと、WPFやUWPといったWindowsGUIアプリケーションを開発するためのフレームワークが重い浮かびます。これらのウリとしてはUIをXAMLというXMLで記述できるという点があります。これによりUIのデザインはプログラミングとは切り離すことができ、分業や結合度の低減に役立ちます。そして、このXAML上に表示する値はバインディングという名前解決の機構によってオブジェクトと同期されます。

しかし、MVVMのアイディアはもっと抽象的な部分にあり、それらはアイディアを実現するための手段に当たります。アイディアに当たる部分がの思想を理解できれば、WPFやUWP以外にも応用できるはずです。

MVVMを解説している文献は数多あります。MVVMそのものもMicrosoftが提唱し始めたアーキテクチャということで[「THE MODEL-VIEW-VIEWMODEL (MVVM) DESIGN PATTERN FOR WPF」というドキュメント](https://docs.microsoft.com/ja-jp/archive/msdn-magazine/2009/february/patterns-wpf-apps-with-the-model-view-viewmodel-design-pattern)を見てみましょう。

### 要約「THE MODEL-VIEW-VIEWMODEL (MVVM) DESIGN PATTERN FOR WPF」

- UIはアプリケーション全体の中で不安定で変更の可能性が最も高い領域、そのため他の領域とはしっかり隔離しておきたい
- MVPの派生で（MVPはMVCの派生）、PresenterにViewを直接操作させずBindingを通して同期させるようにしたもの
- ViewModelはプログラマ、Viewをデザイナと分業でき、UIを変更する際にはBindingだけ合わせれば済む
- ViewModelはModel(s)のラッパである

### MVP？

MVVMはMVPの派生ということで、ViewModelとViewの繋がりの部分が変わったものでした。それ以外の部分（MVPな部分）についても補足しておきます。

UIが存在しないヘッドレスなアプリケーションを想像してみてください。実際にそんなものは存在しないかもしれませんが、ライブラリやCLIアプリケーションに近いものです。

```csharp:Model
class Human() {
  public string Name;
  public int Age;
  public Human(string name, int age) => (Name, Age) = (name, age)
  public string Greet(){...}
}
```

このままではUIが無いので操作できませんが、「不思議な力」でユーザーがnewできてシリアライズされていない入出力を扱えたとしたら、これで完結できます。これがビジネスロジック、言い換えるならドメイン、Modelです。もうちょっと範囲が広いかもしれませんがとりあえずこういうことにしておきます。

で、実際にはそんなことはできないので不思議な力の部分、UIが必要になります。これがPresenter+Viewです。
その中でも直接描画をする部分をViewとして分離します。

```cs:View-Presenter(MVP)
class Program {
  static void Main() => new HumanPresenter();
}
class HumanPresenter : Presenter {
  readonly Human model = new Human("Bob", 124);
  readonly HumanView view = new HumanView(); // ここをDataBindingにするとMVVM
  public HumanViewModel() {
    view.SetLabel($"{model.name} ({model.age})");
    view.OnButtonClick += () => view.SetText(model.Greet());
  }
}
class HumanView : View {
  public event Action OnButtonClick;
  public string SetLabel(string label){...} // 画面の再描画
  public string SetText(string text){...} // 画面の再描画
}
```

# まとめ

今まで、MVxいずれについてもフワッとした理解のまま、既存のコードを見ながら「あぁ、自分の理解はまちがってたんやなー、こう分離するんやな！」みたいに思っていました。しかしそれも微妙にズレていたようで、その歪みを帳尻合わることに頭を悩ませていました。
（MVCについては書いてないけど、MVC→MVP→MVVMと歴史順にみてきた）
フワッとした理解の人が他の誰かに説明したり、分かってても省略して説明して、そんな伝言ゲームの中でズレていってしまうのかと思います。

今回自分なりにしっくりくる説明ができるようになったと思うのですが、果たしてこれがちゃんと伝わるのか、そもそもあってるのか不安が残ります。
AWSにてPdfの日本語が表示されなかったのでフォントを追加する

## 概要

AWS内でPhpSpreadsheetを用いてExcelを出力。
LibreOfficeを使用しExcelをPdfへ変換したところ、日本語が出力されませんでした。
フォントを設定したところ解消したので設定方法を記載します。
(ちなみに筆者はWindows環境です。)

## フォントのzipファイルダウンロード
Google Noto Fonts
https://www.google.com/get/noto/
から以下をダウンロードします。

```
Noto Sans CJK JP
```

```
Noto Serif CJK JP
```

## ダウンロードしたzipファイルの解凍

NotoSansCJKjp-hinted.zip
NotoSerifCJKjp-hinted.zip
がダウンロードされたかと思いますのでローカルの任意の場所で解凍します。
(解凍したファイルの拡張子が`.otf`のものだけ使いますので、どこかわかりやすい場所にまとめておくと良いと思います。)

```
例 C:\Users\ユーザー名\Desktop\japanese
```

## AWSに作業フォルダ配置

Win-SCPなどを用いて、先ほどの.otfファイルをわかりやすい場所へ配置します。

```
例 /home/ec2-user/japanese
```

## フォントの設定

先ほどの作業フォルダをフォント設定フォルダへコピーします。

```
例 sudo cp -r /home/ec2-user/japanese /usr/share/fonts/japanese
```

## 設定を適用

```
sudo fc-cache -fv
```

## Pdfの表示確認

システムで表示できていなかった日本語が表示できているか確認します。

## 作業フォルダ削除

日本語の表示が確認できたら作業終了ですので、作業フォルダを削除します。

```
例 sudo rm -rf /home/ec2-user/japanese
```

## あとがき

作業ユーザーがrootなら直で/usr/share/fontsへ配置できるかと思います。
How Does Cloud Computing Impacts Business Intelligence?

Defining Cloud Computing

Cloud computing is a common term that is used for defining anything that involves the delivery of hosting services over the internet. A cloud service can be differentiated from traditional web hosting based on three characteristics. These distinguishing characteristics involve- the cloud is sold on demand, it is elastic, and lastly, the cloud services are fully managed by the provider. Innovations in the field of virtualization and distributed computing along with improved access to high-speed internet, has accelerated the interest of users in cloud computing.

Cloud Computing Service Categories

The cloud services are typically based on the end-user or business requirements. Following are the primary cloud services-
1. Software as a Service (SaaS)

SaaS is often referred to as a software delivery method for providing access to software and its associated functions remotely as a web-based service. Rather than paying for an upfront fee for purchasing the licensed software, SaaS customers pay a recurring fee amount for subscribing to their services. Additionally, they can access the SaaS from any Internet-connected device at any point in time.

2. Platform as a Service (PaaS)

In the case of PaaS, the platform is outsourced instead of a company or data centre purchasing and managing its own hardware and software layers. Most of the PaaSes have been designed for developers, and they aim to simplify the process of creating and deploying the software. A web-developer could use PaaS for operating system software, Web server software, etc.

3. Infrastructure as a Service (IaaS)

The infrastructure-related to computers could include servers, storage, and networking that is delivered as service. IaaS has been popular with enterprises that appreciate the convenience of having a cloud vendor for managing their IT infrastructure. They can even see cost-savings as a result of paying only for the computing resources that are used.

Security in Cloud Computing

Security has remained a primary concern for businesses that contemplate cloud adoption, especially the adoption of the public cloud. The public cloud providers share the underlying hardware infrastructure between a large number of customers, as the public cloud is a multi-tenant environment. This environment asks for copious isolation between the logically-computed resources. Also, access to public cloud storage and compute resources are authenticated only by the account login credentials. Most organizations are bound by the complex obligations, and the governance standards are hesitant in placing data or workloads in the public cloud due to the fear of outrages, loss or theft. With time, this fear has receded as logical isolation has proven to be reliable, and the addition of data encryption along with several identity and access management tools has helped in improving the security of data present within the public cloud.

Read More>> https://www.esds.co.in/blog/how-does-cloud-computing-impacts-business-intelligence/
文字列（リソース名）で画像を取得してImageViewに貼り付ける(kotiln)

以前書いた記事
[画像名を文字列で指定してImageViewに貼り付けるコード(android)](https://qiita.com/marienplatz/items/d6081e629fec9bed22d1)

これにLGTMしていただいていたので見てみたのですが、微妙だったので書き直します（ついでにkotlinで）
リソース名からImageViewに画像をセットするメソッドは、swiftにはあるんですがkotlinだとありそうでないです。

ちなみにswiftでは

```swift
imageView.image = UIImage(named:"hoge.png")
```
こんな感じでimageViewに画像をセットできます。

同じようなものをkotlinで再現してみます。

# resourceIdを文字列から取得

```kotlin:StringExtensions.kt
fun String.getResourceId(context: Context): Int {
    return context.resources.getIdentifier(this, "drawable", context.packageName)
}
```

Stringの拡張クラスを定義しました

# 画像をImageViewにセット

```kotlin:ImageViewExtensions.kt
fun ImageView.setImageResourceByName(name: String) {
    this.setImageResource(name.getResourceId(context))
}
```

ImageViewクラスの拡張を定義しました。



# 使用例

```kotlin
    private fun setImage() {
        val imageView = ImageView(this)
        imageView.setImageResourceByName("some_image_name_string")
        parent_view.addView(imageView)
    }
```

parent_viewに動的にImageViewを追加しています

kotlinっぽい書き方をすると


```kotlin
    private fun setImage() {
        parent_view.addView(
            ImageView(this).apply {
                setImageResourceByName("some_image_name_string")
            }
        )
    }
```

こんな感じでしょうか。
最初は見にくいなと思っていたのですが、「parent_viewに画像を追加する」という責務がひとかたまりで表せるので個人的には気に入っています。

# swiftとの比較

```swift:swift
imageView.image = UIImage(named:"some_image_name_string.png")
```


```kotlin:kotlin
imageView.setImageResourceByName("some_image_name_string")
```

大体似たような感じになったかと思います。
上記で定義したStringとImageViewの二つの拡張をコピペすればそのまま使えます。
PHP: 通貨の表示

Ubuntu でライブラリーのインストール

```bash
sudo apt install intl
```

```php:currency_yen.php
#! /usr/bin/php
<?php
// ------------------------------------------------------------------
//	currency_yen.php
//
//					Jan/05/2021
// ------------------------------------------------------------------
//
fputs (STDERR,"*** 開始 ***\n");
#
$data = [500,4500,34500,234500,1234500];
$fmt = numfmt_create('ja_JP', NumberFormatter::CURRENCY);
#
foreach ($data as $value)
	{
	print numfmt_format_currency($fmt, $value, 'JPY') . "\n";
	} 
#
fputs (STDERR,"*** 終了 ***\n");
// ------------------------------------------------------------------
?>
```

実行結果

```text
$ ./currency_yen.php 
*** 開始 ***
￥500
￥4,500
￥34,500
￥234,500
￥1,234,500
*** 終了 ***
```

次のバージョンで確認しました。

```text
$ php --version
PHP 7.4.9 (cli) (built: Oct 26 2020 15:17:14) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.9, Copyright (c), by Zend Technologies
```
raw形式からwav形式へ一括変換

# raw形式からwav形式へ一括変換
soxのオプションが覚えられないのでメモ。

```batch
for %i in (..\F023\*.pcm) do "c:\Program Files (x86)\sox-14-4-2\sox.exe" -t raw -c 1 -r 16000 -b 16 -e signed-integer %i %~ni.wav
```
UserDefaultsに保存されているデータを全て表示する

##はじめに
UserDefaultsの中身を確認したい時に任意の場所に仕掛けて表示
忘備録です

###コード
```swift
//UserDefaultsに保存されているデータを全て表示する
    for (key, value) in UserDefaults.standard.dictionaryRepresentation().sorted(by: { $0.0 < $1.0 }) {
      print("\(key) -> \(value)")
    }
```
【悲報】誰もが陥る`np.arange()`の罠

# `np.arange()`の罠

「[Pythonを使って0.1ごとにfor文を回す – Kaggle Note](https://kagglenote.com/misc/python-for-decimal/)」という記事があった。

> for文を使って小数点を繰り返したい時ってたまにありますよね。今回はそれを実現する方法を書いていきます。0~1を0.1刻みで繰り返す想定です。

とあるとおりである。

記事では「rangeを使う方法」と「numpyを使う方法」とが掲げられている。

「rangeを使う方法」とは以下のようなものである。

```python
def myrange():
    gen = range(0, 10, 1)
    return [i/10 for i in gen]


myrange()
# [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
```

これは問題のないコードだ。

つづいて、「numpyを使う方法」として以下のようなコードを掲げる。

```python
import numpy as np


def myrange2():
    data = np.arange(0.0, 1.0, 0.1)
    data_round = np.round(data, 1)
    return [i for i in data_round]


myrange2()
# [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
```

これはいけない。

今回の「0～1を0.1刻み」の場合たまたま偶然問題ないのだが、値が変わったら話が変わる。

「0～2.1を0.3刻み」を行ってみる。

まずは「rangeを使う方法」。

```python
def myrange():
    gen = range(0, 21, 3)
    return [i/10 for i in gen]


myrange()
# [0.0, 0.3, 0.6, 0.9, 1.2, 1.5, 1.8]
```

これが模範解答。

「numpyを使う方法」では以下のようになる。

```python
import numpy as np


def myrange2():
    data = np.arange(0.0, 2.1, 0.3)
    data_round = np.round(data, 1)
    return [i for i in data_round]


myrange2()
# [0.0, 0.3, 0.6, 0.9, 1.2, 1.5, 1.8, 2.1]
```

おわかりいただけただろうか。終端が誤っているのだ。

**`np.arange()`のステップ数に小数を与えるべきではないのである。**:hugging:
弥生の会計ソフト（やよいの青色申告）はSource Han Code JP（源ノ角ゴシック）フォント入れているとエラーになる

私はフリーランスで、やよいの青色申告という会計ソフトを使っています。最近はクラウド会計ソフトが流行っていますが、昔からの定番で使い慣れているので乗り換えせずに使っています。

ただこのソフト、
Source Han Code JP（源ノ角ゴシック）フォント
と相性が悪いらしく、、、

**上記フォントを入れていると起動すらしなくなるという恐ろしい事態になります。。。**

## Source Han Code JP（源ノ角ゴシック）フォントとは

コーディング向けの日本語対応の等幅フォント「Sourceソース Hanハン Codeコード JPジェイピー（和名：源ノ角ゴシック Code JP）」で、2015年6月4日に公開されました。

https://ics.media/entry/7010/

コーディング向けフォントの中でも日本語表記が美しく、愛用されているプログラマーの方もいるかと思います。

私も、ふとエディタのフォントをもっと見やすいものに変えたいなぁと思って色々試している際、このフォントが確かに読みやすいので気に入って使っていました。

**が、、、弥生のソフトを使っている人はくれぐれもご注意ください。。。**

上記フォントを削除することで、起動エラーは解消しました。

## 弥生のサポートへ問い合わせて無事解決

ネットで検索してもこれといった解決策が見つからず、今回はサポートに問い合わせました。

11月までのデータ入力まで終わっていたので、何としても復旧させたかったのです。（もう一回、数百件のデータ入力をし直すなんで地獄ですからね・・・）

私はセルフプランという、電話・メール問い合わせサポート対象外のプランで使っているのですが、今回のケースはサポート対象ですということで、対応してもらえました。

メール問い合わせの翌日にサポートから電話がかかってきて、小一時間かかって無事解決しました！

それにしても、まさかフォントがソフト起動に影響するとは全くの予想外・・・


## 参考
https://tomjin2k.hatenablog.com/entry/2018/04/24/234503
↑
こちらの方は自力で原因究明＆解決してた。スゲー
MacBook Air M1の電源が落ちて、その後電源が入らなくなったよ

#状況
突如電源が落ちて、その後電源が入らなくなった。

#前兆
サードパーティー製のUSBハブを使っていたが、
外部ディスプレイへの出力が出来なくなったので、
USBの抜き差しをしていたら発生…

#今思えば
関係あるかわからないが、
開封直後からUSBハブ経由での外部ディスプレイへの出力が出来なかったりしていた。
USBハブの問題かと思っていたのに…

#対応方法
サポセンから言われた、
MacBook AirのSMCリセットの方法を試す。
Macの蓋を30秒以上閉じて、再度電源が入るか確認。

※SMCリセットの方法が変わった？？？

#結果
電源入らず修理へ

#追記
部品は入荷日不明で、
新品交換の方が早いとの事なので新品交換となりました。
Swift extension集

##はじめに
何気なく調べたりして使っていると、また使おうとした時にどう書くんだっけな・・・
ということがよくあるので忘備録として記録します。


## ダークモードかどうかをBoolで返す
###extension

```swift
extension UITraitCollection {
  
  public static var isDarkMode: Bool {
    if #available(iOS 13, *), current.userInterfaceStyle == .dark {
      return true
    }
    return false
  }
}
```

###使い方

```swift
    if UITraitCollection.isDarkMode {
    //trueの場合
    }else{
    //falseの場合
    }
```

## UIColorをRGB(0~255)で指定する
###extension

```swift
extension UIColor {

  static func rgb(red: CGFloat,green: CGFloat,blue: CGFloat,alpha: CGFloat) -> UIColor {

    return self.init(red: red / 255, green: green / 255, blue: blue / 255,alpha: alpha)

  }
}
```

###使い方

```swift
    let color:UIColor = .rgb(red: 10, green: 10, blue: 10, alpha: 1.0)
```
AppleWatchアプリを実機で試そうとするとdevice unavailable for development

WatchのコントロールセンターからiPhoneを鳴らして、その後Xcodeの再起動で解消しました。
コントロールセンター：https://support.apple.com/ja-jp/HT206951

https://stackoverflow.com/questions/33380684/ios-watch-kit-paired-device-unavailable-for-development
この解決方法みつけたひとすごいな？

関係ないんですが、コントロールセンターにあるコワイ仮面みたいなアイコン、シアターモードっていうんですね。
映画館でうっかり腕を動かして文字盤光らせてあわてて手で隠していました…。ちゃんと対策があるんだ…。
![シアターモード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95144/3ed2d22a-1925-6ad3-a952-f7ae60d328e9.png)
scipyのガウシアンフィルタについて

# scipy.ndimage.gaussian_filter [[reference](https://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.gaussian_filter.html)]
```python:usage.py
from scipy.ndimage import gaussian_filter
blur_array = gaussian_filter(input, sigma)
```

v1.5.4時点で引数はこんな感じ．


|引数 |説明  |デフォルト|
|---|---|---|
|input|array形式ならOK．|必須|
|sigma|ガウス分布の標準偏差，ぼかし具合．軸ごとに設定可能．<br>(例) 3Dなら` sigma=[3,6,9]` |必須|
|order|微分階数，1以上ならフィルタをorder次微分．軸ごとに設定可能．|0|
|output|出力のデータ形式．|入力と同じ|
|mode|フィルタを端で適用するときの挙動，後述．<br> (種類) `‘reflect’ ``‘constant’``‘nearest’ ``‘mirror’``‘wrap’`|‘reflect’ |
|cval|入力配列外の値．mode=‘constant’のとき適用．|0.0|
|truncate|フィルタの適用範囲．フィルタ半径=int(sigma*truncate+0.5)|4.0|

※ カラー画像(HEGHT, WIDTH, 3)を入力すると，3番目の軸(カラーチャネル方向)でも平滑化されるので` sigma=[n,n,0]` とする必要がある．画像形式なら[cv2](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_filtering/py_filtering.html#id5)や[skimage](https://scikit-image.org/docs/dev/api/skimage.filters.html#skimage.filters.gaussian)が楽．逆にscipyは何次元のテンソルでも適用可能なのがメリット(?)

## sigmaについて
・スカラー値だと全部の軸で同じ$\sigma$．
・シーケンス(要素数=入力次元)だと各軸ごとに$\sigma$指定
### 結果例

|カラー画像<br>色も平滑化|カラー画像|グレースケール画像|X方向のみ平滑化|Y方向のみ平滑化|
|:---:|:---:|:---:|:---:|:---:|
|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364756/a240e719-8d33-ae96-ef25-56eabba36500.gif">|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364756/58ba389a-fa9a-e49a-2cc4-c34d2145c638.gif">|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364756/52d596b1-2a9e-23e4-1aec-8b2d40a8cf99.gif">|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364756/487ad039-1bd0-6076-2aa5-af84396d40dd.gif">|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364756/01662e4c-7c04-ed16-f4af-ce3e5f426d31.gif">|


## modeについて
・エッジ(配列の端)より外の値をどう処理するか．
・デフォルトは`‘reflect’`
・入力シーケンスをabcdとしたときの挙動を表に記載．

|mode= |説明  |配列外 左|入力配列|配列外 右|
|---|---|---:|:---:|:---|
|‘reflect’ |エッジを軸に反射．(エッジも反射)|d c b a | a b c d | d c b a|
|‘constant’|定数`cval`，デフォルトは0|k k k k |a b c d |k k k k |
|‘nearest’ |最も近いエッジの値．|a a a a | a b c d | d d d d|
|‘mirror’ |エッジを軸に反射．(エッジは反射しない)|d c b | a b c d | c b a|
|‘wrap’ |反対側のエッジに回り込む|a b c d | a b c d | a b c d|
## truncateについて
・平滑化を行う範囲
・デフォルトは4
・コードを確認すると，おそらくフィルタ半径=int(sigma*truncate+0.5) [[code](https://github.com/scipy/scipy/blob/v1.5.4/scipy/ndimage/filters.py#L214)]

### 結果例
truncateは4以上だとほとんど変わらないので，特にイジる必要はなさそう．
![mandrill.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364756/f91f153a-449b-e15f-0e56-d8c9851bd381.gif)
CentOS7 にて、空パスワードのユーザ作成

# 1.はじめに

* CentOS7 上に空パスワードのユーザを作成し、手元端末からログインできるようにするまでの手順メモ。
* MacOS の物理媒体を用意。ターミナルから CentOS7 に対して、空パスワードユーザでログインできることを確認する。

# 2. 手順

* まずはユーザの作成・暫定パスワードを設定

```
# useradd <作成したいユーザ名>
# passwd <上で作成したユーザ名>
ユーザー <上で作成したユーザ名> のパスワードを変更。
新しいパスワード: ******** 
新しいパスワードを再入力してください: *******
passwd: すべての認証トークンが正しく更新できました。
```

* 上記で作成したユーザのパスワードを削除する。

```
# passwd -d <上で作成したユーザ名>
ユーザー <上で作成したユーザ名> のパスワードを削除。 
```

* このままではまだログインできない(初期設定では、空パスワードのログインが許可されていない)。
sshd の config ファイルを編集する。

``` 
# vi /etc/ssh/sshd_config 

※ 以下の箇所を「yes」に変更。
PermitEmptyPasswords yes
```

* 上記編集後、sshd を再起動する。

``` 
# systemctl restart sshd
``` 

以上で、空パスワードでのユーザログインが実現できる。
Kerasでメモリが足りないときの逐次処理方法

# 概要
model.fit_generatorを使います。
https://keras.io/ja/models/model/#fit_generator

### 環境
- Keras: 2.4.3
- python: 3.6.9

# 使い方
メモリが少なくなった時、一番お手軽にできる対処法はbatch_sizeを減らすことですが、paddingなどの前処理をした時点で気絶したり、そもそもデータが巨大すぎて全て乗らず一度に前処理すらできないこともあるかと思います。
その場合はモデルの訓練時に、batchごとにデータロード→前処理をしなければなりません。

fit_generatorでは、通常データを指定すべきところに関数を指定することができます。
また、validation_data=で検証用データに対しても関数を指定できます。
この関数内 (generate_arrays) で上記の処理を行います。generate_arraysは後程定義します。

```python
batch_size = 8 # 一度にメモリに乗せるデータ
model.fit_generator(
    generate_arrays(x_train, y_train, batch_size),
    validation_data=generate_arrays(x_test, y_test, batch_size),
    epochs=3,
    steps_per_epoch=len(x_train) // batch_size,
    validation_steps=len(x_test) // batch_size
)
```

steps_per_epochで１エポックで何ステップ実行するかを決定します。これを決めないと終わりません。通常は、データ全てを見てほしいのでデータ全体の長さをバッチサイズで割ります。validation_stepsは検証データに関してのものです。

generate_arraysの中身は下のようになります。

```python
def generate_arrays(x, y, batch_size=32):
    i = 0
    while True:
        batch_df = x[i * batch_size : (i + 1) * batch_size]
        batch_y = y[i * batch_size : (i + 1) * batch_size]
        if (i + 1) * batch_size >= len(x):
            i = 0 # iのリセットは必要
        else:
            i += 1
        yield process_data(batch_df, batch_y)

# 前処理の一例
def process_data(batch_df, batch_y):
    arr = {}   
    # パディングして履歴の長さをそろえる
    for c in batch_df.columns:
        arr[c] = pad_sequences(batch_df[c], dtype='float32', maxlen=MAX_RES_TOKENS)
    
    return (arr, batch_y)
```

今回はデータ自体はメモリに乗ったが前処理を一度にできないパターンでした。x, yを受け取った後はまずDataFrameをバッチサイズに切り出します。
pythonのyieldはreturnと似ているのですが、ループが終わらずにまた実行されます。下記サイトが参考になります。
http://ailaby.com/yield/
次のepochに行ってもgenerate_arraysのiはリセットされないので、データサイズを超えるindexを見ようとした場合は0に手動でリセットする必要があります。

yieldするデータとしては(batch_x, batch_y)のタプルです。
もし、モデルの入力や出力に名前を付けていた場合、

```python
(
    {
        'in1': batch_in1, 'in2': batch_in2
    },
    {
        'out1': batch_out1, 'out2': batch_out2
    }
)
```
の形でyieldすれば大丈夫です。

## データが一度で乗らないとき
csvファイルなどが連番で大量にあるときは、事前に検証用データを分けておくなどして

```python
def generate_arrays(file_path, max_file_count):
    i = 0
    while True:
        batch_df = pd.read_csv(f"{file_path}/{i}.csv")
        batch_y = batch_df['answer']
        if i >= max_file_count:
            i = 0
        else:
            i += 1
        yield process_data(batch_df, batch_y)
```
などとすれば大丈夫です。ファイルごとにデータ数が変わる場合はcsvを読み込んだ後さらに切り出しを行います。

### 参考サイト
参考になりました、ありがとうございます。この記事は↓の内容をシンプルにしただけです。
[Kerasくんとgeneratorの魔法
](http://developers.goalist.co.jp/entry/keras-fit-generator)
【PHP】Laravelのデバッグ・変数の確認方法（var_export, dump, dd関数）

PHPのデバッグ方法がいくつかあるらしいので調べてみた。

####PHPの場合

1. [var_export関数](#1-var_export関数を使う)
2. [error_log関数](#2-error_log関数)

####Laravelの場合

1. [dump関数](#1-dump関数)
2. [dd関数](#2-dd関数)



<br> 
##PHPのデバッグ方法
###1. var_export関数を使う
`var_export`関数で変数の中身を確認することができる。

よく使われる`var_dump`よりも有効性が高く、出力は有効なPHPコードになる。

・`var_export ( $expression [, bool $return = false ] )`


```
php > $obj = array("a" => 1, "b" => 2, "c" => 3);
php > var_export($obj);
array (
  'a' => 1,
  'b' => 2,
  'c' => 3,
)
```

出力結果が`array('a' => 1, 'b' => 2, 'c' => 3)`となっており、連想配列の定義そのものになっている。


＞[var_dump, var_export, print_rの違いまとめ](https://qiita.com/yuta-38/items/9656a7c384e61ad569ea)




<br> 
##2. error_log関数
エラーをログファイルに出力し、コンソールに表示する方法。

・`error_log($変数名);`

ただし、使用にはコード冒頭でエラーログのオプションをONにし、ログの出力先ファイルを指定が必要。

```:冒頭への記述
ini_set("log_errors", "on")
ini_set("error_log", "ファイルパス＆ファイル名")
```


<br>
また、変数が配列の場合は、以下のようにする必要がある。
error_log(print_r($変数名), true);



<br>
##Laravelのデバッグ方法
Laravelの場合、dump関数やdd関数を使うと画面上に背景黒・文字色白で選択したデータを表示することができる。

###dump関数とdd関数の違い

dump関数は通常の画面 ＋ dump関数を記述した位置にその内容が表示される。つまり、そのページのコードをすべて読み込む。

一方で、dd関数はdd関数の内容のみの表示となる。


<br>
###1. dump関数

```php:.blade.php
@php
  dump($tdth);
@endphp
```

**▼ブラウザの表示例**

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/4a18af0b-fb67-508a-10c8-2ff75d37edf5.png)|
|:--|

変数の内容以外のリソースも表示される。


<br>
###2. dd関数
dd関数とは「dump and die」の略。

意味は、変数の内容を表示（dump）するが、それ以降は実行されない(die)。

```php:.blade.php
@php
  dd($tdth);
@endphp
```

**▼ブラウザの表示例**

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/e7f70561-de45-db9e-a521-c8f8dee8bbc6.png)|
|:--|

指定した変数の内容のみを表示する。
Query EditorでWorkFlowAlertテーブルを検索する

ToolingAPIを使用するチェックボックスをtrueにすると可能でした。

結構便利かもしれない。色々と応用できそうです。
MATADETA APIを使う方法しかないと思っていたところでした。

[how to report/query the recipients of email alerts](https://salesforce.stackexchange.com/questions/33684/how-to-report-query-the-recipients-of-email-alerts)
Oh My Zsh のインストール (Mac)

# Oh My Zsh とは？
zsh のコマンドラインをいい感じに表示してくれるツールです。
.zprofile で PROMPT をいじるのもいいですが、自分好みに設定するのが意外と手間がかかります。
Oh My Zsh を使うと、最初に設定するのはもちろん、気分に応じて設定を変えるのもカンタンです。
[このページ](https://github.com/ohmyzsh/ohmyzsh/wiki/themes)に載っているスクショを見ると雰囲気が掴めます。

### 参考文献
[oh my zsh 導入手順メモ (Mac)](https://qiita.com/NaokiIshimura/items/249bb1a101b626a59387)
[Oh My Zsh の公式ページ](https://ohmyz.sh)

###  この記事で使用した環境
macOS Big Sur 11.1
iTerm2 Build 3.4.3

#0. 事前にやっておくこと
iTerm2 のインストール
https://www.iterm2.com/


#1. Oh My Zsh のインストール

以下のコマンドを実行

``` 
curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh
```

#2. Powerline fonts のインストール

以下のコマンドを実行

```
git clone https://github.com/powerline/fonts
cd fonts
./install.sh
```
[Powerline fonts 公式ページ](https://github.com/powerline/fonts)

#3. iTerm2 の設定
``` iTerm2 > Preferences > Profiles > General ```
Command のプルダウンから Command を選んで /usr/local/bin/zsh を入力
![スクリーンショット 2021-01-05 12.11.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1003998/0943eeaf-d4d4-f127-f30a-56062ad0715f.png)

``` iTerm2 > Preferences > Profiles > Text ```
Font のプルダウンからお好きな Powerline フォントを選択する 
_末尾に Powerline と書いてあるものから選ぶと間違いないです (具体的なフォント名は[こちらを参照](https://github.com/powerline/fonts#font-families))_。

![スクリーンショット 2021-01-05 11.51.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1003998/6e3869bb-14c0-e8f7-ec39-b4c0114aa1a9.png)


# 4. テーマを選ぶ
自分の好きなテーマを以下から選ぶ
https://github.com/ohmyzsh/ohmyzsh/wiki/themes

# 5. 環境変数 ZSH_THEME を変更する

4 で選んだテーマの名前を .zshrc の ZSH_THEME に入力して保存
_ここでは crcandy を選択しました_

```
vi ~/.zshrc
```

```
# Set name of the theme to load --- if set to "random", it will
# load a random theme each time oh-my-zsh is loaded, in which case,
# to know which specific one was loaded, run: echo $RANDOM_THEME
# See https://github.com/ohmyzsh/ohmyzsh/wiki/Themes
ZSH_THEME="crcandy"
```

# 6. iTerm2 再起動 or .zshrc 再読み込み

```
. ~/.zshrc
```

自分で選んだテーマが表示されたら設定完了です。
お疲れ様でした。
"git-credential-osxkeychain"の真正性を確認できません、、の対処法

# 状況
Macに標準で入っているgitをHomebrewで管理するようにした後、`brew search`コマンドを実行すると、画像のポップアップが出てきて、「拒否」のボタンしか押せない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694973/e147d9d3-c35f-afa1-7f87-852ed8ec97dd.png)

# 解決策
<a href="https://docs.github.com/en/free-pro-team@latest/github/using-git/updating-credentials-from-the-macos-keychain#updating-your-credentials-via-keychain-access">GitHubの公式ドキュメント</a>に答えがありました。スポットライトで`Keychain access`と打ってアクセスした後、github.comの`internet password`を削除すればポップアップは表示されなくなり、コマンドも使えるようになりました。

# 原因
そもそもなぜこのようなポップアップが表示されたのでしょうか。これも先ほどの公式ページのリンクから引用させていただきます。

>You should create a personal access token to use in place of a password with the command line or with the API. Personal access tokens (PATs) are an alternative to using passwords for authentication to GitHub when using the GitHub API or the command line.

要は、「パスワードを使ってAuthentificationする方法が廃止されるので、代わりにPATs(自分のリポジトリで発行したトークン)を使ってね。」ということになります。したがって、このパスワードを削除してしまって、コマンドを実行すれば（最初はユーザー名とパスワードが要求される）いいわけです。

# 余談
brewでgitをインストールした際には合わせて<a href="https://github.com/awslabs/git-secrets">git secrets</a>もインストールしないとコマンド実行した際にエラーが出ます。この`git secret`のよって、例えば「AWSの秘密鍵を誤ってコミットしてしまった」ということを防ぐことができます。ただし、インストールするだけでは有効にならないので、自分で設定する必要があります。設定方法については以下の記事が参考になりました。

<a href="https://qiita.com/jqtype/items/9196e047eddb53d07a91#%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E4%BD%BF%E3%81%84%E6%96%B9">git-secretsはじめました</a>
【備忘】【TypeScript】tsconfig.jsonとかbabel.config.jsonとかって何？

# 記事の意図
tsconfig.jsonとかbabel.config.jsonとか何をしているのか不明だった。
だから、ざっくりと理解する。

# TSCとBabelの共通機能
TSCもBabelも「TypeScritpからJavaScript」へのトランスパイル（翻訳作業）をしてくれる。

- TSCによる翻訳作業のルールを記述するのが、tsconfig.json。
- Babelによる翻訳作業のルールを記述するのが、babel.config.json。

（もちろんトランスパイルするだけではなく、他にもいろいろしてくれるけどざっくりとそう理解しました）

# ここで新たな疑問
なんでtsconfig.jsonとbabel.config.jsonが両方あるの？

# TSCとBabel、それぞれの特徴を生かして、役割分担をしているから
[Using Babel with TypeScript](https://www.typescriptlang.org/docs/handbook/babel-with-typescript.html)を読んでだいぶすっきりしました。

TSCとBabelはトランスパイル機能を持つけれど、それぞれに特徴がある。

### TSC vs Babel
|  | .d.tsの作成 | トランスパイル時の型チェック | ビルドパイプラインを作成 |
|:-:|:-:|:-:|:-:|
| TSC  | 〇  |  〇 |  × |
| Babel  | ×  | ×  |  〇 |

※.d.tsファイル（宣言ファイル）、ビルドパイプラインについては割愛

ざっくり、このような特徴があるらしい。

これらすべての機能を使いたいから、TSCもBabelも採用しているプロジェクトが多いとのこと。

# おわりに
tsconfig.jsonとbabel.config.jsonが両方ある理由がわかりました。
ざっくりと理解したので触りながら、その機能を少しずつ確かめていきます。
XMLHttpRequestオブジェクトとは

#XMLHttpRequestオブジェクトとは
**スクリプト言語でサーバーとのHTTP通信を行うための組み込みオブジェクト。**

＜よく使うメソッド＞
◎open
　（使える場面）
　・新しく作成されたリクエストを初期化したいとき
　・既存のリクエストを再初期化したいとき

　（例）

```javascript:index.js
var ajax = new XMLHttpRequest();
ajax.open('GET', 'URL');
```

◎responseType
　列挙型の文字列地
　（使える場面）
　・レスポンスに含まれているデータの型を示したいとき
　・レスポンスの型を変更したいとき

　（例）

```javascript:index.js
var ajax = new XMLHttpRequest();
ajax.responseType = 'json';
```




◎send
　（使える場面）
　・リクエストをサーバーに送信したいとき

　（例）

```javascript:index.js
var ajax = new XMLHttpRequest();
ajax.send(null);
```
JavaScriptのオブジェクトとJSONの違い【今更ですが・・・】

【更新情報】
1/7(木)：コメントにてご指摘して頂いたので、タイトルを「JSON型」から「JSON」に変更しました。

今更ならが、JavaScriptのオブジェクトとJSONの違いについてメモっときます。

（「そういえばどこが違うんだっけ・・・」となってしまったので。笑）

##JavaScriptのオブジェクトとJSONの違い

JSONはJavaScriptの記法を元に生まれたので書き方が似ているけど、オブジェクトとJSONは全然別物。

**オブジェクト・・・プロパティの集まりの名称
JSON・・・テキストベースのデータフォーマット**

【補足】
データフォーマット・・・特定の形式 (フォーマット) に当てはめられたデータの集まり

ちょっと理解しづらいですが、まぁ何となく理解できればOKかと。
ちなみにデータフォーマットはJSON意外だと、`XML`や`CSV `などがありまっする。

##JavaScriptのオブジェクトとJSONの書き方の違い

凄く単純で、**キー名を`ダブルクォーテーション("")`で囲んでるかどうか**で判断すればOK。

###オブジェクトの書き方
オブジェクトの書き方は以下の通り。
・キー名は`ダブルクォーテーション("")`または`シングルクォーテーション('')`で`囲む or　囲まないどっちでもOK。`
・値は`ダブルクォーテーション("")`または`シングルクォーテーション('')`で`囲む。`
・`最後のカンマはあってもなくてもOK`

下記のようなパターンがある。
でも**「キー名は囲まずに、値の文字列はダブルクウォーテーションで囲む」のが一般的。**

```
{ 
  id: 0,
  test: "テスト",
}

{ 
  id: 0,
  test: 'テスト',
}

{ 
  "id": 0,
  "test": 'テスト',
}

{ 
  'id': 0,
  'test': 'テスト',
}
```

###JSONの書き方
JSONの書き方は以下の通り。

・キーを`ダブルクオーテーション（""）で囲む`
・値の文字列を`ダブルクォーテーション（""）で囲む。 `
・`最後のカンマはつけられない。`

```
{ 
  "id": 0,　//文字列は囲まない
  "test": "テスト" //最後はカンマなし
}
```

こんな感じ。

##JSON.stringify()とJSON.parse()の違い

`JSON.stringify()`はJavaScriptのオブジェクトをJSON文字列に変換する関数。 
`JSON.parse()`JSON文字列をJavaScriptオブジェクトに変換する関数。
NuGetパッケージをGitHubPackagesにPushしようとして404が返ってくる場合の対処

# 実現したいこと

- C#でNuGetパッケージを作成する。
- GitHubでコードを管理する。
- GitHubActionsで、当該リポジトリのGitHubPackagesに配置する。

# 起きた事象

GitHubActions内にてNuGetパッケージをPushする。

- 環境変数
    - `${GITHUB_TOKEN}` = `${{ secrets.GITHUB_TOKEN }}`
    - `${NUGET_SOURCE}` = GitHubPackageのURL
      - 例: `"https://nuget.pkg.github.com/{organization-name}/index.json"`

```sh
dotnet nuget push '*.nupkg' -k ${GITHUB_TOKEN} -s ${NUGET_SOURCE} --skip-duplicate
```

404エラーが返ってくる。

```sh
Pushing {package-name}.nupkg to 'https://nuget.pkg.github.com/{organization-name}'...
  PUT https://nuget.pkg.github.com/{organization-name}/
  NotFound https://nuget.pkg.github.com/{organization-name}/ 377ms
error: Response status code does not indicate success: 404 (Not Found).
```

# 原因・対処

NuGetパッケージとなるC#プロジェクトの `.csproj` ファイルを確認します。

- RepositoryUrl
    - このURLがGitHubのリポジトリURLと一致していない場合、404エラーが返ってきます。

```xml
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.1</TargetFramework>
    ...
    <RepositoryUrl>https://github.com/{organization-name}/{repository-name}</RepositoryUrl>
    ...
  </PropertyGroup>

  <ItemGroup>
    ...
  </ItemGroup>
</Project>
```

# 備考

個人リポジトリでもOrganizationsリポジトリでも同様と思われます。
また、今回はGitHubActionsでのエラーでしたが、ローカルからCLIでPushしようとしても同様にエラーになります。

NuGetパッケージを作成する場合は、PropertyGroupをきちんと記述したほうがいいですね。

- [.NET Core の csproj 形式に追加されたもの # NuGet メタデータ プロパティ](https://docs.microsoft.com/ja-jp/dotnet/core/tools/csproj#nuget-metadata-properties)
manimの作法 その8

#概要

manimの作法、調べてみた。
NumberPlane と ParametricFunction、使ってみた。

#サンプルコード

```
from manimlib.imports import *

def lissajous_curve_func(t):
	return np.array((np.sin(2 * t) * 3, np.sin(3 * t) * 3, 0))

class test(Scene):
	def construct(self):
		grid = NumberPlane()
		self.add(grid)
		func = ParametricFunction(lissajous_curve_func, t_max = TAU, fill_opacity = 0)
		#dot = Dot()
		#self.add(dot)
		self.add(func)
		self.wait()
```

#結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c1145af7-8bdb-03f6-ad00-1d6f360f8a79.png)

以上。
デスクトップ上のEdgeを消したい【忘備録】

WindowsPCを構築するうえでよくありそうな要望(主観的な所感)で
「デスクトップ上のEdgeを消したい」について方法。
構築上どうしても不特定多数がログインすることが想定されているため、
すべてのユーザごとにEdgeを消すわけには行かないし、
またそれを「各個人でやってください」というわけにもいかない場合がある。

いやもう本音、Edge使えよと思うが会社のシステム上Javaを使っていると
どうしてもそうはいかないことも多々。

そこまで言うならEnterprise版買えばいいじゃないかと思う今日この頃です。
会社でPro版買うと細かな設計をWindowsPCごとにつけなきゃならないのが
とても面倒。あとADのGPOではEnterpriseならできるけどそれ未満はできない
なんて項目もあったりなかったり…

割と多いのでスクリプト化させれば良い。

結論

```bat:Edge削除コマンド
del "C:\Users\Public\Desktop\Microsoft Edge.lnk"
```

これで消えます。

20H2はこれ
https://mitsushima.work/archives/24678027.html
Gitlabでコンフリクトが起きた!!ローカルで解消するには、、、？



```:mainのブランチ
git pull
```

```:作成したブランチ
git merge 「メインブランチ」 
```

ここでコンフリクトが起きるので、コードを修正し解消する。

あとは通常通り、

```
git add .
git commit -m "コミットの名前"
git push origin "作成したブランチ"
```

これで解決しました！
自己注意Self-Attentionについて、全く、頭に入っていない。（まだ、前半のみの記載。）

#概要
以前、

[自己注意Self-Attention の解説でわかりやすいと思った記事N選　(まだ、N＝4）](https://qiita.com/enoughspacefor/items/c9810d1065741a7f461c)

という記事を書いた。
記事を書いた理由は、たぶん、ViTとかの仕組みを理解したいと思い、その入り口としてAttentionに着目し、
記事でも書けば、理解が促進されるんだろうなと
思ったのだろうと想像する。

しかし、結果として、いま、自己注意Self-Attentionが全く何も頭のなかにない。

今の頭の中の理解（多分、間違えているが。。。）を示し、その後、正しい答えを整えようと思う。

#自己注意Self-Attentionとは（←いまの記憶というか理解。間違っている可能性大。）
## まず、attentionとは
これは、文章等で、語句と語句の関係性の強さのようなものを表現するもので、ある語句Aは、別の語句B、C、D、、、、と各々、どの程度の関係性があるのかを示すもの
というイメージかと思う。

## では、Self-付きのAttentionとは
###可能性１
ここでのSelfがわからないが。。。。
このAttentionは、翻訳とかの世界で成果を出している技術なので、例えば、入力と出力の文章を同一とし、学習させること。
この同一状態をSelfを呼ぶ。
（たぶん、学習というような説明はなかった記憶があるので、これは、たぶん、違う。）

###可能性２
AttentionとSelf-Attentionは、同じ、意味で、
文章の意味を語句とその語句の関係性で、いったん、表現しなおす、
すなわち、ある文章の自己(Self)の構造をAttentionで表現する作業。これで、文章が語句の羅列から意味のあるデータ構造にかわる。

#少し発展させて翻訳とかの分野のAttentionの学習のさせ方（←いまの記憶というか理解。間違っている可能性大。）
##　可能性１
上記のAttentionとしての構造の分析をともないつつ、
理想となる翻訳の対で学習する。

##　可能性２
（こちらのほうが恰好がいいが、）翻訳の対で学習することはなく、個別の言語で言語を意味を学習しきる。
あとは、アウトプットする言語を選ぶのみとする。

#疑問（←いまの記憶というか理解。間違っている可能性大。）
語句の関係性だけでは、そのそものコアとなる意味が発生しないと思うが、、、
それはなくてもいいのか？？
そこは、言語だけの範囲でやっている場合、空洞化するものかも。。。

#★★正解作成中
一旦、正解を作成するのを休止します。
以下とかをカンニングしましたが、、、激烈に難しいですね。。。。
素人の手には負えません。**現在の理解は、０点。(2021/1/6)**
しばし。。。。
もう少し簡単なサブセットの課題をこなします。


[自己注意Self-Attention の解説でわかりやすいと思った記事N選　(まだ、N＝4）](https://qiita.com/enoughspacefor/items/c9810d1065741a7f461c)


#まとめ
余興のような記事です。ご容赦。
頭に全然入っていなということは、刺激のない情報だったのだろうと想像します。
もしくは、理解が深まらなくて結果として刺激のない解釈になったのか。
追って、正解を勉強して記載します。
３秒で画像をトリミングできます

今回は画像サイズがバラバラな状態から、たった一行CSSを付け加えるだけで画像をトリミングできる方法をお伝えします。
結論から言ってしまうと今回使用するプロパティーは「object-fit」になります。
おそらく聞いたことある人も多いかもしれません。
具体的な使用法ですが、本当に簡単です。
通常であれば
img {
width:100px;
height:100px;
}
としますよね。そうすると画像が縦や横に伸びて変な感じになりますが、先程紹介したプロパティーを追加してみてください。
img {
width:100px;
height:100px;
object-fit:cover;
}
これだけです！本当に簡単ですよね！
ただ、、、
自分が配置したい箇所が必ずしも中央にあるとは限りませんよね？
中央以外でトリミングしたい場合だってあります。
安心してください。こちらも簡単です。
今度は「object-position」プロパティーを設定しましょう。
object-position :縦の位置　横の位置;
このようにすれば簡単にお好みの部分にフォーカスしてトリミングすることができます。

今回は簡単にトリミングする方法を紹介しました。
今までpositionを使ってきた方からすれば早く紹介してよと言われそうな気がします...

では!
AWS　データベース

#Amazon　Relational　Database　Service（Amazon　RDS）
VPCにEC2同様にDBインスタンスを配置する（MySQL、MariaDB等）

##Amazon　Aurora
RDSで使用できるDBエンジン
##Amazon　Aurora以外の場合
EC2インスタンスに自前でインストールして使用する
ブロックストレージ（DBの保存スペースをボリュームという単位で確保する方法）で構築される

※AmazonAuroraのDBを使用すると、EC2に保存されるのではなく、アベイラビリティーゾーンに保存される（それもゾーン（1a、1c、1d）それぞれが通信しており、1つのアベイラビリティーゾーンが障害が起きても、代替え、代替えしてるあいだに自動修復するような仕組みになっている）

##Amazon　ElasticCache
Redis及Memcachedと互換性のあるインメモリデータストアを提供する 
###Redis＝　めっさ早くDBを検索してくれる＆それなりに検索機能がある
###Memcached=　めっさめっさ早くDBを検索してくれる

※RDBMS（リレーション・DB・マネジメントサービス）＝複雑操作可能だから遅い

※同時多発的なゲームなどの集計など、今後多くのミリ秒以下を扱うもの
（運転？手術？とかの開発に使われてくるのかね？）
はじめてのDjangoルーティング

# やりたいこと

* Djangoを初めて触る。
* Djangoのルーティングを試したい。
* CakePHPなどMVCフレームワークのルーティングは実装経験がある。
* class-based view と function-based view の使い分けなどは後日。

# 前提

* 環境はCentOS8+Anaconda+Djangoで構築済み。手順 https://qiita.com/kenichiro-yamato/items/1a459e7dc0ad0223e55e
* appは `/home/yamato/myapp` に作成済み。

# 設定ファイル urls.py

URLとクラス・ファンクションの対応付けを設定するファイル。
CakePHPの `routes.php` に相当するもの。

```
vi /home/yamato/myapp/myapp/urls.py
```

urlと、それに対応するクラス、ファンクションを下記のように記載する。

```python
from django.contrib import admin
from django.urls import path
import myapp.views as hello
urlpatterns = [
    path('admin/', admin.site.urls),
    path('hoge/', hello.index),
]
```
`hoge` がurlで、`hello.index` がクラス・ファンクション。

# ビューファイル views.py

views.py は、myapp作成時点ではデフォルトでは存在していないので、
まずはファイルを新規作成する。
urls.py と views.py を同じディレクトリに置く。


```
vi /home/yamato/myapp/myapp/views.py
```

下記のようにファンクションを実装する。

```python
from django.http import HttpResponse
def index(request):
    return HttpResponse("I am Kenichiro-Yamato.")
```


# 解説

ブラウザから
http://192.168.1.xx:8000/hoge/
にアクセスした際、下記のように表示させたいとする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/ccba0ba5-f6dc-1fbc-e195-f61a11ee29a7.png)

これは、下記の2ステップで実装できる。

### (1) views.py を作成する。

```
vi /home/yamato/myapp/myapp/views.py
```

```python
from django.http import HttpResponse
def index(request):
    return HttpResponse("I am Kenichiro-Yamato.")
```

* function名が `index` である点に着目。
* ファイル位置が `/home/yamato/myapp/myapp` である点に着目。




### (2) urls.py に追記する。

```
vi /home/yamato/myapp/myapp/urls.py
```

```python
from django.contrib import admin
from django.urls import path
import myapp.views as hello
urlpatterns = [
    path('admin/', admin.site.urls),
    path('hoge/', hello.index),
]
```

* `import myapp.views as hello` に着目。
* `path('hoge/', hello.index),` に着目。

# 修正してみる。


### views.py を下記のように修正。

```python
from django.http import HttpResponse
def printMessageFromYamato(request):
    return HttpResponse("I am Kenichiro-Yamato.")
```

* ファンクション名を `index` から `printMessageFromYamato` に変更した。


### urls.py を下記のように修正。

```python
from django.contrib import admin
from django.urls import path
import myapp.views as view
urlpatterns = [
    path('admin/', admin.site.urls),
    path('yamato/', view.printMessageFromYamato),
]
```

* `import myapp.views as view` に修正した。
* `path('yamato/', view.printMessageFromYamato)` に修正した。






http://192.168.1.14:8000/yamato/

にアクセスして下記が表示されたらOK。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/cd7bac4b-767a-8caa-aeae-a1af200bd437.png)
jqコマンドで、小数点以下n桁で切り捨てる

# やりたいこと

[jqコマンド](https://stedolan.github.io/jq/manual/)で「数値の小数点以下切り捨て」をする[floor関数](https://stedolan.github.io/jq/manual/#floor)ですが、
この関数は引数を取らず、「小数点以下n桁目で切り捨て」みたいな桁数指定ができません。

```shell
# NICTのWeb APIで現在時刻を取得
$ curl -s http://ntp-a1.nict.go.jp/cgi-bin/json
{
 "id": "ntp-a1.nict.go.jp",
 "it": 0.000,
 "st": 1609809594.456,
 "leap": 36,
 "next": 1483228800,
 "step": 1
}

# ミリ秒単位から秒単位に丸め
$ curl -s http://ntp-a1.nict.go.jp/cgi-bin/json | jq '.st | floor'
1609809594

# ミリ秒単位から0.1秒(100ミリ秒)単位に丸め
$ curl -s http://ntp-a1.nict.go.jp/cgi-bin/json | jq '.st | floor(1)'
jq: error: floor/1 is not defined at <top-level>, line 1:
.st | floor(1)      
jq: 1 compile error
(23) Failed writing body
```

何とかして、桁数指定の切り捨てをする方法です。

# 実現方法

`floor`の前後に掛け算割り算をして、桁数を調整します。
`jq`に限らず、一般的に使われる方法ですね。

## 小数点以下の桁数を調整

`floor(1)`的な奴です。
掛けて、floorして、割る。

```shell
# ミリ秒単位から0.1秒(100ミリ秒)単位に丸め
$ curl -s http://ntp-a1.nict.go.jp/cgi-bin/json | jq '.st *10|floor/10'
1609809594.4
```

## 小数点以上の桁数を調整

`floor(-3)`的な奴です。
割って、floorして、掛ける。

```shell
# ミリ秒単位から1000秒単位に丸め
$ curl -s http://ntp-a1.nict.go.jp/cgi-bin/json | jq '.st /1000|floor*1000'
1609809000
```

# 補足

* 切り上げ、四捨五入なども同様で、Math系の関数群にある`ceil`, `round`, `trunc` あたりを`floor`の代わりに使えば同じ挙動になります
  * https://stedolan.github.io/jq/manual/#Math

* C言語の`math`系関数に準拠しているようなので、傾向と対策はC/C++のノウハウと共通
  * [C++言語で少数第n位で四捨五入する](https://moritomo7315.hatenablog.com/entry/2019/02/09/140757)

* 負の数を切り捨てるときは、`floor`より`trunc`の方がお勧め
  * [trunc | Programming Place Plus　Ｃ言語編　標準ライブラリのリファレンス
](https://programming-place.net/ppp/contents/c/appendix/reference/trunc.html)


* 処理系によっては使えない場合もあるようです
  * [ubuntuのjqコマンドで四捨五入する（round, ceil関数がない場合と、その対策）](https://qiita.com/s_satoh/items/51fff538fc4431633018)

ではまた～。
【PHP】mb_send_mailでうまく改行されないときに気をつけること


#【PHP】mb_send_mailでうまく改行されないときに気をつけること

###使用環境
* XAMPP 8.0 (PHP 8.0)
* windows 10

##背景
websiteを制作していてお問い合わせページから送られてきたメールで改行コードがそのまま出力される、改行できていないという事態が発生。

##原因
改行コード```\r\n``` をシングルクォーテーションで囲んでいたため、文字として出力されていた。

>文字列を指定する最も簡単な方法は、引用符 (文字 ') で括ることです。
引用符をリテラルとして指定するには、バックスラッシュ (\) でエスケープする必要があります。 バックスラッシュをリテラルとして指定するには、二重 (\\) にします。 それ以外の場面で登場するバックスラッシュは、すべてバックスラッシュそのものとして扱われます。 つまり、\r や \n といったおなじみのエスケープシーケンスを書いても特別な効果は得られず、 書いたままの形式で出力されます。
[PHP公式マニュアル](https://www.php.net/manual/ja/language.types.string.php)

```php
  $message = 'お問い合わせを受け付けました。\r\n'
    . '名前：' . $_SESSION['name'] . '\r\n'
    . 'tel：' . $_SESSION['tel'] . '\r\n'
    . 'お問い合わせ内容：' . '\r\n'
    . $_SESSION['message'];

  mb_send_mail($_SESSION['email'], 'お問い合わせありがとうございます', $message);
```

##解決方法1：改行コードをダブルクオーテーションで囲む
ダブルクオーテーションで囲むことで二重引用符として扱われ、改行できる。

>二重引用符
文字列が二重引用符 (") で括られた場合、 PHP は、以下のエスケープシーケンスを特殊な文字として解釈します。
[PHP公式マニュアル](https://www.php.net/manual/ja/language.types.string.php)

```php
  $message = 'お問い合わせを受け付けました。'."\r\n"
    . '名前：' . $_SESSION['name'] . "\r\n"
    . 'tel：' . $_SESSION['tel'] . "\r\n"
    . 'お問い合わせ内容：' . "\r\n"
    . $_SESSION['message'];

  mb_send_mail($_SESSION['email'], 'お問い合わせありがとうございます', $message);
```


##解決方法2：実行環境のOSに対応する改行コードを出力する定数PHP_EOLを使用する

>PHP_EOLは実行環境のOSに対応する改行コードを出力する定数になります。
例えば、Windows環境の改行コードは 「\r\n(CRLF)」 Linux/Unix系、MacOS等の改行コードは「\n(LF)」になります。
そのため、この定数を文字列と結合することでコンソールに改行された状態で出力することができます。
ただ注意しておきたいのが、ブラウザで見た際にはPHP_EOLでは改行されません。
理由としては、php/HTMLファイルを表示する際はHTMLと認識されるため、改行コードではく「<br>」で改行されます。
[PHPでphp_eolを使う方法【初心者向け】](https://techacademy.jp/magazine/19134)

```php
  $message = 'お問い合わせを受け付けました。' . PHP_EOL
    . '名前：' . $_SESSION['name'] . PHP_EOL
    . 'tel：' . $_SESSION['tel'] . PHP_EOL
    . 'お問い合わせ内容：' . PHP_EOL
    . $_SESSION['message'];

  mb_send_mail($_SESSION['email'], 'お問い合わせありがとうございます', $message);
```
作りたいものが特にないのでAtCoderをやる


AtCoder
　　・AtCoder Beginner Contest（略してしてABC）に参加する。
　　　https://atcoder.jp/contests/
　　・レーティング（難易度）は灰、茶、緑、水、青、黄、橙、赤の順でLVが高くなる。
　　　水色まで行けば、仕事をする上で能力的には十分らしい（アルゴリズムの面のみ）

目標
　　・できること、できそうなことを毎日2時間以上取り組むことを目標とする。

ルーティン
　　<毎日>
　　　　・ひたすら過去問をやる。低レーティングからすべてクリアする。
　　　　　https://kenkoooo.com/atcoder/#/table/
　　<毎週末>
　　　　・週末にコンテストが行われるので、
　　　　　AtCoder Beginner Contest(ABC)にとりあえず参加する。
　　　　　https://atcoder.jp/contests/

考察
　　・問題の考察は必要。
　　　特に名前のついているアルゴリズムは考察ノートをつける。

注意
　　・モチベーションが落ちるようなことはしない。他人との比較やコンテストの出来など。
　　・瞬殺できるレベルまでやりこむこと。
　　・エンジニアとしての総合力は伸びないので、あくまで補完と考えること。
Sassのfunctionと使い方について

## はじめに

タイトルについて記事にしました。
この記事で得る内容は以下の通りです。

・ Sassのfunction（自作関数）と使い方について

mixinと比べ、使用頻度は減るかと思いますが、コーディングの幅が広がると思いますので
使い方について簡単ではありますが記事にしました。

## 例

#### 関数の定義

Sassで自作関数を定義する方法は、以下のように記述します。
引数を囲む( )は、引数があってもなくても必要です。

```sass
@function 関数名(引数) {
  @return 
}
```

関数`colorRed`を定義し、それを.testの`color`プロパティに呼び出してみます。

```scss:style.scss
@function colorRed() {
  @return #00f
}

.test {
  color: colorRed();
}
```

CSSにコンパイルすると以下のようになります。
`@return`されると、`00f`が`color`プロパティの値としてそのまま代入します。

```css:style.css
.test {
  color: #00f;
}
```

#### 引数

( )に`$引数名`を定義すると、関数の中で使える変数として扱うことができます。
.testの`color`プロパティに関数`colorCode`の引数を`green`と記述してみます。

```scss:style.scss
@function colorCode($value) {
  @return $value
}

.test {
  color: colorCode(green);
}
```

CSSにコンパイルすると以下のようになります。
引数に指定したプロパティがそのまま反映されます。

```css:style.css
.test {
  color: green;
}
```

##### 小数を変換する

次に、小数を%に変換する関数を作成してみます。
`width`プロパティへの引数に.5=50%を指定して、`@return`に返す引数の結果に100%を掛けます。

```scss:style.scss
@function widthSpace($value) {
  @return $value * 100%
}

.test {
  width: marginSpace(.5);
}
```

そうすると、`width`プロパティの値は50%となります。

```css:style.css
.test {
  width: 50%;
}
```

##### 引数を関数内で計算する

`$value`の値を関数の中で計算してから使うこともできます。

```scss:style.scss
@function marginSpace($value) {
  $value: $value * 3;
  @return $value * 100%
}

.test {
  margin: marginSpace(.12);
}
```

```CSS:style.css
.test {
  margin: 36%;
}
```

##### 四捨五入する

引数に0.255のような値を指定して、実行結果に小数点以下を切り捨てる場合はSassの組み込み関数を使います。

#### round

Sassの組み込み関数で、`round()`と記述し、( )に処理したい値を渡すと、四捨五入した値を返します。

```scss:style.scss
@function marginSpace($value) {
  $value: $value * 3;
  @return round($value * 100%)
}

.test {
  margin: marginSpace(.125);
}
```

```css:style.css
.test {
  margin: 38%;
}
```
Windows10のローカル環境で、jupyter labを使う方法

# はじめに
Windows10 環境に jupyter lab をインストールするのに手こずったため、記録を残しておきます。
jupyter lab のインストール手順を Google や Youtube で調べると、Anaconda をインストール手順がよく出てきます。私もそれに倣って、Anaconda 3 をインストールしました。無事に Anaconda 3 をインストールして、jupyter lab も起動するのですが、いくつか問題点がありました。

- Anaconda Navigator 画面から、jupyter lab を Lunch して起動する手順が面倒で嫌だった。
- jupyter lab の拡張機能のインストールができない（jupyter lab が壊れる？）

何度やっても上手くいかなかったので、この方法は諦めました。
そもそも jupyer lab が使いたいのであって、Anaconda 3 はいらないので、jupyter lab だけインストールする手順を再調査しました。

# jupyter lab のインストールと起動
とても簡単に完了しました。
以下のコマンドを叩くだけでした。

```Terminal:Tarminal
pip install jupyterlab
jupyter lab
```

# jupyter lab で変数一覧を表示したい
jupyter lab で変数一覧を表示する拡張機能「Variable Inspector」を使いたかったのですが、やめました。
何故かというと、VSCode で解決したからです。

# VSCode で Jupyter lab が動くし、変数一覧も表示される
VSCode で *.ipynb ファイルを開けるのが興味本位でやっていたら、「jupyter」なる拡張機能が「Microsoft」が用意してくださっていました。
この拡張機能をインストールして、 *.ipynb ファイルを開くと、なんと jupyter lab と似たインターフェースが表示され、動かくじゃないですか！？
しかもツールバーにある「Show variables in jupyter kernel」を有効にすると、変数一覧をテーブル表示してくれました。
すごく便利！！

# おわりに
今回は、Windows10 のローカル環境で、jupyter lab を使う方法を確認できました。
Python の学習がはかどりそうです。ありがとう、Microsoft。
SAMPLE GALLERY

素晴らしいサンプルの数々。見たいときに探せなくなうので、ここに記録。

しかし、時代はLWCなのか... ちゃんと勉強しないといけませんね。
Auraで挑戦してみようか。


https://trailhead.salesforce.com/sample-gallery



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/43f3b7c9-28c8-87e0-216b-0d030c92012b.png)
Udemy もう怖くないGit!チーム開発で必要なGitを完全マスター　(プルリクエスト・リベース・タグ・一時避難　編)

>引用先
>[Udemy もう怖くないGit!チーム開発で必要なGitを完全マスター](https://www.udemy.com/course/unscared_git/)
>このコースではGitの裏側でどのような挙動でGitが動いているのかを図で詳しく解説しているので深く知りたい方は受講してみることをおすすめします。

#プルリクエストとは
プルリクエストとは、自分の変更したコードをリポジトリの取り込んでもらえるよう依頼する機能。
バグを発生させないためにコードを他の人にレビューしてもらうためにプルリクエストがある。

#プルリクエストの手順
① masterブランチを最新に更新
② ブランチを作成
③ ファイルを変更
④ 変更をコミット
⑤ GitHubへプッシュ
⑥ プルリクエストを送る
⑦ コードレビュー
⑧ プルリクエストをマージ

#GitHub Flow
GitHub　Flowとは、GitHub社のワークフロー。
masterからブランチしてプルリクエストをしマージするといった基本的な流れのこと。

#GitHub Flowのポイント
・masterブランチは常にデプロイできる状態に保っておく
・新開発はmasterブランチから新しいブランチを作成してスタート
・作成した新しいブランチ上で作業しコミットする
・定期的にpushする
・masterにマージするためにプルリクエストを行う
・必ずレビューを受ける
・masterブランチにマージしたらすぐにデプロイする
　←テストとデプロイ作業は自動化

#リベース
変更を統合する際に、履歴をきれいに整えるために使うのがリベース。

```
git rebase <ブランチ名>
```
ブランチの基点(親コミット)となるコミットを別のコミットに移動する。

##リベースとマージの違い
リベース：履歴が一直線
 マージ：履歴が枝分かれ

##リベースでしてはいけないこと
GitHubにプッシュしたコミットをリベースするのはNG

GitHubにプッシュしたコミットをリベースすると、、
**GitHub上とローカルリポジトリとの親コミットが変わりプッシュできなくなる。**

##マージとリベースのメリット、デメリット

|　|マージ|リベース|
|:-:|:-:|:-:|
|メリット|コンフリクトの解決が比較的簡単|履歴を綺麗に保つことができる|
|デメリット|マージコミットがたくさんあると履歴が複雑化する|コンフリクトの解決が若干面倒|

###マージとリベースのコンフリクトの違い
マージはコンフリクトが一回しか発生しない。
リベースはコンフリクトが各コミットごとに発生する。

#プルのマージ型
```
git pull <リモート名><ブランチ名>
```
マージコミットが残るので、マージしたという記録を残したいときに使う。

#プルのリベース型
```
git pull --rebase <リモート名><ブランチ名>
```
マージコミットが残らないので、GitHubの内容を所得したいときにrebaseを使う。
何も変更していない時に使う。

#リベースで履歴を書き換える

```
git rebase -i <コミットID>
```
-iは --interactiveの略。
対話的リベースといって、やり取りしながら履歴を変更していく。

##①複数のコミットをやり直す
```
git rebase -i HEAD~3
↓
pick <コミットID> <コミットメッセージ>
pick <コミットID> <コミットメッセージ>
pick <コミットID> <コミットメッセージ>

↓　# やり直したいコミットをeditにする (pick → edit)
edit <コミットID> <コミットメッセージ>
pick <コミットID> <コミットメッセージ>
pick <コミットID> <コミットメッセージ>

↓　# やり直したら実行する
git commit --amend

↓　# 次のコミットへ進む(リベース完了)
git rebase --continue
```

###「HEAD~」とは
HEADは今いるコミット。
HEAD~3は3つ前の親コミットまで遡る。

##②コミットを並び替える、削除する
```
git rebase -i HEAD~3
↓
pick <コミットID> <コミットメッセージ>
pick <コミットID> <コミットメッセージ>
pick <コミットID> <コミットメッセージ>

↓  # 削除の場合    ：一行消す　
   # 並び替えの場合 ：行を入れ替える
pick <コミットID> <コミットメッセージ>
pick <コミットID> <コミットメッセージ>
```
削除は一行消す、並び替えの場合は行を入れ替えるだけでできる


##③コミットをまとめる
```
git rebase -i HEAD~3
↓
pick <コミットID> <コミットメッセージ>
pick <コミットID> <コミットメッセージ>
pick <コミットID> <コミットメッセージ>

↓  
pick <コミットID> <コミットメッセージ>
squash <コミットID> <コミットメッセージ>
squash <コミットID> <コミットメッセージ>
```
squashを指定するとそのコミットを直前のコミットと一つにする。

#コミットにタグをつける
タグをつけておくとコミットを参照しやすくするためにタグをつける。
リリースポイントによくつける。

#タグ一覧を表示する
```
git tag
```
アルファベット順にタグを表示する。

#タグを作成する
タグには2種類ある
注釈付き版 : annotated
軽量版 : lightweight

##注釈付き版を作成する
```
git tag -a <タグ名> -m "<メッセージ>"
```
-aオプションを付けると注釈付きタグを作成。
-mオプションを付けるとエディタを立ち上げずにメッセージを入力できる。

##軽量版を作成する
```
git tag <タグ名>
```
#タグのデータを表示する
```
git show <タグ名>
```
#タグをリモートリポジトリに送信する
```
git push <リモート名><タグ名>

# タグを一斉に送信する
git push origin --tags
```

#作業を一時避難する
コミットしたくないけど別ブランチで作業しないといけないときに一時避難する。

```
git stash
git stash save
```
saveは省略可能。

#避難した作業を確認する
```
git stash list
```

#避難した作業を復元する
```
# 最新の作業を復元する
git stash apply

# ステージの状況も復元する
git stash apply --index

# 特定の作業を復元する
git stash apply <スタッシュ名>
```

#避難した作業を削除する
```
# 最新の作業を削除する
git stash drop

# 特定の作業を削除する
git stash drop <スタッシュ名>

# 全作業を削除する
git stash clear
```