OmniAICreator/Qiita-1.07M huggingface dataset:
PCでもSpotifyのスリープタイマーがほしい

# はじめに

寝る前にごろ寝PCにてSpotifyで音楽をかけて寝ています。しかし、朝まで鳴りっぱなしなのが気になり、PCでSpotifyのスリープタイマーがあるか調べてみましたが、iPhoneやAndroidの記事しかなく、PC用を見つけられなかったためSpotify Web APIをPythonで使えるライブラリspotipyを使って作ってみることにしました。

# 環境

```
$ sw_vers                                                                          
ProductName:    macOS
ProductVersion: 11.1
BuildVersion:   20C69
```
- python 3.8.5
- spotipy 2.16.1

# クライアント登録

1. [Spotify for Developer](https://developer.spotify.com/dashboard/applications)にアクセス
2. DASHBOARD
3. CREATE AN APP
4. クライアント名と説明を記入

以上の手順を踏めばクライアントが作成できます。かんたんですね。
Client IDとClient Secretはあとで使用するのでメモしておきましょう。

# ユーザ名取得

1. [Spotipy](https://www.spotify.com/jp/)にアクセス
2. ログインして、プロフィール→アカウント
3. アカウント情報→ユーザ名

ユーザ名も後で使用するのでメモしておきましょう。

# APIを呼ぶ

ここからPythonでプログラムを書いていきます。
まず、Spotify Web APIをPythonで使用するためもライブラリをインストールします。

```
$ pip install spotipy
```

spotipyの[公式リファレンス](https://spotipy.readthedocs.io/en/2.16.1/#)を見ながら書いてみます。
`scope`は[Spotify Web APIのリファレンス](https://developer.spotify.com/documentation/general/guides/scopes/#streaming)を見て使いそうな機能を選択します。

```python
# -*- coding: utf-8 -*-
import spotipy
from spotipy import Spotify, SpotifyOAuth

# Settings
client_id: str = "Client ID"
client_secret: str = "Client Secret"
username: str = "Username"
scope: str = "user-modify-playback-state user-read-currently-playing"
redirect_uri: str = "http://localhost:8080"

auth_manager: SpotifyOAuth = spotipy.SpotifyOAuth(
    client_id=client_id,
    client_secret=client_secret,
    redirect_uri=redirect_uri,
    scope=scope,
    username=username,
)
spotify: Spotify = spotipy.Spotify(auth_manager=auth_manager)

spotify.pause_playback()
```

Spotifyで音楽を再生した状態でプログラムを実行すると、音楽の再生が止まったと思います。

# タイマー機能

上記のプログラムでは実行してすぐに停止してしまうため、タイマー機能を実装します。また、再生していないときに、`pause_playback()`を呼び出すと、エラーが帰ってきてしまうので、一応再生中か`currently_playing()`を呼んで確認します。

タイマー機能はpythonデフォルトライブラリのdatetime.timedeltaを使えばかんたんですね。ついでにコマンドライン引数から入力を受け取れるようにします。

```python
# -*- coding: utf-8 -*-
import sys
from time import sleep
from datetime import datetime, timedelta

import spotipy
from spotipy import Spotify, SpotifyOAuth

client_id: str = "Client ID"
client_secret: str = "Client Secret"
username: str = "Username"
scope: str = "user-modify-playback-state user-read-currently-playing"
redirect_uri: str = "http://localhost:8080"

auth_manager: SpotifyOAuth = spotipy.SpotifyOAuth(
    client_id=client_id,
    client_secret=client_secret,
    redirect_uri=redirect_uri,
    scope=scope,
    username=username,
)
spotify: Spotify = spotipy.Spotify(auth_manager=auth_manager)

start_time: datetime = datetime.now()
stop_time: timedelta = timedelta(seconds=int(sys.argv[1]))

while True:
    elapsed_time: timedelta = datetime.now() - start_time
    if elapsed_time > stop_time:
        break
    sleep(1)

is_playing: bool = response['is_playing'] if (response := spotify.currently_playing()) is not None else False
if is_playing:
    spotify.pause_playback()
```
# まとめ

Spotify Web APIを使用して、スリープタイマー機能ができました。
[github](https://github.com/cashmere53/SpotifySleepTimer)に全体のソースコードを載せています。ご参考までに。

# 参考
[ブログを書くまでが (PythonでSpotify APIから曲をプレイリストに追加する(spotipy))](http://sakanaaas.hateblo.jp/entry/2017/07/02/122740)
【Ubuntu18.04 LTS】画面の解像度が選択できなくなったときの対処法【NVIDIA】

ある日突然 Ubuntu 18.04 LTS が低解像度しか出力しなくなっていたので、対処しました。
全体として20分ほどあれば作業完了すると思います。

症状
-
Ubuntu18.04LTS を起動したところ、あれれ、なんだか画面がおかしい。
どうやら解像度が1024x768になっているみたい。
手動で変更しようにも、他の解像度が選べない。困ったなあ。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/989248/e20d4c0e-b8f9-dcb1-4e8f-64706a991e39.png" width="70%">

動作環境
-
|項目|詳細|
|---|---|
|OS|Ubuntu 18.04.5 LTS (64bit)|
|RAM|15.6GiB|
|CPU|Intel Core i5-10400F CPU @ 2.90GHz × 12|
|GPU|GeForce GTX 1650/PCIe/SSE2|
|GNOME|3.28.2|
|備考|外付けSSD (240GB/USB3.0 経由) からブートして使用|


試したこと
-
###EDIDを再読込させてみる (解決せず)
"Unknown Display" と表示されているので、EDIDが読み込めていないのかな？ と思い、
おもむろにHDMIケーブルを抜き差ししてみた。EDIDを再読込させるにはこれが一番手っ取り早い。
しかし、改善せず。

###NVIDIA Driver の再インストール (解決した)
発生している症状は、NVIDIA謹製のドライバを入れる前に陥った症状と同じ。
でもドライバインストールしたよな...？ と思い、いろいろ確認してみる。

- VGA 接続しているデバイスの情報を確認


```
~$ lspci | grep VGA
01:00.0 VGA compatible controller: NVIDIA Corporation Device 1f0a (rev a1)
```
　NVIDIA Deviceが認識されている。問題なさそう。

<br>

- 解像度情報の確認

```
~$ xrandr
xrandr: Failed to get size of gamma for output default
Screen 0: minimum 1024 x 768, current 1024 x 768, maximum 1024 x 768
default connected primary 1024x768+0+0 0mm x 0mm
   1024x768      76.00* 
```
　1024x768@76Hzの解像度しか認識されていない。1920x1080@60Hz対応のモニタなんだけどなあ。

<br>

- NVIDIAの設定を確認

```
~$ nvidia-settings 

ERROR: NVIDIA driver is not loaded


ERROR: Unable to load info from any available system
```
　<b>でました。driverが読み込めていないみたい。</b>
　というわけで、NVIDIAのDRIVERを再インストールしてみましょう。


<br>

- Ubuntu におすすめのドライバを聞いてみる

```
~$ ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 ==
modalias : pci:v000010DEd00001F0Asv000010DEsd0000145Cbc03sc00i00
vendor   : NVIDIA Corporation
driver   : nvidia-driver-450-server - distro non-free
driver   : nvidia-driver-450 - distro non-free
driver   : nvidia-driver-455 - distro non-free recommended
driver   : xserver-xorg-video-nouveau - distro free builtin
```

　```ubuntu-drivers devices``` で、Ubuntu がおすすめのドライバを教えてくれます。
　ちゃんとNVIDIA謹製のドライバを提案してくれていますね。早速導入しましょう。

<br>

- Ubuntu おすすめのドライバをインストール

```
~$ sudo ubuntu-drivers autoinstall
```

　導入するコマンドは、これだけです。自動的にインストールが始まるので、終わるのを待ちましょう。

<br>

- 再起動

```
~$ reboot
```

　インストールが終わったら再起動しましょう。うまくいくといいなあ。

結果
-
ちゃんと最大解像度 (1920x1080@60Hz) で表示できた。やったぜ！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/989248/e20d8df4-e1c0-c49d-21c4-3e00f900d224.png" width="70%">

4Kモニターほしいなあ...


参考にしたサイト
-
Ubuntu 18.04 Displays Issue -> Unknown Display
https://askubuntu.com/questions/1069451/ubuntu-18-04-displays-issue-unknown-display

Ubuntu18.04にNVIDIAドライバーをインストール
https://qiita.com/kannkyo/items/c506437704cd62b31077
自作キーボード11 ケース完成


# 自作キーボードケース完成
ケースが出来上がったとメールが来た。
メールに写真が添付されており、完成品はこれで良いか？の確認があったうえで発送するとのこと。

色について事前に未確認だった自分が悪いのだが想像とは違ったが、出来上がりは予想以上に良い。

元々塗装しようと思ってたのでOK。初めての設計図で3Dプリンタで実際に形になると、感無量だ。
穴の位置があってればよいのだが、、

## 左手表
![151102-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135714/2782ffd1-5183-090e-b0ad-5ace5cb54483.jpeg)

## 右手表
![151102-4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135714/d5b1eddb-4cfe-11b4-096e-cc888dea66f6.jpeg)

## 右手裏
![151102-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135714/cdb808d3-757b-e716-b109-31939e8f145d.jpeg)

## 右手裏
![151102-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135714/6900d07a-c3f3-f2e0-228d-fb253dd2dd25.jpeg)

早く届かないかなと楽しみである。注文後、6日で発送となった。
到着までどれぐらいかかるかな？


# 返金あり
PCB基盤作成時の2重払い問題が解決した。
1週前に返金すると返事があったのだが、一向に返金処理が行われた様子がないため、以下のメールを送ってみたところ
お詫びのメールと、速攻Paypalへの返金があった。多分忘れていたのだろう。

```
Not refunded yet.
When and how will I get a refund?
```
SCCM配布ポイント内の孤立パッケージの削除

配布ポイント内の孤立したパッケージが、クライアントに配布され続ける事象が発生した。
孤立したパッケージはConfiguration Managerのコンソール上から操作が一切できないため、SCCMの管理ツールを利用して対処する方法を記載する。

##環境
* ConfigurationManager 2010

##パッケージの確認
サイトサーバ上で下記フォルダ内の「ContentsLibraryExplorer.exe」をダブルクリックで実行する。
`C:\Program Files\Microsoft Configuration Manager\tools\servertools`

入力画面が求められるので、対象の配布ポイントをFQDNで入力すると、
配布ポイントに登録されているパッケージと、孤立したパッケージが表示される。
※孤立したパッケージは、下記のようにパッケージ名の右側に(*)が付与されている。
![library.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235333/041ccc57-2b2e-4b41-d9b7-55da468dabff.png)

参考：[コンテンツライブラリエクスプローラー(Microsoft-Docs)](https://docs.microsoft.com/ja-jp/troubleshoot/mem/configmgr/content-library)

##孤立したパッケージの削除
[コンテンツライブラリのクリーンアップツール](https://docs.microsoft.com/ja-jp/mem/configmgr/core/plan-design/hierarchy/content-library-cleanup-tool)を利用して、サイトサーバのコマンドプロンプトにて下記コマンドを実行

```linux-config
# ContentLibraryCleanup.exe /dp [配布ポイントのFQDN] /delete
```
上記コマンドを実行しても、すぐにパッケージが削除されるわけではなく、削除対象のパッケージ(孤立したパッケージ)の確認が随時求められるため、[y]を入力してEnterを実行していく。

参考：[ContentLibraryCleanup.exeに関しまして(TechNet)](https://social.technet.microsoft.com/Forums/office/ja-JP/d50975b2-2a67-41d7-a624-1df478d09a0d/contentlibrarycleanupexe?forum=systemcenterja)

##パッケージの再確認
「ContentsLibraryExplorer.exe」を再度開きなおすと、孤立したパッケージが表示されなくなっている。

## 参考

[展開パッケージから個別でコンテンツを削除した時の配布ポイントの挙動](http://blog.livedoor.jp/sccmsota/archives/20302325.html)
※今回の内容とはずれますが、非常に参考にさせて頂きました。
初心者必見！サイト制作は楽してなんぼ。CSSフレームワークBuefyの紹介！！

皆さんこんにちは！

サイト制作って１から作ると大変ですよね。

今は、便利な世の中になっていて、ネットで検索すればテンプレートが出てきます。

例えば、BootstrapやVuetifyなどその他もろもろあると思います。

ただ、僕個人が思っていることは、BootstrapやVuetifyって他の要素にもCSSが適用されるなんて思ったことありませんか？

技術がある人はこれを回避できると思うのですが、僕にはそんな技術がないので何とかならないかなと思っていたところに「Buefy」に出会ったわけです。

Buefyの特徴はとにかく軽い、他の要素に影響をほぼ与えないというのが特徴です。

また、公式のドキュメントは日本語が対応していないものの、ソースコードが分かりやすく、Chormeの翻訳機能を使えばどうってことないです。

これらの特徴から、最近Buefyを愛用しています。

今回は、Buefyの「モーダルウィンドウ」をご紹介したいと思います。

モーダルウィンドウも１から自分で作ると、作れくなくはないものの時間はかかりますよね？

ただ、Buefyを使えばソースコードをコピペするだけで実装することができます！！

びっくりするくらい簡単です！！！

それでは、導入から実装までの順序を一緒に見ていきましょう！

#Buefyのインストール#

```
npm i Buefy
yarn
```

Buefyのインストールを終えたら、main.jsに以下の設定を加えます。

```main.js
import Vue from 'vue'
import Buefy from 'buefy'
import 'buefy/dist/buefy.css'

Vue.use(Buefy)
```

これで、Buefyの下準備は整いました！

あとは公式ドキュメントからソースコードをコピペするだけ！！

#ソースコードコピペ#

こちらの[リンク](https://buefy.org/documentation/modal)から公式ドキュメントにアクセスしてください。

先ほども述べたように、今回は「モーダルウィンドウ」を使います。

どれでもいいので、コードをコピペします。

```App.vue
<template>
    <section>
        <div class="buttons">
            <button class="button is-primary is-medium"
                @click="isImageModalActive = true">
                Launch image modal
            </button>
        </div>
        <b-modal v-model="isImageModalActive">
            <!-- 表示したいコンポーネント -->
        </b-modal>
    </section>
</template>

<script>
    export default {
        data() {
            return {
                isImageModalActive: false
            }
        }
    }
</script>
```

これで、モーダルウィンドウを実施することができます！

これだけです！めちゃめちゃ簡単！！

サイト制作って表面的な部分に時間をかけてしまうと、バックエンドの方に時間が割けなくなってくるので、どれだけ効率よく表面的な部分を完成させることができるかがカギとなってきます。

なので、ぜひBuefyを使って効率よくサイト制作を行ってください！

以上、「初心者必見！サイト制作は楽してなんぼ。CSSフレームワークBuefyの紹介！！」でした！

良ければ、LGTM、コメントお願いします。

また、何か間違っていることがあればご指摘頂けると幸いです。

他にも初心者さん向けに記事を投稿しているので、時間があれば他の記事も見て下さい！！

Thank you for reading
Attention Is All You Need の 『Attention』を１時間である程度理解する手段

#概要

**Attention Is All You Need の 『Attention』を１時間である程度理解する手段**

を考えたので記事にする。

本来は、

**Attention Is All You Need の 『Attention』を１時間で理解する手段**

のつもりであったが、実践した結果、「ある程度」を追加した。

注意：深層学習の基礎知識があることが前提。

#手段

簡単です。

**以下の15分程度のYouTubue　を、3回みる。**

Deep Learning入門：Attention（注意）
[Neural Network Console のYoutube]

https://www.youtube.com/watch?v=g5DSLeJozdw

（ワタシは、Sonyさんとは、全く何の関係もありません。）

映像の例１：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/7844b59f-c9ce-afd6-58d7-b7f2d37ea87b.png)

映像の例２：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/51ed8950-e49d-bb5b-50c3-6a64caf45963.png)


#まとめ
すごくわかりやすい動画（相当、レベルが高い）のため、記事にした。
しかし、更に、理解を深めるためには、別途、勉強する必要あり。

余談：

* 歩きながらスマホで音声だけ聞いたときに、ある程度、理解できたので、
映像も見れば楽勝かと思ったが、映像をみると、むしろ、わからない部分が明確に認識させられただけ？だった。
* 2Hrで5回みることを提案しようとも思ったが、ちょっと、別途、その人がわからない部分を勉強しなと何度見ても限界があると思ったので、3回にした。

以下のワタシの記事も多少助けになるかも。

[自己注意Self-Attention の解説でわかりやすいと思った記事N選　(まだ、N＝5）](https://qiita.com/enoughspacefor/items/c9810d1065741a7f461c)
PHP artisanコマンドを適当に

Laravel サーバが起動
$php artisan serve --host=$IP --port=$PORT

キャッシュクリアコマンド
$php artisan cache:clear

コマンドのリストを表示
$php artisan list

tinker起動
$php artisan tinker

Laravelのバージョン確認
$ php artisan --version

$ php artisan -v

make
$php artisan make:作りたい種類 ファイル名 --オプション

作成したマイグレーションを実行してテーブルを新規作成
$php artisan migrate

1つ前のマイグレーション操作に戻します
$php artisan migrate:rollback

メンテナンスモードの実行
$php artisan down

メンテナンスモード ⇒ 通常モード
$php artisan up
AWS ストレージ関連サービスについて

AWS Summitの公演を聞いて、再度まとめてみたものです。

# 分類

- ブロックストレージ(EBS)

ある一定の容量で区切られた記憶領域

- ファイルストレージ(EFS)

ファイルストレージをファイル装置に搭載しているもの
ブロックストレージの上にファイルストレージが乗っている

- オブジェクトストレージ(s3)

ファイルに対してkeyを発行して1対1で管理を行う

# サービス

## Amazon Elastic Bloc Store(EBS)

EC2と合わせて使用するブロックストレージ
EBSには以下の2つのストレージがある

### インスタンスストア

ホストの内蔵デバイスを使用する
EC2インスタンスは起動ごとにホストが変わるので、終了・起動を行うとデータは消えてしまう
内蔵デバイスなので、レイテンシーが優れている
一時的にデータを確保することに優れています

![インスタンスストアUntitled Diagram.drawio - diagrams.net - Google Ch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/9ad29873-e2b0-1734-ae60-c0ced016bc6e.png)


### EBS

物理筐体が分かれていて、ネットワークでアタッチ・デタッチができる
ホストに依存しないので終了・起動を行ってもデータは消えない
ネットワーク経由でのデータのやり取りなので、インスタンスストアよりはレイテンシーが優れていない

![EBSUntitled Diagram.drawio - diagrams.net - Google Ch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/5be73f3e-bf9a-965a-bc6b-2add7df71a72.png)


#### EBSの選択肢

- SSD
	- 汎用SSD : 標準的によく使われれる
	- プロビジョンドIOPS SSD : 高頻度でアクセスされる場合
- HDD
	- スループット最適化 HDD : ストリーミングやログ処理で使われる
	- Cold HDD : アーカイブなど低頻度のアクセスの場合


## Amazon Simple Storage Service(s3)

格納容量無制限の安価なストレージサービス
また、リージョン内で複数箇所に自動で保存するので耐久性も高い
s3のオブジェクト(データ)はバケット内でフラットに格納される
コンソール画面の表示上はパス指定ができ、ディレクトリ構造にも見えるようになっている

### ライフサイクルルール

使用頻度によって低価格なストレージクラスに格納させることが出来ます
さらに、Glacierというサービスと組み合わせてアーカイブ用のストレージクラスに格納することで費用を抑えることが出来ます

![ストレージクラスUntitled Diagram.drawio - diagrams.net - Google Ch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/bfb3b7e0-76ee-aabe-0329-d7fcc254930e.png)


Glacierは実体はs3とは別サービスでアーカイブ用のストレージサービス。
なのでGlacierに格納された後、復元する際は一時的にGlacierからs3にデータがコピーされデータを取り出すことができる
復元にかかる時間も選択できる

- Expedited : 緊急のデータの取得が必要な場合・少量のファイル
- Standard : 3-5時間程度でデータを取得できる
- Bulk : 5-12時間でデータを取得できる・大量データ

## Amazon Elastic File System (EFS)

EC2インスタンスと組み合わせて使用する、NFS(Network File System)ファイルストレージサービスです

マルチAZに対応していたり、容量を自動で拡張出来たりなど使用用途が多くあります

![EFSUntitled Diagram.drawio - diagrams.net - Google Ch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/121c1a22-1be9-d1ee-280b-d12beae325fe.png)


# 参考

- [S3のストレージタイプ(標準, 低頻度,1ゾーン低頻度)を使い分けてストレージコストを最小化する](https://qiita.com/s-katsumata/items/927e57834ca5256c4eee)
- [AWS のストレージサービス入門](https://d1.awsstatic.com/events/jp/2017/summit/slide/D2T3-3.pdf)
- [【AWS Tech 再演】AWS のストレージサービス入門｜AWS Summit Tokyo 2017](https://www.youtube.com/watch?v=TBjd2z62vCY&feature=youtu.be)
プロキシ　意味

プロキシ　高速なアクセスや安全な通信など確保するための中継サーバー

プロキシの仕組み
1．内部クライアントからリクエストを送る。

2．プロキシサーバーが中継して目的にサイトにリクエストを出す。

3．プロキシサーバーがクライアントに返事を返す。

4．サイトが閲覧出来る。
herokuデプロイ後sequelizeでPostgreSQLに接続できないときの解決法

sequelizeを使ってPostgreSQLと接続したい。

ローカル環境では接続に成功していたが、herokuにデプロイした後は失敗する。

## 失敗

```JavaScript
const Sequelize = require('sequelize');

// herokuまたはローカル環境のPostgreSQLに接続する
const sequelize = new Sequelize(process.env.DATABASE_URL || 'postgres://postgres:postgres@localhost/hogehoge');
```

## 成功

```JavaScript
const Sequelize = require('sequelize');

const sequelize = new Sequelize(
  process.env.DATABASE_URL || 'postgres://postgres:postgres@localhost/hogehoge', 
  {dialectOptions: { ssl: true }}
);
```

ログを見ると`ssl off`(うろ覚え)とあったので、このようにオプションを追加してみると接続に成功した。
CentOS8のNginxをLet's EncryptでSSL対応させる

## snapインストール
```
dnf -y install epel-release
dnf --enablerepo=epel -y install snapd
ln -s /var/lib/snapd/snap /snap
echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' > /etc/profile.d/snap.sh
systemctl enable --now snapd.service snapd.socket
```

## certbotインストール

```
snap install certbot --classic
ln -s /snap/bin/certbot /usr/bin/certbot
```

## nginx設定
```nginx.conf
    server {
        listen       80;
        server_name  nextcloud.vamdemicsystem.net;
        root         /usr/share/nginx/html;

        location / {
        }
    }
```

## 証明書取得
```
certbot certonly --webroot -w /usr/share/nginx/html/ -d nextcloud.vamdemicsystem.net
```

`/etc/letsencrypt/live/nextcloud.vamdemicsystem.net/`に保存されている

## Nginx設定例
```
    # NextCloud
    server {
        listen       443 ssl http2 default_server;
        listen       [::]:443 ssl http2 default_server;
        server_name  nextcloud.vamdemic.net;
        root         /usr/share/nginx/html;

        ssl_certificate     "/etc/nginx/cert/nextcloud.vamdemic.net/fullchain.pem";
        ssl_certificate_key "/etc/nginx/cert/nextcloud.vamdemic.net/privkey.pem";
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_ciphers PROFILE=SYSTEM;
        ssl_prefer_server_ciphers on;

        location / {
            proxy_pass http://192.168.99.5;
            proxy_set_header X-Forwarded-Proto    $scheme;
            proxy_set_header HOST                 $host;
            proxy_set_header X-Real-IP            $remote_addr;
            proxy_set_header X-Forwarded-Host     $host;
            proxy_set_header X-Forwarded-Server   $host;
            proxy_set_header X-Forwarded-For      $proxy_add_x_forwarded_for;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
```
【GitHub】 基本的なコマンド

プログラミングの学習をしていると、自身のデータを保存したり、複数人で一つのものを作成するなどGitHubは欠かせないものです。
私自身もGitHubはまだまだ使いこなせていないことが多いので、あくまでも自身のメモ用として記録しております。


GitHubよく使うコマンド集①
-
最近私自身がよく使用しているコマンドです。
必要に応じて追記やコマンド集②を投稿することがあるかと思います。

git init
-
ローカルリポジトリとリモートリポジトリ (GitHub等)を紐づける際です。
自分が利用しているディレクトのターミナル上でこのコマンドを入力することで、ローカルリポジトリが作成されます。
ローカルリポジトリとは、commitの履歴データを保管する場所です。

git add
-
ワークツリー(自分の作業場)からステージに変更を追加するためのコマンドです。
コミットするための準備をしている。
 　⚪︎オプション
　　・git add <ファイル名> ⇨ 特定のファイルのみの変更を追加できます。
　　・git add .  ⇨カレントディレクトリ以下の、変更があったすべてのファイルが追加されます。

git commit -m "(変更内容を記述)"
-
git addによりワークツリーからステージに追加された変更内容をローカルリポジトリに記録するコマンドです。
変更内容は誰が見ても分かりやすい内容が好ましいです。
例）git commit -m "変更"
　　⇨これだけだと何のための変更か分かりません
　git commit -m "⚪︎⚪︎モデルにいいねの機能を追加"
　　⇨誰が見ても分かりやすい内容です。

git remote add origin (ローカルリポジトリのURL)
-
URL先をローカルリポジトリとして登録するコマンドです。
メインのリモートリポジトリに対して、originという名前をつけています。

git push origin master
-
git add、git commitをしてきたファイル等をリモートリポジトリへ送信するコマンドです。
この操作のことを一般的に「push(プッシュ)する」と言います。
masterというのは、デフォルト設定されているもので、新しくブランチを作成した際にはそのブランチ名に変わる仕組みになっています。

ls
-
ディレクトリの内容を表示する。
　⚪︎オプション
　　・ls -a
　　　　lsのみでは表示されない隠れフォルダも表示される。

git log
-
変更履歴を確認できる。
　⚪︎オプション
　　・git log --oneline
　　　　変更履歴を1行で表示する。
　　・git log -n
　　　　表示するコミットの後を制限できる。
　　　　-nの後に数字をつけることで、最新からその数字の分だけ変更履歴を表示する。

git status
-
変更されたファイルを確認できるコマンド
・ワークツリー（自分の作業場）でこのコマンドを押すと、前回ステージに追加してから変更したワークツリーのファイルの内容が表示されます。
・ステージ（git addまでした状態）でこのコマンドを押すと、前回コミットしてからステージに追加されたファイルの内容が表示されます。

git deff
-
変更差分を確認するコマンドです。

終わり
---

今回は以上になります。
こちらの記事の内容は、主にUdemyの「もう怖くないGit」の内容や、独自でインターネットから調べた情報を参考に投稿させていただいております。
私自身もプログラミング初心者ですが、同じ様な立場の方に少しでも参考になれば幸いです。
また、もし内容に誤りなどがございましたら、ご指摘いただけますと幸いです。
[Unity] UniRx の Object Pool を使わないで Object Pool してみる

# 序

某所で ObjectPool の話題が出ていたが、大体GameObjectでのpoolになっているが、
**クラス指定できないと毎度GetComponent する羽目になる。**
↓
**イケてない**

**UniRx の Object Pool 使えばよくね**
↓
**プール用クラス書くのめんどくさくね**

という事で書いてみた。

# 要件
- ObjectPool
- 型指定できる
- 一応、UniRx使わない方向で(UniRx.tools のプール使えばいいので)

# 本体
コピペでOK

```C#:SimpleObjectPool.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SimpleObjectPool<T> where T : MonoBehaviour
{
    // Public Static
    public static SimpleObjectPool<T> Instance;

    // Private 
    T prefabBase;
    int ObjectCnt = 0;
    Transform poolBehaviour;
    Queue<T> pool = new Queue<T>();

    int createCount = 0;
    public SimpleObjectPool(T prefab, int objectCount = 100)
    {
        Instance = this;

        prefabBase = prefab;
        ObjectCnt = objectCount;

        var go = new GameObject("SimpleObjectPool");
        GameObject.DontDestroyOnLoad(go);
        poolBehaviour = go.transform;
    }

    public T Rent()
    {
        if (pool.Count == 0)
        {
            CreateNewObject();
        }
        var obj = pool.Dequeue();
        obj.gameObject.SetActive(true);
        return obj;
    }

    public void Return(T obj)
    {
        obj.gameObject.SetActive(false);
        pool.Enqueue(obj);
    }

    public void Update()
    {
        if (createCount < Instance.ObjectCnt)
        {
            CreateNewObject();
        }
    }

    void CreateNewObject()
    {
        var newObj = GameObject.Instantiate(Instance.prefabBase) as T;
        newObj.transform.SetParent(Instance.poolBehaviour);
        newObj.name = newObj.name + $"{createCount}";
        newObj.gameObject.SetActive(false);

        Instance.pool.Enqueue(newObj);
        createCount++;
    }
}
```

## 使い方
### Inspector
シーンの最初からあるGameObjectとかに、
エディタ上からプールに指定したいプレハブなどを設定しておく

```C#:
    public DummyEnemy enemyPrefab = default;
```

### 初期化
SimpleObjectPool クラスを型指定で新規作成。
以降は、シングルトンなので、SimpleObjectPool<DummyEnemy>.Instance でどこからでもアクセスできる。

```C#:
    void Start()
    {
        var pool = new SimpleObjectPool<DummyEnemy>(enemyPrefab);
    }
```

### オブジェクト生成
一度にまとめて作成してもいいが、フレームごとに1つづつ作ったほうがお行儀が良いので。

```C#
    void Update()
    {
        SimpleObjectPool<DummyEnemy>.Instance.Update();
    }
```

### 借りて、返す

```C#:
        // 借りる
        var obj = SimpleObjectPool<DummyEnemy>.Instance.Rent();
        // 返す
        SimpleObjectPool<DummyEnemy>.Instance.Return(obj);
```

### 実際どうなの？

車輪の再開発とはまさにこのこと。多分自分用。
Updateの部分を observable にすれば、初期化だけで綺麗にUpdateできるね！

それだと最初からUniRxツール使えよという話。
ゴミですね。
供養（-人-）ﾁｰﾝ
Go言語-繰り返し処理

# 繰り返し処理
プログラミング基本からGoの理解を文字におこして行こうと思います！

### 繰り返し処理
```go
for i := 1; i <= 4; i ++ {  //変数の初期化;繰り返しの条件;変数の更新
  fmt.Println("Hello")
}

//コンソール
Hello
Hello
Hello
Hello
```
変数iに1が代入され、「iが4以下」を満たす間{}内の処理が繰り返され
終わるたびに変数の更新「i++」が実行

### 処理の流れ
```
//繰り返し処理の流れ
❶変数の初期化
❷条件
❸繰り返す処理
❹変数の更新
❷...
```

```go
for i := 1; i <= 5; i ++ {  //❶i:=1;❷i<=5;❹i++
  fmt.Println(i)            //❸fmt.Println(i)
}

//コンソール
1
2
3
4
5
```
繰り返しの1周目は変数iは1
forの{}の中の処理（③）が終わるたびに、変数iが更新（④）され1,2,3,4,5と変化
そしてi <= 5（②）が成立しなくなると自動的に繰り返しが終了

### 複数の処理を繰り返す
```go
func main() {
  for i := 1; i <=3; i ++ {
    fmt.Println("Hello")
    fmt.Println(i)
  }
}

//コンソール
Hello
1
Hello
2
Hello
3
```
forの{}の中に複数の処理を書くとそれを書いた順に繰り返してくれる

### for文の変数定義の注意点
```go
for var i int =1; i <= 4; i ++ {  //varを用いた変数定義
  fmt.Println("Hello")
}

//コンソール
varによる変数定義はfor文では行えないとエラー
```
for文の変数定義では、varを使うことは出来ず
:=を用いた変数定義しか出来ない

### 繰り返し処理を用いて、1から100の数字を出力

```go
package main

import "fmt"

func main() {
    for i := 1; i <= 100; i ++ {
        fmt.Println(i)
    }
}
```
PHP基礎　-文字列の出力-

#はじめに
これまでRubyを使ってきましたが、web系で使われる言語を幅広く扱えるようにするため、PHPも基礎から学習していきます。Rubyと似ている部分もありますが、細かい文法の違いや独自の概念が多いので、学習内容を記事にまとめていきます。

#文字列の出力


```php
#文字列を出力バッファに書き出す
echo "foo";

#返り値として1を持つ
print("bar");

#フォーマット（書式）を整えて出力
printf(%s, "foobar");
```

echo、printは基本的にどちらを使っても文字列を出力できますが、printは返り値として1を持つ**式**、echoは文字列を出力バッファに書き出すだけの**文**という違いがあります。

printfは上記2つとは異なり、PHPの**組み込み関数**で、指定したフォーマットに合わせて出力します。使いこなせれば便利ですが、その分仕様を意識して活用しないとエラーや予期しない動作の原因となりやすいです。
Mac で docker-compose up した時にポートエラーになった際の対処法

## これは何？
docker-compose up でコンテナを立ち上げようとした際に以下エラーが出たのでその対処法を記載している。

```terminal
Starting lb ... error
ERROR: for lb  Cannot start service lb: Ports are not available: listen tcp 0.0.0.0:80: bind: address already in use
```

## 原因と対処法
文字通り他のアプリケーションがポート 80番を使用しているため使えないという内容。
なので、ポートを使用しているプロセスを探す。

```terminal
$ sudo lsof -i -P | grep ":80"
```
httpd が 80番ポートを使っていることがわかった。

```terminal
httpd      103            root    4u  IPv6 0xb54e8c868de16e45      0t0    TCP *:80 (LISTEN)
httpd     1221            _www    4u  IPv6 0xb54e8c868de16e45      0t0    TCP *:80 (LISTEN)
com.docke 2202 ishiharanaohiro   83u  IPv6 0xb54e8c868494ae45      0t0    TCP *:8025 (LISTEN)
```

httpd の PID（103、1221） を削除する。

```terminal
$ kill -l 103
$ kill -l 1221
```

`docker-compose up -d` で無事起動。めでたしめでたし！

```terminal
Starting lb ... done
```
Vue+Vue router+AxiosによるAPIエラーハンドリングとページ遷移の実装パターン

## この記事について

- Vueコンポーネント内やVuexのAction内などあちこちでAxiosによるAPIリクエストをしていると、エラーハンドリングを個別に記述しなければならなくなり、DRYではなくなってしまう
- APIリクエストでエラーが発生した場合に特定のページに遷移させたいのに、Vueインスタンスの外からは$router.push()が呼べない

この記事では、上記のよくある問題をなるべくDRYかつシンプルに解決した方法を述べます。

## 検証環境

- Vue2系（Options API、でもcomposition APIでも動くと思う)
- Vuex（今回の実装には関係ないけれど、Vuexを組み合わせる事も出来る）
- Vue Router
- JavaScript

## APIリクエストを1箇所で管理する

参考：https://kntmr.hatenablog.com/entry/2018/02/28/200112

各所でAxiosをそのまま用いて非同期通信をすると、それぞれでエラーをcatchしなければなりません。それは辛いので、別にモジュールを用意してAxiosをラップした関数を定義し、その中でエラーハンドリングを行います。基本的に参考サイトのままですが、関数の部分だけ、get, postなどメソッドで分けずに、configで指定するようにしています。

```javascript:/src/api/index.js

import axios from 'axios'

const debug = process.env.NODE_ENV !== 'production'

const onSuccess = (resp) => {
  if (debug) {
    console.log(' << ' + JSON.stringify(resp.data))
  }
  return Promise.resolve(resp.data)
}
const onError = () => {
  throw new Error('API error.')
}

// リクエストメソッド問わず同じ関数を用いる
const api = (config) => {
    if (debug) {
        console.log(`${config.method} ${config.url} >> ${config.params}`);
    }
    return axios(config)
        .then(onSuccess)
        .catch(onError);
};

export default api;
```

コンポーネントやVuexでaxios()を使っていた箇所をapi()に置き換えることで、エラーハンドリングの記述が1箇所・1回で済みます、イッツDRY。

## エラー時にVue Routerでページ遷移

上記まででエラーハンドリングは1箇所で管理することが出来ました。

さてその際、APIアクセスが失敗した時に、Vue Routerの特定にページに遷移させたい時があります。なので、上記の``/src/api/index.js``の``onError()``で、$router.push()したい訳です。

ですがコンポーネントの外（＝Vueインスタンスの外）から$router.push()は使うことが出来ません。なのでちょっと工夫します。

### Vueインスタンスのexport

Vueプロジェクトのエントリーポイントである``/src/main.js``は、Vue CLIでプロジェクトを生成した際は下記のようにVueインスタンスを生成・HTMLを描画しています。

```javascript:/src/main.js

// 略

new Vue({
  render: h => h(App),
}).$mount('#app')
```

ここで、<b>Vueインスタンスをエクスポートします。</b>

```javascript:/src/main.js

// 略

const vm = new Vue({
  render: h => h(App),
}).$mount('#app')

export default vm;
```

ここでexportしている``vm``は、<b>Vueインスタンスのシングルトン</b>です。どこでimportしても常に同一のインスタンスを参照します。

参考：https://qiita.com/NeGI1009/items/f8b17d856a4b15b1ecbc

なので``/src/main.js``をimportすればどこからでもVueインスタンスにアクセス出来る訳です。

> とはいえ、様々な場所で無秩序にVueインスタンスを操作するのは避けるべきと考えます。

### apiモジュールでVueインスタンスにアクセス

```/src/api/index.js

import axios from 'axios'

// Vueインスタンス
import vm from '../main';

//略

const onError = () => {
  //エラー時にルートへ遷移
  vm.$router.push('/')
  throw new Error('API error.')
}

//略
```

> この時、Vuex APIにもRouterと同様、vm.$storeでアクセス出来ます。つまりVuexに保存した変数を取得出来るし(getter)、setterやactionを発火させる事も出来ます。

以上でAPIリクエスト時のエラーハンドリングの集中管理およびエラー時のページ遷移が実現しました。あちこちに散逸しがちなエラーハンドリングに対する悪くない実装パターンではないでしょうか。
Daigo　時間を操る超集中力　まとめ

読書のアウトプットをしていきます。
これはまあそうでしょ、とか自分でも定着している知識などは省いていて、簡潔にまとめます。

#まず一番大事なのは「睡眠」
これに関しては自分はよく知っているのでとくにアウトプットすることはない

###スマホは通知をオフにして引き出しの中にしまうか、別の部屋に置く
スマホは誘惑の宝石箱なので、触るのもNG。
机に置いといて通知がくるだけでも集中力を持っていかれる、そういうメカニズムらしい。
あと休憩中も触ってはいけない、これも脳はエネルギーを使っているから。

###ウルトラディアンリズムで集中力をあげる
９０分作業をして２０分の休憩をサイクルにする。
なにかの実験結果で、このサイクルが一番パフォーマンスを高めてくれるそう。
スポーツ選手とか音楽家とかもこれで練習してるという。

###ポモドーロテクニックで集中力を高める練習をする
２５分の集中作業と５分の休憩をサイクルにして集中力の強化をする。
その際に、ひとつ決めたことだけに集中して他のことを考えないようにする。そして慣れてきたら徐々にウルトラディアンリズムを導入していく。
コツとしては、作業のきりの悪いところでしっかりやめること、そうすることで次のサイクルの時に集中して入りやすい。
休憩のときはスマホいじらない、散歩とかスクワットとか日を浴びるとかする、瞑想がベストらしい。

###集中力を上げるメカニズム（色）
青色が集中力を高めてくれるらしいので、作業周りのものを青色で整える。
ポカリとか置いておくといいんじゃないですかね

###無駄なものを排除する
これはまあ考えればわかることで、気が散るものや誘惑するものとかを排除して部屋を目的に合わせて最適化すること。
ミニマムが理想、極限までいくと机と椅子しかない部屋とか最高。

###机の上、もしくは正面に鏡を置く
集中してなかったときのまぬけな顔を自分に見せる為に効果があるとのこと。

###姿勢を伸ばす
これはみんなわかっていてもなかなか習慣にするのが難しいかもしれない、長時間の椅子での作業は無意識に体が曲がっていくので体の血の巡りが悪くなり循環している酸素が脳味噌に届きにくくなって眠くなるというもの。
→１５分に一回立ち上がって体制を立て直す

###食事
脳が意思決定をするときにはブドウ糖が必要、なので意識して摂取すべき。おすすめは低GI食品。
→そば、玄米、ヨーグルト、ナッツ類が良い

###朝の活動が大事、行うべき７つの行動
１、早起きして朝食を取る
２、朝日を浴びながら軽い運動をする
３、モチベーションのあがる話題や詩に触れる
４、毎日一つ、ノートやパソコンなどに日常の幸せの言葉を書く
５、毎日、今日が人生最後の日ならどうする？と自分に問いかける
６、その日の計画を１０分以内にたてる
７、短時間の瞑想を行う
朝食は軽いものを食べること、３に関しては、逆にいうならニュースとかみないことですかね、ネガティブなことしか報道してないし。
瞑想は深呼吸、５分やるのが自分的ベスト。

###集中することを事前に決める、６つのステップ
１、明日やるべきことを６つ、紙に書いてメモする
２、重要だと思う順番に並べ替える
３、次の日、メモの順番にしたがってタスクを進める
４、全部できなかったとしても、残ったものはスパッと忘れる
５、明日のために６つの項目を新しくメモする
６、１〜５を速やかに、丁寧に、かつ迅速に繰り返す
大事なこととしては、上からやってくタスクを絶対に終わるまでやりとげることらしい。「１は終わってないけど２に行こう」はなしということ。
メモ用紙を大量に買いに行こう。

###1日の動きを仕組み化する
朝はインプットする時間（暗記とか、読書とか）
昼はアウトプットの時間（誰かに話すとか）
夜は復習の時間（記憶に定着させる）
→1日は後半になるにつれて判断力や決断力のメモリがなくなってきているので、だいじなことほど午前中とかに終わらせる。
これがルーティーンとして体に染み付くと、人は成功するらしいですね。頑張ろう。


---
以上になります。
ちょっと長く書きすぎて時間かかってしまったので、
次からはもうちょい短めのを書いていこうかな、どうしようかな。

ありがとうございました。
yukicoder contest 277 参戦記

# yukicoder contest 277 参戦記

## [A 1329 Square Sqsq](https://yukicoder.me/problems/no/1329)

Python だったら考察しなくても正面から踏み抜けるだろうと踏んで流したら、やっぱり通った(笑). Python を相手にするには 10<sup>10<sup>7</sup></sup> くらい必要なようである.

```python
from math import isqrt

N = int(input())

print(len(str(isqrt(N))))
```

## [B 1330 Multiply or Divide](https://yukicoder.me/problems/no/1330)

コンテスト中は AC したものの、コンテスト後の追加テストによるリジャッジで落とされてしまった.

ゴールインするときは A<sub>i</sub> の最大値を使えばいいことはすぐ分かる. それ以外については一番効率の良い A<sub>i</sub> を使えば基本的にいいのだが、ギリギリ滑り込みできるちょっと効率は悪いけど操作回数が少ない A<sub>i</sub> を使ったほうが操作回数が最小になることがあるので Greedy だと誤答になってしまう. 追加されたテストがそのパターンであり、コンテスト中は Greedy でも AC 出来たというわけである.

実装は同じ操作回数でそれよりも増加量が多いものがある A<sub>i</sub> を捨てたり、優先度付きキューを使ってダイクストラ法風に最小値を求めていくようにした. どこまで効果があったかは不明だが、Writer 解の倍速かったようである.

```python
from heapq import heappop, heappush

N, M, P, *A = map(int, open(0).read().split())


def f(x):
    c = 0
    while x % P == 0:
        c += 1
        x //= P
    return (x, c)


max_A = max(A)

if max_A > M:
    print(1)
    exit()

b = {}
for m, c in map(f, A):
    b.setdefault(c, 0)
    b[c] = max(b[c], m)
t = 1
for k in sorted(b):
    if b[k] <= t:
        del b[k]
    else:
        t = b[k]

if len(b) == 0:
    print(-1)
    exit()

q = [(0, 1)]
max_x = {}
max_x[0] = 1
while q:
    c, x = heappop(q)
    if max_x[c] > x:
        continue
    if x * max_A > M:
        print(c + 1)
        break
    for k in b:
        nc = c + 1 + k
        nx = x * b[k]
        max_x.setdefault(nc, 0)
        if nx > max_x[nc]:
            max_x[nc] = nx
            heappush(q, (nc, nx))
```
【🔴エラー対応】「Rails s」でPostgreSQLが実行できなくなった

# ✅エラー状況
当方、自分が所有しているMacにて、RailsでWEBアプリを開発しているのですが、
突如、「Rails s」コマンドでエラーが発生し、Railsが起動できなくなってしまった。

## 🔴エラーメッセージ
```
psql: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
```

> ■日本語訳
psql：サーバーに接続できませんでした：そのようなファイルまたはディレクトリはありません。
サーバーはローカルで実行されており、Unixドメインソケット「/tmp/.s.PGSQL.5432」で接続を受け入れていますか？

## 🔴エラー発生までの経緯
昨日までは、エラーも出ず正常にrailsが起動できた（その後、OSをシャットダウン）が、
翌日、OSを起動したら「Rails s」が使用できなくなった。

## 🔴試してみたこと
* OSの再起動
* PostgreSQLの再起動（「brew services stop/start」コマンドを実施）
* 「Rails c」、「Rails db」コマンドなどのrailsコマンドでも同事象が発生
* Railsコマンドを使わず、PostgreSQLコマンド（psql）でも同事象が発生

## 🔴当方の開発環境

|項目| バージョン or 詳細 |
|:-:|:-:|
| MacOS| Catalina 10.15.6  |
| パッケージ管理システム| Homebrew  |
| PostgreSQL  | 11.9  |
| Ruby  | 2.6.5  |
| Ruby on Rails   | 5.2.4  |

# ✅解決した方法

以下の方法で解決しました

```言語:パッケージ管理システムは「Homebrew」
#PostgreSQLのサービスを停止
brew services stop postgresql

#クラッシュファイルを削除
rm /usr/local/var/postgres/postmaster.pid 

#PostgreSQLのサービスを起動
brew services start postgresql
```

## 🔴そのほかの解決方法
上記の方法で解決しなかった場合は、PostgreSQLの再インストールを実施しました。

```言語:パッケージ管理システムは「Homebrew」
#PostgreSQLのアンインストール
brew uninstall --force postgresql

#PostgreSQLの残ファイルを削除
ll /usr/local/var/postgres
rm -rf /usr/local/var/postgres

#PostgreSQLのインストール
brew install postgresql
```

# ✅原因 
当方の場合、プロセスがクラッシュした際に起因する「postmaster.pid」ファイルが残っていたため、エラーが発生していたようです。
いわゆるゴミファイルが残ってしまっているため、PostgreSQLが起動できなかったようです。
エラー発生の傾向として、OSの起動後にrailsコマンドが使用できなくなったことから、
前回のOSのシャットダウンの時に、OSまたはPostgreSQLがクラッシュし、PostgreSQLが正常に停止できなかった可能性が考えられます。

# ✅参考文献
[PostgreSQLがMacで実行されていない](https://qastack.jp/dba/75214/postgresql-not-running-on-mac)
[PostgreSQLのインストールから起動/停止まで](https://qiita.com/sf213471118/items/0e843af332ea0210c810)
[[MacOS] PostgreSQL の全バージョンをアンインストールする方法 ~ Homebrew 編](https://codenote.net/mac/homebrew/3894.html)
Lenovo ThinkPad T14 Gen1 AMDでUbuntu 20.04をインストールするとスピーカーがダミーになって使えない問題の解決方法

# 環境
PC : Lenovo Thinkpad T14 Gen1 AMD
CPU : AMD Ryzen 7 4750U
RAM : 48GB
OS : Ubuntu 20.04
Kernel : 5.4.0-53-generic

# 解決策
下記を実行して再起動

```
sudo add-apt-repository ppa:hui.wang/pa-testing
sudo apt install libasound2
```

# 参考
https://bugs.launchpad.net/ubuntu/+source/alsa-driver/+bug/1901157/comments/12
https://askubuntu.com/questions/1291047/dummy-audio-on-thinkpad-t14-amd
[基礎] 環境変数

# 環境変数

環境変数のイメージは、「特定の値を格納する箱」
OSが提供するデータ共有機能の1つで、「どのディレクトリ・ファイルからでも参照できる変数」を設けることができます。一般的な用途の1つとして、「外部に漏らしたくない情報を環境変数にセットする」というものがあります。



# 環境変数の表示
・export -p
・printenv
・env

heroku上の場合
・heroku config

#環境変数の設定
・export　環境変数名="値"

heroku上の場合
・heroku config:set 環境変数名="値"

すでに存在する環境変数名に値を代入すると、上書きされます。


#環境変数の削除
・unset 環境変数名
演算「n&(-n)」は以外と使える?

符号なし整数の演算

```C:
 n & (-n)
```

で起きることは

| 入力 | 出力 | 下位の 0 の個数 |
|--:|--:|:-:|
| ????1 | 00001 | 0 |
| ???10 | 00010 | 1 |
| ??100 | 00100 | 2 |
| ?1000 | 01000 | 3 |

"?" の部分を 0 にすることです。

<details><summary>サンプルプログラム - C</summary><div>

```C:
unsigned int func1(unsigned int x)
{
    int b = 0;

    if (x == 0)
        return 0;
    while ((x & 1) == 0)
        b++, x >>= 1;
    return (1 << b);
}

unsigned int func2(unsigned int x)
{
    return (x & (-x));
}

void print_bin(unsigned int x)
{
    int i = 6;
    while (i-- > 0)
        putchar('0' + ((x >> i) & 1));
}

void test()
{
    int x;

    for (x = 0; x < 32; x++)
    {
        print_bin(x);
        putchar(':');
        putchar(' ');
        print_bin(func1(x));
        putchar(' ');
        print_bin(func2(x));
        putchar('\n');
    }
}
```

test() の実行結果

```console
000000: 000000 000000
000001: 000001 000001
000010: 000010 000010
000011: 000001 000001
000100: 000100 000100
000101: 000001 000001
000110: 000010 000010
000111: 000001 000001
001000: 001000 001000
001001: 000001 000001
001010: 000010 000010
001011: 000001 000001
001100: 000100 000100
001101: 000001 000001
001110: 000010 000010
001111: 000001 000001
010000: 010000 010000
010001: 000001 000001
010010: 000010 000010
010011: 000001 000001
010100: 000100 000100
010101: 000001 000001
010110: 000010 000010
010111: 000001 000001
011000: 001000 001000
011001: 000001 000001
011010: 000010 000010
011011: 000001 000001
011100: 000100 000100
011101: 000001 000001
011110: 000010 000010
011111: 000001 000001
```

</div></details>

---

以下の記事で使用しています

- [FFT: ビット列反転インデックス](https://qiita.com/ikiuo/items/b0ea275368b2e326b35d)
- [N==2^n 判定](https://qiita.com/ikiuo/items/ab9e942390fe7a7f9e87)
- [0と1の組み合わせ表現一覧の順番と数値](https://qiita.com/ikiuo/items/570fee269e80dfb8119a)

---

また、あるプロセッサ(BSF/CTZ 相当がないリトルエンディアン)では、strlen を

1. SIMD 命令でバイト列を NULL 文字か否かで 0/1 の列に変換
2. "1" が一カ所以上出てくるまで検索
3. 「 n & (-n) 」の演算で上位ビットをクリア
4. BSR/CLZ 相当で NULL 文字の位置を特定

として高速化することができました。
herokuでデプロイをしたアプリのDBをsequel proで確認する方法

# はじめに
本番環境下(今回はherokuでデプロイ)のDBの内容の確認方法を習得したので、忘れる前にメモとして残します。

# Sequel ProでDB内を確認する方法
1.ターミナルにて、下記を実行
　※()内は確認したいアプリ名を記述

```
heroku config --app (application_name)
```
2.下記の内容が出力されるので確認

```
CLEARDB_DATABASE_URL: mysql://(ユーザー名):（パスワード）@(ホスト)/(データベース名)?reconnect=true
```
3.Sequel Proを開く

4.標準を選択

5.2をSequel Proの項目に当てはめる(下記参照※パスワードも2で確認したパスワードを記述)
　※名前はherokuなど自由な名前でOK。ポートも記載なしで確認できる。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974720/30861ed9-e56f-7269-1a27-7908eb37926e.png" width=70%>
6.接続をクリック
Pandasで国民の祝日を除く平日を作成

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.bdate_range.html

https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html

```python
import pandas as pd

holidays = pd.read_csv(
    "https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv",
    # "https://www8.cao.go.jp/chosei/shukujitsu/shukujitsu.csv",
    encoding="cp932",
    parse_dates=[0],
)["国民の祝日・休日月日"].values

# 曜日指定
# weekmask_egypt = "Sun Mon Tue Wed Thu Fri Sat"
# bday_egypt = pd.offsets.CustomBusinessDay(holidays=holidays, weekmask=weekmask_egypt)

# 平日
bday_egypt = pd.offsets.CustomBusinessDay(holidays=holidays)

df_dates = pd.date_range("2021-01-01", "2021-01-31", freq=bday_egypt)
```
【Ruby】カラムの名前間違えた＆制約間違えた〜助けてmigrate〜

### 解決したいこと
アプリケーションを作り始めて2日目。
DB設計を終えてテーブルを作り、モデルを作り、ふと気付く。

「あれ？スペル違ってるじゃないの・・・」
「あれ？null制約かかっててコンソールからデータ追加できないじゃないの・・・」

さてこれはどうしたものかと色々調べた結果、名前だけ変えられる素晴らしいコマンドがあるとのこと。
ありがたやありがたや・・・。



### 該当するソースコード
```ruby

class CreateParties < ActiveRecord::Migration[6.0]
  def change
    create_table :parties do |t|
      t.string  :name,          null: false
      t.text    :iintroduction, null: false    #⬅️①なぜかiが多いスペルミス
      t.integer :season_id,     null: false
      t.integer :country_id,    null: false
      t.integer :genre_id,      null: false
      t.text    :picture,       null: false    #⬅️②これも修正したい
      t.timestamps
    end
  end
end
```

まずは①からターミナルで実行。

```terminal
% rails generate migration rename_iintroduction_column_to_parties
                          　      ⬆️変えたいカラム名          ⬆️モデル名
```
結果がこちら。
新しくrename用のマイグレーションファイルを作ってくれます。


```terminal
Running via Spring preloader in process 9848
      invoke  active_record
      create    db/migrate/20210108122152_rename_iintroduction_column_to_parties.rb

```
次に作成してくれたファイルに記述していきます。


```ruby
class RenameIintroductionColumnToParties < ActiveRecord::Migration[6.0]
  
  def change
    rename_column :parties, :iintroduction, :introduction
  end             ⬆️モデル名  ⬆️変えたいカラム名  ⬆️修正後のカラム名
end

```

記述できたらマイグレーション。

```terminal
% rails db:migrate
```


直った！
次は②のnull:false制約をつけてしまったものを外したいという作業。
なぜかというとレビューサイトを作っているのですが、レビューしたいデータは管理者のみが作成できるようにしたいため、ひとまずデータの投稿をコンソールから行いたかったからです。
そこで画像データをコンソールから入力しようとしたところnull:false制約がついているためコンソールからデータ入力ができずに困っておりました。
一度この制約を外してとにかく画面上に一つでもデータが表示されるようにしたいというのもあったため、取り急ぎ外すことに。
こちらも同じようなコマンドで対応可能でした。


```terminal
 % bin/rails g migration ChangeColumnToAllowNull
```

同じくマイグレーションファイルが作成されるのでそちらに記述。

```ruby

class ChangeColumnToAllowNull < ActiveRecord::Migration[6.0]

  def up
    change_column_null :parties, :picture, null: true   #「up」でnull: trueに変更しますよ、という意味
  end

  def down
    change_column_null :parties, :picture, null: false  #「down」でnull: false制約つきのものから⬆️⬆️⬆️
  end
  
end

```


記述できたらマイグレーション。

```terminal
% rails db:migrate
```

これで制約を外すことができたのでデータを追加することができました。
そして今、わたしの目の前にはいざ画像を追加しようと思ったら容量が大きすぎて追加できないというエラーが発生しております。
さあ次の戦場へ向かおう。

### 参考にさせて頂いた記事
https://qiita.com/libertyu/items/93acd8733e34b1d0a63c
https://qiita.com/mom0tomo/items/31466a80ca38db4ebf8c

ありがとうございました。
Assenbly Definition Referencesを利用した状態でAddressableビルドをした際にUnityEditor云々と怒られた際の対処方法

# 概要
UnityEditorの拡張機能を作成した状態でAddressableのビルドをしようとしたらエラーが出ました。
その時の対応の内容です。

# 事象
Addressableのビルドをしようとしたら以下のエラーが発生。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163629/8689d74e-e32a-3419-cf78-829a4a44a0dd.png)

```
error CS0234: The type or namespace name 'UI' does not exist in the namespace 'UnityEditor' (are you missing an assembly reference?)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163629/9d20c3e6-2800-6218-d16d-e63dbb6a9b18.png)

画像にある「Assets/Plugins/Commons/Editgor/ToggleImageEditor」というのがエディタ拡張で作成してみたクラス。
それを読みにいってる。

# 原因と解決
ビルド効率化のためにAssenbly Definition Referencesを使ってるんだけど、そこでEditorのビルドプラットフォームにAndroid / iOSが入ってたのが原因っぽい。
どうも、Addressableのビルドする際には対象のプラットフォームでビルドするみたいですね。
ということで、PlatformsからAndroid / iOSを外したらビルドできるようになった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163629/42acabfb-b9db-9e82-3eb0-8a4ba51213f8.png)

多分、 Linux 64-bit以降のも全部外した方がよさそう。
というかEditorだけにしていいんじゃないかなとは思う。まぁ、実害が出るまでは放置。
Lorem Picsumとは

#Lorem Picsumとは
サイト制作時にまだ正式な文章が決まっていなかったりすると、全体のバランスを見るためにダミーのテキストや画像を入れることがありますが、そのようなダミーテキストを使いたい時に便利なツールです。

#Lorem Picsumの使い方
今回エディタは `Visual Studio Code` です。

##基本の使い方
`lorem` と入力してTabキーを押すだけです。

##文字数を指定したい場合
`lorem50` のように `lorem` のあとに文字数を続けて入力します。
[Angular] Angular公式の日本語版と英語版の違い

Angularのチュートリアルでの勉強は昨日やったところまでで終わりにしようと思っていたのですが、その続きの部分をちょこちょこと見ていたら、ちょっと気づいたことがあります。

##Angular公式の日本語版と英語版の違い

[Angular公式日本語版](https://angular.jp/start/start-routing "Angular公式日本語版")

ナビゲーションの追加というドキュメントのngOnInit()メソッドのコードです。

```typescript:product-details.component.ts
ngOnInit() {
  this.route.paramMap.subscribe(params => {
    this.product = products[+params.get('productId')];
  });
}
```

[Angular公式英語版](https://angular.io/start/start-routing "Angular公式英語版")

英語版では下記のようになっていますね。

```typescript:product-details.component.ts
ngOnInit() {
  // First get the product id from the current route.
  const routeParams = this.route.snapshot.paramMap;
  const productIdFromRoute = Number(routeParams.get('productId'));

  // Find the product that correspond with the id provided in route.
  this.product = products.find(product => product.id === productIdFromRoute);
}
```

（日本語版はきっとボランティア的に翻訳して下さっている方々がいらっしゃるのかなと思います。）

もちろん英語版が本家ですから、英語版の方が新しい情報かとは思います。

（プログラミングって、バージョンの違いか環境の違いでプログラムの書き方によってコンパイルエラーになることがありますね。）
タブを自由に移動するショートカットでマウスを触らなくなり効率が上がった

#はじめに
今更当たり前なのかもしれないけど、
最近の一番のいい気づきで、効率爆上がりなので紹介します。

##タブをキーボードだけで移動

ショートカットのコマンド
<font color=red>command + option + ←(→)</font>

タブを自由に移動できます。マウスカーソルを合わせる手間が無くなるので、とても作業が早くなります。


私は、Google ChromeとVSCodeで使っています。
sshの使い方

# 前書き
最近はリモートでお仕事をすることが多くなってきましたよね。
私もリモートで色々な作業をすることが多く、SSHを頻繁に利用しています。

TeraTermやiTermなど様々なSSHクライアントがある中、Linuxであればコンソール、
MacであればTerminalを使ってSSH接続をするのが好みですかね...

ということでここではSSH接続の方法と便利な使い方について紹介します。

# 1. Macの方
MacにはあらかじめTerminalにsshが用意されているので、特にインストールなどは必要ありません。
ssh接続する際は、以下のように実行します。

```zsh
$ ssh （接続するユーザー名）@（接続先ホスト名or接続先IP）
$ ssh user@192.168.100.10
```
パスワードを入力したら、接続完了です。

# 2. Linux(Ubuntuなど)の方
LinuxにはSSHがあらかじめ用意されていない可能性があります。
その場合は以下の手順でSSHをインストールしましょう。

```zsh
$ sudo apt update && sudo apt -y install ssh
```
sudo : 管理者権限で実行する
apt update : パッケージのアップデート

インストールが完了したら、SSHの実行です。方法はMacの方と同様に実行してOKです。

# 3. configについて
sshをインストールしたにホームディレクトリに「.ssh」というディレクトリが生成されているはずです。
.sshディレクトリが見当たらない場合は、以下の方法で.sshディレクトリを生成してください。

```zsh
$ cd                                                              /*ホームディレクトリに移動*/
$ ssh-keygen                                                      /*sudo はつけない*/
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hoge/.ssh/id_rsa):     /*何も入力せずにEnter*/
Created directory '/home/hoge/.ssh'.
Enter passphrase (empty for no passphrase):                       /*何も入力せずにEnter*/
Enter same passphrase again:                                      /*何も入力せずにEnter*/
Your identification has been saved in /home/hoge/.ssh/id_rsa
Your public key has been saved in /home/hoge/.ssh/id_rsa.pub
The key fingerprint is:
***************************************
The key's randomart image is:
***************************************
```
ホームディレクトリに「.ssh」というフォルダが生成されたら、.sshディレクトリ内にconfigというファイルを作って、エイリアスを作成していきます。

```zsh
$ cd .ssh
$ touch config
$ chmod 755 config
$ vi config
```
configファイルをテキストエディタで開いたら、以下のように記述します。

```
Host work　　　　　　　　　　    <- work : 接続するときに入力する名前
     Hostname 192.168.100.1 　<- 192.168.100.1 : 接続先ホスト
     User hoge　　　　　　　    <- hoge : 接続するユーザー名
```
これでconfigファイルの記述は終わりです。
実際に接続する際は、以下のように実行しましょう。

```zsh
$ ssh work <- 'work'はconfigで指定した名前
```

sshの使い方は以上です。ぜひこの機会にsshを利用してみてください！
【Gitを使い始めて１年】Sourcetreeとコマンドの併用という個人的ベストプラクティス

# Gitに触れて1年が経ちました
昨年のこの時期、Gitの入門書を買ってSourcetreeの使い方を勉強したり、簡単なGitコマンドを学習していました。
その後、業務のソース管理をGitで行うようになり、約１年の月日が流れたということで、自分なりのGitの使い方について、これからGitを勉強する方や始めたばかりの方にお役に立てればと思ってこの記事を書いています。

# この記事の目的
【対象の方】
（主に）Git初学者の方

【書く理由】
僕の周りには、Gitを使う上で、Sourcetree派とGitコマンド派に分かれていて、個人的には併用するのが一番使いやすいなぁと思ったから。

# SourcetreeとGitコマンドについて
### Sourcetree
Gitを簡単に使えるようにした、GUIツール。初心者が躓きがちな、コマンドプロンプトを使わずに、視覚的に操作できるのが特徴。
### Gitコマンド
コマンドプロンプトやターミナルで、Gitが用意しているコマンドを入力して、操作する方法。

# Sourcetreeのほうが便利な操作
Sourcetreeの強みは、ソースの差分や履歴が視覚的に見えやすいところです。なので、主に目で見て確認したほうが、間違いが少ないよね。といった操作をSourcetreeで行うのがオススメです。実例をあげるとこんな感じです。

#### 1. ローカル環境でのコミット作業
Sourcetreeでコミット作業を行うメリットとしては、特定のファイルはコミットに含めたくない、特定ファイルの特定箇所だけコミットしたい。などと言ったときに、GUIで対象を指定できるので、Gitに慣れてなくてもなんとなくで操作できます。あと、コミットメッセージを書くのが楽です。

#### 2. コンフリクト発生時の発生箇所の確認、解決時のコミット
コンフリクトが発生したとき、めっちゃ焦りますが、Sourcetreeを使うことで、視覚的にコンフリクト箇所を見ることができるので、少し落ち着きます。（笑）

#### 3. コミット履歴の閲覧
個人的に絶対にSourcetreeのほうが見やすいです。特に、ブランチの数が増えたり、マージコミットが多くなると尚更。

#### 4. ブランチのチェックアウト
Sourcetreeだと、チェックアウトしたいブランチをダブルクリックするだけで、ブランチの変更ができます。Gitコマンドだとチェックアウトするのに、ブランチ名を入力するので、少しめんどくさい印象。

# Gitコマンドの方が便利な操作
Gitコマンドのほうが便利な作業としては、主にリモートとの疎通作業です。
また、マージ、リベースなどは、個人的にGitコマンドのほうがやりやすくて好きです。

#### 1. リモートリポジトリとのやり取り
具体的なコマンドとしては、以下に挙げました。

```console
git fetch 
-> リモートリポジトリの変更を確認する

git pull
-> リモートリポジトリの変更をローカルに取り込む

git push
-> ローカルの変更をリモートに適用する
```

#### 2. リベース、マージ作業

リベースやマージ作業は、個人的にコマンドのほうが早い気がします。コマンドは、ターミナル(コマンドプロンプト)に履歴が残るため、同じブランチを再度マージしたりするときに、同じコマンドを履歴から探して実行するだけなので、そのあたりが楽でミスも少ないかなと思っています。

```console
現在のブランチがmasterブランチで、developブランチの変更を取り込みたい場合
git merge develop

現在のブランチがdevelopブランチで、ソースベースをmasterの最新に変更したい場合
git rebase master
```

#### 3. ローカルの変更取り消し
ローカルで開発したソースで不要になったものを取り消ししたいときに以下のコマンド一発で全取消できます。入力量が少ないのでおすすめです。
※新規追加のファイルは削除できないです。

```console
git checkout .
```

#### 4.その他
たまにしか使わない操作・コマンド。
Gitを使っていると、本当にたまにしか使わない操作を実行するときがあります。
そういうときは、やり方がわからないのでググって調べるのですが、大抵Gitコマンドでのやり方がHitします。
ですので、ググって調べたときは、Gitコマンドを使えたほうが早いというのは、事実だと思います。

# 結論
なんやかんやどっちもちゃんと使えたほうが便利
以上、、、です。
インターネットを守る仕組みたち

*未完成の文章です。

*推敲中です。
*単なる感想文です。歴史的な経緯を自分なりに踏まえ、頭の中を整理しています。
*技術の解説にはなっていません。

*未完成の文章です。

インターネットを守る仕組みたち

smtps,https
dnssec
dns over tls/https

私は安心してインターネットを使うことができています。
いろんな仕組みがインターネットの安全を守ってくれていることを知っているからです。
IPアドレスで、世界がつながっている事自体が、ほんとうに素晴らしいことなのです。
つながったは良いけど、人間にはわかりにくい。ドメインは人間を助けるために生まれました。
全部、手作業で維持しようとすると大変だから、少しずつ仕組みが洗練されてきたのです。

先日、DNS over TLSついて、少し触れました。
インターネットにはドメインネームと呼ばれる、人にわかりやすい名前がつけられています。
IPアドレスという人には直感的ではない数字だけで、住所をやりとりするとなると、私達は区別をつけるのも難しく、また混乱しやすいです。
でもDNSの仕組みのおかげで、私もインターネットにアクセスしやすくなっています。
（今はひょっとしたら、IPアドレスというより、そのドメインでサービスを提供している人たちといったほうが良いのかもしれません。ドメインのもとで提供されているサービスを提供しているサーバー群との結びつけが、抽象化されていて、形が変わってきたかもしれません。）

*インターネットの安心を守る仕組み
なりすましの抑止（ドメイン所有者の正当性を担保するため）
通信路の暗号化（盗聴防止のため）

なりすましを抑止するために
そのドメインを保持していることを保証するための仕組みとして、一定の手順を踏むことになっています。
それぞれの手順（手続き）によって、そのドメインを名乗り続けることが許可されます。アクセスする側も、それによって、安心してアクセスできます。
またインターネット上でのサービスを提供しているサーバが正当なものであることを保証することにも繋がっていきます。

dnssecはDNSに登録している情報についてデジタル署名することで、その安全性を高める仕組みです。
dnssecが当たり前になれば、誤った登録は検出しやすくなることが期待できます。
それは故意にdnsの情報を改ざんしようとする行為の歯止めの一つとなります。
またdnsの通信の暗号化のための技術として、dns over tls/httpsといった仕組みも登場しています。

ドメイン証明書といったものがあります。
主にWebサービス（https）に使われています。
この証明書の発行にも決まった手順があります。
これらの約束事によって、インターネットのドメインの正当性をより確かなものとし、なりすましを防ぎ、通信経路の暗号化によって盗聴を難しくしたり、プライバシーを保護していこうという仕組みです。

smtpsは、昔、インターネットの信号が平文で流れていて、その気になれば、途中の経路にいる人たちが、その通信を覗き見できた時代のメール配信の仕組みを、通信路を暗号化することによって改善するための仕組みです。
Webサービスなどの多くは、別に隠す必要もなく、見られても構わない情報もたくさん公開されています。
それらは平文でも極論では構わないわけです。
httpsという仕組みによって、通信路が暗号化され、通信相手のなりすましを抑止し、通信相手がドメインの所有者であることを保証するための仕組みができて、安心してお買い物ができるようになりました。
（ドメイン証明書が正式な手続きを経ていないものが採用され、通信経路は暗号化されているが、通信相手のドメイン所有の正当性を保証するまではいっていない証明書を使っているサーバーもありますが、それらは一部であると思います。
特にクレジットカードの認証手続きなど、お買い物については、そういった手順を守っていなかったら、サービスを提供するべきではないのです。）

dnssec,https,smtps。dns over tls/https、、、。

これらの技術を使うことが、インターネットの安心を守るための取り組みであり、理解を深めることでより安心もできるのです。
インターネットを守る側に立つなら、自分たちでその仕組みへの理解を深めて、自ずと導入していく技術です。
これらの手続きは標準化され、手続きが明確化されることによって、また不具合を減らせる仕組みに洗練されていくことによって、進歩してきました。

これからもそれは、続いていくでしょう。
それを守り続ける、メンテナーによって。

また守りやすくするために、自動化をはじめ、煩雑な仕組みを担ったり、間違いが起きたときに、それが起きているということを人間や機械が判断しやすくなっていくでしょう。
気づいたら、多くの仕組みが導入済みで、今以上に安心して使える世の中になっているかもしれません。
その仕組みを守り続けるスタンスに、みんなが立ち続けることが必要かと思います。
（なんのために、いろんな仕組みを作ってきたでしょうか。）

傷つけようとして、傷つける人。
苦しめようとして、苦しめる人。
そんな人がいたら教えてください。（自ずと気づいてください）

理解してもらえないなぁとか、分かってもらえないからといって、嘆いたり、やけを起こしてはいけません。
お互いに不完全なのですから、人知れず傷つけることもあるかもしれないし、思い込んだり、決めつけたりしていることもあるかもしれません。
何もしていないうちから、頭ごなしに否定することもおかしなことです。まだ何も手を付けていないのに、相手を見限ることもおかしな話です。

私達には、これからがあるのですから。
私は？

dnssecについては、かえって問題もあるというご指摘もあるようです。
よりよい仕組みが確立していきますように。
[DNSSEC はなぜダメなのか](https://www.e-ontap.com/dns/criticism/)