OmniAICreator/Qiita-1.07M huggingface dataset:
自分用　記事メモ

## 目次
1. [ロードマップ](#ロードマップ)
1. [フロントエンド](#フロントエンド)
1. [バックエンド](#バックエンド)
1. [DB](#db)
1. [ネットワーク](#ネットワーク)
1. [クラウド](#クラウド)
1. [Docker](#docker)
1. [コマンドライン](#コマンドライン)
1. [その他](#その他)

## ロードマップ
|記事|URL|
|---|---|
|フロントエンド|https://roadmap.sh/frontend|
|バックエンド|https://roadmap.sh/backend|
|クラウド(AWS)|https://qiita.com/KurokawaKouhei/items/4e9aa3b526f3f233bf85|
|ASP.Net Core|https://qiita.com/k2491p/items/ac62468260d002cb5fe1|
|Java|https://roadmap.sh/java|
|Python|https://roadmap.sh/python|
|AI|https://qiita.com/tani_AI_Academy/items/4da02cb056646ba43b9d|

## フロントエンド
|記事|URL|
|---|---|
|CSS　アニメーション|https://qiita.com/hiro-hiro/items/22d05f4da3fedbe01398|
|SCSS　まとめ１（基本文法）|https://qiita.com/hiro-hiro/items/c981a6a11ee69fabcb74|
|SCSS　まとめ２（関数）|https://qiita.com/hiro-hiro/items/b8bb3f3ee99cbac5c828|
|SCSS　まとめ３（コンパイル方法）|https://qiita.com/hiro-hiro/items/eaaad48372d2dfb32066|
|TypeScript　まとめ1(型について)|https://qiita.com/hiro-hiro/items/f2dc671f48e2599e923b|
|TypeScript　まとめ2(ユーティリティ型)|https://qiita.com/hiro-hiro/items/0f0201a8a49db06e0032|
|TypeScript　まとめ3(モジュール化)|https://qiita.com/hiro-hiro/items/9879a297cf5b30c474e2|
|TypeScript　まとめ4(インストール〜コンパイル方法)|https://qiita.com/hiro-hiro/items/52108807c0594798e1c3|
|React メモ|https://qiita.com/hiro-hiro/items/4bc61338351ec5da0cf7|
|react-hooks 基礎|https://qiita.com/hiro-hiro/items/be36ba9e8d8cf152febd|
|React コマンドメモ|https://qiita.com/hiro-hiro/items/debd5d5808b7b29b37df|
|Hamlの書き方|https://qiita.com/hiro-hiro/items/a1ce8dd3f11415b92162|
|ejsの書き方|https://qiita.com/y_hokkey/items/31f1daa6cecb5f4ea4c9|

## バックエンド
|記事|URL|
|---|---|
|Ruby 基礎|https://qiita.com/hiro-hiro/items/9da6657e3e269c4ed10e|
|Python 基礎|https://qiita.com/hiro-hiro/items/51ac7e8c70d6599bdd6e|
|Go言語 基礎文法|https://qiita.com/hiro-hiro/items/ba81352c85261459e1b9|

## DB
|記事|URL|
|---|---|
|||

## ネットワーク
|記事|URL|
|---|---|
|||

## クラウド
|記事|URL|
|---|---|
|AWS 代表的なサービス一覧|https://qiita.com/hiro-hiro/items/97258c7be6bf65fc4adf|


## Docker
|記事|URL|
|---|---|
|Dockerコマンド まとめ|https://qiita.com/hiro-hiro/items/3aaea3c80ce0a9b62a3a|
|Docker メモ|https://qiita.com/hiro-hiro/items/b2f506fd5433baca4562|
|Dockerfile まとめ|https://qiita.com/hiro-hiro/items/ff5fc7d0cef02c495911|
|Docker Compose まとめ|https://qiita.com/hiro-hiro/items/8859adba287239aabb39|

## コマンドライン
|記事|URL|
|---|---|
|Windows コマンドプロンプト コマンド一覧|https://qiita.com/hiro-hiro/items/0c284bbd41c1c0ed2c4f|
|Windows バッチ処理 まとめ|https://qiita.com/hiro-hiro/items/7c5bf4cc6aa4c68dee15|

## その他
|記事|URL|
|---|---|
|Macのキーボードショートカット一覧|https://qiita.com/hiro-hiro/items/c5bbafe37d3172dae734|
|Gitコマンド早見表|https://qiita.com/kohga/items/dccf135b0af395f69144|
|npmのコマンド　まとめ|https://qiita.com/hiro-hiro/items/582d68a1cac48bcf6ec7|
|「図解コレ1枚でわかる最新ITトレンド」で出た単語　まとめ|https://qiita.com/hiro-hiro/items/cb63f632a98fa10bb96b|
Outlook インテグレーション ⇒ Outlook インテグレーションと Einstein 活動キャプチャを設定する

１．Outlook インテグレーションでサポートされるメールアプリケーションはどれですか?
２．メールクライアントは Einstein 活動キャプチャを使用する必要がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/9ce9dbec-beee-45f8-14e1-4d0d83016750.png)
RailsでURLを書き換える

#  URLを書き換えた場面
例えば、`Post`モデルの詳細画面のURLの場合、表示される際に`post/:id`ではなく、`article/:id`のようにしたいケースがあると思う。


### ルーティングのオプションで指定する事ができる
以下のように、`:path`オプションを指定することでURLを変更することができる

```ruby:config/routes.rb
resources :posts, :path => "articles"
```

### ルーティングの確認

- 修正前

```terminal
Prefix Verb          URI Pattern                Controller#Action

    posts GET        /posts(.:format)           posts#index
          POST       /posts(.:format)           posts#create
 new_post GET        /posts/new(.:format)       posts#new
edit_post GET        /posts/:id/edit(.:format)  posts#edit
     post GET        /posts/:id(.:format)       posts#show
          PATCH      /posts/:id(.:format)       posts#update
          PUT        /posts/:id(.:format)       posts#update
          DELETE     /posts/:id(.:format)       posts#destroy

```
- 修正後

```terminal
Prefix Verb          URI Pattern                   Controller#Action

    posts GET        /articles(.:format)           posts#index
          POST       /articles(.:format)           posts#create
 new_post GET        /articles/new(.:format)       posts#new
edit_post GET        /articles/:id/edit(.:format)  posts#edit
     post GET        /articles/:id(.:format)       posts#show
          PATCH      /articles/:id(.:format)       posts#update
          PUT        /articles/:id(.:format)       posts#update
          DELETE     /articles/:id(.:format)       posts#destroy

```

あくまで、`URI Pattern`が変更されるだけで、prefixには影響しませんので、`link_to`などでパスを指定する場合は`post`ベースで指定してあげて下さい。
勝手にマイクの音量が下がって困った話と解決策

# はじめに
会議(Meet)に参加していると，時間が経つにつれてマイクの設定音量が勝手に下がる現象に悩まされた．
原因と解消法をメモ書きしておく．

# 発生する条件
* Windows 10
* Google ChromeやMicrosoft Edge（Firefoxでは発生しなかった．他は未検証）
* Google Meet
* USB接続のマイク

# 検証結果
Meetを開いているときに（**Meetがミュート中でも**），作動中のマイクから最大音量が検出されると勝手に入力音量が下がるらしいことが分かった．

例えばマイクの作動中に「カチッ」という音が鳴れば一瞬だけ音量バーが振り切れて音量が下がるし，くしゃみをしても音量は下がる．

そして今回の場合は，Meetはミュートにしていてもマイクは作動させたままにしていた．
Meetをミュートにしたからと，何かしらの物音を立てるたび音量が下がったらしい．

ちなみに，マイクの音量バーは「設定」の「システム」→「サウンド」で確認できる（下の画像を参照）．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382909/d5da5bc4-d5b3-e33a-84d3-7c017ff481e4.png)

一方で**Firefox上のMeetを開いたときには発生しない**ことに気づき，ブラウザの仕様を疑い始める．

# 原因
[Chrome is Auto Adjusting the Microphone Level](https://support.google.com/chrome/thread/7542181?hl=en)によると，Google Chromeには**マイク音量の自動調節機能**がついているらしい．
（もしかしたら同様の現象が起きたMicrosoft Edgeもchromiumの影響を受けているのかも）

つまりMeetの問題ではなくChrome自体の仕様で，このブラウザを使う限り避けられない問題ということ．

# 解決策
自動調節機能とやらを無効化する．
先ほどのリンクで紹介されていた拡張機能 [Disable Automatic Gain Control](https://chrome.google.com/webstore/detail/disable-automatic-gain-co/clpapnmmlmecieknddelobgikompchkk) を使った．

`Chromeに追加`を押してインストール．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382909/c45ebc8f-dd5d-13cd-fd9d-63b2cdddedd3.png)

Meetを開き，Meetのタブ上で`拡張機能（パズルのピースみたいなやつ）`から`Disable Automatic Gain Control`を選択して許可する．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382909/1950555f-ea03-2362-4ed6-6779d197bab1.png)

自分の環境では，この手順で解決できた．

# おわりに
会議中に勝手に声が小さくなっていく現象は，ふつうに深刻な問題だったので解決してよかった．
本来は通話中に大きな音を鳴らさないための機能と推測できるので，無効化する場合はそれなりの配慮が必要だと思う．
機械語プログラムの動作を通してＣＰＵの仕組みを説明するためのＧＩＦアニメ

![BehaviorOfMachineLanguage02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147091/ca4248b4-3610-37ac-c7d9-03896125b6a2.gif)
前の投稿の[「アセンブラ言語のアセンブルと機械語の動作説明ＧＩＦアニメ」](https://qiita.com/seastar3/items/b45b0897f8d6c0181b45)の続編として、機械語プログラムの動作を通してＣＰＵの仕組みを説明するためのＧＩＦアニメを投稿します。
単純な足し算の動作ですが、限られた部品を段取りよく操作して計算結果の記憶まで行います。
このアニメーションはパワーポイントのアニメーション機能を駆使して作成しましたが、いずれ、フラグレジスタの結果で流れを制御するようなより複雑な動作もなぞってみたいと構想しています。
APIの理解を深めるためLaravelで簡単なAPIを作成してみた

#Laravelで簡単なAPIを作成する

#実施環境
MAMP

- web server : apache
- PHP : 7.4.12
- laravel : 5.8.38 
- myaql : 5.7.32

#API作成前の注意事項
laravel5.xと最新のLaravel8.xではルーティング設定のコードの書き方が異なるため、現状はバージョン8.xはおすすめしない。バージョン8.x系でやろうとしたが、ルーティング設定でハマってしまい、かなり時間を持ってかれた。また、最新(2020.09リリース)のためgoogleで調べてもなかなか情報が出てこないため、今回は業務で使用しているlaravelバージョン5.x系で実施した。



#1. ルーティング設定
APIのルーティングは`routes/api.php`に記載していく。

```ruby:api.php
<?php

use Illuminate\Http\Request;

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

Route::get('hoge','HogeController@index');
``````

#2. テーブルの準備
事前にphpmyadminでDBとアクセスユーザーを作成しておく。

```ruby:.env
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=study_laravel //phpmyadminで登録したDB名
DB_USERNAME=aaa //phpmyadminで登録したユーザー名
DB_PASSWORD=abcd //phpmyadminで上記ユーザー名を登録する際に作成したパスワード
```
.envファイルを設定できたら次はartisanが存在しているディレクトリでコマンドを打つ

```
$ php artisan make:migration create_hoge_table
```

テーブルは`database/migrations`配下にある。
テーブルを確認できたら下記の内容で作成する。

```ruby:create_hoge_table.php
 $table->increments('id');
 $table->string('hoge');
 $table->timestamps();
```
その後、artisanコマンドで下記を実行

```
$ php artisan migrate
```

DBの接続ができたら、phpmyadminにアクセスして、hogeテーブルで下記クエリを実行する

```
INSERT INTO hoge (id, hoge, created_at, updated_at) VALUES (1, 'aaa', '2021_09_02','2021_09_05');
```

#3. モデル作成
テーブルが作成できたら作ったテーブルのデータにアクセスするためにモデルを作成する。

```
$ php artisan make:model hoge
```

```ruby:Hoge.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Hoge extends Model
{
    protected $table = 'hoge';
    protected $dates =  ['created_at', 'updated_at'];
    protected $id_hoge = ['id', 'hoge'];
}
```




#4. コントローラー作成
下記artisanコマンドを打ち、controllerを作成する。

```
$ php artisan make:controller Models/hogeController
```

```ruby:HogeController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\hoge;

class HogeController extends Controller
{
    public function index()
    {
        return response(hoge::all());
    }
}
```

サーバーを立ち上げる。

```
php artisan serve
```

下記URLにアクセスする。
http://127.0.0.1:8000/api/hoge

hogeテーブルの全件データがjson形式で返却されればOK!!
[{"id":1,"hoge":"aaa","created_at":"2021-09-02 00:00:00","updated_at":"2021-09-05 00:00:00"}]

#使用した便利なartisanコマンド
```
php artisan route:list //ルーティング設定がされているものを確認できる

php artisan --version  //laravelのバージョンを確認できる
```

#Postman

今回は説明は省くがAPIのレスポンスの確認はPostmanが便利なのでお勧めする。

https://qiita.com/zaburo/items/16ac4189d0d1c35e26d1

https://www.webprofessional.jp/master-api-workflow-postman/

#参考サイト
- [作成してみよう！LaravelでAPIを扱う方法【初心者向け】](https://techacademy.jp/magazine/18786)
Linuxコマンドの基礎復習はこれだけ

#1.用語
###ディレクトリ
テキストなどを入れるフォルダのこと
###カレントディレクトリ
作業場所のディレクトリ
###ホームディレクトリ
起動時にいるディレクトリ
###ルートディレクトリ
最上位のディレクトリ
###子ディレクトリ
ディレクトリの内部のディレクトリ
###親ディレクトリ
ディレクトリの上位にあるディレクトリ
###ファイル
テキストなどのこと
###パス
操作対象のディレクトリがどこにあるのかを示す表現
###相対パス
あるディレクトリからの位置を示す
###絶対パス
ルートディレクトリからの位置を示す

#2.コマンド

###date 
日付を表示
###cal
カレンダーを表示
cal 4 2020 などの入力もできる
###ls
カレントディレクトリにあるファイルとディレクトリを表示
###ls /
ルートディレクトリにあるファイルとディレクトリを表示
###ls -a
カレントディレクトリにある全てのファイルとディレクトリを表示
###ls -l
カレントディレクトリにあるファイルとディレクトリの属性を表示
###ls -la
カレントディレクトリにある全てのファイルとディレクトリの属性を表示
###pwd
カレントディレクトリを表示
###cat
ファイルの実行
###more
ファイルの内容の閲覧　catとは異なりページ送りができる
###mkdir
ディレクトリの作成
###touch
空のファイルの作成
###mv
ファイルやディレクトリを指定のディレクトリに移動や名前の変更
###cp
ファイルやディレクトリを指定のディレクトリにコピーや名前を変更してコピー
###rm
ファイルを削除　-r オプションをつけるとディレクトリを削除できる
###rmdir
ディレクトリを削除　中身が空でないと削除できない
###echo
ターミナルに出力する　Pythonでいうprint
echo あいうえお << ファイル　で書き込める

#3.標準リダイレクト
###<
他のコマンド結果を指定したファイルに書き込む
コマンド>ファイル　で書き込める
###<<
他のコマンド結果を指定したファイルに加える
echo あいうえお << ファイル　で書き込める

#4.パス表現
###./
カレントディレクトリを表す
###..
親ディレクトリを表す

#5.ファイル属性
drwxrwxrwxのようなもの
r:読み　w:書き　x:実行　
1文字目 d:ディレクトリ　-:ファイル
2.3文字目 ホストのアクセス権限
5〜7文字目 グループのアクセス権限
8〜10m文字目　システムに属する他の人のアクセス権限
【学習メモ】AWS　EFS

#EFS

EFS：Amazon Elastic File System
スケーラブルで柔軟性のあるクラウドNetwork　File System。
複数のEC2インスタンスからアクセス可能ですが、S3と異なりインターネットから直接アクセスができない。
月額：0.03USD/GB

##特徴
■簡単
fully managed

■スケーラブル
データ容量が自動的にGBからPBにスケーリング、予めにストレージの用意は不要。
数千個以上のEC2インスタンスが同時にアクセス可能。

■柔軟性
ファイルの増減に合わせて自動拡張/縮小。
従量課金。（最低費用は設けられていない。）

##ストレージクラス
二つのストレージクラスがある。
・EFS　スタンダード

・EFS　IA（Infrequent Access）
ファイルライフサイクルポリシーに従ってアクセス頻度が低いファイルを自動的にEFS IAに移動する。
月額：0.025USD/GB
（ファイルシステムでEFSライスサイクル管理を有効にすることを前提。）
##Mount Target
EC2インスタンスからマウントターゲットを介して、AZ外にあるEFSにアクセスできる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1082021/8d344309-30d1-f028-f2b6-7510aff49adb.png" width=50%>


#Hands On Lab
![EFS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1082021/79a1e93b-eb9e-f668-3cb3-2862c06d3c81.png)

![EFS2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1082021/22bfc406-38c7-27bf-2951-4b663e946f27.png)
![EFS3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1082021/086b5d6d-b1fe-9fcc-90c2-ac03ab56a9c0.png)
・バックアップ：デフォルトに有効されている。
・ライフサイクル管理：7,14,30,60,90日を選べる。
　（使わないファイルをIAに移行することによって、コストが安くなる。※コスト効率化）
・パフォーマンスモード：汎用、最大I/O
  →最大I/O:ソースのインプット、アウトプットの性能を上げたい場合に適用。
・スループットモード：バースト、プロビジョニング済み。
　→バースト：クレジットという形で、使える容量を貯めて、一時的に負荷が上がった場合、一時的に性能アップ可能。
　→プロビジョニング済み：使う容量が予めに決めた場合。

![EFS4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1082021/a4b2dbc2-33f7-aa2a-fd59-16baec0f235f.png)

![EFS5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1082021/5d2caddd-f88f-1a37-65f5-fe329a8ec4ed.png)
![EFS6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1082021/6a232f07-a66d-f44f-af94-42efa82362a1.png)
・計測サイズ：IAと標準のアクセスの割合を表示できる。
・モニタリング：スループット利用率、タイプ別 IOPS、タイプ別スループット、IO 制限の割合などの情報はグラフで表示される。
Swift基礎の基礎まとめ①

### 変数
データを入れる箱のこと。上書き可能。変数に値が代入されていないと処理ができない。
varは、英語で変数を表すvariableの略。

例）xが変数であることを宣言し、３を代入。３＊３をした結果・・・

```
var x = 3
print(x * x)
```

出力結果）

```
9
```


### 定数
データを入れる箱のこと。上書き不可。一度宣言したら永遠とその値を使用。誤った値で上書きされることを防ぐことができる。（消費税とか値変えられると困る場合に使用）

エラーになる例）

```
let tax = 1.05
tax = 1.08
print(100.0 * tax)
```
定数は上書きすることができないためエラーが発生する。

### for文
繰り返し処理に使用。
何度も同じこと処理を書かないために使用。
例）３の段の九九の計算を繰り返し処理で行う

```
var x = 3
for n in 1...9{
　　print(x * n)
}
```
出力結果）

```
3
6
9
12
15
18
21
24
27
```

### if文
条件によって処理を分岐させられる
例）バッテリー残量が20%になった時と10%になった時で警告文を変える

```
var batteryRemaining = 18

if batteryRemaining <= 10{
   print("バッテリーの残量は残り10%以下です")
}else if batteryRemaining <= 20{
   print("バッテリーの残量は残り20%以下です")
}
```

出力結果）

```
バッテリーの残量は残り20%以下です
```

###型
データの種類。整数なら整数型、文字列なら文字列型、等

###配列
複数のデータを入れることができる箱。まとめてデータを管理可能。for文の中にも使用することができる。配列は０から数える。今回だと"ジョギングする"が0、"勉強する"が１、"料理する"が２。
例）

```
var index = 2
var todos = ["ジョギングする","勉強する","料理する"]
print(todos[index])
```

出力結果）

```
料理する
```
###辞書
難しくいうと、添字に整数以外の型を指定することができる型。配列の内容を容易に把握可能。

例）乗り物と乗り物のタイヤの数を辞書として宣言する場合

```
var numberOFTires = ["車":4,"バイク":2,"船":0]
print(numberOFTires["車":4])
```
出力結果）車のタイヤの数は４です。

```
Optional(4)
```

###nil
何も値がない状態を表す。
OFDM GI 挿入と削除

#サンプルコード

```MATLAB
%% > octave-cli -q
%% octave> pkg install signal control communications -forge
pkg load communications
Q = 8;
M = 2^Qm;

%Nin = 16; % 16 point-FFT
Nin = M; % M point-FFT
Ngi = Nin/4;
Z = sqrt( mean( 2*(1:2:2^(Qm/2)).^2 ) );
repidx = @(i,N) mod( i-1, N)+1;

%% Dat Gen
txdat = qammod( mod( 1:Nin, M ), M )/Z;

%% Tx
txwave = ifft(txdat);
tx_idx = repidx(-Ngi+1:Nin,Nin); % with GI
txwavegi = txwave( tx_idx );

%% Channel
rxwavegi = txwavegi;

%% Rx
rx_idx0 = Ngi + repidx(  1:Nin/2     ,Nin);
rx_idx1 = Ngi + repidx(  Nin/2+1:Nin ,Nin);
rxwave = rxwavegi([ rx_idx0 rx_idx1 ]);

%% Debug Print
rxdat = fft(rxwave);
plot( rxdat,'*')
```
Xcode12からデフォルトでAppDelegateとSceneDelegateファイルがなくなった

## はじめに

Xcode12からデフォルトのLifecycleが「SwiftUI App」というものになった。
従来の「UIKit App Delegate」もプルダウンで選択可能の様子

で「SwiftUI App」で新規プロジェクト作成するといつものAppDelegate.swiftとSceneDelegate.swiftファイルがなくなってしまったようです。

あんなに色々とごちゃごちゃしていたファイルの中身がすっきりしてしまいました。

```
import SwiftUI
 
@main
struct SampleApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
```

しかしこれでは起動時などのライフサイクルで処理をしたい場合は・・・ってなるので、
旧来の書き方がよければそちらで良いと思う。おそらくシンプルなものであれば新しい方がいいってスタンスだと思う。


## ScenePhaseという書き方

ScenePhase書き方でライフサイクルの処理を行うようです。

```
import SwiftUI

@main
struct SampleApp: App {
    @Environment(\.scenePhase) private var scenePhase
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .onChange(of: scenePhase) { scene in
            switch scene {
            case .active:
            case .inactive:
            case .background:
            @unknown default: break
            }
        }
    }
}
```

## UIApplicationDelegateAdaptorという書き方
UIApplicationDelegateAdaptorの書き方を使うと今まで通りのAppDelegateを使えるようですが、なら「UIKit App Delegate」でやればいいのでよくわかりかねます。


## おわりに
Xcodeのバージョン上げるたびにコロコロ変わる環境にそろそろうんざりですね、AndroidもWebもですが、フロント系のエンジニアは特に振り回されるポジションですね。なんというか新しいゲームが販売されたかのような。やってることがプログラマーではないと思う。
ALB ingress Controllerから作成されるALBにhttpからhttpsへのリダイレクト設定を入れる



```yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: CONTAINER_NAME-app-ingress
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    external-dns.alpha.kubernetes.io/hostname: CONTAINER_NAME.vamdemic.xyz
    alb.ingress.kubernetes.io/tags: Name=vamdemic-development-k8s-alb,Automation=Kubernetes-ingress-controller,Domain=CONTAINER_NAME
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-northeast-1:xxxxxxxxx:certificate/xxxxxxxxxxxxxxxx
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
    alb.ingress.kubernetes.io/ip-address-type: ipv4
    alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'
  labels:
    app: CONTAINER_NAME-ingress
spec:
  rules:
    - http:
        paths:
          - path: /*
            backend:
              serviceName: ssl-redirect
              servicePort: use-annotation
          - path: /*
            backend:
              serviceName: CONTAINER_NAME-app-service
              servicePort: 80
```
【jQuery】.click() と .on() の違い

# .click() と .on() の違いを理解する
HTML要素にクリックイベントを付与する時によく使われる関数といえば **.click()** と **.on()** ですね。
だいたい同じことができるので、あまり違いを意識せずに使っている方もいるかもしれません。
ですが、使い分けができればけっこう便利なのでしっかり違いを理解しておきましょう。

**.click()** と **.on()** の違いは、簡単に言うとこんな感じです。↓

* .click()
  * ページロード時に存在する要素にのみイベントを付与する。
  * その後動的に追加された要素には有効じゃない。
* .on()
  * ページロード後、動的に追加された要素にもイベントを付与する。

この時点で「なるほどね」と思えた方はブラウザバックでOKです！
「ん？」な方は「忍者をクリックすると分身する」アプリでこれらの挙動を実際に確認してみましょう。

# 分身の準備
分身の術アプリの準備です。
以下のようにhtmlファイルとcssファイルを書いて忍者の画像を表示してください。
※ ここは本題じゃないので適当でも大丈夫です。

```index.html
<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>分身の術！</title>
    <link rel="stylesheet" href="css/style.css">
    <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
    <script type="text/javascript" src="javascript/script.js"></script>
</head>

<body>
    <div id="main-div">
        <img class="ninja" src="./image/ninja.png"></img>
    </div>
</body>

</html>
```

```style.css
#main-div {
    margin: 10px;
    border-radius: 10px;
    display: flex;
    text-align: center;
}
```

こんな感じ
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558315/614a6300-4f68-e804-4e7f-e5695295a21a.png)


# .click() の場合
それではJavaScript（jQuery）で分身処理を書いてみましょう。
※ jQueryで .click() を使う方法は[こちらの記事](https://qiita.com/kutsushita202829/items/d046f86a704108d996b8)でも紹介してるので、jQueryに自信が無い方などは良かったら覗いてみてください。

```script.js
$(function () {
    // 忍者を表示するimgタグ
    var ninja = '<img class="ninja" src="./image/ninja.png"></img>';

    // 上記「ninja」をappendする関数
    var appendNinja = function () {
        $("#main-div").append(ninja);
    }

    // .click() で、忍者クリック時に上記「appendNinja」が呼ばれるように設定
    $(".ninja").click(appendNinja);
});
```

.click() でイベントを付与しました。
この時、オリジナルの忍者をクリックすれば分身できますが、
分身によって生み出された忍者をクリックしても何も起きません。
![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558315/1affe5ec-3599-d9ca-10f5-1a77adf8977c.png)

# .on() の場合
.on() ではどうなるでしょうか？

```script.js
$(function () {
    // 忍者を表示するimgタグ
    var ninja = '<img class="ninja" src="./image/ninja.png"></img>';

    // 上記「ninja」をappendする関数
    var appendNinja = function () {
        $("#main-div").append(ninja);
    }

    // .on() で、忍者クリック時に上記「appendNinja」が呼ばれるように設定
    $(document).on("click", ".ninja", appendNinja);
});
```

.on() でイベントを付与しました。
今回は、オリジナルの忍者はもちろんのこと、分身によって生み出された忍者をクリックした場合でも分身が増えていきます。
![スライド2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558315/99d4c319-fea6-509e-711b-460f65b15f0e.png)


※ ```$(document)```で、Webページを構成するHTML要素を取得できます。
※ ```$(document)```の代わりに```$("#main-div")```のように対象の親要素を指定しても動きます。

```javascript
$("#main-div").on("click", ".ninja", appendNinja);
```

# 使い分け
上で説明してきた通り、**.click()** と **.on()** の違いは「動的に追加された要素」に対して効果があるかどうかです。

そのことを理解していれば、「後から追加した要素にもイベントを付与したい」という時には **.on()** 、
「後から追加した要素にはイベントを付与したくない」という時には **.click()** 、
というように使い分けできますね！

# ひとこと
好きな忍術は水蜘蛛の術。
水の上を走る姿は憧れる。
![ninja_mizugumo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558315/ef5a2192-a7f1-f34f-2221-0fda2eac6067.png)
laravel8 アプリ作成時にエラーが出た

# 目的

- laravel8のアプリを作成中にエラーが発生したので出たエラーと筆者の場合の解決方法をまとめる

# 環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHP バージョン | 7.4.8 | Homebrewを用いてこちらの方法で導入→[Mac HomebrewでPHPをインストールする](https://qiita.com/miriwo/items/cd54077aad7e139cf518) |
| Laravel バージョン | 6.X | commposerを用いてこちらの方法で導入→[Mac Laravelの環境構築を行う](https://qiita.com/miriwo/items/adaaaeecae69d6392e08) |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いてこちらの方法で導入→[Mac HomebrewでMySQLをインストールする](https://qiita.com/miriwo/items/ef6a064bc545fbea29d9) |
| Node.jsバージョン | v8.9.4 | Homwbrewを用いてこちらの方法で導入→[Mac HomebrewでNode.jsをインストールする](https://qiita.com/miriwo/items/73d1546220f1c091a7d5) |

# 情報

- 筆者はMacに直接laravelアプリ動作環境を構築してlaravelアプリ作成コマンドを実行した。

# 実行したコマンドと出力されたエラー

1. 下記コマンドを実行してlaravel8のアプリを作成した。

    ```terminal
    $ composer create-project "laravel/laravel=8.*" todos -vvv
    ```

1. 下記のエラーが出力されてlaravelアプリの作成が停止した。

    ```
    chdir(): No such file or directory (errno 2)
    ```

# 解決方法

1. アプリのディレクトリが途中まで作成されていたので、カレントディレクトリ直下のtodosというディレクトリを削除した。
1. 再度下記コマンドを実行してlaravel8のアプリ作成を試みた。

    ```terminal
    $ composer create-project "laravel/laravel=8.*" todos -vvv
    ```

1. 問題なくlaravel8のアプリを作成する事ができた。ローカルサーバーの起動にも成功しブラウザから下記の画面も確認する事ができた。

    ![Laravel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/95aa0bd0-789d-05c1-b7b4-189fba9ca2a8.png)
【tinderアプリ】自作1日目

#cardコンポーネントを作ってみました！
この記事を書いてるのは、エンジニアになるべく日々勉強してる24歳の社会人です！
reactを学習して2ヶ月が経ち何か作りたいと思い、Tinderのクローンを作ろうと思いました！
完成するまでの気づきなどを書いて行こうと思います！

話が長くなりましたが今日はTinderのカードの表示とswipeについて書いて行こうと思います！

```react:TinderCard.js
import React, { useEffect, useState } from "react";
import TinderCard from 'react-tinder-card'
import './TinderCard.css';

const TinderCards = () => {
  const [people, setPeople] = useState([
      {
          name: '坂本勇人',
          url : 'https://i.pinimg.com/474x/c6/1f/1c/c61f1c05ac6f98c5f83ddce87ba90ceb.jpg'
      },
      {
        name : '阿部慎之介',
        url : 'https://amd-pctr.c.yimg.jp/r/iwiz-amd/20190416-00000003-baseballos-000-1-view.jpg'
      }
    ]);

  return (
    <div>
      <h1>thider card</h1>
      <div className="tinderCards__cardContainer">
      {people.map((person) =>
        <TinderCard 
        className="swipe" 
        key={person.name}
      
        preventSwipe={['up', 'down']}
        >
            
            <div style={{backgroundImage : `url(${person.url})`}} className="card">
                <h3>{person.name}</h3>
            </div>
        </TinderCard>
      )}
      </div>
    </div>
  );
};

export default TinderCards;

```
Tinderといえばswipeが印象的ですよね！
どうやって実装したのかというとすでにswipeするためのコードがあるんですよね！
下記に記載しておきますのでぜひ確認してみてください
https://www.npmjs.com/package/react-tinder-card

この記事をみてみると、まずはinstallしろと書いてあります！
`npm install --save react-tinder-card`

次にtinder-cardを使うためにimportで呼び出す必要がありますね！
`import TinderCard from 'react-tinder-card`

この記事、とてもわかりやすい！

##swipe時に記載
`preventSwipe={['up', 'down']}`
これだけです！
これは何を書いてあるのかというと、配列の中に書いた文字方向にはswipeできないようにする
要するに左と右にはswipeすることができるということですね！

##スタイルについて
```react:TinderCard.css
.card {
    position: relative;
    width: 600px;
    padding: 20px;
    max-width: 85vw;
    height: 80vh;
    border-radius: 20px;
    background-size: cover;
    background-position:center;
    
    /* box-shadow: 0px 18px 53px 0px rgba(0, 0, 0, 0.3); */
    box-shadow: 10px 10px 10px rgba(0,0,0,0.4);
}

.card > h3{
    position: absolute;
    bottom: 10px;
    color: #fff;
    right: 10px;
    font-size: 36px;
}
.tinderCards__cardContainer{
    display: flex;
    justify-content: center;
    margin-top: 5vh;

}

.swipe{
    position: absolute;
}

```

cssはこんな感じで調べながらCSSあててみました！
css難しすぎる。。。
vhって何？
viewportのデフォルトが1000pxで、その100分の1っていう認識であってますか？
1vh = 10pxであってますか？
記事でwidthは％表記でheightはvhで表記した方がいいみたいな記事を読みましたが、皆さんはどんな使い分けをされてますでしょうか？
わかる人教えてください！！！

ここで一番勉強になったのが
classNameでtinderCards__cardContainerを指定してます！色々cssをあててるのですが、
画像を横並びして画像を中央に配置してます！
そこに`.swipe{position: absolute;}`をすることで画像が上に積み重なるので
スワイプすると次の画像が同じ場所から出てくるんです！


---------------------------------------
こんな使い方があったとは。。。
cssは奥が深すぎる。。。苦手意識があるのでちょっとずつ学んでいきたいと思います！
最後までみていただきありがとうございます！
【ペアプロ】VS Code + Live Share の始め方

# Live Share でできること
1. ソースの共同編集
2. ターミナルの共有
3. ローカルサーバーの共有

などなど...
ペアプログラミングに最適です！

## 1. 共有したいフォルダを開いておく
あらかじめ共有したいフォルダを開いておきましょう。

## 2. 拡張機能をインストール
![スクリーンショット 2021-03-06 23.08.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309628/1fd3fa24-5a65-0cc9-6259-ba016908fd4b.png)

## 3. Live Share 起動
少しわかりづらいところにありますが、ステータスバー左下に「Live Share」という項目が出てくるので、これをクリックすると起動できます。
![スクリーンショット 2021-03-06 23.08.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309628/9b11f468-8ace-7a0e-d8a7-e55cf5065962.png)


## 4. Github か Microsoft にサインイン
サインインしていない場合は、Github か Microsoft へのサインインを（これまたわかりづらいですが）要求されるので、どちらかでサインインしてください。
![スクリーンショット 2021-03-06 23.08.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309628/02fc9d4f-e55e-324f-482f-756d3d30645f.png)

「Allow」を押してブラウザを開きます。
![スクリーンショット 2021-03-06 23.08.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309628/d067d2d4-eac3-abcb-51b5-085d4cb3658c.png)

## 5. Github だとこんな感じ
「Continue」をクリック。
![スクリーンショット 2021-03-06 23.08.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309628/3285922b-3ede-0533-a8df-fdd6d950ded1.png)
「Authorize github」をクリック。
![スクリーンショット 2021-03-06 23.08.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309628/db4ce4cd-54d4-16ac-8206-4e569de3d2c9.png)

## 6. サインイン完了 & セッション起動
サインインが完了するとセッションが起動されます。
右下に添付画像のようなメッセージが出てくると開始の合図で、これが出てきた時点でクリップボードにシェア用のリンクがコピーされてるとのことなので、それをシェアする相手に送りましょう！
![スクリーンショット 2021-03-06 23.09.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309628/095e0df9-f5ce-33a7-8268-876fc597059e.png)


## 7. その後
- セッションを終了したい
- 拡張機能インストール済み、サインイン済みで、シェアを再開したい

などは、基本的にステータスバーの「Live Share」ボタンを押せばOK。メニューが出てきます。

## 公式サイト
https://visualstudio.microsoft.com/ja/services/live-share/
dockerを使ってローカルにあるファイルを実行する

dockerを最近勉強し始めたのでその備忘録
初心者向け記事にファイルの扱いがあまり記載されてないのでメモ
間違いやもっと簡素なやり方がありましたらご指摘ください！

## やりたいこと

dockerのcontainerを使い、ローカルにあるpythonスクリプトを実行したい

```docker_test.py
if __name__ = "__main__":
  print("Success!")
```

## 手順

##### １：python imageをpullしてくる

```
$ docker pull python
```

##### ２：containerを作成する

```
$docker container run -it python
Python 3.9.2 (default, Feb 19 2021, 17:11:58) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 
```

`run`する時に`--name`オプションを付ければcontainerの名前を決めることができる（しない場合、適当な名前がつく）
`-it`オプションはつけないとすぐにコンテナが停止してしまうので注意

その後、control+P+Qでdettachする。
control+dまたは`exit`でもいいが、その場合、コンテナがstopしてしまうので、restartする

```
$docker container restart charming_mirzakhani
```

charming_mirzakhaniの部分はcontainer id もしくはcontainer name
container nameやcontainer idは`docker ps -a`で確認できる

```
$docker ps -a
CONTAINER ID   IMAGE     COMMAND        CREATED             STATUS                     PORTS     NAMES
6a55c7106a6c   python    "python3"      About an hour ago   Exited (0) 9 minutes ago             charming_mirzakhani
```

##### ３：（ローカルにある）実行したいファイルをcontainer内のフォルダにコピーする

```
$docker cp /path/to/docker_test.py charming_mirzakhani:/usr/local/src/
```

`docker cp [ローカルファイルへのパス] [container name or id]:[container内のパス]`という構文
上の例ではcharming_mirzakhaniコンテナ内の/usr/local/src/ディレクトリにローカル（ホストOS）にあるdocker_test.pyをコピーしている

##### ４−１：スクリプトを実行する

```
$docker container exec -w /usr/local/src/ charming_mirzakhani python docker_test.py
Success!
```

起動中のコンテナでの作業なので、`exec`を使う
`-w`オプションは`cd`みたいなもので、実行時のカレントディレクトリを/usr/local/src/にする

##### ４−２：bashを利用する方法

コンテナ内でbashに入ることもできる

```
$docker exec -it charming_mirzakhani bash
root@6a55c7106a6c:/#
```

この後はいつもローカルでやっているように実行できる

```
root@6a55c7106a6c:/# /usr/local/src/docker_test.py
Success!
```

---

## バインド・マウントを使う方法

別の方法としてバインド・マウントがあります。
（正確な表現ではありませんが）これはローカルにあるディレクトリをcontainer内のディレクトリとして扱えるようにする方法です。
ファイルを更新しながら実行したい場合はこっちを使うのが便利です。

ローカル（ホストOS）側のディレクトリをcontainerにマウントする

```
$docker container run -v "$PWD":/usr/local/src -it python bash
root@7018bfa18828:/#
```

`-v`オプションでマウントを指定する、`[ホスト側のpath]:[container側のpath]`という構文
上の例では、ホスト側のカレントディレクトリをcontainerの`/usr/local/src`にマウントしている

bashを使って確認してみると、

```
root@7018bfa18828:/# ls usr/local/src/
docker_test.py
root@7018bfa18828:/#
```

確かに、カレントディレクトリがマウントされている
なので後はこれを実行すれば良い

```
root@7018bfa18828:/# cd usr/local/src/
root@7018bfa18828:/usr/local/src# python docker_test.py 
Success!
root@7018bfa18828:/usr/local/src#
```

マウントを先にしておけば、bashに入らなくてもcontainer起動時は以下のようにも実行できる

```
$ docker container exec 7018bfa18828 python /usr/local/src/docker_test.py
```


## 参照
- [Dockerコマンド よく使うやつ](https://qiita.com/Esfahan/items/52141a2ad741933d7d4c)
- [DockerコンテナでPythonスクリプトを動かす (主要なDockerオプション添え)](https://qiita.com/zaki-lknr/items/f0ca0a28e5445884f30a)
- [Dockerコンテナの作成、起動〜停止まで](https://qiita.com/kooohei/items/0e788a2ce8c30f9dba53)
- [docker cp でファイルをホストからコンテナへコピーする](https://noumenon-th.net/programming/2019/03/29/docker-cp/)
- [Dockerのバインド・マウントを利用する[-v]](https://noumenon-th.net/programming/2019/03/30/docker-v/)
ログイン、ログアウトの仕組み、　クッキーとセッションの違い

今回はなんとなく理解しているが、言葉で説明するのが曖昧な感じな、
2つの説明を備忘録として書いていきたいと思います。

　　
##ログインとログアウトの仕組み

認証にメールアドレスとパスワードを利用する場合、
**ログイン**はユーザー情報を保存しているテーブルからユーザーが入力したメールアドレスとパスワードがマッチするデータがあるかどうかを判定します。
ログインすると`セッションに規定のデータが保存`されるので、**ログアウト時**にはその`セッションデータを削除する`ことでログイン状態を解除する仕組みです。

　


ログイン、ログアウトの仕組みは改めて文字にしても簡単に覚えることができますね。

　

##クッキーとセッションの違い
主にステートフルな通信を実現するためにそれぞれ利用され、
**クッキー**はサーバーからクライアント側に付与する情報(セッションID)をHTTP Cookieを用いて保持する仕組みで、
**セッション**はサーバー側に保守される一連の操作や通信のこと。

・`HTTP Cookie`はもはやセッション管理のためだけのものではないので**セッションクッキー**と言う表現で表すこともできる。
`SPA`などではHTTP Cookie以外の形式で保存することもありますが、そちらはセッション情報を文字列で表現した"セッショントークン"と整理できる。　

#SPA(シングルページアプリケーション)
SPAとは単一のWebページでアプリケーションを構成する設計構造の名称で、
フロントエンド開発の技術として、ブラウザの進化やHTML5の登場などによって誕生した**アーキテクチャ**（プログラムの構造）です。


　



##ステートフル
**ステートフル**とは、システムが現在の状態を表すデータなどを保持しており、その内容を処理に反映させる方式。
システム内部に記録されるデータなどが処理や通信によって変化していき、その内容が出力にも反映されるような処理方式を指す。
そのようなアプリケーションソフトを「`ステートフルアプリケーション`」、プロトコル（通信規約）を「`ステートフルプロトコル`」という。
　　
　　
ググる癖は付きました。
知らないことも少しずつ勉強していきたいと思います。
色々と間違って覚えていることもあると思うので、ご教示よろしくお願い致します。
Excel VBA ListObject

#テーブル　ListObject 
Excel使うなら絶対使うべき機能テーブル！

リストデータに対して、入力規則を自動適用したり
構造化参照を使って数式が管理しやすくなったりいいことたくさん。:+1: 
さぁ、レッツ　Ctrl＋T　！

そのListObjectに関してのメモ書き＆備忘録。

##:black_large_square:テーブル特定

```sample.vba
Activesheet.ListObjects(1).
Range("A1").listobject.
Range("テーブル1").listobject.
```
*テーブル1＝tablename

##:black_large_square:テーブル特定部分の指定
##テーブル全体

```ListObject.vba
Activesheet.ListObjects(1).Range.Select
Range("A1").listobject.Range.Select
```

##ヘッダーのみ

```ListObject.vba
Activesheet.ListObjects(1).HeaderRowRange.Select
```

##（ヘッダー除く）データ全体

```ListObject.vba
Activesheet.ListObjects(1).DataBodyRange.Select
```

##列

```ListObject.vba
Activesheet.ListObjects(1).ListColumns(2).Range.Select

```
2列目全体を選択

##行

```ListObject.vba
Activesheet.ListObjects(1).ListRows(3).Range.Select

```
データの3行目を選択（ヘッダーは含まれない）

##集計行

```ListObject.vba
Activesheet.ListObjects(1).TotalsRowRange.Select
```
え、集計行設定してない？　⇒
　Ctrl　＋　Shift　＋　T　ね。


##データ先頭行(Excel行)取得

```ListObject.vba
debug.print Activesheet.ListObjects(1).DataBodyRange.Row

```

##データ行数取得

```ListObject.vba
debug.print Activesheet.ListObjects(1).ListRows.Count
```

##データ最終行(Excel行)取得

```ListObject.vba
debug.print Activesheet.ListObjects(1).DataBodyRange.Row + Activesheet.ListObjects(1).ListRows.Count - 1
```
上のデータ先頭行(Excel行)取得してデータ行数取得して、1引くとデータの最終行

#おわり
テーブルって管理が楽になるよね:smile:
jQuery始めました。

#はじめに
本日は、jQueryについて少し学びました。
超基本的なところをまとめます。

##基本

```javascript
$('どこを').どうする
```
頭に、`$`を付けます。

##どこを

「どこを」の部分には、

- セレクタ(h1, pなど)
- クラス
- ID
が入ります。

セレクタを指定する場合はそのまま。

```javascript
$('h1')
```
クラスを指定する場合には、CSSと同様に、

```javascript
$('.class-name')
```

IDを指定する場合には、CSSと同様に、

```javascript
$('#ID')
```

##どうする

「どうする」の部分には、

- アニメーション
- イベント

を記述します。

###アニメーション

`fadeOut()`や`slideDown()`など表示に関することがあります。
`()`には引数として、秒数など指定することができます。

###イベント

- カーソルを合わせた時
- クリックした時

など
7zipコマンドライン＆バッチファイル

#7zipでコマンドライン版を活用したい
毎日発生する定常作業(圧縮/解凍等)を簡潔に行いたい。

1. 外部部署とのDVD媒体を用いてデータの受け渡し
- 解凍作業
- 解凍先指定
- 作業時、一時的にCOPYした圧縮ファイルは削除したい



##こんな風にしたい
【As-Is】
1ファイル毎にせこせこと解凍作業を行っている。

- 外部部署とのDVD媒体を用いてデータの受け渡し
- 解凍作業
- 解凍先指定あり
- 作業時、一時的にCOPYした圧縮ファイルは削除したい

【To-Be】
バッチファイルを利用し、シンプルな方法で処理したい。

- 1クリック or D&Dで処理

##Archive
圧縮してみる
対象ファイルを下記バッチファイルへD&D

|Command |Description |
|:-:|:--|
| a | add |

```shell:archive.bat
@echo off
Set path="C:Program Files\7-Zip\"
Set exe=7z.exe
Set pass="PASSWORD"
Set out="C:\temp1\test\"
FOR %%f IN (%*) DO (
 %path%%exe% a -p%pass% %%~dpf%%~nf.7z %%f
rem %path%%exeFile% a -r -p%pass% %%~dpf%%~nf.7z 
rem >>> -r　ディレクトリ以下サブも対象
rem %path%%exeFile% a -p%pass% %%~dpf%%~nf.7z 
rem >>> 圧縮先しか指定していない。元対象ファイルの指定がない場合はカレントディレクトリ以下サブも含む対象
)
```

##Extract
解凍してみる

|Command |Description |
|:-:|:--|
| e | extract |
| x | extract with full path |
```shell:extract.bat
@echo off
Set path="C:Program Files\7-Zip\"
Set exe=7z.exe
Set pass="PASSWORD"
Set out="C:\temp1\test\"
FOR %%f IN (%*) DO (
 %path%%exe% x -p%pass% %%f -aoa -o%out%
)
```
---
##番外編（ついでに・・・）
ファイル整合性確認用に

##hash
ハッシュ値計算

|Switch |Description |
|:-:|:--|
| -scrc | Set hash function |
-scrc{methods}
対応しているmethods: CRC32, CRC64, SHA1, SHA256, BLAKE2sp, *
methodsを指定しなければCRC32で計算される。

```shell:hash.bat
7z.exe h -scrcsha1 hoge.txt
```






##参考リンク

[7zip Command Line Commands](https://sevenzip.osdn.jp/chm/cmdline/commands/index.htm)

[7zip Command Line Switches](https://sevenzip.osdn.jp/chm/cmdline/switches/index.htm)
SwiftUIのTapジェスチャにエフェクトをつける

SwiftUIのListはセルの内部にButtonが配置されている場合、ButtonをタップしなくともセルをタップするだけでButtonのタップが誘発します。
セルの内部にButtonが複数配置されている場合、それぞれのButtonのアクションが実行されるためセルの内部にButtonを配置することが困難です。

代わりの手段としてタップしたい対象にはTapGestureを指定するのですが、ただ指定するだけだとタップしているようなエフェクトが出ないため視認性がよくありません。

ということで、Tapジェスチャにエフェクトをつけるスニペットを作ってみました。

```swift
struct TapGestureWithEffect: ViewModifier {
    let action: () -> Void

    @State private var opacity = 1.0

    func body(content: Content) -> some View {
        content
            .opacity(self.opacity)
            .gesture(TapGesture().onEnded {
                withAnimation {
                    self.opacity = 0.3
                }
                DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(150)) {
                    withAnimation {
                        self.opacity = 1
                    }
                }
                self.action()
            })
    }
}
```

これは以下のように利用出来ます。

```swift
struct ContentView: View {
    var body: some View {
        List {
            ForEach(0..<100) { i in
                HStack(spacing: 12) {
                    RoundedRectangle(cornerRadius: 5)
                        .fill(Color.black)
                        .frame(width: 50, height: 50)
                    Text("Action")
                        .modifier(TapGestureWithEffect {
                            print(i)
                        })
                }
            }
        }
    }
}
```

これは以下のように動作します。
![画面収録-2021-03-06-23.28.13.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28406/41ca6cfe-27a5-f2cf-9e2a-b8e3381a41ab.gif)

今回は単純にopacityを操作したエフェクトでしたが、このあたりを変更することでもう少しこだわったエフェクトを作ることも出来るかと思います。
【個人開発】リモートでビンゴゲームができるアプリを作成しました【iOS,Android】

# はじめに
最近Androidアプリ開発の勉強会に参加しAndroid開発に関して学ぶ機会がありました。そこで学んだ知識をアウトプットしたいと思いリモートでビンゴができるアプリを作成しました。
(Androidアプリのみだと実用性がないためiOS版もリリースすることにしました)
この記事ではアプリの概要と使用した技術に関して記述しようと思います。

######Android
https://play.google.com/store/apps/details?id=jp.tomowebengineer.remotebingo

######iOS
https://apps.apple.com/jp/app/%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%93%E3%83%B3%E3%82%B4/id1553870448?itsct=apps_box&itscg=30200

# サービス概要
![フィーチャー画像remoteBingo.001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356150/45c18ee8-3275-903f-e1da-b9a475f94ad1.jpeg)

オンライン・リモートで遊べるビンゴアプリです。
特徴としてはビンゴカードなしで遊ぶことができ、無料で遊べるアプリになっています。

# 使い方
![images.002.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356150/971d7276-ab4a-7b85-8535-3a38b095e210.jpeg)
最初に表示される画面で主催者か参加者を選びます。

###主催者編
![images.003.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356150/1a4e33b1-0393-70c9-a932-2439f0d537d6.jpeg)
主催者としてルームを作成します。
ルーム名、説明(任意)、パスワードを入力します。上記の入力が完了したらルーム作成ボタンをタップしてください。
※パスワードをルームに参加する際に必要になりますので参加者全員に共有してください。

![images.004.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356150/68e38bd3-bcfa-867d-5bf6-aeb8814f7949.jpeg)
参加者が集まったら「ビンゴを開始する」をタップしてください。
![images.005.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356150/574f8aa0-b515-391a-3f0c-495d2198953b.jpeg)
準備完了です。抽選ボタンをタップしたらビンゴが開始されます。
###参加者編
![images.006.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356150/70c33649-1e06-4716-3ffb-c8fe3a3832fd.jpeg)
参加したいルームをタップしてください。
![images.007.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356150/87f3b82b-37cc-9153-5453-3c3f8bf02b93.jpeg)
主催者が設定したパスワードを入力し参加するボタンをタップします。
これで参加完了です。
![images.008.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356150/1d1633b4-8adf-3a83-e24c-a43cfa9bd26e.jpeg)

# 使用した技術
サーバー側の実装はすべてFirebaseに任せました。
Cloud FirestoreやFunctionsの使用経験がほとんどなかったため苦戦しました。
「実践Firestore」という書籍で細かくFirestoreの使い方に関して記載されており非常に参考になりました。

- Firebase
    - Authentication(匿名認証)
    - Cloud Firestore
    - Functions
    - Hosting (プライバシーポリシーをデプロイするため)
    - Crashlytics
    - Analytics
    - AdMob(インタースティシャル広告)

- Android
言語　Kotlin
アーキテクチャー　AAC
ライブラリー material-dialogs,lottie等
- iOS
言語 Swift
アーキテクチャー　MVVM
ライブラリー　RxSwift,RxCocoa,RxDataSources,lottie-ios等

###その他
プライバシーポリシー
下記サイトで自動でプライバシーポリシーのHTMLを生成しました。そのHTMLをFirebaseのhostingを用いてデプロイしました。
https://app-privacy-policy-generator.firebaseapp.com/

問合せページ
アプリを公開するには問合せ先のwebページを作成します。
1から作成するのはかなり手間がかかるので「ペライチ」というサービスを用いてお問い合わせページを作成しました。無料で使えるかつ15分ぐらいで問合せフォームが作れるので非常に便利です。
https://peraichi.com/landing_pages/view/remotebingo

#おわりに
Androidアプリ開発をしてみるとiOSとの共通点が多くあり簡単なアプリを作れるレベルには成長できた気がします。(コードは汚いので時間があるタイミングで綺麗にしたい泣)
また実際にアプリを作って公開しようと思うとプライバシーポリシーの作成やストア用の画像の準備、証明書関係の整理等思ったよりやるべき事が多く苦労しました。
しかしながら自分の作りたいアプリを好きな時間で作れるのが個人開発のいい点だと思います。
今後も時間を見つけて個人開発をしていきたいです。
[PHP]1行チャットプログラム

[こちら](https://nucopis.com/php-level2/)を参考に作ってみました。

<h2>[PHP]1行チャットプログラム</h2>

<h4>ロジック部分</h4>

```php
<?php
$filename = 'chat_data.dat'; //チャットのデータを格納するファイル

if(isset($_POST['name']) || isset($_POST['comment'])) {
    $name = $_POST['name'];
    $comment = $_POST['comment'];
    date_default_timezone_set('Asia/Tokyo');
    file_put_contents($filename, date("y/m/d H:i").",".$name.",".$comment."\n", FILE_APPEND); //ファイルへの書き込み(1書き込みごとに改行する)
}
$contents = file_get_contents($filename); //ファイルの読み込み
$lines = explode("\n", $contents); //読み込んだ内容を1書き込みごとに分け、配列に入れる
?>
...
<?php    
    foreach($lines as $value) {
        list($date, $name, $comment) = array_pad(explode(",", $value, 3), 3, null); //$linesをさらに","ごとに分け、それぞれ$date, $name, $commentに格納
?>
    <tbody>
        <tr>
            <td><?php echo $date; ?></td>
            <td><?php echo $name; ?></td>
            <td><?php echo $comment; ?></td>
        </tr>
    </tbody>  
<?php } ?>
```
<h4>制作物</h4>
![chat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1076475/31c16345-91b3-a23a-f7b3-445343c75c2d.png)

<h4>学んだこと</h4>

・ファイル操作

```php
file_put_contents($filename, date("y/m/d H:i").",".$name.",".$comment."\n", FILE_APPEND); //ファイル書き込み。FILE_APPENDはファイルの最後に追記することを表す
file_get_contents($filename); //ファイル読み込み
```


・文字列を任意の文字列で分割

```php
$lines = explode("\n", $contents);
```

・array_pad()

```php
list($date, $name, $comment) = array_pad(explode(",", $value, 3), 3, null);
```
explode()によって返される配列を3に制限し、返される値が3未満の場合、3になるまでnullが追加されるそう。
最初foreachで回す部分を

```php
<?php    
    foreach($lines as $value) {
        $data = explode(",", $value); 
?>
        <table>
            <tr>
                <td><?php echo $data[0]; ?></td>
                <td><?php echo $data[1]; ?></td>
                <td><?php echo $data[2]; ?></td>
            </tr>
        </table>
<?php } ?>
```
こう書いていましたが、「Undefined offset: 1」「Undefined offset: 2」が消えず、、、
ロジック部分の該当箇所に修正したら消えました。
あと、list(変数1, 変数2,,,)の書き方初めて知った。便利そう！

<h4>感想</h4>
bootstrap初めて使ったけど便利！
内積・外積を分かりやすく

* 機械学習を勉強していると内積、外積という言葉がよく出てくる。角度をあらわすんだよ、平行四辺形の面積だよ、画像処理では内積の計算が、相関係数は、みたいにいろんな所ででてくるけどイマイチよくわからなかったのでまとめました。

* （結論）
内積も外積も**ただの計算ルール**。
例えば二つのベクトルのなす角を知りたい（実際ほとんどこの場合）。その場合は内積という計算ルールで内積を計算すると便利。
平行四辺形の面積だったら外積という計算ルールで外積を計算すると便利。
ただそれだけ。

***


![内積外積 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701852/cdedee9c-ec23-bfb0-6538-e71634c0349b.png)
【二つのベクトルのなす角度が知りたい】

原点を始点とすると$\cos\theta$は上図より（三角関数の加法定理から）
$$\cos{\theta}=\cos(\alpha-\beta)=\cos\alpha\cos\beta+\sin\alpha\sin\beta　\tag{1}$$
ここで、$\vec{A},\vec{B}$の座標から
$$\cos\alpha=\frac{a}{\sqrt{a^2+c^2}} , \cos\beta=\frac{b}{\sqrt{b^2+d^2}},sin\alpha=\frac{c}{\sqrt{a^2+c^2}},\sin\beta=\frac{d}{\sqrt{b^2+d^2}} \tag{2}$$
が求まる。
(1)に代入すると

```math

\begin{align}
\cos\theta&=\frac{a}{\sqrt{a^2+c^2}}\frac{b}{\sqrt{b^2+d^2}}+\frac{c}{\sqrt{a^2+c^2}}\frac{d}{\sqrt{b^2+d^2}}\\
&=\frac{ab+cd}{|\vec{A}||\vec{B}|}\\
&=\frac{\vec{A}\dot{}\vec{B}(内積)}{|\vec{A}||\vec{B}|}

\end{align}
```

この$\theta$を求めやすくするための演算を内積と定義しているだけ。
２点の座標の演算を以下のように内積と定義している（計算しやすいし定義が分かりやすいから）。
$$\vec{A}\dot{}\vec{B}=ab+cd$$
その演算結果が$|\vec{A}||\vec{B}|\cos\theta$に等しくなるということ。

***
![内積外積2 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701852/89c5686f-a92c-5284-9144-4730ee40454e.png)




【二つのベクトルでできる平行四辺形の面積が知りたい】
原点を始点として同様に考えていく。まずは
$$\sin{\theta}=\sin(\alpha-\beta)=\sin\alpha\cos\beta-\cos\alpha\sin\beta　\tag{1}$$
から、（２）を用いて

```math

\begin{align}
\sin\theta&=\frac{c}{\sqrt{a^2+c^2}}\frac{b}{\sqrt{b^2+d^2}}-\frac{a}{\sqrt{a^2+c^2}}\frac{d}{\sqrt{b^2+d^2}}\\
&=\frac{bc-ad}{|\vec{A}||\vec{B}|}\\
&=\frac{\vec{A}\times\vec{B}（外積）}{|\vec{A}||\vec{B}|}

\end{align}
```

ここで平行四辺形の面積OACBは$\sin{\theta}$が負になることも考慮して

```math

\begin{align}
平行四辺形OACB&=|\vec{B}|\times|\vec{A}|\times|\sin{\theta}|\\
&=|\vec{A}||\vec{B}|\frac{|\vec{A}\times\vec{B}|}{|\vec{A}||\vec{B}|}\\
&=|\vec{A}\times\vec{B}|（外積）

\end{align}
```
となる。三角形OABならその面積は２分の１になる。簡単に座標から面積が求められる。
その演算ルールが外積でそのルールが以下となる。
$$|\vec{A}\times\vec{B}|=|ad-bc|$$
Angular　親子関係にあるコンポーネント間でデータの受け渡しをしたい時

こんにちは！

今日はAngularで親子関係のコンポーネント間でデータの受け渡しについてまとめていきたいと思います。

`@Input`デコレータ　`@Output`デコレータを使用したやり方です。

本当はServiceクラスを実装してService経由でデータの受け渡しをするのが良いそうなのですが、、今回はそのやり方は割愛させて頂きます。
また、いつか気がむけば投稿したいと思います。

# 親から子にデータ渡したい時

### 親コンポーネント側

```ts

export class ParentComponent implements OnInit {

  constructor() { }
  greet: string = "こんにちは"
}
```
まずは親となるコンポネントで渡したいデータのプロパティを定義します。


```html
 <app-child [hello]="greet"></app-child>
```
HTMLファイル側では上記のような記述で渡すことができます。
意味としては親側で定義した`greet`という変数を`hello`という名の変数名で子コンポーネントに渡しています。


### 子コンポーネント側

```ts

import { Component, Input } from '@angular/core';

export class ChildComponent implements OnInit {
  constructor() { }
  @Input() hello: string
```

`@Input`デコレータを使用して親から渡された変数を受け取っています。
なので、ここの変数名は親から渡された変数名と一致している必要があります。
これで`ChildComponent`では　`hello`という変数を使用することができます。
HTMLファイルで`{{ hello }}`と書けば"こんにちは"と出力されるでしょう。

親から子に渡す方法は以上です。
これは以外と簡単ですね。



# 子から親にデータ渡したい時

### 子コンポーネント側


```ts
import { Component, Output, OnInit, EventEmitter } from '@angular/core';

export class ChildComponent implements OnInit {

  constructor() { }

  @Output() public greet = new EventEmitter()

  ngOnInit(hello = "こんにちは"): void {
    this.greet.emit(hello)
  }

```

子コンポーネント側で`@Output`デコレータを使用して親に`emit`(放出)する変数を定義します。
`@Output` はEventEmitter型になります。

ngOnInitはコンポーネントが呼び出されると同時に実行される関数を定義しておくところです。

ここではhelloという変数を`emit`(放出)して親コンポーネントに渡しています


## 親コンポーネント側

```html
<app-parent(greet)="sayHello($event)"></app-parent>
```
`greet`が`emit`されたら`sayHello`メソッドが発火されるようにしています。
`$(event)`が今回子コンポーネントから受け取った変数("こんにちは")です。

```ts
 sayHello(hello: string): void  {
    console.log(hello)
  }
```
コンソールに"こんにちは"が出力されるはずです。

これで、子コンポーネントから親にデータを渡すことができました。

この方法はデータの受け渡しが関数の引数経由になるので、処理が複雑になってくるとバグの温床になりかねないので、ただデータを受け渡したいだけなのであればおすすめできないです。


子コンポーネントから親コンポーネントのメソッドを引数を渡して実行したい時などに使えるかと思います。

`@Input` `@Output`を使用したデータの受け渡しについてまとめました。

やっぱり自分でまとめてみることで理解が深まりますね。

これからも継続的に続けていきたいと思います。


おしまい
MacでPythonの環境作りからTableauでTabPyを利用するまで

#はじめに

最近、プログラミングに触れることも少なくなったのだけど、TableauでTabPyを利用する必要がでたので、Pythonを書く訳ではないもののPythonの環境作りをして、TabPyを利用できる準備をしてみた。
TabPyとは、BIツールであるTableauからPythonの機械学習モデルを呼び出せる仕組み。

随分、プログラミング環境も整える機会も減ってしまったので、まずは `brew` をインストールして必要なパッケージを揃えてきいく。

####目次
[1.Pythonの環境準備](#1-Pythonの環境準備)
[2.TabPyのインストール](#2-TabPyのインストール)
[3.おまけ（TableauでのTabPy活用](#3-おまけ（TableauでのTabPy活用)

#1.Pythonの環境準備
Pythonの環境は以下で実現

```zsh
# pyenvの準備
$ brew install pyenv
$ echo 'eval "$(pyenv init -)"' >> ~/.zshrc    
$ exec $SHELL -l

# インストールできるVersionを確認
$ pyenv install --list

# インストールできるVersionを確認
$ pyenv install --list

# pythonのインストール
$ pyenv install 3.7.9
$ pyenv global 3.7.9 
$ eval "$(pyenv init -)"
$ python --version
Python 3.7.2

# anacondaのインストール
$ pyenv install anaconda3-2020.11
$ pyenv global anaconda3-2020.11
```


#2.TabPyのインストール

TabPyのインストールは、Githubを参考に。
https://github.com/tableau/TabPy
以下に手順はあったので容易にインストールはできる。
https://github.com/tableau/TabPy/blob/master/docs/server-install.md

```zsh
#pipを最新に
$ python -m pip install --upgrade pip

#TabPyをインストール
$ pip install tabpy

#TabPyの起動確認
$ tabpy

#以下のような起動メッセージがでれば起動完了（portなどは後のTableauで利用する
[INFO] (app.py:app:105): Web service listening on port 9004
```

#3.おまけ（TableauでのTabPy活用

最終的に実施したかったのは、TableauでのTabPyを利用したかったので、上記で起動したTabPyに接続をする。

####Tableau DesktopからTabpy Serverに接続
1. Tableau Desktopを起動
2. `ヘルプ` →　`設定とパフォーマンス`　→　`分析の拡張機能の接続`　を選択
3. `TabPy/External API` を選択して、サーバを `localhost`、ポートが `9004`であることを確認して、`テスト接続`を実施
4. `OK` を押して接続が完了

<img width="300" alt="tableau_tabpy.png" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32801/4e2483d6-8a97-4980-da62-2cf27e52efc1.png>

Pythonの環境作りやTabPyの起動までは意外とさまよった部分はあったのだが、結果として整理してみると意外とさらっと終わる手順であった。
【Amplify利用者必読】AmplifyConsoleでのアプリの削除は本当に気をつけてください

# はじめに
つい先日、とある公開中のサイトのバックエンドが開発環境も本番環境も、全て消え去るというAmplify史上もっとも衝撃的な事象が発生しました。

公開してまもなく、CognitoもDynamoDBなども使っていないサイトでしたので被害は最小限でしたが、これがバリバリに運用中の会員登録制サービスで起きていたらと考えたら、ただただゾッとしますね、、、。

今回のトラブルは、知っているか知らないかだけで、防げる部分もあるので、知らずにこんな辛い思いをする人が1人でも減ったらいいな、と思い記事を書いています。

# 原因
原因は、AmplifyConsoleからのアプリの削除です。
GUIからボタン一つで簡単にバックエンドがすべてが消え去りました。

そしてコレには、AmplifyConsoleの歴史が関わってくるため、少し解説していきます。

# AmplifyConsoleの変遷
AmplifyConsoleはこの1〜2年で以下のような変化を遂げています。
(正確に記録はしていないため、だいたいなイメージになります。)

1. もともとAmplifyCLIとAmplifyConsoleは完全に独立していた

2. いつの日からか、AmplifyCLIで作成したバックエンドとAmplifyConsoleで作成したアプリを紐付けできるようになる

3. その後、AmplifyCLIでバックエンドを作成すると、AmplifyConsole上にアプリが自動作成されるになる

4. そして最近、AdminUIが登場したタイミング？で、バックエンドもAmplifyConsole上で管理ができるようになる

この変化の過程の中で、今回の悲劇を招きました。


# アプリの管理と悲劇
1と2の段階ではなんだかんだ別物なので、バックエンドとアプリは、それぞれ独自に作成をしていました。

3でアプリは自動作成されるようになりましたが、よくわかっていなかったことと1と2の流れもあって、自動生成されたアプリは使わずに、自分で作成したアプリを使っていました。
自動生成されるアプリは邪魔だな、と思って、毎回消していました。

そしてAdminUIが始まった以降に作成した環境で悲劇は起きます。

AdminUIの登場でAmplifyConsoleでバックエンドも管理ができるようになったことで、アプリにバックエンドも紐付き、バックエンドについてもクローンや新規作成、削除がGUIから行えるようになっています。そして、いままで邪魔だと思って消していたアプリの削除は、バックエンドに完全に紐付いたことで、すべて消し去りました。

# 簡易対策
とりあえず今思いつく対策？がこちらです。

- アプリを削除=バックエンドの削除という認識を持って、取扱いを本当に気をつける
- AmplifyConsoleでは、AmplifyCLIによって自動生成されたアプリを使用する
- IAMでAmplifyConsoleでの作業権限を制限する(やや本末転倒感があるが)

# おわりに
AdminUIの登場により、GUIから管理がしやすくなったというメリットが生まれましたが、こんな簡単にGUIからバックエンドをすべて削除できてしまうことに、非常にビビっております。

ベターな管理の仕方をご存知な方がいれば、ぜひお教えいただきたいです。

なにはともあれ、Amplifyユーザーに幸あれ。