OmniAICreator/Qiita-1.07M huggingface dataset:
PostgreSQLのクライアント認証がtrust設定なのに認証を要求される

## はじめに
PostgreSQLのpostgresユーザのパスワードを忘れてしまったので、[こちら][link-1]を参考にパスワードを再設定しました。しかし、クライアント認証をtrust設定にしてもパスワードを聞かれ、ローカルループバック経由でログインできません。
その原因を解決し、ログインするまでをまとめます。

## 対象読者
- PostgresSQLのクライアント認証がtrust設定なのに、認証を要求またはアクセス拒否される人

## 環境
- PostgreSQL 10.12
- Windows 10
- ネットワークアダプタの<strong>インターネット プロトコル バージョン6</strong>は、チェックオフ

## ハマった事象
変更前のpg_hba.confは以下になります。

```plaintext:pg_hba.conf
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
```

IPv4ローカルループバックアドレス経由でアクセスするので、その認証設定をtrustに変更します。

```plaintext:pg_hba.conf
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 md5
```

これでログインできると思ったら、パスワードを聞かれてログインできない！

```console:コマンドプロンプト
C:\Users\xxxxx>psql -U postgres
ユーザー postgres のパスワード:
```

## 解決方法
IPv6ローカルループバックアドレスの認証設定をtrustに変更します。

```plaintext:pg_hba.conf
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 trust
```

## 原因究明
ローカルからログインできるようになりましたが、原因が気になったので調べてみました。
原因は、IPv4のローカルループバックアドレス経由でアクセスしていると思っていたら、IPv6のローカルループバックアドレス経由でアクセスしていたことでした。

IPv4、IPv6どちらか確認するには、localhostに対してpingを実行します。[こちら][link-2]を参考にしました。

IPv6をIPv4より優先する環境で実行すると、以下のようになります。

```console:コマンドプロンプト
C:\>ping localhost

ARC09 [::1]に ping を送信しています 32 バイトのデータ:
::1 からの応答: 時間 <1ms
::1 からの応答: 時間 <1ms
::1 からの応答: 時間 <1ms
::1 からの応答: 時間 <1ms
```

### どうしてIPv6のローカルループバックアドレスにアクセスするの？
ネットワークアダプタのIPv6をチェックオフにしても、IPv6が完全に無効になるわけではない。また、IPv6の優先度がIPv4のそれより高く設定されていることのようです。
[こちら][link-3]が、非常に参考になりました。

## 最後に
IPv4、IPv6に気を付けないと、別のミドルウェアのクライアント認証でもハマるかもしれない。
緩めた認証は、必要がなくなったら締めなおしましょう！

最後までお読みいただきありがとうございます。何かのお役に立てたら幸いです。

## 参考文献
- [Postgresでパスワードを忘れた場合の対策][link-1]
- [IPv4 を IPv6 より優先にする][link-2]
- [IPv6 より IPv4 を優先する方法（無効化は Microsoft 的に非推奨）][link-3]
[link-1]:https://qiita.com/colorrabbit/items/0e481af2490603a271fe
[link-2]:https://www.vwnet.jp/Windows/w7/IPv4/IPv4PriorityUP.html
[link-3]:https://turningp.jp/server-client/windows/windows-ipv6-ipv4
200422学習記録：構造タグ

200422TechAcademyでhtml,cssの復習

◆構造タグ

〇大枠
```<header></header>```
```<div></div>```
```<footer></footer>```

〇大枠の中
```<section></section>```
ナビの場合
```<navi></navi>```
サイドの場合
```<aside></aside>```

〇ほか
写真キャプション
```<figure></figure>```
```<figcaption></figcaption>```
インライン
```<span></span>```

◆知らなった構造タグ

〇wrapperの使い方

ボディの「メインエリア」と「サイドバー」に分けるが横並びなので「wrapper」でくくる。

<!--wrapper-->
    <div id="wrapper">
      <!--ここからメイン-->
      <div id="main">
      </div>
      <!--メインここまで-->
      <!--ここからサイドバー-->
      <aside id="sidebar">
      </aside>
      <!--サイドバーここまで-->
    </div>
<!--wrapperここまで-->

〇figure
写真のキャプションの際に使う

```
<figure>
    <img src="images_kitchen/photo02.jpg" alt="TechAcademy KITCHENについて2">
    <figcaption>完成間近の作品</figcaption>
</figure>
```

〇span
インライン要素（横並び）で構造をしめす際に使う

```
<ul>
<li>
  <span>2016/08/24</span>
   <a href="course.html">講座案内を更新しました</a>
</li>
</ul>
```
Ruby on Rails チュートリアル 10日目

##10日目
今日は、チュートリアルの６章を終わらせました。
今回のことで改めて気づいたことは、コンソールやテストをやる時はやっぱり新しくターミナルを開いた方が良いことです。他は特に難しいことはあまりありませんでした。
明日は、７章をやっていきます。
古くないOpenFOAMに乱流モデルを追加する

# 古くないOpenFOAM
OpenFOAM 3.0より新しいバージョンでの乱流モデルの追加の仕方。3より古いとやりかたが違う。

# 参考
How to add a turbulence model in OpenFOAM-3.0.0
http://hassankassem.me/posts/newturbulencemodel/
ここのやり方は自分の作業ディレクトリにソースを置く前提。src/TurbulenceModelsにソースを置く方法が以下。

# 乱流モデルのソースの場所

- src/TurbulenceModels/turbulenceModels/RAS にモデルがいっぱいある。
- src/TurbulenceModels/compressible/RAS にはbuoyantKEpsilonがある。

# 乱流モデルの名前はどこに書くか
incompressibleは
src/TurbulenceModels/incompressible/turbulentTransportModels/turbulentTransportModels.C

compressibleは
src/TurbulenceModels/compressible/turbulentFluidThermoModels/turbulentFluidThermoModels.C

# 乱流モデルの追加
compressibleの乱流モデルを追加するとします。src/TurbulenceModels/compressible/turbulentFluidThermoModels/turbulentFluidThermoModels.Cに

```cpp
#include "mySpalartAllmaras.H"
makeRASModel(mySpalartAllmaras);
```

等として新しいモデルの情報を記載。新しい乱流モデルのソースファイル（.Hと.C）は/src/TurbulenceModels/compressible/RASにいれておきます。

** その後，src/TurbulenceModels/compressible/のlnIncludeを削除してから，srcの中のAllwmakeを実行する。** 

lnIncludeディレクトリを削除しないと，追加したモデルのヘッダーファイルが見つからないって怒られます。ここ重要。
違うドメインを叩くときに躓いたのでメモ（自分用）

# 概要
JavaScriptアプリからSpringBoot*JAVAのアプリをコールしようとした。
fetchAPIを使用して試みたが、エラーで上手くApiをたたけず
status: 0 みたいなレスポンスが返ってきたので調べてみた

## 躓いた内容
fetch API を使用してJavaScriptからSpringBootのAPIをコールするときのHTTPリクエスト・レスポンス周り

## 詳細
コール元とコール先のドメインが異なることで、危険なリクエストと判断されて？エラーが帰っていた。
解決するには、認証の設定が必要。



調査した結果、
ヘッダの情報を元に安心なサイトからのリクエストなのかを認証？する必要があるらしい。
 <b>CORS(Cross-Origin Resource Sharing)</b>というもの。

HTTP周りに詳しくないため、応急処置的な対応にはなったが、
リクエストを飛ばすフロントAppは、自己のドメインをリクエストヘッダに詰める必要があり
コールされるAPIはどのOriginからのリクエストを許可するか設定が必要だった。

- フロントの実装

```js
headers: {
 "mode": "cors",
 "Origin": "http://localhost:9000"
}
```

- APIの実装

```java
import org.springframework.web.bind.annotation.CrossOrigin;
@CrossOrigin
```


#### フロントの実装
今回フロントはJacaScriptでfetchApiを使用してAPIコールをした。
その際、fetchApiに渡すheadersに上記を追加する。
"mode"は別ドメインへのリクエストを表す（no-corsとかもあった）
"Origin"は自己のドメインをリクエスト先に伝えるために必要？

#### APIの実装
コールされるAPIはSpringBoot*JAVAで作成した。
@RestControllerクラスのMappingされるメソッドに
@CrossOriginアノテーションを付与する。
これはワイルドカードてきな物で、クロスドメインからのリクエストをすべて許可するらしい。
セキュリティ的に危ないので、細かく指定することも可能


### まとめ
ひとまずは上記で解決し、Promiseでラップされたレスポンスを受け取ることができた。

以下参考にしたURL
https://qiita.com/tomoyukilabs/items/81698edd5812ff6acb34
https://ja.javascript.info/fetch-crossorigin
https://qiita.com/syukai/items/4e88749d1d62f1148e45
https://teratail.com/questions/144992
https://qiita.com/tomoyukilabs/items/81698edd5812ff6acb34
GitHubのリポジトリで複数のライセンスを示す

# 手順
1. リポジトリのルートにあるCreate new fileからLICENSE(.txt)ファイルを作成する
2. LICENSEファイルへ複数のライセンスを書き込む
3. コミットして完了

複数のライセンスを書き込んだ場合は、リポジトリのライセンス欄がView licenseとなる。
【JavaScript入門】JavaScriptをHTMLの中に書き込み、及び呼び込む方法

# JSをHTMLの中に書き込む
以下の方法でOK。

```html
</head>
<body>
  <script>
    //ここにJSを記述
  </script>
</body>
```
## 問題点
シンプルだが、この方法だとコードが冗長になりやすい。
なので、本来はJSのファイルを呼び込む方法が用いられる。

# JSファイルをHTMLファイルに呼び込む方法
まず前提として、以下のような階層があるとする。（名前は適当です）
:file_folder:practice
  :page_facing_up:index.html
  :page_facing_up:script.js
  :page_facing_up:style.css
この階層の時には以下の方法で呼び出せる

```html
</head>
<body>
    <script src="script.js"></script>
</body>
```
以上である。

# まとめ

- [x] JSのファイル名をHTMLのbodyタグの中に記述することで呼び出し可
[JavaScript]download属性が効かないIEのために

# 概要

下記のようにaタグにdownload属性を設定することで、「dl.pdf」を「ダウンロード.pdf」としてダウンロードして保存できるが、IEではうまく効かない。

```html
<a href="dl.pdf" download="ダウンロード.pdf">
```

## スクリプト

```javascript
    if(document.documentMode && navigator.msSaveOrOpenBlob){
        var as = $('a');
        as.on('click',function(eve){
            var $a = $(this);
            if(!$a.attr("download")){
                return false;
            }
            eve.preventDefault();
            var filename = $a.attr("download");
            var xhr = new XMLHttpRequest();
            xhr.open("GET", $a.attr("href"));
            xhr.responseType = "blob";
            xhr.send();
            xhr.onload = function(){
                navigator.msSaveOrOpenBlob(xhr.response, filename);
            };
            return false;
        });
    }
```
在宅勤務が多いこの時期を利用して新入社員がAWSの資格をとる記録

#取得する経緯
もともと会社でAWSの資格取得が奨励されていますが、コロナ禍で新入社員（中途）でありながら自宅で研修することが多くなったので、取得に向けて計画を建てました。


#取得予定の資格

【必須】
SAA（ソリューションアーキテクトアソシエイト）

※5月~~27日~~24日に受験予定
↑リスケジュールしたがオンラインで簡単に手続きできた。

【任意】
DVA（ディベロッパーアソシエイト）

※勉強は進めるができれば受験が視野に入るところまでに持っていきたい

#学習方法
・Web問題集での学習→最低でも2週したい。
　https://aws.koiwaclub.com/

・不明点など、検証環境を用いて確認

検証済み項目
VPC
EC2
NAT Instance
NAT Gateway
RDB
Lambda
API Gateway
ALB


#スケジュール
・5月1日までにSAA＃129まで一周する。
・5月15日までに二週、不明点は検証環境を用いて確認

Web問題集進捗（終了した番号）

1週目

|4/20  |4/21  |4/22  |4/23  |4/24  |4/27  |4/28  |4/30  |5/1  |
|---|---|---|---|---|---|---|---|---|
|SAA#42  |SAA#60  |SAA#70<br>DVA#5  |SAA#80  |SAA#95  |SAA#100  |SAA#105<br>DVA#10  |SAA#119  |SAA#129(完了)  |

2週目

|5/7  |5/8  |5/11  |5/12  |5/13  |5/14  |5/15  |5/18  |5/19  |5/20  |5/21  |5/22  |
|---|---|---|---|---|---|---|---|---|---|---|---|
|SAA#020  |SAA#040  |SAA#055  |SAA#070  |SAA#085  |SAA#100  |SAA#115  |SAA#129  |SAA#080-090  |SAA#091-095  |SAA#096-100,130  |SAA#101-110  | 

#懸念点
・前職でNW機器をメインで取り扱っていたこともあり、実際のアプリ開発などの実践的なプログラミング知識が浅い。Lambdaなどアプリケーションに焦点が当たる機能を持つサービスを検証、理解ができるか。
→公式ドキュメントやサンプルコードを読み込んで理解する。そのほか、基本的な機能をプログラミングし、実装してみる。

#試験当日
　昨日24日に秋葉原に試験を受けに行ってきました。
　受付で予約時間と名前を告げ、運転免許と署名済みクレジットカードを提示して受付を完了します。
　
　試験中は個別に仕切られたPCで回答します。計算用に紙と鉛筆がデスクに置いてありましたが、携帯や腕時計の持ち込みは禁止です。

　試験前は時間制限に不安を抱えていましたが、実際受けてみると30分ほど余裕を残して終了できました。

　回答を終了するとその場で合否が通知されます。自分はありがたく合格をいただきました。合格通知は5営業日ほどで送付されるようです。
ffmpeg インスタライブのデータは鏡像で配信される問題

PC 上でインスタグラムのストーリーやインスタライブを見る事が出来ることが前提で、且つ自分でファイルとしてダウンロード出来る人若しくは、単に動画を鏡像変換したい人向けの忘備録です。

インスタライブの配信の際、スマートフォンのインカメラで配信を行うと自動的に鏡像配信されてしまう。
その鏡像撮影された動画を、正常画像へ変換するスイッチ類を以下に列挙する。

```text
ffmpeg -i instalive.mp4 -i instalive.m4a -vf hflip -vcodec libopenh264 -vb 800k -c:a copy -map 0:v:0 -map 1:a:0 output.mp4
```

* 一つ目の <code>-i</code> は動画ファイル 二つ目の <code>-i</code> は音声ファイル
* <code>-vf hflip</code> これが鏡像を変換するオプション
* <code>-vcodec libopenh264</code> これは再変換する際に h264 コーデック利用する宣言文でこの辺りは適宜自分の環境や変換先のコーデックに合わせる
* <code>-vb 800k</code> 再変換時の転送レート
* <code>-c:a copy</code> 音声はバケツリレー
* <code>-map 0:v:0</code> 最初の 0 は <code>-i</code> の入力順でこの例ではトップバッターに動画を指定してる
* <code>-map 1:a:0</code> セカンドバッターがオーディオファイルなので最初が 1 になる
【Eclipse Java】開発環境設定メモ

EclipseでJavaプロジェクトを開発する際の、忘れがちなTipsをメモしています。

##Spring Boot プラグインのインストール
・eclipse マーケットプレイスで『spring boot』投入して、取得。spring ide bootがインストールされているのを確認。
・gradleプラグインのBuildshipがインストールされているのを確認。

##Spring Boot Gradleプロジェクト作成
何の気なしに作成してしまうとMavenプロジェクトができてしまうので、メモしておきます。
・eclipseプロジェクト作成。
・新規→spring boot / spring スタータープロジェクトを選択。
・型: gradle（build ship）を選択。←これを忘れないように。

##Eclipse Workspace引っ越し
Eclipseで複数のプロジェクトを同一のWorkspaceで開発していて、Workspaceをわけたくなる事があります。しかし、単純に新しいWorkspaceを作成して移動するとなると、エディタ設定やCheckStyle設定を新たに行う必要があり面倒です。そんな時は、下記の手順で行います。

<設定のエクスポート／インポート>
1. プロジェクトのエクスポート（移動元ワークスペースでの作業）
　　ファイル-エクスポート-一般-アーカイブファイル
2. プロジェクトのインポート（移動先ワークスペースでの作業）
　　ファイル-インポート-一般-
　　フォルダーまたはアーカイブからプロジェクト-アーカイブ-ファイル選択
BootstrapでDatetimePickerを使う時のモバイルキーボード非表示

#やりたかったこと
モバイル向けのWebアプリで、アイコンをタップするとカレンダーや時刻の入力を直感的に入力できるようにしたい。
※WebアプリはGAS、ブラウザはiOS版Chromeにて動作確認しています。

#実装と問題点
Bootstrap4＋DatetimePicker（Tempus Dominus Bootstrap 4）で実装[^1]。
動作はするものの、折角追加したカレンダーがモバイルのタッチキーボードで隠れてしまう。見栄え、操作性の両面で非表示にしたい。
![IMG_3317.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445087/0319aaaf-1837-595b-8b98-93b35eb4a40a.png)

##inputをreadonlyに
inputをreadonlyにすると、フォーカスを抑えられるのでタッチキーボードは表示されなくなった。

```html
<input type="text" class="datetimepicker-input form-control" data-target="#datetimepicker1" readonly="readonly" />`
```
と思ったら、DatetimePickerのイベントまで発火しなくなっていただけだった。

##DatetimePickerのOptions
公式ドキュメント[^2] によると、対象のinputがreadonlyである場合、OptionsにignoreReadonlyを設定してやる必要があるとのこと。フォーマットなどと一緒に `ignoreReadonly: true` を定義します。

```js
$(function(){
  $('#datetimepicker1').datetimepicker({
    format: 'YYYY/MM/DD (ddd)',
    locale: 'ja',
    ignoreReadonly: true
  });
});
```
無事、タッチキーボードが表示されなくなりました。
![IMG_3319.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445087/72f8f416-4ed8-31e1-2ce8-26dff3eb55fb.png)

##readonly部品の背景色変更
当初のデザイン通りにしたいので、inputの背景色を白に戻します。
Bootstrapで定義されている`.form-control[readonly]`に対して、`background-color`を上書きします。

```css
.form-control[readonly]{
  background-color: #fff;
}
```
※ここで`background: #fff;`と記述してしまうと、表示結果が変わります。Bootstrapが`.form-control`に定義していた`background`のプロパティが全てリセットされた上で`background-color: #fff;`だけが再定義されることになる（と思う）ので、注意してください。
![IMG_3320.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445087/ac515ad2-d922-1866-6b26-dfda3d3fc8ac.png)

参考にさせて頂いたURLは注釈にて記載いたします。
[^1]: [Bootstrap 4でDatetimePickerを使いたい](https://qiita.com/yaju/items/2cbe5e5914c5be08820a)
[^2]: [Tempus Dominus Bootstrap 4 公式](https://tempusdominus.github.io/bootstrap-4)
貿易統計を学び合う会 （資料）コロナマスク関連の貿易

# コロナウイルスでマスク需要が伸びています。2020年1-3月で関連品目がどうだったかを集計してみました。
### HSコード９桁レベルなので、正確ではないですが、おそらくそうだろうというレベルでレポートです。

### [84490000](https://www.kanzei.or.jp/statistical/tariff/detail/index/j/844900000)　輸出　不織布の製造機械（多分）1月にピークです。おそらくマスク製造装置だと思われます。１月にするどいピークがありますが、2月には落ちて、また3月には少しあがっています。
![200428_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48387/2f9184c0-834a-0cee-e084-30f5b420324d.png)

### 630790000  輸出　紡織用繊維　おそらくマスク用　
マスクの素材だろうと思わる繊維の日本からの輸出は、1月 15.7億 2月 84.0億　3月19.3億と変遷しています。。素材を輸出してマスクを日本は輸入しているのでしょうか？　だとするなら日本国内でつくってもよいのではと思ってしまいます。

![200428_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48387/e6d94021-68f4-c2c3-663e-6349cbae99b1.png)

### [630790029](https://www.kanzei.or.jp/statistical/tariff/detail/index/j/630790029) 輸入　マスクの輸入は、２月にがくっと減って、また回復しています。

![200428_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48387/5ddabc70-7623-fafb-2fa4-bac1336daf86.png)
基本中の基本CSSのプロパティ一覧

筆者はプログラミング歴1年の新参者です。
今までアプリ開発の仕事をしていたのですが、コロナショックで凍結になり、Web関連に異動することになりました。

そこで、逃げていたCSSの学習をしています。

備忘録にHTMLのタグ一覧を投稿します。

#CSSのプロパティ一覧
 - `color:#dddddd;`
   文字の色

 - `font-size:00px;`
   文字のサイズ（単位ピクセル）

 - `font-family:"Avenir Next";`
   文字の種類（明朝体等）

 - `background-color:#dddddd;`
  　背景色
 
 - `width:00px;`
   横幅(単位ピクセル)

 - `heght:00px;`
   縦幅(単位ピクセル)

 - `float:left`
   横並びにする
pythonとyoutube-dlで簡単にmp3/mp4をダウンロードする！

##目的
pythonとyoutube-dlで簡単にmp3/mp4をダウンロードする！

##環境
```bash

$python3 --version
Python 3.7.3
```

##mp3変換のためのffmpegをインストールする
```bash
$brew install ffmpeg
```

##DLフォルダ作成
```bash
$mkdir mp4-download
```

##Python用仮想環境
```bash
$cd mp4-download
$python3 -m venv venv
$source venv/bin/activate
```

##youtube-dlをpipでインストール
```bash
$pip install youtube-dl
```

##動画(mp4)をダウンロード
```bash
$youtube-dl https://youtu.be/UVapiyZr2Mk
```bash
##実行結果
```bash
[youtube] UVapiyZr2Mk: Downloading webpage
[download] Destination: 豆腐だよ全員集合-UVapiyZr2Mk.mp4
[download] 100% of 20.11MiB in 00:07
```

##動画(mp4)をダウンロード
```bash
$youtube-dl https://youtu.be/RFuKNaHE63M
[youtube] RFuKNaHE63M: Downloading webpage
[download] Destination: アスタリア　ＳＫＴ豆腐屋-RFuKNaHE63M.mp4
[download] 100% of 16.55MiB in 00:05
```

##ダウンロード結果確認
```

$ls -a
.
..
venv
豆腐だよ全員集合-UVapiyZr2Mk.mp4
アスタリア　ＳＫＴ豆腐屋-RFuKNaHE63M.mp4
```

##動画再生
```
$open 豆腐だよ全員集合-UVapiyZr2Mk.mp4 
$open アスタリア　ＳＫＴ豆腐屋-RFuKNaHE63M.mp4
```

##mp3ダウンロード
```
$youtube-dl --extract-audio --audio-format mp3 https://youtu.be/OfbBWmO45rs
```
##実行結果
```
[youtube] OfbBWmO45rs: Downloading webpage
[youtube] OfbBWmO45rs: Downloading MPD manifest
[download] 【ジェンキンズ人生相談室】ご相談者ピロミさんへ-OfbBWmO45rs.webm has already been downloaded
[download] 100% of 17.78MiB
[ffmpeg] Destination: 【ジェンキンズ人生相談室】ご相談者ピロミさんへ-OfbBWmO45rs.mp3
Deleting original file 【ジェンキンズ人生相談室】ご相談者ピロミさんへ-OfbBWmO45rs.webm (pass -k to keep)
```

##mp3再生
```
$open 【ジェンキンズ人生相談室】ご相談者ピロミさんへ-OfbBWmO45rs.mp3
```

##以上！
ありがとうございました！
【Dart】クラスやコンストラクタなど基本文法

Dartの基本的な文法についてまとめました。

また、あやふやだったクラスやインスタンスなどの整理も同時に行いました。

## オブジェクト
物。クラスやインスタンスをざっくりと表現するもの。

オブジェクト指向によってクラスやインスタンスが作られたので両方ともオブジェクトであると言えます。

オブジェクト = クラスとかインスタンスとかを説明するもの

ぐらいの認識でいいのではないでしょうか。自分はそうしてます。

>モノの特性や動作の情報をまとめた箱みたいなもの。
特性をプロパティ、動作をメソッドと呼ぶ。
[乃木坂46で、クラス・インスタンス・コンストラクタを理解する](https://qiita.com/yukiTTT/items/31e5dcb9823de5b78b99#comments)

## クラス
インスタンスを生み出すための設計図。

クラス(乃木坂46や車、ポケモンなど概念的なもの)を設計図としてまとめておくことで効率良くインスタンス(白石麻衣やBMW、カイオーガ)を生み出します。

もう少し具体的に説明するとその概念の普遍的な特徴(ポケモンで言えば、名前やタイプ)をあらかじめ設計しておくことでいちいち個別に名前やタイプを定義し直すことなく、代入するだけで新たなポケモンを生み出します。

```dart:pokemon.dart
class Pokemon {
  final String name; //名前
  final String type; //タイプ
  final String ability; //特性
  final String stats; //個体値

  Pokemon({this.pid, this.name, this.type, this.ability, this.stats});
   //コンストラクタ
}
```

## インスタンス
クラスから生み出されるオブジェクト。

## コンストラクタ
初期化をし、インスタンスを生成する関数。

不思議なもので初期化して一旦まっさらな状態にしないと新しいポケモンが考えられないようです。

また、Dartではクラスと同じ名前のメソッドを宣言することでコンストラクタを宣言できます。

```dart
Pokemon({this.name, this.type, this.ability, this.stats});
```
この部分ですね。

## クラスの継承
>Dartはクラスとミックスインベースの継承を基本としたオブジェクト指向言語なので、全てのクラスは一つのスーパークラスを持ちます。

Dartではサブクラスはスーパークラス(継承元)のコンストラクタを呼び出すことはないので呼び出すには`super`を使用します。

みずタイプクラスからカイオーガを生成しようとすると多分こうなります。

```dart:watertype.dart
class WaterType extends Pokemon {
  WaterType(String name, String type, String ability, String stats) : super(String name, String type, String ability, String stats);

  void attacks() {
    print('ハイドロポンプ');
  }

  var kyogre = new WaterType('カイオーガ', 'みず', 'あめふらし', 'めっちゃ強い');

  kyogre.attacks();
}
```

またサブクラスからスーパークラスのオーバーライド(上書き)をして新しくメソッドを定義し直すことも可能です。

```dart:firetype.dart
class FireType extends WaterType {
  FireType(String name, String type, String ability, String stats) : super(String name, String type, String ability, String stats);

  @override
  void attacks() {
    print('ねっぷう');
  }

  var charizard = new FireType('リザードン', 'ほのお', 'もうか', '強い');

  charizard.attacks();
}
```



## 参考
- [Dart入門 - Dartの要点をつかむためのクイックツアー](https://www.amazon.co.jp/Dart%E5%85%A5%E9%96%80-Dart%E3%81%AE%E8%A6%81%E7%82%B9%E3%82%92%E3%81%A4%E3%81%8B%E3%82%80%E3%81%9F%E3%82%81%E3%81%AE%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%83%84%E3%82%A2%E3%83%BC-%E3%83%8A%E3%82%AB%E3%83%8E%E3%83%92%E3%83%88%E3%82%B7-ebook/dp/B07H78C9GR)
- [乃木坂46で、クラス・インスタンス・コンストラクタを理解する](https://qiita.com/yukiTTT/items/31e5dcb9823de5b78b99#comments)
pyenvメモ

#environment
- Macos Catalina 10.15.1

#install & check folder
~~~linux
$ brew install pyenv
$ cd ~/.pyenv
~~~
[you can also install by git](https://qiita.com/1000ch/items/93841f76ea52551b6a97)

#list packages and install python3.6.7 python3.6.8
~~~linux
$ pyenv install -l
$ pyenv install 3.6.7 3.6.8
$ pyenv versions
* system(set by /Users/xxxx/.python-version)
  3.6.7
  3.6.8  
~~~

#create virtual environment
~~~linux
pyenv virtualenv python_version environment_name
$ pyenv virtualenv 3.6.7 environ_3.6.7
$ pyenv versions
  system
  3.6.7
  3.6.7/envs/environ_3.6.7
  environ_3.6.7
  ...
~~~

#delete virtual environment
~~~linux
$ pyenv uninstall environ_3.6.7
$ pyenv versions
  system
  3.6.7
  ...
~~~

#change global python version
~~~linux
pyenv global python_version[or python_virtual_environment]
$ pyenv global environ_3.6.7
(environ_3.6.7) xxxxxx:~ user$ 
$ python -V
Python 3.6.7
$ cd ~/.pyenv
$ vi version
 environ_3.6.7
#if you delete this "version" file, the global python will change to system python
~~~

#switch to environment
~~~linux
pyenv local python_version[or python_virtual_environment]
$ pyenv local 3.6.8
(3.6.8) xxxxxx:~ user$ 
$ python -V
Python 3.6.8
~~~
RHELに最新バージョンのRedisをソースからコンパイルしてインストールした

# 0. 前提
2020/4/22時点
- RHEL7.6のAMI（ちょっと古い。8.1が最新のようです。）
- Redis5.0.8（この記事を書いている時点での最新）

# 1. EC2インスタンス起動
## 1.1. AMI
東京リージョンで「RHEL 7.6」でAMIを検索すると、

> RHEL-7.6_HVM_GA-20190128-x86_64-0-Hourly2-GP2
> ami-00b95502a4d51a07e
> Provided by Red Hat, Inc.

が見つかりますので、これを選択します。
## 1.2. インスタンスタイプ
t3.small （適宜サイジングしてください）
## 1.3. セキュリティグループ
tcp/6379をオープン

# 2. Redisインストール
## 2.1. ssh接続
RHEL7.6のAMIのユーザはec2-userです。
ssh -i private.pem ec2-user@[public ip]

## 2.2. gccインストール
`sudo yum -y install gcc`
コンパイルに必要です。
最後に

> Complete!

が出てれば成功。

## 2.3. Redisダウンロード
`curl http://download.redis.io/releases/redis-5.0.8.tar.gz -o redis-5.0.8.tar.gz`

redis-5.0.8.tar.gzファイルが存在していれば成功。

## 2.4. アーカイブの展開
`tar zxvf redis-5.0.8.tar.gz`

redis-5.0.8ディレクトリが存在していれば成功。

## 2.5. コンパイル
`cd redis-5.0.8`
`make`

> zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory

みたいなエラーが出たときは、下記記事を参考にして、
`make distclean`
してから
`make`
をやり直す。

（参考）
Redis使おうとしていろいろやったメモ
https://qiita.com/A-gen/items/345c07d830205a7ea6cb

makeの終わりの方に、
> Hint: It's a good idea to run 'make test' ;)
って出力されたら成功。でも、
`make test`
してみたけどエラーになった。。

src下にバイナリが配置される

# 3. 動作確認
## 3.1. Redis Serverの起動
`src/redis-server &`
Redis Serverが起動する

## 3.2. Redis CLIからの接続
`src/redis-cli`
> [ec2-user@ip-172-30-1-243 redis-5.0.8]$ src/redis-cli
> 127.0.0.1:6379> set key1 value1
> OK
> 127.0.0.1:6379> get key1
> "value1"
> 127.0.0.1:6379> shutdown
> 16077:M 22 Apr 2020 06:52:31.131 # User requested shutdown...
> 16077:M 22 Apr 2020 06:52:31.131 * Saving the final RDB snapshot before exiting.
> 16077:M 22 Apr 2020 06:52:31.133 * DB saved on disk
> 16077:M 22 Apr 2020 06:52:31.133 # Redis is now ready to exit, bye bye...
> not connected> exit


# 4. 余談
## make installしてみたら
デフォルトでは/usr/local/binにインストールされるようです。

> [ec2-user@ip-172-30-1-243 redis-5.0.8]$ sudo make install
> cd src && make install
> make[1]: Entering directory `/home/ec2-user/redis-5.0.8/src'
> 
> Hint: It's a good idea to run 'make test' ;)
> 
>     INSTALL install
>     INSTALL install
>     INSTALL install
>     INSTALL install
>     INSTALL install
> make[1]: Leaving directory `/home/ec2-user/redis-5.0.8/src'
> [ec2-user@ip-172-30-1-243 redis-5.0.8]$ which redis-server
> /usr/local/bin/redis-server
> [ec2-user@ip-172-30-1-243 redis-5.0.8]$ which redis-sentinel
> /usr/local/bin/redis-sentinel
【UiPath】見やすいワークフロー作成③_不要なアクティビティ・変数の削除

#はじめに
UiPathでの開発を進めていくとワークフローの階層が深くなったり、変数にどんな値が入るか把握できなくなってきたり…
だんだんとワークフローが見づらくなってくることはありませんか？
この記事では「見やすい・わかりやすいワークフロー」を作成するためのポイントを記載していきます。
初めて開発する方にも、開発に慣れてきた方にもぜひ活用していただけたらと思います。

：環境：
Studio 2019.10.4 - 2020/02/06
Community License

「見やすい・わかりやすいワークフロー」を作成するためのポイントとして、
①では**アクティビティ表示名の変更**について、
②では**注釈のつけ方**について紹介しました。

よろしければ ぜひこちらも参考にしてみてください。
[見やすいワークフロー作成①_アクティビティ表示名変更](https://qiita.com/asamin22/private/dd0442f8d69ffdc61a01)
[見やすいワークフロー作成②_注釈のつけ方](https://qiita.com/asamin22/private/e0ca8e6e614422911274)

今回は「不要なアクティビティ・変数の削除」について紹介していきたいと思います。


#不要なアクティビティ・変数の削除
開発を進めていくと、テスト用に作成したまま放置しているアクティビティや
用意したけど使ってない(使ってるかもわからない)変数が増えていくことはありませんか？
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615615/36d93c46-620d-b9d2-92ab-cc040c1a9f0d.png)

このようなアクティビティや変数は不要とわかった時点で削除することをおすすめします。
不要なアクティビティが残っているとワークフロー内が煩雑になり、ワークフローを作成しにくくなります。
また、こまめにワークフローの整理をすることで、後の無駄な確認作業を減らすことができます。

##不要なアクティビティの削除方法
まず、不要なアクティビティの削除をします。
アクティビティを削除する方法は以下の2通りあります。

**1．右クリック>[削除(D)]**
削除したいアクティビティを右クリックし、[削除(D)]を押すことで削除できます。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615615/397cfac9-f2d0-ecd5-72fd-50508949ec8a.png)

**2．Deleteキー**
削除したいアクティビティを選択し、**Deleteキー**を押すことで削除できます。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615615/2e2cbc81-2b25-abc4-4ea1-772b47878c0f.png)

不要なアクティビティを削除したら、次は不要な変数を削除していきます。

##不要な変数の削除方法
UiPathには**使用していない変数を見つけて削除してくれる機能**があります。
この機能を使って不要な変数はどんどん削除していきましょう。

リボンパネルに**[未使用の変数を削除]**というボタンがあります。
ここをクリックすると使用されていない変数を一括削除することができます。
![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615615/3207b948-2160-fe25-721b-534e46549b40.png)


ワークフロー内で使用されていない変数には影響がないので、安心して変数を削除できます:clap:

##ポイント
[未使用の変数を削除]では、ワークフロー内で使用されていない変数を一括削除できます。
ただし、不要なアクティビティが残っていた場合、
そのアクティビティ内で使用されている変数は[未使用の変数を削除]ボタンで削除することができません。
![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615615/e406654f-6e27-87e8-cc78-bd4b98524e71.png)

ですので ワークフローの整理をする際は、
**①不要なアクティビティを削除**
**②[未使用の変数を削除]**
の順番で実施するようにしてください。

##まとめ
なんだか変数パネルが埋まってきたな～と思ったら**[未使用の変数を削除]**ボタンをポチっとしてください。
テスト用などに作成したアクティビティは、不要になった時点で削除する、
もしくは注釈にテスト用のアクティビティである旨を記載する習慣をつけると
ワークフローの整理がしやすくなるはずです。

ぜひこまめにワークフローを整理しながら開発を進めてみてください。
【Swift】条件分岐 if文 / switch文の基本

## 概要
現在Swift学習中の筆者の備忘録です。
Swiftの条件分岐のif文とswitch文について基本をまとめます。

## if文

```swift
if 条件A {
  // 条件Aに合致した時に実行する処理
} else if 条件B {
  // 条件Bに合致した時に実行する処理
} else {
  // 条件A・Bどちらにも合致しない時に実行する処理
}
```

### サンプル

```swift

let score = 75
let result: String
// if文の中で使う定数はif文の外で定義する必要がある。

if score >= 80 {
  result = "優良"
} else if score >= 60 {
  result = "合格"
} else {
  result = "不合格"
}

print(result)
// 合格
```

## switch文

```swift
switch 式 {
case ラベルA:
  // ラベルAに合致した時に実行する処理
case ラベルB,ラベルC:
  // ラベルBもしくはCに合致した時に実行する処理
  // ラベルは複数まとめて指定できる
default:
  // 合致するラベルがない場合の処理
}
```

### サンプル
```swift
let num = 43

switch num {
case 0:
  print("zero")
case 1,2:
  print("1 or 2")
case 3...5:
  print("3 or 4 or 5")
  // 範囲演算子（...）を使ったパターン。この場合3から5の意。
case 6..<8:
  print("6 or 7")
  // 不等号を使った範囲演算子（..<）を使ったパターン。この場合6から7（8未満）の意。
case let n where n > 20:
  print("\(n) is more 20")
  // 新たな定数を定義して式（ここではnum）の結果を代入し、条件を指定する。
default:
  break
  // switch文を終了させる。
}
```

## if文とswitch文の使い分け
同じ内容の条件式を書いて比べてみます。

### 例１）決まった範囲で処理を分ける
定数scoreが80以上だったら「A」、60以上だったら「B」、それ他は「C」と出力する

```swift
// if文
let score = 75

if score >= 80 {
  print("A")
} else if score >= 60 {
  print("B")
} else {
  print("C")
}
// B

// switch文
let score = 75

switch score {
case let s where s >= 80:
    print("A")
case let s where s >= 60:
    print("B")
default:
    print("C")
}
// B
```
これはif文の方が直感的に分かりやすい感じがします。
switch文ではcase内でscoreとは別に定数を定義する必要が出てきます
（先にInt型で定義されたscoreを、真偽を判定するBool型としては使えないため）。
これがif文の方が分かりやすい原因でしょう。

### 例2）限られた条件の中で処理を分ける
定数numが1なら「A」、 2なら「B」、他なら「C」とする場合

```swift
// if文
let num = 2

if num == 1 {
  print("A")
} else if num == 2 {
  print("B")
} else {
  print("C")
}
// B

// switch文
let num = 2

switch num {
case 1:
    print("A")
case 2:
    print("B")
default:
    print("C")
}
// B
```
この場合は、switch文の方が分かりやすそうです。
条件が3つぐらいと少なく、その中で処理を分けるような場合は
switch文の方が良さそうですね。


## 最後に
以上、簡単ですが条件分岐についてでした。

if文とswitch文の簡単な比較を行いましたが、
「if」の方がなんとなく親しみのある言葉なので、
初めのうちはこちらに頼りがちになりそうだなと思ったり。

switch文の方がすっきり記述できる場合もあるので、
意識的に使っていきたいです。
テイクアウトできるお店を地図上にプロットする手順

# はじめに

新型コロナウイルスの感染防止のため、多くの飲食店さんが休業されているなかで何かお役に立てることがないかなと考えてテイクアウトできるお店をわかりやすくお伝えできればと思って取り組んだ内容をまとめてみます。

# 情報元

とりあえず、Facebook。

# 地図の操作

Leaflet.jsを使用。
地図を扱うのにとても便利なJavaScriptライブラリ。

https://leafletjs.com

# 完成品

以下のリポジトリにてテンプレートを公開してあります。
https://github.com/shinob/takeoutmap

実データの入ったものは以下

- [松江版](https://blueomega.jp/matsue_takeout.html)
- [出雲版](https://blueomega.jp/izumo_takeout.html)
- [米子版](https://blueomega.jp/yonago_takeout.html)

# 作り方

1. githubのリポジトリからテンプレートをダウンロード
1. index.htmlのタイトルを変更
1. points.jsの中心座標を変更
1. points.jsに店舗の緯度経度、店名、URLを追加

# 緯度経度の取得方法

- [Googleマップ](https://www.google.com/maps/)を表示  
<img width="1081" alt="スクリーンショット 2020-04-22 15.43.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114240/bc3db6e5-c8c4-7c5c-0c13-85ba0f42119d.png">
- お店の場所をクリック  
<img width="1081" alt="スクリーンショット 2020-04-22 15.43.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114240/ef57060f-bd9e-2597-d997-87c1248de217.png">
- 地図の下の方に表示される数値をコピー  
<img width="394" alt="スクリーンショット 2020-04-22 15.43.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114240/0f3c52bc-aeac-dd35-48bf-805696d69c9d.png">

# その他

もし、どこかの地域版を作成されたら共有して頂けると嬉しく思います。
lightning:navigationを使った画面遷移

遷移先のコンポーネントに　lightning:isUrlAddressable　を追加する

```
<aura:component implements="lightning:isUrlAddressable,force:appHostable" access="global">
```

遷移元ではlightning:navigationを使う

cmp

```
<aura:component implements="force:appHostable" access="global">    
    <lightning:navigation aura:id="navService"/>
     <lightning:button variant="brand" label="navi" onclick="{! c.handleUrl }" class="make_payment" />
</aura:component>
```

js

```
handleUrl : function(component, event, helper) {        
        var pageReference= component.find("navService");
        var pageReferenceNav={  
        "type": "standard__component",
                "attributes": {
                "componentName": "c__FolderManager"    
            },    
            "state": {
                "myAttr": "attrValue"    
            }
        } ; 
        pageReference.navigate(pageReferenceNav);        
    },
```
デコレーターの実験的なサポートは将来のリリースで変更になる可能性がある機能です。'experimentalDecorators' オプションを設定してこの警告を削除します | の対応

# VSCodeのTSファイルのエラーメッセージを消す

English

```
[ts] Experimental suport for decorators is a feature that is subject to chang in a future release. Set the 'experimentalDecoratos' option to remove this warning.
```

Japanese

```
デコレーターの実験的なサポートは将来のリリースで変更になる可能性がある機能です。'experimentalDecorators' オプションを設定してこの警告を削除します
```

## 解決方法

#### 手順
1. tsconfig.jsonの`"compilerOptions":{}`以下に`"experimentalDecorators": true,`を設定する
2. tsconfig.jsonの`"include": []`を設定する
3. VSCodeを再起動（必須ではない）

#### tsconfig.jsonの設定

下記のように`"experimentalDecorators": true,`を設定します。
また、`"include": []`の指定はtscondifの設定を反映させたいファイルを指定します。

今回の例はNuxt.jsでTSを使おうとした場合の設定のイメージです。
私はstore以下で今回のエラーが出て`"store/**/*.ts",`を追加しました。

※抜粋しています

```json
{
  "compilerOptions": {
    "allowJs": true,
    "experimentalDecorators": true,
  },
  "include": [
    "components/**/*.ts",
    "components/**/*.vue",
    "layouts/**/*.ts",
    "layouts/**/*.vue",
    "pages/**/*.ts",
    "pages/**/*.vue",
    "store/**/*.ts",
  ]
}
```

## 参考
詳しくはこちらのGitHubのIssueの会話をご覧ください
https://github.com/microsoft/TypeScript/issues/9335
SSRとJSとフレームワークの技術選定

最近社内でJS最新技術を使ってみよう！という流れになったので、
JSのフレームワークを調査してみました。

また、よく耳にするSSRという単語がフレームワーク調査で頻出したので合わせて調べました。

## ReactとVue

世界シェアだとReactがダントツの様子。
https://note.com/erukiti/n/na654ad7bd9bb
　→比較基準で賛否両論あるらしいが個人的には外れていないと思う。

身の周りでもVueを採用する話をよく聞くが、これだけ数字出ているのにReactの名前が出てこないのが不思議。

なんとなくReduxでツライみたいな空気があったような気がしており、丁度そのころにVueが来て刺さった気がしがしなくもない。
その後２０１９年にReactHooksが来てイベント周りがガラッと変わってかなり使いやすくなったらしいのと、TypeScriptの相性からReactなんとなく使いたいなと思う。

## SSR

### SSRとはなにか
サーバーサイドレンダリングの話になった時、
NuxtだのExpressだのと名前が上がり混乱したので一旦整理。

- 素のVueもしくはReact
  - ユーザー側JSでレンダリング。読み込みに時間がかかり、Botが食わない可能性あり。
- SSRを使用
  - リクエスト時にHTMLを組んでレスポンスを返す。動的な処理はユーザー側JSで再レンダ。レスポンスにHTMLを返すのでBotが構造を食える。

SSRを利用する時、一般的に[この](https://tech.dely.jp/entry/min_ssr#SSRのコスト)構成になる。

1. フロントエンド（ユーザー側JS）
1. SSRを行うSSR領域（SSR鯖）
1. リソースを提供するバックエンドAPI（API鯖）

リクエスト時は１→２→３→２→１といった具合に経由する。

SSR鯖では、たいていフロントエンドのライブラリ（VueとかReactとか）をサーバーで動かしてHTMLを構築し、それをフロントエンドに返す。
なのでライブラリがそのまま動くNode.jsのWebフレームワークであるExpressの名前が頻出する模様。

Next.jsやNuxt.jsがSSR対応、という意味が今までよくわかっていなかったが、
要はExpress（か類似のなにか）を内蔵している、もしくは管理する何かが内蔵されており、
そこでSSRすることを指しているらしい。

### SSRのメリット・デメリット

#### メリット

SSRのメリットは[ここ](https://www.publickey1.jp/blog/17/server_side_renderingserver_side_rendering_ng-japan_2017.html)がわかりやすい。（ただし１７年の記事）

上の記事ではSEOとパフォーマンスの改善がメリットに挙げられている。

しかしSEOについてはBotの改善でSSR必須ではないという話も上がっている。
Googleが[GoogleBotは食える](https://webmasters.googleblog.com/2019/05/the-new-evergreen-googlebot.html)と言ってるっぽい。
[トラブルシューティング](https://developers.google.com/search/docs/guides/fix-search-javascript)見てても、少なくとも基本は食ってくれるようなことも書いてある。

#### デメリット

デメリットにはSSR処理の負荷が高いことが挙げられている。
これもある程度[テクニックで緩和できる](https://www.publickey1.jp/blog/17/server_side_renderingserver_side_rendering_ng-japan_2017_1.html)らしい。

SSRを用意運用する複雑さも難易度高そうと思ったが、
Next.jsやNuxt.jsなどのFWを使えば複雑さはある程度無視できるとも考えている。

## フレームワーク選定

ReactのFW候補にNext.jsとGatsbyが挙げられた。
Next.jsはNuxt.jsの原型なので特性はほとんど変わらないと勝手に思っている。

フレームワークの比較は[この記事](https://qiita.com/uehaj/items/1b7f0a86596353587466#create-react-appcraの動作)が非常にわかりやすかった。
Gatsbyの記事だが他のフレームワークの特性も一緒に学習できた。
※CRAは素のReactと考えて良さげ。

### Gatsbyの特性

#### 静的サイトジェネレータ

Gatsbyは「静的サイトジェネレータ」と呼ばれる機構を持つ。
SSRはリクエスト時にHTMLを組み立てるが、Gatsbyは事前にビルドしてHTMLなどを生成する。
もちろん動的な挙動も可能らしい。

#### Gatsbyのデメリット

静的サイトジェネレータの特性上、
頻繁に内容を変更するプロダクトには向かないらしいが、動的レンダの仕組みもあるので問題ない気もする。

Nextに比べるとめんどくさいという話なんだろうか？🤔
Gatsbyのデメリットを知りたいところ。

Gatsby「難しい」のがデメリットらしい。

- https://crieit.net/posts/GatsbyJS
- https://qiita.com/akashixi/items/9653d0a6522117618e0f#gatsbyとは
- https://blog.zatsuzen.com/gatsby/how-to-use/

Wordpressと比較されることが多い？
フロントエンド（HTML、CSS、JS、SEO）の知識が要求される点が挙げられている。

## 結論

現在調べる限り、ReactでGatsbyを使うのが一番良さそうに感じた。  
Gatsbyのデメリットである**フロントの知識**については、チームメンバーを鑑みて問題ないと考えている。
python で float32 TIFF 画像を読み書きするメモ

## 背景

python で, 自前などで生成した 32bit TIFF 画像(grayscale, RGB)を読み込みたい.

e.g. C++ で header only で使える DNG/TIFF writer を使って.

https://github.com/syoyo/tinydngloader/tree/master/examples/dngwriter

2D テンソルデータや HDR 画像を, tiff として保存したい.

## 方法

How do you read a 32-bit TIFF image in python?
https://stackoverflow.com/questions/40751523/how-do-you-read-a-32-bit-tiff-image-in-python

https://gist.github.com/ax3l/5781ce80b19d7df3f549

skimage, imageio, Pillow(PIL), OpenCV あたりで読めます.
これらは, 中身的には tifffile を使っているようです. すくなくとも imageio は tifffile を使っていました.

https://pypi.org/project/tifffile/

rawpy でも読めるかもしれません.

imageio(tifffile) あたりで保存できます.

## endian で気を付けること

TIFF では, ピクセルデータも適切にエンディアン変換をかけてないといけないことがわかりました.
たとえば x86 で BigEndian で書き出すときは, エンディアン変換して書き出します.

自前で作った tiff で, imageio, cv2 で BigEndian 32bit float TIFF を読むとと, ピクセルの値が swap されて不定な値になって気がつきました.

本来は swap しなくてもいいはずですが, どこか TIFF の仕様で決められているのですかね.

ひとまず, x86 の場合は Little endian で TIFF を作るのがよいでしょう.
基本中の基本HTMLタグ一覧


筆者はプログラミング歴1年の新参者です。
今までアプリ開発の仕事をしていたのですが、コロナショックで凍結になり、Web関連に異動することになりました。

そこで、逃げていたHTMLの学習をしています。

備忘録にHTMLのタグ一覧を投稿します。

#HTMLのタグ一覧
 - `<h></h>`
  　見出し。覚え方はHead

 - `<p></p>`
    　段落。覚え方はparagraph(パラグラフのP)
 
 - `<!-- -->`
     コメント。覚え方は得になし。

 - `<a></a>`
     リンクを貼る。
   - `<a href="url">`　URLを貼りつけ出来る

 - `<img>`
   イメージを添付出来る。`</>`←終了タブは不要
   - `<img src="url">`　イメージのURLを貼りつけ出来る

 - `<li></li>`
   リスト。覚え方はList

 - `<ul></ul>`
   リストを囲むタグ(ネスト)。●（黒丸）で`<li></li>`のタグをリスト化出来る

 - `<ol></ol>`
   リストを囲むタグ(ネスト)。数字（連番）で`<li></li>`のタグをリスト化出来る

 - `<div></div>`
   レイアウトを分割するタグ。
 
　**随時更新していきます。**
[Alfred]スニペット展開後もクリップボードの中身を保持する

8年ぶりにAlfredをインストールしてスニペットをガンガン登録し利用していましたが、スニペット展開後にクリップボードの中身が直前に展開したスニペットに置き換わってしまい、個人的にこの挙動が不便だったため、クリップボードの中身はスニペット展開の前後で変わらないよう設定しました。
今回はその時のメモです。

## バージョン

4.0.9

## 設定方法

Preference > Features > Snippets を開く

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156004/bfb6138c-1f6c-a874-7e81-6c34f0c261e0.png)

「Auto Expansion Options」をクリック

----

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156004/888899ad-09d9-0fe9-7763-38ae4d603126.png)

Tweaking > Restore clipboard contentsの「After Snippets Viewer or Keyword」をチェック

(その下の「Restore after:」はスニペット展開後にクリップボードをもとに戻すまでの時間のようです。左にスライドすればクリップボードが戻るまでの時間が短くなります)

## 動作確認

- 適当な文字をコピー
- スニペットを展開
- ペーストして適当な文字がでてくればOK

## 備考

「Restore after」という設定があるということはAlfreadのスニペットはクリップボードを利用しているんだなということがわかりました
【Java8】Stream API、Date And Time API ...初心者メモ

スキル云々と言っても、最もコーディング量の多いのは素のJava本文であり、ここでもたついているようでは生産性向上／品質確保は図れません。

##１．Date and Time API
便利になった反面、非常に複雑になっています。頻繁に参照している記事はこちら。
[「Java8の日時APIはとりあえずこれだけ覚えとけ」Qiita @tag1216さん](https://qiita.com/tag1216/items/91a471b33f383981bfaa)
記事から抜粋）Builderパターンのような記述が可能で、記述性／可読性が向上しています。

```` 現在時刻の来月1日の12時を求める.java
LocalDateTime d = 
       LocalDateTime.now()
                    .plusMonths(1)
                    .withDayOfMonth(1)
                    .withHour(12)
                    .truncatedTo(ChronoUnit.HOURS);
````
[JavaDoc「パッケージjava.time」](https://docs.oracle.com/javase/jp/8/docs/api/java/time/package-summary.html)

##２．ラムダとストリーム
新規プロジェクトでは、ストリームでの記述は必須です。こちらの記事は絵付きでの解説があり、直感的にわかりやすいです。下記の様な絵が出てきます。
[「絵で理解するリスト処理 - java8 stream / javaslang」Qiita @suzuki-hogeさん](https://qiita.com/suzuki-hoge/items/16ab07c65f5f906cf600)
![※こんな絵が出てきます。](https://camo.qiitausercontent.com/f287f23028d035c0a7af37e27696e6b901ce4c54/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3131333339382f63303064616638332d613238302d393536372d623335352d3539346231316462633634342e706e67)
慣れたらこちらも。
[「Java 8 Stream API にテキストを流してみる（生成編）」Qiita @kumazoさん](https://qiita.com/kumazo/items/0876c5b251ecc131c960)
[「Java 8 Stream API にテキストを流してみて（中間操作編）」Qiita @kumazoさん](https://qiita.com/kumazo/items/104fa685da8705b8cfd8)
[「Java 8 Stream API にテキストを流してみた（終端操作編）」Qiita @kumazoさん](https://qiita.com/kumazo/items/284098c530fceb05805c)
[「Java 8のStream処理はここまで省略できる！」Qiita @munieru_jpさん](https://qiita.com/munieru_jp/items/6c0dbada463e00429fd1)
[「Java8のラムダ式を理解する」Qiita @sano1202](https://qiita.com/sano1202/items/64593e8e981e8d6439d3)
[JavaDoc「パッケージjava.util.stream」](https://docs.oracle.com/javase/jp/8/docs/api/java/util/stream/package-summary.html)

##３．Path/Paths/Files
File処理については、新旧のAPIが現時点でも混在して使用されており混乱するところです。Java7で導入された上記APIのみ絞った方が良いと感じています。
[「Java NIO2のおさらいメモ」Qiita @rubytomato@githubさん](https://qiita.com/rubytomato@github/items/6880eab7d9c76524d112)
[JavaDoc「インタフェース Path」](https://docs.oracle.com/javase/jp/7/api/java/nio/file/Path.html)[「クラスPaths」](https://docs.oracle.com/javase/jp/7/api/java/nio/file/Paths.html)[「クラスFiles」](https://docs.oracle.com/javase/jp/8/docs/api/java/nio/file/Files.html)

##９．その他（Java初心者の備忘録）
####(１) @Override は必要か？
・必須ではないが、記述を推奨する。
・引数の型違いなど使用ミスがあれば、Eclipseがミスを教えてくれる。
・オーバーライドしている事が明確になる。

####(2) Temporal（Java8 Date and Time API）が分かりにくい
Java日付関連の実装中、APIのJavadocを調べていて困るのが、ちょいちょい引数にでてくるTemporalAccessorとかChronoLocalDateTimeです。結局、何を指定すれば良いのか分らず呆然ととしてしまう事があります。
※もう少し理解度が高くなったら追記します。
Rails：migrationで外部キー制約付きのカラムを追加（削除）する 

## 概要

先にテーブルを作っていて、後からmigrationで外部キー制約のついたカラムを追加（削除）したい時の書き方をまとめておきます。

Railsのバージョン(6.0.0)

## 前提条件
- tweetsテーブルがあり、そこに外部キーであるuser_idカラムがある。
- memosテーブルがある。

```ruby:schema.rb
create_table "tweets", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t|
   t.string "content", null: false
   t.bigint "user_id", null: false
   t.datetime "created_at", precision: 6, null: false
   t.datetime "updated_at", precision: 6, null: false
   t.index ["user_id"], name: "index_tweets_on_user_id"
end

create_table "memos", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t|
   t.string "content", null: false
   t.bigint "tweet_id", null: false
   t.datetime "created_at", precision: 6, null: false
   t.datetime "updated_at", precision: 6, null: false
   t.index ["tweet_id"], name: "index_memos_on_tweet_id"
end
```


## カラムを追加
tweetsテーブルに外部キー制約のmemo_idを追加する。

1. マイグレーションファイルを生成する。
2. 生成されたマイグレーションファイルを以下に書き換える。

```ruby:(日付)_add_memo_id_to_tweets.rb
def change
  add_reference :tweets, :memo, null: false, foreign_key: true
end
```

## カラム削除
tweetsテーブルから外部キー制約のuser_idを削除する。

1. マイグレーションファイルを生成する。
2. 生成されたマイグレーションファイルを以下に書き換える。

```ruby:(日付)_remove_user_id_from_tweets.rb
def change
  remove_reference :tweets, :user, null: false, foreign_key: true
end
```

## 追記
indexはデフォルトでindex: trueになっているため、明示的に書かなくても良い。
アプリとサーバー間の流れ

#TCP/IP
TCP/IPとはインターネット通信のプロトコルで、安全性の約束、`TCP（Transmission Control Protocol）`とネットワーク用の約束事
`IP（Internet Protocol）`を組み合わせたもの。
コンピューターネットワークやインターネットを動かしている通信技術を一般的に`TCP/IP`という。
IPだけでは伝達方法がわからないため、TCPの力を借りている。
###TCP
TCPとは相手にデータが送られたか、都度確認しながら通信するやり方。
特徴としては漏れなく伝わる可能性が高いということとスピードが遅くなるという点がある。
###IP
IPとは、ネットワークの通信規約の一つで、ネットワークに接続する個々のコンピューターにアドレスを割り振り、データ転送における伝送経路の確定方法を定めている。 
#HTTPメゾット
HTTPのメゾットでよく使う物が`GET`、`POST`、`PUT`、`DELETE`が挙げられる。

| メソッド | 使い方 |
|:--|:--|
| GET | 情報の取得 |
| POST | 情報の登録 |
| PUT | 情報の更新 |
| DELETE | 情報の消去 |
#SSL通信
SSLとはウェブサイトとユーザーの通信を暗号すること。
SSL通信していないと、通信の中身を悪意のある第三者に傍受され中身のパスワードやクレジットカード情報を盗まれる可能性がある。
これを解消するためのSSLはブラウザとサーバー間の通信を暗号化する。盗みみられたとしても解読するのは困難となる。

#アプリと通信の流れ
アプリが起動するとサーバに命令を送り、サーバがデータベースにデータを要求しデータベースがサーバにデータを送り、サーバがアプリにデータを表示する。
webpackのビルドにてエラー。 TypeError: Cannot read property 'properties' of undefined

#エラー内容
```
TypeError: Cannot read property 'properties' of undefined

npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! @ build: `webpack`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the @ build script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
```

今回のエラーで見るべきは、```TypeError: Cannot read property 'properties' of undefined```の部分。

これは古いバージョンのwebpackを使っていることで吐かれるエラーみたいです。

#解決法

僕の場合は

```
"webpack": "^4.5.0",
"webpack-cli": "^2.0.14"
```

から

```
"webpack": "^4.43.0",
"webpack-cli": "^3.1.1"
```

一度webpackのバージョンを確認してみてください！
AWS CDKでSwaggerからAPI Gatewayを構築する

## 概要

AWS CDKでは、API GatewayのSwaggerが対応されてなくてハマったのでメモ。

https://github.com/aws/aws-cdk/issues/723

### API Gatewayのリソース定義

```typescript
import cdk = require('@aws-cdk/aws-core');
import apigateway = require('@aws-cdk/aws-apigateway');

export class ApigatewayStack extends cdk.Stack {
    constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
        // Rest API
        const api = new apigateway.RestApi(this, 'ApiGateway', {
            endpointConfiguration: {
                types: [ apigateway.EndpointType.REGIONAL ],
            },
            restApiName: 'API',
        });

        // Api Gateway Stage
        const stage = new apigateway.Stage(this, 'ApiGatewayStage', {
            deployment: new apigateway.Deployment(this, 'ApiGatewayDeployment', { api }),
            stageName: 'Stage'
        });

        // Usage Plan
        api.addUsagePlan('ApiGatewayUsagePlan', {
            apiStages: [
                { api, stage },
            ],
            description: 'UsagePlan for API',
            name: 'UsagePlan',
        });
    }
}
```

### SwaggerのJsonファイルをS3にアップロード

S3バケットのJSONファイルを参照してAPI Gatewayのリソースを構築するので先にアップロードしておく。
事前に、SwaggerのJSONファイルをredoc-cliなどで生成しておく。

```typescript
new s3deploy.BucketDeployment(this, 'DeploySwagger', {
    sources: [s3deploy.Source.asset(`${destDir}`)], // JSONファイルのディレクトリ
    destinationBucket: s3.Bucket.fromBucketName(this, 'SwaggerBucketName', 'Bucket'), // アップロード先のバケット
    destinationKeyPrefix: `swagger/`,
});
```

### SwaggerのJSONファイルからAPI Gatewayのリソース生成

Cfnリソースを利用する。bodyプロパティにSwaggerのJSONファイルのパスを指定する。

```typescript
const cfnApi = api.node.defaultChild as apigateway.CfnRestApi;

cfnApi.bodyS3Location = {
    bucket: 'Bucket',
    key: 'swagger/openapi.json'
};
```

以上でAPI Gatewayのリソースが生成できるが、これだけではエラーになってしまったので、モックのMETHODを定義しておく。

```typescript
api.root.addMethod('ANY', new apigateway.MockIntegration());
```
【python】 FTPサーバにFTPアップロードをするよ。

# はじめに
今更ながらですが・・・
レガシーシステムを触っているときに、FTPサーバにFTPアップロードしなければいけない状況が発生したので、pythonでゴリゴリやろうと思ったときのメモです。


# 内容
## 概要

```python

# -*- coding: utf-8 -*-
import ftplib
import logging


def ftp_upload(hostname, username, password, port, upload_src_path, upload_dst_path, timeout):
    logger.info({
        'action': 'ftp_upload',
        'status': 'run'
    })
    # FTP接続/アップロード
    with ftplib.FTP() as ftp:
        try:    
            ftp.connect(host=hostname, port=port, timeout=timeout)
            # パッシブモード設定
            ftp.set_pasv("true")
            # FTPサーバログイン
            ftp.login(username, password)
            with open(upload_src_path, 'rb') as fp:
                ftp.storbinary(upload_dst_path, fp)
        
        except ftplib.all_errors as e:
            logger.error({
                'action': 'ftp_upload',
                'message': 'FTP error = %s' % e
            })
    logger.info({
        'action': 'ftp_upload',
        'status': 'success'
    })


# logの設定
logger = logging.getLogger(__name__)
formatter = '%(asctime)s:%(name)s:%(levelname)s:%(message)s'
logging.basicConfig(
    filename='./ftp_logger.log',
    level=logging.DEBUG,
    format=formatter
)
logger.setLevel(logging.INFO)

# 接続先サーバーのホスト名
hostname = "FTPサーバIP" 
# アップロードするファイルパス
upload_src_path = "./test.jpg" 
# アップロード先のファイルパス（STORはファイルをアップロードするためのFTPコマンドなので必要です。）
upload_dst_path = "STOR /test.jpg" 
# サーバーのユーザー名
username = "それぞれのユーザ名" 
# サーバーのログインパスワード
password = "それぞれのパスワード" 
# FTPサーバポート
port = 21 
timeout = 50

logger.info("===START FTP===")
ftp_upload(hostname, username, password, port, upload_src_path, upload_dst_path, timeout)
logger.info("===FINISH FTP===")
```

## 詳細
参考にもあるように、

https://intellectual-curiosity.tokyo/2019/12/01/python%E3%81%A7ftp%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E3%82%92%E8%A1%8C%E3%81%86%E6%96%B9%E6%B3%95/

を参考に作成しました。とてもわかりやすいです。ありがとうございます。

以上。


# 参考
・https://algorithm.joho.info/programming/python/ftp-file-upload-server/
・https://intellectual-curiosity.tokyo/2019/12/01/python%E3%81%A7ftp%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E3%82%92%E8%A1%8C%E3%81%86%E6%96%B9%E6%B3%95/
・https://qiita.com/__init__/items/91e5841ed53d55a7895e
通話時の音質比較　2020年4月


- 前書き
-


最近、リモートワークが増えてきて電話を使用する事が普段よりも多くなっている事と思います。
そこで気になってくるのが**通話時の音質**です。

と言うわけで調べてみました。







-調査方法
-
**1.**　通常時の中〜長時間の会話を想定して行う為、携帯をスピーカーモードで利用する。（耳に当てては行わない）
**2.**　音量は最大にして行う。
**2.**　音楽再生の実験を行うときはスピーカーから１m離して行う。
**3.**　話者は別の部屋に行き、検証する。
**4.**　同一WiFi内において試験を行う。部屋との距離が多少あるので片方の携帯は中継機に繋いでの使用をする。

-使用アプリ
-
・電話(キャリア)
・LINE電話
・LINEビデオ通話
・Skype(Audio)
・Skype(Video)
・FaceTime(Audio)
・FaceTime(Video)
・Google Duo
・Zoom




-使用機材
-
・iPhone XS Max
・iPhone 6s
・iPhone 6 (LINEのみ)
・Xperia XZ2 (LINEのみ)
・HomePod
・MacBookPro 16インチ



 -検証結果
-

|   使用アプリ      |      通常の会話     |    　  　音楽　 　   |　 通話+音声  　    |
|:----------------:|:-------:|:------------------:|:----------------:|
| 電話             |      ok |        E   |           E     |
|      LINE電話      |      ok |      D     |          E       |
|LINEビデオ通話         |      ok |  D         |           E        |
| Skype(Audio)         |       ok| C          |            B       |
| Skype(Video)           |      ok |     C      |             B      |
| FaceTime(Audio)         |      ok |     B-     |B
| FaceTime(Video)            |      ok |     B-     | B                  |
| Google Duo             |      ok |     D      |  E                 |
| Zoom          |      ok |     F      |   F                |


-まとめ
-
Zoomは会話に関しては他とさほど変わらなかったが、音楽が入った瞬間非常に品質が落ちた。
FaceTimeとSkypeのみ音楽が流れている中で話しても音楽が途切れなかった。
FaceTimeは通信環境によって音質が左右されやすい（悪いとよく音質が途中で切り替わる）。その代わり環境が良い時は映像・音質共に非常に良い。
Skypeは通信環境が悪くてもある程度の品質を保って通話できる。が、(環境が)良くてもそれほど変わらない。

要するに、
**仕事であったり、基本的なパフォーマンスを常に出したいときはSkypeをお勧めします。**
**家族内であったり友人間でお互いがiOS端末ないしMacユーザーであればFaceTimeの使用をお勧めします。**
そうでなければSkype一択。問題があるとすると普及率が低いと言ったところです。（正確に言うと使ってるユーザー数が少ない）



-補足
-

GoogleはDuoの映像品質の改善の為にビデオコーデック「AV1」を導入するようです。
また、それに伴い音声通信についても品質の向上を目指すとのことです。
>
無料ビデオ通話アプリ「Google Duo」で映像品質向上のためビデオコーデック「AV1」を導入、グループ通話可能な人数も増加
https://gigazine.net/news/20200422-google-duo-av1/
Four new Google Duo features to help you stay connected
https://www.blog.google/products/duo/4-new-google-duo-features-help-you-stay-connected/

-編集後記
-

正直、これを編集しているときにQiitaにふさわしいかどうかは少し考えたのですが、初めての投稿なので許していただければ非常に嬉しいです。
問題があれば削除します。
また、自分の環境ではこちらの方が良かった等あれば教えていただけると嬉しいです。
拙い文章ですが、最後までご覧いただきありがとうございました。
皆さんの通話が少しでも快適になることを願っています。
Spring Boot入門 - トランザクション概要 -

#トランザクションとは何か？

互いに関連する一連の処理を一つの処理としてまとめる事をいう。
例えば出入金を管理するプログラムがあり、Aの口座に5000円入金するとした場合図のような一連の処理が必要となる。

![Untitled Diagram (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562983/d1315c29-415c-7103-6a20-7203a97f6b23.png)



これらの一連の処理を一つのブロック(トランザクション)として捉え、一括で管理してしまおうというのが**トランザクション**
の基本理念である。

![Untitled Diagram (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562983/29f55f3c-5f18-7f15-3a21-bf6113a16147.png)

##トランザクションのメリット

一つの塊として処理されたトランザクションは必ず**『すべて失敗』あるいは『すべて成功』のどちらかを保証してくれる**。
先ほどのたとえを使ってみよう、例えばトランザクションを利用せずに送金処理で失敗したとする

![Untitled Diagram (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562983/b0bec8d0-d743-f659-c10f-7b997e984068.png)

この場合は5000円が出金され、Bの口座に5000円が送金される前に処理が失敗し、中断されるために**Aの口座からは5000円が減りBの口座は変わらないままになる**。このようなエラーによるリスクを低減してくれるのがトランザクションである。
トランザクションで管理されているプログラムで同様のエラーが起こった例を見てみよう。

![Untitled Diagram (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562983/b513a78e-30d2-d377-8b06-d25760c9097c.png)

先ほど記述したようにトランザクションで管理している場合は**『すべて失敗』**か**『すべて成功』**かを保証してくれる。
これがどういうことかというと、図のように送金に失敗しても出入金の一連の処理を一括で管理しているので**送金が失敗した時点で関連した動作すべてを失敗したとして、任意で巻き戻したりすべての処理を中断したりできるのである。**
トランザクションはDB処理やWebアプリケーションなど、複数のユーザーが操作するようなすべての動作において有効な処理であると言えるだろう。