OmniAICreator/Qiita-1.07M huggingface dataset:
カスタムコンポーネントの動作プロパティを試す

実験的な機能、拡張コンポーネントのプロパティを使ってみた。

##ナニコレ
- ファイル→設定→詳細設定→実験的な機能→拡張コンポーネントのプロパティで試せる機能。
- 何これと思っても調べてみましたが検索しても出てこず、日本語もよく分からないので英語にして確認。
- カスタムコンポーネントのプロパティとして、ユーザーが定義した処理(関数など)をセットできるようだ。
- ダイアログコンポーネントなどの作成が捗りそう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/4f86b98d-8b35-4f58-9693-47a8b6a9cb74.png)

以前ideasで見かけたこれの実装かな。
https://powerusers.microsoft.com/t5/Power-Apps-Ideas/Actions-on-Components/idi-p/238399#comments


追記：後日公式ブログに上がってました。
https://powerapps.microsoft.com/ja-jp/blog/enhanced-component-properties/

##使い方
・まず適当なコンポーネントを作成
・コンポーネントにプロパティを追加し、プロパティタイプを「動作」にする
・データ型を選択？？？とあるけど気にせずテキストで
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/953c27ed-45fd-208b-1a20-bb96354d340c.png)

・コンポーネント内にボタンを配置し、OnSelectで、```コンポーネント名.動作プロパティ名()```を記述
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/f1a2307a-a4b6-a3cd-2fb6-c26b43605d4e.png)
・コンポーネントを実際の画面に配置して、先程の動作プロパティに```SubmitForm(Form1);Navigate(HomeScreen);```など任意の処理を記述。
・ボタンをクリックすると、プロパティに設定した処理が実行される。
・カスタムイベントのようなものですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/cc326e7f-87dd-33b2-2862-36c589dc4d59.png)


###使用例
確認ダイアログコンポーネント
・はい、いいえをクリックしたときの動作を呼び出し側から設定できます。
![YesNoDialog.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/350b82b4-2c22-807f-91be-42fc131853fa.gif)

ハンバーガーメニューコンポーネント
・メニューのアイコンやタイトルは入力プロパティ：テーブルで設定し、ギャラリーコントロールでリスト表示。
・メニューアイテムをクリックしたときの動作は、動作プロパティでFunc1、Func2と一つずつ設定。(イケてない・・)
→パラメータを使用して、呼び出し側で押されたメニュー番号を受け取り処理を分岐してもいいですね。
![SideNavBar.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/bb0d264e-cc81-8b7a-e8f8-08e25a548af9.gif)
・他にも、ヘッダーメニューの編集、保存、キャンセル、更新ボタンをコンポーネント化してレイアウトを共通化するなども可能になります。

##パラメータについて
・プロパティ設定でパラメータを設定すると、()内にパラメータを渡すことができ、呼び出し側でパラメータを受け取って処理をすることもできるようです。

[①パラメータの設定]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/91e0c037-600a-85f3-a29f-43601c3a6000.png)
[②コンポーネント側のボタン]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/e48e1571-42d0-45fb-ff66-02c205a8287f.png)
[③呼び出し側の動作プロパティの関数]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/9694367d-04a5-acfe-7064-20bc87da3de7.png)


##出力プロパティのパラメータ
- 更に、出力プロパティにもパラメータを設定できるようです。
- これはクラスメソッドのようなもので、コンポーネント名.出力プロパティ名(param1,param2)で実行し、コンポーネント側で引数としてパラメータを受け取り、自作関数を実装できるとのこと。
- ただし非動作プロパティであるため、内部にアクションを記述することはできず、一行目の処理で値を返す必要があり少し勝手が違います・・・<br>
※;で区切って複数の処理は書けず、IfやForAllなどの結果処理部分で値を返す必要がある。
- returnを使って戻り値を任意のタイミングで値を返せるようになればよいのですが・・
- 計算処理などでは使い道がありそうです。 
本実装が待ち遠しいですね。
M1 Macにhomebrewをインストールする（3.0.0版）

# ついに M1 Mac がhomebrew対応

今まで、M1Macでhomebrewを使う際には、iTerm2を`Rosettaを使用して開く`に設定して、インストールする必要がありました。

![スクリーンショット 2021-02-21 17.58.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323251/5ac6741b-0b77-a840-d126-81aefea7641f.png)

しかし、2月8日にApple Silicon対応の`3.0.0`版がリリースされました。（ただhomebrewでインストールできるパッケージが全てApple Siloconしたわけではないのでそこは注意です）

# インストール

公式通りにすれば問題なく、インストールできます。

```shell
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# パスを通します
$ echo 'eval $(/opt/homebrew/bin/brew shellenv)' >> ~/.zshrc
```

インストール後、`which brew`で確認すると`/opt/homebrew/bin/brew`にインストールされていることがわかります。今までのhomebrewは`/usr/local/bin/brew`にインストールされるはずなので、確かに違っていることが確認できると思います。
Amazon SageMaker Processing -Manifestファイルで必要なファイルだけコピーする-

# Amazon SageMaker Processing

Amazon SageMaker Processingは機械学習の前処理などを、お手軽に実行することができるマネージドサービスです。S3バケットのオブジェクトを入力としたり、結果をS3バケットに出力することが簡単にでき、またローカルで作成したPythonスクリプトがそのまま動かせる感覚で使用できるなど、AWS上でデータを処理する環境としてとても便利です。
基本的な使い方は[こちら](https://aws.amazon.com/jp/blogs/news/amazon-sagemaker-processin-fully-managed-data-processing-and-model-evaluation/)や[こちら](https://aws.amazon.com/jp/blogs/news/rapids-on-amazon-sagemaker-processing/)を参照ください。

## 入力ファイルでハマったところ

多くの例ではAWSブログにもある通り、ProcessingInputでS3フォルダとコンテナをディレクトリに紐付ける使い方がされています。この方法ですとProcessing Jobの実行時に、指定されたS3フォルダ以下がコンテナ内の入力ディレクトリにコピーされるため、オブジェクトの量が多い場合には実行開始までに多くの時間がかかってしまいます。S3のフォルダ構成が分析とあっている場合は問題ないですが、例えばS3が

```
s3://bucket-name/purchase/user=A/year=2021/month=1/2021-01-10.csv
s3://bucket-name/purchase/user=A/year=2021/month=2/2021-02-24.csv
s3://bucket-name/purchase/user=B/year=2021/month=1/2021-01-03.csv
s3://bucket-name/purchase/user=B/year=2021/month=2/2021-02-13.csv
```
と構成されており、「全てのユーザの2月のデータを処理したい」ような場合にはpurchase以降をコピーするしかなく、必要以上にデータをコピーされてしまい実行時間も長くなってしまっていました。

こんな時のためにManifestファイルによる入力ファイルの指定方法が用意されていますが、事例がなく使い方がわかりませんでした。AWSの方に相談したところ、その使い方を教えていただいたので紹介します。

# Manifestファイルによる選択的なファイルコピー

Amazon SageMaker Processingの入力として使用する`ProcessingInput`には、`s3_data_type`として`ManifestFile`を指定することができ、コピーしたいS3オブジェクトを予めManifestファイルに記述しておくことで、必要なファイルのみをコンテナ内にコピーすることができます。以下にその使い方を紹介します。

## Manifestファイルの準備
Manifestファイルは配列からなるJSONファイルで、拡張子は.manifestです。共通パスを表すprefixと、prefix以降の相対パスのリストからなり、例えば前述の「全てのユーザの2月のデータを処理したい」場合は以下のようにS3オブジェクトをそれぞれ記述します。

```sample.manifest
[ {"prefix": "s3://bucket-name/purchase/"},
"user=A/year=2021/month=2/2021-02-24.csv",
"user=B/year=2021/month=2/2021-02-13.csv",
...
]
```
manifestファイルはローカルに置くか、S3に置いておきます。

## ProcessingInputでの指定
Processing Jobのインプットは`processor.run`の引数`inputs`にProcessingInputを列挙することで指定します。manifestファイルを使用する場合には`inputs`を以下のように記述します。

```
    inputs=[
        ProcessingInput(source='sample.manifest',
                        s3_data_type='ManifestFile',
                        destination='/opt/ml/processing/input',
                       )
    ]
```
`source`にローカルパスを指定すると、manifestファイルは一旦S3のデフォルトバケットにアップロードされ、その後インスタンス起動時にSageMakerに読み込まれます。manifestファイルを自分の好きなバケットに置いておきたい場合は、予めmanifestファイルをS3にアップロードし`source`にそのS3パスを指定することで読み込ませることができます。
S3オブジェクトは`destination`以下に相対パスが保持される形でコピーさるため、今回の例ですとS3オブジェクトはそれぞれ以下のパスにコピーされます。

```
/opt/ml/processing/input/user=A/year=2021/month=2/2021-02-24.csv
/opt/ml/processing/input/user=B/year=2021/month=2/2021-02-13.csv
...
```
こうしておくことで必要なファイルのみをコピーすることができるため、S3フォルダ全体をコピーする場合に比べてジョブの起動が早くすることができます。

# まとめ
今回はAmazon SageMaker Processingでmanifestファイルを使用して必要なS3オブジェクトのみをコピーする方法を紹介しました。ジョブの起動時間が短くなるほか、入力ファイルをコンテナの外側で制御できるためコンテナが使い回しやすいと言う利点もあるかと思います。
Amazon SageMaker ProcessingはAWS Batchよりもお手軽で、コンテナをバッチで動かすのにとても便利だと思います。今後、スポットインスタンスに対応するなど、どんどん使いやすくなっていってほしいです。
Tramoriesその1　開発環境構築（SpringBoot, MySQL）

[前回の記事](https://qiita.com/yk0807/items/a4a9b2d367df3fab8b2e)で個人開発でWebサービスを作るのを目標にすると書いて、1ヶ月以上経ってしまったorz
というわけでまずは環境構築（Macを前提にしています）。まずはサーバーサイドから。

#1. MySQL
まだインストールしていない方は[こちら](https://qiita.com/hkusu/items/cda3e8461e7a46ecf25d)が参考になると思います。
自分はすでにインストールしていましたが、下記のようなエラーが出るので、[こちら](https://qiita.com/hondy12345/items/d32ed749fb49e9da7de6)を参考に解決を図る。
![mysql_err1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66360/0c133863-c16a-34b0-3f18-01e05a70853a.png)

すると次は下記のエラーになったので、[こちら](https://qiita.com/jonakp/items/477a18d4a94c01a31583)を参考にしてみる。
![mysql_err2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66360/97943f7a-c71e-8dfe-9a00-7c7b8a867765.png)

そうしたら、解決！記事を書いてくれた方に感謝！m(__)m

その後は下記のSQLでユーザー、データベース、権限を作成。

```MySQL
CREATE DATABASE tramories;
CREATE USER tramories IDENTIFIED BY ‘*******’;
GRANT ALL ON tramories.* TO 'tramories'@'localhost' IDENTIFIED BY ‘*******’;
```

#2. Spring Boot
データベースを作った次は、Spring Bootの環境構築。
Spring Bootの環境構築には[Spring Initializr](https://start.spring.io/)というとても便利なサイトがあるので、これを使います。
自分はProject : Maven, Language : Java, Spring Boot : 2.5.0で作りました。
DependenciesはSpring Boot DevTools, Spring Web, Lombok（自動的にゲッターとセッターを作ってくれるので、すごく便利！）, Thymeleaf, Spring Security, OAuth2 Client, Spring Data JPA, Flyway Migration, MySQL Driver, Spring Batchを入れました（他にも何か入れたかも）。

その後は大雑把に以下の流れ。
1. Spring Initializrでダウンロードされたzipを展開して、Spring Boot Suitesのプロジェクトをつくる。　
2. application.propertiesに必要な設定（[こちら](https://spring.pleiades.io/spring-boot/docs/current/reference/html/appendix-application-properties.html)参照）を追加
3. ログインユーザー用のサービス、エンティティ、リポジトリを作成し、Flywayでユーザーテーブルとレコードを作成
4. 簡単なログインページを作成し、ログインできるところまで確認

詳細は[GitHub](https://github.com/YusukeKitamura/tramories)にアップしているので、そちらを見ていただければと。

次回はフロントエンド（React)の環境構築をやります。

※この記事は、[こちらのブログ](https://yk0807.com/techblog/2021/02/15/tramories%e3%81%9d%e3%81%ae1%e3%80%80%e9%96%8b%e7%99%ba%e7%92%b0%e5%a2%83%e6%a7%8b%e7%af%89%ef%bc%88springboot-mysql%ef%bc%89/)の内容と同じです。
[Rails][HTML,CSS] JQueryを使わず背景画像をアニメーションにする

#実装したいこと
![2645675c398a8c681074fc97e255733b.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092914/100ebe86-28bf-34c4-8beb-975a21b1f4fc.gif)

このように背景画像がフェードイン、アウトを繰り返すようにCSSを設定していきます。

#HTML

```html:html
<div class="box">
  <div class="bgImg src1"></div>
  <div class="bgImg src2"></div>
  <div class="bgImg src3"></div>
  <div class="bgImg src4"></div>
</div>
```
使用する画像の数だけ子要素を用意しましょう。
私の場合４枚の画像を使うため、今回は、上記のように４枚分子要素を用意します。

#CSS

```css:css
.box {
  position   : relative;
  width  : 100vw;
  height     : 100vh;
}

.box .bgImg {
  position   : absolute;
  width  : 100%;
  height     : 100%;
  top        : 0;
  left       : 0;
  bottom     : 0;
  right      : 0;
  opacity    : 0;
  background-size: cover;
  animation  : bgAnime 20s infinite;   /* 4画像 × 各5s = 20s */
}

/* --- 段差で背景画像のアニメーションを実行 ----------------- */
.box .src1 {
  background-image : url('画像のパス');   /* 背景の画像を指定 */
}
.box .src2 {
  background-image : url('画像のパス');   /* 背景の画像を指定 */
  animation-delay  : 5s;
}
.box .src3 {
  background-image : url('画像のパス');   /* 背景の画像を指定 */
  animation-delay  : 10s;
}
.box .src4 {
  background-image : url('画像のパス');   /* 背景の画像を指定 */
  animation-delay  : 15s;
}

@keyframes bgAnime {
   0% { opacity: 0; }
   5% { opacity: 1; }
  25% { opacity: 1; }
  30% { opacity: 0; }
 100% { opacity: 0; }
}
```

以上の記述で完了です。

#自分なりに手を加えたい方へ

自分好みにアレンジを加えたい方がいらっしゃるかもしれませんので、どこを変更すれば変えられるかを、２つほど例を上げておきます。

#1.画像枚数を変えたい

画像を４枚ではなく６枚にしたいときの変更場所です。

```
animation  : bgAnime 20s infinite;
             ↓
animation  : bgAnime 30s infinite;
```

```
.box .src1 {
  background-image : url('画像のパス');   /* 背景の画像を指定 */
}
.box .src2 {
  background-image : url('画像のパス');   /* 背景の画像を指定 */
  animation-delay  : 5s;
}
.box .src3 {
  background-image : url('画像のパス');   /* 背景の画像を指定 */
  animation-delay  : 10s;
}
.box .src4 {
  background-image : url('画像のパス');   /* 背景の画像を指定 */
  animation-delay  : 15s;

/*追記*/

}
.box .src5 {
  background-image : url('画像のパス');   /* 背景の画像を指定 */
  animation-delay  : 20s;
}
.box .src6 {
  background-image : url('画像のパス');   /* 背景の画像を指定 */
  animation-delay  : 25s;
}

```

主に秒数の変更と画像を追加するだけですね。

#2.画像をゆっくり変化させたい

```
@keyframes bgAnime {
   0% { opacity: 0; }
   5% { opacity: 1; } 　←こちらを消去する
  25% { opacity: 1; }
  30% { opacity: 0; }
 100% { opacity: 0; }
}
```

解説しますと、今回の場合、この０％〜１００％という数字は
「20秒間における内訳」を表したものです。
また、opacityは、透明度を指定するものですので、0だと透明、１で完全不透明となります。

今回は４枚の画像のアニメーションを２０秒で流れるよう設定しておりますので、１枚あたり５秒間。つまり、２０秒の２５％部分である約５秒間を境にフェードインとフェードアウトを設定すべきです。

そして２枚目以降にanimation-delayを５秒毎にかけているので、構造としては、１枚の画像が完全不透明となっている間は、他の画像は全て透明となっているため、アニメーションが出来上がっています。

ですので、５％部分を取り除くことで、０％から２５％、つまり０秒から５秒にかけて透明から不完全透明にさせることができ、ゆっくりとしたアニメーションを作ることが可能となっております。

#まとめ
視覚的に動的なブラウザの方が、現代的な印象を受けやすいと思いますので、ぜひ導入をお勧めします。
自分好みに手を加えてみてください。
ご覧いただきありがとうございました。
GitHub、Heroku、データベース、フォルダ（リポジトリ）を削除し、アプリケーションを消去する方法

今回はアプリケーションを削除する方法を描こうと思います。

アプケーションを作成する際に、MySQLで実装しなければならない課題で、rails newの後の -d mysql　を記述し忘れてしまいました。
まだ、実装の初期段階で傷が浅いこともあり、アプリケーションを削除し、最初からやり直すことに決めました。

ちなみに、**rails new　のデフォルトで生成されるデータベースはSQLite**です。
MySQLの方が汎用性が高いため、一般的に広く使われているため、今回はMySQLで実装する運びとなりました。



#内容

実装の段階にもよりますが、アプリケーションを削除する際に合わせて、削除する必要があるものは以下4つと考えられます。合わせて私がおすすめする順番で書きます。

１　heroku
２　データベース
３　GitHub
4　アプリケーションのフォルダ（リポジトリ）

##herokuの削除
herokuのページ上で削除を行います。
![スクリーンショット 2021-02-17 22.17.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985033/6d4c687a-f78f-9d51-a618-7284bc0f6d8e.png)

↑削除したいフォルダをクリック



![スクリーンショット 2021-02-17 22.18.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985033/5a90d947-9697-96e3-ead7-bce516d061f4.png)

↑settingsをクリック

![スクリーンショット 2021-02-17 22.19.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985033/ebb44f9e-7675-12d4-88c2-df49e1a0a5e7.png)

↑一番下の　Delete appをクリックし、削除したいアプリケーション名を記入して　Delete app　をクリック

これでHerokuの削除は終わりです。
ターミナル上で

```
#ターミナルでHerokuの削除を行うとき
heroku apps:destroy --app アプリ名 --confirm アプリ名
```
上記コマンドを実行するすれば、削除できます。しかし、私のような初学者にはビジュアル的にわかりやすい方が良いと思いますので、慣れないうちはHerokuのwebで削除を行うことをおすすめします。

###データベースの削除

データベースの削除は　  
削除したいデータベースのデイレクトリ上で

```
rails db:drop　
```
を行います。

##GitHubの削除
GitHubのリモートデイポジトリもHeroku同様にWeb上で削除を行います。

![スクリーンショット 2021-02-17 22.28.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985033/bd266be7-9894-229c-e2d3-acf624b7dd07.png)
↑削除したいアプリケーションのまで移動し、一番右の　settings をクリックします。


![スクリーンショット 2021-02-17 22.29.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985033/2c55c95d-666a-d369-d976-c69409ef212b.png)
↑settingsの一番下のdander zone　の　Delete this repository　を選択します。

![スクリーンショット 2021-02-17 22.35.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985033/06328b81-4155-fc36-5163-de44cdfd1983.png)
↑削除したいアプリケーション名を入力して　Delete this repository　をクリックすれば、リモートディポディポジトリを削除できます。



![スクリーンショット 2021-02-17 23.00.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985033/7b535162-e3f4-58b8-aa7e-41be979e14f0.png)
↑GitHubDesktop上の表示はで右クリックで削除できます。



なお、GitHub削除をdb削除の前に行った場合は以下の表示がされます。↓
![スクリーンショット 2021-02-17 21.46.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985033/0909b9ca-77c6-dccc-7ec5-23daa1ca367f.png)
□のチェック欄は「削除したいGitHubのローカルリポジトリと一緒に削除しますか」ということですが、これはチェックせずにRemoveした方が良いです。
dbの削除はアプリケーションのフォルダが存在してる内に削除した方が、簡単です。
**db削除前にアプリケーションのリポジトリを削除する行為はこの段階では避けましょう。**

##アプリケーションフォルダの削除
アプリケーションのフォルダは以下のコマンドで実行できます。

```
rm -rf アプリケーションのフォルダ（リポジトリ）名
```
ここで注意することは、削除したいリポジトリの1つ上の階層で、当該コマンドを実行しなければなりません。
例えば、
projects　フォルダの中にある　test_app　リポジトリを削除したい場合はターミナル上に

```
#pwdで現在 projects にいることを確認
rm -rf　test_app
```
と記述します。

以上で、アプリケーションのフォルダ（リポジトリ）削除は終了です。
CollectionView Cellのサイズ決定の備忘録

#Cellのサイズを決定する方法は2種類ある
* Main.Storyboardで設定
* コードで実装

##storyboardで設定
![スクリーンショット 2021-02-17 21.39.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/870201/86baa675-cfa9-9b44-78a1-641bc53241e3.png)

ViewControllerにCollectionViewを追加し、上の画像のような設定項目の数値を変更することでCellサイズを変更することができる。

この際、Estimate Sizeが
![スクリーンショット 2021-02-17 21.45.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/870201/e0d2adc8-5fc7-eda0-97c5-049f0031b6ba.png)
上の画像のようにCustomになている必要がある。
あとは、好きなようにCellサイズを変更したりヘッターやフッターなどを設定することで実装することができる。

* メリット
 * 比較的実装しやすい
 * サイズの管理がしやすい
* デメリット
 * 固定値しか設定できない（画面サイズによるCellサイズを動的に変動させることができない）

##コードで実装する
```VC
    @IBOutlet weak var CollectionView: UICollectionView!
    @IBOutlet weak var CellLayout: UICollectionViewFlowLayout!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        CellLayout.itemSize = CGSize(width: 300, height: 100)
    }
```
上の画像のようにIBOutletで下の画像にある立方体のアイコンのUICollectionViewFlowLayoutを繋ぐ。
![スクリーンショット 2021-02-17 22.01.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/870201/4cfdea8b-6a77-4cba-0a0a-1389c07653cb.png)

こうすることで、コード上でCellのサイズやヘッターやフッターなどを設定することができる。
上の画像の
` CellLayout.itemSize = CGSize(width: 300, height: 100)`
はCellのサイズを決めるためのコーディングである。コードでは利用するiPhoneの画面サイズに応じたCellの大きさを設定することができる。

#storyboardとコードの両方で設定した場合のCellサイズ


基本的にstoryboardのEstimate Sizeが何になっているかで優先度が決定する。
まず、Customになっている場合コードよりStoryboardの設定が優先され、Noneになっている場合、コードでの実装が優先される。
動く！水玉模様のレイアウト【HTML・CSS】

#できること & 完成図
水玉模様のレイアウトを実装する方法について述べます。


![水玉.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1052793/e605c23d-8b6d-da40-b9ed-0181beb1c6ce.gif)

#概要
HTMLとCSSを使い、以下の記述をコピペするだけで水玉模様のレイアウトを実装できます。

#実装方法
##HTML

```index.html
<ul class="circles">
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
</ul>
```

```styles.css
@import url('https://fonts.googleapis.com/css?family=Exo:400,700');


.circles{
    top: 0;
    left: 0;
    width: 50%;
    height: 100%;
    overflow: hidden;
    padding-left: 300px;
}

.circles li{
    position: absolute;
    display: block;
    list-style: none;
    width: 20px;
    height: 20px;
    background: rgba(255, 255, 255, 0.2);
    animation: animate 25s linear infinite;
    bottom: -30px;
}

.circles li:nth-child(1){
    left: 25%;
    width: 80px;
    height: 80px;
    animation-delay: 0s;
}


.circles li:nth-child(2){
    left: 10%;
    width: 20px;
    height: 20px;
    animation-delay: 2s;
    animation-duration: 12s;
}

.circles li:nth-child(3){
    left: 70%;
    width: 20px;
    height: 20px;
    animation-delay: 4s;
}

.circles li:nth-child(4){
    left: 40%;
    width: 60px;
    height: 60px;
    animation-delay: 0s;
    animation-duration: 18s;
}

.circles li:nth-child(5){
    left: 65%;
    width: 20px;
    height: 20px;
    animation-delay: 0s;
}

.circles li:nth-child(6){
    left: 75%;
    width: 110px;
    height: 110px;
    animation-delay: 3s;
}

.circles li:nth-child(7){
    left: 35%;
    width: 150px;
    height: 150px;
    animation-delay: 7s;
}

.circles li:nth-child(8){
    left: 50%;
    width: 25px;
    height: 25px;
    animation-delay: 15s;
    animation-duration: 45s;
}

.circles li:nth-child(9){
    left: 20%;
    width: 15px;
    height: 15px;
    animation-delay: 2s;
    animation-duration: 35s;
}

.circles li:nth-child(10){
    left: 85%;
    width: 150px;
    height: 150px;
    animation-delay: 0s;
    animation-duration: 11s;
}



@keyframes animate {

    0%{
        transform: translateY(0) rotate(0deg);
        opacity: 1;
        border-radius: 150px;
        background-color: #f7ddc5;  
    }

    100%{
        background-color: #f8eac0;  
        transform: translateY(-1000px) rotate(720deg);
        opacity: 0;
        border-radius: 50%;
    }

}
```

#説明
・HTMLにliが10要素あり、CSSのchildとしている10要素にそれぞれ対応しています。
→10種類の水玉が表示される仕様としています。

・animation-delay プロパティは、アニメーションをいつ開始するかを指定します。
→水玉が現れるタイミング。

・animation-durationプロパティはアニメーション一回分の時間の長さを指定します。
→水玉の下→上へと移動する速度。

#最後に
それぞれのプロパティに対応する値を変更することで、仕様に沿った水玉を表現できます。

この方法だと、JavaScriptを使用せずとも、HTMLとCSSを使用するだけで水玉のモーションを表現できます。

よろしければご参考ください。
以上です。
Wordの差込印刷で小数があるときだけ小数点表示にしたい時のフィールドコードテクニック

# Officeを駆使して戦うあなたへ
**Excelいいですよね。** 納品金額やお仕事に必要ないろいろな勘定を最強の表計算ソフトExcelを使って出している人。いると思います。
**Word差込印刷いいですよね。** Excelで作った表から**VBAも使わずに** 定形のレイアウトにおさめて印刷ができる。最強の帳票ツールです。

そんな最強のMicrosoft Office Excel & Word差込印刷タッグの前に、小数点表示のハードルが立ちはだかる。

# この記事を読むべき人

* Excelのデータはいじることができないが、Wordの差込印刷を修正できる人
* 差込印刷のフィールドコードで書式をいじって小数点以下の表示をなんとかしたい人

# 数値を書式指定で表示するフィールドコード
差込印刷のフィールドを選択した状態で `Alt+F9` を押すと、フィールドコードを入力できる。
無機質な数値も以下のようなフィールドコードを入力すると桁が増えたらカンマ区切りにしてくれるようなよろしくやってくれる。

```
{ MERGEFIELD 数値列 \# 0,}
```
# 小数点をフィールドコードで表示指定したい場合

今回以下のような数値を登録するとする。

| 数値列 |
|--:|
|   5.5|
|   8|
|   10.2|

当初例に出したフィールドコードで差込印刷を行うと、以下のような結果になり、小数点以下が表示されなくなる。

| 差込印刷結果 |
|--:|
| 5  |
| 8  |
| 10  |

じゃあ世にあるMERGEFIELDの使い方にならって以下のように書いたとしよう

```
{ MERGEFIELD 数値列 \# 0,.#}
```

そうすると、こうなる

| 差込印刷結果 |
|--:|
| 5.5 |
| **8.**  |
| 10.2  |

8の結果を見てほしい **見事な鼻クソが残っている**
Wordの式は簡単なものしか無く、最強Excelのような関数は当然無い。
どうすればよいのか？インターネットに聞いても触りの知識しかない。

**ここからが根性SEの力の見せ所だ**

# 結果

差込印刷の最終兵器IFを使用して、以下のように記述する。

```
{IF{MERGEFIELD 数値列 \# .#}="." {MERGEFIELD 数値列 \# 0,} {MERGEFIELD 数値列 \# 0,.#}} 
```

最初のIFで小数点以下が表示されるか判断し、表示条件を分けている。
これで先の数字をいれると、以下のように表現される。

| 差込印刷結果 |
|--:|
| 5.5 |
| **8**  |
| 10.2  |

すばらしい。きっとこれであなたの業務のお困りごとも解決したはずだ。

以上、何卒よろしくお願い致します。（締めの言葉）
Surface Laptop2のWi-Fiが非常に遅くて気が狂いそうだったけど、やっと解決した話

# あらすじ
ここ1年半くらい仕事でSurface Laptop2を使用しているのですが、Wi-Fiが遅いし不安定な感じでした。
下り10Mbpsの時もあれば、気付いたら0.1Mbpsになっていたり・・・。
正直発狂しそうでした・・・。
同僚達の端末は皆安定して下り30～60Mbps程度は出ている状況でした。

# 使用端末
- Surface Laptop2 
    - OS：Windows10 Pro 64bit (10.0, ビルド18363)
    - CPU：Core i7-8650U
    - RAM：16GB

# 解決方法
色々試してみた結果、以下の方法で解決。

- [デバイスマネージャー]を開く
- [ネットワークアダプター] - [Marvell AVASTAR Wireless-AC Network Controller]を右クリックし、[プロパティ]を選択
- [詳細設定]タブを選択
- 左側のプロパティから[WMM-PS]を選択し、値を[High Performance]に変更
    - どうも調べてみると[WMM-PS]というのが、Wi-Fi Multimedia Power Saveの略らしい。
    - デフォルトが[Optimized]だったので、何かしらの省電力の最適化がかかっていた？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/f8dc4c87-2bbc-9ba7-8886-c9262004a4ea.png)

# 結果
だいぶ速くなった！
これで明日から発狂しなくて済みそうです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352434/1e24fe37-56ae-ecf4-6fd7-86d82011c27e.png)
【２回目以降】herokuでデプロイ後の更新方法（４ステップで終了）（Rails）

## 前提として
２回目以降の変更分について、
GitHubデスクトップでコミット→プッシュしておく必要があります。

## 手順一覧

### 手順① herokuにログイン

ターミナル

```
$　heroku login
```

### 手順② herokuにデプロイ

ターミナル

```
$　git push heroku master
```
### 手順③ herokuでのマイグレーション

ターミナル

```
$　heroku run rails db:migrate
```
### 手順④ herokuの情報確認（URLなど）

ターミナル

```
$　heroku apps:info
```
公開されたアプリケーションの詳細を見ることができます。


以上です。
Apex文字数計算方法

#１．Apex文字数計算方法
**【計算対象】**

- １改行は１文字として計算される（LF、CRLF）
- １タブは１文字として計算される
- １半角スペースは１文字として計算される

**【計算対象外】**

- 空白行
- コメント及びコメントのみの行
- @IsTestクラスは計算されません

#２．検証
**１．一行**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/cf145ac1-066c-dbb1-a1d7-e62eb5351767.png)

**２．改行_LF**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/ed32db72-ab2e-7a56-3bd9-1df5bf98b406.png)

**３．改行_CRLF**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/54d87222-7c57-ec3a-69aa-981227b849e7.png)

**４．インデント_タブ**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/0e8d5e3e-e6bd-5586-22df-36c6b0069ff7.png)

**５．インデント_ホワイトスペース4つ**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/6ef292a6-4c9f-6c98-a47e-c73e328aae6e.png)

**６．コメント_ヘッダー**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/3b1929d5-2cee-2f2b-9222-7898028753e9.png)

**７．Trailing_Spaces**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332907/67612889-574f-8fee-d2e3-93ed98d1f0de.png)
【Javaについてまとめてみたオブジェクト編】継承とオーバーライド、オーバーロードについて

#はじめに
今回はJavaの継承とオーバーライド、オーバーロードについて書いていきたいと思います。
若干、何が何だか分からなくなる時があるんですが、一つずつ見ていけばそんなに難しくはなく、
とても便利なものなので覚えていきたいです！


##継承とは
元からあるクラスの変数やメソッドを引き継ぎ、新しいクラスを作成できるものになります。
継承元のクラスを親クラス（スーパークラス）、継承先のクラスを子クラス（サブクラス）と呼びます。
似たようなクラスをたくさん作り、それを元に細かく処理を分けたい時に便利だったりします。
###継承の仕方
```java:親クラス
public class Member{

 String memberName;

 public Member(String memberName){
    this.memberName = memberName;
 }
 
 public void callMemberName(){
    System.out.print(this.memberName);
 }
}
```
例えば上記のような親クラスがあったとします。
これを継承して新たなクラスを作りたい場合は

```java:子クラス
public class premiumMember extends Member{
    public premiumMember(String name){
        super(name);
    }
}
```
みたいな感じで書きます。
これでpremiumMemberのインスタンスを作った際に親クラスのメソッドを使用することができます。
継承できるのは1クラスのみで、2クラス以上は継承することができません。
###final
```java:final
final class PremiumMembere(){
...
}
```
こんな感じでfinalを前につけると、このクラスは継承元にすることが出来なくなります。
###privateメソッド
```java:private
class Member (){
 ...
 private void login(){
   ...
 }
}
```
こんな感じでアクセス修飾子がprivateのメソッドは、継承してもサブクラスは使用することができません。
##オーバーライドとオーバーロード
###オーバーライド
```java:オーバーライド
//親クラスのメソッド
public void test(){
     System.out.print("Hello");
}

//子クラスのメソッド
@Override
public void test(){
     System.out.print("HelloWorld");
}

//親クラスの処理を呼び出したい場合
@Override
public void test(){
　　 super();
     System.out.print("World");
}
```
オーバーライドは既存の親クラスのメソッドを上書きすることです。
super()と書くことで親クラスの処理を呼び出すこともできます。
###オーバーロード
```java:オーバーロード
//元のメソッド
public void test(int num, String name){
     ...
}

//オーバーロード1
public void test(String name, int num){
     ...
}

//オーバーロード2
public void test(String name){
     ...
}
```
オーバーロードは同じメソッド名でシグネチャが異なるものを定義できるものになります。
シグネチャとはメソッド名と引数の組み合わせのことを表します。
オーバーロード１では元のメソッドと引数の順番がことなり、
オーバーロード２では引数の数が違うのでシグネチャが異なり同名のメソッドを作成できます！
引数によって少し動きを変えたい時に使います。


##さいごに
継承どうだったでしょうか！？
簡単なことしか書いてませんが、実際に作成してみてください！
オーバーロードとオーバーライドも便利なのでぜひ覚えてください。

ご覧いただきありがとうございました。
Arduinoでセンサから取得したデータをVSCode上でCSV形式で保存してみた

## 今回の趣旨

Arduinoで工作してるとログを取ってみたくなったのですが、Arduino開発環境にVScode拡張機能をつかっており、せっかくならVScode内で完結したいなぁという事でやってみました。


## VSCodeでArduino開発環境
[こちらのサイト](https://www.mechatronahibi.com/arduino-vscode-dev/)を参考に構築しました。
また、VSCodeでPythonを利用する場合、拡張機能を導入する必要があります。
[こちらの記事](https://docs.microsoft.com/ja-jp/learn/modules/python-install-vscode/6-exercise-write-execute-first-script?pivots=windows)を参考に、Pythonの拡張機能を導入しています。


## 実現したい(できた)こと
CSV形式で気圧センサのログを保存！
プロジェクトフォルダに直で出力してくれるので楽ちん&すっきり！
![test.csv - pressurOled - Visual Studio Code 2021_02_17 21_26_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653352/4b6be9f9-224c-17af-8439-d67262626de3.png)

スプレッドシートで開いてみた！おおお、なんかそれっぽい！

![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653352/7e01fb3d-c097-ee43-1b60-6a70ae446c15.png)

## いざ実装

今回はPythonを使って実現しました。
ラズパイやってる方には馴染みの深い言語ですね。
かくいう私もラズパイのおかげで多少読み書き出来る程度の知識です。
Pythonの導入方法はGoogle先生に聞けば素晴らしい記事を紹介してくれます。

では早速`pyserial`というシリアル通信を行う為のライブラリを導入します。
私の環境はWindowsなのでコマンドプロンプトから。

```
pip3 install pyserial
```
ライブラリのインストールが完了したら、作業中のディレクトリに`log_test.py`を新規作成します(名前は何でもOK、拡張子は.pyで宜しく！)

```python:log_test.py
import serial
import datetime
import csv

com = serial.Serial("COM7", 9600)

while True:
    val = str(com.readline().decode("utf-8").rstrip("\n"))
    date = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    with open("test.csv", "a") as f:
        print("{},{}".format(date, val), file=f)
```

`com = serial.Serial("COM7", 9600)`の第一引数にArduinoを接続しているポートを記述、第二引数にシリアル通信のボーレートを指定します。
このプログラムを実行する前に予めシリアルモニターの接続は切っておいて下さい。

`com.readline()`で**Arduino**上に書き込んだ`Serial.print()`から文字列を取得します。そのままだと改行コード`\r\n`が最後にくっついてくるので、
`.rstrip("\n")`で対応しています。

`val = str(com.readline().decode("utf-8").rstrip("\n"))`今回は以前作った気圧センサのソースからデータ取ってるので、ここで文字列として扱っていますがグラフ化したりするなら生の値取った方がいいかもです。
データ型についてはまだまだ知識不足なので、この辺りは追って学習したいと思います。

## 終わりに
今回は初めてPythonを使ってログの取得と保存に挑戦してみました。
気温や気圧の変化を実際の天候と照らし合わせて、セルフ天気予報なんてできたら面白そうです。
Kubernetesで7 Days to Die (Docker + Kubernetesで作るマルチプレイサーバの構築手順)

# この記事は

この記事を読めば、**7 Days to Die**の**マルチプレイ用サーバ**を**Kubernetesで構築**することができます。

# そもそも７Days to Dieって？

ゾンビを倒したり、拠点を作ったり、ご飯を作ったり、野菜を育てたり、クエストをこなしたりして、荒廃した世界を生き残るゲームです。
また、定期的にゾンビが大量に襲ってくるので、拠点で迎え撃つタワーディフェンス的な要素もあります。

リアルなマインクラフトと呼ばれることもあるようで、素材を集めてクラフトして、3Dマップ上で自由度高く拠点を作っていくことができます。

# ことの始まり

**やさぐれゆむ** さんの [**【7 Days to Die】一ヶ月公園生活【ゆっくり実況】**](https://www.youtube.com/playlist?list=PLLdM1rCuoRwJ9It4HGRcIJiWFz1ZNSg-5)の動画シリーズを見て、興味が湧いたので調べてみたところ、7 Days to Die はマルチプレイが可能でした。

そこで、いつも夜な夜なFactorioで遊んでいる同僚と一緒にプレイすることにしました。
さて、マルチプレイができるようにしなければなりません。
せっかくなので、手順などを残すついでに、記事を書くことにしました。

マルチプレイにも方法が二種類あります。

1. 誰か一人がサーバ役になって、他の人がそこへ接続する
1. ゲームサーバを構築する

1の方法は手軽なのですが、サーバ役の人がいなければゲームを進められないため今回は採用しませんでした。

今回は2の方法を選択しました。

ちなみに、ゲーム自体は2013年頃に発売したゲームなのですが、まだ更新もされています。

# ゲームサーバを構築する

7 Days to Dieは、Linux向けのheadlessなゲームサーバを用意してくれています。
これは、SteamCMDを経由してインストールすることが可能です。

今回は、Kubernetesにデプロイすることにしました。
マニフェストは、[:octocat:Tei1988/k8s-7d2d](https://github.com/Tei1988/k8s-7d2d)のリポジトリにまとめました。

クローンしてきたら、 `k8s/services/tcp.yaml.example` と `k8s/services/udp.yaml.example` 内の `<ExternalIP>` の部分を各自の環境に応じて修正して、ファイル名から `.example` を削除してください。

その後、以下のようにマニフェストをクラスタに適用します。

```console
cd k8s
kubectl kustomize . | kubectl apply -f -
```

Podが立ち上がるときにInitContainerでゲームのダウンロードもしくはアップデートを行います。
初回起動時はゲームのダウンロードが必要で、結構な容量をダウンロードしてくるので、立ち上がるのに割と時間がかかります。
また、起動時にはアセットの読み込みなどが走るため、readinessProbeを長めに設定している関係で、リポジトリのマニフェストだと5分ぐらい待つ必要があります。いい感じに調整してください。

Dockerイメージにしてしまうことも考えたのですが、容量が大きくなってしまうのであきらめて、PersistentVolumeClaimで確保したディスクにインストールしています。

Podが立ち上がったら、 7 Days to Die を起動して、JOIN GAME > Connect to IP... と進んでいき、 `<ExternalIP>`を置き替えたIPを入力して CONNECT を押せば、ログインできる、ハズです。

![image0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77225/6d4ca154-5fe7-ee55-62b9-f45a84909350.png)
（地下の大帝国にて）

# おわりに

マルチプレイでいつでも入れる状態にしていると、いつの間にかとんでもない建築物ができていたりして、とても面白かったですね。
また、一緒にやる場合はボイスチャットをしながらプレイすると捗ります。

ではでは。

# おまけ

7 Days to DieはModにも対応しています。
Modを入れるためのPersistentVolumeClaimも作ってあるので、7 Days to Die のPodが立ち上がっていないときに何かしらのPodにマウントしてファイルを配置したり、コンテナ起動中に `kubectl cp` や `kubectl exec` などを使って `/7d2d/mods` にファイルを配置すれば次回起動時にModが適応された状態で遊べます。

# うまく立ち上がらない場合

もしかしたら、ノードのメモリが足らないかもしれないです。
起動するだけで4GBほど必要で、3人でログインして赤い日になると5GB~6GB近くまで行きます。

![スクリーンショット 2021-02-17 223245.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77225/016f939f-118a-ef7d-04be-a6661870b745.png)
（定期的に跳ねているのはPreemptible Nodeを使っているのでノードが落ちた時に、Podが二個になっているためだと思われます。）

専用のVPSサーバとかを借りてdocker-composeとかで構築してしまったほうが。。。げほごほ。
はい、なんでもありません。
【Bootstrap】containerのレスポンシブ

Bootstrapのcontainerのレスポンシブについての記事です。

##containerとは
Bootstrapで用意されているクラス。レスポンシブデザインを手軽に実装するために用意されたもので、グリッドシステム[^1]を用いている。

[^1]: 画面幅を１２分割し、その内どれくらいの幅を使用するかを指定することで、簡単にレスポンシブデザインを実装することのできるシステムのこと。

##containerの種類
<img width="600px" alt="代替テキスト" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031318/4ca440c7-1ad7-d6da-4c13-5e799cfc0b3d.png">
（Bootstrap[ドキュメント](https://getbootstrap.jp/docs/4.4/layout/overview/)より参照）

####.container
各ブレークポイントで`max-width`を設定している。

####.container-fluid
すべてのブレークポイントで`width:100%`になる。

####.container-{breakpoint} 
Bootstrap v4.4で新しく追加された。
指定されたブレークポイントまで`width：100％`になる。

##最後に
containerで指定されているmax-width以外の値を用いたい際、わざわざレスポンシブ用のcssファイルで値を指定していたので、３つ目の`.container-{breakpoint} `クラスがありがたいです。
Github Actions上でDockerのmysqlイメージを使ってハマったこと

github actionsのubuntu環境でdocker-composeを用いてmysqlイメージを使うと問題が生じました
問題は2点でした
- volume mountでpermission denied
- container start 後にexecしたときに`no found container`(エラーはうろ覚え)

## 再現環境(うろ覚え)

- project
    - docker-compose.yml
    - .github
        - workflows
            - test.yml

```yml:docker-compose.yml
verison: '3.8'
services:
  db:
    image: mysql
    volumes:
      - ./logs:/var/log/mysql
      - ./my.cnf:/略/my.cnf
  env:
    略
```

```yml:.github/workflows/test.yml
# だめな例
name: workflow
on: push
jobs:
  - test:
    name: test
    runs-on: ubuntu
    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: start services
        run: docker-compose up -d

      - name: use db # データベースを利用する例、例えばsqlのimportなど
        run: docker-compose exec -T db mydb < data.sql
```

# volume mountでpermission denied

## 原因
- github actions の ubuntu上では、どうやらrootではなく,runner(1001):docker というuserで動作している
- github actions の ubuntu上ではdockerがインストールされておりrootで動作している(普通)
- dockerでhost-container間のvolume mountしたとき、hostに当該のディレクトリがない場合dockerがディレクトリを生成する(例で言う `./logs:/var/log/mysql`)
  - この時のディレクトリオーナーはrootになる
- mysqlイメージは起動時にログファイルを新規生成しようとするがその時の実行ユーザーはrootではない
- rootパーミッションの `./logs:/var/log/mysql`にログファイルを書き込めないとエラーになる

## 対策(案)

### ログなどはstdoutなどに出してdocker-compose logsに集約する
良いと思うが成功していない

### host-container間マウントをしない
良いと思う。
見たければmysqlサービスに`exec ash`などで入って確認すればいい。
本番系ならマウントなどでなくてfluentdに転送するような気がするし、そもそもhost-container間マウントの必要性が感じられない。

### hostでpermissonを調整したディレクトリを作っとく
hostにディレクトリがなければdockerがroot権限で勝手にディレクトリを作るが、もとからあるならそれを使う。
先の例だと

```diff:.github/workflows/test.yml
- # だめな例
+ # volume mountでpermission denied 解決版
name: workflow
on: push
jobs:
  - test:
    name: test
    runs-on: ubuntu
    steps:
      - name: Checkout code
        uses: actions/checkout@v2

+      - name: setup volume dir
+        run: |
+          mkdir logs #← runner(1001):dockerの7xxで作られる（うろ覚え)
+          chmod 777 logs # ← mysqlコンテナのログファイル書き込みプロセスが書けるようにガバガバにしておく(ciだし)。
+
      - name: start services
        run: docker-compose up -d

      - name: use db # データベースを利用する例、例えばsqlのimportなど
        run: docker-compose exec -T db mydb < data.sql
```

## container start 後にexecしたときに`no found container`

### 原因
公式のmysqlイメージは、色々頑張っていて、コンテナ起動後に初期化処理にしばらく時間がかかる。
これを待つことはdockerの領域ではないため単純には不可能。
コンテナ=サービスはstartedだが実際にdbはまだ利用不可の瞬間がある。

### 対策
待つ

```diff:.github/workflows/test.yml
      - name: start services
        run: docker-compose up -d

+      - name: wait for db
+        run: |
+          while ! docker-compose exec -T db mysql -e "SELECT 1" >/dev/null 2>&1
+          do
+            sleep 1
+          done
+
      - name: use db # データベースを利用する例、例えばsqlのimportなど
        run: docker-compose exec -T db mydb < data.sql
```

### 試してみてダメだったこと
- TCPポートがlistenされるのを監視する
  - その状態でも準備完了じゃないタイミングがあるっぽかったのでダメだった
- docker-compose logsの準備完了を示すログを監視する
  - 参考: https://qiita.com/mpyw/items/a03941bc8bd2c95c1c66
  - そのログが出たとしてもダメなタイミングがあった
- sleep
  - 当然だけど、成功したとしてたまたまでしか無い
  - 失敗しないように長めの秒数を取る？→利便性の低下&
【Bootstrap】ナビゲーションバー

Bootstrapのナビゲーションバーの雛形です。

```html:index.html
<nav class="navbar navbar-expand">
    <a href="#" class="navbar-brand">ブランドのロゴ（ホームへのリンク）</a>
    
    <button type="button" class="navbar-toggler" data-bs-toggle="collapse" data-bs-target="#nav-bar" aria-controls="nav-bar" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon">ハンバーガーメニューアイコン</span>
    </button>
            
    <div class="collapse navbar-collapse" id="nav-bar">
        <ul class="navbar-nav">
            <li class="nav-item"><a href="#" class="nav-link active">内容①</a></li>
            <!-- 以下内容の数に応じてli要素を追加 -->
        </ul>
    </div>
</nav>
```

##補足
####1.ハンバーガーメニューアイコンの位置
```html:index.html
<button type="button" class="navbar-toggler" data-toggle="collapse" data-target="#nav-bar">
    <span class="navbar-toggler-icon">ハンバーガーメニューアイコン</span>
</button>
```
この`button要素`を`a要素`の直前に記述すると画面左側、直後に記述すると画面右側にハンバーガーメニューアイコンが表示される。

####2.折りたたむタイミングの指定
```html:index.html
<nav class="navbar navbar-expand">
    <!--以下省略  -->
</nav>
```
`navbar-expand-(画面サイズ)`で折りたたむタイミングを指定。
navbar-expand-md とした場合、md（最小で768px）以下の画面幅の時に折り畳まれる。
配列の要素を全て削除する

#概要
`Javascript`で配列を全て削除方法に少し手こずったので、メモします。

#解決策

```.js
const array = [
...
];
array.splice(0);
console.log(array.length);

//結果:[]
```

##失敗
array = '';
とか
array = [];

じゃ出来ないみたいです。
JAVA テストコード 制御文字を入力して検証するための準備

制御文字を入力してその内容を検証したい→制御文字を入れる方法がわからない。。。
現場で詰まったのでメモ

制御文字は直接キーボード入力することが難しいため
16進法コードから逆変換することにした

今回は制御文字の「ユニット区切り」を使用
16進法のコードは「1F」
これを下記実装の通りに記載してあげれば、完了

```java:Test
//省略
String hexString = "1F";
byte[] bytes = Hex.decodeHex(hexString.toCharArray());
String newStr = new String(byte, "US-ASCII");
//省略
```

制御文字のバリエーション実装については
調べれば色々出てくると思うのでここでは省略
※下記実装は正規表現

```php

preg_replace('/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F]/', '', $XXX)
```
自己紹介

#まずはじめに
こんにちは。
駆け出しエンジニアのYukiです。

SES企業勤務で2020年の10月からプログラミング学習を始めました。
実務未経験からエンジニアになるために毎日学習を継続しています。
今後の学習のアウトプットのために、随時更新して活用していきたいと思います。

#エンジニアを目指そうと思った理由

高校時代からJimdoというWebサービスでホームページを作成していました。大学4年の春、就職活動を始め、今後のキャリアについて考えた時に、やはり自分が好きなことを仕事にしたいと考えました。エンジニアだったら、自分が目指した目標に向けてモチベーションを保ちながら、努力することができると思い、IT業界を目指しました。

#プログラミング学習を始めた経緯

新卒でSES企業に入社しました。コロナウィルスの影響で開発案件がなく、働きたいけど働けないという現実に直面し、とても危機感を感じました。自分が価値ある人材にならないといけないと思い、自分自身のスキルアップのためにプログラミング学習を開始しました。効率よく学習できるようにプログラミングスクールに入り、チーム開発ではプログラミング学習記録アプリ「NIPPO」、個人開発では「旅」に特化したSNS「TRAVEL×YOU (トラベリュー)」を開発しました。今後の投稿でポートフォリオについての解説をしていきたいと思っています。
####ポートフォリオ
[NIPPO](http://54.249.81.67/)
[TRAVEL×YOU](http://18.179.42.2/)
[Yuki Yoshida Official Website](http://y2-world.com)

#エンジニアスキル
####使用言語
・HTML
・CSS
・PHP
・Java Script
・MySQL
iOSアプリ開発にも興味があるのでSwiftを学習したいなと思っています。

####フレームワーク
・Bootstrap
・Laravel
・Vue.js

####サーバー
・AWS

####デザイン
・Adobe XD

####その他
・jQuery
・Git
・GitHub
・MAMP
Dockerを近々使ってみたいなと思っています。

#さいごに
プログラミングだけではなく、音楽制作もしているので、よかったら聴いてみてください。
[Apple Music]
(https://music.apple.com/us/artist/yuki-yoshida/1448865361?itsct=music_box&itscg=30200&ct=artists_yuki_yoshida&app=music&ls=1)
[Spotify]
(https://open.spotify.com/artist/5x6TjqB9xXXjY4Xn5y2oJm)
【初心者でもわかる】CSSで発光させて、光るボタンや文字を作る

# どうも7noteです！光る文字やボタンの作り方

アニメーションをつけていろいろな要素をピカピカ光らせたい方へ。
文字やボタンをピカピカ光らせる方法を紹介。

## ピカピカ光る文字の作り方

※過去の記事で作ったネオン文字を加工利用しています。
過去記事→[ネオン風の文字を作る方法（無料フォントサイトも紹介）](https://qiita.com/7note/items/c1a78a5e2e41123c4a74)

```index.html
<div class="neon">NEON</div>
```

```style.css
body {
  background: #000; /* 背景色を黒に指定 */
}
	
.neon {
  color: #FFF;       /* 文字色を白に変更 */
  font-size: 50px;   /* 文字サイズを50pxに指定 */
  font-family: Beon; /* ネオン風のフォントを指定(ダウンロードしたもの) */
  animation: flash 1s infinite; /* アニメーションflashを1秒ごとに繰り返す */
}
	
@keyframes flash {
  0%, 100% {
    /* 明るく光るよう影を重ねる */
    text-shadow: 0 0 10px #fff, 0 0 20px #fff, 0 0 30px #fff, 0 0 40px #ff00de, 0 0 70px #ff00de, 0 0 80px #ff00de, 0 0 100px #ff00de, 0 0 150px #ff00de;
  }
  50% {
    /* 淡く光るよう影を重ねる */
    text-shadow: 0 0 10px #fff, 0 0 20px #fcfcfc, 0 0 30px #fcfcfc, 0 0 40px #fc00de;
  }
}
```

![sample_moji.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/6ebccaa3-7ffc-a4ba-190e-a7407556bb38.gif)


## ピカピカ光るボタンの作り方

```index.html
<label><input type="button">push!</label>
```

```style.css
input {
  display: none; /* デフォルトのボタンを非表示にする */
}
	
label {
  color: #fff;        /* 文字色を白に指定 */
  font-size: 30px;    /* 文字サイズを30pxに指定 */
  background: #f90;   /* 背景色をオレンジに指定 */
  padding: 10px 20px; /* 余白を指定 */
  animation: flash 1s infinite; /* アニメーションflashを1秒ごとに繰り返す */
}
	
@keyframes flash {
  0%, 100% {
    /* 明るく光るよう影を重ねる */
    box-shadow: 0 0 10px #ffc, 0 0 20px #ffc, 0 0 30px #ff9, 0 0 40px #ff6, 0 0 70px #fc6, 0 0 80px #f99, 0 0 100px #ff96, 0 0 150px #ff96;
  }
  50% {
    /* 淡く光るよう影を重ねる */
    box-shadow: 0 0 10px #fff, 0 0 20px #fff, 0 0 30px #ffc, 0 0 40px #ff9;
  }
}
```

![sample_button.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/197b19ed-d6b7-db47-d495-da3816b5377f.gif)

## まとめ

**・文字をピカピカ光らせるなら→`text-shadow`**
**・それ以外の要素をピカピカ光らせるなら→`box-shadow`**

間違えないように気をつけてください。


#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
Moyaから自己署名証明書を使っているHTTPSサーバーと通信する方法



以下の記事を参考にMoyaをどのようにカスタムするか

### MoyaのSessionDelegateを継承したクラスを作る
```swift
class SelfSignedSSLSessionDelegate: SessionDelegate {
    func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
        let protectionSpace = challenge.protectionSpace
        // 認証チャレンジタイプがサーバ認証かどうか確認
        // 通信対象のホストは想定しているものかどうか確認
        guard protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust,
              let serverTrust = protectionSpace.serverTrust
        else {
            // 特別に検証する対象ではない場合はデフォルトのハンドリングを行う
            completionHandler(.performDefaultHandling, nil)
            return
        }
        completionHandler(.useCredential, URLCredential(trust: serverTrust))
    }
}

public extension MoyaProvider {
    final class func selfSignedSSLAlamofireSession() -> Session {
        let configuration = URLSessionConfiguration.default
        configuration.headers = .default
        
        return Session(configuration: configuration, delegate: PassmarketSessionDelegate(), startRequestsImmediately: false)
    }
}
```

### Moyaを使ったAPIの叩き方

```swift
let session = MoyaProvider<hogehogeAPIClient>.selfSignedSSLAlamofireSession()
let provider = MoyaProvider<hogehogeAPIClient>(session: session)

provider.rx.request(.getHogehoge)
    .filterSuccessfulStatusCodes()
    .subscribe()
    .disposed(by: bag)
```


参考
iOSアプリから自己署名証明書を使っているHTTPSサーバーと通信する
https://qiita.com/chocoyama/items/890e3c35736c74733c55
Swift5　引数の参照渡し

引数でよくつまづくので、分かった事をまとめてみました。完全に初心者向けの記事です。

##引数の性質

関数を記述する時、計算する値を関数外から入れたい時に使用するものが引数ですが、引数は値渡です。

よって、**引数として値を渡したら、当然変更はできません。**
下の例で実験します。

```swift:例
var taxCon :Int = 0
var taxLoc :Int = 0
var value :Int = 108

func taxAddValue(price:Int, sorting:String){
    if sorting == "軽減税率"{
        taxCon = (price / 108 * 624 + 50) / 100
        taxLoc = (price / 108 * 176 + 50) / 100
        print(taxCon)
        print(taxLoc)
    }else if sorting == "経過措置税率" {
        taxCon = (price / 108 * 630 + 50) / 100
        taxLoc = (price / 108 * 170 + 50) / 100
    } else {
        taxCon = (price / 110 * 780 + 50) / 100
        taxLoc = (price / 110 * 220 + 50) / 100
    }
}

taxAddValue(price: value, sorting: "軽減税率")
```

上記の関数は、消費税及び地方消費税を消費税と地方消費税に分解するものです。
ここで、金額である変数valueは引数として関数に引き渡されます。
**値渡しでなければ、関数内で変更する事ができるはずですが・・・**

試しに、引数のpriceの金額を変更しようとしてみます。

```swift:例　priceを変更
var taxCon :Int = 0
var taxLoc :Int = 0
var value :Int = 108

func taxAddValue(price:Int, sorting:String){
    price = 216 //ここでエラーが出る
```

エラーが出て、priceの前にletを置いて変数として定義するよう求められます。
つまり、**引数priceと別の変数priceとして使うように指摘されます。**

これによって、引数は値のコピーであり、引数を渡した後で変更する事ができない事がわかります。

##それによってどうなる？
値型の場合、インスタンス化する際は値のコピーとなるので、**そのコピーを引数として値渡しする為、プロパティを変えることができません。**

参照型(クラス)の場合、引数にとった時、当然参照先のコピーなので、引数として渡すまでに必要な設定していなければ**イニシャライズされていないものを渡す事と同じと言うことになります。**

##じゃあどうする？
**inout引数**を使えば、解消できます。
この引数は引数の性質を**値渡しから参照渡しにできます。**

上記の例を用いてまた実験します。


```swift:例　inout引数を使う
var taxCon :Int = 0
var taxLoc :Int = 0
var value :Int = 108

func taxAddValue(price:inout Int, sorting:String){
    price = 216
    if sorting == "軽減税率"{
        taxCon = (price / 108 * 624 + 50) / 100
        taxLoc = (price / 108 * 176 + 50) / 100
        print(taxCon)
        print(taxLoc)
    }else if sorting == "経過措置税率" {
        taxCon = (price / 108 * 630 + 50) / 100
        taxLoc = (price / 108 * 170 + 50) / 100
    } else {
        taxCon = (price / 110 * 780 + 50) / 100
        taxLoc = (price / 110 * 220 + 50) / 100
    }
}


taxAddValue(price: &value, sorting: "軽減税率")
```
無事、エラーが出ずに引数を書き換えられました。

変えたところは２点です。
関数の設定時の**変数名と型名の間にinoutを記述**、
呼出しの方で、**変数名と型名の間に&を記述**しました.

これによって、引数を参照渡しにする事ができます。

##参照渡し

参照渡しとは、その変数のアドレスを引き渡す事です。
アドレスは変数が格納されている場所を指し、C言語ではポインタなどと呼ばれています。
これは値ではなくアドレス値を引き渡すので、**変数そのものの値を書き換える事ができます。**
ただし、**書き換えるので元の値は失われます。**

##最後に
このあたりの事は基礎に当たる部分ですが、とても分かりにくい部分です。
同じような沼にハマっている人の助けになれれば幸いです。
何か間違っている事があれば、教えてください。
Slimを使って、クラスにテーブルのIDを付与する方法

現在ポートフォリオのSlim化を進めておりまして、クラスにテーブルのIDを付与する方法に手間取ったので、備忘録として投稿します。

#なぜクラスにIDを付与したかったのか
いいね機能とブックマーク機能を非同期で取り入れているのですが、
その際にどの投稿に対する「いいね」「ブックマーク」かを特定するために、以下のように記載していました。

```ruby:hoge.html.erb
<section class="material-box-show <%= @cook.id %>">
#インスタンス変数はご自身のものに置き換えてお考えください
  省略
</section>

```
これを以下のようにSlim化しました。

```ruby:hoge.html.slim
section class="material-box-show #{@cook.id}"

#以下は失敗例
section.material-box-show.= @cook.id
section.material-box-show.@cook.id
```

失敗例のようにclassを書かずに色々試行錯誤していたのですが、
出来ずこの形に落ち着きました！
もしかしたらもっと簡単に記載する方法があるのかもしれませんが。。。

以上です！ありがとうございました！
[Rails] BrakemanでRailsのセキュリティチェックをする

#Brakemanとは
Brakemanとはソースコードに、SQLインジェクションやXSS等の脆弱性がないかを解析してくれるGemです。セキュリティを強化したアプリケーションを開発するために便利なツールです。

#Gemのインストール
`Gemfile` に以下を追記して `bundle install` します。

```:Gemfile
group :development do
  gem 'brakeman', :require => false
end
```

#実行する
以下を実行すると、解析した結果を表示してくれます。

```
$ bundle exec brakeman
```

#脆弱性を修正する
表示された警告を読み取ったり、わからなければコピペしてググります。

```
== Warning Types ==


No warnings found
```
となれば一旦修正終わりです。

##不要な警告をスルーする
修正のしようがないときやそのままでも問題ないときは `brakeman.ignore` を使います。

```
$ brakeman -I
```

上記を実行すると対話モードになり、 `i` を入力してその脆弱性を無視するリスト(`config/brakeman.ignore`)に追加します。
`brakeman.ignore` に入れた警告は、以降 `bundle exec brakeman` を実行しても警告されなくなります。
ElmerをUbuntuにインストールする方法

参考資料
柴田良一，藤井成樹，「Elmerで始める連成解析」，工学社


実行環境
ハード : Macbook pro, Retina, 13-inch, Mid 2014
OS : Ubuntu18.04
※DualBootされてます．

手順
１. elmerパッケージのリポジトリの追加
```sudo apt-add-repository ppa:elmer-csc-ubuntu/elmer-csc-ppa
```**※"Elmer"と大文字を入れるとerrorを吐くことがある.**

２. インストール先を有効化
```sudo apt-get update
```
３. インストールの実行
```sudo apt-get install elmerfem-csc-eg
```**※"ElmerFEM"と大文字を入れるとerrorを吐くことがある.**

４. ライブラリのインストール
```sudo apt install libqt5xml5
```
５. 起動
```ElmerGUI
```
RailsのCSVインポートでハマったエラー

#unknwon attribute
直訳すると「不明な属性」
おそらく、モデル作成時にカラムのスペルをミスっていた為にコードの記述とカラムが合致しなかった事で出たエラー
ここでマイグレーションファイルの記述を修正すれば解決したかもしれなかったのだが、railsのディレクトリを作ってすぐだったのもあって、面倒くさがってディレクトリごと消去（←後に泥沼にハマる結果に。。。）
マイグレーションファイルを作成した後だったので、ディレクトリを消去しても抜け殻のマイグレーションファイルだけ残ってしまっていたが、この時はまだ気づかず
新規作成後```rails db:migrate```→「すでに存在しますよ」とのこと
```rails db:migrate:status```で状態を確認すると、見事に_NO FILE_をいただくことに
ディレクトリ消去からこの_NO FILE_に気づくまで１時間ほど悪戦苦闘してます笑
この状態のマイグレーションファイルを消去するのは少々面倒らしく、下記を参照

[Ruby on Rails 『NO FILEのmigrationを削除する方法』](https://qiita.com/sakatan_1/items/9bf321f81d3b84042694)

無事にコンソールを通過、解決しました


#ArgumentError
ArgumentError(When assigning attributes, youmust pass a hash as an argument, Integer passed.)
このエラー自体は割とよく見かけるけど、カッコ内が新顔だったので
なんとなく訳すと「属性を渡すには引数をハッシュ形式で渡さないとダメなのに、あなたは整数を渡しています」みたいな感じ
コードを見返して修正
で大丈夫かと思いきや、何回やっても同じエラーが直らない
いろいろググっているうちに、「コンソール状態でコードをいじった場合、コンソールを再起動しなければいけない」とのこと
```reload!```で無事解決！！
HerokuがRubyアップデートを推奨するけど、Ruby 2.6をどうしても使いたい。


#問題
Ruby-2.6.3 で Git から Heroku にデプロイをしようとしたらエラーが出ました。

```
$ heroku create
Creating app... done, ⬢ heroku20-app-00001.git
...
$ git push heroku main
（中略）
remote: !       Push rejected to ...
```


#経緯と方針
私の参考にしている書籍では Ruby-2.6.3 を使うように指示があったのですが、
デプロイ中に「 Ruby を最新版に更新してください 」と Heroku に以下のように推奨されました。

```
remote:  !     Heroku recommends you use the latest supported Ruby version listed here:
remote:  !     https://devcenter.heroku.com/articles/ruby-support#supported-runtimes
```

<b>しかしデプロイが初めての私でしたので、どうしても参考書籍の通りに進めたかったです。
Heroku の推奨に従わないで、どうにかして Ruby-2.6.3 のままでいたいという思いです。
</b>

#エラー内容抜粋 （冒頭コードの中略の部分）

```
remote:  !     The Ruby version you are trying to install does not exist on this stack.
remote:  !     
remote:  !     You are trying to install ruby-2.6.3 on heroku-20.
remote:  !     
remote:  !     Ruby ruby-2.6.3 is present on the following stacks:
remote:  !     
remote:  !     - cedar-14
remote:  !     - heroku-16
remote:  !     - heroku-18
remote:  !     
```

どうやら "You are trying to install ruby-2.6.3 on heroku-20" というように、デプロイ中に heroku-20 を使っていることに問題があるようです。
そして "Ruby ruby-2.6.3 is present on the following stacks:" というように、ruby-2.6.3 では heroku-18 をフォローしているようです。


#heroku-20 ではなく、heroku-18 を使う。

heroku-18 を利用するためには以下のコマンドを使います。

```
$ heroku create --stack heroku-18
```

（参考：Heroku-18 Stack ＜ https://devcenter.heroku.com/articles/heroku-18-stack#using-heroku-18 ＞）


実際に打ち込むと、以下のようになりました。


```
$ heroku create --stack heroku-18
Creating app... done, ⬢ heroku18-app-00001, stack is heroku-18
https://shielded-dusk-28692.herokuapp.com/ | https://git.heroku.com/shielded-dusk-28692.git
```
heroku18-app-00001 は新しく Heroku 上に作られたアプリの名前です。




リモートリポジトリを調べると、

```
$ git remote -v
heroku  https://git.heroku.com/heroku20-app-00001.git (fetch)
heroku  https://git.heroku.com/heroku20-app-00001.git (push)
```

デプロイ先が変わっておらず、heroku-20 のままになっています。
Ruby-2.6.3 の環境のままデプロイするとエラーが出るので、

以下のコマンドで、

```
$ git remote set-url heroku heroku18-app-00001
```
新しく作った heroku-18 のアプリにデプロイ先を置き換えます。

もう一度、リモートリポジトリを調べると、

```
$ git remote -v
heroku  https://git.heroku.com/heroku18-app-00001.git (fetch)
heroku  https://git.heroku.com/heroku18-app-00001.git (push)
```
これでデプロイ先が heroku-18 に変わりました。

#解決

ruby-2.6.3 は heroku-18 をフォローしているので、
これで無事にデプロイが終わるはずです。

```
$ git push heroku main
(中略)
remote: Verifying deploy... done.
```
GPU-GEMS-3D-Fluid-Simulation を若干最適化した結果


Scrawk氏が公開している [GPU-GEMS-3D-Fluid-Simulation](https://github.com/Scrawk/GPU-GEMS-3D-Fluid-Simulation) のシェーダーコードに以下の最適化を行ってみました。

- if文の置き換え（lerp関数とstep関数へ）
- ComputeBufferの代わりにRenderTextureを使う

最適化後のコードは[こちら](https://github.com/yasuhto/TinyOptimization-GPU-GEMS-3D-Fluid-Simulation)

## 結果

- 167.7 -> 300.3 FPS ※スナップショット時

Before
![Original.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538053/a77c8d9c-b513-48eb-e856-918cbecc4d63.png) 
After
![TinyOptimization.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538053/c77cf968-db31-b517-b473-31d41d606933.png)

## 参考

- [GPU-GEMS-3D-Fluid-Simulation](https://github.com/Scrawk/GPU-GEMS-3D-Fluid-Simulation)
- [Shader(HLSL), 手続き的にテクスチャ生成など行うとき使用頻度の高い関数](https://qiita.com/oishihiroaki/items/9d899cdcb9bee682531a)
Visual Studio デバッグ 【ショートカット】

#【Visual Studio デバッグ】

<strong>デバッグ</strong>とは、コードからバグを削除することをいう。

デバッグ上手は、プログラム上手とも言うみたいですね。。
業務でVisual Studioを使っています。
他にもなにか良い便利機能がありましたら、教えていただけますと幸いです。


##ブレークポイント

<strong>デバッグを行うためにブレークポイントを設定し、プログラムを止める</strong>

ブレークポイントの設定・解除　F9
ブレークポイントの有効化・無効化　ctrl + F9

##デバッグ方法

デバッグ開始　F5
デバッグ停止　shift ＋ F5
デバッグなし実行　ctrl ＋ F5

再起動　ctrl ＋ shift ＋ F5

##ソースコードを1行ずつ追う

ステップイン　F11
　→　次の1文を実行。メソッドがある場合は、メソッド内に入る。

ステップオーバー　F10
　→　次の1文を実行。メソッドがある場合でも、メソッド内に入らない。

ステップアウト　shift ＋ F11
　→　現在、実行中のメソッドを終えて、呼び出し元へ戻る。

1つ前の処理に戻る。　ctrl ＋ −

##定義関連

定義に移動。　F12

実装に移動。　ctrl ＋ F12

元に戻る。　ctrl ＋ −

定義をここに表示。　alt ＋ F12 

元に戻す。　Esc

折りたたみ・展開　ctrl ＋ M ＋ M