OmniAICreator/Qiita-1.07M huggingface dataset:
VSCodeでJARファイルからライブラリを読み込む方法《Maven/Gradleを使わない方法》

Javaで軽くプログラミングをしたくて、ビルドツールをセットアップするのは面倒な場合に直接JARファイルを読み込みたいときのための忘備録。

２０２０年４月のVSCode Java Extensions Packの[アップデート](https://github.com/microsoft/vscode-java-pack/blob/master/release-notes/v0.9.0.md#work-with-jar-files-directly)で、Maven/Gradleを使わずに読み込むことができるようになった。

# Java Extensions Pack
Java Extension PackはVSCodeでJavaプログラムを作成・デバッグ・テストするための拡張機能。インストールは[ここから](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack)。

# JARファイルを読み込む
左のタブで「JAVA DEPENDENCIES」の下の「Referenced Libraries」を探す。「Referenced Libraries」の横にある＋ボタンをクリックして、JARファイルを追加する。

![デモンストレーション](https://raw.githubusercontent.com/Microsoft/vscode-java-pack/master/release-notes/v0.9.0/reference-jar-files.gif)

出典：[https://github.com/microsoft/vscode-java-pack/blob/master/release-notes/v0.9.0.md#work-with-jar-files-directly](https://github.com/microsoft/vscode-java-pack/blob/master/release-notes/v0.9.0.md#work-with-jar-files-directly)

## JAVA DEPENDENCIES、Referenced Librariesが表示されない場合
なぜか分からないが表示されない場合がある。VSCode自体を再起動すれば大抵の場合は直る。

# デフォルトで読み込むライブラリの設定
VSCodeの`settings.json`で`java.project.referencedLibraries`を変更することでデフォルトを設定できる。

```settings.json
"java.project.referencedLibraries": [
    "library/**/*.jar"
]
```
【Drupal8】利用されているtwigテンプレート名を調べる

## やりたいこと
* Drupal8で、現在表示しているページがレンダリングに利用しているtwigテンプレート名を知りたい
* 利用しているtwigテンプレート名がわかれば「hook_preprocess_HOOK()」の仕組みを利用して処理に手を入れたり、twigテンプレートを上書きしてレイアウトを変更したりできる

## 方法
参考 : https://www.drupal.org/docs/theming-drupal/twig-in-drupal/locating-template-files-with-debugging

1. sites/default/services.yml を編集し、`debug: true`となるようにする。
1. キャッシュを削除
1. カスタマイズしたいページを表示する
1. ブラウザの機能で「ソースを表示」する
1. 以下のようなコメントが記述されるようになる

```
<!-- THEME DEBUG -->
<!-- THEME HOOK: 'block' -->
<!-- FILE NAME SUGGESTIONS:
   * block--system-main-block.html.twig
   * block--system.html.twig
   x block.html.twig
-->
<!-- BEGIN OUTPUT from 'core/themes/stable/templates/block/block.html.twig' -->
```

## 例：検索結果ページ
* Searchモジュールによる検索結果ページ（/search/node）をカスタマイズしたい、という場合。
* 上記の方法でソースを表示させると以下のようなコメントが見つかる

#### 検索結果（リスト）開始

```
<!-- THEME DEBUG -->
<!-- THEME HOOK: 'item_list__search_results' -->
<!-- FILE NAME SUGGESTIONS:
   * item-list--search-results.html.twig
   x item-list.html.twig
-->
<!-- BEGIN OUTPUT from 'core/themes/stable/templates/dataset/item-list.html.twig' -->
```

#### 検索結果（1件分）開始

```
<!-- THEME DEBUG -->
<!-- THEME HOOK: 'search_result' -->
<!-- FILE NAME SUGGESTIONS:
   * search-result--node-search.html.twig
   x search-result.html.twig
-->
<!-- BEGIN OUTPUT from 'core/themes/stable/templates/content/search-result.html.twig' -->
```

#### ページネーション部分開始

```
<!-- THEME DEBUG -->
<!-- THEME HOOK: 'pager' -->
<!-- BEGIN OUTPUT from 'themes/custom/{自作テーマ名}/templates/pager.html.twig' -->
```

↓
なので、自作テーマに以下の名前のtwigテンプレートを作ればHTMLコードを上書きできるはず。  

* item-list--search-results.html.twig
* search-result--node-search.html.twig
* pager.html.twig

※ 各twigテンプレートがもともとどういう内容だったのかは、ググるとソースコードが載っているページがヒットする
各モジュール間でデータを伝言ゲームのように次々と受け渡ししていかなければいけない時の対処

## アンチパターン1

必要なデータをそのまま受け渡すと、後からの変更に弱くなってしまう。

例えば、以下のようなデータを考える。

```
firstName （文字列）
lastName （文字列）
```

このデータをクラスA -> B -> C -> D -> Eを伝言ゲームのように受け渡しており、各クラス内部それぞれでもこのデータを処理に利用しているとする。

もし、このデータに以下のデータを追加すると・・・

```
age (整数)
```

A, B, C, D, E全クラスで変更が必要になってしまう。

クラス数が少ない場合（アプリケーションなどの規模が小さくクラス数が少ない場合）は、あまり問題にならないかもしれない。しかし大規模・複雑なシステムでクラス数が多い場合はかなり問題となる。

システム開発中に必要なデータが変わるなど日常茶飯事とも言える昨今ではなおの事問題である。

### 対策

データをこのように別の「決まり事」（クラス、構造体、プロトコル、インターフェースなど各言語で色々あるだろうが）で包む。

```
class Person {
   firstName （文字列）
   lastName （文字列）
}
```

こうすると、データを受け渡す時は`class Person`のみ意識すればよく、Personの中身がどんなものかは意識しなくて良い（隠蔽される）ということになる。言い換えれば、変更に対して強くなる。

#### 例: データを追加したい時

以下のようにデータの定義に変更を加える。

```
class Person {
   firstName （文字列）
   lastName （文字列）
   age (整数)
}
```

後は、`age`を利用したい箇所で変更を加えればいいだけなので、最小で二箇所のみの変更で済む。

A~Eの全クラスで変更をしなければいけなかったのとは、雲泥の差と言える。

#### 例: データを削除したい時

以下のようにデータの定義に変更を加える。

```
class Person {
   firstName （文字列）
}
```

後は、削除した`lastName`を使っていた箇所（があればそこ）で変更を加えるだけとなる。

## アンチパターン2

そもそも複数のモジュール間でデータを次々と受け渡すことは、各モジュールにとって知っておかなければならない知識が一つ増えることを意味する。そのため、必要でない場合はやるべきではない。あくまで、それら全モジュールがそのデータを必要としている場合に限る。

伝言ゲームをしたくない場合、解決策としてグローバルなところに変数を作っておき、必要なクラスだけから参照するという手もあるが、グローバルな変数の多用はそれはそれで問題がある。

いわゆるコンテキストオブジェクトを導入する手もある。ソフトウェアの状態などを保有するオブジェクトを作り、必要なクラスに対してコンストラクタを経由して渡すという形式である。やはり多用すると複雑になる恐れがあることから、コンテキストオブジェクトを保有するクラスの数はメジャーなクラスのみに限るなど何らかの制約をしたほうがいい。またコンテクストを複数箇所から参照するとスレッドセーフにしなければならないという問題もある。コンテキストオブジェクトを注入する際、刻々と変化する状態への参照を渡したつもりが、値そのものを渡してしまい、後から状態が変化しているのに当初のコンテキストオブジェクトの値をずっと見てしまうというミスがたまにあるため、言語の使用を把握し「値渡し」か「参照渡し」かをきちんと区別する。

## 参考文献

[Context Object Design Pattern – Core J2EE Patterns](https://www.dineshonjava.com/context-object-design-pattern/)
Laravelの導入方法

### 0.前提条件
下記の環境を満たす必要があります。
PHP >= 7.2.5
BCMath PHP拡張
Ctype PHP拡張
Fileinfo PHP extension
JSON PHP拡張
Mbstring PHP拡張
OpenSSL PHP拡張
PDO PHP拡張
Tokenizer PHP拡張
XML PHP拡張

### 1.composerを使ってLaravelをインストールする

#### Composer導入
```
#ダウンロードする
cd ~
curl -sS https://getcomposer.org/installer | php

#確認する
./composer.phar

#パスの通るところへ移動する
sudo mv composer.phar /usr/local/bin/composer
```

#### Laravelをグローバルにインストールする
```
# 通常の場合
$ composer global require laravel/installer

# バージョン指定する場合
$ composer global require "laravel/installer=~1.1"

# 安定版を指定する場合
$ composer global require "laravel/installer" --prefer-dist
```
#### laravelコマンドをインストール後、.bashrcにパスを通す
```
$ export PATH=$HOME/.composer/vendor/bin:$PATH
```

#### Laravelをインストールする
```
#インストールするディレクトリへ移動
cd /var/www/html

# Laravelをディレクトリにインストールする
laravel new [プロジェクトディレクトリの名前]
```
### デバッガーをインストールする
```
$ composer require barryvdh/laravel-debugbar
```

## 参考文献
【公式】Laravel 7.x インストール
https://readouble.com/laravel/7.x/ja/installation.html
forthで九九

#概要

forthで九九、やってみた。

#フロー制御

##if else then

```
: test -1 if ." ng" else ." ok" then ;
```

##do loop

```
: test 10 1 do i . loop ;
```

##begin until


```
: test -1 begin ." ok" until ;
```

#サンプルコード


```
: kuku 10 1 do 10 1 do i j * . loop cr loop ;  ok

```

#実行結果


```
kuku 1 2 3 4 5 6 7 8 9 
2 4 6 8 10 12 14 16 18 
3 6 9 12 15 18 21 24 27 
4 8 12 16 20 24 28 32 36 
5 10 15 20 25 30 35 40 45 
6 12 18 24 30 36 42 48 54 
7 14 21 28 35 42 49 56 63 
8 16 24 32 40 48 56 64 72 
9 18 27 36 45 54 63 72 81 
 ok

```

以上。
見える化、常に問題が判る。

仕事のアウトプットは見えますが、**細かい作業のやり方、やっている様は手に取って見ることは出来ません。**これは、頭脳労働も含めたホワイトカラー全般に当てはまります。
また、機械であれば異音で、その機械の調子（まもなく故障するかもしれないという予兆）が判りますが、ホワイトカラーではその主役となる**作業者・現場の人たちの調子も見えない**のです。（本当は、観察すれば様子は見えてきますが・・・）

見える化とは、この様なそのままでは見えない事を、見えるようにする行動なのです。

この見える化によって目指すのが**『自工程完結』**です。
『自工程完結』は次の二つが出来ている事です。
①自分の工程で不良を発生しない。（**発生防止**）
②不良を後工程に流さない。（**流出防止**）
です。

見える化は、**問題・異常が直ぐ分かる**様に設計して運用します。

その対象の粒度についても注意が必要です。
刻々と変化している現実世界ですから、可能な限り時間的に細かくすることをお勧めします。今までは仕事の単位でその仕事のアウトプットが出せる（仕事が終わる）までの時間を意識してきましたが、これからは、**一定の時間（Time Box）**の中でどれだけのアウトプットが出せるのか？という観点へ置き換える必要があります。
従来の仕事という単位ではなく、**仕事を構成する細かな作業レベル単位**まで分解することで、このTime Box概念へ適応出来ます。
粒度については3時件程度から始めて慣れと共に細かくしていき1時間を目標にすることをお勧めします。

先ず、現場の作業の仕方・やっている様を見えるようにします。
その時に『自工程完結』の2項の条件の異常が直ぐ分かる様に、見える化の仕組みや、ボードを設計して現場のマネジメントレベルを上げていきます。
自工程完結が出来るようになった、次には効率を上げるような工夫をしていきます。
効率を上げる為に、仕事のやり方やその仕組みを変えた時に『自工程完結』が崩れてしまっては、元も子もないのです。**効率を上げる追求をしながら『自工程完結』が維持できる作業の仕方・働き方**を求めていきます。
Ruby のメソッドでは最後に評価された値を返す

a は返らないことに注目。

```.rb
[1] pry(main)> def m
[1] pry(main)*   a = 1
[1] pry(main)*   b = 2
[1] pry(main)*   a
[1] pry(main)*   b #最後に評価された b がメソッドの戻り値
[1] pry(main)* end
=> :m
[2] pry(main)> m
=> 2 # 先に評価された a は返らない。
```
SwiftLint 0.40.0 で追加された computed_accessors_order に対応する

![SwiftLint-0.40.0 or later](https://img.shields.io/badge/SwiftLint-0.40.0 or later-brightgreen) ![Xcode-11.6](https://img.shields.io/badge/Xcode-11.6-brightgreen) ![Last Modified-2020/09/01](https://img.shields.io/badge/Last Modified-2020/09/01-brightgreen)

# はじめに

先日、SwiftLintを0.40.1にアップデートしたところ、次のwarningが大量に出るようになったので対応方法をまとめました。

> Computed Accessors Order Violation: Computed properties should declare first the getter and then the setter. (computed_accessors_order)


# 原因

SwiftLint 0.40.0で新たに追加された**computed_accessors_order**ルールが原因でした。

>Add computed_accessors_order rule to validate the order of get and set accessors in computed properties and subscripts.
Marcelo Fabri #3158
https://github.com/realm/SwiftLint/blob/master/CHANGELOG.md#0400-washable-mask

# computed_accessors_order ルールの仕様

Computedプロパティのgetter/setterの順序を一貫させるためのルールで、0.40.0からは**デフォルトで有効（getter→setterの順）**になります。

>
* **Identifier:** computed_accessors_order
* **Enabled by default:** Enabled
* **Supports autocorrection:** No
* **Kind:** style
* **Analyzer rule:** No
* **Minimum Swift compiler version:** 4.1.0
* **Default configuration:** warning, order: get_set

> https://realm.github.io/SwiftLint/computed_accessors_order.html

# 対応方法

## getter/setterの順序を統一していない場合

せっかくの機会なので、これを機にデフォルトの設定と同じgetter→setterの順で統一するのがいいと思います。
とはいえ、大量にgetter/setterがある場合は大変なので、**computed_accessors_order**を**.swiftlint.yml**の**disabled_rules**に追加することで、ルールを無効化することもできます。

```.swiftlint.yml
disabled_rules:
  - computed_accessors_order
```

## getter/setterの順序を統一している場合
### getter→setterの順
デフォルトの設定と同じ順序で統一できているため、特に何もしなくて大丈夫です。

### setter→getterの順
デフォルトの設定と逆の順序のため、**.swiftlint.yml**に**computed_accessors_order**の**order: set_get**を明示的に設定しましょう。

```.swiftlint.yml
computed_accessors_order:
  order: set_get
```

# あとがき
将来的に**autocorrection**もサポートされると嬉しいなーと思いました。[^1]
[^1]: 現時点（2020/09/01）では未サポート

技術に関して呟いているので、**[Twitter](https://twitter.com/zizi4n5)** もフォローしてもらえると嬉しいです。

# 参考情報
* [Swift Lint 0.40.0: Washable Mask](https://github.com/realm/SwiftLint/blob/master/CHANGELOG.md#0400-washable-mask)
* [Computed Accessors Order](https://realm.github.io/SwiftLint/computed_accessors_order.html)
mprotect(2) に関するメモ

## 概要

straceの結果の常連mprotectをあまり理解してなかったのでメモ

## mprotect(2)とは

mprotect(2)とはメモリ領域のアクセス許可を制御するシステムコール。

[man mprotect(2)](https://linuxjm.osdn.jp/html/LDP_man-pages/man2/mprotect.2.html)

``` 書式
#include <sys/mman.h>

int mprotect(const void *addr, size_t len, int prot);
```

ポインタとサイズとビットの論理和を渡す。

## フラグ

現在、以下の OR をとって組み合わせることが可能な保護ビット

|フラグ名   |概要              |
|---------|-----------------|
PROT_NONE |全く保護しません
PROT_READ |ページは読取り可能です
PROT_WRITE|ページは書込み可能です
PROT_EXEC |ページは実行可能です

## エラー

成功した場合、 mprotect() は 0 を返す。エラーの場合は -1 が返り、 errno が適切に設定される。  

|errno |概要|
|------|---|
|EACCES|指定されたアクセスをメモリーに設定することができない|
|EINVAL|addr が有効なポインターでないか、 システムのページサイズの倍数でない|
|ENOMEM|カーネル内部の構造体を割り当てることができなかった|
|ENOMEM|[addr, addr+len-1] という範囲のアドレスがプロセスのアドレス空間として不正であるか、 その範囲のアドレスがマップされていない 1 つ以上のページを指している |

## 使用例

READ_ONLY領域のメモリへ書き込みを行うことでSIGSEGVを発生させるサンプルプログラム。

SIGSEGV自体はsigactionを使ってハンドリングした処理を実行。

``` mprotect.c
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/mman.h>

#define handle_error(msg) \
    do { perror(msg); exit(EXIT_FAILURE); } while (0)

static char *buffer;

static void handler(int sig, siginfo_t *si, void *unused)
{
    printf("Got SIGSEGV at address: 0x%lx\n",
        (long) si->si_addr);
    exit(EXIT_FAILURE);
}

int main(int argc, char **argv)
{
    char *p;
    int pagesize;
    

    // シグナルの動作の変更
    struct sigaction sa;
    sa.sa_flags = SA_SIGINFO;
    sigemptyset(&sa.sa_mask);
    sa.sa_sigaction = handler;
    if (sigaction(SIGSEGV, &sa, NULL) == -1)
        handle_error("sigaction");

    pagesize = sysconf(_SC_PAGE_SIZE);
    if (pagesize == -1)
        handle_error("sysconf");

    // アライメントされたメモリを割り当てる
    buffer = memalign(pagesize, 4 * pagesize);
    if (buffer == NULL)
        handle_error("memalign");

    printf("Start of region:        0x%lx\n", (long) buffer);

    // メモリ領域のアクセス許可を制御
    if (mprotect(buffer + pagesize * 2, pagesize, PROT_READ) == -1)
        handle_error("mprotect");

    for (p = buffer ; ; )
        *(p++) = 'a';

    printf("Loop completed\n");     /* Should never happen */
    exit(EXIT_SUCCESS);
}
```
PythonのPillowでPNG JPG変換できるようにした

#環境
macOS Catalina 10.15.6 
python 3.8.2
pillow 7.2.0

#動機
ネット上にあるフリーの変換ソフトは回数制限があったり、セキュリティ面で不安があったりで不便に感じる事があリました。
そこでPythonで自作してみることにしました。

#仕様
前提条件、pythonプログラムと同階層にpngsとimgsというフォルダを用意。
　　pngsフォルダ...変換元の画像を入れるフォルダ
　　imgsフォルダ...変換後の画像を入れるフォルダ

このプログラムを実行することで、pngsフォルダ内にあるpng画像を一括でjpgに変換してimgsフォルダに保存する。

#コード
```
from PIL import Image
import os
import datetime

input_path = os.getcwd()
# 指定ディレクトリのファイルを取得
files = os.listdir(input_path + '/pngs')

# 取得したファイルからPNGファイルのみ取得
pngs = []
for f in files:
    if f[-4:] == '.png':
        pngs.append('pngs/' + f)

# 変数を空にする
files = None

# 出力ファイル名用に現在時刻の取得
dt_now = datetime.datetime.now().strftime('%y%m%d_%H%M%S')

# 出力ファイル名または、出力パス
output_path = 'imgs/img' + dt_now

# pngをjpgに変換する
for p in pngs:
        input_img = Image.open(p)
        output_img = input_img.convert('RGB')
        output_img.save(output_path + ".jpg",quality=40)

print("finished")
```

#終わりに
このコードはあくまで私が使いやすいように書いたものなのでそのまま使うと不都合が生じる可能性があります。なので、参考程度にお使いください。質問、訂正箇所があればお受けいたします。

#参考

Pythonの画像処理ライブラリPillow(PIL)の使い方
https://note.nkmk.me/python-pillow-basic/

容量の大きいpngファイルを、jpgファイルに変換する
https://qiita.com/hirohuntexp/items/05b7a81323dff7bdca9f

Pythonのdatetimeで日付や時間と文字列を変換（strftime, strptime）
https://note.nkmk.me/python-datetime-usage/
vistaでquartus その38

#概要

vistaでquartusやってみた。
cpuを書いてみた。
機械語モニタを作る。構想編。

#仕様

繋いだ、シリアルから＃をタイプすると、＞を返し、コマンド待ちとなる。
コマンドは、３個、以下に示す。

##s 0007 4004

0x0007番地へ、0x4004を入力する。セットのs

##d 0007

0x0007番地のデータを表示する。ディスプのd

##g 0007

0x0007番地へ、飛ぶ。ゴーのg

#実現の仕掛け

スタックの深さが８個しかないので、コマンド、アドレスとデータは、別に入力。

メモリー書き込み命令は、直接アドレシングしか持たないので、メモリーに、命令を書き込んで
実行する方法をとる。evalの様なもの。

ジャンプ命令も、同上。

モニタは、２５６より開始、0x0000番地より、jmp 0100 する。
ユーザーは、0x0001番地から0x00ff番地が使える。

呼び出したルーチンの最後は、スタックをきれいにして、jmp 0000する。

以上。
Laravel Scout の paginate が query を使用すると機能しない

## バージョン
Laravel5.4

## 問題
query を使用してオブジェクトを取得しようとするとページネーションが機能しない問題が発生します。


```php
Post::search($request->input('keyword'))->query(function ($query) {
                $query->filter();
            })
                ->paginate(50);
```


## 解決方法
初めに全文検索のみ行い、一致したレコードのIDリストを返します。

```php
$ids = Post::search($request->input('keyword'))->keys()->toArray();
Post::whereIn('id', $ids)->filter()->paginate(50);
```
AWS EC2 インスタンスにセキュリティグループを追加する

# 目的

- すでに起動しているインスタンスにセキュリティグループを後から追加する方法をまとめ

# 前提条件

- AWS EC2でAmazonLinux2インスタンスが起動していてssh接続をすることができること。

# 前提情報

- 本記事で実行するコマンドはインスタンスにssh接続を行い実行する物とする。
- 下記の方法で構築したインスタンスを元に説明を行う。
    - [AWS EC2 をMacで使ってみよう!](https://qiita.com/miriwo/items/a1ab84c098008e43d042)

# 読後感

- 既存のインスタンスにセキュリティグループを追加することができる。

# 概要

1. aws config設定
1. セキュリティグループの追加
1. 確認

# 詳細

1. aws config設定
    1. インスタンスにssh接続して下記コマンドを実行する。

        ```terminal
        $ aws configure
        ```
    1. 下記情報を入力する。
        1. `AWS Access Key ID [None]:`された時にお使いのAWSアカウントのアクセスキーを入力してEnterを押下する。
        1. `AWS Secret Access Key [None]:`が表示された時にお使いのAWSアカウントのシークレットアクセスキーを入力してEnterを押下する。
        1. `Default region name [None]: `が表示された時にリージョン名を入力してEnterをクリックする。（東京リージョンの場合はap-northeast-1となる）
        1. `Default output format [None]:`は何も入力せずEnterを押下する。
1. セキュリティグループの追加
    1. AWSのEC2のインスタンス一覧画面を開く。
    1. セキュリティグループを追加するインスタンスのインスタンスIDをメモする。

        ![インスタンス___EC2_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/a3c6ff06-c08d-ebd8-f29f-9d36e81c1086.png)

    1. セキュリティグループを追加するインスタンスの詳細情報から現在インスタンスに追加されているセキュリティグループ名を確認する。

        ![インスタンス___EC2_Management_Console-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/de7c5f3f-be74-0c26-f80b-4d67d267dc5b.png)

    1. サイドバーの「セキュリティグループ」をクリックする。

        ![インスタンス___EC2_Management_Console-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/48c84ba6-1ce8-ebd9-be9d-e5ccfcdc8950.png)

    1. 先に確認した「現在インスタンスに追加されているセキュリティグループ名」を一覧から探し、セキュリティグループIDを確認しメモしておく。

        ![EC2_Management_Console-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/9d2d7a38-5045-59aa-63b6-a915a625b2b9.png)

    1. インスタンスに追加したいセキュリティグループIDをメモしておく。（下記は筆者の環境のtestと言う名前のセキュリティグループを追加する際の例なのでセキュリティグループはみなさんとは異なる。）

        ![EC2_Management_Console-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/a46ff3fe-d9fc-e02e-6d57-4bd0cabecd65.png)

    1. 下記コマンドを実行してインスタンスにセキュリティグループを追加する。※セキュリティグループIDの記載順は関係ない。（仕様上、セキュリティグループの追加は「現在設定されているセキュリティグループに後から他のセキュリティグループを追加する」のではなく、「インスタンスに紐づくセキュリティグループを初期化して設定し直す」であることに注意する）

        ```terminal
        $ aws ec2 modify-instance-attribute --instance-id "セキュリティグループを追加するインスタンスのインスタンスID" --groups "現在インスタンスに追加されているセキュリティグループ名にリンクしたセキュリティグループID" "追加するセキュリティグループID" 
        ```
1. 確認
    1. AWSのEC2のインスタンス一覧画面を開く。
    1. セキュリティグループを追加したインスタンスの情報を確認し、セキュリティグループが実際に追加されていることを確認する。

        ![インスタンス___EC2_Management_Console-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/9cff44a4-81c3-e61a-ee1c-af0c2013e1e0.png)

# 参考文献

- [https://qiita.com/scalewallet/items/97e5b841d792ba7d6a65](https://qiita.com/scalewallet/items/97e5b841d792ba7d6a65)
- [https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-attribute.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-attribute.html)
- [https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-options.html](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-options.html)
AmazonLinux2にApache・PHP7.3をインストールする

### 1.Apache2.4のインストール
```
$ sudo yum install httpd
```
すんなりインストールできるはずです。

```
# httpdを起動
$ sudo systemctl start httpd

# 動いているか確認 ( active (running) )とか表示されるはず
$ sudo systemctl status httpd

# システム起動時に毎回起動するように設定
$ sudo systemctl enable httpd

# 確認（enabled）と表示されていば成功
$ sudo systemctl is-enabled httpd

```

### 2./var/www/html以下のフォルダをapacheグループに所属するec2-userが所有できるようにする
```
# ユーザー (この場合は ec2-user) を apache グループに追加する
$ sudo usermod -a -G apache ec2-user

# sshをログアウトし、再度sshログインしてください
$ exit
```
```
$ groups
ec2-user adm wheel apache systemd-journal

# /var/www とそのコンテンツのグループ所有権を apache グループに変更する
$ sudo chown -R ec2-user:apache /var/www

# グループの書き込み許可を追加して、これからのサブディレクトにグループ ID を設定する
$ sudo chmod 2775 /var/www && find /var/www -type d -exec sudo chmod 2775 {} \;

# グループ書き込み許可を追加するために、/var/www とサブディレクトリのファイル許可を再帰的に変更する
$ find /var/www -type f -exec sudo chmod 0664 {} \;
```
### 3.PHP7.3のインストール
```
# amazonのリポジトリを調査する
$ amazon-linux-extrasbled httpd

# php7.3の詳細を確認する
$ amazon-linux-extras info php7.3

# php7.3インストールコマンド
$ sudo amazon-linux-extras install php7.3

# 拡張モジュール一覧を表示する
$ yum list php* | grep amzn2extra-php7.3

# 拡張モジュールインストール
$ sudo yum install php-cli php-common php-devel php-fpm php-gd php-mysqlnd php-mbstring php-pdo php-xml

```
### 4.php.iniの設定
```
# 失敗した時のためにバックアップを取っておく
$ sudo cp /etc/php.ini /etc/php.ini.default

# viでファイルを開いて編集（保存は同じく:wq）
$ sudo vi /etc/php.ini
```

``` php.ini
# HTTPヘッダにPHPのバージョンを記載しない
# expose_php = On
  expose_php = Off

# メモリ上限を引き上げる
# memory_limit = 128M
  memory_limit = 512M

# エラーログのパスを変更
# error_log = errors.log
  error_log = /var/log/php_errors.log

# POST送信の許容サイズを引き上げる
# post_max_size = 8M
  post_max_size = 16M

# アップロードファイルの許容サイズを引き上げる
# upload_max_filesize = 2M
  upload_max_filesize = 8M

# timezoneの設定
# date.timezone =
  date.timezone = Asia/Tokyo

# 文字コード検出のデフォルト値を定義
  mbstring.detect_order = auto
```

### 5.Apacheのバーチャルホストの設定
```
#設定ファイル作成
$ sudo vi /etc/httpd/conf.d/vhost.conf
```

``` vhost.conf

# 下記のようにバーチャルホストを作成する
<VirtualHost *:80>
  ServerName www.example.jp
  DocumentRoot /var/www/back/www.example.jp

  <Directory "/var/www/back/www.example.jp">
    Options Indexes FollowSymlinks
    AllowOverride All
    Require all granted
  </Directory>
</VirtualHost>
```

```
# httpdを再起動
$ sudo systemctl restart httpd
```
RFID、OMR、Bluetooth、IrDAの活用事例

応用情報技術者平成30年春期 午前問20

RFIDの活用事例として，適切なものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/0756e4d5-2c81-128b-14aa-9e23d9b62b9d.png)


１、RFID(Radio Frequency IDentification)は、
ID情報を埋め込んだRFタグ(ICタグ)と電磁界や電波を用いることで、数cm～数mの範囲で情報のやり取りを行う技術です。

特徴として「見えなくても読める」ことが挙げられ、RFタグが目に見えない隠れた位置にあっても、タグ表面がホコリ、泥などで汚れていても読み取り可能です。この利点を活かし 乗車カード（Suica, PASMOなど）以外に、電子荷札や野生動物の調査，家畜の管理などに利用されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/9f6378d1-4d8e-8525-caea-f38dc70edab0.png)


２、OMR(Optical Mark Reader，光学式マーク読取装置)やバーコードリーダの活用事例
紙に印刷されたディジタルコードをリーダで読み取ることによる情報の入力

・OMRとは、「optical mark reader」の略で、マークシート用紙を読み取る、光学式マーク読み取り装置のこと。 主に、大学入試などの選択試験や、アンケート調査など、大量の情報を処理する際に使用される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/d90a17e8-2dbc-2c77-b2a3-1681a2c94477.png)


３、Bluetoothの活用事例
携帯電話とヘッドフォンとの間の音声データ通信

・Bluetoothとは、近距離無線通信の規格のひとつ。 パソコンやスマートフォンといった情報機器やオーディオ機器などを無線で接続し、機器間で音声やデータをやり取りすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/24494006-cc9f-88c4-c606-1ed73e54e56d.png)


４、IrDA(Infrared Data Association)の活用事例
赤外線を利用した近距離データ通信

・IrDA（アイアールディーエイ、Infrared Data Association）は赤外線による光無線データ通信を規格化している団体であり、またその規格そのものの名称である。特に規格に関しては、 IrDA DATA と呼ぶ。


補足
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
RFIDとIrDAの違いは？そしてBluetoothは？


１、RFIDとは
RFID（Radio Frequency IDentification）をwikiで調べると「ID情報を埋め込んだRFタグから、電磁界や電波などを用いた近距離（周波数帯によって数cm～数m）の無線通信によって情報をやりとりするもの、および技術全般を指す」とあります。

もうちょっと簡単にすると「電波を用いてRFタグ（以前はICタグと呼ばれていた）を読み書きする読取機や書込み機などを含めたシステムの総称」がRFIDと呼ばれるようですね。

２、IrDAとは
先ほどのRFIDがシステムの総称であったのに対し、IrDAは「無線インターフェース」のことです。

無線インターフェースとは入出力インタフェース（USBやSATAなど）の一種で周辺機器との接続にケーブルを使用しない、無線で通信するタイプのものです。

無線インタフェースの中でIrDAは、赤外線を使って無線通信を行う規格で、携帯電話やノートパソコンなどの情報のやり取り用に使われていました。昔は携帯電話同士をIrDAで繋いで画像交換してたりしましたね（古い…）。

赤外線なので、通信先との間の直線に障害物があると通信ができず、更に距離も1m程度です。


３、Bluetoothとは？
こちらは2.4GHzの電波を使って無線通信を行う規格です。IrDAと同様に携帯電話やノートパソコンなどの情報のやり取りに使われています。

この規格の良いところは、機器間に障害物があっても通信ができ、通信距離も10m程度あるので、デバイス間の通信に非常に適してます。身近なものだと、キーボードやマウス、プリンタ、ワイヤレスイヤホンなどで便利に利用されていますね。

WiFiに比べて消費電力が低いのが良い点ですが、通信速度はWiFiに比べると遅く、最大で24Mbpsのようですね。


ーーーーーーーーーーーーーーーーーーーーーーーー
RFIDのパッシブ方式RFタグの説明として，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/5f4f0c35-c8eb-c97f-90d6-8c5ffab70dfc.png)

１、RFID(Radio Frequency IDentification)は、ID情報を埋め込んだRFタグ(ICタグ)から電磁界や電波を用いて情報のやり取りを行うための技術です。RFタグは電池の内蔵の有無によって「パッシブタグ」と「アクティブタグ」に分類されます。

https://qiita.com/lymansouka2017/items/5de25acd508b9944f00d

・パッシブタグ(受動タグ)
　電池を内蔵せず、リーダ／ライタが発信する電波をエネルギー源として利用して駆動するタグ。リーダ／ライタの電波の一部を反射するときにID情報をのせて返すことで自身の電力で電波を発信しなくとも情報をやり取りすることができる。交信範囲は広くても数十センチメートルという制限があるが安価(10円以下)に製造できる。

・アクティブタグ(能動タグ)
　電池を内蔵し、自らの電力で電波を発信するタグ。交信範囲は数十メートルから数百メートルと広いがパッシブタグと比較すると価格が高い。


参照：
https://qiita.com/lymansouka2017/items/5de25acd508b9944f00d

https://www.fe-siken.com/kakomon/23_aki/q24.html

RFIDリーダーの種類
https://imagers.co.jp/contents/197/

RFIDとIrDAの違いは？そしてBluetoothは？
https://itmanabi.com/rfid-irda-bluetooth/

画像は、From　Internet
vSphere 電源ONのVMの数を数える、再起動

#リソースプール別、ホスト別に数える
<pre>
$vm = Get-VM -Location (Get-resourcepool test07) | Where { $_.PowerState -eq "PoweredOn" } ; $vm.count
$vm = Get-VM -Location (Get-VMHost esxi04.vsphere.local) | Where { $_.PowerState -eq "PoweredOn" } ; $vm.count
</pre>


#ループを回す方法 PoweredOnのみをカウント
<pre>
$respool   = Get-ResourcePool test07
$vmlist    = Get-VM -Location $respool
$guestlist = Get-VMGuest $vmlist

$PoweredOn=0
for ($i=0; $i -lt $guestlist.count ; $i++){
  if( $vmlist[$i].PowerState -eq "PoweredOn" ){
    $poweredOn++
  }
}
echo $PoweredOn
</pre>



#電源ONのVMをリストアップ　リソースプール別　ホスト別
<pre>
Get-VM -Location (Get-resourcepool test07 ) | Where { $_.PowerState -eq "PoweredOn" } | foreach { echo $_.name}
Get-VM -Location (Get-VMHost esxi01.vsphere.local) | Where { $_.PowerState -eq "PoweredOn" } | foreach { echo $_.name}
Get-VM -Location (Get-VMHost esxi01.vsphere.local) | Where { $_.PowerState -eq "PoweredOn" } | Get-vm
</pre>



#ついでに、電源ONのVMをリスタート
<pre>
Get-VM -Location (Get-resourcepool test09) | Where { $_.PowerState -eq "PoweredOn" } | Restart-VMGuest
電源に関係なくリスタート
Get-VM -Location (Get-VMHost esxi01.vsphere.local ) | Restart-VMGuest
</pre>



#filterを使って数える　時間かかる（未テスト）
<pre>
$vm = get-view -viewtype virtualmachine -filter @{"name"="test07"} ; $vm.count
</pre>
Vim メモランダム

***
ドットインストールの学習メモです
***

#vimのモード

##ノーマルモード
ここからいくつかのモードに入れる

##入力モード
ノーマルモードで  i  を入力。　insert
escでノーマルモード

##コマンドモード
: を入力。　command
escで戻る。

##ヴィジュアルモード
v　を入力。　visual
選択するモード。
escで戻る。



#ファイルの保存、読み込み

- :q
- :w
- :q!
- :e 他のファイル

#移動をマスター
**ノーマルモードで使える**
- gg 先頭にいく
- G　最後にいく
- ctrl + f　一画面下
- ctrl + B　一画面上
- w 単語単位で進む
- b　単語単位で戻る
- ^ 行頭にいく
- $ 行末にいく
- f + 行きたいキャラクタ　(f + u == uniqまでなど ;で次の候補)
- {の上で％を押すと対応捨}まで飛んでいってくれる。

#ヴィジュアルモード

###vキー
文字単位で選択できる。

##Vキー shift + v
行単位で選択できる。

##ctrl + v 
矩形選択。

## gg + ctrl+v + shift+g
全選択となる。

#カット、コピー、ペースト

###カット
ノーマルモード
###x
一文字単位
###dd
行単位
###3dd
３行まとめて

###ペースト
p

###コピー
yy
3yyなども可

#検索

ノーマルモードで/
##/  文字
下方向に検索したいときは n
上方向に検索したいときは N

###* , # 今カーソルがある単語を検索
＊ 下に検索
＃　上に検索

#置換
ノーマルモードからコマンドモードへ :

###: s/state/State   など substitute
###: s/state/State/g 行内の該当全て

###: %s/state/State/g ファイル全体で置換
###: %s/state/State/gc いちいち確認を求める confirm

#捜査の取り消し undo, redo

- undo u
- redo ctrl + r

#ウィンドウの分割
ノーマルからコマンドモードへ。:

###:sp splitの意　上下に分割
 ctrl+w の後に　wで下のウィンドウにいく。
:e 他のファイル　で他のフィアルを開ける。

###:vs virtical split 左右の分割

###いらなくなったウィンドウは　:close で閉じる


#タブを使ってみよう
###:tabnew で新しいタブを作れる
###:tabe ファイル名　ファイルを指定してタブを開ける
### ノーマルモードで gc でタブの切り替え　go to next tab?
###:tab close でタブを閉じる
### vim -p ファイル1　ファイル2　でタブを開いた状態で始める
### :tabdo 開いてる全てのタブで置換したい場合
;tabdo %s/html/HTML/g など

#直前の操作を繰り返す
3dd 

###ノーマルモードで.ピリオド
同じ操作を繰り返す

#インデントを揃える　＝
###全体を揃えたい　 gg + shift+v + shift+g の状態で = 。

#補完機能 ctrl + n
![スクリーンショット 2020-09-01 9.11.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595730/4acd904c-e2e1-b83d-844a-958f24ff42ef.png)

#矩形選択後に編集　複数行の頭に何か入れたい場合など

- ノーマルモード　ctrl + vで矩形選択
- shift + i で挿入モードに入る
- 入れたいものを入れて　esc出戻ると反映されている。
- ctrl + vの後に　xをすれはまとめて消せる。


#テキストオブジェクト　titleタグに囲われたテキストなど・・・

###ノーマルモード　＋　cit　　　タグの中身を削除して挿入モード

- c  change:delete　and insert. c/d/yから一文字めを選ぶ。
- i  i:inner or  a:all
- t  t:tag  or " or { or ....　タグか""か{}かを選べる。

cat： タグ全体を削除して、挿入モード
ci" "utf-8"などを　""として中身の挿入モード

#便利な設定  

###:set number 行番号の表示
:set nonumber　で消える
###:syntax on　色分けの表示
:set syntax off で消える
###:set tabstop タブの文字数を規定
###:set ignorecase 検索の大文字小文字を区別しない
:set noignorecaseで消す。
ページング方式の仮想記憶ーページフォールト、ページアウト、ページイン

応用情報技術者平成30年春期 午前問19

ページング方式の仮想記憶における主記憶の割当てに関する記述のうち，適切なものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/1ebb32be-5923-c5d6-263c-35c84c1b33a3.png)

１、ページング方式とは、仮想アドレス空間を「ページ」と呼ばれる固定長の区画に分割、同時に主記憶上も同じように固定長に分割して、このページ単位で主記憶と補助記憶装置のアドレス変換を行う仮想記憶管理方式です。

２、ページング方式の仮想記憶において、プログラムの実行に必要なページが主記憶（実メモリ）上に存在しない場合、下記流れで処理します：
　１）、システムは「ページフォールト」という割込みを発生させます。
　２）、ページフォールトが発生すると、主記憶と仮想記憶間でページの入替えが行われます。
　　この入替え動作において、
　　　２）ー１、主記憶から仮想記憶にページを退避することを「ページアウト」、
　　　２）ー２、仮想記憶から主記憶にページをロードすることを「ページイン」といいます。

・ページフォールトとは、
ページング方式の仮想記憶（仮想メモリ）において、プログラム（プロセス）がアクセスしようとした仮想メモリ領域（ページ）が物理メモリ上に無く、ストレージに退避していることが分かったときに発生する例外あるいは割り込み処理。



下記注意点があります：
・主記憶の空きが存在しない場合には、ページ置換えアルゴリズムに従って主記憶上の使用されていない部分をページアウトさせ、その空いた領域に必要なページをページインするので、プログラムの終了を待つことはありません。

・1つのプログラムに割り当てられる主記憶容量は、プログラムの進行によって増減します。

・プログラムの実行開始時には、全てのページが仮想記憶にマッピングされるため、どのページにも主記憶領域は割り当てられません。データ領域・コード領域にかかわらず、全てのページはページフォールトを契機に主記憶にロードされますので、プログラムの開始時にはページフォールトが連続して発生することになります。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
補足

仮想記憶方式に関する記述のうち，適切なものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/01e2ccdc-9887-a149-4c83-e6629eaa735f.png)

１、
・アドレス変換をインデックス方式で行う場合は，主記憶に存在する全ページ分のページテーブルが必要になる。
　→×。インデックス方式では、小さなページテーブルをいくつか使って使用中の仮想空間の領域だけをカバーし、本当に必要なときだけ追加のページテーブルを作成する多段ページテーブルを用いるので、必要となるのは最低限のページテーブルだけで済みます。

・ページフォールトが発生した場合は，ガーベジコレクションが必要である。
　→×。ページフォールトが発生した場合は，置換え対象を決定した後、ページアウト／ページインが行われます

・ページングが繰り返されるうちに多数の小さな空きメモリ領域が発生することを，フラグメンテーションという。
　→×。ページングでは固定長の単位で行われるため、フラグメンテーション(メモリの断片化)は発生しません。


参照

https://www.ap-siken.com/kakomon/28_haru/q18.html


https://www.ap-siken.com/kakomon/30_haru/q19.html

ページ置換えアルゴリズム　LRU、LFU、FIFO
https://qiita.com/lymansouka2017/items/85de9f37c766d3461465
Flaskを使ったslack Oauth認証を実装しました

インターンでslackのOauth認証を実装する機会があったのでまとめておきます。

##そもそもOauth認証って？
https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be
これを見れば理解できるはずです。
要はAPIの中でも全然知らない人にみられては困るような情報もあるから、それらに関してはアクセストークンってゆうものを持ってるユーザーだけAPIを使えるようにしよーと。で、そのアクセストークンを貰うところが~~Oauth認証~~Oauthというイメージ。

↓コメントの引用

- OAuth=「APIアクセスを要求する側」と「APIアクセスを提供する側」でアクセストークンのやりとりとAPIアクセスの仕組み
- OAuth認証=「APIアクセスを要求する側」が取得したアクセストークンアクセストークンで利用できるAPIでユーザー情報をもらい、そのユーザー識別子などを用いて自サービスの認証処理を行うこと

##SlackのOauth認証
公式doc
https://api.slack.com/authentication/oauth-v2
flaskでslack Oauth
https://qiita.com/izso/items/82b83ec729ad10965a71

これらの記事を参考にさせていただきました。
アクセストークンが欲しかったら、ユーザーに許可をもらってokだったらアクセストークンを貰えます。
qiitaの記事ではbotトークンのみ貰えるようになっていました。
userトークンでしか使えないAPIもあるようなので、そんな時はbotトークンと同じようにuser_scopeを渡せばok。

```python
return f'<a href="https://slack.com/oauth/v2/authorize?scope={ bot_scope }&user_scope={ user_scope }&client_id={ client_id }&state={ state_string }"><img alt=""Add to Slack"" height="40" width="139" src="https://platform.slack-edge.com/img/add_to_slack.png" srcset="https://platform.slack-edge.com/img/add_to_slack.png 1x, https://platform.slack-edge.com/img/add_to_slack@2x.png 2x" /></a>'
```
アクセストークンを貰えれば、そのままAPIを叩きに行きます。
ちなみにDMの取得は以下のAPIを利用しました。
https://api.slack.com/methods/conversations.history
CakePHP3の導入方法

### 0.前提条件
下記の条件が必要です。
・PHP 5.6.0 以上
・PHP拡張モジュール
　mbstring
　intl
　simplexml
・MySQL 5.1.10 以上

### 1.composerを使ってcakephp3をインストールする

#### Composer導入
```
#ダウンロードする
cd ~
curl -sS https://getcomposer.org/installer | php

#確認する
./composer.phar

#パスの通るところへ移動する
sudo mv composer.phar /usr/local/bin/composer
```

####CakePHP3をインストールする
```
#CakePHP3をインストールするフォルダへ移動する
cd /var/www/html

#CakePHP3.8をバージョン指定してインストール
#バージョン指定しない場合、最新版のCakePHP4 がインストールされるので注意
composer create-project --prefer-dist cakephp/app:3.8.* [プロジェクトディレクトリの名前]
```
途中で質問がされる場合は「Y」を入力して進めてください。

ApacheやnginxなどのWebサーバを設定して起動していれば、
CakePHP3インストール後にサイトURLにアクセスするとCakePHP3の画面が表示されています。
これでインストール完了です。
「実践Rustプログラミング入門」に入門する(2日目)

pp.144 - 150
# p.148 サードパーティ製クレートclapを使用する場合
本記事作成時点でも3系は[clap@3.0.0-beta-1](https://github.com/clap-rs/clap)。2.x系は、[2.33.3](https://docs.rs/clap/2.33.3/clap/)のドキュメントが見つかった。
なので、`cargo add clap@3.0.0-beta.1`でclapをcargoに追加できる。
実行すると、Cargo.tomlに以下が追加される。

```Cargo.toml
[dependencies]
clap = "3.0.0-beta.1"
```

VSCodeでのコードフォーマットのショートカットは`Alt+Shift+F`。
引数を指定して実験する。
![20200901_Qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/a6f52e3e-e465-c4cb-4ddf-a308c530525c.png)
[virtualbox]CentOS7でyum updateした際に[ Could not retrieve mirrorlist ]が出た際の対処

## virtualboxでCentOS7をインストールした際

以下のエラーが出た時

```
Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock error was
14: curl#6 - "Could not resolve host: mirrorlist.centos.org; 不明なエラー"


 One of the configured repositories failed (不明),
 and yum doesn't have enough cached data to continue. At this point the only
 safe thing yum can do is fail. There are a few ways to work "fix" this:

     1. Contact the upstream for the repository and get them to fix the problem.

     2. Reconfigure the baseurl/etc. for the repository, to point to a working
        upstream. This is most often useful if you are using a newer
        distribution release than is supported by the repository (and the
        packages for the previous distribution release still work).

     3. Run the command with the repository temporarily disabled
            yum --disablerepo=<repoid> ...

     4. Disable the repository permanently, so yum won't use it by default. Yum
        will then just ignore the repository until you permanently enable it
        again or use --enablerepo for temporary usage:

            yum-config-manager --disable <repoid>
        or
            subscription-manager repos --disable=<repoid>

     5. Configure the failing repository to be skipped, if it is unavailable.
        Note that yum will try to contact the repo. when it runs most commands,
        so will have to try and fail each time (and thus. yum will be be much
        slower). If it is a very temporary problem though, this is often a nic
        compromise:

            yum-config-manager --save --setopt=<repoid>.skip_if_unavailable=true

Cannot find a valid baseurl for repo: base/7/x86_64
```

## 設定

```
vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
==========
変更
PEERDNS="no"　#yesから変更

追加
NM_CONTROLLED="no"
==========
```

```
vi /etc/resolv.conf
==========
変更
nameserver 8.8.8.8
==========
```

```
service network restart
```
よく使うgitコマンド

よく使うgitコマンドのまとめ
随時追加していく


## グラフ形式でコミットログを出す
グラフ形式でいろいろ見やすいように出す
`git log --oneline --graph --remotes --tags --branches`

## あるコミットの差分を出力する
`git show commithash123`

## 差分のあるファイル名のみ表示する
たとえばmasterからHEADまでの差分があるファイル名一覧を取得するには
`git diff master --name-only`
業務未経験のWeb開発初心者が、まず知っておくべき10箇条

# 概要

学校や趣味でプログラミングをやってきた方が、業務としてWeb開発をする際に必要最低限の知識をすべて持ち合わせているとは限らないです。
プロのスタート地点に立つ上で、以下10個ぐらいは全部知っておいてほしいなと思うものです。

## コーディングスキル

### 1. ローマ字や無意味な変数名・関数名を付けない

意味のある変数名や関数名は適切な英語にしましょう。

```js:NG例
const hensu = 0;
const a, b, c;
```

### 2. ネストを無意味に深くしない

```js:NG例
if (x) {
  if (y) {
    if (z) {
      hoge();
    }
  }
}
```

可読性や保守性が低下するため、ネストはできるだけ深くならないようにしましょう。
深いネストはそもそも1つの関数でやるには重すぎることも多いので、別の関数に切り出す等の工夫を。

### 3. コメントは何をやっているかではなく、何故やっているかを書く

```js:NG例
// 計算する
hoge();
// xがfugaの時に処理する
if (x == "fuga") {
```

プログラミングの授業では「コメントは適切に入れなさい」と教えられても、どんなコメントをすべきかをしっかり教えられていないケースもあります。
業務では大人数で保守運用していくはずなので、何をやっているかは見ればわかるので、なぜその処理をしているのか理由を記載した方が良いです。

名著である「リーダブルコード」の一読をオススメします。

## コーディングでのマナー

### 4. 思考停止で『コメントアウトでとりあえず残す』ことはしない

```js:NG例
/* いつか使うかもしれないのでコメントアウト
if (x) {
}
...
*/
```

今どきgitでバージョン管理していないなんてことはまず無いと思います。
その場合、「いつかまた使うかもしれないから」と、不要なコードをとりあえずコメントアウトで残しておくのは避けるべきです。

そういったソースコードはほぼ永久に残り続けて保守性を下げます。
コードを読み書きしている時にも邪魔ですし、使用箇所をgrepした時に引っかかったりすると迷惑でしかないです。

gitでは簡単に過去バージョンに戻せるので、近いうちに確実に復活するソースコードでない限りは消してしまいましょう。

## コーディング以外の開発マナー

### 5. スクレイピングは1アクセス最低1秒は空ける

スクレイピングで情報を取得することもあるかと思いますが、一気に大量のアクセスをして取得すると相手サーバに負荷をかけることになります。
一般的には、最低でも1アクセス1秒を空けることがマナーとされています。

とはいえそれを守っていれば完全にOKというわけでもなく、過去には事件となっているものもあります。
スクレイピングにおいて非常に有名なこの事件は、Webエンジニアであれば知っておくべきものです。
[岡崎市立中央図書館事件 - Wikipedia
](https://ja.wikipedia.org/wiki/%E5%B2%A1%E5%B4%8E%E5%B8%82%E7%AB%8B%E4%B8%AD%E5%A4%AE%E5%9B%B3%E6%9B%B8%E9%A4%A8%E4%BA%8B%E4%BB%B6)

### 6. テストメール

開発中に登録するダミーのメールアドレスは、example.comやexample.org等を使いましょう。
適当な文字列@gmail.comや@test.com等をついつい使いがちですが、そのメールアドレスが実在した場合、誤ってメールが送られて迷惑を掛けることがあります。
また、送られる内容によっては機密情報の漏洩にもなりかねないので要注意です。

example.com等は開発用に確保されているドメインです。
[example.com - Wikipedia](https://ja.wikipedia.org/wiki/Example.com)

## パフォーマンス、セキュリティ的なもの

### 7. N+1問題に注意する

ORMを通じてデータを一覧取得し、ループ処理をした際に関連モデルを事前に読み込んでいない場合等に発生します。
本来SQL1本で済むはずが、1行データ表示ごとに1本流れて、結果として不要な大量のSQLが流れることになります。

発生しても（よっぽど件数が多くない限りは）ページが重くなるだけでエラーが発生しないので気付きづらいです。
Ruby on Railsの開発ならbulletというGemで検知できるので、利用してみると良いかもしれません。
https://github.com/flyerhzm/bullet

### 8. CSRF対策を理解する

詳細は割愛しますが、CSRF対策が十分でない場合、意図しないフォーム送信等のトラブルを引き起こすアタックを受ける可能性があります。
基本的にWebフレームワークであればフォーム送信時にCSRF対策用のトークンが自動的に埋め込まれてCSRF攻撃を防ぐ仕組みになっていますが、しっかり理解せず「フォームがうまく動かないから」とCSRFプロテクションを外したりしないようにしましょう。

### 9. XSS対策を理解する

こちらも詳細は割愛しますが、エスケープ処理が不十分といった理由で不正なスクリプトを実行される攻撃です。
Cookieが盗まれる等の影響が出る可能性があります。

XSSとCSRFはこちらの記事が分かりやすいです。
[3分でわかるXSSとCSRFの違い
](https://qiita.com/wanko5296/items/142b5b82485b0196a2da)

よくある手法としては、クエリ文字によって検索するページにおいてcookieを別サイトへ送信するアタックです。
エスケープ処理が不十分（<や&）なことで起きるため、エスケープ処理は怠らないようにしましょう。

### 10. SQLインジェクション対策を理解する

Ruby on RailsのActive Recordの例

```rb:NG例
.where("title = #{title}") # ダメ
.where("title = " + title) # こっちもダメ
```

```rb:OK
.where("title = ?", title) # OK
.where(title: title) # こっちでも
```

これも知らないと結構やってしまいがち。
Railsに限らず、他の言語やFWでも同様のことをやってはいけません。
任意のSQLを実行できる脆弱性を付かれて、DBを消されたり個人情報を盗まれる等のリスクがあります。

とりあえず覚えておくべきなのは、SQLの中に式展開や文字列結合をしないこと。
パラメータに`;`を入れられて任意のSQLを実行させることが可能な場合があるためです。
Dockerでfor db  Cannot start service db: Ports are not available: listen tcp 0.0.0.0:5432: bind: address already in useとなるエラーについての解決策

#エラー#
jupyterをDockerで動かそうと思った際に、以下のようなエラーが出て起動できませんでした。

```terminal:terminal
ERROR: for db  Cannot start service db: Ports are not available: listen tcp 0.0.0.0:5432: bind: address already in use
ERROR: Encountered errors while bringing up the project.
```

エラーメッセージを読むと、5432のPort番号が使われてしまっていて起動できないということでした。

##解決策##

まずポートを占領しているアプリケーションを特定します。
今回の場合は、5432なので以下で実行していきましょう。

```terminal:terminal
$ sudo lsof -i : 5432
Password:
COMMAND  PID     USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
postgres 124 postgres    4u  IPv6 0xda3bd3018b955b25      0t0  TCP *:postgresql (LISTEN)
postgres 124 postgres    5u  IPv4 0xda3bd3018b95cb95      0t0  TCP *:postgresql (LISTEN)

```
Passwordの際に自分が設定しているパスワードを入力したらこれらのメッセージが出てきました。postgresが起動していて、Dockerが動かなかったみたいですね。ではこれを停止していきます。

```terminal:terminal
$ sudo kill 124
```
ここで間違えて5432としないようにしてください。killする番号はPIDという部分の124です。
これで再度動かしてみると、できました。
ECS（Node.js + TypeScript）からAWS DynamoDBから最新のデータを1件のみ取得するまで

バッチ処理をNode.js + TypeScriptで作成しており、そのバッチをECS on Fargateで起動しAWS DynamoDBから最新のデータを1件のみ取得する方法を紹介します。

その中でハマったポイントがいくつもあったため、同じ轍を踏むことがないようポイントをまとめておきます。

## TL;DR

```typescript
import * as AWS from 'aws-sdk';
import { DocumentClient } from 'aws-sdk/clients/dynamodb';

AWS.config.credentials = new AWS.ECSCredentials({
  httpOptions: { timeout: 5000 }, // 5 second timeout
  maxRetries: 10, // retry 10 times
});

const dynamodb = new AWS.DynamoDB();

(async () => {
  const params: DocumentClient.QueryInput = {
    TableName: "Hoge",
    KeyConditionExpression: "Code = :number",
    ExpressionAttributeValues: {
      ":number": { "N": "1111" }
    },
    ScanIndexForward: false,
    Limit: 1
  };

  const data = await dynamodb.query(params, (err, data) => {
    if (err) {
      console.log("Error", err);
    } else {
      console.log("Success", data);
    }
  }).promise();

  console.log(data.Items[0].hoge.S);
})();
```

## ECSからDynamoDBへアクセスする方法

### 事前準備

事前にECSに付与するためのIAMロールを作成し、DyanamoDBへの権限を有したポリシーをアタッチしておきます。

次にECSのタスク定義、もしくはタスク実行時にタスクロールに先程作成したIAMロールを付与します。

### プログラム

```typescript
AWS.config.credentials = new AWS.ECSCredentials({
  httpOptions: { timeout: 5000 }, // 5 second timeout
  maxRetries: 10, // retry 10 times
});
```

## 最新の1件を取得するQuery

始めは[DocumentClient](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html)を利用していましたが、<font color="red">どうやっても上手くいかず最終的にはDocumentClientを使わない方法</font>に落ち着きました。

※ schemaの不一致とエラーになる

```
(node:1) UnhandledPromiseRejectionWarning: ValidationException: One or more parameter values were invalid: Condition parameter type does not match schema type
```

**※未だに原因がわかっていないので、コメント頂けると嬉しいです**

パラメータの型には`DocumentClient.QueryInput`を指定します。

この辺はググっても全然情報が出なかったので、sdkのGitHubから引っ張ってようやくわかりましたが、どこかに載ってるのかな？？🤔
https://github.com/aws/aws-sdk-js/blob/master/lib/dynamodb/document_client.d.ts

最後に最新の1件のみを取得する方法ですが、**Sort Keyが設定されている状態で`ScanIndexForward: false`を指定する**と降順でデータを取得できます。

さらに`Limit: 1`を指定して、1件のみ取得することが可能です。

```typescript
const params: DocumentClient.QueryInput = {
  TableName: "Hoge",
  KeyConditionExpression: "Code = :number",
  ExpressionAttributeValues: {
    ":number": { "N": "1111" }
  },
  ScanIndexForward: false, // 降順（新しい順）
  Limit: 1 // 1件のみ
};
```

ちなみにDynamoDBのNumber型を指定しているカラムも文字列としないとエラーになりましたので、数値が与えられる場合はString型にキャストしたほうが良いみたいです。

```
Expected params.Item['Code'].N to be a string
```        

```typescript
ExpressionAttributeValues: {
  ":number": { "N": "1111" }
},
```

## おわりに

今回紹介した方法は調べながらトライアンドエラーで解決まで持っていったので、もっと良い方法があるかも知れません。

見識の広い方はコメント頂けると助かります🙏
Surfaceでネットワークが断続的に切断される事象の解決方法

Surfaceで断続的にネットワークが切断される事象があり、
プログラミングとは関係ないですが、ハマってしまったのでメモメモ。
（SurfaceProで純正ドックを使用した環境で発生しました）

結論としては、ネットワークアダプターの「Selective suspend」が悪さしてた様子。


■ネットワークのプロパティで「構成」を押下。
![20191225143443-809x1024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699410/d075f7ef-1742-ada1-81a2-34c343026a76.png)

■「Selective suspend」を「Disabled」に変更。
　設定変更時に一度ネットワークが切断されるので注意！
![20191225143447-810x1024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699410/745d2f18-fb11-a50c-ae7d-27b97fb02a41.png)

同様の事象があればお試しを！:smiley:

パワーセーブ系の機能は有難迷惑なところがありますねぇ。。
リモートワークでパフォーマンスを最大化するために実施したこと

## まえがき
弊社はコロナの影響以前からフルフレックス・フルリモートの制度が採用されていました。（一年くらい経ちました）
現在はチームメンバーのほとんどがリモートになっているのでそこで意識したことをまとめてみようと思います。

## 自分の「今」の状態を共有する
リモートにおいて声をかけようとした人が今どんな状況かがわかりません。
離席して近くのコンビニに行っているかも、お昼休憩をとっているかも（フルフレックスなのでお昼休憩もバラバラです）
すぐに返信してほしいのに。いつまで待てばいいのか。いろいろ考えるとストレスになります。

そこで、Slackの**「ステータス」**をこまめに変更して今の状況を共有しています。
https://www.personal-media.co.jp/book/slack/slack-status.html

また、自分は、**Googleカレンダーとも連携**しており、何か予定があると「カレンダー」のマークが付きます。
これがついているときは「予定あり」というのがひと目でわかりますし、自分で設定する必要がなく便利です。
（周知が必要ですが・・・）


## フルフレックスなので定例MTGの設定時間に気をつける
フルフレックスだとコアタイムがないので、毎朝9時にチーム定例が入っていたら嫌ですよね。
チームみんなで話して、最適な定例時間を見つけるとよい。
（大体11時から18時までの間で設定されている傾向にあります。）


## 「帰宅時間」「出社時間」「勤務地」の情報を毎日チーム送る
・今日の帰宅時間
・明日の出社時間
・勤務地（リモート or 営業所）

今日何時に帰宅するのか、明日何時に出社するのかを分かるようにしています。
フルフレックスだと誰がいつ何時に帰宅・出社するのかがわからなくなりました。
そのため、毎日17時ごろに日報としてこの情報を送りチーム内で共有しています。


## 自宅のリモート環境を整備する
机や椅子、モニターはお好みで揃えればいいと思います。
ここで取り上げたいのは、**「ハウリングさせない環境」**です。
WEB会議においては自分はこれが非常に重要だと思っています。

PC内臓のマイクとスピーカーを併用すると部屋の構造によってはハウリングを起こします。
しかも、自分では気づけないので、一回ハウリングを起こしているか確認したほうがいいでしょう。

ヘッドセットまで購入は必要ないと思います。
音はイヤホンで聞いて、マイクはPC内臓のものにするだけでもハウリングを防ぐことができかなり快適になります。

**MTGの相手のため**にも環境を整えることをおすすめいたします！

ちなみに自分はあるメーカーのキーボードが好きで愛用しているのですが、
打鍵音が非常にうるさいようで苦情がありWEB会議中にメモが取れなくなりました。
Oリングを購入し自前で静音化させ、保証対象外となりましたが今は相手に不快感を与えずメモが取れています。


## まとめ
フルフレックス/フルリモートはとてもいい制度だと感じています。
自分の好きなときに働けるし、チーム内で明確なルールと情報共有を徹底しているので生産性も上がっていると思います。

しかし、自分だけ良ければいいという考えでは、リモートワーク/フルフレックスは成り立たないと思っています。
今回挙げたことはどちらかというと自分のためではなく**「相手のこと」**を考えた上で気をつけていることやルールを紹介しました。
これからリモートワークを検討している。リモートしているけどうまく行っていない人の参考になったら幸いです。

## 参考
[株式会社ZOZOテクノロジーズ、 フルフレックスタイム・フルリモートワーク制度を導入 〜 好きな時間・場所で自由に働くことができる新制度。 一人ひとりの環境に合った働き方で、組織の生産性を高める 〜
](https://press-tech.zozo.com/entry/20190801_zozotech)
【rails】renderメソッドの使い方

renderメソッドとは、呼び出すテンプレート（ビューorファイル）を指定するメソッド。
コントローラー、ビュー。どちらでも使うことができる。

```:renderメソッドの基本文法
render ファイル名（アクション名）
```

railsではコントローラーのアクションが動くと、その後同名のビューファイルが呼び出され表示される。。そこで、特定のビューファールを出したい時に使用する。

詳しくは以下を参照
https://pikawaka.com/rails/render
「金額の、正規表現の書き方:数字の前の0（ゼロ）を削除する方法」をOnlinePerlでやってみた。

正規表現の可視化するために利用しているサービスはregexper.comです。

https://regexper.com/#%2F%EF%BF%A5%5B0%2C%5D%2B%28%3F%3D%28.%2B%29%29%2F

入力

```perl

my $price = "￥0,900のパン";
$price =~ s/￥[0,]+(?=(.+))/￥/;
print($price);
print("\n");

my $price = "￥01,900のパン";
$price =~ s/￥[0,]+(?=(.+))/￥/;
print($price);
print("\n");

my $price = "￥0,002のパン";
$price =~ s/￥[0,]+(?=(.+))/￥/;
print($price);
print("\n");
```
出力

```
￥900のパン
￥1,900のパン
￥2のパン
```

(オリジナルポスト)

https://ja.stackoverflow.com/questions/69972/%e9%87%91%e9%a1%8d%e3%81%ae-%e6%ad%a3%e8%a6%8f%e8%a1%a8%e7%8f%be%e3%81%ae%e6%9b%b8%e3%81%8d%e6%96%b9%e6%95%b0%e5%ad%97%e3%81%ae%e5%89%8d%e3%81%ae0-%e3%82%bc%e3%83%ad-%e3%82%92%e5%89%8a%e9%99%a4%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95

(参考)オンラインでプログラミングして実行できるサイト

https://qiita.com/tttamaki/items/2b009aa957cfa4895d50

言語毎のまとめサイトを探しています。よろしくお願いいたします。

# Coding Ground at tutorialspoint
URLがわからなかった。

# CodeChef
わからなかった。

#ideone
http://ideone.com
windows10で実行できた。

# Perl Online - What is paiza.IO?

https://paiza.io/ja/projects/new

windows10で実行できた。
ソースコードのURLができました。以下のURLは、切れているかもしれません。

https://paiza.io/projects/sZ4fYITawQhrjBSjYHb4WQ

# runnable
わからなかった。

# C++ shell
perlがみつからなかた。

# Wandbox
perlがみつからなかた。

# repl.it
perlがみつからなかた。

# jdoodle
perlがみつからなかた。

# codepad

http://codepad.org/

windows10で実行できた。

# codetable
わからなかった。

# Solo Learn

perlがみつからなかた。

# Geeks for Geeks IDE

https://ide.geeksforgeeks.org/index.php

windows10で実行できた。
Lambda(node.js)におけるDynamoDBのスタブのつくりかた


#やりたいこと
以下のlambdaのテスト対象コード(main.js)をMochaでtestするときに
docClient.get(...).promise() 部分のスタブをsinonでつくりたい


```javascript:main.js
const aws = require("aws-sdk");
const docClient = new aws.DynamoDB.DocumentClient(...);

async function main(event) {

    await docClient.get(...).primise();

}
```


結論のテストコード
(***で囲まれているところがスタブのつくり方、それ意外はモジュールの設定)


```javascript:main_test.js
const assert = require('assert');
const sinon = require("sinon");
const aws = require("aws-sdk");
const docClient = new aws.DynamoDB.DocumentClient(...);


describe("main_test", () => {

  it("test1", async() => {

    // ******ここスタブのつくりかたでハマった＊＊＊＊**
    let stub_DB = sinon.stub(docClient,'get').returns({
        promise: function () {return Promise.resolve({data:111})
        });
    //stub_DBはdocClient.get(...).promies()が呼ばれると{date:111}をreturnするスタブ
    //*************＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊*******

  });

});

```

#参考

https://stackoverflow.com/questions/47135483/how-to-stub-promise-method-of-node-aws-sdk
PHPでの開発を始めるので、概要をまとめてみた

# PHPとは
Webアプリ開発ができる

# 役割

- HTMLを作ること
- データを管理すること

# ローカル開発環境

サーバーにアップせずにPHPが書き換えたHTMLを確認するために必要な作業

必要なインストール

- PHP
- Webサーバー

上記はインストールがかなり難しい。

なので、インストールをアシストしてくれる、XAMPPやMAMPを使う。

# MAMPとは

Macintosh、Apache、MySQL、PHPを省略してつなげた名前。

簡単にWeb開発環境を立ち上げられるようにするために必要なソフトウェアをパッケージ化したもの。

XAMPPとほぼ一緒。開発元が違う。

RubyやPythonを使う人向け。

# コードの書き方

```php
// 最初に<?php ?>　で囲う。
<?php echo 'こんにちは！';  // こんにちは！と表示される。 ?>　 
<?php echo 'こんにちは！' . date('l');  // こんにちは！Mondayと表示される。
?>  

// 変数
<?php 
	$message = 'こんにちは' . date('l');
?>
<?= $message;  // こんにちは！Mondayと表示される ?>  

// 乱数
<?php 
	$n = mt_rand(1, 3)  // 1以上３以下
?>

// ファイルをインポートする
<?php 
	include('ファイル名')
// この記述だけで反映される
// 以降にHTML記述がなければ、閉じタグ不要
?>

// HTMLタグの中に文字列を記述する時
<title>
	<?= htmlspecialchars($title, ENT_QUOTES, 'UTF-8'); // 別ファイルで表示させたい値を、$titleに代入する
	?>
	PHPのサイト
</title>

// キャスト
<?php
	$x = (string) 10;    // int型の10を、string型の'10'に変換
?>

// 変数を調査するとき
<?php 
	var_dump($x)
?>

// 連想配列（JSだとオブジェクトに近い？）
<?php 
	$hashira = [
		'水柱' => '冨岡義勇'    // key => value
	];
	echo $hashira['水柱'];  // 冨岡義勇と表示される
	// keyはstring型かint型のみOK
?>

// 関数の定義
<?php 
	function 関数名($引数1, $引数2) {
		// 処理
		return 返り値;
	}
	関数名($実引数1, $実引数2);
?>

// アクセス修飾子
<?php 
	class Human{
	// プロパティ
		public $name;  // プロパティをクラスの外に公開する
		protected $birthday;
		private $gender;  // プロパティをクラスの外に公開しない。基本的にprivate

	// メソッド
		public function walk() {
			echo '歩く'.PHP_EOL;
		}

		public function eat() {
			echo '食べる'.PHP_EOL;
		}
	}
?>

// コンストラクタ(上の続き)
<?php 
	$human = new Human();
	$human -> eat();
	$human -> walk();
?>
```
自前でウェブサイトをノーコードで構築する方法を整理する

自前でウェブサイトをノーコードで構築する方法が、いろいろあり迷ったので整理します。

# はじめに
なんとかしてノーコードかつ、無駄なく、スマートに自前のウェブサイトを構築しようとあれこれ下調べしましたのでまとめます。

# wordpress.org をレンタルサーバ上に構築
超有名な wordpress がパッケージとして提供されているものを、 IaaS のような自前のサーバに自分でデプロイする方式です。といっても自分でやることはなくて、レンタルサーバがすでに PaaS のようにツール化しているため、それを使って簡単にデプロイすることができます。

+ メリット
 - 毎月千円超で広告なしの wordpress サイトが持てそうです。自前のサーバに構築するので細かい設定ファイルをいじったり、ドメインやSSL設定なども、インフラ屋さんには馴染みのある操作ができました。
+ デメリット
 - ホームページが作れそうですが、それでもやっぱり、ブログに特化しているようです。wordpress を活用していない人には少しデザインが弱くなってしまいそうです。

# wix.com
超有名な wix という SaaS 型のサービスであれこれ操作してサイトを構築する方式です。

+ メリット
 - 毎月千円程度で構築できそうです。WYSIWYG 形式でデザインするため、直感的だと思われます。ある程度の目的にしたがってデザインをしてくれたり、有償ですがAIをつかったロゴ作成ツールもありました。
+ デメリット
 - ある程度こなれてくるとデザインに物足りなさが出てくる気がしました。スマホでも作れるかなとおもっていましたが、分析系とブログ作成くらいしかできず、デザインまでは操作できませんでした。

# その他
触らなかったので「その他」としてまとめます。

+ wordpress.com
 - 超有名な wordpress を SaaS として提供されているものを利用する方式です。毎月数百円で広告なしの wordpress サイトが持てそうです。 ちょっとブログに特化しているようです。
+ peraichi
 - 数枚のページなら、毎月千円程度で構築できそうです。フォームもありました。wixの超お手軽版と思います。
+ jimdo
 - 数枚のページなら、毎月千円程度で構築できそうです。スマホでも作成できそうでした。wixの超お手軽版と思います。

# まとめ
いちよノーコードで自前でサイトは作れました。ただ、いろいろな人お通りではないなと感じました。その時の要件（ティザーだけ、ブログあり、フォームあり、など）に従って、一番ふさわしいものを使えるように余裕しておく必要があると思いました。

以上
Github で管理している静的なWebコンテンツを S3 にデプロイして公開する

Github Actions で S3 Syncを使って、静的なWebコンテンツをCI/CDできちゃうと聞いて、試してみました。一番簡単だった方法を整理します。

# はじめに
これまでは、すべてAWSで完結させていたので、AWS Commit から、AWS Code Pipiline で S3にデプロイしていました。これはこれで右手だけで設定ができたのでとっても楽だったのですが、ソースコードを Githubで管理したくなり、CI/CDをどう実現しようと思っていましたが、github actions なるものの存在をしり、これは便利そうだと試してみました。

# 環境
以下のような構成を想定しました。
Local -> Html,Css,Js -> Github -> Github Actions -> S3 Sync -> S3

# 選択したWorkflow
いろいろなWorkflowが存在していましたが、一番ラクだったものをPickupします。

+ jakejarvis/s3-sync-action@master
 - (参考) https://github.com/marketplace/actions/s3-sync
 - Github Actions の marketplace で一番上にあったやつです。が自分の Workflow にコピペして Secrets を設定しただけだとエラーになりました。。。
+ opspresso/action-s3-sync@master
 - (参考) https://medium.com/anti-pattern-engineering/github-actionsでs3にデプロイする-ef58a019aa1e
 - CloudFrontとかもみているようでしたので、使いませんでした。
+ actions/aws/cli@master
 - (参考) https://blog.honai.me/post/github-actions-aws-s3
 - ３ｒｄ パーティ製のものを試してみたかったのですが、actions/aws がないと怒られたので断念。
+ S3 Sync を直接使う
 - (参考) https://qiita.com/tippy/items/488e52411a9a5765330f
 - (参考) https://amezou.com/posts/2020/04/05/github-actions/
 - ACL設定が2パターンみつかったのですが、私の S3 の ACL と相性がよかったのは、 public-read のオプションのほうでした（前者sURL）。

# まとめ
超簡単にCI/CD環境を構築できました。しかも独自のDockerコンテナ内であれこれ回すことができそうなのでテストなどもしっかり構築できそうです。ただこの独自コンテナは有料（ubuntuだと$0.008/分？、1分以内は無料？）のでしょうか、これをゼロ円にするべく自前のAWS上のコンテナ開発環境でどうにかできないか考えたり、また 3rd パーティ製の Workflow 活用できていないためそれも次回トライします。独自サーバにデプロイする方法も少し試したいです。

以上