OmniAICreator/Qiita-1.07M huggingface dataset:
論文『Attention is all you need』を読み間違わないコツN選（まだ、N=2)。

#はじめに

論文『Attention is all you need』
https://arxiv.org/abs/1706.03762

Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A. N., ... & Polosukhin, I. (2017). Attention is all you need. arXiv preprint arXiv:1706.03762.

は、不慣れなワタシには、読むのが難しい。
これまでにも、記事を書きちらかしているが。。。。
理解しようと努力中。

この記事では、**意識できていないと、正しく論文が読めない**というポイントを示し、それを**コツ**とする。


#【コツ１】 Value⇒Key⇒Queryの順:tada:に図示されている

図は、すべて、論文の引用。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/c20dda6b-eaab-c028-bc78-512e2a042b19.png)

以下のMulti-Head Attentionの図で、その順番が明示されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/f3115a0b-d19c-e4d7-6c17-03de2af35319.png)

以下、論文を引用すると、文章でも以下のように説明されている。

>3.2.3 ApplicationsofAttentioninourModel The Transformer uses multi-head attention in three different ways: 
• In "encoder-decoder attention" layers, the queries come from the previous decoder layer, and the memory keys and values come from the output of the encoder. This allows every position in the decoder to attend over all positions in the input sequence. This mimics the typical encoder-decoder attention mechanisms in sequence-to-sequence models such as [38, 2, 9].

一部、翻訳
> "encoder-decoder attention"レイヤーでは、`queries`は前のデコーダーレイヤーから取得され、`memory keys`と`values`はエンコーダーの出力から取得されます。


#【コツ2】 Figure 1: The Transformer - model architecture. は、適切な解説を読む

論文のFigure 1の説明は、相当、不十分だと思う。
また、論文をなぞった解説では、論文に従って、不十分な解説のままになっている。

↓　下記は、超お薦め:tada::tada::tada::tada:
  (自分の関連記事でも超お薦めしている。）
**機械学習におけるtransformer(by ライオンブリッジジャパン株式会社)**
https://lionbridge.ai/ja/articles/machine-learning-transformer/

#まとめ
特にありません。
（周辺の知識なく、この論文だけ読んでも、理解はできないと思います。
多くの方のいろんな記事とかを参考にしつつ。。。コツコツとかな。。）

#関連記事
[自己注意Self-Attention の解説でわかりやすいと思った記事N選　(まだ、N＝9）](https://qiita.com/enoughspacefor/items/c9810d1065741a7f461c)
Railsチュートリアル第5章　ざっくり何やったか備忘録

##学んだ内容あらすじ
- Bootstrap用いてスタイルを整える。カスタムスタイルを整える
- リンクを追加
- パーシャル（partial）
- アセットパイプライン
- Sass
- ユーザー登録

###構造を追加
レイアウトにいくつかの構造とCSSを与えて、最小限のスタイルを追加。
カスタムCSSルールの他に、Bootstrapも使用する。
コードそのものにもスタイルを与え、散らかり始めたレイアウトのコードを、パーシャル（Partial）機能を使って整えていく。
Webアプリケーションを作成するときに、
ユーザーインターフェイスの概要をできるだけ早いうちに把握しておくことが有用。

###ナビゲーション

- 文法``[if lt IE 9]``
条件付きコメントと呼ばれる。
IEのバージョンが9未満の場合にのみHTML5 shimを読み込む。

- Railsヘルパー``link_to``の第1引数はリンクテキスト、第2引数はURL。
URLは名前付きルート（Named Routes）に置き換えられる。

```
    <li><%= link_to "Home",   '#' %></li>
    <li><%= link_to "Help",   '#' %></li>
    <li><%= link_to "Log in", '#' %></li>
```

##BootstrapとカスタムCSS
Bootstrapはクラスを指定するだけで簡単にスタイルが適用できる。
注目すべきは、レスポンシブデザインに対応できるという点。
どの端末でアプリケーションを閲覧しても、ある程度見栄えをよくすることができる。


SCSSというのはSassと呼ばれている。CSSを拡張した言語。スタイルの入れ子などCSSをより書きやすくしたもの。




##パーシャル（partial）
ファイル名先頭にアンダースコア_を置いたものはパーシャルとして扱う。
パーシャルを使うことでレイアウトを見やすくしたり機能ごとのまとまりに分けることができて便利。

パーシャルはビューの中でrenderメソッドを使って読み込む。
renderで呼び出す際のファイル名にアンダースコアは含めない


##アセットパイプライン
最近のRailsに追加された機能の中で最も特筆すべき機能の１つ。
CSS、JavaScript、画像などの静的コンテンツの生産性と管理を大幅に強化する。

三つの主要な機能がある

- アセットディレクトリ
- マニフェストファイル
- プリプロセッサエンジン

#####アセットディレクトリ
・app/assets: 現在のアプリケーション固有のアセット
・lib/assets: あなたの開発チームによって作成されたライブラリ用のアセット
・vendor/assets: サードパーティのアセット（デフォルトでは存在しない）

#####マニフェストファイル
それぞれのアセットファイルをどのように1つにまとめるのかをRailsに指示するファイルのこと。
アセットをまとめる処理はSprocketsというGemが行っている。

#####プリプロセッサエンジン
Railsではどのプリプロセッサを使うのか、ファイルの拡張子で判断する。
・scss
・coffee
・erb
app/assets/stylesheets/application.cssにある
*= require_tree .という記述でツリー内のすべてのファイルを
アプリケーションCSSにまとめるよう指定している。

##Sass
SassはCSSに拡張的な機能の付いた言語。
Sassが提供する二つの重要な機能に、ネストと変数がある。

SassはSCSSというフォーマットに対応している。すなわち、.scssという拡張子はSCSSである。
CSSファイルはSCSSファイルとしても扱うことができるため、互換性のあるフォーマットになっている。
(RailsTutorialではBootstrapの恩恵を得る為に最初からSCSSを使っている)

Railsのアセットパイプラインは.scssという拡張子を持つファイルをSassを使って自動的に処理してくれる。

つまり、custom.scssファイルはSassプリプロセッサによって前処理され、その後ブラウザへの配信に備えてパッケージ化される。

###レイアウトのリンク
``<a href="/static_pages/about">About</a>``

元々HTML記法の`<a href="/static_pages/about">About</a>`が使われていたが、これはRails流ではないので以下のようにlink_toメソッドで記述する。

``<%= link_to "About", about_path %>``
コードの意味がわかりやすくなり、about_pathの定義を変えればabout_pathが使われているすべてのURLを変更できるため、柔軟性が高まる。

###RailsのルートURL
ルートURLにはroot_pathやroot_urlといったメソッドを通してURLを参照できる。

Railsチュートリアルでは基本的にroot_path書式を使う。
HTTPの標準としてリダイレクト時に完全なURLが要求される為、
リダイレクトの場合のみroot_url書式を使う。


###リンクのテスト
ブラウザを立ち上げてルートURLにアクセスし、それぞれのリンクをクリックして確かめる。
-> 統合テストを使って作業を自動化する
``$ rails generate integration_test site_layout``
``$ rails test:integration``
``$ rails t``

確認したいこと
・ルートURL(Homeページ)にGETリクエストを送る。
・正しいページテンプレートが描画されているかどうか確かめる。
・Home,Help,About,Contactの各ページへのリンクが正しく動くか確かめる。




## ユーザー登録
###Usersコントローラ
StaticPagesコントローラを作成したので
今度は2番目のコントローラであるUsersコントローラを作成。
-> 新規ユーザー用のユーザー登録ページ（スタブ）を持つ、最も簡単なコントローラ

``$ rails generate controller Users new``
初期設定でnewアクションを追加しておく。
この時、スタブのユーザービューも作成されている。
とりあえずテストを走らせる。

1:getレスポンスをsignup_pathに変更
2:テストがREDになったのを確認。

###ユーザー登録用URL
ここで、先ほど設定したsignup_pathが通るように、ルーティングに/signupを設定する。
 ``get '/signup',  to: 'users#new'``
テストが通る

homeぺージにsignupへのリンクを名前付きルートで貼る。
最後に、signupページ用のカスタムスタブ（stub）のビューを追加する。
Ruby on Railsにてコントローラー名を変更したとき

今回はRails初心者のためコントローラー名を変更した場合の手順を忘れたときようの備忘録として残したいと思います。

##コントローラー名の変更

まずrailsにおいてコントローラー名は複数形で設定とのことなので複数形にて命名する

例　articlesなど

以上を踏まえて、コントローラー名を変更していく

今回はHOMEという名前からarticlesに変更する

1.routes.rbにて名称変更

```root to: 'home#index'```になっている状態からの変更


```
routes.rbにて

Rails.application.routes.draw do

root to: 'articles#index'
#homeの部分をarticlesに変更

end
```

2.コントローラーファイルの名前を変更

アプリ内のappフォルダ内のコントローラーファイルを格納しているフォルダにある該当ファイルの名前を変更する
　
home_controller.rbからarticles_controller.rbへ変更

3.ファイル内のコントローラー名も変更する

HomeControllerから下記のように変更

```
class ArticlesController < ApplicationController
```

4.viewsのフォルダ名も変更

コントローラー名がHOMEであれば、作成したフォルダも同じ名前なはずなので変更して終了


##全体まとめ

手順としてはコントローラー名を複数形で考え、routes.rbにて設定しているコントローラー名を変更する

変更したコントローラー名に合わせてコントローラーファイルの名称変更、viewsのフォルダ名も変更して終了

変更したコントローラー名とそれぞれのファイル名、ファイル内のコントローラー名は一致しなければいけないので一致するよう変更していく
Laravel8.*でのRESTfulルーティング

##RESTコントローラ作成

```
$ php artisan make:controller SamplerestController --resource
```
このコマンドでCRUD処理、つまり７つの基本メソッドを持ったコントローラーを作成できる。
`--resource`のオプションのおかげである。
その後該当データをマイグレーション、モデル作成、シードを行った。

##indexアクションの作成

```:SamplerestController
public function index()
    {
    $items = Samplerestdata::all();
    return $items->toArray();
    }
```
`Samplerest::all()`で取得したシードしたデータを`toArray()`で配列として返している。

##ルーティングで困った

```:web.php
Route::resource('samplerest', 'SamplerestappController');
```
以前のコマンドだと上記の書き方で可能だろう。
ただ、バージョン8.*以降はこの書き方ではルーティングできなくなっている。
メソッドを指定したら行けるのか？？と思って`Route::resource('samplerest', [SamplerestappController::class,'index']);`
のような記述をしたが上手くいかなかった。

結果的には下記のような方法が上手くいった！！！

```:web.php
Route::resource('rest', RestappController::class);
```
このルーティング方法だと以前のバージョン通りにRESTfulの機能をスマートに利用できる。

Laravel8.*以降では、web.php などにコントローラーのルート情報を記述する際、クラス名だけでは検索されなくなったことので、コントローラーやweb.phpでuse文を必要とするようになった。

また、モデルクラスが配置される名前空間がApp\Modelsに変更されて,use文がuse App\Models\モデルクラス;としなければ行けなくなったことに注意が必要だ。
Study Record (2021.3.16)

1.Today's Activity
■教材購入
【kindle書籍】キタミ式イラストIT塾 基本情報技術者 令和03年
【kindle書籍】Linux標準教科書
【Udemy動画】ゼロから実践するAWS
■キタミ式イラストIT塾 基本情報技術者 令和03年
→導入
■Linux標準教科書
→導入
■ゼロから実践するAWS
→導入
→アカウント作成
→料金アラートの設定(ちゃんと設定できているか確認必要)
→IAMユーザーの作成
→操作ログ記録の設定

2.Nect Action
■マークアップ記法について学習
■ゼロから実践するAWSで、IAMユーザー
ターミナルでファイルのサイズを指定する３つの方法

こういうときありませんか？
ターミナルでls -lをしてみたらデータサイズが気に食わない！！
もっとキリのいいデータサイズにした！
など、日常には常人には理解しがたい思考回路をした人間もいるわけです。
（単にまだデータサイズを変更するメリットや具体例を知らないだけ）

そこで、どうやったらデータサイズを指定できるのかを試したので、ここに書き留めておきます。

まず、ls -lで表示された文字列の左から５ブロック目の数字がデータサイズです。

先に結果を言いますと、方法は３つ見つけました。
しかし、そのうち１つはlinux環境でしか使えません。
１：https://www.atmarkit.co.jp/ait/articles/1712/01/news017.html
truncateコマンド（これがlinux環境でしか使えないもの）投稿者自身はmacbookでUnix系のOS(ここらへんの知識はまだ曖昧）でして、ターミナルでtruncateを使用したら"zsh:command not found: truncate"とメッセージが返されました。

２：http://x68000.q-e-d.net/~68user/unix/pickup?mkfile
mkfileコマンド・・・この方法が一番簡単で直感的にデータサイズを指定（変更）できます。
使い方は簡単、[mkfile データサイズ　ファイル名]
たったこれだけです。（だったらいろいろ言わずにこれだけ書けよ。と思ったあなた。その通り！！　しかしこの記事は投稿者自身の備忘録であり、失敗したことや知識が曖昧なところを自分で探すためにも役立てるつもりなので、長ったらしく書きます。すいません）

３：https://www.atmarkit.co.jp/ait/articles/1711/30/news027.html
ddコマンド・・・今回一番困惑したのはこのddコマンドです。なぜなら調べていく中で知らない単語はいっぱい出てきて頭がパンクしそうになったからです。
まず、ddの構文はいろいろなオプションがありややこしいです。
自分がファイルサイズを1024にするときのコマンドは
[dd if=/dev/zero bs=1024 count=1 of=ファイル名]とします。
一つ一つ見ていくと、
if=/dev/zeroとは[if=ファイル名]で標準入力の代わりにファイルから読み出す。といういみがあるらしい。つまり、scanfなどの入力の代わりをするということ？
そして、/dev/zeroという意味は常にNULL文字(0x00)を主力し続けるという特殊なデバイスという意味。
bs=1024は100バイト分をひとまとまりとして　count=1　個分のファイルを作るという意味です。

終わりです。（突然のおわり）
空のディレクトリをGit管理する方法

方法としては`空のファイル`を対象ディレクトリに配置することが基本となります。なぜならGitはファイルが1つもないディレクトリは管理できないからです。ですが、開発途中で追加される別のファイルを管理するかしないかによってパターンが変わります。
<br>

#### 1. 開発途中で追加されるファイルもGit管理したい

冒頭の説明通り、対象のディレクトリに`空のファイル`を配置するだけです。ファイル名は`.gitkeep`や`.keep`であることが多いようです。

例えば以下の様な構造で

```
myapp
 ├── public
 ├── src
 ├── db
 └── config
```

`db`が対象ディレクトリだとしたらそこに`.gitkeep`を作成します。

```
myapp
 ├── public
 ├── src
 ├── db
 │    └── .gitkeep
 └── config
```
これで`db`はGitで管理することができ、追加されるファイルも同じく管理対象になります。

<br>

#### 2. 開発途中で追加されるファイルはGit管理したくない

この場合も`空のファイル`を対象ディレクトリに配置します。ファイル名はおなじみの`.gitignore`であることが多いようです。さらにこれとは別の`.gitignore`でGit管理の対象を設定をします。

このようなディレクトリで`db`が対象なら

```
myapp
 ├── public
 ├── src
 ├── db
 └── config
```

このようにします。

```
myapp
 ├── .gitignore
 ├── public
 ├── src
 ├── db
 │    └── .gitignore
 └── config
```

<br>

そしてプロジェクトルートにある`.gitignore`を以下のように編集します。

```.gitignore
/db/*
!.gitignore
```

これは<strong>`db`以下のファイルとディレクトリを全て無視するが、`.gitignore`は無視しない</strong>
という意味になります。つまり`db`は空だけど`.gitignore`があるのでGitは管理でき、それ以外のファイルは管理しない状態になるわけです。

どちらのパターンも空ファイルにどういう名前を付けるか明確な指針があるわけではないようなので、直感的にわかりやすい名前を付けつつ運用ルールに従えばいいんじゃないかと思います。

<br>

読んでいただきありがとうございました！ご指摘やご意見などありましたらコメントしていただけると嬉しいです🐳
もう、いい加減にパワポで構成図など作るのをやめよう PlantUMLでETL構成図っぽいことを書く ソース管理でガバナンスを効かせよう

# 背景や課題感
パワーポイント・Googleスライド等で作った資料のバージョン管理って、みなさんどうしていますか？
同時編集できるGoogleスライドはまだしも、ローカルで作業するパワーポイントなんて、チームでの作業にほんと向いていない…
さらに、Googleスライドを外部メンバーに開放していないって、もう、プロジェクトのスピード感なくなりますよね？
DXってなんだよ？って思いますよね？
考え方がDXじゃない…
ほんと、イケてない…
私はそう思っています。

# 解決策
そこで、構成図等もソースコードで管理して、ガバナンスを効かせるのが、ベストプラクティスだと個人的には考えています。
もう、いい加減にパワーポイント・Googleスライドでお絵描きから卒業しようじゃありませんか :thumbsup:

# どう管理するのか？
- PlantUMLのソースコード管理はGithubなど
- PlantUMLのエディターは `Visual Studio Code` `ATOM` なんでもいいです。お好きなものを使いましょう。
- PlantUMLで使うアイコンは[PlantUML Icon-Font Sprites](https://github.com/tupadr3/plantuml-icon-font-sprites)を使います。便利なので。

# 前提条件
- Macしかわからないので、Mac前提
- Homebrew本体をインストール済み
- Homebrewで `plantuml` をインストール済み
- いずれも最新版をインストールしている
- エディター `Atom` や `Visual Studio Code` をインストール済み
- 各エディターで、PlantUMLを描画するプラグイン等をインストール済み
- Azure Synapseでの `STORED PROCEDURE` でETL処理を想定

# 例（ETL処理フロー図）
![processing_flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70138/0611f020-26b9-856e-9857-0e6f25a886cf.png)

```
@startuml
title ETL処理フロー図
scale 1.0
top to bottom direction

' hide the spot
hide circle

' avoid problems with angled crows feet
skinparam linetype ortho

!define ICONURL https://raw.githubusercontent.com/tupadr3/plantuml-icon-font-sprites/v2.2.0

!includeurl ICONURL/common.puml
!includeurl ICONURL/font-awesome-5/database.puml
!includeurl ICONURL/font-awesome-5/code.puml

FA5_CODE(CODE0,STORED PROCEDURE\nprocessing_flow) {
  FA5_CODE(CODE1,T1 processing flow\n\n一時テーブルT1の処理フロー\n処理の内容などはメモする) {
    FA5_DATABASE(DB1,DB1)
    FA5_DATABASE(DB2,DB2)
    FA5_DATABASE(DB3,DB3)
    FA5_DATABASE(DB,DB)
  }
  FA5_CODE(CODE2,T2 processing flow\n\n一時テーブルT2の処理フロー\n処理の内容などはメモする) {
    FA5_DATABASE(T1,T1)
    FA5_DATABASE(DB4,DB4)
  }
  FA5_DATABASE(T2,T2)
  FA5_DATABASE(DB_ETL,ETL後のDB)
}

' リレーション
DB1 --> DB : LEFT JOIN\nON key
DB2 --> DB : LEFT JOIN\nON key
DB3 --> DB : LEFT JOIN\nON key
CODE1 --> T1
DB4 --> T1 : LEFT JOIN\nON key
CODE2 --> T2
T2 --> DB_ETL

@enduml
```

# PlantUMLで画像をジェネレート
↓`Atom` でコードを保存すると、画像が勝手にジェネレートされるので、便利です。
![processing_flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70138/cdf58c0c-68e8-de14-ec9f-8f58fbc102f6.png)

# ソースコードはGithubなどで管理
ソースコード管理方法については記載しませんが、Githubなどで管理すればいいですね。
変更箇所が一目瞭然。チーム開発に最適。というか、これ以外の選択肢はない。

# まとめ
もう、いい加減に、パワーポイント・Googleスライドでのドキュメント管理はやめよう。
不毛だ。

# 追記
併せて、エクセル方眼紙でのテーブル定義書とか仕様書も、この世から撲滅したい。
↑センスがない。
そのベストプラクティスは、 `Markdown` （じゃなくてもいいが…）形式のファイルをHTML等にいい感じに変換してくれて、やはりソースコード管理だと個人的には考えている。
これは、また別の機会に…
Amazon DynamoDB Accelerator(DAX)とは？

## 勉強前イメージ

名前からして、DynamoDBを高速化するようなやつのイメージ

## 調査

### そもそも DynamoDBとは？

フルマネージド型のNoSQLデータベースクラウドサービスで非定型な構造を持つデータを柔軟に管理することができます。
詳細は [こちら](https://qiita.com/miyuki_samitani/items/4177fcd0e5361523941b) をご確認ください

### Amazon DynamoDB Accelerator(DAX)とは？

DynamoDBと互換性のあるフルマネージド型のインメモリキャッシュサービスになります。
レスポンスをミリ秒単位からマイクロ秒単位まで高速化することが出来ます。
また、既存のDynamoDBのAPIと互換性があるため、すでにDynamoDBを使用していても簡単に移行することが出来ます。

### 特徴

- パフォーマンス

ミリ秒からマイクロ秒へパフォーマンスをあげ、高速化することが出来ます。

- 移行の負荷の低減

API互換性のあるマネージドサービスなので既存のアプリケーションからの移行には最低限の変更のみで済み
移行によってアプリケーションのパフォーマンスを上げることが出来ます。

- セキュア

DAXはIAMを使用することでアクセス制御を行うことが出来ます。
また、cloudwatchで全体の可視化、cloudtrailで変更の記録を行うことが出来ます。

### ユースケース

以下の様なアプリケーションには適しています。

- レスポンス時間を最短にしなければ行けない場合
- 読み込みが多いアプリケーション
- 大規模なデータから何度も読み取りを行うアプリケーション

以下のようなアプリケーションには適していない可能性があります

- 一貫性を保つ必要があるアプリケーション
	- キャッシュサービスなので、一貫性のある読み込みをするには不向き
- 書き込みが多く、読み込みが少ないアプリケーション
	- キャッシュサービスなので、読み込みのパフォーマンスを上げるために使用することが多い

### 構成

DAXはVPCの中で動作し、ユーザのアプリケーションと接続を行います。

![12021-03-16 # Amazon DynamoDB Accelerator(DAX)とは？ -.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/2e963946-0d1e-ea77-70fc-07d1cf93534b.png)


## 勉強後イメージ

DynamoDB専用のElastiCacheみたいな感じ？
確かにキャッシュだから一貫性をきちんと保つのは難しいかもだけど、高速化するにはいいと思う

## 参考

- [Amazon DynamoDB Accelerator (DAX)](https://aws.amazon.com/jp/dynamodb/dax/)
- [AWS、NoSQLデータベースをさらに高速化する「Amazon DynamoDB Accelerator（DAX）」を発表](https://cloud.watch.impress.co.jp/docs/news/1056894.html)
- [【新機能】インメモリ型キャッシュクラスタで超高速化！Amazon DynamoDB Accelerator (DAX) のプレビュー版で速さを体験してみた](https://dev.classmethod.jp/articles/dax-preview/)
Swiftメソッド記法

# メソッドの引数について

## 値渡し
引数は`let`として新しく定義されているのと同義です。
そのため引数も変数もメモリ上の扱いは同じになります。

以下のように構造体とメソッドを定義し呼び出してみます。

```swift
struct Dog {
    var name: String
}

func update(with newName: String, dog: Dog) {
    dog.name = newName
}

var myDog = Dog(name: "メロン")

print("更新前: " + myDog.name)
self.update(with: "スイカ", dog: myDog)
print("更新後: " + myDog.name)
```
この場合メソッド定義の部分で`Cannot assign to property: 'dog' is a 'let' constant`とSwiftのエラーが発生し実行はできません。
これは引数が`let`で定義されているため発生したエラーです。
ですが、もし仮にSwiftがエラーを返さないと仮定します。
その場合であってもメソッド内の`dog.name`は「スイカ」に更新されますが、元となっている`myDog.name`は更新されません。
これは構造体が値型のため引数として渡された`dog`は`myDog`のコピーとなっているためです。
従って仮に実行できたとすると以下のような出力になります。

```:出力
更新前: メロン
更新後: スイカ
```

このように値そのものを引数に渡すことを**値渡し**といいます。

## 参照渡し
クラスの場合を見てみます。
以下のようにクラスとメソッドを定義し呼び出してみます。

```swift
class Cat {
    var name: String
    
    init(name: String) {
        self.name = name
    }
}

func update(with newName: String, cat: Cat) {
    cat.name = newName
}

var myCat = Cat(name: "タマ")

print("更新前: " + myCat.name)
self.update(with: "トラ", cat: myCat)
print("更新後: " + myCat.name)
```
これはエラーは発生しません。
クラスの場合、参照型のため変数が`let`で定義されていても変数の値そのものを書換えているわけではないのでこれを実行できます。
実行すると以下のように出力されます。

```:出力
更新前: タマ
更新後: トラ
```
`myCat.name`の値が更新されていますね。
参照型は引数には`myCat`へのアドレスをコピーとして渡しているため同じオブジェクトを参照しており、そのため内容の更新ができたというわけです。

このように引数にアドレス、つまり参照を渡しているものを**参照渡し**と言います。

## 値型を参照渡ししたいときは？
基本的にはやりません。
その場合は以下のように戻り値として新しいオブジェクトを返すように実装する方法が一般的です。

```swift
func update(with newName: String, dog: Dog) -> Dog {
    var newDog = dog
    newDog.name = newName
    return newDog
} 

let myDog = Dog(name: "ポチ")
let newDog = self.update(with: "ミケ", dog: myDog)
print(newDog.name) // ミケ
```

それでもどうしても構造体を参照渡ししたいということもあるかと思います。
その場合は以下の方法で実装できます。

```swift
func update(with newName: String, dog: inout Dog) {
    dog.name = newName
} 

var myDog = Dog(name: "ポチ")

print(myDog.name) // ポチ
self.update(with: "ミケ", dog: &myDog)
print(myDog.name) // ミケ
```
`update`実行前と後で`myDog.name`の値が変わっていることから参照渡しになったことがわかります。

引数が`dog: inout Dog`となりました。
`inout`を引数の型の前に付けると参照型という意味になります。

引数に渡す値は`&myDog`となっています。
変数名の前に`&`を付けるとその変数のアドレスを意味します。
myDogはスタック領域に確保されているのでそのスタック上のアドレスが引数として渡されました。
その結果参照渡しとなり`name`を更新できるようになりました。
ファイル名だけでファイルを実行する方法(pathを通す)

##パスを指定してファイルを実行する

```zsh:hello
echo "hello world"
```

自分が実行したいファイルがあるときターミナルでパスを指定する。

```
$ ./hello              //　相対パス
$ ~/document/hello　　　//　絶対パス
```

よく実行するファイルは、毎回入力が大変なので、ファイル名を入力するだけでファイルを実行できるようにする。


# ファイル名のままコマンドを実行する方法

```zsh
$ mkdir ~/bin 
```
ホームディレクトリにbinディレクトリを作る。ここにコマンドとなるファイルを置いていくこととする。

```
$ PATH=$PATH:~/bin
```
~/binのpathを通す。そうすることで、~/bin以下にあるファイル名でファイルを実行できるようになる。

```
$ echo $PATH
```

pathが通ってるかエコーで確認できる。


これで、bin以下に置かれたファイルは、どこでもファイル名だけで実行できるようになる。

```
$ hello
$ hello world 
```


###注意点
カレントディレクトリ(./)をPATHに入れてはいけない。カレントディレクトリに名前が同じファイルがあるとそれが意図せず実行されてしまうため。悪意のあるファイルであった場合、などリスクが高い。

###仕組み

　「コマンドファイルをパス付きで指定する」ということは、例えば「ls」コマンドならば「/bin/ls」と入力する、ということになります。しかし、よく使うコマンドを毎回パス付きで指定するのは非常に面倒です。

Linuxでは、「コマンドサーチパス（コマンド検索パス）に登録してあるディレクトリにあるファイルは、パス名を省略してよい」という決まりになっています。「パス」だけで、このコマンドサーチパスを指すこともあります。

コマンドサーチパスは、「PATH」という名前の「環境変数」に保存されています。環境変数は、コマンドを実行している環境、すなわちOS全体で参照できる変数ということです。“PATHという変数”の内容は、「echo $PATH」コマンドで確認できます。

　ここで、コマンドのパス名指定について少し考えてみましょう。

　「コマンドはファイルをパス名付きで指定しなくてはならない。ただし、PATHにあるものはパス名を省略できる」ということは、「パス名付きならば、PATHにない場所にあるコマンドでも実行できる」という意味にもなります。

　例えば、「/tmp」というディレクトリにある「mycommand」という実行ファイルは、コマンドラインで「/tmp/mycommand」と指定することで実行できます。とにかく“パス付き”であればよいので、絶対パスでも、相対パスでも構いません。

###　優先順位

コマンドをパス名なしで実行すると、シェルは
（1）エイリアス
（2）ビルトインコマンド
（3）PATHに指定されたディレクトリ
の順に、該当するコマンドを探します。

###確認方法

```bash
type コマンド
```

でエイリアスなのか、ビルトインかなどがわかるようになっている。

### 他の方法
その他の方法としては、エイリアスを通しても可能。
Arduino pro miniでSDカードを使う

#はじめに
　Arduino Pro MiniでSDカードに計測データを書き込みたい。さらに、電気は3.7Vのリポ電池で供給したい。
　ということで、使うのは、

- Arduino Pro Mini 328 3.3V 8MHz
- Switch Science FTDI USBシリアル変換アダプター（5V/3.3V切り替え機能付き）
- Aideepen 5個セットマイクロSDストレージ拡張ボードマイクロSDカードメモリシールドモジュールArduino ARM AVR用ピン付き
- 東芝 Toshiba microSDHC 32GB + SD アダプター + 保管用クリアケース
- リチウムイオンポリマー電池 DTP603450（以下リポ電池）

- 未使用
    - HiLetgo 3個セット DS3231 AT24C32 時計モジュール リアル時間時計モジュール IICモジュール RTCモジュール Arduinoに対応

# 経過
- ハード的には...
    - Pro MiniをUSBシリアル変換アダプター（以下アダプター）に挿す時、アダプターのジャンパスイッチを3.3V側にしておくこと。
    - 配線は、[北大西村氏のページ](https://ameblo.jp/geotechlab-workshop/entry-12566563241.html）を参考にした。
    - SDカードリーダーへの電気の供給は、リポ電池から。なお、実使用時にはPro Miniも同じリポ電池から給電するつもり。
- ソフトウェア
    - スケッチを書き込む際、メニューバーの「ツール＞ボード」でボードの種類を指定すること。
    - プロセッサも正しいものを指定すること。でも、本当に5Vと3.3Vで違いがあるのかな...。（要確認）
- Big SurのMacだとUSBシリアル変換アダプターが認識されない。古いMac（MacOS 10.10）だと認識された。
- 古いMac（MacOS 10.10）から、スケッチの書き込みはできるものの、書き込める場合もあれば、書き込み中にエラーが出てしまう場合もあり。
    - エラーが出たらUSB接続を外してやり直すとうまくいく。

なんとか動かせそう。
zipfileを使って複数のzipファイルをまとめて解凍し、それぞれのフォルダに保存するためのpythonコード

大量にダウンロードしたzipファイルを一気に解凍するという場面が時々あったので、メモとして保存します。

```python3 
import zipfile
import os

path = 'zipファイルが格納されているフォルダのパス'
output = '解凍したデータ保存先のパス'

#ファイル名を取得
files = os.listdir(path)

#ひとつずつ解凍
for i in files:
    #zipファイル名のフォルダがなければ新しく作る
    if not os.path.isdir(output + i):
        os.mkdir(output + i)
    #解凍
    zf = zipfile.ZipFile(path + i)
    zf.extractall(output + i)
```

これで保存先にそれぞれのファイル名のフォルダができ、解凍したデータが保存されました。

最初にやってしまったミスとして、zipファイルを格納しているディレクトリにファイルでないもの(保存先にしようとしていた空のフォルダ)を置いてしまったことが原因のエラーがあり、zf.extractallが途中で止まってしまいました。
その他、listdirで取得できるのはそのディレクトリにおける名前のみであって完全なパスではないなど、短くて簡単なコードですが個人的にうっかりミスを起こしやすいものだったので記録しておきたいと思いました。
JavaScriptの巻き上げ

JavaScriptでは**Hoisting (巻き上げ）**が起きます。
##巻き上げとは
**関数や変数をコードが実行する前にメモリに格納すること**

##### 関数宣言の場合
```javascript
func(); //ジョジョ
function func() {
  console.log("ジョジョ");
};
```
上記のコードのように呼び出しが定義より前でも実行可能なのは**関数が巻き上げられてるからです。**
巻き上げが起きることで**funcという関数が呼び出しより先に定義されてると認識されます**。

```javascript
//巻き上げられるので関数宣言が呼び出しより先に読み込まれる
function func() {
  console.log("ジョジョ");
};
func(); //ジョジョ
```
なので関数宣言の場合は呼び出しが先に来ても実行されます。
今度は変数の巻き上げを見てみましょう。

#####変数の場合

```javascript
var myname = "空条承太郎"
  function func() {
    console.log(myname);    
}
func(); //"空条承太郎"
```
"空条承太郎" と出るのが分かりますよね
以下の場合どうでしょうか？

```javascript
var myname = "空条承太郎";
function func() {
  console.log(myname);    
  var myname = "吉良吉影";
  console.log(myname);    
}
func();
```
3行目で"空条承太郎"、5行目で"吉良吉影"が出力されそうですよね。
実際に試してみましょう。

```javascript
var myname = "空条承太郎";
function func() {
  console.log(myname); //undefined
  var myname = "吉良吉影";
  console.log(myname); //吉良吉影
}
func();
```
undefinedと"吉良吉影"が出力されます。これが巻き上げです。
**関数内で宣言されたローカル変数は、すべてその関数の先頭で宣言されたものとみなされます。**

```javascript
//上記のコードは以下のコードと同じ振る舞いになる
var myname = "空条承太郎";
function func() {
  var myname; // 宣言した段階でundefinedが格納される
  console.log(myname); //undefinedが出力される
  myname = "吉良吉影"; //初期化される（代入）
  console.log(myname); //吉良吉影が出力される
}
func();
```
###### letで試してみる

```javascript
//エラーになる
let myname = "空条承太郎";
function func() {
  console.log(myname); 
  let myname = "吉良吉影"; 
  console.log(myname); 
}
func(); //Uncaught ReferenceError: Cannot access 'myname' before initialization

```
###### constでも実行

```javascript
//エラーになる
const myname = "空条承太郎";
function func() {
  console.log(myname); 
  const myname = "吉良吉影"; 
  console.log(myname); 
}
func(); //ReferenceError: Cannot access 'myname' before initialization

```
**varだとundefindが出力されますが（エラーではない）const、letだとReferenceErrorとして扱われます（処理が止まる）**
undefindはエラーではないので処理が止まりません、なのでバグの温床になるのかなと思いました！
window.openerが使えなくなった

いつ頃変わったのか分からないけど、前までは

```html
<a href="/hoge" target="_blank">hoge</a>
```

みたいなコード書いておけば遷移先のウィンドウで `window.opener` に呼び出し元画面の参照が入ってたのに使えなくなってた。

```html
<a href="javascript:void(0);" onclick="window.open('/hoge')">hoge</a>
```
って書けば動く。

該当箇所書き直すの面倒くさい・・
CocoaPodsのインストールがLoadError/invoke_with_build_argsで失敗する

エラー内容

```
$ sudo gem install cocoapods
ERROR:  Loading command: install (LoadError)
	dlopen(/Users/mu/.rbenv/versions/2.3.3/lib/ruby/2.3.0/x86_64-darwin18/openssl.bundle, 9): Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
  Referenced from: /Users/mu/.rbenv/versions/2.3.3/lib/ruby/2.3.0/x86_64-darwin18/openssl.bundle
  Reason: image not found - /Users/mu/.rbenv/versions/2.3.3/lib/ruby/2.3.0/x86_64-darwin18/openssl.bundle
ERROR:  While executing gem ... (NoMethodError)
    undefined method `invoke_with_build_args' for nil:NilClass
```

## 解決策
rubyのバージョンが2.3.3になっていたことが原因でした。
rubyのバージョンを2.6.3にしたらなおりました。（どのバージョンから直るかは検証していないです）

```
$ rbenv versions
  system
  2.2.3
* 2.3.3 (set by /Users/mu/.rbenv/version)
  2.5.1
  2.6.3
$ rbenv local 2.6.3
  system
  2.2.3
  2.3.3
  2.5.1
* 2.6.3 (set by /Users/mu/Documents/Cashari/app/.ruby-version)
```

これで`sudo gem install cocoapods`したらうまく通りました。
【AWS】AWSのSESとnodemailerを使って、独自ドメインからメールを送信してみた

皆さんこんにちは！

最近AWSの様々な機能に触れるようになったのですが、何と言っても便利！！！

こういう機能無いかなと調べたらほぼ確実にある！

そんなこんなで今回はAWSのSES（Simple Email Service）を使って、``nodemailer``で独自ドメインからメールを送信して見ようと思います！

#はじめに#

独自ドメインは取得しているていで話を進めていきます。

また、SESでの設定も今回は省きます。

SESでメール送信の設定を行っていないという方は、下記の記事をご覧ください。

・[【AWS】AWS初心者がRoute53＋SESを使って、独自ドメインでGmailからメールを送信してみた](https://qiita.com/akki-memo/items/616671ccb009a0202113)

それでは説明を見ていきましょう！

#nodemailerの準備#

まずは、パッケージをインストールします。

```
npm i nodemailer
```

次に、SESでメールの登録を行った際に、ユーザー名、パスワードの情報をダウンロードしているかと思います。

していない場合はもう一度設定を行ってSESのユーザー名、パスワードが記載してあるファイルをダウンロードしてください。

それらのユーザー名とパスワードを以下の``username``と``password``に定義してください。

また、ホスト名もSESで作成したリージョンを指定して定義してください。

```index.js
  const userName = 'ユーザー名'
  const password = 'パスワード'
  const mailAddress = 'info@example.com'
  const host = 'email-smtp.<リージョン（例：ap-northeast-1）>.amazonaws.com'
```

そして、この情報を元に以下のように``transporter``を作成します。

```index.js
  const userName = 'ユーザー名'
  const password = 'パスワード'
  const mailAddress = 'info@example.com'
  const host = 'email-smtp.<リージョン（例：ap-northeast-1）>.amazonaws.com'

  const transporter = nodemailer.createTransport({
    host: host,
    port: 587,
    secure: false,
    auth: {
      user: userName,
      pass: password
    }
  })
```

#メールオプションの設定#

次に、メール内容を決めます。

```index.js
  const userName = 'ユーザー名'
  const password = 'パスワード'
  const mailAddress = 'info@example.com'
  const host = 'email-smtp.<リージョン（例：ap-northeast-1）>.amazonaws.com'

  const transporter = nodemailer.createTransport({
    host: host,
    port: 587,
    secure: false,
    auth: {
      user: userName,
      pass: password
    }
  })

  const mailOptions = {
    from: mailAddress,
    to: 'example@gmail.com',
    subject: 'お問い合わせ内容の確認',
    html: `
      <p>テスト</p>
      `
  }
```

``meilOptions``にメール内容を記述してください！

#メールの送信#

最後にメールを送信してみましょう！

```index.js
    const userName = 'ユーザー名'
  const password = 'パスワード'
  const mailAddress = 'info@example.com'
  const host = 'email-smtp.<リージョン（例：ap-northeast-1）>.amazonaws.com'

  const transporter = nodemailer.createTransport({
    host: host,
    port: 587,
    secure: false,
    auth: {
      user: userName,
      pass: password
    }
  })

  const mailOptions = {
    from: mailAddress,
    to: 'example@gmail.com',
    subject: 'お問い合わせ内容の確認',
    html: `
      <p>テスト</p>
      `
  }

  return transporter.sendMail(mailOptions, (erro, info) => {
    if (erro) {
      return {
        error: erro.toString(),
        message: 'To send mail is failed'
      }
    }
    return {
      message: 'To send mail is successed'
    }
  })
```

このようにしてSESを使って、独自ドメインでメールを送信することができます。

そこまで難しくないとは思います！

メールが届かない場合は認証情報が間違っている可能性が高いです。例えばユーザー名とかパスワードとか。

それでも送信されない場合はSESでの設定を疑ってみてください！

以上、「【AWS】AWSのSESとnodemailerを使って、独自ドメインからメールを送信してみた」でした！

また、何か間違っていることがあればご指摘頂けると幸いです。

他にも初心者さん向けに記事を投稿しているので、時間があれば他の記事も見て下さい！！

あと、最近「ココナラ」で環境構築のお手伝いをするサービスを始めました。

気になる方はぜひ一度ご相談ください！

Thank you for reading
自分のいいなと思ったアジャイルの記事だけをまとめる

## リンク集
#### 1. 月に1回読みたい、アジャイルとスクラムの基礎まとめ
https://qiita.com/gold-kou/items/90ba982a14ca79d843c9
#### 2. アジャイルの範囲だけに止まらない。`試行件数の見える化`とかすごくいい。あと読みやすい
https://qiita.com/kojimadev/items/4b28f801863cf4e8f0da
#### 3. １週間スプリント推奨の記事、`ワーキングメモリに保持できる「7±2」個の日数`がアツイ:sunny: ryuzee.comの記事全部読め
http://appresso.hatenablog.com/entry/2016/12/02/010000
#### 4. モブプロやるか迷った時に読みたい
https://www.slideshare.net/i2key/xpjug

## 番外リンク集
#### 1. `スクラムトレーニング`が人に勧めるとき、楽そう..だなって
https://blog.cybozu.io/entry/2020/09/07/180000
#### 2 .アジャイルサムライ読みたくなる
https://www.slideshare.net/Memberscorp/mem-college-20121017?qid=d796e3b5-f62c-4224-961b-3fe325b4c6c2&v=&b=&from_search=1
#### 3. 自分が作った、駄文・・・自戒の念を込め
https://qiita.com/tomotakasg/items/bb267576e72796fd0f0a

## おすすめされたサイト
#### 1. デブサミ2021まとめ (情報量多すぎて見れてない)
https://zenn.dev/h_yoshikawa0724/articles/2021-02-20-developers-summit-2021
#### 2. 教育とカルチャー作りの話
https://speakerdeck.com/atamaplus/about-atama-plus-agile-and-culture
#### 3. リモートの話だけど、`なぜファシリテーションが重要か`がおもしろい
https://speakerdeck.com/iwashi86/effective-remote-working-f8421bbb-a932-4ac6-a1c3-4b54ff2cf920
#### 4. ふりかえりのガイド　定期的に、立ち止まって、共有していけ
https://speakerdeck.com/viva_tweet_x/a-retrospective-guide
#### 5. タイトルの通り、個人の生産性を最大化する方法の話　普通に読み物として面白い（情報多いw）
https://speakerdeck.com/raykataoka/atomic-scrum-ge-ren-falsesheng-chan-xing-wozui-da-hua-surufang-fa
#### 6. AgileTechEXPO 
https://www.youtube.com/watch?v=3Q8LzLntosY
#### RegionalScrumGatheringTokyo2021　（全く読んでません・・量多い）
https://scrummasudar.hatenablog.com/entry/2021/01/06/170719
#### 7. カイゼンジャーニーnote
https://note.com/papanda0806

## やった理由、きっかけ
アジャイルコーチと共に仕事しているおかげでアジャイルモチベがそこそこ高いです。
仕事をしながら日々楽しくアジャイルと向き合えています。

そんな日々アジャイルを学べている自分でも
Qiitaやネットの記事でも得られることは多いにありますし、
コーチから聞いたなーって話も記事の内容に盛り込まれてました。

それと、最近のqiita君がURL貼り付けた際、
おしゃれなUIでリンク表示されているのが「中々いいな」
と感じてまして、リンク集作るきっかけになりました。（mdでリンク文字作るより楽だし、見やすい）

リンク読む以外にも本読め！とか講習会行け！とか・・・
言わないでいただきたいですね:innocent:
0（ゼロ）よりいいでしょ


もちろん！お金と時間に余裕があるならscrumallianceで勉強してCSM取ればいいんじゃないでしょうか

#### リンクについては暇見つけては、追記予定です！！
おすすめあったら、コメントにURLください。共感したら、追記します（謎上目線）
Pythonで、小数点以下の表示桁数を固定した上で右寄せにしたい場合

　以下のようなプログラムを書いたとする。

```python
import numpy as np

for i in np.arange(8,12,0.25):
    print(f'ただいまの気温は {i} 度です')
```

　結果は以下の通り。

```
ただいまの気温は 9.0 度です
ただいまの気温は 9.25 度です
ただいまの気温は 9.5 度です
ただいまの気温は 9.75 度です
ただいまの気温は 10.0 度です
ただいまの気温は 10.25 度です
ただいまの気温は 10.5 度です
ただいまの気温は 10.75 度です
```

　数字の位置が不揃いでぱっと見の大小関係が比較しづらい。これを直したい。

# rjust

　Pythonにはこのような要望に答えるために`rjust`というメソッドがある。自動的に数字を右寄せにしてくれるのだ。しかし、これだけでは上手くいかない。

```python
for i in np.arange(9,11,0.25):
    print(f'ただいまの気温は {str(i).rjust(5)} 度です')
```

```
ただいまの気温は   9.0 度です
ただいまの気温は  9.25 度です
ただいまの気温は   9.5 度です
ただいまの気温は  9.75 度です
ただいまの気温は  10.0 度です
ただいまの気温は 10.25 度です
ただいまの気温は  10.5 度です
ただいまの気温は 10.75 度です
```

　確かに右寄せにはなっているが、小数点の位置がバラバラなのだ。これは、`float`が小数点以下に0があった時には省略するという仕様があるためである。場合によってはありがたいが、今回はあまりありがたくない。小数点以下の表示が同じでないと、ぱっと見の大小関係が比較しづらい。

# format

　Pythonにはこのような要望に答えるために`format`という機能がある。`{}`の表記を`{:.2f}`とすれば、小数点以下の表示を2桁に固定してくれる。

```python
for i in np.arange(9,11,0.25):
    print(f'ただいまの気温は {i:.2f} 度です')
```

```
ただいまの気温は 9.00 度です
ただいまの気温は 9.25 度です
ただいまの気温は 9.50 度です
ただいまの気温は 9.75 度です
ただいまの気温は 10.00 度です
ただいまの気温は 10.25 度です
ただいまの気温は 10.50 度です
ただいまの気温は 10.75 度です
```

　しかしこれでも微妙に上手くいっていない。整数部分の桁数が違う場合、左寄せになってしまうのだ。

# 幅指定（追記）

　コメントで教えていただいた。こんな便利な記法があったとは。

```python

for i in np.arange(9,11,0.25):
    print(f'ただいまの気温は {i:5.2f} 度です')
```
```
ただいまの気温は  9.00 度です
ただいまの気温は  9.25 度です
ただいまの気温は  9.50 度です
ただいまの気温は  9.75 度です
ただいまの気温は 10.00 度です
ただいまの気温は 10.25 度です
ただいまの気温は 10.50 度です
ただいまの気温は 10.75 度です
```


# 複合技（追記前）

**（※以下の記述は、上の「幅指定」を知る前に書いたものになります）**

　要は

- 小数点以下に0を含む
- 整数部分の桁が揃っていない

　という場合は、どちらかを直すだけではダメなのである。これを適切に処理するためには、順を追って処理する必要がある。

```python
for i in np.arange(9, 11, 0.25):
    formated_i = f'{i:.2f}'
    print(f'ただいまの気温は {str(formated_i).rjust(5)} 度です')
```

```
ただいまの気温は  9.00 度です
ただいまの気温は  9.25 度です
ただいまの気温は  9.50 度です
ただいまの気温は  9.75 度です
ただいまの気温は 10.00 度です
ただいまの気温は 10.25 度です
ただいまの気温は 10.50 度です
ただいまの気温は 10.75 度です
```

　微妙にめんどくさい。
Git ローカルリポジトリをリモートリポジトリの紐付けを解除する

## 方法

1. リポジトリ内部で下記コマンドを実行して現在のリモートリポジトリアドレスを表示する。

    ```terminal
    $ git remote -v
    ```

1. 前のコマンドの出力に記載されているリモートブランチ名をコピーする。(デフォルトだとorigin) 
1. 下記コマンドを実行してローカルリポジトリとリモートリポジトリの紐付けを解除する。

    ```terminal 
    $ git remote remove リモートリポジトリ名(デフォルトだとorigin)
    ```

1. 下記コマンドを実行してリモートリポジトリのリンクアドレスが表示されなければ紐付けの解除は成功している。

## 参考文献

- [https://docs.github.com/ja/github/using-git/removing-a-remote](https://docs.github.com/ja/github/using-git/removing-a-remote)
稀によく使う英単語

# まえがき

稀によく使う英単語は忘れてしまうのでメモ

---


| 日本語 | 英語        | 記事 |
|--------|------------|------------|
| 加法 | addition | |
| 加法 | summation | |
| 減法  | subtraction | |
| 乗法  | multiplication | |
| 除法   | division    | |
| 被加数 | augend | |
| 加数   | addend | |
| 被減数 | minuend | |
| 減数   | subtrahend | |
| 被乗数 | multiplicand | |
| 乗数   | multiplier | |
| 被除数 | dividend    | |
| 除数   | divisor     | |
| 冪乗   | exponentiation | |
| 累乗   | repeated multiplication | |
| 底     | base | |
| 冪指数 | exponent | |
| 冪     | power | 冪乗の結果 |
| 分子   | numerator   | | 
| 分母   | denominator | |
| 係数   | coefficient | 3y の 3 |
| 和     | sum | |
| 差     | difference | |
| 積     | product | |
| 商     | quotient | |
| 剰余   | remainder | |
| 約数   | divisor | |
プログラミングの学習初期からNotionでコードをストックしていたら、その軌跡で成長を感じられただろうな（後悔）

#はじめに
昨日、Notionを使った、コードのストックについて、[こちら](https://qiita.com/TerToEer_sho/items/0256ec5289c7f169454b)の記事で紹介しました。
一晩経って、改めて思いついたことを紹介します。

##学習の初期こそ価値がある

プログラミングの学習方法については色々な方が発信をしていたり、ロードマップを示していたりするのをよく目にします。
「覚ぼえなくていい」「何か作ってみる」などなど。

私の学習初期を思い返すと、
とにかく**楽しかった**です。
自分で書いたプログラムが動くこと、プログラミングの問題を解くこと、
その思考の過程が楽しくて仕方がありませんでした。
一方で、コードを覚えなかったとしても、同時に思考の過程も覚えられていないことも度々ありました。
がっつりとノートを取るのも違う気がしていました。
学習の方法について、私の中で答えは出ていませんし、正解もわかりません。

そこで、Notionを使って、コードをストックするように、
考え方が大切なコードであったり、
プログラミングの問題を解いて、理解が曖昧だったりするコードを
Notionのコードブロックを使って、保存し、説明を補足したり、感想を記録しておくことも一つの学習方法ではないかと考えました。キーボード入力するので、手書きよりも早く記録することで、時短にもなります。

---

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/741816/dc58c733-a63d-6cfe-359e-c70a94b93436.png" width=90%>
これは、私がストックしているコードの一部です。
プログラミング言語をページのタイトルにして、分類しています。
このときは、コードブロック内にコメントとして、説明を残していますが、やり方は色々あると思います。

他には、機能ごとにページを作るなど、テーマに沿ってコードをストックすることができます。
Notionはオンラインであれば、パソコン以外の端末でもページを閲覧することができます。移動時間にスマホで復習も可。
学習仲間とページを共有して、学びを深めるなんてこともできます。（←これめっちゃ楽しそう！！）
参考のWebページやリファレンスのリンクを貼り付けることもできるので、管理が繁雑なりにくいことも大きなメリットです。なんなら、動画を貼り付けることもできるので、時には重宝しそうです。

##最後に
ちなみに、
iPadを使った学習方法については
↓こちらの記事で紹介しています。GoodNotes5を使った方法です。
[初学者に届け！！私のiPadを活用した学習方法　〜具体例を添えて
](https://qiita.com/TerToEer_sho/items/9ed7a378f424b14a495d)
HTMLとCSS

#HTMLとCSSの概要
- インターネットで見ているWebページの見た目を作る
- ページの情報は、HTMLとCSSという2つの言語によって構成されている

##HTML
- ウェブサイトに表示される情報を記載する言語
- HTMLだけでも情報を表示することは可能
- 例：test.html


##CSS
- HTMLに装飾を加えるための言語
- HTMLとCSSはセットで使用するもの
- 例：style.css

###拡張子
ファイルに書かれる言語の種類を識別するためにファイル末尾につける文字列

- htmlのファイルを作成する場合は〇〇.html
- CSSの場合は〇〇.css

##HTMLのコード
```html:test.html
	
<!DOCTYPE HTML>
<html>
  <head>
    <meta charset="UTF-8">
    <title>HTML学習用ウェブサイト</title>
    <link rel="stylesheet" href="style.css">
  </head>
  <body>
    <h1>
      これが<span class="blue">見出し</span>要素
    </h1>
    <p>
      １つ目の段落
    </p>
    <p class="second-message">
      2つ目の段落
    </p>
    <p id="third-message">
      3つ目の段落<b>この部分は太字</b>
    </p>
     <a href="https://www.google.com/">クリックしてGoogleへ遷移</a>
  </body>
</html>
```
### HTMLの要素

`< >...</ >`
この記述ひとつひとつが要素
数多くの要素が積み重なってHTMLは構成されている

>
見出しであることを表している要素
リンクであることを表している要素

### タグ
要素の始まりを示す開始タグ
終わりを示す終了タグ(終了タグが無い要素もある)

>
`<h1>...</h1>`
`<a href="https://www.＊＊＊＊＊.com/">...</a>`

###span要素
テキストの一部だけを装飾する
>
`これが<span class="blue">見出し</span>要素`

### link要素
link要素を用いてHTMLファイルからCSSファイルを読み込む
>
`<link rel="stylesheet" href="style.css">`

## cssのコード
```css:style.css
.body {
    color: white;
    height: 100px;
}
p {
  color: red;
  font-size: 24px;
}
.first-message {
  color: red;
}
.second-message {
  color: orange;
  font-size: 12px;
}
#third-message {
  color: blue;
}
.blue {
  color: blue;
}
```

##`cssはセレクタ・プロパティ・値`の3つで構成されている

###セレクタ
どの部分のHTMLに適用するかを選択するための記述
>
`.body` {
    color: white;
    height: 100px;
}

###プロパティ
セレクタで指定したHTMLの「何を変えるのか」を選択するための記述
>
.body {
    `color`: white;
    `height`: 100px;
}

###値
値でどのような色にするのかを決める
>
.body {
    color`: white;`
    height`: 100px;`
}


##`特定の箇所を指定`してcssを適用させる

###classセレクタ
class名をCSSのセレクタとして使用する
>
`.first-message` {
  color: red;
}

###idセレクタ
id名をCSSのセレクタとして使用する
>
`#third-message` {
  color: blue;
}
ruby-jmeterを使ってRailsアプリの負荷試験を継続的に行えるよう準備する

私はパフォーマンスチューニングが得意なこともあり、負荷試験を行う場面がそこそこあります。負荷試験ツールにはいろいろなものがありますが、古くからあり情報も多い[JMeter](https://jmeter.apache.org/)を使うケースは今でもそれなりに多いと思います。JMeterはGUIで設定ができて手軽なのですが、複雑なシナリオをGUIでポチポチ作るのは面倒です。シナリオをXML形式で出力することもできますが、XMLは読み書きしづらいですし、[JMeterのGUIでシナリオを実行してはいけない](https://jmeter.apache.org/usermanual/get-started.html#load_test_running)とのことです。それなら最初からわざわざGUIを起動したくないですよね。

そこで、RubyのDSLでJMeterのシナリオを記述できる__ruby-jmeter__を使って、Ralisアプリの負荷試験を継続的に行う環境を作っていきます。

https://github.com/flood-io/ruby-jmeter

# JMeterをインストール

[公式サイト](http://jmeter.apache.org/download_jmeter.cgi)でダウンロードできます。今回は、2021/03/15現在の最新バージョンである5.4.1を使用します。Macを使っている方はHomebrewでインストールできます。

```
$ brew install jmeter
```

JMeterを動かすにはJavaが必要ですが、詳しくはJMeterを起動する際の指示に従ってください…。

# 負荷試験対象のRailsアプリを用意

普段開発しているRailsアプリで行ってもらって構いません。本記事では、サンプルとしてRailsチュートリアルで作成するアプリを拝借し、Rails 6.0.xのアプリをRuby 2.7.xで動かします。

https://github.com/yasslab/sample_apps

```shell
$ git clone https://github.com/yasslab/sample_apps.git
$ cd sample_apps/6_0_0/ch14
$ bundle install --without production
$ yarn install
$ bin/rails db:setup # シードデータも投入されます
$ bin/rails s
```

[http://localhost:3000/users/1](http://localhost:3000/users/1)
![スクリーンショット 2021-03-16 0.31.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28249/f329883a-5c4d-c4d2-4c7a-96dfe101c024.png)

IDが1のユーザにはマイクロポストが50件登録されていますが、IDが50のユーザには1件も登録されていません。これらのユーザ詳細ページに対して負荷試験を行い、どのくらい差が出るか検証してみます。

# ruby-jmeterをインストール

Gemfileにruby-jmeterを追記し、インストールします。

```ruby:Gemfile
gem 'ruby-jmeter'
```

```
$ bundle install
```

# 負荷試験のシナリオを実行するRakeタスク

試しに、同時接続数が10、測定時間が60秒のシナリオを定義して実行してみます。ruby-jmeterだけでJMeterを実行することもできますが、ソースを見る限りHTML形式のレポートを出力できないので、ruby-jmeterではjmxファイルの生成のみ行い、JMeterの実行は直接コマンドを叩くことにします。

```ruby:lib/tasks/jmeter.rake
namespace :jmeter do
  desc "Run JMeter"
  task run: :environment do
    test do
      threads count: 10, duration: 60 do
        visit name: 'User 01', url: 'http://localhost:3000/users/1'
        visit name: 'User 50', url: 'http://localhost:3000/users/50'
      end
    end.jmx(file: 'jmeter.jmx')
    system('jmeter -n -t jmeter.jmx -l jmeter.jtl -e -o report -f')
  end
end
```

```
$ bin/rails jmeter:run
```

実行が終わると、カレントディレクトリにHTML形式のレポートが出力されているので、 `./report/index.html` をブラウザで開いてみましょう。私の環境で実行したところ、以下のような結果になりました。developmentで動かしていることもあり、レイテンシーに結構差が出ていますね🚀
![_Users_saito_Downloads_sample_apps_6_0_0_ch14_report_index.html.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28249/7737bc03-4eb8-6dc2-7498-6cb8328348c6.png)

# 最後に

コマンド一発で負荷試験できるようになれば、あとはCIに組み込んで自動実行させるだけです。負荷試験は本番環境に近い環境で実行しないと良い効果を得られないので、実際に稼働している本番環境に対して行うか、それに近い専用の環境を用意して行うようにしましょう。

なお、JMeterのコマンドラインオプションについては `--?` オプションで確認できる（珍しいオプションですね👀）ので、興味があれば見てみてください。
IBM Cloud Internet ServicesでError 524が発生してしまう場合にタイムアウトを伸ばす方法

# 経緯

IBM Cloud Internet Services（CIS）を使っているとき、オリジンのサービスでリクエストを受け付けてから応答を返すまでに時間がかかるとき、Error 524が発生する場合があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/ce62c1d9-1ed7-d4ae-bf47-a969bf9d2dd1.png)

原因ですが、CISではリクエストを送信してからレスポンスの受信を開始するまでのタイムアウト時間が100秒となっており、それを超えてしまっているからだと考えられます。

この事象は、アプリケーションがリクエストを受け付けてから巨大なファイルをサーバ側で生成し、生成が終わってからダウンロードが開始されるような仕組みにしている際によく見られます。ダウンロード開始までに100秒を超えてしまったということです。

# 対応

そもそもそのようなアプリケーションの作りをすべきでないのですが、今からアプリケーションを直すのが難しい場合、上限はありますがタイムアウト時間を伸ばすことができます。

CISのベースであるCloudflareのドキュメントに次の記述があります。

> https://support.cloudflare.com/hc/ja/articles/115003011431-Cloudflare-5XX-%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AE%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0#524error

> Enterpriseプランのお客様は、524秒のタイムアウトを600秒まで伸ばすことができます。

IBM Cloudの場合、CASEでサポートに依頼することで延長が可能です。

CASEでチケットを起票する際、次の情報を含めてください。

* 対象CISのCRN
* 対象ドメインID
* 延長時間

CRNとドメインIDはCISの管理画面で確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/2a850d35-7eb4-58fd-6dd6-962cfceaef06.png)

# 注意点

* Enterpriseプラン以上が必要です
* 上限は600秒（10分）です
* チケット起票から対応まで時間がかかる場合があります
* 本来的にはアプリケーションの作りを見直すべきです
Vite+React+TypescriptでEmotion 11を使用可能にしてみる

Reactのプロジェクトのビルドツールとして、Viteを使用しはじめました。そのプロジェクトにEmotionのバージョン11を導入してみました。

## 使用した主なOSSのバージョン

|OSS|バージョン|
|:--|:--|
|Vite|2.0.5|
|Emotion|11.1.5|
|React|17.0.0|
|Typescript|4.1.2|

※ReactとTypescriptはViteで以下のコマンドを実行してインストールされたものを利用しています。

```
yarn create @vitejs/app my-app --template react-ts
```


## Emotionのインストール

```
yarn add @emotion/react
```

## css属性を理解させる

モジュールをインストールしただけだと、css属性を理解してくれないので、Qiitaなどに書いてあるサンプルプログラムを動かそうとすると動かなくて困ります。
例えば以下のようなJSXにした場合、TypeScriptはdivタグにcssなんていう属性はないよって怒られてしまいます。
Visual Studio Codeでも赤い波線でエラーと表示されてしまいます。

```typescript
<div css={{ color: "red" }}>top page</div>
```

これを解決するには、tsconfig.jsonの`compilerOptions/types`に`"@emotion/react/types/css-prop"`を追加します。

```json
{
  "compilerOptions": {
    〜
    "types": ["vite/client", "@emotion/react/types/css-prop"],
    〜
  }
  〜
}
```

## `@jsx`プラグマを書きたくない

この時点で、tsxファイルの最初に`@jsx`プラグマを書けば Emotion は使用できるのですが、すべてのtsxファイルに書き込むのはちょっと面倒です。

```typescript
/** @jsx jsx */
import { jsx } from "@emotion/react"
```

vite.config.tsを以下のように書けば上記を省くことができるようになります。
esbuildのエントリーを追記しましょう。

```typescript
import { defineConfig } from "vite"
import reactRefresh from "@vitejs/plugin-react-refresh"

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [reactRefresh()],
  esbuild: {
    jsxFactory: "jsx",
    jsxInject: `import { jsx } from "@emotion/react"`
  }
})
```

以上の設定をすれば`@jsx`プラグマの記述と`@emotion/react`のインポートの記述は不要になります。
これらは Visual Studio Code 上でも同様に効くのでよかったら設定してみてください。

## 困ったこと

`yarn dev`実行時、高速実行を謳うViteなのに更新がとても遅くなる現象に遭遇しました。
私はウィルス対策ソフトとして ESET を使用しているのですが、 ESET のファイアウォールをOFFにしたところ改善しました。
なぜそれに気づいたかといえば、それは勘で気づいただけなので、詳しく理由はわかりませんが、ESET を使用している方で同じような現象に遭遇されている方はお試しください。
sass @for文

１〜１００まで

```
    @for $i through 100 {
      
    }
```

１〜９９まで

```
    @for $i to 100 {
      
    }
```

インターポレーション（# + {　}で変数を囲む）

```

    @for $i from 1 through 2 {
      &:nth-child(#{$i}) {
        animation-delay: -0.32s;
      }
    }
```
【初心者でもわかる】立体に見える錯覚文字の作り方3選

# どうも7noteです。文字がまるで立体に見せて錯覚を起こす方法を3つご紹介

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/88f4150a-20bd-9c57-71c7-91adfdfac1c6.png)

**影を駆使して、文字を立体に見せかけるマジック。**
見出しとかにも使えるかも。

3つの方法をご紹介しますので自由にお使いください。


## ①text-shadowで立体感を出す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/b265bcc1-e83f-46e2-b824-c2a3a761d568.png)

```index.html
<h2 class="font">FONT</h2>
```

```style.css
.font {
  font-size: 30px;    /* 文字サイズを30pxにする */
  font-weight: bold;  /* 太文字にする */
  text-shadow: 1px 1px 0 #666,2px 2px 0 #666,3px 3px 0 #666;  /* 影を3重に指定 */
}
```


## ②地面に影を作り、文字を直立させる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/e7d58945-df51-cfd4-8dcd-65e1d4102a37.png)

```index.html
<h2 class="news">NEWS</h2>
```

```style.css
.news {
  font-size: 3em;      /* 程よい大きさに指定 */
  position: relative;  /* 基準位置とする */
  text-align: center;  /* 文字を中央揃えにする */
}

.news::before {
  content: "NEWS";    /* 影にするテキストを指定 */
  font-size: 0.8em;   /* 少し小さくするor大きくする */
  letter-spacing: 8px;/* 文字間を広げる（微調整必要） */
  color: #ccc;        /* 文字色を薄いグレーに指定 */
  opacity: .7;        /* 透明度を0.7に指定 */
  position: absolute; /* 相対位置にする */
  bottom: 3px;        /* 下から3pxの位置に指定（微調整必要） */
  left: 50%;          /* 左から50%の位置に指定 */
  transform: translateX(-40%) skew(-45deg);  /* 表示位置と傾斜を指定（微調整必要） */
  z-index: -1;        /* 背面に移動 */
}
```

文字を直立させる方法です。
地面に影を作ることで、普通の文字が直立しているように見え、立体的にみえます。


## ③　①と②を組み合わせてみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/88f4150a-20bd-9c57-71c7-91adfdfac1c6.png)

```index.html
<h2 class="news">NEWS</h2>
```

```style.css
.news {
  font-size: 3em;      /* 程よい大きさに指定 */
  position: relative;  /* 基準位置とする */
  text-align: center;  /* 文字を中央揃えにする */
  font-weight: bold;   /* 太文字にする */
  text-shadow: 1px -1px 0 #666,2px -2px 0 #666,3px -3px 0 #666;  /* 影を3重に指定 */
}

.news::before {
  content: "NEWS";    /* 影にするテキストを指定 */
  font-size: 0.8em;   /* 少し小さくするor大きくする */
  letter-spacing: 8px;/* 文字間を広げる（微調整必要） */
  text-shadow: none;  /* 影には影をつけない */
  color: #ccc;        /* 文字色を薄いグレーに指定 */
  opacity: .7;        /* 透明度を0.7に指定 */
  position: absolute; /* 相対位置にする */
  bottom: 3px;        /* 下から3pxの位置に指定（微調整必要） */
  left: 50%;          /* 左から50%の位置に指定 */
  transform: translateX(-40%) skew(-45deg);  /* 表示位置と傾斜を指定（微調整必要） */
  z-index: -1;        /* 背面に移動 */
}
```

## まとめ

自分でも思っていたよりキレイにできたのでちょっとビックリ。
他の方法ももし思いつけば追加していきます。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
【GitHub】MacOSをアップデートしたらgitコマンド使えなくなった

アップデートしたらなるやつです。あるあるです。

```
$ git --version
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```
`$ xcode-select --install`を実行するだけ
何分か待ちます。

```
$ xcode-select --install
xcode-select: note: install requested for command line developer tools
```
確認してみましょう。OKですね

```
$ git --version
git version 2.24.3 (Apple Git-128)
```
オーバーウォッチ、新しいDPSヒーローをエコーするためのガイド

オーバーウォッチの新しいヒーロー、エコーの完全ガイドをご覧ください。エコーは、オーバーウォッチ2が登場する前にOWでリリースされた最後のヒーローです。このDPSキャラクターは、非常に優れた機動性と多くのダメージを伴うフルキットを備えているため、ヒーローの使用は楽しいですが、習得はそれほど簡単ではありません。したがって、ガイドでは、エコーをより適切に再生し、キャラクターの可能性を活用するための基本的なヒントと高度なヒントをいくつか紹介します。

優れたDPSのためのエコーキットをマスターするためのガイド

Echoには、敵にダメージを与えるための3つの異なる能力があります。多くの場合、実際に違いを生むのはこれらの呪文の組み合わせです。

三角ショット
Echoは主に、比較的低いDPSと限られた可能性で攻撃します。他の呪文のクールダウンが短いことを考えると、これはDPSを維持する方法ですが、かなり興味深いダメージプロファイルがあります。したがって、それはシールドに良いダメージを与え、1v1の近距離でも違いを生みます。

粘着爆弾
良いエコープレイヤーと悪いエコープレイヤーの違いを生むのは確かに呪文です。スティッキーボムは優れたAoEダメージプロファイルを備えており、敵の戦車が味方に避難する前に爆弾を敵の戦車に貼り付けることで、プレイヤーを少しランダムに殺すことができます。
ダメージが非常に重要になるので、パックの対立でこの呪文を長距離でスパムすることを躊躇しないでください。同じ位置を利用して射撃しようとしている戦車または2つのDPSの後ろに隠れていたヒールを排除できることは珍しいことではありません。

注：[オーバーウォッチブースティングサービスをすぐに利用できるようになりました
集束光線](https://www.eldorado.gg/overwatch-boosting-services/b/27-4)

おそらく、Echoを初めて使用するプレイヤーによる最も使用頻度の低い攻撃です。ビームは、ヘルスポイントの半分以上のターゲットに比較的小さなダメージを与えますが、50％未満で2倍になります。

したがって、エコーDPSを最大化するには、半径を維持して寿命の短いターゲットを完成させる必要があります。特に、半径に到達した場合、敵のヒールがプレイヤーを50％hp未満（戦車でさえ）上げることは非常に難しいためです。さらに、2倍の効果はシールドでも機能します。
戦闘におけるエコーの役割
それ以降、あなたの役割は、粘着爆弾との戦いを開始した後、光線を介してチームファイトでクリーンアップすることです。スティッキーボムは、プレイヤーが満員の状況では優れていますが、孤立したターゲットでははるかに少ないです。

したがって、対戦相手がヘルスポイントの50％を下回るまでに時間がかかる決闘で、DPSの可能性を無駄にしないように、チームと戦う習慣を身に付ける必要があります。

オーバーウォッチでのエコーの機動性
Echoは、フライトを介した非常にモバイルなDPSであり、マップのかなりの部分を通過できるため、バックドアを利用できます。それでも、キャラクターは比較的壊れやすく、彼のDPSは、すでにダメージを受けたプレイヤーのパックに本当に輝いています。

だから、飛行を利用してあなたの代わりになり、粘着爆弾との戦いに従事したり、悪い形の敵を追いかけて光線を介してそれを終えたりする可能性があります。

敵の戦車がしっかりしている場合、飛行によってシールドを回避し、後部ラインに大きなダメージを与えることも可能です。
react-bootstrapのForm.Control要素を中央に配置する

## 概要
画面の要素を横で中央寄せで配置するのに、CSSで`text-align:center`の設定をすることがあるかと思います。しかし、この設定が効かないケースがあって[text-align:centerが効かない！text-alignは何に効くCSSか](https://natsukimemo.com/css-text-align)の通り、ブロック要素ではうまく効きません。
react-bootstrapの`Form.Control`も、中身はこのブロック要素となってると思われ、`text-align:center`の設定が効きませんでした。上記の記事によると、ブロック要素の一番上の親要素に`text-align:center`を設定すれば大丈夫だそうですが、Form.Controlの中の要素に無理矢理設定するわけにもいかず、別の方法で設定することが必要でした。
ということで、今回は私がとった対応を紹介したいと思います。

## 対応
bootstrap使用が前提ですが、[Center align component (both vertical and horizontal) in React](https://stackoverflow.com/questions/55625102/center-align-component-both-vertical-and-horizontal-in-react/55625224)の記事に、方法が何個か書いてあります。
横で中央寄せにするだけであれば、まずは`row`を設定したdivの配下に、もう一個divを設定して`margin: 0 auto;`を設定すれば良さそうです。

## 実装サンプル
```js:sample.js
<div className="row">
  <div style={{ margin: "0 auto" }}>
    <Form.Control
      id="userID"
      type="text"
      name="userID"
      placeholder="ユーザID"
    />
  </div>
</div>
```
プログラミング超入門(６)〜GO言語〜

#for文(繰り返し制御)
配列から要素を一つずつ取り出せるようになります。GO言語の繰り返し処理には、**while文**(データの個数がわからない時に使用する条件式)が無くシンプルにfor文というデータの個数分までループ構造を繰り返す処理のみになります。`for スタート値; 継続条件; 増減式 {　}`スタート値は第一引数にあたり、繰り返し処理をスタートさせる値になります。変数名に**i**(indexやintegerの頭文字)が使われるのが一般的です。0からスタートとなる**カウンタ変数**(アクションの実行回数)を省略形**(:=)**で代入し定義します。継続条件の部分は繰り返しをやめるまでの条件としてブール値を返す式を記述します。通常はiの値に関する式となり、式の値がfalseとなったら繰り返しをやめ、{　}の中から抜けることになります。例として`i <= 4;` `i < len(aprices)`を記述します。増減式は１回の繰り返し処理で１ずつ増やすインクリメント演算子「＋＋」を使用します**「i++」**は、「i += 1」の略です。{　}波括弧の中には繰り返したい処理を書き、ループの条件を判定させます。(繰り返し処理の終わり)まずは、0からスタートさせて5回で終わらせる処理を記述してみます。

```loops.go
package main

import "fmt"

func main() {
    for i := 0; i <= 4; i++ {
        fmt.Println(i)
    }
}
```
##実行結果
```
0
1
2
3
4
```
「変数iを用いた処理を行って、終わったらiを増やす。iの値が条件に達していない場合は処理を繰り返す。」では次に、スライスでpricesから見ている配列のi番目の要素の値を取り出して、文字列に埋め込み出力させてみます。

```shops.go
package main

import "fmt"

func main() {
    prices := []int{99, 122, 233, 456, 1023}
    
    for i := 0; i < len(prices); i++ {
        fmt.Printlf("%d円\n", prices[i])
    }
}
```
##実行結果
```
99円
122円
233円
456円
1023円
```
#スライス型で文字列の配列を定義
`goods := []string{"割り箸","紙コップ","ゴミ袋","テーブルクロス","大皿"}`を、上記のshopsに追加し書式`fmt.Printf("%s: %d円\n", goods[i], prices[i])`に書き加えます。更に一つずつ小計も同時に表示できるよう記述してみます。for文の前に変数sumを作り`sum := 0`を入れ、for文の中の処理を繰り返しごとにsumの値が増えるよう`sum += prices[i]`　`fmt.Printf("%s: %d円 | 小計: %d円\n", goods[i], prices[i], sum)`に修正し`fmt.Printf("総計: %d円\n", sum)`で繰り返し終了後にsumの値を表示させてみます。

```shops.go
package main

import "fmt"

func main() {
    prices := []int{99, 122, 233, 456, 1023}
    goods := []string{"割り箸","紙コップ","ゴミ袋","テーブルクロス","大皿"}
    sum := 0

    for i := 0; i < len(prices); i++ {
        sum += prices[i]
        fmt.Printf("%s: %d円 | 小計: %d円\n", goods[i], prices[i], sum)
    }
    fmt.Printf("総計: %d円\n", sum)
}
```
##ファイルを再ビルドして実行
```
割り箸: 99円 | 小計: 99円
紙コップ: 122円 | 小計: 221円
ゴミ袋: 233円 | 小計: 454円
テーブルクロス: 456円 | 小計: 910円
大皿: 1023円 | 小計: 1933円
総計: 1933円
```
#２次元配列上での繰り返し処理
魚釣りの大会が開かれたと仮定して、釣った魚３匹の大きさ(cm)の合計を「配列の配列」である２次元配列を使って各参加者の平均サイズを出力してみます。尚、釣れなかった人は0でカウントします。

```fishsaverage.go
package main

import "fmt"

func main() {
    average := [][3]int{
        {23, 25, 45}, {42, 0, 0}, {12, 33, 18},
        {32, 35, 14}, {39, 45, 0}}

    for i := 0; i < len(average); i++ {
        sum := 0
        for b := 0; b < 3; b++ {
            sum += average[i][b]           
        }
        fmt.Printlf("参加者%d: 平均サイズ％ｄｃｍ\n", i+1, sum/3)
    }
}
```
##実行結果
```
参加者1: 平均サイズ３１ｃｍ
参加者2: 平均サイズ１4ｃｍ
参加者3: 平均サイズ２１ｃｍ
参加者4: 平均サイズ27ｃｍ
参加者5: 平均サイズ28ｃｍ
```
変数averageに代入しているのはスライスで、そのスライスが見る配列要素はint{　}内にある要素`{23, 25, 45}`のような配列です。for文を定義するには、まず外枠の配列について変数iで繰り返すごとに、変数bで内側の配列について繰り返させます。次に各iに対し、average[i]が持っている３つの要素の平均をさせます。参加者の番号を`i+1`で出力させます。処理が終わるとfor文の一番最初に戻り、iが1増えて、`i<len(average)`がtrueであれば、新しいiの値で、bが0からの繰り返しを始めます。

[←前回の記事](https://qiita.com/ume-bar/items/2026b0a83a18c964d940)　[次の記事へ→](https://qiita.com/ume-bar/items/25b8b85529d2c3a27969)