OmniAICreator/Qiita-1.07M huggingface dataset:
AWS CLI version 2のインストールから、認証情報を設定するまでのメモ

久々に業務でAWSを触る事になったのだが、
連携されたプロジェクトをIntellijで開き、Configurationの設定をすると、
`Error: Select AWS credentials in 'AWS Connection'`が表示されて動かせない…。
認証情報の設定をしようと思ったが、そもそもAWS CLIがインストールされていない…。

```shell
$ aws configure
-bash: aws: command not found
```

そういやAWSに関しては、画面からしか構築したことないし、AWS CLIの設定とかした事がないな…🤔
メモ代わりに手順を記載。

## 環境

* mac OS Mojave 10.14.6 (18G3020)

## 前提

[Homebrew](https://brew.sh/index_ja.html)がインストールされていること。

## 手順

### AWS CLIのインストール

HomebrewからAWS CLI version 2をインストール。

```
$ brew info awscli
awscli: stable 2.0.8 (bottled), HEAD
Official Amazon AWS command-line interface
https://aws.amazon.com/cli/
Not installed
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/awscli.rb
==> Dependencies
Required: python@3.8 ✔
==> Options
--HEAD
	Install HEAD version
==> Caveats
The "examples" directory has been installed to:
  /usr/local/share/awscli/examples
==> Analytics
install: 101,465 (30 days), 269,499 (90 days), 872,196 (365 days)
install-on-request: 97,827 (30 days), 259,901 (90 days), 834,987 (365 days)
build-error: 0 (30 days)
```

インストール実行。

```shell
$ brew install awscli
Updating Homebrew...
==> Auto-updated Homebrew!

〜 省略 〜

==> Summary
🍺  /usr/local/Cellar/awscli/2.0.9: 10,892 files, 78.2MB
```

バージョン確認。

```shell
$ aws --version
aws-cli/2.0.9 Python/3.8.2 Darwin/18.7.0 botocore/2.0.0dev13
```

### 認証情報の設定

インストールされた時点では、まだ認証情報ファイルは作成されてない様子。

```shell
$ test -f ~/.aws/credentials; echo $?
1
```

認証情報の設定。
リージョンは東京で、出力はjsonとかで良いのかな？

```shell
$ aws configure
AWS Access Key ID [None]: ひみつ
AWS Secret Access Key [None]: ひみつだよ
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

接続確認。

```
$  aws s3 ls | wc -l
       2
```

## メモ

* AWS CLI version 1と2に関して、Pythonのインストールに依存しているか否かくらいの違いしか分かってない…。

## 参考

* https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html
html 基礎・基本のタグ　＃１

#html 基礎・基本のタグ

htmlの学習メモとして今回からここに、勉強したことの一部をメモ書きしていこうと思います。
なるべく誰が見てもわかりやすいように書きますが、初心者の方が見ると「なんでそうなる？」と疑問になるとこが出るかもしれません。
そこは、質問等投げてくれれば回答しますので一緒に学んでいきましょう。

htmlを勉強するのは、webフロント技術を学ぶ上で最初に触れておきたい言語だからです
html:Hyper Text Markup Language

##ここからはタグについての説明です。（一部説明不足があるかもです）

---

- `<!DOCTYPE html>` htmlのバージョンを明示するのに使う
- `<html></html>` htmlの基点となるタグ
- `<head></head>` html全体に影響する情報を含むタグ
- `<body></body>` htmlのコンテンツ本体を表すタグ

---
- `<meta charset="utf-8">`
    - **meta** サイトの情報を扱うのに利用する
    - **charset** 文字コードの記述に利用する
- `<script src=" "></script>`
    - **scrip**tタグは、htmlに適用するscriptを選択するのに使用する。
    - bodyやheadのどこにでも自由に配置できる
- `<link rel="stylesheet" href=" ">`
    - **link**タグは、外部リソースとhtmlを関連付けるのに使用する

---
- `<div></div>` （ブロックレベル要素）親要素の領域全体を占有するエリアを形成する。また、要素の後ろに改行が入る。
- `<span></span>` （インライン要素）要素と紐づけられたエリアのみを形成する。(文字列など)　改行は入らない。
- `<h1></h1>` 見出しを作るのに使用する。見出しは、h1からh6まである。数字が大きくなるごとにサイズも小さくなる。
- `<p></p>` 段落を作るのに利用する。
- `<br>` 文章を改行するのに利用する。
- `<ul> <li> </li> </ul>` Unordered List 順不同のリストを作成する
- `<ol> <li> /<li> <ol>` Ordered List 順序付きのリストを作成する

---
- `<img src="image.png" alt="">`
    - **src**は画像のアドレスを設定
    - **alt**は画像が読み込まれなかったときに表示する画像の説明文を設定する 
- `<a href="url" target=" " rel=" "></a>`
   - `<a>`はリンクを付けるのに使用する
   - **href** リンク先またはurlを設定する
   - **target** リンク先を表示するタブを指定する。
      - _blank 新規でウィンドウを開く
      - _self 自分自身のウィンドウに表示
      - ほかにもいくつかあります
   - **rel** リンク先とのページの関係を決めるのに利用する
      - 中身については下のリンクを参照
      - https://reference.hyper-text.org/html5/attribute/rel/
- `<table> <tbody> </tbody> </table>` 内容をひとまとまりに表すのに利用する。
   - `<tr></tr>` 行を作成するのに使用
   - `<td></td>` trタグの中にtdタグをいれて　列を作るのに利用する

---
- `<form method=" " action=" "></form>` フォームを作成
   - **method** httpメソッドを選択する　postとget
   - **action** formで送信したデータを処理するプログラムがあるところを設定する 
- `<input type="text" name=" ">` formタグ内で使用。入力場所を作成
   - **type** 入力する型を選択　デフォはtext
- `<textarea name=" "></textarea>` formタグ内で使用。複数行入力可能。
- `<button type="submit"> </button> formタグ内で使用。ボタン作成

---

まだまだ、たくさんタグはあると思いますが基礎・基本というところで
最初はこのくらいを学習しました。
PostgreSQLで作成したtableの一意に識別する値を取り出す

#結論
```
select relname,oid from pg_class 
where relname not like 'pg_%'
and relname not like 'sql_%' 
and relkind='r';
```

#経緯
javaの掲示板を作成中、作成したtableの作成日時を取得したかった。
が、簡単には取得できそうになかったから、別の方法を模索。
結果、pg_classという、
DB内のテーブルやインデックスのメタ情報を管理するテーブルを使うことにした。
これにより、各テーブル固有の値を取得できた。

参考サイト
https://www.postgresql.jp/document/9.4/html/catalog-pg-class.html


#詳細
・relname：テーブルとかの名前
・oid：テーブル固有の値。重複しない。
・relkind:テーブルはr,インデックスはi、シーケンスはs、みたいな感じで識別。

これらを使い、自分が作成したテーブル固有の値とその名前だけを抽出することに成功した。
webpushをやってみた

## やりたいこと
webpushを使い通知を出したい。（rssの代わり）

## やること
JavaScript Firebase Cloud Messagingを使い静的サイトに通知する仕組みを埋め込む


## やったこと
### JavaScript Firebase Cloud Messagingを使い静的サイトに通知する仕組みを埋め込む

公式ページの動画を見ながら埋め込み
https://firebase.google.com/docs/cloud-messaging/js/client?hl=ja
いろんな記事見たりしてやったがエラー出たりでこの動画が一番わかりやすかった。

```html:index.html
<script src="https://www.gstatic.com/firebasejs/7.14.1/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/7.14.1/firebase-messaging.js"></script>
<script>
  // Your web app's Firebase configuration
  var firebaseConfig = {
  // 省略
  };
  // Initialize Firebase
  firebase.initializeApp(firebaseConfig);
</script>
<script>
  const messaging = firebase.messaging();
  console.log(messaging.requestPermission());
  messaging.usePublicVapidKey("省略");
  messaging.requestPermission()
    .then(function(){
      console.log('have');
      return messaging.getToken();
    })
    .then(function(token){
      console.log(token);
    })
    .catch(function(err){
      console.log('error');
    });
</script>
```
ちょっと変えた部分は
`<script src="https://www.gstatic.com/firebasejs/7.14.1/firebase-messaging.js"></script>`を入れないとmessaging()が動きません。

```javascript:firebase-messaging-sw.js

importScripts("https://www.gstatic.com/firebasejs/7.14.1/firebase-app.js");
importScripts("https://www.gstatic.com/firebasejs/7.14.1/firebase-messaging.js");
// Your web app's Firebase configuration
var firebaseConfig = {
  // 省略
};
// Initialize Firebase
firebase.initializeApp(firebaseConfig);
const messaging = firebase.messaging();
```
firebaseはfirebase-messaging-sw.jsのファイル名のものを読みに行くようなので、ファイルを置き
importScriptsを使ってindex.htmlと同じように呼び出して上げると裏側でも動くようになります。

あとはCloud Messaging管理画面でメッセージを作成し通知

通知はコマンドでもできます。
ゆくゆくは更新とともに通知を自動化したいなーと
[Docker] rootパスワードを忘れたときのログイン方法


# rootパスワードを忘れたときのログイン方法

rootパスワードを忘れたときのログイン方法を解説します！

## 回答

```
docker exec -u 0 -it 2f /bin/bash
```

## 解説

ユーザID0を指定することによりrootでインスタンスに入ることができる。
簡単　Bookmarklet作成手順

##コードを作る
JavaScriptコンソールで動くかどうか試して

```js
var b = document.createElement('textArea');
b.value = '['+document.title+'](' + location.href+ ')';
b.style.width = '100%';
b.style.padding = '10px';
b.style.overflow = 'hidden';
document.body.appendChild(b);
b.select();
document.execCommand('copy');
b.blur();
```

##Bookmarkletの形に変換
下記サイトでブックマークレットに変換して、ブックマークバーにドラッグ&ドロップ
[WDF - Software : ブックマークレット作成スクリプト](http://www.eonet.ne.jp/~wdf/software/bookmarklet_creator.html)
VitrualBoxで仮想ホストのリモートディスプレイをRDPから参照できるようにする

CentOS 7 上に VirtualBoxをインストール。
CentOS側はGNOME 環境なしのため、X11 Forwording で VirtualBox 上仮想ホストのディスプレイを表示していたが、
画面遷移が非常に遅いため、Windows RDP を使って仮想ホストの画面を表示できるように設定をした。
特に仮想ホストのネットワーク開通前のインストーラ画面でのパフォーマンスが向上した。
(管理者パスワードやIPアドレスを入力する際に,1文字ごとのタイピングタイムラグがきつかった。。)


# Extension Packをインストール
まず、VirtualBox上の仮想ホストのリモートディスプレイをRDPで使用する為にはExtension Packが必要
以下サイトからダウンロード
https://www.virtualbox.org/wiki/Downloads

インストールコマンド

```
# VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-5.0.24-108355a.vbox-extpack
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Successfully installed "Oracle VM VirtualBox Extension Pack".
```

動作していることを確認

```
#  VBoxManage list extpacks
Extension Packs: 1
Pack no. 0:   Oracle VM VirtualBox Extension Pack
Version:      5.0.24
Revision:     108355
Edition:
Description:  USB 2.0 and USB 3.0 Host Controller, Host Webcam, VirtualBox RDP, PXE ROM, Disk Encryption.
VRDE Module:  VBoxVRDP
Usable:       true
Why unusable:
```

#仮想マシンへリモートディスプレイの設定をする。
port は 他のサービスと被らないようにする。
addressは物理ホストのIPアドレスを指定する。
端末 -> 物理ホスト -> VirtualBox -> 仮想マシンディスプレイの流れで接続する為

```
#  VBoxManage modifyvm ESXi6.0u2 --vrde on --vrdeport 33389 --vrdeaddress 172.20.20.166 --vrdereusecon on
```

これで仮想マシン"ESXi6.0u2" にリモートディスプレイの設定がされた。

下記コマンドで起動する。

```
# VBoxHeadless --startvm ESXi6.0u2
Oracle VM VirtualBox Headless Interface 5.0.24
(C) 2008-2016 Oracle Corporation
All rights reserved.

VRDE server is listening on port 33389.
```


#Windows のRDPなどで接続する

<IPアドレス>:ポート　と指定するとBIOS画面やインストール画面の表示をすることが可能。
X11 Forwording でやるよりサクサクで快適になった。


#参考サイト
ありがとうございます。非常にわかりやすかったです。
http://n73.jugem.jp/?eid=66
#Ruby #Rspec mock method chain ( is it correct way ? )

```rb
class User
  def initialize(name:, age: )
    @name = name
    @age = age
  end

  attr_reader :name, :age

  def book
    Book.new(author: name)
  end

  def book_number
    book.number
  end
end

class Book
  def initialize(author: nil)
    @author = author
    @number = Random.rand(999_999)
  end

  attr_reader :author, :number
end

require "rspec"

describe do
  context "No mock" do
    subject { user.book_number }

    let(:user) { User.new(name: "Alice", age: 20) }

    it do
      is_expected.to be_a Integer

      expect(user.name).to eq "Alice"
      expect(user.age).to eq 20
    end
  end

  context "NG mock" do
    subject { user.book_number }

    let(:user) { User.new(name: "Alice", age: 20) }

    it do
      # NoMethodError:
      # undefined method `number' for nil:NilClass
      allow(user).to receive(:book)

      is_expected.to be_a Integer

      expect(user.name).to eq "Alice"
      expect(user.age).to eq 20
    end
  end

  context "OK allow mock" do
    subject { user.book_number }

    let(:user) { User.new(name: "Alice", age: 20) }

    it do
      allow(user).to receive(:book).and_return Book.new

      is_expected.to be_a Integer

      expect(user.name).to eq "Alice"
      expect(user.age).to eq 20
    end
  end

  context "OK expect mock" do
    subject { user.book_number }

    let(:user) { User.new(name: "Alice", age: 20) }

    it do
      expect(user).to receive(:book).and_return Book.new

      is_expected.to be_a Integer

      expect(user.name).to eq "Alice"
      expect(user.age).to eq 20
    end
  end

  context "NG expect mock (method chain)" do
    subject { user.book_number }

    let(:user) { User.new(name: "Alice", age: 20) }

    it do
      # Failure/Error: expect(user.book).to receive(:number)
      #
      # (#<Book:0x00007fd5468f4aa8 @author="Alice", @number=415630>).number(*(any args))
      #     expected: 1 time with any arguments
      #     received: 0 times with any arguments
      expect(user.book).to receive(:number)

      is_expected.to be_a Integer
    end
  end

  context "OK expect mock (method chain)" do
    subject { user.book_number }

    let(:user) { User.new(name: "Alice", age: 20) }

    it do
      allow(user).to receive(:book).and_return Book.new
      expect(user.book).to receive(:number).and_call_original

      is_expected.to be_a Integer
    end
  end
end
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3088











<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Spring Data Redisでkeyの先頭に"\xac\xed\x00\x05t\x00\x05"が付与される問題

# 概要
redis-cliで見ると存在しているkeyなのに、Spring Data Redisで見に行くとnilになるという事象に遭遇しました。
では、書き込みしてみたらどうなるか？をやってみたところ、謎の文字列がkey/valueともに付与されていることが確認できました。

# 前提
Redis 5.0.8
Spring Boot 2.2.6
Spring Data Redis 2.2.6

# 再現ソース
Javaソース

```java
@SpringBootApplication
public class DemoApplication implements CommandLineRunner {

	@Autowired
	private RedisTemplate<String, String> template;

	@Resource(name = "redisTemplate")
	private ListOperations<String, String> listOps;

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}

	@Override
	public void run(String... args) {
		Long result = listOps.leftPush("queue", "value1");
		System.out.println("value = " + result); // => 1
    }
}

```

redis-cli

```
127.0.0.1:6379> lpop "\xac\xed\x00\x05t\x00\x05queue"
"\xac\xed\x00\x05t\x00\x06value1"
127.0.0.1:6379>
```

# 原因
redis key/value 出现\xAC\xED\x00\x05t\x00\x05 - 春风十里的情 - 博客园
https://www.cnblogs.com/jiangds/p/9037553.html

によると、JdkSerializationRedisSerializerが悪さをしているそうです。

# 対策
上記サイトの通り、下記のおまじないを入れると直ります。

```java
...
	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}

    @Autowired(required = false)
    public void setRedisTemplate(RedisTemplate redisTemplate) {
        RedisSerializer stringSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringSerializer);
        redisTemplate.setValueSerializer(stringSerializer);
        redisTemplate.setHashKeySerializer(stringSerializer);
        redisTemplate.setHashValueSerializer(stringSerializer);
        this.template = redisTemplate;
	}

	@Override
	public void run(String... args) {
...
```

ググっても中国語のサイトしかヒットしなかったので、マルチバイト文字を扱うところでしか問題が発生しないのかも知れませんね。
LP模写によりLP製作の【超初心者】が学んだこと(随時更新)



ランサーズ案件の参考LPサイトから
調査をして学んだこと自分用メモ

今回は**[このサイト](https://www.noa-yoga.com/welcome/)**の
welcomeページのみ調査・模写しました

###結果分かった頻出パターン###


####～配置の頻出パターンは以下の通り～####


#####1.display系#####

```
display: flex;
　　　　　block;
         inline;

```

#####2.position系#####
```
position: relative;
          absolute;

```

#####3.text-align系#####
```
text-align: center;
            left;
            justify;

```

#####4.justify-content系#####
```
justify-content: center;
                 space-between;
```

#####5.transform系#####
(これは1,2回見たくらい)

```
transform: translate( , );   

```     


####～基本文法の頻出パターンは以下の通り～####


#####1.ulとliにクラス名つけて修飾#####

```
<ul class="">
   <li class="">
   </li>
</ul>
```
#####2.border系#####

```

.class名(または#id名) {
  border: 色 solid 太さ; /*1本線で囲む*/
  border-radius: 4px; /*角丸くんの大きさ指定*/
  border-top: ・・・などなど
} 
```

#####3.margin と padding#####

#####4.hoverでリンクに触れた時の動き指定#####

#####5.background系#####

        

###◆調査の足跡###

①全体の構造分け(header,footer,main,div,section,class,id…articleなど)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433296/4bce3acc-9f9d-3a9a-015a-c4f12e7328f7.png)

このLPサイトを作った人は
**1. 〇〇-wrap > 〇〇-block > 〇〇-box の順でclass分け**
**2. 大まかな枠組みの中身は class名 .inner で共通指定**
**3. class名 .sec-blockなどでmargin , padding を共通指定**

↓

② ulとliでdisplay指定をしているところがたくさん
(個人的に目から鱗だった)
**[CSS Flexboxチートシート](https://www.webcreatorbox.com/tech/css-flexbox-cheat-sheet)**

↓

③ レスポンシブ対応

とりあえず、一画面のみ縦長で模写を終了…！
特殊の文字で部分的にスルーしている
ところと使用不可の画像以外は大体コピーできたかな…

かなり勉強になりました。

[参考サイト](https://www.noa-yoga.com/welcome/)

ちなみに、[CSSの素敵なおまとめ](https://qiita.com/tera_shin/items/af90aeba49f93c76bd9e)があったのでメモ。


模写した様子↓

![screencapture-127-0-0-1-5500-welcome-html-2020-04-24-11_12_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433296/ae08fa83-9467-c4b6-26b5-4ee5047157e1.jpeg)
CSSだけでアコーディオン×ハンバーガーメニューを作る（コピペ可）

##CSSだけでアコーディオン×ハンバーガーメニューを作る

スマホ画面はヘッダーが小さくなり
押しにくいボタンになることが多いです。

そこでハンバーガーメニュー×アコーディオンを
使用してユーザー操作をしやすくしてあげましょう

ちなみにハンバーガーメニューとは以下のようなものです。

[![Image from Gyazo](https://i.gyazo.com/e332dcba327210eadf256b7133bcd794.gif)](https://gyazo.com/e332dcba327210eadf256b7133bcd794)

ハンバーガーのような見た目のアイコンを
押すと画面外からニュルッとメニューが出てきます。
JSなどを使用してリッチに作ることも可能ですが
ここではCSSのみで実装します。

アコーディオンは以下の動作です。
[![Image from Gyazo](https://i.gyazo.com/25b4da4813f93cf28f75efad4138bb34.gif)](https://gyazo.com/25b4da4813f93cf28f75efad4138bb34)

ここでは＋ボタンを押すことで親要素が広がって子要素が出てきます。

では実際のコードを見てみましょう

```html:index.html
 <div class="humb-menu">
    <input id="gnav-input" type="checkbox">
    <label for="gnav-input" id="gnav-btn">
      <div i class="fas fa-bars"></div>
    </label>
  
    <div id="gnav-content">
      <!-- タイトルを記載ください -->
      <div class="humb-menu__title">title</div>
  
      <label for="label1">
        <!-- 親要素の名前 -->
        <p>label</p><p>＋</p>
      </label>
      <input type="checkbox" id="label1" class="cssacc" />
      <div class="accshow">
        <!-- 子要素の名前 -->
        <p>content</p>
        <p>content</p>
        <p>content</p>
        <p>content</p>
      </div>
  
      <label for="label2">
        <p>label</p><p>＋</p>
      </label>
      <input type="checkbox" id="label2" class="cssacc" />
      <div class="accshow">
        <p>content</p>
        <p>content</p>
        <p>content</p>
        <p>content</p>
      </div>
      
      <label for="label3">
        <p>label</p><p>＋</p>
      </label>
      <input type="checkbox" id="label3" class="cssacc" />
      <div class="accshow">
        <p>content</p>
        <p>content</p>
        <p>content</p>
        <p>content</p>
      </div>
    </div>
  </div>
```

labelが親要素となりcontent部分が子要素となります。
必要に応じてpタグをaタグに変更してリンクなどにして使用ください。
ハンバーガーボタン部分はfontawsomeを使用しています。

```css:index.css
#gnav-btn {
    color: gray;
    padding: 10px;
    font-size: 30px;
    position: fixed;
    top: 10px;
    right: 10px;
    z-index: 100;
    background-color: white;
    border: solid 1px #d1caca;
    border-radius: 3px;
  }
  #gnav-input:checked ~ #gnav-content {
    top: 0;
  }
  #gnav-content {
    position: fixed;
    top: -100%;
    left: 0;
    z-index: 10;
    transition: 0.3s;
    width: 100%;
  }
  .humb-menu__title {
    padding: 1.5rem;
  }
  .humb-menu label {
    display: flex;
    justify-content: space-between;
    padding: 1.5rem;
    cursor: pointer;
    border-top: 0.5px solid #c7c5c5;
  }
  .humb-menu input {
    display: none;
  }
  .humb-menu .accshow {
    height: 0;
    overflow: hidden;
  }
  .humb-menu .accshow p {
    padding: 1.5rem;
  }
  .humb-menu .cssacc:checked + .accshow {
    height: auto;
  }
} 
```
コードの記述量をへらすため必要最小限の記載にしています。
必要に応じて装飾を加えてください。

動作としてはhtmlで非表示のチェックボックスを設置し
チェックの有無で動作するシンプルな内容です。

コピペすると以下の動作になります。
[![Image from Gyazo](https://i.gyazo.com/eac2dd1578423431ca7edcce9efb25d9.gif)](https://gyazo.com/eac2dd1578423431ca7edcce9efb25d9)
一度閉じた標準入力ストリーム(System.in)について

## はじめに

・標準入力でお世話になる`InputStreamReader(System.in)`について
・一度閉じた標準入力ストリームを開こうとすると、閉じたまま開かない

## 一度閉じた標準入力ストリームは開けない？

コンソールから何か入力するときにお世話になる標準入力ストリームですが、どうやら同一プログラムのなかで一度閉じた標準入力ストリームは開けないっぽい。

例えば、

```java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test {

	public static void main(String[] args) {
		try {
			// 2回目に入るとSystem.inが閉じたままになっている
			for (int i = 0; i < 2; i++) {
				streamTest1();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	/**
	 * コンソールに標準入力された文字列をそのまま返す
	 * @throws IOException
	 */
	private static void streamTest1() throws IOException {
		try (BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in))) {
			System.out.print("入力 >");
			String st = br1.readLine();
			System.out.println("出力 >" + st);
		}
	}
}
```

これを実行しようとすると
`streamTest1`内の`String st = br1.readLine();`の行で
`java.io.IOException: Stream closed`
と返されて、標準入力ストリームが閉じたままになってしまっていることがわかった。

## 今のところの解決法
自分が手を出せる範囲では、同一プログラム内で標準入力ストリームを複数使う場合は、最後にストリームを使った後に閉じるようにするくらいしか思いつかない。すなわち、

```java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test {

	public static void main(String[] args) {
		try {
			streamTest1();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * コンソールに標準入力された文字列をそのまま返す
	 *
	 * @throws IOException
	 */
	private static void streamTest1() throws IOException {
		// 繰り返しの上位ブロックにtry-with-resources文を持ってくる
		try (BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in))) {
			int i = 0;
			while (i < 2) {
				System.out.print("入力 >");
				String st = br1.readLine();
				System.out.println("出力 >" + st);
				i++;
			}
		}
	}
}
```

のようにすれば、繰り返し標準入力ストリームを使うことができる。

## まとめ
・一度閉じた標準入力ストリームをまた開いて使おうとすると、閉じたままになっていて使えない。
・とりあえず標準入力ストリームを閉じるのは、最後にストリームを使用した後にすること。

...閉じてまた使う方法とかもありそうだなぁ。。
dyld: Library not loaded: /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib   Referenced from: /usr/local/bin/ssh   Reason: image not found Abort trap: 6　というエラーが出て直したお話

macを使用していて、ターミナルでSSHでサーバーに接続しようとした時、突然こちらのエラーが出るようになりました。


`dyld: Library not loaded: /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib   Referenced from: /usr/local/bin/ssh   Reason: image not found Abort trap: 6`


opensslに関わるトラブルのようです。

とりあえず、困ったときのBrew updateをしてみます。

`brew update && brew upgrade`

すると、PHPのバージョン等に様々問題があったので、指示通りに改善すると解決しました。
Vue v-selectを使う時の注意点

どうもチャンクノです。
Vueのプラグインでv-selectというとても便利なプラグインがあります。
今回は仕事でそれを使った際、ちょっとだけ困ったことについて書きます。
何が問題だったかというと、気持ち長めにクリックしないとフォームに値が入らなかったことです。
解決方法を先に言うとlabelタグで囲っちゃダメだよってことです。
どういうことかは以下参照。

```
問題のコードがこちら

<label class="m-r-10">
  Hoge
 <v-select :options="hoges.map(hoge => hoge.foo)" v-model="hoge" placeholder="Hoge" class='form-group'></v-select>
 <input type="hidden" name="hoge_search_form[hoge]" v-model="hoge">
</label>
```

要素全体がlabelで囲われていますね。
これが諸悪の根源です。

```
正しくはこう

<label class="m-r-10">
  Hoge
</label>
<v-select :options="hoges.map(hoge => hoge.foo)" v-model="hoge" placeholder="Hoge" class='form-group'></v-select>
<input type="hidden" name="hoge_search_form[hoge]" v-model="hoge">
```

こうすることで期待する動きになりました。
そもそも要素全体をlabelで囲うことがおかしいのかもしれないですね。
htmlタグはしっかりと用途に合わせた使い方を心がけたいものです。
それでは今回はこの辺で！
皆様良きプログラミングライフを🙏
Chromeの拡張機能を2つ使うだけでブラウザの操作を自動化！？

「ブラウザの操作を自動化したい」
仕事中にこういう風に考えることがありました。

なぜこういう風な事を思ったのか。
それは申し込みのテストを毎回手動で行なってるOPさんに申し訳ないと思ったから。巷では自動テストだの言っていますが、人間でテストしなきゃいけない部分も沢山あります（ブラウザ操作が伴う物は余計に）。
そして自分も面倒くさがりなので基本的に手動でテストなんかしたくない。って事で上記に思い立ちました。

自動化といっても大層なことじゃなく、軽い条件でブラウザ操作したい人向け。
何せChromeの拡張機能を使うだけで出来るので。
複雑な事をしようと思えば、PythonとSeleniumで出来ますが、今回はそんな難しいことは望みじゃないです。
必要な入力項目に入力したり、特定のチェックボックスにチェックを入れてsubmitボタンを押すとか軽い感じ。

## ブラウザの自動操作で使用するChromeの拡張機能

実際に使用する拡張機能の軽い紹介だけ。

 - [ScriptAutoRunner](https://chrome.google.com/webstore/detail/scriptautorunner/gpgjofmpmjjopcogjgdldidobhmjmdbm?hl=ja)
    - [開発者のQiita・使い方など](https://qiita.com/nakajmg/items/bcbf0e5debcfa70c8d63)
 - [Easy Auto Refresh](https://chrome.google.com/webstore/detail/easy-auto-refresh/aabcgdmkeabbnleenpncegpcngjpnjkc)


### 任意のサイトでJavaScriptを実行してくれる拡張機能【ScriptAutoRunner】
任意サイトでスクリプトを実行してくれる拡張機能です。
こういった拡張機能は「Tampermonkey」とかもありますが、この拡張機能はデザインがカッコ可愛い！！（ピカチュウぽくない？）

<img width="890" alt="ScriptAutoRunner.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253969/1eede02a-f842-52d4-f933-f66fe1bfeb1f.png">

指定のスクリプトの実行をコンセントみたくOn/Offで切り替えられるのもすごい楽。
ちゃんとした使い方は公式の方のQiitaを覗いてください。
ここでは軽い使い方だけ。
<img width="890" alt="ScriptAutoRunner.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253969/8ea85cca-0505-8433-4d99-4f3b0ce0dd8d.png">

スクリプトを細かくしてフローチャートっぽくするのもあり。
実際に上記のスクリプトの実行状態をONにして指定したhost名のサイトにアクセス）すると、指定したスクリプトが実行されます。
<img width="1146" alt="qiita_com_の内容_と_Qiita.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253969/2f337705-1864-5297-5ea3-21e161d07e73.png">

通常のpureのJavaScriptと、jQueryに対応しています。
pureのJavaScriptが苦手という人でも安心（そんな人いるんかな）
jQuery非対応のサイトでも、この拡張機能を使用するとjQueryを埋め込んで使用することが可能です。

あと、この拡張機能の良い部分としては、**基本的にブラウザを立ち上げた状態で実行しているということでセッション関連を気にする必要がありません。**なので、Webサイトにログインした状態のまま機能を使うことができます。スクレピングで行う場合、単純なログイン項目であればログインも自動化出来ますが、複雑なログイン機構（二段階認証、画像認証など）があった場合はスクレイピングで対処するのは結構難易度が高いです。

### ブラウザを指定した時間で自動読み込みする拡張機能【Easy Auto Refresh】
<img width="289" alt="Easy_Auto_Refresh.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253969/82cc8c37-711b-df6b-c673-29e9281b8775.png">

時間を指定してブラウザのリロードを行なってくれます。
オプション指定でChromeで開いてるタブのサイトでも可能ですし、指定したタブのみの実行も、キャッシュをクリアすることも可能です。説明不要なくらいシンプルな拡張機能。
デフォルトでは、指定のタブのみの実行可能です。

## 上記２つのChromeの拡張機能を組み合わせると...？
ここから本題。
任意のサイトでスクリプトを自動実行してくれる機能と、自動読み込みを指定の時間で行う機能を組み合わせることで色々なことが出来ます。例えばアンケートサイトの入力フォームに「ScriptAutoRunner」で自動入力させsubimit。「Easy Auto Refresh」でブラウザを読み込みを行い再度、「ScriptAutoRunner」で自動入力させsubmit...の無限ループが可能です。上記は悪い例ですが、正しく使えば会社とかで自動テストなど行うこともできます。

自動テストなどで回せない部分ってあるので、それをこれで代用すると。
軽い使用例。

```javascript
// Script①：list_nameセレクタの中に「予約する」といった文言がないcheckboxにチェックを入れる
$(".list_name:not(:contains('予約する')) input:checkbox").prop('checked', true);

// Script②：チェックが入ってるか取得
let checked = $(".list_name input:checkbox").prop('checked');

// Script③：チェックが入ってる要素があればsubmit
if (checked) {
    submit();
}
```

みたいな感じで軽いJavaScriptが分かる方なら色々できます。（当たり前だけど悪用厳禁で）
面倒臭いことは全部自動化したい。
Laravel MySQL SQLSTATE[HY000] [1049] Unknown database が出た時に確認すること

# 目的

- 自分がよくやらかすミスなので確認する内容をまとめる

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.3) |
| ハードウェア | MacBook Pro (16-inch ,2019) |
| プロセッサ | 2.6 GHz 6コアIntel Core i7 |
| メモリ | 16 GB 2667 MHz DDR4 |
| グラフィックス | AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHP バージョン | 7.4.3 | Homwbrewを用いて導入 |
| Laravel バージョン | 7.0.8 | commposerを用いて導入 |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いて導入 |

# エラー内容

- Laravelアプリのマイグレート時やアプリからのDBアクセス時にターミナルやブラウザ情に下記エラーが表示される。
    -「SQLSTATE[HY000] [1049] Unknown database 'データベース名'」

# 解決方法その1 MySQLの再起動

1. 下記コマンドを実行してMySQLの再起動を実施する。

    ```terminal
    $ mysql.serve restart
    ```

# 解決方法その2 データベース名の記載の確認

1. 下記コマンドを実行してMySQLのターミナルを開く。(MySQLのrootユーザのパスワードがわからなくなってしまった方はこちら→[MySQL 8.0.18 のrootパスワードを忘れた時のリセット方法](https://qiita.com/miriwo/items/1880e9d2ebcfd3c0e60d))

    ```terminal
    $ mysql -u root -p
    ```
1. 下記コマンドを実行して現在存在するデータベース名を出力する。

    ```mysql
    mysql> show databases;
    ```
1. 別のターミナルを開き、アプリ名ディレクトリで下記コマンドを実行する。

    ```terminal
    vi .env
    ```
1. 「.env」の`DB_DATABASE=`の後に記載しているデータベース名が先にコマンド`show databases;`で出力されたものと一致しているか確認する。
1. 別のターミナルを開き、アプリ名ディレクトリで下記コマンドを実行する。

    ```terminal
    $ vi config/database.php
    ```
1. 「config/database.php」の「mysql」の`'database' => env('DB_DATABASE', 'データベース名'),`のデータベース名部分の記載が、先にコマンド`show databases;`で出力されたものと一致しているか確認する。

# 確認方法その3 MySQLのユーザ名とパスワードの確認

1. アプリ名ディレクトリで下記コマンドを実行して「.env」ファイルを開く

    ```terminal
    $ vi .env
    ```
1. 「DB_USERNAME=」「DB_PASSWORD=」の後に記載されている内容に誤りがない事を確認する。
1. アプリ名ディレクトリで下記コマンドを実行して「config/database.php」ファイルを開く。

    ```terminal
    $ vi config/database.php
    ```
1. 「'username' =>」「'password' =>」の後に記載されている内容に誤りがない事を確認する。
(随時更新) VSCodeの各種設定ファイルの格納場所備忘録メモ

VSCodeの設定ファイルの格納場所が分からずネットで調べると多数の記事がヒットします。しかし、多くの記事は更新されない為、古い情報が多く現状を反映しておりません。そこで現状を備忘録メモとして残しておこうと思います。内容は随時更新していきたいと思います。OSは筆者がよく使っているOSのみの情報なのでOSのバージョンやディストリビューションによっては若干の差異が有る可能性が有りますが、予めご了承下さい。

# settings.json
基本的な設定が保存されているsettings.jsonの格納場所は以下の通りです。

* Mac(macOS 10.14.6 Mojave)
  `~/Library/Application\ Support/Code/User/settings.json`

* Linux(Ubuntu 18.04)
  `~/.config/Code/User/settings.json`

* Windows10
`%APPDATA%/Code/User/settings.json`

# snippets
コードの補完情報(snippet)を格納しているディレクトリのパスは以下の通りです。

* Mac(macOS 10.14.6 Mojave)
  `~/Library/Application\ Support/Code/User/snippets`

* Linux(Ubuntu 18.04)
  `~/.config/Code/User/snippets`

* Windows10
  `%APPDATA%/Code/User/sinippets`

# locale.json
ローカライズ情報を記載していたlocale.jsonは最新のVSCode(2020/4現在:バージョン1.44.2)では廃止されており、代わりにargv.jsonという新しいファイルに変更されています。locale.jsonは階層の深いパスに格納されていましたが、argv.jsonは比較的分かりやすい所に有ります。

* Mac(macOS 10.14.6 Mojave)
  `~/.vscode/argv.json`

* Linux(Ubuntu 18.04)
  `~/.vscode/argv.json`

* Windows10
  `$HOME/.vscode/argv.json`

# Reference
* [Display Language](https://code.visualstudio.com/docs/getstarted/locales)
* [注意:古いlocale.jsonに関する情報](https://www.atmarkit.co.jp/ait/articles/1805/18/news032.html)
* [【Visual Studio Code】v1.12.1 設定のためのSettings.jsonファイルについて](https://qiita.com/ayatokura/items/4301e0d1d8b339f722eb)
コロナウイルスの影響でリモート勤務が長引く為、AWS資格(SAA)取得計画

今回は、コロナウイルス外出自粛要請が出されて、研修が伸びそうな4月入社の私たちがAWS資格取得の計画を立てて行動していく過程を記載します！


##【目的】
リモートワークでの研修の一環として

##【資格取得】

・必須
ソリューションアーキテクトアソシエイト(SAA)

・任意
資格取得はしませんが、AWSをハンズオンで扱い環境構築、アプリをデプロイ、CloudFormation、ServerSpec等の実践をしていこうと思います。

##【スケジュール】
・4/30までLinux研修(進捗により少し伸びる可能性もあり)
・5/1~SAA,AWSの研修スタート予定

<教材>
[徹底攻略AWS認定ソリューションアーキテクトアソシエイト教科](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-AWS%E8%AA%8D%E5%AE%9A-%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E2%80%93-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88%E6%95%99%E7%A7%91%E6%9B%B8/dp/4295005495)
[最短突破AWS認定ソリューションアーキテクトアソシエイト合格教本](https://www.amazon.co.jp/%E6%9C%80%E7%9F%AD%E7%AA%81%E7%A0%B4-AWS%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-%E5%90%88%E6%A0%BC%E6%95%99%E6%9C%AC-%E6%9D%91%E4%B8%BB/dp/4297103826/ref=pd_lpo_14_t_1/357-8712988-9746536?_encoding=UTF8&pd_rd_i=4297103826&pd_rd_r=db7756eb-3289-4565-881e-a19fd08abfb6&pd_rd_w=rgZrq&pd_rd_wg=Gdp3K&pf_rd_p=4b55d259-ebf0-4306-905a-7762d1b93740&pf_rd_r=MHNYJQNJVKAW127JPYHM&psc=1&refRID=MHNYJQNJVKAW127JPYHM)
[UdemyこれだけでOK!ソリューションアソシエイトアーキテクト試験突破講座](https://www.amazon.co.jp/%E6%9C%80%E7%9F%AD%E7%AA%81%E7%A0%B4-AWS%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-%E5%90%88%E6%A0%BC%E6%95%99%E6%9C%AC-%E6%9D%91%E4%B8%BB/dp/4297103826/ref=pd_lpo_14_t_1/357-8712988-9746536?_encoding=UTF8&pd_rd_i=4297103826&pd_rd_r=db7756eb-3289-4565-881e-a19fd08abfb6&pd_rd_w=rgZrq&pd_rd_wg=Gdp3K&pf_rd_p=4b55d259-ebf0-4306-905a-7762d1b93740&pf_rd_r=MHNYJQNJVKAW127JPYHM&psc=1&refRID=MHNYJQNJVKAW127JPYHM)

<5/1~5/15予定>
本で各サービスについて学習→Udemyハンズオン学習で理解を深める
という流れで学習を進めていく予定。

<5/18~5/27予定>
実践 環境構築,アプリデプロイ,CloudFormation等、構築を行う予定。

##【試験受験日】
5/27日(水)試験受講予定。
Web制作用のjpegを画質を落とさずに圧縮する方法

##Web制作用のjpegを画質を落とさずに圧縮する方法

Webやアプリの制作にて使用する写真(jpeg)が重いと感じる事がありませんか？

画質を落とさずに圧縮するには以下の無料サイトがおすすめです

[tinyJPG](https://tinyjpg.com/)

jpegには画像データの中に撮影者や撮影日時など
不要なデータが一緒に埋め込まれていることが多いです。

リンクをクリックすると以下の画面になります。
[![Image from Gyazo](https://i.gyazo.com/3cd3ce2b79cfc4826ec0af7041ca3d98.jpg)](https://gyazo.com/3cd3ce2b79cfc4826ec0af7041ca3d98)

パンダの横にある破線枠内に圧縮したいjpegをドラッグするだけです

では圧縮してみましょう
これは一眼レフで撮影した写真です。
[![Image from Gyazo](https://i.gyazo.com/db510950479ccdc6d8e409a4405acb81.jpg)](https://gyazo.com/db510950479ccdc6d8e409a4405acb81)

８４％圧縮することができました
4.3MB→691KB
[![Image from Gyazo](https://i.gyazo.com/e5469b86a6cf46737f75612f3152e65f.jpg)](https://gyazo.com/e5469b86a6cf46737f75612f3152e65f)

ダウンロードして画像を見てみましょう
見た目にはほとんど変化がないように見えます。
[![Image from Gyazo](https://i.gyazo.com/16ccb0a00f083d7a7fe88707a5bb3ebf.jpg)](https://gyazo.com/16ccb0a00f083d7a7fe88707a5bb3ebf)

情報も見てみましょう
詳細情報の不要な内容も削除されています。
[![Image from Gyazo](https://i.gyazo.com/177740fd2e1e194f1a2c9a3d642d60a6.jpg)](https://gyazo.com/177740fd2e1e194f1a2c9a3d642d60a6)

５MB以下であれば同時に２０枚まで圧縮できます。
パンダの絵がかわいいですね。
[![Image from Gyazo](https://i.gyazo.com/bfa60a1ecab8e7bd42bce628e3a7eedf.jpg)](https://gyazo.com/bfa60a1ecab8e7bd42bce628e3a7eedf)

不要な情報は削除して快適なページを作りましょう
Windows上にIIS SMTPサーバーを構築する（トラブルシューティング）

## SMTPサーバーの構築

SMTPサーバーの構築自体は[MicroSoftのWebサイト](https://docs.microsoft.com/ja-jp/biztalk/install-and-config-guides/appendix-d-create-the-smtp-server)に掲載されているものがわかりやすく、そのとおりに行えば設定できます。が、**メールが届かない！！** 

ここでは[MicroSoftのSMTP サーバーの作成](https://docs.microsoft.com/ja-jp/biztalk/install-and-config-guides/appendix-d-create-the-smtp-server)手順にないものを補足する形で説明します。
＊↑のサイトの手順どおり構築が終わっている前提で話を進めます。

筆者の利用環境は以下です。
・WindowsServer2012
・IIS6.0


## 25番ポートの利用制限を解除
OP25B（25番ポートブロック）がかかっている場合があります。プロバイダに対して、25番ポートの利用制限を解除してもらう必要があります。
今回はAWS上のwindowsインスタンスを利用していたので、下記の申請が必要でした。
[EC2 インスタンスからポート 25 の制限を削除するにはどうすればよいですか?](https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-port-25-throttle/)


## SPFレコードの設定
SPFレコードとは、メールのなりすましを防止するために、メールの送信元のアドレスのドメインが登録されているDNSに対して設定するものです。
<img width="640" alt="Screen Shot 2020-04-24 at 10.00.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296083/fe4cefb1-075c-628d-843d-e4c156220e05.png">

参考：[送信ドメインを認証するためのSPFレコードに詳しくなろう](https://sendgrid.kke.co.jp/blog/?p=3509)
画像は上記サイトより拝借いたしました。

SMTPサーバーをたてるのは自分の所有しているサイトから会員に対してメールを送りたい、といった場合ではないでしょうか。その場合、サイトで利用している情報発信用メールアドレスのドメインを登録しているDNSにSPFレコードを追加します。

追加するのは以下のようなレコードです。

```
{mailFromのドメイン名} IN TXT "v=spf1 ip4:{mailサーバーのIP} ~all"
例）myservice.mail.from.com IN TXT "v=spf1 ip4:123.123.123.123 ~all"
```


## DNSへの登録とFQDNの記載
DNSにメールサーバーのドメインを登録します。
その後登録したドメインを配信詳細の完全修飾ドメイン名に記載します。（ここに記載されたものがエンベロープFromになるようです。）
![メールサーバー⑨.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296083/3bf435ae-61c1-e2ce-7a97-66150dfdfb79.png)



## backListに乗っていないか確認
IPアドレスの前の所有者がちょっと悪いことをしていてBlack ListにIPアドレスが乗っている場合、メールが送れないことがあります。Black Listに乗っていないか確認してみましょう。
もしBlackListに乗ってしまっている場合は解除申請を出します。
下記サイトでブラックリストに乗っていないか確認できます。
・[Spamhaus](https://www.spamhaus.org/)
・[Invaluement](https://www.invaluement.com/removal/?__cf_chl_jschl_tk__=03fc8f685eac3557da5442af1148a087b2e1730f-1587691822-0-ATmakEcCYAt2PLeBE5vOffl-09bD_RsmoDCcRVdtNsGk-QLmz8a6Vr3ozd40y9L_FrMOtsXqPq0kQpcRsGb1GiDRg-Lj3ihr9HRczeB7LCPXlFYqP413u_ufmQLu2v3z77gL0Fe2m9nWbvs5mpEFSmiHZl2oduK6LzxNy_aNQpW2AfsH6wrpHKRjxs3GgK_rVspnYZ2hO_BRomoAgLBgra6EERjmJB3fT-07qDEXJMiDhZcDB8Ol6k5EI7ams8Y2fzeB0zFPKoBixVPfkHZATjjzyQZOqIpd189vAbS6J-2c)
・[MXToolBox](https://mxtoolbox.com/)


## 問題の調査のための設定
メールが届かない！となったときに以下のディレクトリを確認します。
・C:\inetpub\mailroot\BadMail
・C:\inetpub\mailroot\Queue
・ログファイル

#### BadMail
送ることができなかったメールがこのディレクトリに入ります。
送れなかった理由等も記載されているので確認します。

#### Queue
送られるメールが多い場合、Queueディレクトリにメールが入っているのが確認できると思います。
あまりにもQueueのメールが減るのが遅い場合はネットワークを見直す、名前の逆問い合わせができるようになっているが確認するなど対応が必要です。

#### ログファイル
メールの送信ログを確認できるように、設定しておくほうがよいと思います。
設定は下記のように行なえます。
![20191217-102903.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296083/3fadb30f-2a12-39f4-1e43-684b997e870e.jpeg)
![20191217-102940.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296083/8940da65-65eb-f11d-621a-d82f8ba6e759.jpeg)

----
以上Windowsサーバー向けに記載しましたが、トラブルシューティング系はLinuxでも同じような対応が必要になるので参考になれば幸いです。
Visual Studio Codeでcodeコマンドが使えない時の対処法 【-bash: code: command not found】

Visual Studio Codeで下記のようにcodeコマンドが使えない時の対処法をまとめました。

```terminal
code 
-bash: code: command not found
```
## 対処法

- Visual Studio Codeを立ち上げコマンドパレットを開きます。（shift + command + P）
- コマンドパレットで検索をかけ、`Command: Install 'code' command in PATH command`をクリックします。
<img width="902" alt="スクリーンショット 2020-04-24 10.26.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/a6d9f171-5c62-2769-14de-d422d8f43cc3.png">
- インストールが終わると下記のポップアップが出ます。
<img width="552" alt="スクリーンショット 2020-04-24 10.31.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/723555f0-eafe-a9c2-0a77-ba7405503a3d.png">
- 最後にVisual Studio Codeを再起動すれば、codeコマンドが使えるようになります。
Github ActionsでeslintとJestを実行するworkflow

## やること

Github Actionsを使って、PRが作成されたタイミングでテストや構文解析を実行するというものです。

## 説明しないこと

* Github Actionsとは？
* それぞれの導入方法
* 細かい部分

## Github Actionsを使用する時のポイント

[Marketplace](https://github.com/marketplace?type=actions)を探すとかなり豊富に色々な開発者が開発をしたActionが利用出来るようになっているので、まずそちらを見てみるといいかもしれません。

## Github Actionsの導入方法

Github Actionsを導入したいgithubで管理されているrepoに以下のようにworkflow定義用の`main.yml`を作成します。
> 上記で`main.yml`としていますが、ここのファイル名は自由です。
> かつ、複数のymlファイルを配置して、actionを分割することも可能です。

```sh
$ cd path/to/myrepo

$ mkdir -p .github/workflows

$ touch .github/workflows/main.yml
```

## アクションを書く

今回実行したいこととして、以下のような流れを想定します。

1. Node.jsインストール
2. yarn install
3. reviewdogのインストール
4. eslintの実行
5. jestの実行
6. Artifactにカバレッジの保存
7. JestのカバレッジをPRコメントに挿入

```yml
# アクション名
name: CI

# タイミングを指定
on:
  pull_request:
    branches: [ master ]

jobs:
  build:
    name: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1 
      - name: yarn install
        run: yarn install
      - name: eslint review
        uses: reviewdog/action-eslint@v1
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          reporter: github-pr-review
          eslint_flags: './**/*.{vue,ts,js}'
      - name: Run eslint
        run: yarn lint
      - name: Run Jest
        run: yarn jest
      - name: Upload test coverage artifact
        uses: actions/upload-artifact@v1
        with:
          name: coverage
          path: coverage
      - name: Show coverage in comments
        uses: ziishaned/jest-reporter-action@v0.0.1
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          test-command: "yarn jest --coverage"
```


## 参考

アクトインディさんの記事をとても参考にさせていただきましたありがとうございます！！
* [Github Actions で Nuxt.js のSPAにJestとESLintを実行してみた](https://tech.actindi.net/2019/10/11/090521)
Google Meetのタイルビューを使用して最大16名の参加者を表示する方法

# はじめに
Google MeetでもZoomのようなタイルビューを使用して16名まで表示できるようになりました。

[ビデオ会議ツール「Google Meet」、最大16人表示など4つの新機能](https://japan.zdnet.com/article/35152846/)

# 手順

#### 1. 画面右下のメニューから、「レイアウトを変更」を選択

<img width="356" alt="スクリーンショット_2020-04-24_10_03_48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354791/c635a01f-4369-8a11-510a-986dde2022e4.png">

#### 2. タイル表示を選択

<img width="496" alt="スクリーンショット_2020-04-24_10_04_04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354791/b65c50f1-157f-62d5-0327-0fc63c328f43.png">

# おわりに
タイルビューを使用することで参加者の様子を確認しながら会議などを進めることができるようになります。
ぜひお試しください。

# 参考
- [Google公式サポート](https://support.google.com/meet/answer/9292748?hl=ja)
http_build_queryの落とし穴 備忘録

## NULLを送りたい時の落とし穴の内容

http_build_queryの仕様ではあるが、渡したパラメーター配列の値やキーによって、若干想定（希望ｗ）と異なる結果を返してしまうことがある。

問題点は2つ：

「キーのみあって値がNULL」の場合、http_build_queryの返却値にパラメーターのキーが入らず、パラメーターとして欠けてしまう。

例：

```
$params = array('key1' => null, 'key2' => 'value2');
var_dump(http_build_query($params));
```

の場合の結果は

```
string 'key2=value2' (length=11)
```

になります。

野望的には

```
string 'key1=&key2=value2' (length=11)
```

を期待していても無駄です。

対策は、あとで追記しますが、まずは備忘録的にアップしました。
貿易統計を学び合う会 （資料）ミニマム技術目標（kaggle,slack）

# [貿易統計を学び合う会](https://www.kaggle.com/zanjibar/manabiai-2/)の資料です
# 学び合う会には学習目標（技術目標）があり、kaggle を使うのがミニマムです。

# 具体的な学習タスク(下記はチェックリスト) 解説は[こちら](https://qiita.com/zanjibar/items/6651b9d86481850b85ff) 

- kaggle のアカウントをつくる
- notebook のコピー
- コピーした notebook の名前変更
- コピーした notebook を実行
- セルを追加、実行、編集、削除
静的ページにStripeで決済機能をサクッと導入する

[Stripe Checkout](https://stripe.com/jp/payments/checkout) を使って、静的ページにサクッと決済機能を導入する方法を整理します。

# 導入手順

Stripe のアカウントを作成し、管理画面にログインします。

開発環境でテストする場合は、「テストデータを表示」を**オン**にします。

*※ 本番モードとテストモードでは、Checkoutのコードスニペットや商品のSKUが異なる点、注意してください。*

## 1. 商品の作成

[商品ページ](https://dashboard.stripe.com/products) で商品を作成します。都度決済・定期決済のどちらでもOKです。

## 2. Checkout コードの取得

作成した商品の詳細ページに移動し、「Checkout で使用」から**成功時のURL**と**キャンセル時のURL**をセットして、コードスニペットをコピーします。

そのコードスニペットを任意の静的ページに貼り付ければ、決済機能の導入は完了です。

これであっという間に、都度決済でも、定期決済でも受け付けられます。

## 3. Checkout のカスタマイズ 

同コードスニペットでは、[stripe.redirectToCheckout](https://stripe.com/docs/js/checkout/redirect_to_checkout) という JavaScript ライブラリを利用して、簡単な決済機能の導入を実現しています。

バックエンドなしでも簡単に導入できる一方、バックエンドなしだとカスタマイズできることは少ないです。

一応、`client_reference_id` フィールドを使えば、任意の値を渡すことができます。なお、この値はユニークでないといけないようです。

> client_reference_id
> A unique string to reference the Checkout session. This can be a customer ID, a cart ID, or similar. It is included in the checkout.session.completed webhook and can be used to fulfill the purchase.

`client_reference_id` を付与する場合のコード例は次のとおりです。 `billingAddressCollection`, `submitType`, `locale` も明記しています。

```js
// `client_reference_id` を必ずユニークにする
const date      = new Date(),
      timestamp = Math.floor( date.getTime() / 1000 ).toString(),
      randomStr = Math.random().toString(32).substring(2)

stripe.redirectToCheckout({
  items: [{sku: 'sku_xxxxxxxxxxxx', quantity: 1}],
  clientReferenceId: 'SOME_VALUE' + '_' + timestamp + '_' + randomStr,
  billingAddressCollection: 'required',
  submitType: 'pay',
  locale: 'ja',
  // Do not rely on the redirect to the successUrl for fulfilling
  // purchases, customers may not always reach the success_url after
  // a successful payment.
  // Instead use one of the strategies described in
  // https://stripe.com/docs/payments/checkout/fulfillment
  successUrl: 'YOUR_SUCCESS_URL',
  cancelUrl: 'YOUR_CANCEL_URL',
})
```

### 税率は適用できない

僕の調べた限り、静的ページのみで Stripe Checkout を利用する場合、税率の適用はできません。なので、Stripe の管理画面で消費税率の設定をしても、商品もしくはプランの本体価格のみでの決済になります。

## 4. 独自メールドメインの設定（任意）

顧客へのメール通知を `xxx@stripe.com` からではなく、独自メールドメインから行いたい場合、次の設定が必要です。

[管理画面 > 設定 > メール](https://dashboard.stripe.com/settings/emails)で、ドメインを追加します。

表示されるDNSレコード（TXT・CNAME）の値を独自ドメインのDNSに追加します。

設定は以上です。

なお、TXT レコードは所有権確認用ですが、上記設定後にこの値を変更すると、Stripe から 

> Urgent: There’s a problem with your custom email domain
> We'll no longer be able to send emails from your custom domain in 2 days

というメールが届きます。

なので、別のサービスの所有権確認などで、TXT レコードの値を変更する必要がある場合は、その対応が終わった後すみやかに、Stripe が求める値に戻さないといけません。

# References

- [Stripe Checkout | Stripe](https://stripe.com/jp/payments/checkout)
- [stripe.redirectToCheckout | Stripe JS](https://stripe.com/docs/js/checkout/redirect_to_checkout)
- [Is it possible to pass custom data to stripe checkout? | Stack Overflow](https://stackoverflow.com/questions/55742393/is-it-possible-to-pass-custom-data-to-stripe-checkout)
僕のLinuxコマンド

自分用の備忘録。

Linuxコマンドを勉強しているのでついでにメモっとく。
なお、メモっとくコマンドは基礎の基礎のみ

##練習に使用したツール
[Cygwin](https://www.cygwin.com/)を使用。
インストール方法とかは[こちら](https://proengineer.internous.co.jp/content/columnfeature/2667)を参考に。

通常ならフォルダをエクスプローラーでGUIするところ、Linuxの画面（あのコマンドプロンプトみたいな画面）でいじれるツールらしい

---
##コマンド一覧
[このページ](https://www.sejuku.net/blog/5465)を参考にしました。

###フォルダ操作系

#####カレントディレクトリの移動
`cd`
例：`$ cd C:`

#####カレントディレクトリの中身をリスト表示
`ls`
例：`$ ls `

#####ファイル・フォルダの移動
`mv`
例：`$ mv targetFolder C:/destinatedpath`

#####ファイル・フォルダをコピー
`cp`
例：`$ cp targetFolder C:/destinatedPath`

 - オプション
  - `-rp`：コピーの対象フォルダの配下のフォルダ・ファイルも全てコピー

#####画面を綺麗
`clear`
例：`$ clear`

#####フォルダを作成
`mkdir`
例：`$ mkdir FolderName`

#####ファイルを作成
`touch`
例：`$ touch file.txt`

#####空のフォルダを削除
`remdir`
例：`$ rmdir targetFolder`

#####ファイル・フォルダ削除
`rr`
例：`$ rm target.txt`

#####現在いる位置を表示する
`pwd`
例：`$ pwd`

#####ファイルを検索
`find`
例：`$ find -name target.txt`

#####ファイルの内容を表示
`cat`
例：`$ cat target.txt`


###操作系
#####コマンド履歴を表示する。
`history`
例：` $ history`


###システム管理系
#####空きメモリ・使用メモリを表示
例：`free`
jQueryとVueでの書き方

Jqueryの場合だとHTMLを書き換える部分は
何行も記載しなければならないので結構大変
vueの方が直感的でわかりやすい

````
<!DOCTYPE html>
<html lang="en">
<head>

    <script src="main.js"></script>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>VUETtest</title>

 
</head>

<body>
    <div id="container">
    <h1>TEST</h1>
    

    //vue.での記載方法
    <ul>
      <li v-for="qq in w">{{ qq }}</li>
    </ul>
    </div>
    
   
    <script src="jquery-3.5.0.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

    <script>

      //Vue.jsでの記載方法
      var app = new Vue({
        el: '#container',
        data: {
          w: ['月','火','水','木','金','日']
        }
      })      
      
      //jqでの記載方法
      // var w=['月','火','水','木','金','日'];
      // $('#container').append('<ul>');
      //   for(var i=0;i<w.length;i++)
      //   {
      //     $('#container ul').append('<li>'+w[i]+'</li>');
      //   }


      // var img=$('<img>');
      // img.attr('src','https://blog-imgs-114.fc2.com/r/e/l/religionofrabia/gollira.jpg')
      //     .attr('alt','写真')
      //     .appendTo("#container");
      
      //   $('#container').append(img)
    </script>

</body>
</html>
arXivのメルマガを日本語に置き換えるぞ

arXivのメルマガを日本語に置き換えたぞ。
初投稿です。

# arXiv
arXiv(アーカイブ)という論文のプレリリースサイトがある。
メルマガもある。なんて優しいんだ。

登録方法は以下の記事が詳しい。ありがとうございます。
https://qiita.com/shu-yusa/items/325f6263635825b3f727

# 日本語訳
送られてくるメールは全部英語だ。困った。
しかも長い。1万字を超えている。
タイムスタンプや著者名、ものによってはabstractも記載されている。
俺はタイトルとリンクがあればいいのに。

よし、作ろう。タイトルとリンクだけのarXiv新着論文リストを。
登録はGmailを使っているからGASで作ろう。そうしよう。

# GAS

```JavaScript:main.gs
function main() {
  // メール本文取得(あと元のメール削除)
  const main_txt = steal_mail();
  // とれなかったら終了
  if (!main_txt) return;
  // 抽出・翻訳追記
  const trns_txt = trans_elem(main_txt);
  // メール送付
  send_mail(trns_txt);
}
```

```JavaScript:sub.gs
function steal_mail() {
  // 検索
  const query = 'from:no-reply@arxiv.org after:' + Utilities.formatDate(new Date(),"JST","yyyy/MM/dd");
  const threads = GmailApp.search(query);
  // 見つからなかったら終了
  if (threads.length==0) return null;
  // 上位１件を取得
  const msg = GmailApp.getMessagesForThreads(threads)[0][0];
  // 本文
  const msg_txt = msg.getPlainBody();
  // 削除
  msg.moveToTrash();
  return msg_txt;
}

function trans_elem(main_txt) {
  // 必要な要素（論文タイトル、リンク）を抽出
  // 1論文ごとに切り分け
  var sections = main_txt.split("------------------------------------------------------------------------------");
  // 最初の前置きは削除
  sections = sections.slice(6);
  // titleとlinkを抽出
  var titles=[], links=[];
  for (var i=0; i<sections.length; i++) {
    // タイトル
    var title = sections[i].match(/Title: ([\s\S]*?)\nAuthors:/)[1].replace("\n", "");
    // リンク
    var link = sections[i].match(/\\ \( ([\s\S]*?) ,  /)[1];
    // 追加
    titles.push(title);
    links.push(link);
  }
  // titleを翻訳
  titles = LanguageApp.translate(titles.join("\n\n"), "en", "ja").split("\n\n");
  // 結合
  var ret_str="";
  for (var i=0; i<links.length; i++) {
    ret_str += titles[i]+"\n"+links[i]+"\n\n";
  }
  return ret_str;
}

function send_mail(body) {
  const recipient = 'youraddress@gmail.com'; //送信先のメールアドレス
  const subject = 'せんど　おんりー　とう　しーえす';
  GmailApp.sendEmail(recipient, subject, body);
}
```

一日かけて作った。GASは初心者だ。
Messageオブジェクトを渡すのが面倒だったのでsteal_mail関数内で削除してしまっている。メール抽出・翻訳段階でコケたらただメルマガを削除するだけのプログラムだ。
テストも溜まっていたarXivからのメール10通程度しか行ってない。
それでも使ってみたいならば18:00~19:00でのトリガ設定をおすすめする。arXivからのメールは17:00台に届くから・・
Nmap使い方

#はじめに
こちらではポートスキャニングで有名な [Nmap](https://nmap.org/man/ja/man-port-scanning-techniques.html)についての説明をさせてもらおうかとおもいます。
リファレンスをカンニングしてるとか言わないでね←

#注意！！
他人のサーバにポートスキャニングするのは攻撃とみなされる場合があるので自分のサーバで行うようにしてください。
ハサミは便利な道具にも凶器にもなる・・・


#基本
IPを指定してポートスキャンを行う

```sh
$ nmap [ip]アドレス

#ipアドレスの範囲を指定してスキャンを行うことも可能
$ nmap [ipアドレス]-[ipアドレス]
```

|ステータス　　　　　　　　|説明　　　　　　|
|:---|:---|
|open| ポートが空いている|
|close|ポートが閉じている|
|filtered|パケットフィルタがかかっておりポートが開いているか判別できない|
|unfiltered|ポートにアクセスに可能だがポートが開いているかを判別できない|
|open｜filtered |ポートが開いているかフィルタをかけられているか判断ができない|
|close｜filtered |ポートが閉じているかフィルタをかけられているか判断できない|


#オプション

|option　　　|説明   |
|:---|:---|:---|
|-sS|SYNスキャン|
|-sT|STCP connect()スキャン<br>SYNスキャンを選択できない場合のデフォルトのTCPスキャンタイプ|
|-sU|UDPスキャン|
|-sN; -sF; -sX |TCP Null、FIN、Xmasスキャン|
|-sA|ACK スキャン|
|-sW|ウィンドウスキャン|
|-sM|Maimon スキャン|
|--scanflags|カスタム TCP スキャン|
|-sI <zombie host[:probeport]>|Idle スキャン|
|-sO|IP プロトコル スキャン|
|-b <ftp relay host>|FTP バウンス スキャン|
|-p <port ranges>|指定されたポートでスキャン|
|-F|指定されたポートで高速スキャン|
|-r |ポートの指定を無作為にしない|


なんこか細かく紹介していきたいと思います。

##-sS
SYNスキャン。ステルススキャンとも呼ばれる
SYNパケットを送信してするだけで接続を確率させないのが特徴
その都合上相手にログがのこらない
だがFWにはログ残る場合がある。

##-sT
ターゲットに対して3ウェイハンドシェイクを行ない、成功したらポートが生きていると判断する方法。
3ウェイハンドシェイクをする都合上ログが残りやすい



#まとめ
いかがだったでしょうかこのツールは問題解決するための道具として使うには便利ですがそれは危険な使い方もできるということでもあるということを意識して使ってください
Apex Replay Debuggerでのデバッグの流れ

Trailhead「Find and Fix Bugs with Apex Replay Debugger」を実施してみて、覚えきれそうもなかったデバッグ操作の流れ・SFDXコマンドを抜粋して備忘メモとしてまとめて置きます。


## 操作の流れ
### チェックポイントの設定
`sfdx checkpoint` と検索ボックスに入力して下記コマンドを実行

```
SFDX：Toggle Checkpoint
```

* ブレークポイントはいくつでも設定できるが、一度に設定できるチェックポイントは5つまで

### 組織のチェックポイントを更新
`sfdx checkpoint` と検索ボックスに入力して下記コマンドを実行

```
SFDX: Update Checkpoints in Org
```

* Apexコードを変更するか、チェックポイントを切り替えた場合は、このコマンドを再度実行して同期を維持する

### Replay DebuggerのApexデバッグログをオンにする
`sfdx replay` と検索ボックスに入力して下記コマンドを実行

```
SFDX: Turn On Apex Debug Log for Replay Debugger
```
* 作成されるトレースフラグの有効期間は30分


### デバッグレベルの変更(必要に応じて)
SFの設定画面からApexコード・VisualforceのログレベルをFinestにしておく



### テストクラスを実行
`apex test` と検索ボックスに入力して下記コマンドを実行し、任意のテストクラスを選択

```
SFDX：Invoke Apex Tests ...
```

### デバッグログの取得
`sfdx get` と検索ボックスに入力して下記コマンドを実行

```
SFDX：Get Apex Debug Logs ...
```

### Apexデバッグログの再生
* `.sfdx/tools/debug/logs` 内のログを開く
* 開いたログ内の任意の行を右クリックして `SFDX：Launch Apex Replay Debugger with Current File` を選択

## 参考

* [Trailhead デバッグ操作のモジュール](https://trailhead.salesforce.com/ja/content/learn/projects/find-and-fix-bugs-with-apex-replay-debugger/apex-replay-debugger-debug-your-code)