OmniAICreator/Qiita-1.07M huggingface dataset:
【macOS Big Sur】pyenvでpythonインストールするまでに詰まった話

## 開発環境
・Macbook Air Big Sur 11.1
・pyenv 1.2.26
・xcode-select version 2384
・XCode　12.4

## やりたいこと
pyenvでpython3.7.3をインストールしたい

## 発生したこと

```
$ pyenv install 3.7.3
```
だめだった・・・

```
BUILD FAILED (OS X 11.0.1 using python-build 20180424)

Inspect or clean up the working tree at /tmp/python-build.20201120091233.71993
Results logged to /tmp/python-build.20201120091233.71993.log

Last 10 log lines:
./Modules/posixmodule.c:8210:15: error: implicit declaration of function 'sendfile' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
ret = sendfile(in, out, offset, &sbytes, &sf, flags);
^
./Modules/posixmodule.c:10432:5: warning: code will never be executed [-Wunreachable-code]
Py_FatalError("abort() called from Python code didn't abort!");
^~~~~~~~~~~~~
1 warning and 1 error generated.
make: *** [Modules/posixmodule.o] Error 1
make: *** Waiting for unfinished jobs....
1 warning generated`
```

## 解決手順

zlib bzip2を再インストール

```
$ brew reinstall zlib bzip2
```
zshrcファイルにパスを追加

```
$ vi ~/.zshrc

ここから↓
export PATH="$HOME/.pyenv/bin:$PATH"
export PATH="/usr/local/bin:$PATH"

eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
export LDFLAGS="-L/usr/local/opt/zlib/lib -L/usr/local/opt/bzip2/lib"
export CPPFLAGS="-I/usr/local/opt/zlib/include -I/usr/local/opt/bzip2/include"
ここまで書く↑
```
インストールしたいバージョンを自由にいれて、叩く

```
$ CFLAGS="-I$(brew --prefix openssl)/include -I$(brew --prefix bzip2)/include -I$(brew --prefix readline)/include -I$(xcrun --show-sdk-path)/usr/include" LDFLAGS="-L$(brew --prefix openssl)/lib -L$(brew --prefix readline)/lib -L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" pyenv install --patch 3.7.3 < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch\?full_index\=1)
```

**別のエラー・・・・・・**

```
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?
```
openSSLをインストール

```
$ brew install openssl
```
zshrcファイルにパスを追加

```
$ vi ~/.zshrc

ここから↓
export PATH="/opt/homebrew/opt/openssl@1.1/bin:$PATH"
export LDFLAGS="-L/opt/homebrew/opt/openssl@1.1/lib"
export CPPFLAGS="-I/opt/homebrew/opt/openssl@1.1/include"
export PKG_CONFIG_PATH="/opt/homebrew/opt/openssl@1.1/lib/pkgconfig"
ここまで書く↑
```

もう一度チャレンジ・・・！

```
$ CFLAGS="-I$(brew --prefix openssl)/include -I$(brew --prefix bzip2)/include -I$(brew --prefix readline)/include -I$(xcrun --show-sdk-path)/usr/include" LDFLAGS="-L$(brew --prefix openssl)/lib -L$(brew --prefix readline)/lib -L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" pyenv install --patch 3.7.3 < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch\?full_index\=1)
```

いけた！

`Installed Python-3.7.3 to /Users/ワシの名前/.pyenv/versions/3.7.3`

```
 $ pyenv versions
    system
    * 3.7.3 (set by /Users/tomomitakei/.pyenv/version)
```

## 参考文献

https://github.com/pyenv/pyenv/issues/1737

https://dev.to/kojikanao/install-python-3-8-0-via-pyenv-on-bigsur-4oee
短期的なイベントハンドラー(短命なイベントハンドラー)は5秒未満

原文で言う**a short-lived event handler**の定義が不明だった。

JavaScriptによるクリップボード操作にはユーザーの許可を得ずに実行できるパターンがある。
それがユーザー生成の短期的なイベントハンドラー内での実行であるが、
ユーザー生成の短期的なイベントハンドラーでないときにパーミッションを取らずに実行するとFirefoxの場合下記の警告が出力される。(コピーは失敗する)
`document.execCommand(‘cut’/‘copy’) はユーザー生成の短期的なイベントハンドラーの内部からの呼び出しでないため拒否されました。`

今回は一般的に短期的なイベントハンドラーとして紹介される`click`イベント内で警告が出た。

今までの実績ある実装との違いは、

* `async function`である
* `await`を使っている
* `fetch`を使っている
* (fech処理の関係上)クリックから`execCommand`実行まで時間が空く

であった。
順番にテストした結果、およそ5秒を過ぎるとclickイベント内でも短命とみなされず失敗するという結果が得られた。

察するに、

>ユーザー操作に対する短命なイベントハンドラー(例えば click ハンドラー)

の「例えば click ハンドラー」は「ユーザー操作に対する(イベントハンドラー)」にかかっており、「短命」かどうかはユーザー操作関係なく、コード量にも関係なく、字面どおりに「短時間」であることが必要かと思われる。

私は「ユーザー操作に対するイベントハンドラー」≒clickイベント自体が「短命なイベントハンドラー」だと解釈していた。

# コード

```html
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
<button id="test">copy</button>
</body>
<script type="text/javascript">

function sleep (ms) {
    return new Promise((res) => { setTimeout(res, ms)})
}

document.querySelector('#test').addEventListener('click',async () => {
    await sleep(5 * 1000)
    document.execCommand('copy')
    console.log('copy')
})
</script>
</html>
```

`await sleep(5 * 1000)`では失敗
`await sleep(4 * 1000)`では成功
`await sleep(4800)`あたりから成功

# 参考

* [クリップボードとのやりとり - Mozilla | MDN](https://developer.mozilla.org/ja/docs/Mozilla/Add-ons/WebExtensions/Interact_with_the_clipboard)

> document.execCommand をユーザー操作に対する短命なイベントハンドラー(例えば click ハンドラー)のなかで実行することで、特別な許可なしに"切り取り"や"コピー"などのクリップボード操作が可能になります。

* [Interact with the clipboard - Mozilla | MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Interact_with_the_clipboard)

>The document.execCommand() method's "cut" and "copy" commands can be used to replace the clipboard's current contents with the selected material. These commands can be used without any special permission if you are using them in a short-lived event handler for a user action (for example, a click handler).

* [How to copy a large amount of html content to clipboard in javascript without timeout - Stack Overflow](https://stackoverflow.com/questions/66058639/how-to-copy-a-large-amount-of-html-content-to-clipboard-in-javascript-without-ti)

> In my browser the countdown stops after around 5 seconds. If I press Ctrl+C after the chain of copy handlers was broken, the copy handler is invoked again by a user generated event then it goes for 5 seconds again.

* [任意の文字列をコピーするテクニック - Qiita](https://qiita.com/khsk/items/5812ed8a73b8acd1eff2)
React入門 - Part3 - コンポーネントを書いてみる

#目次
[React入門 - 目次](https://qiita.com/yokowake12345/items/0919ad144cbc4684e64e)

# コンポーネントの記述方法

実は、[React入門 - Part2 - Next.jsを使ってページ遷移を行う](https://qiita.com/yokosuka205k9/items/132fbd4129afd9b37500)で既にコンポーネントを記述しちゃっいました。

```typescript
React.FC
```
ってやつです。これはReact+typescriptでの記述方法で、
Reac.FunctionalComponentの省略系のようです。

コンポーネントの書き方には、

- クラスコンポーネント
- typescriptを用いないファンクショナルコンポーネント

などもありますが、ここではtypescriptのみの紹介とします。

※クラスコンポーネントは、react hooksが出てくるまではよく使用されていたようですが、
たぶん今ではあまり使われない記述方法かと思います。

# 親子コンポーネントを書いてみる

私が経験したプロジェクトでは、eslintやprettierなどが設定されていて、且つ１コンポーネント300行までなど色々コーディング規約が自動で設定されていました。
また、React自体が<font color="red">コンポーネント思考</font>ということもあり、役割でコンポーネントを分ける場面というのはよくあります。

親子関係のコンポーネントを作ってみましょう。

[React入門 - Part2 - Next.jsを使ってページ遷移を行う](https://qiita.com/yokosuka205k9/items/132fbd4129afd9b37500)

で行ったようにプロジェクトを作成し、next.jsへようこそが表示できるところまで準備しておきます。

４つのファイルをpages配下に作成します。
(私には3人の男の子供がいるので、人数分の子コンポーネントを作りました。)

- parent.tsx ⇒ 親コンポーネント
- child1.tsx ⇒ 子(長男)コンポーネント
- child2.tsx ⇒ 子(次男)コンポーネント
- child3.tsx ⇒ 子(三男)コンポーネント

parent.tsx

```typescript
import React from 'react'
import Child1 from './child1';
import Child2 from './child2';
import Child3 from './child3';

export const Parent: React.FC = () => {

    /** レンダー部分 */
    return (
        <>
          <span>{'私は親です'}</span>
          <ul>
            <Child1 />
            <Child2 />
            <Child3 />
          </ul>
        </>
    )
}

export default Parent;
```

child1.tsx

```typescript
import React from 'react'

export const Child1: React.FC = () => {

    /** レンダー部分 */
    return (
        <li>{'私は長男です'}</li>
    )
}

export default Child1;
```

child2.tsx, child3.tsxは

ファイル名が違うのと、
コンポーネント名Child1がChild2,Child3になるのと

`<li>{'私は長男です'}</li>`

の部分が次男、三男になるだけです。


各ファイル作成、実装が完了したら

```
http://localhot:3000/parent
```

にアクセスして見てください。

以下のように表示されたら完成です。
ソース眺めてたらなんとなく雰囲気が分かると思いますので中身については解説しません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559029/3c5dc5e0-4557-f7c2-2971-9cc5f079b0ba.png)

以上
【WIndows】WindowsUpdateをコマンド上で実行する

調べて何か追加事項や要綱があれば随時更新。
Windows10向けに近いがServerにも利用可能なのでWindowsとしておく。

#WindowsUpdate

基本的にWindowsUpdateでもよく利用できる(おそらくこれがメジャーな)方法。
スクリプト上で
##セキュリティアップデート
```cmd:msuファイル形式

wusa <ファイルパス> /quiet /norestart
```

```cmd:exeファイル形式

<ファイルパス> /quiet /norestart
```
##大型アップデート

大型アップデートのファイルはisoファイルの中身をローカルにコピペしてもいい模様。(記事を見ている限り)
実行内容のみ記載。

```cmd:isoから大型アップデートを実施する

<setup.exeのパス>\Setup.exe /Auto Upgrade

```


#参考資料
http://office-qa.com/win/win69.htm
https://www.ka-net.org/blog/?p=10511
Google Earth Engineから衛星プロダクトをまとめてダウンロード（改）

##概要
　Google earth engine上には多数のデータが用意されています。特にMODISセンサーに基づいたプロダクトは多く、広く使われています。しかしながら、MODISプロダクトはmodis sinusoidalと呼ばれる投影法に基づいており、そのままでは一般的な緯度経度座標への投影になっていません。pyproj等を用いた投影変換も可能ですが、GEEを用いる事で、緯度経度座標でのダウンロードが可能です。本記事では、複数年に渡るデータをまとめてダウンロードしつつ、投影変換を行い、日付情報を付加してgoogle driveへ保存する方法についてご紹介したいと思います。

##データ
　今回ダウンロードしたのは、地表面反射率の8日間平均である[MOD09A1プロダクト](https://developers.google.com/earth-engine/datasets/catalog/MODIS_006_MOD09A1?hl=en)です。以下の画像はmodis sinusoidalがどの様に設定されているのかを示したものです。見慣れた形式（緯度経度）と比べて、ひしゃげた様な形状になっているのが分かります（[画像ソース](https://modis-land.gsfc.nasa.gov/MODLAND_grid.html)）。sinusoidal projectionの簡単な歴史や投影法の特徴については、[Wikipedia](https://en.wikipedia.org/wiki/Sinusoidal_projection)に載っています。

![MODIS_sinusoidal_grid1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1059565/b2a82327-d77a-4676-894b-4bad7d7299c8.gif)


##コード
　以下のコードについては、以下の[リンク](https://colab.research.google.com/drive/1A5yH3vDAo-lT5_TfxJ3ihp69Z8-WVvSx?usp=sharing) からGoogle ColabにてNotebook形式でもアクセスが可能です。

```GEEbulkDownload.py
!pip install earthengine-api
!pip install unidecode
!pip install geetools

import ee

#Googleアカウントの認証を求められます
ee.Authenticate() 
ee.Initialize()

from geetools import batch
from tqdm import tqdm 

#パラメータの設定

#ダウンロードしたいプロダクト名
productName="MODIS/006/MOD09A1"

#検索期間の開始日
startDate='-01-01' 

#検索期間の終了日
endDate='-01-30' 

#画像を保存したいフォルダ名
FolderName='SurfaceReflectance_MOD09A1' 

#ダウンロードしたいバンドの指定
#赤、緑、青、赤外
band=['sur_refl_b01','sur_refl_b03','sur_refl_b04','sur_refl_b05'] 


#長方形での対象領域の設定
#詳しい情報: https://developers.google.com/earth-engine/apidocs/ee-geometry-rectangle
ROI=ee.Geometry.Rectangle(coords=[140,35.9,140.5,36.2])

#対象年の指定
start_y=2016　#開始年
end_y=2019　#終了年
years=[y for y in range(start_y,end_y+1)] 


#ダウンロードの実行

for y in tqdm(years):
  #カウンタの初期化
  cnt=0

  #対象領域・対象期間におけるデータを検索
  start=f'{y}'+startDate
  end=f'{y}'+endDate
  ImageCollection_at_y=ee.ImageCollection(productName).filterDate(ee.Date(start), ee.Date(end)).select(band).filterBounds(ROI)

  #検索結果をリスト形式へ変換
  list_of_data=ImageCollection_at_y.toList(ImageCollection_at_y.size().getInfo())

  for d in range(list_of_data.size().getInfo()):
    #画像取得日をファイル名へ指定
    name=ee.Image(list_of_data.get(cnt)).date().format('yyyy-MM-dd').getInfo()
    task=ee.batch.Export.image.toDrive(
        description= f'{y}_{cnt}', 
        image=ee.Image(list_of_data.get(cnt)),
        folder=FolderName+f'_{y}', #フォルダ名
        region= ROI, 
        fileNamePrefix=name, #ファイル名の指定
        fileFormat= 'GeoTIFF',
        maxPixels= 1e12, #出力される画像のピクセル数上限を設定
        scale=500, #出力画像の空間解像度(m)
        crs='EPSG:4326') #緯度経度座標として、WGS84のEPSGコードを指定
    task.start() #処理の開始
    cnt+=1　#カウンタの更新
```

画像の出力例：Google Earthの画像上に重ね合わせてあります。sinusoidal projectionの歪みがなく、表示が一致している事が分かります。バンドの組み合わせは、植生が赤く表示されるフォルスカラー（R/G/B=B5/B1/B4）です。
![MODISoutput.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1059565/71067400-6399-1c28-8fab-497a84401233.png)
Gitで管理したいけど、載せたくないものが含まれている時はDBに登録してみる

# きっかけ

入力フォームを送信すると、自分のメールアドレスに通知がくる簡易アプリを作成していました。
個人のメールアドレスがコードの載ったままGitHubに載せていたのですが、「個人情報だから載せない方がいいよ」とご指摘を頂きました。

そこで、***「Gitで管理したいけど、載せたくないものが含まれていたらどうすればいいのだろう？」***と考えたのがきっかけです。

前回は「環境変数を使ってみよう！」と思いましたが、***「環境変数はOSに依存し、今後画面からメールアドレスを設定できるようにするといった機能拡張も難しくなるのでDBに登録がいいよ」***と教えて頂きましたので、DBに登録して使ってみたいと思います。

【環境変数を使う記事はこちら】
https://qiita.com/sumichan/items/37702c1dfd186b271139


# DBに隠したいメールアドレスを登録しておく
![スクリーンショット 2021-04-13 123226.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044070/9840f1b8-4f04-e457-fbc5-9f5575f134c8.png)

今回はPostgreSQLを使いました。

# ColdFusionで使ってみる
```
<cfquery datasource="sample" name="toemail">
    select email
    from secret
    where id = 1;
</cfquery>

<cfdump var="#form#">

<cfoutput query="toemail">

<cfmail to="#email#" from="#Form.Email_address#" subject="HPからのご意見">
    
    HPからのご意見
    Emailアドレス：#Form.Email_address#
    ご意見：#Form.RequestBody#

</cfmail>

</cfoutput>

```
`to="#email#"`の箇所は最初は自分のアドレスをダイレクトに入れていましたが、DBから取り出すことによって隠すことができました。

![スクリーンショット 2021-04-13 123958.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044070/1a24956c-7710-e44f-6316-adb379fe60ad.png)

無事にメールを受け取ることができました。
GCP HTTP LoadBalancer に CloudCDN を TTL 0s で入れたらレイテンシーが変わるのか検証

# 前提

古い記事ですが、社内で話に出てきた API に CloudFront を挟んで TTL 0s にすることで API コールを早くするという話がありました。
[CloudFrontをかますとキャッシュなしのAPIコールでも速くなるようだ](http://blog.livedoor.jp/sonots/archives/48002650.html)

確かにこの頃、軽くバズってた記憶があります。
GCP でも同じようなことが起きるのかという議題になったので検証してみました。

※めっちゃシンプルな内容なので期待はしないでください

# 検証

## 検証条件

1. 台湾リージョンに nginx をインストールした GCE を1台構築
1. インスタンスグループを1つ作成し、1で作成したVMを追加する
1. HTTP LoadBalancer で GIP を2つ付与
1. バックエンドサービスを2つ作成し、2で作成したインスタンスグループを指定する
1. バックエンドサービスの1つは CloudCDN を無効、1つは CloudCDN を有効にして `Use origin settings based on Cache-Control headers` を指定してキャッシュされないようにする
1. クライアントは東京のローカルPC
1. curl で各エンドポイントに対して 100 回の試行を行いレスポンスタイムの平均値で評価を行う
1. プロトコルは HTTP のみ


## 検証結果

| CloudCDN 無し | CloudCDN 有り |
| --- | --- |
| 平均 0.07620353 秒 | 平均 0.07620353 秒 |

# 結論

GCP の場合は CloudCDN を経由してもレイテンシーに大きな変化は起きないようだった。
HTTPS にした場合に変わるのかとかもあると思いますが、ここまで変化がないと HTTPS の場合も変わらない可能性あります。
CloudCDN は DSA (Dynamic Site Acceleration) が行われていないのか、 CDN の有無に関わらず最適な経路を通るようになっている可能性があると思います。
公式ドキュメントかどこかで HTTP LoadBalancer はグローバルリソースなので、最適な経路を通るようになっていると見た記憶があります。
Google CloudPubSub の同期Pullで取得するReceivedMessageオブジェクトに対してack()やnack()する

# 背景
- Google CloudPubSubの同期pull処理でメッセージを取得する場合 `ReceivedMessage` オブジェクトが取得できる
- `ReceivedMessage` オブジェクトは `ack()` や `nack()` メソッドがないので、別の方法で行う

# 実装

```py
from google.api_core import retry
from google.cloud import pubsub_v1

subscriber = pubsub_v1.SubscriberClient()
subscription_path = subscriber.subscription_path("YOUR_PROJECT", "my-sub")

with subscriber:
    while True:
        response = subscriber.pull(
            request={"subscription": subscription_path, "max_messages": 1},
            timeout=5,
            retry=retry.Retry(deadline=300),
        )

        received_message = response.received_messages[0]
        ack_id = received_message.ack_id

        # nack()
        subscriber.modify_ack_deadline(request={
            "subscription": subscription_path,
            "ack_ids": [ack_id],
        })

        # ack()
        # subscriber.acknowledge(request={"subscription": subscription_path, "ack_ids": [ack_id]}
```

# 参照
https://googleapis.dev/python/pubsub/latest/subscriber/index.html?highlight=receivedmessage
【Docker】エラー対処法：Error: Missing binding /usr/src/app/node_modules/node-sass/

Dockerでイメージをbuild後にコンテナを起動した時に、sass-loaderを現在のOS環境にバインドできないとのエラーが発生した。


##エラー内容

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/bf991b40-5c95-08ef-1597-79efe695d998.png)

>bootstrap.js:4427 Uncaught Error: Module build failed (from ./node_modules/sass-loader/dist/cjs.js):
Error: Missing binding /usr/src/app/node_modules/node-sass/vendor/linux_musl-x64-83/binding.node
Node Sass could not find a binding for your current environment: Linux/musl 64-bit with Node.js 14.x

>Found bindings for the following environments:
  - OS X 64-bit with Node.js 12.x

>This usually happens because your environment has changed since running `npm install`.
Run `npm rebuild node-sass` to download the binding for your current environment.

Dockerの中で使っているのでlinux用のsass-loaderをインストールしなければいけないが、OS-X用のsass-loaderしかない状況。

###以下対応をしたがエラーは直らず
・`npm install`は`npm rebuild node-sass`を実行済み。

・.dockerignoreにnode_modules/*を記載済み。

・volumeで`app/node_modules`をコンテナ内のボリュームのみ割り当て、ホスト側とは同期しない。




<br>
##発生原因
本来、コンテナの中でbootstrap関連のパッケージをインストールしなければいけないところ、ローカルで実施したためOS X用のsass-loaderしかインストールされなかった。


##対処法
コンテナに入ってbootstrap関連のパッケージをインストールする。

```
#コンテナ名を確認
$ docker ps
CONTAINER ID   IMAGE                       COMMAND                  CREATED          STATUS         PORTS                                            NAMES
88e9777dd7de   ruby2.7.2                   "bin/rails s -p 3000…"   4 minutes ago    Up 4 minutes   0.0.0.0:3001->3000/tcp                           rails-app


#コンテナに入る（laravelの場合はbash）
$ docker exec -it rails-app sh
/app #


#コンテナの中でbootstrap関連パッケージをインストール
/app # yarn add jquery bootstrap popper.js
```

コンテナを再起動したところエラーが直った。

Dockerfileでyarnをインストールしているのでyarnを使用したが、npmのときはyarnをnpmに変更する。


<br>
##まとめ
docker上のプロジェクトでnpmのパッケージをインストールする場合はコンテナの中に入ってインストールする。
abc198のメモ

#A
```python
N = int(input())
ans = 0
if N<2:
    ans = 0
else:
    ans = N - 1
print(ans)
```

#B
```python
N = input()
L = len(N)

for i in range(L):
    if int(N[-1]) == 0:
        N = N[0:L-i-1]

for i in range(int(len(N)/2)):
    if N[i] != N[len(N)-i-1]:
        print("No")
        exit()

print("Yes")
```

#C
```python
import math

R, X, Y = [int(a) for a in input().split()]
dis = math.sqrt(X**2 + Y**2)

if dis < R:
    print(2)
elif dis == R:
    print(1)
else:
    print(math.ceil(dis/R))
```

#D

当日は時間切れで提出できず、残念。
後日じっくり考えたらできた。
itertoolsって初めて使ったけど、競プロで今後も役に立ちそう。

PythonではLTE。同じコードでPypyだと通りました

```python
import itertools

S = []
strings = []
N = []
for i in range(3):
    S.append(input())
    N.append(list())
    for j in range(len(S[i])):
        strings.append(S[i][j])
        N[i].append(0)

str_set = set(strings)
str_list = list(str_set)

if len(str_set) > 10:
    print("UNSOLVABLE")
    exit()

for v in itertools.permutations(range(10), len(str_set)):
    if v[str_list.index(S[0][0])] == 0 or  v[str_list.index(S[1][0])] == 0 or  v[str_list.index(S[2][0])] == 0:
        continue
    N123 = [0, 0, 0]
    for i in range(3):
        num = ""
        for j in range(len(S[i])):
            num += str(v[str_list.index(S[i][j])])
        N123[i] = int(num)
    if (N123[0]+N123[1] == N123[2]) and (N123[0] != 0)and (N123[1] != 0)and (N123[2] != 0):
        for x in N123:
            print(x)
        exit()

print("UNSOLVABLE")
```
Pythonでサブネットマスクをプレフィックス表記からオクテット表記へ変換する方法

# 趣旨
socket使う方法もあるけど、あんまり使いたくない人用

# コード

```Python
from ipaddress import IPv4Interface

def cidr_to_netmask(cidr:str) -> str:
    itfc = IPv4Interface('0.0.0.0' + cidr)
    return str(itfc.netmask)

print(cidr_to_netmask('/0'))
print(cidr_to_netmask('/8'))
print(cidr_to_netmask('/16'))
print(cidr_to_netmask('/24'))
print(cidr_to_netmask('/32'))
```

# 結果
```
0.0.0.0
255.0.0.0
255.255.0.0
255.255.255.0
255.255.255.255
```
SPA公開時の、S3+CloudFrontとS3の違い

## introduction

Reactで作ったシングルページアプリケーション（SPA）を公開する際には、CloudFront+S3が多い。この構成は、Reactの挙動にどれくらいcriticalなのか気になったので、実際にSPAをホスティングしてみた。その調査・作業Log。

CloudFront+S3の場合に気になった結果はなかったので、S3のみでのホスティングを中心にまとめる。

## AWSサービス

S3: ストレージサービス。htmlをアップロードしてホスティングをすることができる。
CloudFront: コンテンツ配信サービス。ここを経由してS3にアクセスできる。

## 準備

1. react-router-domの[QuickStart](https://reactrouter.com/web/guides/quick-start)でページ遷移のあるReactのSPAを作成。
1. 1のSPAをbuildしたものを、公開するS3バケットにアップロード。
1. S3をマネジメントコンソールで設定。
1. CloudFrontをマネジメントコンソールで設定。

AWSの設定は、参考文献を初めてとして様々な記事があるので省略。

### S3でのルーティング設定

SPAのホスティング問題として、ルーティングでpathが変更された後にリロードすると、そのままだと404になってしまうという問題があるらしい。
CloudFrontでは、エラー時のリダイレクトで解決していたが、S3でも同じ設定を行うことができる。
![spa-s3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/825263/a7d880d4-10d7-855b-ea6f-820db821acd2.png)

これで解決できるかどうかを検証。

## 結果

S3のみでも、SPAの挙動に問題はなかったと思う。
気になった点は、エラーのリダイレクトの際に404が返ってしまうので、statusCodeを用いて制御している場合は、意図しない挙動になるかもしれない。

### できたこと

* SPAのルーティングは確認できた。
* リロード時に、リロードした時のpathに移動できる。

### できなかったこと

* httpsにはできない。（[S3の公式Document](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/WebsiteEndpoints.html)、SSLはサポートしていない。）
* エラーのリダイレクトの際に、404のままになってしまう。CloudFrontの場合は、200に変えることができる。
* S3のリダイレクトルールを利用する場合、リロード時にindex.htmlに移動してしまう。

利用したS3のリダイレクトルールは、次のもの。

```
[
    {
        "Condition": {
            "HttpErrorCodeReturnedEquals": "404"
        },
        "Redirect": {
            "HostName": "HOST_NAME",
            "Protocol": "http",
            "ReplaceKeyWith": "index.html"
        }
    }
]
```


## 課題

### 未確認

* APIを呼び出した際の挙動は未確認。
* stateの保存等については未確認。
 * 上記の内容は、S3とCloudFrontでできることに差がないと思うので、多分問題はない。

### 知識不足

* S3へのアクセス権。今回行ったバケットポリシー（かなり緩い）で、セキュリティ上問題がないのかということ。
* httpではなぜダメなのか。http/httpsの基礎知識。
* S3へのアクセス方法。REST API エンドポイントとウェブサイトエンドポイントの主な違い。

## 感想

自分で作ったSPAを公開するのであれば、S3でもできそう。
一方で、Amprifyを使った方が簡単な感じもしているので、どうしようかなぁという気分。

## 参考文献
S3のみの場合。考えていた作業方針でできそうということは下の記事でわかりました。
またSPAのホスティングで、リロード以外に問題になる点が他になさそうなことを把握できました。

https://qiita.com/ikamirin/items/6377c390034a064190f5

https://blog.ojisan.io/s3-spa-deploy

CloudFront利用の場合。定番構成のためいろいろありますが、CloudFrontの設定は下の記事を参考にしました。

https://qiita.com/leomaro7/items/5aae69fba8f07555b457
【Qiita】タグは0より大きい値にしてください【エラー処理】

# 追記
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85205/61216043-68c7-c88d-465f-f229ac03e62c.png)
いつからかは不明ですが、エラー文が修正されたようです。
この記事はもう用無しですね・・・

# Qiitaで記事を書いているときにハマったこと(?)
Qiitaで記事を書いているときに10分程度ハマってしまった(?)ので、同じミスをする今後のユーザーのためにメモを残しておきます。

## タグは0より大きい値にしてください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85205/77daf7e3-78bc-3fe5-18ab-9c054ed1f183.png)

Qiitaに投稿しようとしたところ、上記エラーが出ました。

```
タグは0より大きい値にしてください
```
## 原因

記事のタグが入力されていない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85205/d23b26b8-b830-d9d1-043c-a19c60a737de.png)

## 解決法
タグを入力しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85205/df04f66b-10d6-2d59-f178-d5fd1d92ba78.png)

## おわりに

もうちょっとわかりやすいエラー文が良かったなぁ
「タグを入力してください」とか。
【Laravel】モデルをall()で取得したときに並び替える方法

# allで取得したモデルを並び替える方法

モデルをallで取得した時、基本的には主キーでソートされるようです。
別のキーでソートしたい場合でも、`order by`は使えません。

```php:laravel
$users = Users::all()->orderBy('department_id');
```

all()で取得した場合は、`order by`ではなく`sort by`を使う必要があります。

```php:laravel
$users = Users::all()->sortBy('department_id');
```

# 参考

[Laravel Eloquent: Ordering results of all()](https://stackoverflow.com/questions/17429427/laravel-eloquent-ordering-results-of-all)
HTTPURLConnectionでBasic認証を行う際の実装例

```Java
private void basicAuthFunction() throws IOException, ParseException {
    HttpURLConnection connection = null;
    try {
        final URL url = new URL(config.getRequestUrl());
        connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("GET");
        connection.setRequestProperty("Authorization", "Basic " + config.getEncodeAuthorization());
        connection.connect();

        streamFunction(connection);
    } finally {
        if (connection != null) {
            connection.disconnect();
        }
    }
}

private void streamFunction(HttpURLConnection connection) throws IOException, ParseException {
    try (final InputStream stream = connection.getInputStream();
         final BufferedReader reader = new BufferedReader(
                 new InputStreamReader(stream, StandardCharsets.UTF_8))) {

        final StringBuilder builder = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            builder.append(line);
        }

        final JSONObject obj = (JSONObject) new JSONParser().parse(builder.toString());
        final JSONObject data = (JSONObject) obj.get("data");
    }
}
```

## 参考
[StringBuilderとStringBufferの違い -Qiita](https://qiita.com/gksdyd88/items/d3873600829337bebedd)
React入門 - Part2 - Next.jsを使ってページ遷移を行う

#目次
[React入門 - 目次](https://qiita.com/yokowake12345/items/0919ad144cbc4684e64e)

# Next.jsの概要

Next.js（ねくすとじぇーえす）とは、Reactの機能を拡張するためのJavaScriptフレームワークです。Next.jsを使用することで、サーバ側でページを生成する**サーバサイドレンダリング**（SSR）ができるようになります。サーバサイドレンダリングを行い、<font color="red">クライアント側のページ生成処理を減らすことで、より高速なウェブページの表示が可能</font>になります。
[※ここからの抜粋](https://codezine.jp/article/detail/13861)

Next.jsは**サーバーサイドレンダリング**(SSR)や<font color="red">ファイルベースルーティング</font>など多くの機能を**ゼロコンフィグ**で提供してくれます。
[※ここからの抜粋](https://qiita.com/Yuki_Oshima/items/5c0dfd8f7af8fb76af8f)

# Next.jsを設定する
[ここ](https://wp-kyoto.net/make-typescript-react-app-made-by-create-next-app/)の「セットアップ」から「もう一度yarn devを実行すると・・・」まででOKです。

纏めます。

Git Bash等でプロジェクトを作成したいディレクトリに移動して以下を実行します。

```
npx create-next-app プロジェクト名
cd プロジェクト名
```

tsconfigを配置するために、以下のコマンドを実行します。
※VsCodeのターミナルからは実行できなかったので、Git Bashでプロジェクトに移動してから実行しました。

```
touch tsconfig.json
```

yarn devを実行しますが以下のようにエラーになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559029/bfa8aeeb-fd85-cd5e-646d-27a167631101.png)

何かが足りないので「yarn add・・・」を実行しなさいということなので、それに従い以下を実行します。

```
yarn add --dev typescript @types/react
```

再度、以下を実行します。

```
yarn dev
```

ブラウザで以下にアクセスする

```
http://localhost:3000
```

以下の画面になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559029/671e1f88-0061-cef0-fedd-bf78b734b667.png)

# Next.jsでのページ遷移の概要

Next.jsはpages/ディレクトリに置いたフォルダ/ファイルの構成に従って、HTMLを生成してページ遷移を実現します。ルーティングライブラリは不要で、<font color="red">URLの構造に合わせてjs(ts,tsx)ファイルを配置するだけ</font>です。

以下の例ではindex.tsxが/、hoge.tsxが/hogeに対応付けられます。

```typescript
--pages
    |--index.tsx -> /
    |--hoge.tsx -> /hoge
    |--fuga.tsx -> /fuga
    |--404.tsx
    |--_app.tsx -> アプリケーションエントリーポイント
    |--_document.tsx -> HTMLドキュメント構造記述用
```

# Next.jsでページ遷移を試してみる

pages配下にpage1.tsxを作成します。

```typescript
import Router from 'next/router';
import React from 'react';

export const Page1: React.FC = () => {

    /** ページ遷移クリックイベント */
    const onNextPageClick = () => {
        Router.push('/page2');
    }

    /** レンダー部分 */
    return (
        <>
          <span>ここはページ１です。</span>
          <button onClick={onNextPageClick}>Page2に遷移します。</button>
        </>
    )
}

export default Page1;
```

page2.tsxも作成します。

```typescript
import Router from 'next/router';
import React from 'react';

export const Page2: React.FC = () => {

    /** ページ遷移クリックイベント */
    const onNextPageClick = () => {
        Router.push('/page1');
    }

    /** レンダー部分 */
    return (
        <>
          <span>ここはページ２です。</span>
          <button onClick={onNextPageClick}>Page1に遷移します。</button>
        </>
    )
}

export default Page2;
```

作成したら、

```
yarn dev
```

を実行し、

```
http://localhost:3000/page1
```
にアクセスし動作確認を行いましょう。

React.FCやexport defaultなど謎なコードが存在しますが、
今のところは、呪文だと思って雰囲気をとらえておきましょう。

遷移部分の実装は、

```typescript
Router.push('/page1');
```
ですね。

以上
量子化学入門　Roothaan SCF計算（続報）

前回の『[量子化学入門　Roothaan SCF計算](https://qiita.com/ppp_calc/items/55ab6cb8850fb8ec658d)』で、最後の2中心電子間反発積分に関する部分を補足します。全くピッタリ、_Just Fit_ の解法ページを発見しました。

__[2中心電子間反発積分の解法ページ(2.4)](https://hyperbolic.itigo.jp/)__

```math
<AB||AB> = <AB|\frac{1}{r_{12}}|AB> = \iintφ_{A1}φ_{B2}\frac{1}{r_{12}}φ_{A1}φ_{B2}dτ_1dτ_2 \\
= \intφ_{B2}φ_{B2}\left(\intφ_{A1}φ_{A1}\frac{1}{r_{12}}dτ_1\right)dτ_2
```

上記の2中心電子間反発積分を解いています。ただし解法ページでは、A1 と B2 にスレーター型関数を使っていますので、これをガウス型関数P1とQ2に、次のように置き換えるだけです。

```math
φ_{A1}φ_{A1} = φ_{P1} \\
φ_{B2}φ_{B2} = φ_{Q2}
```

つまり次の積分を解きます。

```math
<P_1|\frac{1}{r_{12}}|Q_2> = \iintφ_{P1}\frac{1}{r_{12}}φ_{Q2}dτ_1dτ_2 \\
= \intφ_{Q2}\left(\intφ_{P1}\frac{1}{r_{12}}dτ_1\right)dτ_2
```

そして__[解法ページ(2.4)](https://hyperbolic.itigo.jp/)__の各MyLibraryをスレーター型からガウス型へ変更可能であれば、この解法ページでそのまま解けそうな気がしますが。

以上、簡単ですが補足の続報として。


※ 一方、Samuel Francis Boys が始めた 4 中心積分を 2 中心積分に変換する公式は、まだ元文を捜索中です。
Flex.boxの基礎を理解すると。

初心者が独学１年では理解できなかったFlexboxを
プログラミング学校に通ったことによってめちゃくちゃ理解できたのでご報告いたします。

Flex.boxを理解するためには『HTML,CSS』を理解している必要があるなと実感
『HTML』を装飾するためのツールの一つとしてFlexboxが存在する

『Flexbox』を理解するために用意するモノ
・CSS Flexbox チートシート　（ダウンロード）

以上。


文章で表現は難易度高いので、Flexboxを使って次回から『国旗』を作ります


今回は以上です！
ありがとうございます
よく使うcss

#要素にそれっぽい影をつける
XDのデフォルトの値でデザイナーがこのままの値を使う

```
box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16);
```

#flexの横並びスクロール
スクロールバー非表示と、末尾に余白用の擬似要素を追加するのがポイント

```
  ul {
    display: flex;
    flex: 1;
    overflow-x: scroll;
    white-space: nowrap;
    &::-webkit-scrollbar {
      display: none;
    }
    li {
      margin-left: 8px;
      display: inline-block;
      &:first-of-type {
        margin-left: 16px;
      }
      &:last-of-type {
        position: relative;
        &::after {
          position: absolute;
          top: 0;
          left: 100%;
          width: 16px;
          height: 1px;
          content: '';
        }
      }
    }
  }

```
CISSP合格メモ

#きっかけ
会社から「セキュリティ系の研修を受けてよい」とお達しが来たので、2021年2月の公式トレーニング
( https://www.nri-secure.co.jp/service/learning/cissp_training )をうけることに。

#基礎知識
- MSS/SOC業務を 10年程度
- ユーザ企業で情セキュ/情シスを 1年程度

#勉強ツール
- 公式トレーニング ( https://www.nri-secure.co.jp/service/learning/cissp_training )
- CISSP公式問題集 Kindle版 ( https://www.amazon.co.jp/gp/product/B08C7J6SR5/ )

##公式トレーニング
- 5日間の Zoom によるオンライントレーニング
- 受講後180日間アーカイブの視聴可能

初日の午前中は集中してトレーニングを受講することが、それ以降は業務が忙しく、ながら聞き、になり、3日目からはログインすらしなくなってしまった。
トレーニング・セミナーについては、業務と物理的に切り離せる、オンサイト開催がいいな、と切に思った。

3月上旬から、業務、家事後に 2時間程度トレーニングテキストの読み込みとアーカイブの視聴を行っていった。
テキスト・スライドにない、講師による口頭補足のほうが、CISSP の考え方を理解するのに役立った。
視聴完了したときには、試験まで 1週間を切っていた。

##CISSP公式問題集 Kindle版
- 各ドメイン 100問程度と模擬試験(125問) 4回が収録
- 問題と解説の行き来が、クリック(タップ)一発でできる

試験当日までに実施できた範囲は、ドメイン1～8 と模擬試験 2回分を 1周。
回答の正否はあまり気にせず、解説に出てくる間違いの単語や内容も合わせて覚えていく。これにより 1問で 4個くらい覚えていける。
基礎知識のあるドメイン3,4 あたりは流し気味で。

#試験当日
##持ち物
- Kindle
    - 移動時間中の最後の追い込み
- 身分証明書 2点 (パスポートと運転免許証を持って行った)
- 食料
    - おにぎり x2
    - アンパン
    - ブドウ糖タブレット
    - 飲み物

##試験前
8時から試験、30分前までに来てチェックインしろ、とのことだったので、余裕をもって 7時に西新宿に着く。そのままビルに行ったら、ビルの入り口が開かなかった。7時10分くらいに開くようになった。
そのままチェックインし、荷物をロッカーに入れ、7時40分くらいに入室し試験開始。

##試験
試験の内容は NDA を結んでいるため記載することはできない。
もともと予定では、100問→休憩→100問→休憩→50問のつもりだった。
ただ、道中の手ごたえが 4割くらいで、2度目の休憩後すぐにサドンデス食らうと(※サドンデス方式かどうか定かではない) いたたまれないな、と思い、100問→休憩→150問に。
消去法で 2択までいくけど、どっちも決め手に欠ける、みたいな問題が多く、気持ちよく答えられる問題はあまりなかった。

ペース的には
07:40 開始
　　　100問
09:15 休憩
　　　糖分補給(おにぎりとブドウ糖)
09:25 再開
　　　150問
10:40 終了

##試験後
無事、合格の用紙を受け取り、心晴れやかにエヴァンゲリオンの卒業に向かった。
Amazon EC2 （Arm版）でdocker-composeを動作検証

## はじめに

従来のMacよりも、圧倒的にコスパが高いとされているM1 Macが市場に出回り、ARMアーキテクチャを採用したCPUの導入事例も増えてきました。

私もこの流れに乗って、Amazon EC2（Arm版）でdocker-composeが正常に動作するのか検証しました。

今回の記事では、検証したことを記録していきます。

M1 Macでは、x86_64アーキテクチャ用のコンテナも動作しているので、個人的はEC2（Arm版）でも動いてくれることに少し期待しています。

## 共有事項

**この記事から得られること**

- Arm版CPUにdocker-composeコマンドを入れて、Armアーキテクチャ用のコンテナをビルド、実行することができる。

- Amazon EC2（Arm版）でIntel用のコンテナの検証結果、過程が分かる。


**事前に分かっていること**

- x86_64環境でDockerfileをビルドしたコンテナをECRにpushしておき、M1 Macでコンテナをpullして使うことが出来る

- 今回動かしたいIntel用のコンテナがt3a.mediumインスタンス（Intel版)で動いている


**やりたいこと**

- x86アーキテクチャのコンテナをAWS Graviton環境のt4g.mediumインスタンス（Arm版)で動かす

- 検証結果できなかったとしても、その過程を整理する


**結論**

- Pythonのpackage manager pipを介する必要があるが、docker-composeはインストールできる
- x86_64アーキテクチャ用のコンテナはEC2のArmインスタンスでビルド、実行はできない。（2021年4月時点）


## 記録

**docker-composeコマンドをインストール**

curlコマンドを使って、ソースファイルをビルドして、docker-composeコマンドをインストールしてみます。

**x86_64環境の場合**

```
$ sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   633  100   633    0     0  18085      0 --:--:-- --:--:-- --:--:-- 18085
100 11.6M  100 11.6M    0     0  39.9M      0 --:--:-- --:--:-- --:--:-- 58.8M
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version
docker-compose version 1.27.4, build 12345678
```

**aarch64環境の場合**

```
$ sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100     9  100     9    0     0     37      0 --:--:-- --:--:-- --:--:--    37
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version
/usr/local/bin/docker-compose: line 1: Not: command not found
```
curlコマンドを使って、ソースファイルをビルドして、docker-composeコマンドをインストールするプロセスだと、下記のようなエラーが出てしまいます。

原因は、アーキテクチャが違うため扱っているバイナリも異なっています。

```
$ docker-compose --version
/usr/local/bin/docker-compose: line 1: Not: command not found
```

Arm版のEC2インスタンスにdocker-composeコマンドを入れる解決策は下記です。（Raspberry Piも同様にdocker-composeコマンドを入れることができます。）

```
$ uname -s -m
Linux aarch64
$ cat /etc/system-release
Amazon Linux release 2 (Karoo)

$ sudo yum install -y python37 python3-devel.$(uname -m) libpython3.7-dev libffi-devel openssl-devel 
$ sudo yum groupinstall -y "Development Tools" # need gcc and friends
$ sudo python3 -m pip install -U pip  # make sure pip is up2date
$ python3 -m pip install docker-compose 
$ docker-compose --version
docker-compose version 1.27.4, build unknown
```

Pythonのpackage manager pipを使って、手動でdocker-composeがインストールすることが出来ました。

docker-composeコマンドがインストール出来たところで、x86_64アーキテクチャのコンテナが動作するのか検証してみましょう！

**結果**

- x86_64アーキテクチャのコンテナは、純粋なaarch64のLinux環境では、動作しませんでした。<br>
（マルチアーキテクチャのコンテナは、aarch64にも対応していることもあり、動作しました。）



## さいごに

今後は、Dockerコンテナなどで、複数のCPUアーキテクチャを考慮する場面が出てくると思うので、その知見を貯めていきたいと考えています。

最後まで読んでいただきまして、ありがとうございます。
dufコマンドが便利そうだった

# はじめに
サーバー運用をしていると、ディスク容量を確認するケースは多々あるかと思います。
`df` コマンドや `du` コマンドを使うケースが多いと思いますが、 良い感じに表示してくれる 
`duf` コマンドというものがあるようなので、試して記事にしました。


# 環境構築
## mac
普通に `Homebrew ` で入る。

```zsh
brew install duf
```
入らない場合は、下記で `formula` として追加した後に実行する。

```zsh
brew tap muesli/tap && brew install duf
```

## Linux(CentOS)

```
sudo yum install https://github.com/muesli/duf/releases/download/v0.6.2/duf_0.6.2_linux_amd64.rpm
```

# 使ってみる
![スクリーンショット 2021-04-13 11.32.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66330/23e5ef83-44cc-2f05-b1be-5ac2859581bd.png)


こんな感じで色分けして表示される。

# オプション
```zsh
% duf --help
Usage of duf:
  -all
    	include pseudo, duplicate, inaccessible file systems
  -hide string
    	hide specific devices, separated with commas:
    	local, network, fuse, special, loops, binds
  -hide-fs string
    	hide specific filesystems, separated with commas
  -inodes
    	list inode information instead of block usage
  -json
    	output all devices in JSON format
  -only string
    	show only specific devices, separated with commas:
    	local, network, fuse, special, loops, binds
  -only-fs string
    	only specific filesystems, separated with commas
  -output string
    	output fields: mountpoint, size, used, avail, usage, inodes, inodes_used, inodes_avail, inodes_usage, type, filesystem
  -sort string
    	sort output by: mountpoint, size, used, avail, usage, inodes, inodes_used, inodes_avail, inodes_usage, type, filesystem (default "mountpoint")
  -style string
    	style: unicode, ascii (default "unicode")
  -theme string
    	color themes: dark, light (default "dark")
  -version
    	display version
  -warnings
    	output all warnings to STDERR
  -width uint
    	max output width
```

# 参考
*  [GitHub](https://github.com/muesli/duf)
*  [dufコマンドでいい感じにディスクの使用量を表示する方法](https://qiita.com/reoring/items/116e0c19705f602d8f56)
*  [duf – Disk Usage/Free Utility for Linux, BSD, macOS & Windows](https://www.cyberciti.biz/open-source/command-line-hacks/duf-disk-usage-free-utility-for-linux-bsd-macos-windows/)
CSSやjQueryでできるアニメーション！

CSSやjQueryでwebページにつけるアニメーションを自分のメモとしてまとめました。
＊いろいろなサイトを参考にさせていただきました。

#ページをスクロールするとクラスが追加される。
ページをスクロールしていくとclassNameに”some class!”部分のクラスが追加される。

```javascript:jQuery
$(function() {
    $(window).scroll(function() {
      $(".className").each(function() {
        var scroll = $(window).scrollTop(); 
        var blockPosition = $(this).offset().top; 
        var windowHeihgt = $(window).height(); 
        if (scroll > blockPosition - windowHeihgt) {
          $(this).addClass("some class!");
        }
      });
    });
  });
```

#画面ロード中にアニメーションを表示
画面ロード中に黄色い円が出ます。htmlに.loaderを持つクラスが必要。
cssを変えることでいろいろ表示できる。

最後に紹介しているEpic spinnerのサイトなどでローディングアイコンをコピーしてCSSとHTMLに張り付ければかっこいいのを作れる。

```css:css
.loader {
  align-items: center;
  background: #fff;
  bottom: 0;
  display: flex;
  justify-content: center;
  left: 0;
  position: fixed;
  right: 0;
  top: 0;
  z-index: 999;
}

.loader::after {
  animation: loader 0.5s linear infinite;
  border: 1px solid orange;
  border-radius: 50%;
  border-right: 5px solid rgba(orange, 0.2);
  border-top: 5px solid rgba(orange, 0.2);
  content: "";
  height: 70px;
  width: 70px;
}

@keyframes loader {
  0% {
    transform: rotate(0);
  }
  

  100% {
    transform: rotate(360deg);
  }
}
```

```javascript:jQuery
  $(window).on('load',function(){
    $(".loader").fadeOut();
    // これだけで 
  });
```

#ふわふわと揺れる
htmlにfuwafuwaクラスをつけると適用される。backgroundのurlはお好みで

```css:css
//CSS
.fuwafuwa {
  animation: fuwa 4s infinite ease-in-out .9s alternate;
  background: url(image) no-repeat center center / 60px auto;
  display: inline-block;
  transition: 1.5s ease-in-out;
}
 
@keyframes fuwa {
  0% {
    transform:translate(0, 0) rotate(-7deg);
  }
  50% {
    transform:translate(0, -7px) rotate(0deg);
  }
  100% {
    transform:translate(0, 0) rotate(7deg);
  }
}
```

#くるくる回って出現
htmlにkurukuruクラスをつけると適用される。

```css:css
.kurukuru {
  background: linear-gradient(to right, #362ae0 0%,#3b79cc 50%,#42d3ed 100%);
  width: 50px;
  height: 50px;
  opacity: 0;
  padding-bottom: 40px;
}
.kurukuru.is-animated {
  animation: kurukuru 1.4s ease-out;
  opacity: 1;
}
@keyframes kurukuru {
  0%{
    transform: rotateY(0) translateY(40px);
    opacity: 0;
  }
  100%{
    transform: rotateY(360deg) translateY(0);
    opacity: 1;
  }
}
```

##最後に
いろいろ追加していきたいと思います。

便利なサイト
Epic spinner
https://epic-spinners.epicmax.co/#/
AWS SAMでのCORS(Cross-Origin Resource Sharing)設定

# 背景
AWS SAMを使うとローカルで開発・テストしてLambdaにデプロイするのが楽になるが、CORSをどう設定すれば良いのかわかりにくかったので、試行錯誤して分かった最終形をここに残しておく。

# 設定
`sam-conf`と`app.js`に設定が必要。sam-confの書き方は特殊で、`AllowMethods`などの設定を`"''"`で囲む必要があるので注意。
(Originアクセスを許可したいドメインをORIGIN_DOMAIN_NAMEと記載したので、自身の環境に合わせて置換してください。)

```:sam-conf
Globals:
  Api:
    Cors:
      AllowMethods: "'OPTIONS,GET'"
      AllowHeaders: "'*'"
      AllowOrigin: "'ORIGIN_DOMAIN_NAME'"
```

```js:app.js
exports.lambdaHandler = async (event, context) => {
    const responseHeaders = {
      "Access-Control-Allow-Methods": "OPTIONS,GET",
      "Access-Control-Allow-Headers" : "*",
      "Access-Control-Allow-Origin": "https://ORIGIN_DOMAIN_NAME"
    }

    // any application code

    const response = {
        'statusCode': 200,
        headers: responseHeaders,
        'body': JSON.stringify({
            message: "Access allowed"
        })
    }

    return response;
```

# 確認
上記設定でデプロイしたら、ちゃんと設定できているかcurlで確認する。
(`{}`の中身は自身の環境に合わせて変更してください)

```shell-session
$ curl -v -X GET https://{restapi_id}.execute-api.{region}.amazonaws.com/{stage_name}/{endpoint_name}

... 雑多なログ
< access-control-allow-origin: https://ORIGIN_DOMAIN_NAME
< access-control-allow-headers: *
< access-control-allow-methods: OPTIONS,GET
```

# 作ったもの
AWS SAMを使って、[年賀状の写真から当選確認できるサイト](https://newyearscardlottery.link/)を作りました。
MMdetectionでポリゴンの予測を実施する


# はじめに

物体検知タスクでポリゴン予測のタスクがあったので備忘録がてら記載しようと思います。

## 使用するモデルの準備

今回は、セグメンテーションタスクというよりは、一部のデータがバウンディングボックスではなくポリゴンデータになっているというタスク

MMDetectionでポリゴンデータが使えるモデルを確認すると以下のモデルが使えるようでした。

・htc_without_semantic_r50_fpn_1x_coco.py

## データ準備

基本的に、下の記事にしたがってcocodatasetを準備します。

https://qiita.com/harmegiddo/items/da131ae5bcddbbbde41f

注意点は、ポリゴンデータを格納する「segmentation」を以下の形とすることです。
（x,yを平坦化して入力）

"segmentation": [[x1,y1,x2,y2,...,xn,yn]]

また、今回はバウンディングボックスのデータは与えられていなかったので、バウンディングボックは以下とします。
"bbox":[x_min,y_min,x_max-m_min,y_max-y_min]

これでcocoデータセットの作成を実施します。

## 学習

カスタムデータセットを使った学習方法は下を参照ください。

https://qiita.com/ryosao/items/908b05f4da6648931134

利用するモデルに応じて内容を適時修正ください。

## 結果

ポリゴンの予測タスクした時の結果をresultという変数に入れると以下の結果になる。

result[0]: bboxの予測領域と予測確率

result[1]: 対象領域のピクセル毎にTrue,Falseのマスク値
（以下のような感じなります。）

```
array([[False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],
       ...,
       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False]])
```

今回欲しいデータは、対象領域の輪郭のポリゴンなので以下のように輪郭を求めます。

```
contours = measure.find_contours(np.array(result[1][i][j]), 0.5)
```

 i:対象のラベル
 j:予測により抽出された領域の順番

  
#　最後に

日本語の資料が少ないので少し苦労しましたが、MMdetectionでの物体検知については基本的な使い方がわかってきました。

実際に利用しているデータは公開できないので、具体例を出していない分わかりにくいと思いますがご容赦ください。

今後はセグメンテーションなどのタスクを実施していきたいですね。

また、画像処理系が多くなってきたので自然言語処理や音声タスクなども取り組んでいきたいと思います。
each_with_indexとeach.with_index(数字)で繰り返し処理

## 0. はじめに

rubyには、「繰り返し処理」というものが存在します。具体的なメソッドで言うと、eachやtimes, whileなどです。

この記事では、私がこれまでによく利用していたeachメソッドの、少し応用系である2つのメソッドを記していきます。あと追加で、私が開発中に作って没になった「好きな場所で繰り返しを止める」メソッドを紹介します。また、具体例では以下の配列を扱います。

```ruby
array = ["一郎", "二郎", "三郎"]
```

## 1. each_with_index

【Ruby each_with_indexの書き方】

```ruby
配列名.each_with_index do |item, i|
	# 処理
end

array.each_with_index do |item, i|
	puts "#{item}は#{i}番目です"
end
=>
一郎は0番目です
二郎は1番目です
三郎は2番目です
```

`each_with_index`は、配列の要素地震が何番目なのか、そしてその番号(index)も処理で同時に扱うことができるメソッドです。indexを扱うことができる繰り返し処理で、処理内で一意性を与えたい時に特に用いていました。

しかし、配列のindexは0から始まります。数え初めが1である人間にとっては、少し馴染みにくい印象があります。そこで便利なのが、次の`each.with_index(数字)`メソッドです。

## 2. each.with_index(数字)

【Ruby each.with_indexの書き方】

```ruby
配列名.each.with_index(開始させたい値) do |item, i|
	# 処理
end

array.each_with_index(1) do |item, i|
	puts "#{item}は#{i}番目です"
end
=>
一郎は1番目です
二郎は2番目です
三郎は3番目です
```

`each.with_index(数字)`では、始まりの数字を指定できます。(上記例では始まりが"1")

このメソッドは自由度があり、意味もいくらか伝わりやすい気もします。使い分けが重要ですね。

## 3. 好きな場所で繰り返しを止める

具体例から示します。

例えば、5つの要素を持つ配列が存在するとします。この配列を2回繰り返し、3回目は要素の2つ目で繰り返しを止めたい、といった場合に使います(笑)。以下は例です。

配列：①②③④⑤

```
①②③④⑤ | ①②③④⑤ | ①②
                         ↑ココマデ！
```

この場面で用いるのが、2個の`times`メソッドと、繰返しを中断させる`break`です。

```ruby
3.times do |i|
  5.times do |ii|
    puts "#{ii}"
    break if i==2 && ii==1
  end  
end 

# 実際の結果
3.times do |i|
  5.times do |ii|
    puts "#{ii}"
    break if i==2 && ii==1
  end  
end
=>
0
1
2
3
4
0
1
2
3
4
0
1
```

timesメソッドは、指定回数繰り返しを行います。
breakメソッドは、条件分岐により途中で繰返しを中断します。
これらを組み合わせて「好きな場所で繰り返しを止める」メソッドを開発しました。

まぁ、こんなメソッドいつ使うんだよ、って感じですけどね(笑)。

## 4. さいごに

最後までお読みいただきありがとうございました。
今回の記事のようにこれまで学習した内容について、徐々にアウトプットしていきたい。
自分がアウトプットした内容が誰かの役に立てば幸いです。

### 余談ですが...

今回この記事で扱った「繰り返し処理」というのは、プログラミング技術発達の過程で生まれた「構造化プログラミング」から優位的に導入されました。プログラムを遂行する三大ロジックのうちの一つです。
「繰り返し処理」の他には、「順次進行」「条件分岐」があります。

「順次進行」は命令を上から実行するロジック、基本的なロジックですね。
「条件分岐」は何らかの判定を行い、その結果で次の命令を決めるロジック。rubyだとif文とかですね。

命令を実行するロジックという切り口では、「繰り返し処理」は中々重要な立ち位置にあるそうですね。


参考
「オブジェクト指向でなぜつくるのか」/ 平澤 章 / 日経BP社 / 2004年6月初版
webデザイン関連用語のまとめ

これからwebデザイナーになろうとしている人や、またはこれってどういう意味だっけとなってしまった人へデザイン用語や知っておくといい関連用語をまとめれたらと思い作成しました。

#デザイン用語

##レスポンシブデザイン
一つのファイルで様々なデバイス(pcやスマートフォンなど)の画面サイズに合うように作成することをいいます。

##フラットデザイン
シンプルかつ平面なデザインのこと。
スキューモーフィズムの事態から少し経ってあと、数多くの企業が採用しているデザインになります。

##マテリアルデザイン
フラットデザイン2.0とも言われているgoogleが提唱したデザインです。
直訳すると物質的なデザインとなり、すなわち物理的な法則にしたがって作られたデザインということになります。ベースはフラットデザインと同じなのですが、違うのは現実世界と同じように光や影、奥行きや重なりなどを取り入れたデザインのことをいいます。

##グリッドレイアウト
画面やページを格子状に分割して組み合わせるデザイン方式のことです。

##リキッドレイアウト
グリッドレイアウトは横幅を固定するのに対して、このリキッドレイアウトは幅をリキッドというように
液体のように流動的に変化させてどの画面サイズでも適切なレイアウトで見れるようにするデザインのことです。

##ミニマルデザイン
ミニマルは「最小の」という意味、余計な装飾や要素を限りなく少なくしたシンプルなデザインのことです。

##UI(ユーザーインターフェース)
ユーザの視覚にふれる全ての情報がUIに当てはまります。
簡単にいうと見た目の部分にあたります。

##UX(ユーザーエクスペリエンス)
ユーザが製品やサービスを通じて得られる体験のこと。

##ユーザビリティ
特定のユーザが特定の利用状況下で特定された目標を達成するために用いられる際の、有効さ、効率及び利用者の満足度合いのこと

##アクセシビリティ
障がいを持つ人やもしくは誰でも閲覧しやすいような作りのこと


##スキューモーフィズム
以前のiphoneで採用されていたデザイン手法です。
デザインに立体性を持たせ、リアリティのある表現を重視した作りになっています。

##モバイルファースト
cssを書く際にpcのスタイルから書くのではなく、スマホのスタイルから書くことをいいます。
またはスマホでストレスを感じることなく操作できるデザインのこととしても使われます。

##ファーストビュー
ブラウザでwebページを開いたときに表示される領域のことです。

##アイキャッチ
ファーストビューと同じ意味ですが、ファーストビューは全体のことをいうイメージですが、
アイキャッチは画像などに対して使われています。(違っていたらすみません)

##LP(ランディングページ)
バナー広告やリスティング広告などを経由して訪問者が最初にアクセスするページのことをいいます

##トンマナ
トーン＆マナーの略。色味や雰囲気、フォントなどに一貫性を持たせることです。

##ワイヤーフレーム
設計図のようなもので、このワイヤーフレームの段階で骨組みを固めておくとその後の作業がスムーズになります。

##パンくずリスト
サイト内でユーザが今どこにいるのかを分かりやすくするためのリンクのことを言います。
由来は話『ヘンゼルとグレーテル』で、主人公が森で迷子にならないように通り道にパンくずを置いていったというお話からという噂です。

##ドロップダウンメニュー
項目をクリックまたはホバーするとビヨーンと伸びて詳細の項目を表示させることができるメニューのひとつです。

##アコーディオンメニュー
ドロップダウンとほぼ同じですが、こちらの場合は縦に並んだメニューの一つを押した時に、
メニューの感覚が開いて出てくるもとがアコーディオンメニューになります。

##ハンバーガーメニュー
スマホやタブレットでよく見られますが、ハンバーガーのような見た目の３本線のメニューで、
タップするとメニュー項目が表示されます。

##ヒーローヘッダー
写真・動画などを画面いっぱいに使って表示させていく手法のこと。
ユーザにインパクトのある印象を残すことができます。

##パララックス
示唆効果を適用したデザインのこと。
手前と奥とでスクロースする速度に差をつけることによって、奥行きや立体感を表現させることができます。


#コーディング用語
##HTML(エイチティーエムエル)
Hyper Text Markup Languageの略でWebページを作るためのマークアップ言語です。

##CSS(シーエスエス)
Cascading Style Sheetsの略でwebサイトの見た目の装飾を加えるスタイルシート言語の1つです。
スタイルシートとも呼ぶこともあります。

##JavaScriptI(ジャバスクリプト)
HTMLやCSSとは違いwebに動きをつけることができる言語です。
名前は見ていますがJavaとは全く別物の言語です。

##margin(マージン)
余白を枠の外側に作成する

##padding(パディング)
余白を枠の内側の作成する

##width(ウィドゥス、ワイズ)
横幅のこと。
ウィドゥス、ワイズどっちでも通じるが、web業界はウィドゥスの方が多い印象。

##height(ハイト、ヘイト)
縦幅のこと。
ハイト、ヘイトどちらでも通じるが、widthと違いこちらは圧倒的にハイトが多い印象。

#マーケティング用語
##SEO(エスイーオー)
Search Engine Optimizationの略。検索エンジンの最適化のことをいいます。
これをしっかりと行っておくと検索結果が上位に表示されるようになります。

##コンバージョン
webへアクセスするというだけではなく、商品購入、問い合わせ、資料請求、会員登録など、そのWebサイトにおいて獲得できる最終成果のこと。
ufw で特定のサイトからのアクセスをブロック

apache2 のログに次のようなエラーが出ていました。

```text
[Tue Apr 13 04:00:50.206163 2021] [php7:error] [pid 219861] [client 178.33.234.2
05:2193] script '/var/www/html/public_html/wp-login.php' not found or unable to 
stat
[Tue Apr 13 09:32:41.769395 2021] [php7:error] [pid 219879] [client 37.59.221.11
2:44570] script '/var/www/html/public_html/wp-login.php' not found or unable to 
stat
```

Wordpress への侵入を試みているように思えます。
そこで、このクライアントを ufw でブロックすることにしました。

```bash
sudo ufw deny from 178.33.234.205
sudo ufw deny from 37.59.221.112
```

設定の確認方法

```text
$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
Anywhere                   DENY        178.33.234.205            
Anywhere                   DENY        37.59.221.112
```

登録を取り消すには、まず番号付きで状態を表示

```text
$ sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
            
[ 1] Anywhere                   DENY IN     178.33.234.205            
[ 2] Anywhere                   DENY IN     37.59.221.112  
```

そして、番号を指定して削除

```bash
sudo ufw delete 2
```

## 確認したバージョン

```text
$ ufw --version
ufw 0.36.2
Copyright 2008-2023 Canonical Ltd.
```
vue-gtag使用時、GA4にpage_viewが2回計測されてしまう

### はじめに

gtag.jsやga4の動作に詳しくなかったので、備忘録のために残しています。
記載が簡潔すぎることをご容赦ください。

## 前置き

Vue.js（2.x）製のSPAサイトのアクセスを、既存のGA３に加えて、GA4でも計測することになりました。
トラッキング周りはvue-analyticsを使っていましたが、GA4にはgtag.jsが必要だったため、vue-gtagを導入しました。
[vue-gtagのAuto tracking](https://matteo-gabriele.gitbook.io/vue-gtag/auto-tracking)を設定すると、router-linkクリック時にGA4にpage_viewイベントが送信されているのが確認できました。

が、GA4コンソールのdebug viewでよくよく見てみると、同じページでpage_viewが２回送信されているのに気がつきました。

## 結論

![アナリティクス (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176277/f6773c96-84d6-fa44-0360-25912d2530cc.png)
GA4のデータストリームの設定画面から`ブラウザの履歴イベントに基づくページの変更`というチェックを外したら、vue-gtagによるpage_viewのみが送られるようになりました。
※ 2021/04/13時点のUIです。

## 補足等

どこでpage_viewが送られているのかをGoogle Analytics Debuggerで探していると、ページ遷移したタイミングで、`gtm.historyChange-v2`というイベントが送られていることに気が付きました。
その中のパラメータで、page_viewに関するものがあったので、イベント名でググってみると、同じような内容で投稿されたフォーラムを見つけました。

https://support.google.com/tagmanager/thread/51544115?hl=en

この回答に従って、GA4コンソールのデータストリーム設定を見てみると、今回の設定を発見しました。
この設定自体は、SPAじゃないサイトで、ブラウザバックしたときでもpage_viewを送れるようにする的な機能なのかな？

誰かの役に立てば幸いです。
JavaScriptのclassでメソッドをremoveEventListenerしたい

JavaScriptのメソッドと関数って何か違うん？
と思っていたがちゃんと違ったので備忘録

## ハマったこと
class形式である処理を書いていた時に、addEventListenerでメソッドを実行。
removeEventListenerでメソッドを削除しよーと思ったら削除できなかった。

### 詳細
addEventListenerは無名関数は削除できないというのは知っていたので
メソッドにスクロールで行いたい処理をまとめて、イベント付与！
removeEventListenerでもメソッド削除できると思っていたらできなかった

```
HTML
  <button id="btn1">アラート出す</button>
  <button id="btn2">イベント削除</button>
```

```
  class Btn {
    constructor(){
      this.alertBtn = document.getElementById('btn1')
      this.removeBtn = document.getElementById('btn2')

      this.addClickEvent()
    }


    addClickEvent() {
      // ＃btn1を押すとアラートが出る処理を付与
      this.alertBtn.addEventListener('click', this.openAlert)

      // ＃btn２を押すと＃btn1のアラートが出る処理を削除する処理を付与
      this.removeBtn.addEventListener('click', this.removeEvent)
    }

    openAlert() {
      alert('click')
    }

    removeEvent() {
      ＃btn1のアラートが出る処理を削除
      this.alertBtn.removeEventListener('click', this.openAlert)
    }
  }
```

1. ＃btn1を押す
2. アラートでる
3. ＃btn2を押す
4. ＃btn1を押す

４では再度アラートは出ないはずだったが実際は出てる


### 解決
メソッドはremoveEventListenerできないのでbindを使用してメソッドを実行する関数を作成。
その関数をaddEventListenerしたりremoveEventListenerしたりする

```
  class Btn {
    constructor(){
      this.alertBtn = document.getElementById('btn1')
      this.removeBtn = document.getElementById('btn2')

      this.addClickEvent()
    }


    addClickEvent() {
      // removeEventメソッドでも使用できるようにしておく
      this.alertBtnEvent = this.openAlert.bind(this)
      this.removeBtnEvent = this.removeEvent.bind(this)

      this.alertBtn.addEventListener('click',  this.alertBtnEvent)
      this.removeBtn.addEventListener('click',  this.removeBtnEvent)
    }

    openAlert() {
      alert('click')
    }

    removeEvent() {
      this.alertBtn.removeEventListener('click', this.alertBtnEvent)
    }
  }
```


JavaScript難シイね
まんまそのまんまの質問（英語版）
[Javascript removeEventListener not working inside a class](https://stackoverflow.com/questions/33859113/javascript-removeeventlistener-not-working-inside-a-class)

bindってそもそも何？ってところからっだので以下を参考にさせていただきました。
ありがとうございます。

-参考
[jsのbindは意味がわからない](https://qiita.com/__mick/items/4ad701e8d7742fcda7d8)
[【JavaScript入門】bindメソッドの使い方をわかりやすく解説！](https://www.sejuku.net/blog/49161)