OmniAICreator/Qiita-1.07M huggingface dataset:
Bash/Zsh/PowerShell 上の Git でマージ済みのブランチを一括削除

現在チェックアウトしていないマージ済みのブランチを一括削除します。

通常は `master` (あるいは `main`) ブランチをチェックアウトした上で実施すると良いでしょう。

ウェブを検索すると色々やり方が出てきますが、以下が比較的簡単だと思います[^no-contains]。

[^no-contains]: 検索しても本稿の方法が出てこないのは `--no-contains` オプションが用意されたのが比較的最近だからなのかも知れません。 [git/2.13.0.txt at v2.13.0 · git/git](https://github.com/git/git/blob/v2.13.0/Documentation/RelNotes/2.13.0.txt#L172)

# Bash または Zsh の場合 

```bash
git branch -d $(git branch --no-contains | xargs)
```

削除するブランチがないときは以下のメッセージが出ますが無視して下さい。

```
fatal: branch name required
```

# PowerShell の場合

```powershell
git branch --no-contains | % { git branch -d $_.trim() }
```
[VBA]Excelのウィンドウを瞬時に整列させるマクロ

## [0]はじめに
Zitanです。
複数のExcelファイルを同時に操作するとき、ディスプレイ画面上に左右にきれいに整列させたい時はありませんか？
今回は、複数のExcelウインドウを瞬時に整列させるコードをご紹介します。

## [1]これを使う

筆者がよく使うのはこちらです。

```ruby:左右に整列させる
Sub 左右に整列()
Application.Windows.Arrange xlArrangeStyleVertical
End Sub
```

その他の整列方法

|  引数  |  結果  |
| ---- | ---- |
|  xlArrangeStyleVertical  |  左右に並べて表示  |
|  xlArrangeStyleHorizontal  |  上下に並べて表示  |
|  xlArrangeStyleTiled  |  並べて表示(デフォルト)  |
|  xlArrangeStyleCascade  |  重ねて表示  |

## [2]結果はこんな感じです

Excelのウインドウを適当に４つ開いておいて、マクロを実行しました。
[![Image from Gyazo](https://i.gyazo.com/8e330c2b704a127d431214c552f4e858.gif)](https://gyazo.com/8e330c2b704a127d431214c552f4e858)

## [3]さいごに
いかがでしょうか。
いくつ起動していてもきれいにピシッと整列するのが癖になりそうです。笑
AWS で ssh with pem ユーザを追加

- ssh するだけのユーザをつくる
- sudo は許可しない



# 環境

- サーバ Ubuntu 14.04 LTS
- クライアント Ubuntu 20.04 LTS



# クライアントで鍵ファイル作成

今回は、鍵ファイルにパスフレーズをつけました。

```

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/nanbuwks/.ssh/id_rsa): ./hogehoge
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in ./hogehoge.
Your public key has been saved in ./hogehoge.pub.
The key fingerprint is:
SHA256:IVTCsgbteJ/XiZmY2n0v7TcDFgYJ20qFqSIqzPzgmH8 nanbuwks@nanbuwks-ThinkPad-X230
The key's randomart image is:
+---[RSA 3072]----+
|   . .o.o+..     |
|  . o...o+o      |
|   + o..+ ..     |
|  o * .o o  o    |
|+. + o +S= o .   |
|o=    = = o o    |
|+.o  o o   o .   |
|o. .E . . o . +  |
| ...     . +o. o |
+----[SHA256]-----+
```

秘密鍵と公開鍵ができたことを確認します。

```

$ ls hogehoge*
hogehoge  hogehoge.pub

```

秘密鍵の名前を変更しておきます。

```

$ mv hogehoge hogehoge.pem

```


# サーバでユーザ追加

パスワード無しで追加

```

$ sudo adduser hogehoge --disabled-password
Adding user `hogehoge' ...
Adding new group `hogehoge' (1007) ...
Adding new user `hogehoge' (1007) with group `hogehoge' ...
The home directory `/home/hogehoge' already exists.  Not copying from `/etc/skel'.
Changing the user information for hogehoge
Enter the new value, or press ENTER for the default
	Full Name []: 
	Room Number []: 
	Work Phone []: 
	Home Phone []: 
	Other []: 
Is the information correct? [Y/n] 

```

# サーバで hogehoge ユーザのログオン環境を調整

まず hogehoge ユーザでログオンしてユーザディレクトリなどを作成してもらう

```

$ sudo su - hogehoge
```

次に SSH に必要なファイルなどを作成する

```

$ mkdir .ssh
$ chmod 700 .ssh
$ touch .ssh/authorized_keys
$ chmod 600 .ssh/authorized_keys
```

# public キーを登録する

scp などでクライアントからサーバに公開鍵を転送し、登録する
例えば /tmp/hogehoge.pub に転送していたとした場合：

```

$ cp /tmp/hogehoge.pub .ssh/authorized_keys
```

# クライアントからアクセスしてみる

```

$ ssh -i hogehoge.pem    hogehoge@www.example.com
Enter passphrase for key 'hogehoge.pem':
.
.
.
hogehoge@example:~$

```

アクセスできました。うまくいったので、 pem ファイルを秘密の場所に保存し、400 にパーミッションを変更しておきましょう。
Pythonのpyautoguiを使ったGUI操作の自動化（はじめの一歩）

pyautogui はマウスの位置，クリック，キーボード入力などができる．さらに画像マッチングによりアイコンの位置を取得できる．
pyperclipはクリップボードに文字列を入力できる．

サンプルコード

```:hello_autogui.py
import pyautogui as pg
import pyperclip as pc
import time
#for i in range(1,100):
posx,posy = pg.position()
print(posx,posy)
time.sleep(0.01)
#pg.click(x=posx, y=posy, button="left")
#pg.typewrite("hello pyautogui!")
#pg.hotkey("ctrl","a")
#pg.hotkey("ctrl","c")
#pg.hotkey("ctrl","v")
#pg.hotkey("ctrl","v")
#pg.hotkey("Enter")
#pc.copy("どうもこんにち　は！")
#pg.hotkey("ctrl","v")


# #image process
img = "target.png"
sc = pg.screenshot()
sc.save("sss.png")
locx, locy = pg.locateCenterOnScreen(img)
print(locx,locy)
pg.click(x=locx, y=locy, button="right")
```


さて何につかおうか．．．

#参考
https://qiita.com/Ringa_hyj/items/db9adbe6afdc77d24bff

https://www.y-shinno.com/pyautogui-vba-2/
backlogへの初回プッシュ時エラーの解決法

サル先生のGIT入門
https://backlog.com/ja/git-tutorial/
の入門編「リモートリポジトリにプッシュする」を実行時、backlogへの初回プッシュ時にエラーが発生してしまっていた。

以下のようなエラーが表示される。。
<b>remote: Unauthorized
fatal: Authentication failed for~~~</b>


<h3>解決した方法</h3>
・プッシュ時にBacklogのユーザー名とパスワードを求められるが、ユーザー名は<b>Backlogに登録したメールアドレス</b>を入力することで解決した。
駆け出しpythonエンジニアのまとめ デザインパターンまとめ1(abstract factory)

# 趣旨
駆け出しエンジニアの備忘録の垂れ流し。
　※ 出典漏れがあればご指摘ください

> 出典: 
https://yamakatsusan.web.fc2.com/pythonpattern08.html
https://dackdive.hateblo.jp/entry/python-design-pattern/abstract-factory
https://www.oreilly.co.jp/books/9784873117393/

# abstract factoryパターン概要
 生成方法がほぼ同様の手順で、かつ、複数のクラスのインスタンス(Product)の生成が発生するようなドメインの実装をするにあたり、Factoryクラスを作ることで、生成処理の実装をシンプルに、かつclient側から作成の責務を分離する。
 Productクラスのインスタンスの生成にあたり、Clientに生成するためのインターフェースを提供するFactoryクラスを実装する。Factoryクラスはお手本となるAbstract Factoryに則った実装となる。
 Clientの関心事は部品を使うことであり、どんな部品であっても作ることはFactoryに任せることが可能となる。
 (Clientは、具象Factoryを指定し、生成のためのインターフェースを呼び出すだけで良い)

## クラス図とシーケンス図
![クラス](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382557/9feef270-63f9-c43e-747c-b18e7dcebae1.png)


![W3sDesign_Abstract_Factory_Design_Pattern_UML.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382557/436bc53a-6c4a-9e0f-3377-64af9dbb1cf6.jpeg)

[wikipedia][wikipedia]より引用

## 実装方針
- AbstractFactoryクラスではtemplate methodのようにProductインスタンス作成手順(必須メソッド)を規定する。
- Factoryサブクラスでは必須メソッドをオーバーライドする。
- ClientではFactoryサブクラスを呼び出し(生成し)、インターフェースを呼び出す処理を実装する
- Client側では呼び出すFactoryクラスの指定が必要。Factoryクラスを決定するメソッドがAbstractFactoryクラスにあると便利。これは`@classmethod`を利用して実現可能。また、Factoryクラスインスタンスの生成をしないで、productインスタンスの生成が行えるようになる。
    - classmethodの用法の１つに、自身のインスタンスを生成する手段としての用法がある。
    - 応用として、どのクラスのインスタンスを生成するか決定するロジックをもたせることで、
    AbstractFactoryのみの指定で、具象factoryのimportを不要とすることも可能。

```python:実装例1
# factory側
class AbstractFactory:
 @abstractmethod
 def create_product1(self):
   pass
 @abstractmethod
 def create_product2(self):
   pass
 @classmethod
 def get_factory(cls, some_args):
     selected_class = get_class(some_args)  # クラスを指定するロジックを記載

     return selected_class()

class FactoryA(AbstractFactory):
 def create_product1(self):
   # 実処理を記載
   return Product1A()
 def create_product2(self):
   # 実処理を記載
   return Product2A()

# client側
def main():
 factory =  AbstractFactory.get_factory(choose_some_keywords_for_selecting_cls)
 product_1  = factory.create_product1()
 product_2  = factory.create_product2() 

```

```python:実装例2
# class内クラスにproductクラスを記載するパターン
# 生成するProductが簡単ならこちらでもOK
# factory側
class AbstractFactory:
 @classmethod
 def create_product1(cls):
   return cls.Product1()
 @abstractmethod
 def create_product2(self):
   return cls.Product2()

class FactoryA(AbstractFactory):
 class Product1:
     pass
 class Product2:
     pass

# client側
def main():
 product_1  = AbstractFactory.create_product1(FactoryA)
 product_2  = AbstractFactory.create_product2(Factory) 

```
## メリットと使い所
- メリット
    - インスタンス生成のロジックが、clientコードに依存しない(インターフェースに依存する)。
    - 作り方、作るもの、実際に作る、を別のモジュールに実装できる
- 使い所
    -  生成方法がほぼ共通の場合に効果がある
    -  1つのFactoryクラスにて生成するProductの種類が増えることへの変化には弱い
 
##　わかってないこと
>  1つのFactoryクラスにて生成するProductの種類が増えることへの変化には弱い

どのように対応(リファクタリング)するのか？


[wikipedia]:https://en.wikipedia.org/wiki/Abstract_factory_pattern#cite_note-8
SQLでcaseを使う

# caseを使ってみよう

ユーザ情報テーブルと、購入履歴テーブルを結合し、
購入回数ごとにランキングを付ける。

5回以上　ランクA
2回以上　ランクB
1回未満　ランクC

```sql
select users.id,count(*),
case
when count(*) >= 5 then 'A'
when count(*) >= 2 then 'B'
else 'C'
end as user_rank
from users
join orders
on users.id = orders.user_id
group by users.id;
```

- end　は必須！　★忘れやすいので注意★
- as でカラム名を付ける

#nullの値を0にしてみよう
```sql
select products.id,products.name,
case
when sum(order_details.product_qty) is null
then 0
else sum(order_details.product_qty)
end as num
from products
left outer join
order_details
on products.id = order_details.product_id
group by products.id
```

left join を使うとnullになることがあり、nullだと都合が悪いときに0を入れておく。
8bitマイコンを使おう～２Vで動くステッピングモーターPF25-48281をATtiny1616で使う～

電池で動くステッピングモーターを日本パルスモーターが製作しキャンペーンをしていたので応募してみました。
___低電圧ステッピングモーター プレゼント___
https://www.pulsemotor.com/support/motor-present.html
#PF25-48281
写真のようにヤマトのネコポスの箱にステッピングモーターと仕様書が入っていました。
![DSC_0297 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/4c7136dd-693a-0909-8626-0d6787b5060c.jpeg)
![DSC_0299 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/286a8a61-d568-4cad-a44a-a86055abc9c6.jpeg)
駆動電圧2Vで動くステッピングモーターで3Vで比較的高速に動くという事です。
2Vという事は乾電池2本程度ですね
(乾電池は1本1.5V、充電池は1.2V相当）
#動作環境を考える
普段使うマイコンは3.3vや5Vが多く2VというとSpresenseの1.8Vになります
もっと安く簡単に使える上に2V前後で動くマイコンは無いかと思ったところAttiny1616を思い出しました。
Attiny1616は1.8V～5Vで動作します。
___8bitマイコンを使おう～ATTINY1616を使う～___
https://qiita.com/usashirou/items/48b30630c4320495d0c3
#ステッピングモーターを回すには
ステッピングモーターを動かすにはモータードライバを使用します。
普通の2つのモーターを動かすことが可能なモータードライバで動かすことが出来ます。
2つのモーターを動かす4つの出力の＋－を切り替える事でステッピングモーターを回すことが可能です。
#モータードライバ
モータードライバーは以前使った1枚50円以下のMX1508を使用します。
___STM32CubeIDEを使ってみよう How To STM32CubeIDE 日本語版(16) モーターを回そう___
https://qiita.com/usashirou/items/a4901fd99940ae65bd8b
MX1508は1.8Vから使用できます。
#配線
今回は、写真のようにまずは、コネクタを圧着します。
![DSC_0302 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/e93050e0-a697-0abb-c40d-8b24d340d33f.jpeg)
![DSC_0321 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a6690002-b2fb-ac09-8178-416de4a92f7e.jpeg)
次に電池ボックスを＋－へ10~13のピンをモータードライバに接続します。
充電池なので2.4V程度出力されそうですが、テスターで測ると2V程度でした。
（当初ダイオードを入れて0.4V落としていましたが外しました）
#プログラムの概要
既に使われている方がいらっしゃいました。
___星を見るために
http://south-alps.sakura.ne.jp/m5stack/Tenmon.html___
プログラムは同じく___Arduinoでステッピングモータを制御してみる___を使用させてもらいました。
https://novicengineering.com/arduino%E3%81%A7%E3%82%B9%E3%83%86%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0%E3%83%A2%E3%83%BC%E3%82%BF%E3%82%92%E5%88%B6%E5%BE%A1%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/
最初にArduinoにStepper.hをインクルードします
` #include <Stepper.h>` 
今回のステッピングモーターのステップ数は48なので48を入れます。
` const int stepsPerRotate = 48;//ステップ数 = 360 / ステップ角 = 360 / 7.5 = 48` 
次に接続するピンを指定します

|ATtiny1616| Motor Driver | PF25-48281 |
|:------------:|:------------:|:------------:|
| 13 | IN1| 茶         |
| 12| IN2| 橙      |
| 11 |IN3| 赤         |
| 10| IN4| 黄           |

` Stepper myStepper(stepsPerRotate, 13,12,11,10);` 

#Arduinoプログラム
```
#include <Stepper.h>

const int stepsPerRotate = 48;//ステップ数 = 360 / ステップ角 = 360 / 7.5 = 48
Stepper myStepper(stepsPerRotate, 13,12,11,10);

void setup(){
Serial.begin(9600);
Serial.print("Start"); 
}
 
void loop(){
  myStepper.setSpeed(50);
  myStepper.step(200);
  delay(1000);
  myStepper.setSpeed(80);
  myStepper.step(200);
  delay(1000);
}
```

以上で動作すると思います。
乾電池2本で動くサーボモーター
なかなか面白い商品だけに、何に使えるかな？と考えてしまいますね。
逆に、8bitマイコンのような低電圧マイコンの活用も面白いかもしれませんね
バッチファイルでzip解凍する（PowerShellを使用）

Y子です。
以前、[ファイルをzip圧縮する](https://qiita.com/koiwaiwaiko/items/516c55bf4f8aeade5eb7 "バッチファイルでzip圧縮する（PowerShellを使用）")コードを書きましたが、今回は解凍のバッチファイルを作ってみました。
_【[確認環境：Windows 10 Home (Bld. 19042.928)](https://qiita.com/koiwaiwaiko/items/ef2d457ae1e1a7c8b698 "Windows10のバージョンを確認・表記する")】_

# 仕様
* PowerShellを使って、zipファイルを解凍する。
* 解凍先として、対象ファイルがあるフォルダにサブフォルダを作成する。
* 複数の引数に対応する。10個以上にも対応する。
* 引数にzipファイル以外があるときは、飛ばす。
* 拡張子は、大文字でも小文字でも対応する。

# 使い方
* バッチファイルに、ファイル名やフォルダ名を引数で与えることで動作する。
* バッチファイルに、ファイルやフォルダをマウスでドロップしてもよい。
* バッチファイルのショートカットを「sendto」に置き、右クリック「送る」から選択してもよい。
* 上記を、複数ファイル同時に行ってもよい。

# コード

```bat:expand_file.bat
@echo off
setlocal

:label_top

  rem 引数がない場合は最後に飛んで終了する
  if "%~1"=="" (
    goto :label_end
  )

  rem zipファイルでない場合は処理しない（大文字小文字区別しない）
  if /i not "%~x1"==".zip" (
    echo "%~1"：zipファイルではありません
    goto :label_bottom
  )

  rem ファイルが存在しない
  if not exist "%~1" (
    echo "%~1"：ファイルが存在しません
    goto :label_bottom
  )

  rem 日付「20210402」形式
  set str_date=%date:~0,4%%date:~5,2%%date:~8%

  rem 時刻「094617」形式
  set str_time=%time: =0%
  set str_time=%str_time:~0,2%%str_time:~3,2%%str_time:~6,2%

  rem 上位フォルダのフルパス「C:\work dir\」
  set str_dir=%~dp1

  rem 解凍先サブフォルダ名「dirname_yyyymmdd_hhmmss」
  set str_subdir=%~n1_%str_date%_%str_time%

  if not exist "%str_dir%%str_subdir%" (
    mkdir "%str_dir%%str_subdir%"
  )

  rem zip解凍実行
  powershell expand-archive -Path '%~1' -DestinationPath '%str_dir%%str_subdir%'
  echo "%~1"：解凍先 %str_dir%%str_subdir%

  :label_bottom
  rem 引数をシフトし、最初に戻る
  shift
  goto :label_top

:label_end

echo 処理を終了しました
endlocal
pause
```

# 説明
サブフォルダを作り、その中に解凍するようにしました。
フォルダ無しで解凍すると、ファイルが既存のファイルと混ざって行方不明になったり、既存のファイルを上書きしたりするので、それを防ぐためです。

zipファイルかどうかの判定のために拡張子を確認していますが、その際、`if`文に`/i`オプションを付けて、大文字小文字を区別しないようにしました。

# 実行結果
```:実行結果
> expand_file.bat "C:\work dir\test01.zip" "C:\work dir\test02.ZIP" "C:\work dir\test03.txt" "C:\work dir\test04.zip"
"C:\work dir\test01.zip"：解凍先 C:\work dir\test01_20210504_183151
"C:\work dir\test02.ZIP"：解凍先 C:\work dir\test02_20210504_183152
"C:\work dir\test03.txt"：zipファイルではありません
"C:\work dir\test04.zip"：ファイルが存在しません
処理を終了しました
続行するには何かキーを押してください . . .
```

# おわりに
解凍先フォルダの設計が、どうもオシャレじゃない気がしています。
とは言え、あまりコードの行数も増やしたくないし。
なんてことを考えてたら、圧縮のコードを書いてから1週間以上経ってしまいました。笑
いろいろな正解があると思いますので、これはこれでいいか、と思うことにしました。

では！明日は雨らしいですね！
繰り返し処理 while/for

# while文
記述としては「`while(条件式){処理}`」のように記述し、条件式がTrueの間、{}内の処理を繰り返すことができます。

```js:例
let number = 1;

while (number <= 10) {
  console.log(number);
  number += 1;   //number++と記述することもできる
}   //;(セミコロン)は必要ありません
```
```text:出力結果
1
2
︙
9
10
```
上記のように記述することで、1〜１０の数字を出力することができました。
`number += 1;`を記述しないと、変数`number`は永遠に`1`であるため、永遠に繰り返し処理が続いてしまいます。これを`無限ループ`と呼び、無限ループになってしまうとコンピュータに異常な負荷をかけてしまうため注意が必要になります。

# for文
繰り返し処理を行う方法として、while文の他に`for文`があります。
記述としては「`for (変数の定義;条件式;変数の更新){処理}`」のように記述することでwhile文同様に条件式がTrueの間、{}内の処理を繰り返すことができます。

```js:例
for (let number = 1; number <= 10; number += 1){
  console.log(number);
}
```
```text:出力結果
1
2
︙
9
10
```
上記のように記述することで、while文同様に繰り返し処理を行うことができます。
（備忘録）ポケットスタディAWS認定 デベロッパーアソシエイトのデモ(デプロイサービスの2)

# 1. はじめに
2021年5月4日に[ヤマムギ](https://yamamugi.connpass.com/)様主催にて開催された[vol.18 ポケットスタディAWS認定 デベロッパーアソシエイトのデモ(デプロイサービスの2))](https://yamamugi.connpass.com/event/211616/)でのAWS学習内容について、自分への備忘録としてまとめてみました。ご参考になれば幸いです。

# 2. 学んだ内容
- AWS CloudFormation

# 3. 学習サイト
- [YouTube：AWS CloudFormationのデモ](https://youtu.be/GvLChaMudsY)

# 4. 参考サイト
- [yamlテンプレートのサンプル](https://github.com/yamamanx/yamamugi/tree/main/v18)
- [yamlテンプレートの書き方](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-instancetype)
- [Former2で既存リソースのCloudFormationテンプレート出力を試してみた](https://www.yamamanx.com/former2-cloudformationtemplate/)
- [Serverless Frameworkによるシステム構成（API Gateway + AWS Lambda）](https://zenn.dev/arahabica/books/d4373bd4401d6c/viewer/8ac315)

# 5. ハンズオンで得た豆知識
- CloudFormationを用いると、テンプレート（yaml）を用いてStackの集合体を構築（テンプレート定義によるサーバ構築）ができる
- テンプレートは、yaml以外にJSONを用いることもできるが、yamlの方が主流らしい
- 「マッピングス：mappings」の定義を用いると、リージョン違いのEC2をAMIを選択させることができる
- 「コンディションズ：conditions」の環境変数定義を用いると、本番／ステージング／開発 のそれぞれの環境だけで動作させたい定義を記述できる
- Formar2サードパーティーを用いると、既存の環境をテンプレート化することができる
- 「インポートバリュー：importvalue」の定義を用いると、他のStackのエクスポート値を参照できる

# 6. おわりに
AWS学習の参考になれば幸いです。
ハンズオン開催してくださいました[ヤマムギ](https://yamamugi.connpass.com/)様、感謝いたします。

2021/05/04 NISHIZONO Takahiro
Herokuからのデータpullとpush、postgresからのデータ入出力方法

## Herokuからのデータpull方法

### addonの確認
```
$heroku addons

Owning App             Add-on                       Plan                         Price  State
─────────────────────  ───────────────────────────  ───────────────────────────  ─────  ───────
evening-XXXX-VVVV      postgresql-TTTTT-VVVVV  heroku-postgresql:hobby-dev  free   created
```

### dbの確認

```
$heroku pg:info -a evening-XXXX-VVVV
=== DATABASE_URL
Plan:                  Hobby-dev
Status:                Available
Connections:           0/20
PG Version:            12.6
Created:               2021-01-19 16:00 UTC
Data Size:             9.2 MB
Tables:                17
Rows:                  1/10000 (In compliance)
Fork/Follow:           Unsupported
Rollback:              Unsupported
Continuous Protection: Off
Add-on:                postgresql-TTTTT-VVVVV
```

## データをpull
```
$PGUSER=username PGPASSWORD=password heroku pg:pull postgresql-TTTTT-VVVVV localdb_development -a evening-XXXX-VVVV     
```

## データをpush

```
$heroku  pg:reset -a evening-XXXX-VVVV     
$PGUSER=username PGPASSWORD=password heroku pg:push localdb_development postgresql-TTTTT-VVVVV -a evening-XXXX-VVVV  
```
## おまけ
### postgresからデータ出力

```
psql -c "\copy table to 'sample.csv' delimiter ',' header;"
```

### データ入力

```
psql -c "\copy table from 'sample.csv' delimiter ',' header;"
```
Azure DevOps StarterでSpring BootのCI/CDパイプラインを作成する

Azure DevOps Starterを使ってみました。App ServiceのCI/CD環境をサクッと作れてかなり便利そうです。以下、試した手順をまとめます。

まずはDev Ops Starterを作成します。

![スクリーンショット 2021-05-03 23.01.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/d5de8d1b-d76b-7fb3-63f8-ac67d990a0fa.png)

Javaを選びます。
![スクリーンショット 2021-05-03 23.01.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/e50d37d9-6b14-3e64-c670-8d644bd05118.png)

Springを選びます。
![スクリーンショット 2021-05-03 23.01.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/aa955f35-b04f-db96-2e91-664678c2e942.png)

今回はLinux Web Appを選びました。
![スクリーンショット 2021-05-03 23.02.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/09506af3-6d95-ec31-b561-eeed2f6d491d.png)

AuthorizeでGitHubの連携を許可します。
![スクリーンショット 2021-05-03 23.02.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/0eb6508f-29d8-111f-305a-a6ea4aadc4ed.png)

リポジトリ名やApp Serviceの名前を入力します。
![スクリーンショット 2021-05-03 23.03.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/f2586056-cbe8-cc06-fa2b-9e81608f4ddf.png)

これでGitHubにSpring BootのリポジトリとApp Serviceが作成されます。
![スクリーンショット 2021-05-03 23.04.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/00964d09-b8fa-e153-621c-f6494a3070b4.png)

GitHub ActionsからApp Serviceにデプロイされる形です。
![スクリーンショット 2021-05-03 23.15.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/e89e1d93-ce27-6faf-65b4-7ac032f59aff.png)

App Serviceにアクセスすると以下の画面が表示されました。
![スクリーンショット 2021-05-03 23.15.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/2437fb15-f5bd-f9f4-3ff9-98e8e302f564.png)

デプロイ後のDevOps Starterの画面はこんな感じです。
![スクリーンショット 2021-05-03 23.16.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/bba9f248-b0cb-0828-70eb-008748b7114d.png)

![スクリーンショット 2021-05-03 23.40.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/3b4a2a57-a6ab-5c1f-7fc5-d35dd2bb60b3.png)

Spring Bootのプロジェクトにhello.htmlを新しく追加してみました。HTMLは以下です。

```html
<!Doctype html>
<html>
<head>
     <title>Hello</title>
</head>
<body>
    <h1>Hello</h1>
</body>
</html>
```

DevOps Starterで作られた雛形のMyAppController.javaにhelloメソッドを加えました。

```java
package com.myapp.root.controllers;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MyAppController {
    
    @RequestMapping("/")
    public String index() {
        return "index.html";
    }
    
    @RequestMapping("/hello")
    public String hello() {
        return "hello.html";
    }
}
```

プッシュするとGitHub Actionsが実行されて自動的にデプロイしてくれます。便利。
![スクリーンショット 2021-05-03 23.40.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/da2eb5c6-082c-dd06-4a2a-81a1adcaddbb.png)

ちゃんと表示されました。
![スクリーンショット 2021-05-03 23.45.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/639ecb20-4bf1-1735-2425-d34cf1661b96.png)

私は個人開発でよくHerokuを使ってます。その理由の一つが簡単にCI/CD環境を作れることだったのですが、Azureでもこんな簡単にできると思いませんでした。今度はAzureを使ってみようかと思います。
matplotlibの日本語化

#結論

親切な方がコメントで教えて下さいましたので訂正します。

##matplotlib3.1以前

以下のやり方で日本語化できました。

```py
%pip install japanize-matplotlib
```

```py
import matplotlib.pyplot as plt
import japanize_matplotlib

japanize_matplotlib.japanize() 
```

https://pypi.org/project/japanize-matplotlib/

##matplotlib3.2以降(追記)
上記の日本語化ライブラリで使われている font_manager.createFontList というメソッドがmatpotlibの3.2.0より非推奨になっていると教えて下さいました。
代替手段まで示してくださっています。

https://qiita.com/mikan3rd/items/791e3cd7f75e010c8f9f

#どうして...?

Matplotlib 日本語化　でググって出てくる記事を上から３つくらい読んでもjapanize-matplotlibの話が出てきません。こんなに簡単なのにどうして…？

https://qiita.com/maroKanatani/items/3b080c639395bba7795a

https://qiita.com/mookouchi/items/2252d3a04109210aed61

https://ricrowl.hatenablog.com/entry/2020/09/14/032424

pipでパッケージをインストールしなければならない点と、フォントを選べない点を欠点として挙げている記事もありました。見た目にこだわったサービスを組織で開発しているケースなら別ですが、個人でデータ分析していててっとり早く可視化したいだけの私にはjapanize-matplotlibで十分でした。

(2021/5/7追記)非推奨と知っても個人で使ってるだけの私はGoogleColaboratory環境(今日時点でmatplotlib3.2.2)で動くうちは使ってしまうと思います。そうじゃない方はご注意ください。
Microsoft365 へメール環境移行のために別メールサービス環境との併存環境を作る

業務でワードやエクセル、パワーポイントなんかを使っている企業が多いと思います。企業規模を問わずMicrosoft365（以下M365）がデフォルトみたいな風潮ですね。ワードやエクセル、パワーポイントは設定らしい設定がないので使う分には簡単ですが、意外とメール（Outlook/Exchange）が曲者だったります(´・ω・`)。既存メール環境をM365に切替するときに仕様が分からず途方に暮れている方向けに「メールアドレスはそのまま使うが、M365と今の環境（別メールサービス）と一時的に併存させたい」という場合の参考になればと思います。
できる併存できるメールサービスとできないものがあるので、詳しくはご利用中のメールサービスベンダーに聞いてみてください。

#前提環境 
 - M365以外のメールサービス（レンタルサーバのメールサービスなど）を利用中
 - 利用しているドメインレジストラのDNSサービス設定を変更することができる
 - M365以外の既存メールサービスに転送設定の項目がある
 - M365のExchangeの利用ライセンスがある
 - M365で利用するドメイン認証設定済み
 - メーラはOutlookを利用
 

# 実現したい内容(今回のゴール）
- M365以外のメールサービスとM365の双方で同一メールアドレスへのメールを受信できるようにする。
　 

（例）info@test-domain.com 宛のメールを「さくらインターネット」のメールサービスと「M365」の両方で受信できるようにする
　

# そもそもの一般的なメール送受信の仕様について
![メール配信フロー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/3ffe4546-e3c8-2eba-5557-1a8547b4c949.png)

上記図で書いている通りMUA、MSA、MTA、MDAを経由してメールは配信されています。

# 併存させるためのM365の環境設定
①メールで利用するドメインの認証をM365側で行い、プライマリーアドレスに設定する
②M365側でメールを受信するユーザおよびメールBoxを作成する　
③ドメインレジストラで利用するドメインのMxレコードを既存メールサービスのメールサーバにする
④既存メールサービス側でメール受信した際にM365に作成したユーザのデフォルトドメインアドレス（xxx@xxx.onmicrosoft.com)に転送する設定を行う
⑤M365側に受信コネクタを設定する


![M365＿フロー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/f8b16677-d8f9-5b58-4c04-49fa161671fc.png)

## 概要説明
利用するメールアドレスへのメールについて、いったんは既存メールサーバで受信して、M365へ転送することで、あたかも既存メールサービスとM365どちらでもメールが受信できているように見えるというわけです。
M365への転送はM365デフォルトドメインのメールアドレス（利用するアドレスとはべつもの）に設定します。

## 補足事項
M365を契約し、ユーザを作成すると、デフォルトで[@"テナント名".onmicrosoft.com]というドメインが割り当てられます。
独自ドメインを利用したい場合は、ドメイン利用認証を行い、デフォルトドメインのアイリアスとして登録することになります。
エイリアス設定した独自ドメインアドレスに対して送信されたメールをデフォルトドメインのメールボックスでも受信することが可能です。
またM365には「プライマリーアドレス」という設定があり、プライマリーアドレスとはM365へのログイン時に使うユーザIDであり、送信時の送信元となるアドレスのことです。
今回の設定例ではデフォルトドメイン（info@test-domain.onmicrosoft.com）のアイリアスに独自ドメイン（info@test-domain.com）を設定し、プライマリーアドレスを独自ドメイン（info@test-domain.com）にする想定です。
こうすることで、別メールサービスからM365に転送されてきたメールに送信/返信する場合でも送信元アドレスをinfo@test-domain.comの状態にすることが出来ます。


# 注意事項
 - 同一テナント内のM365 ユーザ同士のメールは既存メールサービスのメールBoxには届かない
 
 理由：同一テナント内ユーザでのメールの送受信はExchange内で完結し、外部に出ないため、Mxレコードの影響を受けない（MXレコード先のサーバへ配信されない）

 - MxレコードはM365（Exchange）に向けない
 

 理由：MxレコードをM365側へ向けるとメールの配信先が変わり、既存メールサーバでメールを受信しなくなってしまうため

# おわりに
メール関連はDNSレコードやらExchangeの仕様やらが複雑に関係しているのでややこしいです。
一度調べて実際に設定してみることが理解への一番近道かもしれないですね。

# 参考にしたWebページ
https://milestone-of-se.nesuke.com/nw-basic/grasp-nw/mail/
レンダリングブロックを考慮したリソースの読み込み（レンダリングの基本）

# はじめに

CSSやJavaScriptなどのリソースを読み込む際、記述によってはレンダリングを妨げ表示速度を低下させてしまうことがあります。
このような所謂レンダリングブロックの対策について備忘録も兼ねて残しておこうと思います。

レンダリングブロック対策の基本は**HTMLをとにかく速く出力**することです。
この前提をもとに、対策となる記述方法についてまとめます。


# レンダリングの基本

ブラウザにおけるレンダリングのプロセスは大まかに以下のようになります。

![render01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118613/efb62dca-516b-3ba6-f778-018d64d048ef.png)

1. HTMLをパース。
    - DOMツリーを構築する。
    - CSSのマークアップからCSSOM（DOMのCSS版のようなもの）を構築する。
    - JavaScriptを実行する。
2. DOMとCSSOMを組み合わせてレンダリングツリーを構成する。
3. 各ノードのビューポート内での正確な位置とサイズをレイアウトする。
4. 各ノードを画面に描画する。

ページにアクセスしてからデータを読み込んで描画するまでの処理手順を**クリティカルレンダリングパス**といいます。このフローを最適化することがレンダリングブロックへの対策となり、リソースの読み込み方ひとつで最適化できます。

では具体的にどういった記述をすれば良いのか、CSSとJavaScriptに分けてとまとめたいと思います。

## 記事の続き

- [レンダリングブロックを考慮したリソースの読み込み（CSS編）](https://qiita.com/mt877/items/a0bb42f6823cfed78395)
- [レンダリングブロックを考慮したリソースの読み込み（JavaScript編）](https://qiita.com/mt877/items/bc8dfbb8888216bc37e4)


# 参考URL

- ブラウザの仕組み: 最新ウェブブラウザの内部構造
  https://www.html5rocks.com/ja/tutorials/internals/howbrowserswork/#The_main_flow

- レンダリング ツリーの構築、レイアウト、ペイント
  https://developers.google.com/web/fundamentals/performance/critical-rendering-path/render-tree-construction

- クリティカル レンダリング パスのパフォーマンスを分析する
  https://developers.google.com/web/fundamentals/performance/critical-rendering-path/analyzing-crp?hl=ja
Rails6でカスタムフォントを使用する方法

## はじめに
Rails5では簡単にカスタムフォントを追加できたのですが、Rails6で追加するのに手こずりましたので、私が実際に試した方法を簡単にご紹介します。

## 環境
Ruby   3.0.1
Rails  6.1.3.1

## ① カスタムフォントの配置
まずカスタムフォントを [GoogleFonts](https://fonts.google.com/) などから使用する素材をダウンロードし `/app/assets/fonts` 内にカスタムフォントファイルを配置します。

※ `/app/assets/fonts`フォルダがない場合は、`/app/assets/`内に`fonts`フォルダを作成してください。
![スクリーンショット 2021-05-04 21.55.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613022/619e052c-ca22-bb56-aa1a-61ec46e79a08.png)

## ② application.css の編集
`application.css`にカスタムフォントの情報を記述していきます。

```css:application.css
/*
 * This is a manifest file that'll be compiled into application.css, which will include all the files
 * listed below.
 *
 * Any CSS and SCSS file within this directory, lib/assets/stylesheets, or any plugin's
 * vendor/assets/stylesheets directory can be referenced here using a relative path.
 *
 * You're free to add application-wide styles to this file and they'll appear at the bottom of the
 * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
 * files in this directory. Styles in this file should be added after the last require_* statement.
 * It is generally better to create a new file per style scope.
 *
 *= require_tree .
 *= require_self
 */

@font-face {
    font-family: "NotoSansJP";
    font-style: normal;
    src: asset_url('NotoSansJP-Regular.otf') ;
}
```

`.css` のままだと Rails がカスタムフォントを認識してくれないので、`.scss`に拡張子を変更します。
![スクリーンショット 2021-05-04 22.15.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613022/04b6e296-a465-5003-f43a-6374c30d442a.png)

* Rails6からは、`/app/assets/stylesheets` 内の `application`ファイルの拡張子が `.css`で生成されるようになったようです。

## ③ assets:precompile の実行
コマンドで、`rails assets:precompile` を実行し変更を反映させます。

```
rails assets:precompile
```

無事反映ができていれば、コマンドの結果にコンパイルされたカスタムフォントのファイル名が表示されます。

## 最後に
カスタムフォントの反映ができず、インターネットで調べましたが、Rails6の情報が少なく解決しませんでした。
カスタムフォントがコンパイルされなかったので、ファイルを調べていると、`application`ファイルの拡張子が `.css`なのに気づき`.scss`に変更したところ上手く反映できました。
この事象に悩まされていた方のお役に立てれば幸いです。
以上、Rails6でカスタムフォントを使用する方法のご紹介でした。
Shopify テーマ開発で便利な自動リロード設定

Shopifyのオリジナルテーマを開発中に、コードを書き換える度にブラウザ画面をリロードしていた。ずっと面倒だと思っていたが、今回[Shopifyテーマのライブリロード](https://www.shopify.com/partners/blog/live-reload-shopify-sass?shpxid=18fa63ce-BDEE-4DC6-1840-378DBE5BFBCF)という記事を見つけて設定してみた！
実際つかってみるとあまりにも便利すぎたが、記事とアプリのバージョンが違っていて戸惑ったので、改めて記事を書いてみることにしました。

ファイルのコードの変更を監視し、自動でリロードしてくれるPrepros。
こちらの設定の手順の流れ

- Proprosのダウンロード
- プロジェクトファイルの導入
- Liquidを監視対象に設定
- リロードサイトの設定
- リロードまでの時間を設定
- Theme Kitを起動
- ブラウザを開く

今回の説明では、Theme KitとThemeコードはダウンロード済みと言う設定で話を進めます。
わからない方は下記を参考に記事を参考に設定してください。

- [ローカルでShopifyテーマの開発環境をセットアップする3ステップ](https://www.shopify.jp/blog/partner-local-shopify-theme-setup-three-steps)


## まずはPreprosのダウンロード
Preprosのダウンロードは[こちら](https://prepros.io/)から行える。ダウンロード自体は簡単で、通常のアプリのダウンロード手順とさほど変わらない。
ページ中央のDownload Free Unlimited Trial をクリックしダウンロードする。

<img width="700" alt="ダウンロード画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1076779/5a860035-17bd-77b9-2184-5af0da52dbdd.jpeg">


## プロジェクトファイルの導入
アプリを開く。アプリを開くと初めはこの画面になる。この画面に、テーマの入ったフォルダーをドラッグ＆ドロップで投入する。
<img width="700" alt="ダウンロード画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1076779/93f7557d-2175-d4c8-0aae-ccc64a2c53cf.png">

## 監視対象のファイルにLiquidを設定する。
フォルダーを投入した状態では、Liquidは監視の対象になっていないので、適当なリキッドファイルを選択し、右クリック→メニューの中からWathc .liquid Files を選択する。
すると斜線のついた目のマークがファイルアイコンになり、監視対象のファイルに設定できる。
<img width="700" alt="ダウンロード画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1076779/7ed0f938-7b95-7b9c-c1ea-36afd8c91588.jpeg">

## リロードサイトの設定
リロード表示したいサイトのURLを設定する。
設定箇所は、
①右上のサーバーマーク（右上の黄色アイコンUNREGISTEREDの下にある３つのアイコンの一番左)をクリック
②メニューの２番目にあるExternal Serber→Use External Serverにチェック
③External Server Urlに対象のサイトのURLを記入する。
<img width="700" alt="ダウンロード画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1076779/9e713c5c-cd74-20ab-bff6-bd0c74260f06.png">


## リロード時間の設定
ファイルのコードの変更を感知してから、ブラウザをリロードするまでの時間を設定する。
こちらを設定しないと、Theme Kitによりファイルをサーバーにアップする前にブラウザをリロードすることになるので、変更箇所が反映されていない状態でリロードされてしまう。
CSSでのコーディングであれば1500、Sassのコンパイル機能を使う場合は2000ぐらいがお勧め。
設定方法は、
①先ほどのサーバーアイコンの隣のアイコン（右上の黄色アイコンUNREGISTEREDの下にある３つのアイコンの真ん中)をクリック
②メニューの一番上にあるReload Browsers Automaticallyにチェック
③右側の>をクリックしReload Delayに値を入力
<img width="700" alt="ダウンロード画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1076779/42180dd7-817e-a901-510c-ae60164af006.png">

## Theme Kitを起動
ターミナルからtheme watchでTheme Kitを起動し、ファイルのコード変更を感知しサーバーへ自動でアップしてくれる状態にする。
ショップのテーマに設定されているテーマは theme watch --allow-liveでスタートする。

## ブラウザを開く
リロードさせたいサイトをProprosから開く。直接、ブラウザからサイトを開いてもリロードはしてくれないので注意！
ショートカットキー コマンド＋L か サーバーアイコンをクリックしOpen Previewをクリックする。
<img width="700" alt="ダウンロード画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1076779/ddede130-dd7d-29dc-0a79-921e4f760b7a.png">

## まとめ
今までコードを書き直す度に、マウスを握りブラウザをクリックしリロードさせていたが、かなりの時間短縮になった。
Propros自体もGUIで操作ができ、設定も簡単で使いやすい。
そもそも、リロード機能だけではなくSassのコンパイルも同時にしてくれるので、とても便利。
Liquidを使ってShopfiyのテーマ開発をされてる方の参考になれば幸いです！
（余談。。。基本Proprosは無料で使えるが、課金しないと課金の催促がしつこいです・・・）
WSL2(Ubuntu)+VSCodeでGitHubにpushしようとすると、「Permission denied (publickey)」が出る

# 環境

- Windows10
- Ubuntu20.04.2 (WSL2)
- git ver2.25.1

# 前提

- コマンドではエラーはでない
- VSCodeのGUIで操作するとエラーが出る
- SSHの設定はUbuntuの方(/home/[user名]/.ssh)ではしている

# 原因

(たぶん) Windowsの方でSSHの設定していない

# 解決方法

Windowsの`C:\\ユーザー\[ユーザー名]\.ssh`の方でもSSHの設定をする。

※ubuntuの場合は、`cd /mnt/c/users/[ユーザー名]/.ssh`で該当場所に移動できる。

SSHの設定方法はこちらの記事を参考に
https://qiita.com/shizuma/items/2b2f873a0034839e47ce


# まとめ
UbuntuのファイルをGitHubで管理しようとしていたので、Ubuntuの方だけSSHの設定をしていたが、VSCodeのGUIで使う場合は、Windowsの方にもSSHの設定をしないといけない。
MySQL SQLの結果に記載されている日本語が"?"で表示される

# 目的

- SQLを実行した結果表示されるデータの日本語が`?`で表示されてしまう問題を解決する方法をメモ的に残す

# 方法

1. 下記コマンドを実行してMySQLの設定ファイルのバックアップを取っておく。

    ```terminal
    $ cp /etc/mysql/conf.d/mysql.cnf /etc/mysql/conf.d/mysql_org.cnf
    ```

1. 下記コマンドを実行してMySQLの設定ファイルに追記できる状態にする。

    ```terminal
    $ sudo cat << EOF > /etc/mysql/conf.d/mysql.cnf
    ```

1. 下記の内容を一行一行入力してEnterを押下する。

    ```
    [mysql]
    [mysqld]
    character-set-server=utf8
    [client]
    default-character-set=utf8
    ```

1. 最後の行を入力し終わったら「ctrl」 + 「d」を押下して保存する。
1. MySQLを再起動する。
【初心者でも簡単】CSSで再生ボタンを作る

# どうも7noteです。動画が流行っているので再生ボタンを作ってみました。

動画の再生ボタンを独自で作成したい時用に、**「再生ボタン」を作ってみました。**

![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/ea3d64e3-9681-7a51-08eb-5fc9f42b8a82.png)


クリックで再生停止も操作できるようにクリックしたら一時停止の見た目に変わるようにします。

![sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/5dd21fc5-da20-1a90-2fb1-b052e81b734c.gif)



## ソース

```index.html
<div class="btn"></div>
```

```style.css
.btn {
  width: 100px;  /* 幅を指定 */
  height: 60px;  /* 高さを指定 */
  background: #F00; /* 背景色を赤に指定 */
  border-radius: 10px; /* 角を丸くする */
  position: relative;  /* 基準位置とする */
  cursor: pointer;     /* マウスカーソルを指（👆）の形にする */
}

.btn::after {
  content: ''; /* 疑似要素に必須 */
  width: 0;    /* 幅を0に指定 */
  height: 0;   /* 高さを0に指定 */
  border-style: solid;  /* 線の種類を指定 */
  border-width: 15px 0 15px 30px;  /* 線の幅を指定して三角を作る */
  border-color: transparent transparent transparent #fff;  /* 左のみ線の色を指定 */
  position: absolute; /* 相対位置に指定 */
  top: 50%;  /* 上から50%の位置に配置 */
  left: 50%; /* 左から50%の位置に配置 */
  transform: translate(-50%,-50%); /* 要素の半分ぶんだけ左上方向に移動。 */
}

.btn.playback::after {
  width: 15px;  /* 幅を指定 */
  height: 30px; /* 高さを指定 */
  border-width: 0 4px 0 4px; /*線を左右に指定*/
  border-color: transparent #fff transparent #fff;  /* 左右に線の色を指定 */
  transition: .5s; /* アニメーションの秒数を指定 */
}
```

```script.js
$(function () {
  $('.btn').on('click', function(){  // クリックされた時
    $(this).toggleClass('playback'); // クラスを 付与する or 外す
  });
});

```

![sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/2e3fd754-db34-d156-2104-44c09a43e246.gif)


## まとめ

背景を使わずに、▶と||だけでも十分利用できると思います。
movieタグなどで利用する場合はデフォルトの再生ボタンは非表示にしておきましょう。

【iosのデフォルト再生ボタンを非表示にする方法】
https://qiita.com/YukiYuki0508/items/651e70b50c278b16cfa1

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
【rails6】結合テストコードでBASIC認証を通す方法

こんばんは！
引き続きテストコードについて記載していきます

今日は結合テストコードです。まずはUserに関するテストコードを書いていくのですが…

## 現状
私のアプリケーションにはBASIC認証をかけていますので、何も対策しないとタイムアタックが開催されます

![1e5a05d304368f4d3c6d3ec5e247a111.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1422262/70783f35-ccf9-2d0e-9220-9246464dc5d2.gif)

手入力で間に合わせるのは至難の業です
というか、テストコードの意味がありません笑

そこで、テストコード内に ”BASIC認証を通す記述” を加えてあげれば良いのです

では記述していきましょう…

### 改善前の記述
 ```spec/system/user_spec.rb
require 'rails_helper'

RSpec.describe "Users", type: :system do
  before do
    @user = FactoryBot.build(:user)
  end

  context 'ユーザー新規登録ができるとき' do
    it '正しく情報を入力すれば新規登録ができる' do
      # トップページに移動する
      visit root_path
      # 以下省略
    end
  end
end
```

ここに設定したBASIC認証のIDとパスワードを読み込ませます。
私は上記２つを  "環境変数"  に代入してアプリケーションを作成しておりますので、環境変数を別の変数に代入し関数として別保管していきます

 ```spec/system/user_spec.rb
require 'rails_helper'

RSpec.describe "Users", type: :system do
  before do
    @user = FactoryBot.build(:user)
  end

  def basic_auth(path) # ここを追記
    name = ENV["BASIC_AUTH_USER"]
    password = ENV["BASIC_AUTH_PASSWORD"]
    visit "http://#{name}:#{password}@#{Capybara.current_session.server.host}:# {Capybara.current_session.server.port}#{path}"
  end

  context 'ユーザー新規登録ができるとき' do
    it '正しく情報を入力すれば新規登録ができる' do
      # トップページに移動する
　　　 basic_auth root_path # ここも追記
      visit root_path
      # 以下省略
    end
  end
end
```

上段の追記箇所

```
def basic_auth(path)
```

ここでは、
①自身で設定した環境変数を変数に代入する処理
②visitを使って、BASIC認証のパスにアクセスしている
上記２点を処理させています


次の追記部分

```
basic_auth root_path
```

私はroot_pathからスタートさせる結合テストを記述しているのでこうなりました。
root_pathは引数になりますので、記述漏れがあるとエラーを起こしますよ！

さて、これで無駄なタイムアタックから脱しましたので、続きの結合テストコードを書くことにします:runner_tone3:

ありがとうございました！
VisualStudoCommunityの環境構築とバージョン確認方法

#公式サイトからインストーラーをダウンロード

https://visualstudio.microsoft.com/ja/downloads/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/195660a8-ca76-198b-e522-e240e71533e3.png)

#インストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/46b0e425-1bd9-e074-5f1c-8fb22ab65d76.png)

Windowsのちょっとしたバッチを作るだけなら下記二つをチェックだけでOKかなと思います。
（未チェックの項目は後からインストールも可なのであんまり気にしなくてOK）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/8a71d570-4c57-4a0e-0cca-66c2b7520872.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/0eb094f3-d6ea-7faf-b94f-82939a9d5df4.png)

#初回起動時ログイン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/4b772907-0f9a-52ea-65f5-4a5bc3255c29.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/1dfd5467-53ae-e0f6-d2ed-6b2a395b3dcd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/4ff0f5e5-815d-f1f5-d3f4-ee2fdd3e1f13.png)

#バージョン確認方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/219f7465-62aa-5611-9902-5a1e9c4851bf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/8bfa8d78-a090-7ca7-a302-e71ce48259af.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/8d94ee5a-ee7d-94ac-00ea-9cd663fb88d0.png)

#蛇足

特に難しいことないです。

#バージョン

Windows 10 Pro バージョン 20H2 OSビルド 19042.928
Visual Studio Community 2019 Version 16.9.4
f文字列を扱えるようになろう (今日のPython Day4)

##0. はじめに
　ついに4日目になりました。これで3日坊主ではならなくなります。[『やり抜く力　GRIT』](https://www.amazon.co.jp/%E3%82%84%E3%82%8A%E6%8A%9C%E3%81%8F%E5%8A%9B-GRIT-%E3%82%B0%E3%83%AA%E3%83%83%E3%83%88-%E2%80%95%E2%80%95%E4%BA%BA%E7%94%9F%E3%81%AE%E3%81%82%E3%82%89%E3%82%86%E3%82%8B%E6%88%90%E5%8A%9F%E3%82%92%E6%B1%BA%E3%82%81%E3%82%8B%E3%80%8C%E7%A9%B6%E6%A5%B5%E3%81%AE%E8%83%BD%E5%8A%9B%E3%80%8D%E3%82%92%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%91%E3%82%8B-%E3%82%A2%E3%83%B3%E3%82%B8%E3%82%A7%E3%83%A9%E3%83%BB%E3%83%80%E3%83%83%E3%82%AF%E3%83%AF%E3%83%BC%E3%82%B9/dp/4478064806/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=grit&qid=1620133020&sr=8-1)という本にも書かれていたのですが継続することはとても大切です。一緒に頑張りましょう！

　毎日1問、Pythonの問題を出題します。出題範囲は特に定めていませんがはじめの1ヶ月くらいは『入門Python3　第2版』の第1～11章までのことが分かれば解ける問題にしたいと思います。「こういう問題を作って欲しい」などのリクエストがございましたら初心者ながら頑張って作問します。また「別解を思いついた」、「間違えを見つけた」などがありましたら遠慮なくコメント欄にて教えて下さい。記事を執筆している当人もこの記事を読んでくださった方も新たなことを学ぶことができるので。

##1. 問題
「私はダルエスサラーム出身です。」という文章を出力しましょう。ただしの「ダルエスサラーム」の部分は変数にしましょう。

##2. 解答

```python
p = "ダルエスサラーム"
print(f"私は{p}出身です。")
```

##3. 解説
　今回はf文字列というものを用いました。python3.6以降で新しく導入された機能です。すごく便利なのでここで覚えてしまいましょう。書き方はまずダブルクオーテーション(シングルクオテーション)の前にfをつけます(大文字でも可)。そして表示させる変数は中括弧で囲います。f文字列が導入される前は次のような方法を用いていました。

```python:別解1
p = "ダルエスサラーム"
print("私は" + p + "出身です。")
```

```python:別解2
p = "ダルエスサラーム"
print("私は{}出身です。".format(p))
```

　別解1は文章中の変数が1つだとまだしも変数が2つ、3つと増えると書くのが面倒くさくなります。別解2に関しては問題集でお目にかかったくらいで自分はほとんど使ってないです。

##4. おまけトーク
　ダルエスサラームはタンザニア最大の都市らしいです。「タンザニアってどこだよ」という方、タンザニアはアフリカの国です。本当におまけでしたね。
ターミナルでのプルリクエスト

#ターミナルでのプルリクエストについて

GitHub Desktopではプルリクエストは作成したことはあるが、ターミナルでは操作したことがなかったので、自己学習の過程で学ぶことができたのでまとめてみました。

**手順**

1. git clone でプルリクエストしたいファイルを取ってくる
2. ターミナルのcdコマンドで操作したいファイルのディレクトリまで移動する
3. git branch -a でブランチを確認する
4. git checkout -b ブランチ名(" "はいらない)
5. git add . でインデックスに追加する
6. git commit -m "addに名前をつける"
7. git push -u origin 4でつけた名前を入れる

#感想

プルリクエストをするときもリポジトリを作成するのと同様にadd, commit, pushは変わらないが、初めにgit branchコマンドや、git checkoutコマンドが入ってくる。
実際にやってみるまでは少し複雑そうなイメージであったが、やってみるとそこまで難しくはなかった。
Laravelでstylusを使う方法

# LarvelでStylusを使う方法

LaravelでStylusを使う方法を紹介します。
最近では、フロントエンドはフロントのフレームワーク
バックエンドではLaravelを使うケースが増えてきているので
あまり使う機会がないかもしれませんが、自分が忘れないためにも記載しておきます。

## 環境

- npm 6.14.7
- PHP 7.3.24
- Laravel Framework 8.40.0

## 使い方

### webpack

まずは、```webpack.mix.js```に下記を追記します。

```
mix.js('resources/js/app.js', 'public/js')
    .stylus('resources/stylus/app.styl', 'public/css'); // この行追記
```

第１引数はデバックを行うファイルのパスを記載
laravelでは```resources```htmlやcssを記載してくことが多いです。

```
'resources/stylus/app.styl'
```

第２引数にはコンパイル後のファイルの保存先を指定します。
laravelでは、public配下がホームディレクトリとなるので、吐き出し先はpublicのままで問題ないかと思います。

```
'public/css' // コンパイル後の書き出し先のディレクトリ
```

### npmのインストール

※npmがインストールされいない場合はnpmのインストールを事前に行ってください。

```
npm i // npmのインストール
```

npmのインストールを行います。
npmのインストールが終わると```package.json```が作成されます。

```
npm run dev
```

上記を実行すると、コンパイルされます。
今回は、``` /public/css/app.css```のファイルが作成されていればOKです。

### watchを使って自動コンパイル

上記でnpmを実行したあと、下記コマンドを実行します。

```
npm run watch
```

該当のstylusファイルに変更があったとき、自動でコンパイルされるようになります。
便利なのでセットで覚えておくと効率的に作業ができると思います。
[日記]RailsアプリをEC2を使ってAWSにデプロイするまで

##はじめに
自作のRailsアプリをAWSにデプロイしその経過を備忘録としてQiitaに投稿してきました。
その投稿をチャプター形式で下記にまとめておきます。
自分用ですので画像でわかりやすく解説するなどはしていません。

##環境
Ruby 2.6.6
Rails 6.0.3
nginx 1.12.2
PostgreSQL 11.5
node 12.22.1
yarn 1.22.5
rbenv 1.1.2


##日記
[[Chapter-1]VPCの設定](https://qiita.com/Jackson123/items/c7b0a7a6ae659fe48a3b)
[[Chapter-2]EC2の設定](https://qiita.com/Jackson123/items/53cc698b1b7cfdbfe368)
[[Chapter-3]EC2のサーバー環境構築](https://qiita.com/Jackson123/items/821d89184d87b6020df5)
[[Chapter-4]EC2にRailsアプリの配置](https://qiita.com/Jackson123/items/e91eec2f76774717bdee)
[[Chapter-5]ロードバランサー(ELB)の作成](https://qiita.com/Jackson123/items/a739525d0084747405d7)
[[Chapter-6]ACM(AWS Certificate Manager)でSSL証明書を取得](https://qiita.com/Jackson123/items/eb586c33fe3c5b7d9dad)
[[Chapter-7]Route53の設定](https://qiita.com/Jackson123/items/6b41ebde0eec072a283e)
[[Chapter-8]https化に向けたロードバランサーの設定](https://qiita.com/Jackson123/items/d6819d3dbf304aebd459)
[[Chapter-9]https化によるRoute53の設定](https://qiita.com/Jackson123/items/9ceae188a53f646e55e9)
[[Chapter-10]https化によるNginxの設定](https://qiita.com/Jackson123/items/255263a260f7a833bf1d)

##参考

https://qiita.com/naoki_mochizuki/items/f795fe3e661a3349a7ce

https://qiita.com/Yuki_Nagaoka/items/975b7598806d6ae0c0b2
AWSのIAMの概要について

#IAMとは
IAMとはAWSの**権限管理のサービス**のことです。
セキュリティーにも関連しているため、AWSを触る上でとても大切なサービスです。
簡単に言うとユーザーアカウントを複数作ったり、作成したアカウントにAWSの内容を編集するための権限を付与するものです。
AWS自体が実務ではルートユーザー（フル権限のアカウント）を使うことを推奨しておらず、IAMでアカウント作成して実務で編集をすることを推奨しています。

##ユーザーについて
AWSを触る際に、管理画面にアクセスしたり、プログラム側からアクセスするときに必ずIDやパスワードなどのユーザー情報が必要になります。
その際にユーザーにはそれぞれ「ルートユーザー」と「IAMユーザー」の2種類が存在します。
上記にも記載しましたが、ルートユーザーを使うことは基本的に推奨していません。
なぜならルートユーザーはAWSを編集する上で、全ての権限を持っているからです。
つまり、設定の変更、各ユーザーの権限の変更、料金の閲覧、パスワードの変更など、ルートユーザーでログインすると何でもできてしまいます。
特に企業などで複数人で作業を行うときは、それぞれIAMユーザーで個別にアカウントを付与して、そのアカウントで作業を行うことがセキュリティー的にも望ましいとされます。
また、ルートユーザー自体は権限の調整ができません。

###ルートユーザーとIAMユーザーについて
IAMユーザーはルートユーザーの下に、それぞれ個別に複数作成することができます。
そして、個々にAWSで何ができるかなどの権限を付与できます。
業務での開発や運用はIAMユーザーで行うのが基本です。
![img01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367456/59174e18-c582-aac6-e228-7947aa14054b.png)

##アクセスキー（認証情報）について
アカウントを作成するときにアクセスの種類を選択することができます。
AWSの管理画面へのパスワードでのアクセスと、プログラムからアクセスキーを使ったアクセスです。

プログラムによるアクセスを可能にすると、**アクセスキーID**と**シークレットアクセスキー**が発行されます。

このアクセスキーIDとシークレットアクセスキーがあれば、AWSにどこからでもアクセスできるようになります。

![img02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367456/546b8aa4-954a-e07f-8911-d8d252c3c1b8.png)
上記の図の説明ですが、
ルートユーザーから「Test」というアカウントでIAMユーザーを作成してもらいます。
「Test」にはEC2を作成できる権限を付与してます。
そして、「Test」に管理画面にログインするための**パスワード**と、プログラムからアクセスするための**アクセスキー**を発行します。

##IAMグループ
IAMグループとは、IAM ユーザーの集合です。 
IAMグループを使用すると、複数のユーザーに対してアクセス許可を指定でき、それらのユーザーのアクセス許可を容易に管理することができます。 

##IAMポリシー
JSON形式で記述された設定ファイルのことで、AWSで操作できる権限を設定しています。
「誰が」「どのAWSサービスの」「どのリソースに対して」「どんな操作を」「許可する(許可しない)」などを設定しています。
**IAMアイデンティティ (ユーザー、ユーザーのグループ、ロール)**または**AWSリソース**にアタッチして使用します。
IAMアイデンティティとAWSリソースについては後ほど記載します。

IAMポリシーの例)

```json:IAMポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:Get*",
"s3:List*"
],
"Resource": "*"
}
]
}
```
上記の例のIAMポリシーで説明します。

まず「Version」は使うポリシーのバージョンを記載します。
そして、重要なのは「Statement」の中身です。ここに権限の内容を記載します。

**Effect**
「Effect」には許可するか、許可しないかを記載します。
Allowは許可する。Denyは許可しない。

**Action**
「Action」には操作の内容を記載します。
「s3:Get」はS3から何かを取得するということです。後ろにある「*」は全てという意味なので、下記ではS3から全てのものを取得することができるということです。
「s3:List」はS3から何かを参照するということです。ここではS3の全てを参照することができるということです。

**Resource**
「Resource」にはIAM「Action」が影響するリソースの範囲を指定することができます。「*」を入れると、全てのリソースが影響範囲に含まれます。

こういったポリシーを自分で書くこともできますが、よく使いそうなポリシーに関してはAWSがもともと用意してくれているので、それを認証の対象にアタッチするだけで簡単に使えます。

IAMポリシーに関してはもっと奥が深いため、全てを説明すると長くなるため、別の記事で改めてまとめようと思います。
一旦はざっくりと、権限についてJSON形式で書かれた設定ファイルとだけ覚えておけば大丈夫です。
ちなみに自分が勉強するときに見たサイトはこちらです。かなりわかりやすかったのでこちらを見ていただいてもいいかと思います。
[https://dev.classmethod.jp/articles/aws-iam-policy/](https://dev.classmethod.jp/articles/aws-iam-policy/)

##IAMロール
IAMロールとは、AWSのリソース（EC2など）に付与するものであり、複数のIAMポリシーをグルーピングして一つにまとめたものです。
IAMポリシーはユーザーにアタッチするものですが、IAMロールはユーザーではなくリソースにアタッチします。
C++でC#のプロパティみたいなアクセサを作りたい

## ターゲット

Getter, Setterを書くのはダサい。
C#のプロパティみたいに変数名をそのまま使いたい。
宣言したクラスだけが書き込めるpublicメンバ変数を作りたい。
という人向けの内容です。


## クラス

```C++:accesser.hpp
#pragma once

template <class Friend, class T>
class Accessor
{
	friend Friend; // フレンドクラス
	T m_var;       // Tの実体

public:
	Accessor() noexcept = default;
	Accessor(T var) { m_var = var; }
	~Accessor() noexcept = default;

public:
	// 読み取りのための演算子をオーバーロードして公開
	// 型変換演算子
	operator T() const noexcept { return m_var; }
	// アロー演算子
	T* operator ->() const noexcept { return &m_var; }
	// 間接参照演算子
	T& operator *() const noexcept { return m_var; }

private:
	// 書き込みのための演算子をオーバーロードして制限
	// 単純代入演算子
	T& operator =(const T& var) & { return m_var = var; }
	T& operator =(T&& var) & noexcept { return m_var = var; }
	// 複合代入演算子
	T& operator +=	(const T& var) { return m_var +=  var; }
	T& operator -=	(const T& var) { return m_var -=  var; }
	T& operator *=	(const T& var) { return m_var *=  var; }
	T& operator /=	(const T& var) { return m_var /=  var; }
	T& operator %=	(const T& var) { return m_var %=  var; }
	T& operator <<=	(const T& var) { return m_var <<= var; }
	T& operator >>=	(const T& var) { return m_var >>= var; }
	T& operator &=	(const T& var) { return m_var &=  var; }
	T& operator |=	(const T& var) { return m_var |=  var; }
	T& operator ^=	(const T& var) { return m_var ^=  var; }
	// 後置インクリメント / デクリメント
	T operator ++(int) { return m_var++; }
	T operator --(int) { return m_var--; }
	// 前置インクリメント / デクリメント
	T& operator ++() { return ++m_var; }
	T& operator --() { return --m_var; }
};
```


## 実用例

```C++:hoge.hpp
#pragma once
#include "accessor.hpp"

class Hoge
{
public:
	// Accessor<フレンドクラス名, 変数の型名> メンバ変数名{初期値};
	Accessor<Hoge, int> Number;
	Accessor<Hoge, bool> Boolean{false};

	Hoge() { Number = 100; } // フレンドクラス内からの書き込み可
	~Hoge() {}
};
```
```C++:main.cpp
#include <cstdio>
#include "hoge.hpp"

int main(void)
{
	Hoge hoge;

	// hoge.Number = 0; // エラー、フレンドクラス外からの書き込み不可
	printf("%d", hoge.Number); // フレンドクラス外からの読み込み可
	getchar();

	return 0;
}
```

## 改造案

- 書き込み制限系をすべて内部的なSetter経由にすることで、よりデバッグしやすくする

## 参考
- [【PG日記】C++でC#ライクなプロパティを実現する [2018/07/28]](https://takap-tech.com/entry/2018/07/28/215502)
- [【MaryCore】C++でプロパティを実現するもっとも簡単な方法 [2017/02/20]](https://marycore.jp/prog/cpp/simple-property/)
- [【Qiita】C++演算子オーバーロード大全 [2018/01/29]](https://qiita.com/rinse_/items/9d87d5cb0dc1e89d005e)
- [【Microsoft Docs】C++/CLI でプロパティを使用する [2017/07/21]](https://docs.microsoft.com/ja-jp/cpp/dotnet/how-to-use-properties-in-cpp-cli)
- [【Microsoft Docs】property (C++) [2016/11/04]](https://docs.microsoft.com/ja-jp/cpp/cpp/property-cpp)
ファイル名が部分一致しているcsvファイルを結合する

知人が実験データを結合させる際に苦労していたため、ネットに落ちている情報を頼りに作成した。

#csvファイルのファイル名
以下のように`test`ディレクトリに`数字3桁_数字2桁.csv`というファイル名で格納されていることを条件に作成した。

```:./test
123_01.csv
123_02.csv
123_03.csv
124_01.csv
124_02.csv
125_01.csv
```

#ソースコード

```py:Marge_csv.py
import pandas as pd
import glob
import copy

# パスで指定したファイルの一覧を名前順にリスト形式で取得
csv_files = sorted(glob.glob('test/*.csv'))

for i in csv_files:#対象のファイルを一覧で表示
	print(i)

csv_files_copy = copy.deepcopy(csv_files)#csv_files_copyにcsv_filesをコピー

while len(csv_files_copy):#csv_files_copyが空になるまでループ
	data_list = []#csvファイルの中身を追加していくリストを用意
	data_list.append(pd.read_csv(csv_files_copy[0]))
	parent_file = []
	parent_file = csv_files_copy.pop(0)#csv_files_copyの先頭を削除しつつ親ファイルリストに格納 

	for file in csv_files_copy:
		child_file = []
		child_file = file#親ファイルと比較するファイルの名前を子ファイルリストに格納
		if parent_file[-6:] == child_file[-6:]:#二つのファイルの"下二桁.csv"が同じ
			data_list.append(pd.read_csv(file))#data_listに追加
			csv_files_copy.remove(file)#csv_files_copyから削除

	#リストを全て行方向に結合
	#axis=0:行方向に結合, sort
	df = pd.concat(data_list, axis=0, sort=True)
	output = "test/total" + parent_file[-6:]
	df.to_csv(output,index=False)#fファイル名"taotal下二桁.csv"で出力する
```

#終わりに
空いている時間で雑に書いたため問題を指摘されたときにその都度修正します。
【個人開発】豆腐メンタルのエンジニアが豆腐メンタルの人に向けたWebサービスを作ってみた

## はじめに
今回は前から念願だった個人でWebサービスを開発/リリースすることが出来たので、Webサービスの環境周りや開発過程について記事にしていきたいと思います。

https://enjoyhsp.com/

開発の経緯に興味がある人は↓

https://note.com/shin_0909/n/nf8d6f0a9b4ad

## Webサービスの環境/技術について
### バックエンド
* 言語：Java
* フレームワーク：Spring Boot
* ビルドツール：Gradle

### フロントエンド
* 開発言語：JavaScript
* ライブラリ、フレームワーク：jQuery、Bootstrap

### AWSサービス
* EC2
* S3(ユーザアイコンの画像格納用)
* RDS(PostgreSQL)
* Route 53(DNS)
* Certificate Manager(HTTPS通信にするための証明書作成)

「Route 53」で月50円くらいかかりますが、他のAWSのサービスは最初の1年間は無料枠があるので、相当アクセスが無い限り、気にしなくて良いです。(気になるくらいアクセス欲しいですが、、、)

## 機能
主な機能としては以下の通りとなります。

* 日々の生活で困ったことを質問が出来ます。
* 質問に対してコメントが出来ます。
* 質問を並び替えたり、カテゴリ、フリーワードで検索できます。
* 質問に対してのコメントに制限(禁止ワード設定)が出来ます。
* 生活に役に立つ心理学が知れます。

##作業時間
機能の洗い出し、画面設計、AWSのお勉強、環境構築、開発などを1日に2～3時間、ほぼ毎日やって、1ヶ月くらいで公開までこぎつけたので、トータル70時間ですかね。
公開後も改良はしていたので実際はもっと掛かっておりますが。

## 苦労したところ
やはり画面デザインは苦労しました。
いろいろな他のサイトを参考に画面設計していたのですが、如何せん一人で作っているので、どんどん視野が狭くなって、ユーザにとって何が使いやすいデザインかよく分からなくなっていました。
ただその中でもなるべく、シンプルにパッと見て情報が分かるように心がけて作りました。
その他には、レスポンシブデザインのところでスマホの実機で確認したらレイアウトが崩れていたり、余白が無駄に目立ったりして、微調整を繰り返していました。
バックエンドやAWSで分からない(特にAWS)時はその都度調べ、開発していきました。
問題に深くハマることは特に無かったです。
良質な記事を書いて下さる方々に感謝ですm(__)m
　
あとはモチベーションをいかに維持するかでした。
設計当初はワクワクした気持ちでいましたが、「ニーズがあるのだろうか」や「やることいっぱいあるな」などと考えていくうちにモチベーションが下がってきました。
これではいかんと思い、これは仕事では無いから完璧で無くて良い、誰からも使ってもらえず自己満で終わっても、それはそれで何が良くなかったのかを考え、今後に生かせば無駄にはならないと自分に言い聞かせました。
サービスを作るときに一番おもしろいのはそのサービスが目に見えて、出来上がっていくところだと思います。
なので、設計は大事ですが、コードを書いたり、AWSをいじって環境を整えるなど、少しづつ出来上がっていることを感じながら作っていきました。

## まとめ
この記事を書こうとした当初は技術的なところを深堀していこうかと思ったのですが、ググればすぐ出てくるので、わざわざ私が書くまでも無いかなと思いました。
折角つくったので一人でも使っていただければ幸いですし、何かコメントがあれば答えていこうと思っています。
あと、アイディアを考えるのは大変ですが、Webサービスを公開すること自体は結構、手軽に出来るので、皆さんも是非やってみてください！！
皆様の貴重なお時間をありがとうございましたm(__)m

https://enjoyhsp.com/