OmniAICreator/Qiita-1.07M huggingface dataset:
GitHub Actions から Azure Bicep でリソースをデプロイする

# やること

GitHub Actions から Bicep で定義した Azure リソースをデプロイします。とりあえずシンプルに App Service Plan だけデプロイしてみます。なんとなく全部コマンドだけでやります。

# バージョン情報

```
> gh --version
gh version 2.2.0 (2021-10-25)

> az --version
azure-cli 2.29.2

> $PSVersionTable.PSVersion.ToString()
7.1.5

> code --version
1.61.2
```

# 構築

PowerShell から以下のコマンドを実行していきます。

```posh
# Azure にログイン
az login

# GitHub にログイン
gh auth login

# デプロイ用リソースグループの作成
$resourceGroupName = "BicepTestRG"
$resourceGroup = az group create --name $resourceGroupName --location japaneast

# デプロイ実行用サービスプリンシパルの作成
$servicePrincipalName = "BicepTestApp"
$resourceGroupId = ($resourceGroup | ConvertFrom-Json).id
$servicePrincipal = az ad sp create-for-rbac --name $servicePrincipalName --scopes $resourceGroupId --role Contributor --sdk-auth

# GitHub Secret に登録するための情報を取得
$secretBody = ($servicePrincipal | ConvertFrom-Json) | select clientId,clientSecret,subscriptionId,tenantId | ConvertTo-Json

# Repository をクローンするフォルダに移動
cd "C:\GitHub"

# GitHub Repository 作成 & クローン
$repositoryName = "BicepTest"
gh repo create $repositoryName --private --confirm

# Repository フォルダに移動
cd $repositoryName

# GitHub Secret を追加
$secretBody | gh secret set AZURE_CREDENTIALS

# Visual Studio Code で開く
code .
```

VSCode で `main.bicep` を作成します。

```:BicepTest/main.bicep
resource appServicePlan 'Microsoft.Web/serverfarms@2021-02-01' = {
  name: 'BicepTestAppServicePlan'
  location: 'japaneast'
  sku: {
    name: 'F1'
  }
}

```

`.github` フォルダとその配下に `workflows` フォルダを作成します。`workflows` フォルダ配下に  `workflow.yml` を作成します。

```yaml:BicepTest/.github/workflows/workflow.yml
name: deploy-bicep-test

on: [workflow_dispatch]

env:
    AZURE_RESOURCEGROUP_NAME: BicepTestRG

jobs:
  deploy:
    runs-on: windows-latest
    steps:
    - uses: actions/checkout@v2
    - uses: azure/login@v1
      with:
        creds: ${{ secrets.AZURE_CREDENTIALS }}
    - uses: azure/arm-deploy@v1
      with:
        deploymentName: ${{ github.run_number }}
        resourceGroupName: ${{ env.AZURE_RESOURCEGROUP_NAME }}
        template: ./main.bicep
```

コミットしてプッシュしておきます。

# 実行

再び PowerShell で以下のコマンドを実行します。

```posh
# ワークフロー実行
gh workflow run workflow.yml

# 実行状況確認
gh run list --workflow=workflow.yml

# リソース確認
az appservice plan list
```
Automation 360でそのPCのダウンロードフォルダなどのフルパスを取得する方法


#はじめに
Botを作り、実行機など他のPCに移す時にダウンロードフォルダ等を絶対パスで指定していると、
Windowsにログインするユーザーによりフォルダのパスが変わるため、動作しない。といったことがあります。

そのために可変するフォルダではなく、Cドライブ直下などに専用のフォルダを作成したりしますが、
その場合はアクセス権の設定等がややこしかったりします。

今回は可変値であるダウンロードフォルダやドキュメントフォルダ等のパスを出来るだけ簡単な方法で取得する方法を紹介します。

#手順
* 「アプリケーション: プログラム/ファイルを開く」でコマンドプロンプトを呼び出し、%userprofile%の環境変数の値をクリップボードに格納する
* 得られた文字列から「トリム」アクションを使ってスペースと改行を削除する
* クリップボード変数を使って必要なフォルダのパスを作成する。（例：ダウンロードフォルダ等）

#手順詳細
##「アプリケーション: プログラム/ファイルを開く」アクションを置く


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/4a7d5373-73e2-8ee5-b3ca-317c06365a9e.png)

###「パラメーター」の箇所で使用するコマンドはこちら

「アプリケーション: プログラム/ファイルを開く」からコマンドプロンプトのコマンドを実行する場合、「/c」をパラメーターの先頭につけるのがポイントです。

```
/c echo %userprofile% | clip
```

##得られた文字列から「トリム」アクションを使ってスペースと改行を削除する
メッセージボックスなどで他の文字列と組み合わせて表示してみるとわかるのですが、
取得した文字列はそのままですと末尾にスペースと改行を含みますので、これを「トリム」アクションで取り除きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/bc2dd329-ba53-98c0-cd89-68906ff1f022.png)


##クリップボード変数を使って必要なフォルダのパスを作成する
以下のように、例えば後ろに「\Downloads」をつけるとダウンロードフォルダのフォルダパスになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/e6c8ebcd-0b46-3b03-be9c-0581cbcdd124.png)


上記を実行してみると以下のような結果が得られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/25c0bf30-4c62-5447-181b-7f18015b0ca6.png)


#まとめ
* ダウンロードフォルダ等は実はファイルパスがユーザーごとに可変で厄介
* 色々な方法があるけれど、コマンドプロンプトを使う方法が一番シンプルかも？
* 今回のような方法でフォルダ指定すると他のPCに移した際にも問題になりにくい
Udemy「ネットワークエンジニアを目指す初心者はここから始めよう！「ゼロから学ぶネットワーク基礎」1030 ネットワーク インフラエンジニア

輻輳
・輻輳とはネットワーク機器で処理できないような通信量が発生することで混雑する状況を言う。

輻輳制御
・スロースタートで徐々に上げていく。
・輻輳ウィンドウは送信ホストの内部的な値（TCPヘッダのWindowではない）のこと。
・送信ホストは輻輳ウィンドウと通知されたWindowを比較し、小さい値を採用する。


ICMP 概要
・Internet Control Message Protocolのこと。
・IPにより運ばれるがTCP/UDPのようなトランスポート層の役割は持っていない。
・問い合わせ用のメッセージを送り、宛先や途中のネットワーク機器の応答により状態を判断する。
・エラーを検出した時にメッセージを生成し、IPパケットの送信元に通知する。
・IPにより運ばれるのでトラブルの時にネットワーク層レベルでの正常性を確認できる。

ICMPメッセージ
・TypeはICMPの種類を表す。
・CodeはTypeごとにその中で使われるメッセージの種類を表す。
・Checksumは誤り検出に使われる。


Type8(Echo Request)/Type0(Echo Reply)
・TypeはICMP Echo RequestはType8、Echo Replayは0となる。
・Codeはどちらも0が入る。
・Identifier/Sequence Number
　・Type8を送信する側がRequestとReplyを一致させるために使用する。
・Dataにはテスト用のデータが入る。このサイズは送信側が任意に指定できる。


Type11(Time Exceeded)
・Code
　・０は転送中にTTLが0になったことを意味する。
　・1はフラグメントされたパケットの組み立てに時間がかかりすぎて破棄したことを意味する。
・Unusedは将来の拡張用で０が入る。
・Lengthには元データの長さが32ビット単位で入る。
・元データが入るフィールドも32ビット単位になるように不足分は0でPaddingされる。


Redirect
・Redirect（リダイレクト）は自分宛にきたデータを他に転送して処理を任せること。
　・0は宛先ネットワークには他に適切な送信先がある。
　・1は宛先ホストには他に適切な送信先がある。
　・2はType of Service（優先度）に一致する宛先ネットワークは他に適切な送信先がある。
　・3はType of Service（優先度）と一致するホストは他に適切な送信先がある。
・Gateway Internet Addressはリダイレクト先のIPアドレスが入る。
・IPヘッダと元データの先頭64ビット分を付け加える。


Type3(Destination Unreachable)
・Code
　・到達不能の理由により異なる数字が入る。
・Unusedは将来の拡張用で0が入る。
・Lengthには元データの長さが32ビット単位で入る。
・Next-Hop MTUはCode4の時だけ使われ、それ以外はUnusedになる。
・元データが入るフィールドも32ビット単位になるように不足分は0でPaddingされる。


Type3 Code(1)
・0＝Network Unreachable
　・途中のルータで経路はあるがネクストホップに転送できない。
・1＝Host Unreachable
　・直接接続されたネットワーク上のホストがARPに応答しない。
・2=Protocol Unreachable
　・トランスポート層プロトコルが宛先で利用できない。
・3=Port Unreachable
　・ホスト上で指定されたポートが開いていない。
・4=Fragmentation　Needed and DF Set
　・フラグメントが必要なデータだがDFビットによりフラグメントできない。


Type3 Code(2)
・5=Source Route Failed
　・ソースルートオプションでネクストホップに転送できない。
・6＝Destination Network Unknown
　・宛先ネットワークがない（Code0を利用することとされている）。
・7=Destination Host Unknown
　・リンク層から宛先ホストが存在しないと通知されている。
・11=Network Unreachable For Type Of Service
　・IPパケットに指定されたType of Service（優先度）では宛先ネットワークを利用できない。
・12=Host Unreachable For Type Of Service
　・IPパケットに指定されたType of Service（優先度）では宛先ホストに転送できない。

・13＝Communication Administratively Prohibited
　・フィルタリング機能によりIPパケットを転送できない。
・14＝Host Precedence Violation
　・IPパケットに指定されたType of Service（優先度）による送信が許可されていない。
・15=precedence cutoff in effect
　・IPパケットに指定されたType of Service(優先度）が低いために送信許可されていない。
※Code8〜10は禁止
AtCoder ABC225 挑戦！(Python)

ABC225、コンテスト7回目の挑戦です！
泥臭い方法ではありますが、C問題まで完答できました！
C問題解いて、レートが+40くらいなので、あと5, 6 回C問題完答できたら、茶色突入ってところか。(希望的観測)

```ruby:ABC225A
S=input()
 
#3文字の中に、同じ種類の文字が何種類あるかで場合分け
if len(set(S))==3:
    print(6)
 
elif len(set(S))==2:
    print(3)
 
else:
    print(1)
```
本当は、M種類同じ文字があると、3!/M!だが、そのまま数字書いてしまった。次から気をつける。

```ruby:ABC225B
N=int(input())
 
#スターである条件は、すべてのa_bのどちらかに同じ数字が出現すること。
#リストを区切らずに格納して、数を数える。
a_b_list=[]
for i in range(N-1):
    a, b=map(int, input().split())
    a_b_list.append(a)
    a_b_list.append(b)
 
# print(a_b_list)
 
from collections import Counter
# print(Counter(a_b_list).keys())
# print(Counter(a_b_list).values())
 
if max(Counter(a_b_list).values())==N-1:
    print('Yes')
 
else:
    print('No')
```
a,b のすべてに、1回ずつ、計N-1回同じ数字が登場した場合に、スターとなる。


```ruby:ABC225C
N, M=map(int, input().split())
matrix=[]
 
for i in range(N):
    B=[]
    B=list(map(int, input().split()))
    matrix.append(B)
# print(matrix)
 
#各種条件の一致を確かめる
Flag='Yes' #初期化、Aと一致するかどうか

#1) 列の次の要素は、1ずつの連続した数である。
for i in range(N):
    for j in range(M-1):
        if matrix[i][j]+1==matrix[i][j+1]:
            pass
        else:
            Flag='No'
            break
# print(Flag)
 
#2) 同じ列の次の行は、前の行の要素に7を足したものである。
for i in range(N-1):
    if matrix[i][0]+7==matrix[i+1][0]:
        pass
    else:
        Flag='No'
        break
# print(Flag)
 
a=matrix[0][0] #先頭の要素
#3) Mの数による条件
if M==1:
    pass
else:
    if a%7 in [_ for _ in range(1, 9-M)]:
        pass
    else:
        Flag='No'
        
print(Flag)
```
Aの行列は、
1 2 3  4  5  6  7
8 9 10 11 12 13 14
...
と続く、カレンダー形式の行列となっている。
与えられた行列Bが、Aの一部になっているかどうかを判定する問題。

スマートな方法がわからなかったので、行列Bについて、以下の3つの条件を順番に判定した。

1) それぞれの列の次の要素は、1ずつの連続した数である。

2) 同じ列の次の行は、前の行の要素に7を足したものである。
→1)で要素が連続しているかどうかは、判定しているので、それぞれの列の最初の要素のみ、判定を行う。

3) Mの数によって、最初の要素が満たす条件が変わってくる。
M=1の場合は、一番緩く、最初の要素B11はなんでもよい。
M=2の場合は、B11 % 7 in [1, 2, 3, 4, 5, 6]であればよい。(0以外)
M=3の場合は、B11 % 7 in [1, 2, 3, 4, 5]
...と続く
M=7の場合が一番厳しく、
B11 % 7 in [1]となる。
以上の条件を一般化すると、B11 % 7 in [_ for _ in range(1, 9-M)] となる。

かなり泥臭くやってしまったが、なんとかACできて、20分くらい余ったので、自分としては、上出来。
スマートな回答も調べて、参考にしておきたい。

次回も頑張りましょう。
お疲れさまでした。
[Azure CLI] テナント内のアプリケーションオブジェクトをすべて削除するワンライナー [PowerShell]

検証環境に不要なアプリケーションオブジェクトが溜まってまとめて消したくなった時などに。

```posh
az ad app list | ConvertFrom-Json | ForEach-Object { az ad app delete --id $_.appId }
```

## トラブルシュート

一部のアプリケーションオブジェクトで以下のエラーが発生して削除に失敗。

```
Value cannot be null.
Parameter name: requestContext
```

下記ページによると Azure CLI が Azure AD Graph API を利用していることが原因と思われる。
https://githubmemory.com/repo/Azure/azure-cli/issues/18738

Microsoft Graph API を呼び出すことで解決。

```posh
az ad app list | ConvertFrom-Json | ForEach-Object { az rest --method DELETE --url https://graph.microsoft.com/v1.0/applications/$($_.objectId) }
```

Microsoft Graph 版 Azure CLI がリリースされたら解決すると思われる。
【Qiitaマークダウン】チートシート

# 折り畳み
【表示】
<details><summary>長いので折り畳み！（←ここをクリック！）</summary><div>
あいうえおあいうえおあいうえお
あいうえおあいうえおあいうえお
</div></details>

```:Qiitaマークアップ
<details><summary>長いので折り畳み！（←ここをクリック！）</summary><div>
あいうえおあいうえおあいうえお
あいうえおあいうえおあいうえお
</div></details>
```
# @をエスケープしたい
（@の前に「\」を書くだけだとエスケープできなかった）

【表示】
<span>@</span>あいう

```:Qiitaマークアップ
<span>@</span>あいう
（spanタグで@だけ囲む）

```

【参考】

https://qiita.com/xsgk/items/b41262553cbc10544c2e

# 画像サイズ指定
```
<img width="（指定したいサイズを数字で表記　例：300）" alt="（画像ファイル名　例：1.png）" src="https://**********.png">
```

# 「$」を表示させたい
例えば「\$D\$3」と入力すると、下のような表示になる。
$D$3
「$」マークが消え、続く文字の書体が変わってしまう。
↓

【解決方法】
「$」の前に「\」を入力すれば解決！

# URLの記述をリンク先に飛ばないようにしたい
（「http://～.com」の前に「\」を書くだけだと不可だった）

「``」で括るしかないのか？
でも表示はこう↓なってしまう。
`http://～.com`
他に背景色をグレーにせずに表示させられる方法を探したい。

# 数式
https://qiita.com/PlanetMeron/items/63ac58898541cbe81ada
[Azure CLI] サブスクリプション内のリソースグループをすべて削除するワンライナー [PowerShell]

検証環境に不要なリソースグループが溜まってまとめて消したくなった時などに。

```posh
az group list | ConvertFrom-Json | ForEach-Object { az group delete --name $_.Name --yes }
```
Pythonで誤差なし偏角ソート(第一象限のみ)

`math.atan2` でソートしたらWAしたときに。

:::note warn
全ての点が第一象限にあるときのみ使えます。
:::

```python
from functools import cmp_to_key


def arg_sort(p0, p1):
    x0, y0 = p0
    x1, y1 = p1
    if x0 * y1 == x1 * y0:
        return 0
    return 1 if x0 * y1 < x1 * y0 else -1


N = int(input())
lst = []
for _ in range(N):
    x, y = map(int, input().split())
    lst.append((x, y))
lst.sort(key=cmp_to_key(arg_sort))
```
## verify
* https://atcoder.jp/contests/abc225/submissions/26935748
    * 問題の性質上、点 $(x - 1, y)$ の偏角でソートしています。
    * PyPy3 (7.3.0) でAC。 Python だとTLEするかもしれません。

## 参考文献
* [Codeforces Hello 2020 E. New Year and Castle | ARMERIA](Constructionhttps://betrue12.hateblo.jp/entry/2020/01/05/151244)
    * 上記のコードだとなぜ誤差なくソートできるかが丁寧に解説されています。
    * 第二～第四象限まで点が散らばっている場合に対応したライブラリの作り方も書かれています。この記事で示したコードは全ての点が第一象限にあるときのみ使えることに注意してください。
【Ruby on Rails】アソシエーション先のデータを `create_テーブル名` メソッドで作成する。


### 環境
- Ruby 2.6.3
- Ruby on Rails 6.0.1

#できること
`has_one` でアソシエーションしている場合、
アソシエーション先のデータを`create_テーブル名`メソッドで作成できる。

#前提
Authorモデルに対してBookモデルがhas_oneアソシエーションしています。
一人一冊、本を書いている状況です。

```ruby
# author.rb
class Author < ActiveRecord::Base
  attr_accessor :name :age
  has_one :book
end

# book.rb
class Book < ActiveRecord::Base
  attr_accessor :title
  belongs_to :author
end
```
# 実例
```ruby
author = Author.create(name: 'John', age: 30)
author.create_book(title: 'cooking book')
```

# 最後に
上記書いておいてではありますが、
`create`するときは、
`create!`, `create_book!`のように書いたほうが良いと思います。
`!`があると、バリデーションが失敗した際に例外を出してくれます。([参考](https://railsguides.jp/active_record_basics.html#%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%EF%BC%88%E6%A4%9C%E8%A8%BC%EF%BC%89))

参考にしたページ: [Rails has_many : Why does create_model not work?](https://stackoverflow.com/questions/13390665/rails-has-many-why-does-create-model-not-work/13392161)
RedHat Enterprise LinuxのMySQLコンテナを実行する

# 実行環境
- Fedora Server
- Podman

# ログイン
初回のみregistry.redhat.comにログインする

```
[master@fedora ~]$ podman login registry.redhat.io
Username: [username]
Password: [password]
Login Succeeded!
```

# Mysql 8.0のコンテナを実行する
```
[master@fedora ~]$ podman run --name mysql-custom  -e MYSQL_USER=mysql -e MYSQL_PASSWORD=password  -e MYSQL_ROOT_PASSWORD=password  -d registry.redhat.io/rhel8/mysql-80

Trying to pull registry.redhat.io/rhel8/mysql-80:latest...
Getting image source signatures
Copying blob 06038631a24a skipped: already exists
Copying blob 262268b65bd5 skipped: already exists
Copying blob 44115d860fce skipped: already exists
Copying blob e6407044eff6 done
Copying config 09887d80b9 done
Writing manifest to image destination
Storing signatures
97522dd5e18d163ee9fc17dbaac64474b0989988d9b5c67d77acd17dac79d954
```
## 未ログインの場合
registry.redhat.ioに未ログインの場合、以下のように表示される。

```
podman run --name mysql-custom  -e MYSQL_USER=mysql -e MYSQL_PASSWORD=password  -e MYSQL_ROOT_PASSWORD=password  -d registry.redhat.io/rhel8/mysql-80
Trying to pull registry.redhat.io/rhel8/mysql-80:latest...
Error: Error initializing source docker://registry.redhat.io/rhel8/mysql-80:latest: unable to retrieve auth token: invalid username/password: unauthorized: Please login to the Red Hat Registry using your Customer Portal credentials. Further instructions can be found here: https://access.redhat.com/RegistryAuthentication
```

# コンテナ内でシェル実行
コンテナ内でシェルを実行する

```
[master@fedora ~]$ podman exec -it mysql-custom /bin/bash
bash-4.4$
```

# データベースにログインする
```
bash-4.4$ mysql -uroot
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.26 Source distribution

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

# データベースを作成する
```
mysql> create database items;
Query OK, 1 row affected (0.44 sec)
```

# データベースを確認する

```
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| items              |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
```

# 使用するデータベースを選択する
```
mysql> use items;
Database changed
```

# 終了する
```
mysql> exit
Bye
bash-4.2$ exit
exit
```
deviseについて

## はじめに
RubyのライブラリであるGemの「devise」のまとめです。
「device」ではなくて「devise」なので注意。

### deviseでできること
「devise」は簡単に認証機能を作成することができます。
認証機能は新規登録画面とかログイン画面とかのことで、
ユーザー登録が必要なサイトでは必須ですよね。

### 導入してみる

#### deviseのインストール
```ruby:Gemfile
gem 'devise'
```
を追加して

```
$ bundle install
```
をターミナルに入力。

####初期設定
設定ファイルをインストールするために

```
$ rails g devise:install
```

これでdeviseを使用する準備は完了。

config/initializers/devise.rb
config/locales/devise.en.yml

の設定ファイルが作成されているはずです。

####テーブルの作成
今回はモデル名は「User」で作成します。
「devise」はユーザテーブルを自動的に作成してくれるので
「rails g model User」はしなくても大丈夫です。

```
$ rails g devise User
```

「User」モデルと、「users」のマイグレーションファイルが作成されます。

####テーブルの編集
ログイン機能に必要な「email」と「passward」はデフォルトで管理してくれているので、
他にユーザー登録、ユーザーテーブルに必要なカラムを追加してあげます。

```ruby:時間_devise_create_users.rb
t.string :name
```

今回必要なカラムは「name」のみなので、上記を入力。
他に姓と名を分けたり、電話番号や住所が登録に必要な場合はここで入力しておきます。
ここでちゃんと保存はしておきましょう。
入力を終えたら

```
$ rails db:migrate
```
をし、テーブルを作成します。
作成したら、

```config/routes.rb
devise_for :users
```
```app/models/user.rb
class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
end
```
が追加されています。
一つ目は「devise」のURLには「users」が含まれるようになっているという表示。
二つ目の説明は今回省きます。とりあえず、deviseのデフォルトの機能です。

####nameを登録できるようにする
今回は「name」をカラム追加しているため

```app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
  end
end
```
before_action :configure_permitted_parameters, if: :devise_controller?は
「devise」の機能の前に「configure_permitted_parameters」をしてくださいという記述です。
その「configure_permitted_parameters」の中身が
新規登録時に名前（name）の操作を許可するという記述です。

####ユーザー登録画面を編集
「devise」をインストールすると自動的にデフォルトのviewが用意されているので、利用可能ではあるのですが、今回は「name」を追加しているため、編集を行います。

```
$ rails g devise:views
```
をすると、色々と追加されますが、今回「name」を追加しているため
「name」の入力欄のみ追加します。

```app/views/devise/registrations/new.html.erb
〜省略〜

<div class="field">
  <%= f.label :name %><br />
  <%= f.text_field :name, autofocus: true %>
</div>

〜省略〜
```
これで新規登録で名前を追加することができるようになりました。
あとは、このままだとログアウトできないので、任意のページにログアウトの記述をしてあげてください。

```
<% if user_signed_in? %>
  <%= link_to "ログアウト", destroy_user_session_path, method: :delete %>
<% end %>
```
<% if user_signed_in? %>はdeviseで使用できるヘルパーです。
ログイン済みであれば、、、の意味なので、ログイン済みの場合はログアウトの表示をするという記述です。

以上で実装終了とします。
まだまだアレンジ等できるみたいですので、自分用にカスタマイズできるようになれたらなと思います。
Expoでビルド後だけ発生するエラー

# 事象
- ExpoをAndroidパッケージに出力する。(APK、bundle問わず発生)(iosでも再現するらしい、参考情報参照)
- アプリを実機起動すると異常終了する
- エラー通知等はなし。Expoの開発環境では発生しない
- オープンテストで異常終了をレポートすると、google play console上に次のエラーログが確認できる
![スクリーンショット 2021-10-30 22.59.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57455/bdc4acc1-82f8-98db-7519-4489a4888838.png)

```
  at host.exp.exponent.experience.BaseExperienceActivity.lambda$consumeErrorQueue$0 (BaseExperienceActivity.java:210)

```

- バージョン　Expo 4.10.1

# 原因
## 参考資料
> https://github.com/moment/moment/issues/5214
> https://github.com/moment/moment/issues/5252

- Moment.js　の処理時にExpo環境内でバグがある。
- 具体的には次のメソッド実行時に異常終了していた

```javascript:app.js
Moment.locale('jp');
```

# 対処
- Moment.jsの利用箇所を置き換えた
RedHat Enterprise LinuxのUniversal Base Imageコンテナを実行する

# 実行環境
- Fedora Server
- Podman

# Universal Base Imageのコンテナを実行する
実行ユーザは rootで実行される。

```
[master@fedora ~]$ podman run -it ubi8/ubi:8.3 /bin/bash
[root@f454c47c4e0b /]# whoami
root
[root@f454c47c4e0b /]# exit
exit
```
ActiveLink TypeScript


https://qiita.com/TK-C/items/ba5c07124d33ee9b8b41

https://gist.github.com/remy/0dde38897d6d660f0b63867c2344fb59

この記事の対象
・TypeScriptで型安全にActiveLinkを使いたい人
・Routerについて知りたい人
・コードを読む練習をしたい人

元々古くからのTechWikiのコードの改良みたいですが。
上の記事で@TK-Cさんが使い方の説明をされています。
本家はGitHubの@remy氏のJavaScriptを参照。

今回はJsのこのコードに型を付けました。

かなり単純かつ簡単で良いコードみたいなので勉強して行ってください。

関数→変数→条件分岐(同値演算子)→returnと言ったシンプルな内容です。

```tsx:ActiveLink.tsx
import { withRouter, NextRouter  } from 'next/router';
import React, { ReactElement } from 'react';
import Link from 'next/link';

type Props = {
  router: NextRouter;
  children: ReactElement;
  href: string;
  activeClassName: string;
}

const ActiveLink = ({ router, children, ...props }: Props) => {

  let className: string = children.props.className;
  if (router.asPath === props.href) {
    className = `${className} ${props.activeClassName}`;
  }

  return (
    <Link {...props}>{React.cloneElement(children, { className })}</Link>
  );
}

export default withRouter(ActiveLink);
```


####まずは条件分岐を見ます。


router.asPathとprops.hrefが一致するか比較されます。
一致した場合真になりif文の処理であるprops.activeClassNameをclassNameに代入する処理が行われます。

####リターン


classNameを返すことによって、activeClassNameとして動くclassNameという2個目の実体を定義することができました。

####ルーターの処理

router.pathnameは現在のページをパスとして認識しリンクの判定を識別するものです。
今のページがhrefと一致するならばアクティブリンクが作動するという仕組みです。

####Children.onlyは必要なのか?

Children.onlyは子要素を持たない場合に限定する目的で使われるメソッドです。
裏を返せばdom要素で下の階層を持つ場合エラーを返す処理です。
今回の場合Next.jsはActiveLinkでaタグをラップすることになるので不要だと言えます。


##childrenにReactElementを付ける理由
ReactElementは依存関係の系列でReactDomに継承させてる他 
string | JSXElementConstructorを持ちます。

- 型について詳しく参考と公式ドキュメントをご覧ください。





もっといい書き方があったら教えてください。









##参考

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Logical_AND

https://www.carlrippon.com/react-children-with-typescript/

https://ja.reactjs.org/docs/react-api.html

https://blog.ojisan.io/react-component-words/


```json
"next": "^12.0.1"
"react": "^17.0.2"
"react-dom": "^17.0.2"
"eslint": "^7.32.0"
```
実行環境は以上となっています。
もしコードが動かない場合は教えてください。

11月5日追記
論理和を消しました。
trimメソッドを消しました。
if文を修正しました。
論理積を消しました。
Children.onlyのメソッドを変数ごと消しました。
child変数を消しました。
ダイナミックルーティング対応のためrouter.asPathに変更しました。
【Laravel】セレクトボックスの実装と値の保持

#はじめに
以下のようなセレクトボックス（値は２０個ぐらい格納）を実装したので、備忘録として残しておきます。
![スクリーンショット 2021-10-30 21.25.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1697283/910c9824-136f-c8b5-95cf-987a879248e8.png)

#コード

```php:create.blade.php
<div class="form-group">
    <label for="category-id">{{ __('カテゴリー') }}
    <select class="form-select" id="category-id" name="category_id">
        @foreach ($categories as $category)
            <option value="{{ $category->id }}" @if(old('category_id') == $category->id) selected @endif>{{ $category->category_name }}</option>
        @endforeach
    </select>
    </label>
</div>
```

値を保持するために
`@if(old('category_id') == $category->id) selected @endif`
と記述しています。
RedHat Enterprise LinuxのHTTPコンテナを実行する

# 実行環境
- Fedora Server
- Podman

# ログイン
初回のみregistry.redhat.comにログインする

```
[master@fedora ~]$ podman login registry.redhat.io
Username: [username]
Password: [password]
Login Succeeded!
```

# Apache httpd 2.4のコンテナをpullする
```
[master@fedora ~]$ podman run -d -p 8080 registry.redhat.io/rhel8/httpd-24
Trying to pull registry.redhat.io/rhel8/httpd-24:latest...
Getting image source signatures
Copying blob 06038631a24a done
Copying blob 44115d860fce done
Copying blob 7220659c6858 done
Copying blob 262268b65bd5 done
Copying config b9c0594ea9 done
Writing manifest to image destination
Storing signatures
c85ee68e135b8416764405c3aeb520ef61cd53526ae76027b8ed9b072cc44c03
```
## 未ログインの場合
registry.redhat.ioに未ログインの場合、以下のように表示される。

```
podman run -d -p 8080 registry.redhat.io/rhel8/httpd-24
Trying to pull registry.redhat.io/rhel8/httpd-24:latest...
Error: Error initializing source docker://registry.redhat.io/rhel8/httpd-24:latest: unable to retrieve auth token: invalid username/password: unauthorized: Please login to the Red Hat Registry using your Customer Portal credentials. Further instructions can be found here: https://access.redhat.com/RegistryAuthentication
```

# ポートを確認
バインドされたポートを確認する

```
[master@fedora ~]$ podman port -l
8080/tcp -> 0.0.0.0:[ランダムポート]
```

例)

````
[master@fedora ~]$ podman port -l
8080/tcp -> 0.0.0.0:45211
```

# 疎通確認
```
curl http://0.0.0.0:[ランダムポート]
```

例)

```
curl http://0.0.0.0:45211
```
Amazon chatbot とは

## 勉強前イメージ

bot？

## 調査

### Amazon chatbot とは

slackチャンネル、またはAmazon Chimeのチャットルームなどで通知を受け取れるサービスです。
chatbotを利用すれば、AWSのイベント情報やセキュリティ診断の通知など共有が可能になります。

### Amazon chatbotのメリット

- リアルタイムの通知

リアルタイムに通知が可能です。
アラートの情報やメンテナンス情報をslack上ですぐに確認できます。
受け取りたい通知を設定できるので、必要な分だけ設定可能です。

- 設定が簡単

連携が簡単で、管理画面からslackとの連携を行い、
チャンネルにchatbotを追加するだけでできます。

- 費用がかからない

AWS chatbotは無料で利用できます。

- 簡単にアクセス許可が可能

登録したSlackチャンネルやAmazon Chimeチャットルームにアクセス許可の設定が可能です。
また、テンプレートの作成もできます。

## 勉強後イメージ

アラートとかすぐに通知が見れるね！
普通はどういう設定で連携させるんだろうね？やってみる

## 参考

- [AWS Chatbot](https://aws.amazon.com/jp/chatbot/)
- [AWS Chatbotの概要とメリット](https://www.skyarch.net/column/aws-chatbot/)
【Ruby on Rails】migration index too long なエラーを解決

### 環境
- Ruby 2.6.3
- Ruby on Rails 6.0.1
- **PostgreSQL 10**


# 発生状況
今回のエラーが起きたマイグレーションファイル

``` ruby
class CreateFooBarExampleRegistrations < ActiveRecord::Migration[6.0]
  def change
    create_table :foo_bar_example_registrations do |t|
      t.references :parent_example_table_name, null: false, foreign_key: true
      t.timestamps
    end
  end
end
```

**長いテーブル名&カラム名に外部キー制約を設定しようとしていました。**

# エラー文
実行すると...

```ruby
Index name 'index_foo_bar_example_registrations_on_parent_example_table_name_id'
 on table 'foo_bar_example_registrations' is too long; the limit is 63 characters`
```

どうやら63文字に収めないといけないようです。

#　解決方法

:::note info
作成するインデックス名を明示してあげる。
:::

外部キーを設定する際にインデックス名を設定しないと、自動的にRailsが生成してくれます。
しかし、postgresで使う名前は63バイトに限定されている為、このエラーが発生します。

そこで↓のように変更を加えます。

``` ruby
class CreateFooBarExampleRegistrations < ActiveRecord::Migration[6.0]
  def change
    create_table :foo_bar_example_registrations do |t|
      t.references :parent_example_table_name, null: false, foreign_key: true,
                    index: { name: :index_foo_bar_regs_on_parent_example_table_name_id }
                    # ↑省略したインデックス名を設定してあげる。
      t.timestamps
    end
  end
end
```

## 名前の付け方
基本は
`index_<テーブル名>_<外部キー制約を設定するカラム名>_id`
というインデックスが張られるので、その規則に合わせて名前を短縮してあげると良いと思います。
LinuxでCSVファイルに連番を付ける


テキストファイルに連番を更新するには、nlコマンドを使う。
nlコマンドの形は、**nl [オプション] [元ファイル] > [新ファイル]**の形となる。

```
$nl -w1 -s ',' ./test_userkey.csv > /test_userkey.csv
```


#### オプションの説明

**-s ','**は、連番と右側の文字列の間に「,」を付ける
**-w**は、フォーマットを指定する。-w2とすれば、1文字であれば、右側に半角1文字の余白ができる。余白とつけたくなければ、-w1とする。ちなみにだが、-w0というオプション指定はない。
WindowsユーザーがmacOSに乗り換えたときにした環境構築 (備忘録)

## はじめに
20年以上Windowsをメインに, 一部Linux(+WSL2)を使ってきましたが, Macbookを使うことになったので環境構築の備忘録を残します. 類似記事はありますが, 似た境遇の人の役に立てば幸いです.

## 環境
Macbook Pro (M1)

## TL;DR
### インストール/設定したもの
- Google Chrome
- Slackアプリ Mac版
- VSCode
- Docker Desktop for Mac
- Homebrew
- Git
- Postman Web

## Google Chrome
公式サイトでAppleプロセッサ搭載のMacを選択
## Slackアプリ Mac版
Mac App Storeからインストール (M1ネイティブ用がインストールされる)
## VSCode
公式サイトでApple Silicon用のzipをダウンロードしインストール
## Docker Desktop for Mac
公式サイトからdmgをダウンロードしインストール
## Homebrew
このタイミングでHomebrewをインストールしました
公式サイトにある以下のコマンドを実行

```sh
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

以下のWarningが出る

```sh
Warning: /opt/homebrew/bin is not in your PATH.
  Instructions on how to configure your shell for Homebrew
  can be found in the 'Next steps' section below.
```

パスがないと言われているので~/.zshrcにパスを追加

```sh
vi ~/.zshrc
```

```~/.zshrc
PATH=/opt/homebrew/bin
```

## Git
Gitは最新バージョンに上げます

```sh
brew install git
```

## Postman
Desktop版もありますが, 一旦はWeb版を使うことにしました
アカウント作ってブラウザから使用

## 番外
シェルはデフォルトのzshをそのまま使います
WSL2ではbashを使ってきましたが, zshはbashを拡張しており便利だという内容を聞くためです

## 参考サイト
https://zenn.dev/hinastory/articles/71983c4ac8aa2d
DockerでMailcatcherを使ってRuby on Rails開発環境のメールを受信する

Mailcatcherの概要は公式サイトで色々記載されています：https://mailcatcher.me

letter_opener も Ruby on Rails 開発環境のメールがテストできるが、個人的には Mailcatcher の方が便利で使いやすいので、よく使います。

# docker-compose設定

```yaml:docker-compose.yml
mailcatcher:
  image: schickling/mailcatcher
  container_name: mailcatcher
  ports:
    - '1080:1080'
    - '1025:1025'
```

Dockerを起動したら「localhost:1080」で管理画面にアクセスできます。


![スクリーンショット 0003-10-30 22.10.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35605/6e67d721-a5c9-7f9c-d759-e70853ffd5c1.png)


# development.rb設定

```ruby:config/environments/development.rb
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = { address: 'localhost', port: 1025 }
config.action_mailer.raise_delivery_errors = true
```

# Dockerを使わない場合

### Mailcatcherのgemインストール

```
gem install mailcatcher
```

### Mailcatcherを起動

```
mailcatcher
```
Windows11にSQLServer2019をインストールしようとするとエラーになる件について

#現象
Windows11にSQLServer2019を新規インストールしようとすると、インストール中に以下のエラーが発生し、インスタンスが起動できなくなります。エラーの内容は以下の通り。

「データベース エンジンの復旧ハンドルの待機に失敗しました。考えられる原因については、SQL Server エラー ログを参照してください。」

#環境
エラーが出る環境は以下のとおりです。

CPU:Ryzen7 5800H
メモリー:16GB
HDD:512G

#調べてみる
このエラーについて、Google等で検索をすると、大体がサービス開始時のユーザアカウントを変更すると問題なく起動するとありますが、どのユーザに変更してもエラーとなります。
また、Windows8からの環境でUTF-8絡みのエラーもあるようですが、今回はそれも違っていました。

#結論
~~Dドライブに入れろ~~

~~冗談のようですがこれが正解です。
海外のマイクロソフトのQAフォーラムに同様の質問があり、そこに答えがありました。
しかし、注意点が1つあります。Cドライブ以外にインストールするとうまくいくのですが、１ドライブ構成でパーティションを切った状態だとうまくいかないようです。自分の環境でも物理的にDドライブがあったため、成功しています。（インスタンスのみDドライブにインストールするといいという情報もあります。）~~

~~また、Windows10からアップグレードした環境は問題なかったとの情報もあります。~~

~~SSMSはCドライブでも問題ありません。~~

コメント欄で「@togo13duke」様のご指摘いただいた通り、M2.SSDが原因でした。
ただ、Dドライブにインストール自体は成功します。サービスはOSの起動時にうまく起動しないのでどのみちM2.SSD環境ではだめだと思います。

#まとめ
~~バグなのか仕様なのかは不明なので何とも言えません。今後修正されている可能性もあるので最新バージョンでインストールした場合、うまくいく可能性もあります。~~

~~日本語の情報がなかったのでとりあえず急ぎで書きました。何かの参考になればと思います。
解決してるとか情報があれば記事を修正します。~~

調査不足で何となくの回答を書いてしまったので恥ずかしい限りです。
コメント欄で教えていただいた「@togo13duke」様ありがとうございます。
クラス名、行番号、メソッド名をタグにセットしてログを出力する (Android Studio + Java)

ここで紹介しているログ出力クラスの名前がスタックトレースに出現するまでスタックトレースを最後から最初に向かって遡って行きます。出現したその一つ手前のスタックが目的のスタックです。そこから、呼び出し元のクラス名、メソッド名、行番号を取得しています。

```java:Debug.java
import android.util.Log;

public class Debug {
    static String m_selfClassName;

    static {
        m_selfClassName = Debug.class.getName();
    }

    public static void print() {
        Log.d(getPlace(), "-");
    }

    public static void print(String text) {
        Log.d(getPlace(), text);
    }

    private static String getPlace() {

        StackTraceElement[] trace = Thread.currentThread().getStackTrace();
        int length = trace.length;

        String className = "";
        String methodName = "";
        int lineNumber = 0;

        for (int j = length - 1; j > -1; j--) {
            String tempClassName = trace[j].getClassName();

            if (tempClassName.equals(m_selfClassName)) {

                String name = trace[j + 1].getClassName();
                String[] arr = name.split("\\.");
                className = arr[1] + "." + arr[2];

                methodName = trace[j + 1].getMethodName();
                lineNumber = trace[j + 1].getLineNumber();
                break;
            }
        }
        return String.format("%-40s %-25s===>", className + "(" + String.valueOf(lineNumber) + ")", methodName);

    }

}
```
pythonのcallable関数の使い方についてまとめてみた

今回のお題
-
今回はpythonのcallable関数についてまとめます。

関数自体はそこまでややこしいものではないのですが、疑問に思った箇所を自分で実験して調べたので記念に残しておきます。

目次
-

- 関数の概要
- 呼び出し方の注意点

関数の概要
-
callable関数は、引数にとった関数やクラスが呼び出し可能かどうかをTrue or Falseで返します。

以下、簡単な呼び出し例です。

```python
def divide(a, b):
  return (a / b)

class Test:
  pass

print(callable(sum)) 
# 出力：true
# 組み込み関数は呼び出し可能

print(callable(hoge))
# 出力：false
# 未定義の関数は呼び出し不可

print(callable(divide))
# 出力：true
# 定義済みの関数もOK

print(callable(Test))
# 出力：true
# 定義済みのクラスもOK

print(callable(Fuga))
# 出力：false
# 未定義のクラスは呼び出し不可
```
基本的にメソッドやクラスには引数は設定しません。

また、pythonの世界では関数やクラスを変数の中に格納することができるので、その状態でcallable関数に渡すこともできます。

```python
def divide(a, b):
  return (a / b)

class Test:
  pass

v = divide
w = "divide"

x = Test
y = "Test"

print(callable(v)) # true
print(callable(w)) # false: 関数として代入する場合は""をつけない

print(callable(x)) # true
print(callable(y)) # false: クラスとして代入する場合は""をつけない
```

呼び出し時の注意点
-
基本的な使い方は上記の通りです。

ここからはcallable関数を使う上でのNGパターンをいくつか紹介します。

なお、書籍や公式ドキュメントからは情報が見つけられなかったため、基本的には自分で実験して得た結果になります。

その点はご了承ください。

```python
def divide(a, b):
  return(a / b)

class Test:
  def __init__(self, name):
    self.name = name

class Sample:
  pass

print(callable(divide(1, 3))) # 関数に引数をつけた場合はfalseになる

print(callable(divide("a", "b"))) # エラーが出るような引数を設定するとfalseが返らずにプログラム自体が止まる（通常のエラーと同じ）。

print(callable(Test("John"))) # クラスに引数をつけて呼び出した場合もfalseになる

print(callable(Sample("John"))) # 引数を取れないクラスに引数を渡した場合もプログラムが止まる。
```

終わりに
-
以上でcallable関数の解説を終わります。

ロジックは簡単ですが、呼び出し方に注意したいですね。
Ruby on RailsアプリでAWS SESを使ってメールを送信する方法（設定から実装まで）

前はずっとSendGrid経由でメール送信機能を使っていましたが、せっかくAWSでアプリケーションをデプロイするのでAWSのサービスを使いたかったです。その為メール送信機能をSendGridからAWS SESに移動しました。

では、簡単に言うと Amazon Simple Email Service (SES) は、デベロッパーが任意のアプリケーションでメールを送信できるようにする、費用対効果の高い、柔軟でスケーラブルなメールサービスです。

# SES設定

## sandboxから移動

新規AWSアカウントではSESの制御があるます、確認済みのアドレスしか送信できなくて、1日最大200メールや1秒にあたり1メールなどの制限があります。
なので本番で使用できるにはリクエストをしなければなりません。

リクエスト方法はまずこのリンクにアクセス：http://aws.amazon.com/ses/fullaccessrequest

自分の場合は画像のように入力したら半日後で承認されました。

![スクリーンショット 0003-10-30 11.54.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35605/7d0d1ddd-ce56-dcc4-7841-06406beedbc7.png)

![スクリーンショット 0003-10-30 11.54.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35605/82592232-dc06-5e83-5e00-b119d8a7c1d0.png)

![スクリーンショット 0003-10-30 11.54.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35605/ccace47a-4bd3-2e9a-feb2-9540bde5d0b8.png)

承認成功通知メールが届いたらドメインの設定をします。

## ドメイン設定

Amazon　SESサービスのメニューから「Verified identities」に遷移して、「Create identity」をクリック
Identity typeは「Domain」を選択し、アプリケーションのURLだけ入力してから作成します。

![スクリーンショット 0003-10-30 20.30.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35605/0dae49fa-9f02-1d15-3dd6-3fd20912d1f4.png)

作成したドメインをクリックして、「Authentication」タブにある「View DNS records」をクリックするとCNAMEの値が現れるはずです。それぞれの名と値をコピーします。

![スクリーンショット 0003-10-30 20.31.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35605/e49e0059-0905-8edb-0d00-df5536f8937d.png)


## DNS設定

自分の場合はonamae.comでDNSレコードを追加します。先コピーしたCNAMEレコードをそれぞれ追加して保存します。

![スクリーンショット 0003-10-30 20.33.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35605/15b2d9c7-744b-69d5-3866-4337fc158431.png)

## ドメイン確認

それからAWS SES側の「Verified identities」に遷移して、問題なければ少し待つとステータスが「Verified」になります。自分の場合は大体5分以内でステータスが変わりました。

![スクリーンショット 0003-10-30 20.34.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35605/3daa4602-ca0f-7d4d-01b4-ab11286cf5df.png)

ここまではSES側の設定が完了です！


# IAMユーザ設定

アプリケーションからSES経由でメール送信するには「AmazonSESFullAccess」ポリシーを持つIAMユーザが必要です。そのポリシーをユーザまたはグループに添付します。

![スクリーンショット 0003-10-30 19.13.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35605/609e2a7f-042d-0279-d691-046377149aa1.png)

そして、そのIAMユーザのアクセスキーIDとシークレットアクセスキーが手に入ったら、AWSコンソール側の設定が完了です！

# Rails アプリケーション設定

## aws-sdk-railsというGemを導入

```ruby:Gemfile
gem 'aws-sdk-rails'
```

## production.rbでSESを使う設定

```ruby:config/environments/production.rb
  credentials = Aws::Credentials.new(ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY'])
  Aws::Rails.add_action_mailer_delivery_method(
    :ses, 
    credentials:, # Ruby 3.1の文法
    region: 'ap-northeast-1'
  )

  config.action_mailer.default_url_options = { host: 'imeezi.com' }
  config.action_mailer.delivery_method = :ses
  config.action_mailer.perform_deliveries = true
  config.action_mailer.perform_caching = false
  config.action_mailer.raise_delivery_errors = true
```

## ENV['AWS_REGION']環境変数設定
regionは「us-east-1」以外ならこの環境変数が必要です。

自分の場合はfigaroを使って環境変数を設定するので、EC2にアクセスしてapplication.ymlファイルを編集します。

```
AWS_REGION: 'ap-northeast-1'
```

以上です。やっと本番でメールが送信できました！
選択したCellのTextLabelの値を画面遷移先のnavigationItem.titleに反映

#今回の内容

<img width="150" alt="0450FA69-2365-40CD-AA75-7BC7223DB89F_1_105_c.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466343/5eafb19d-108c-6feb-6127-c28a74b0189d.jpeg"> <img width="150" alt="2536BBA0-E76B-479F-BD24-7B0DF4CA438D_1_105_c.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466343/ccc74b70-82d9-a702-68f1-078a32a64cf7.jpeg">


#コードと簡単解説
<img width="400" alt="D17A2E94-908A-4569-97E1-4A4DC5526968_1_105_c.jpeg"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466343/09879eee-2ab9-4219-692c-1c736c659a3c.jpeg">


* `func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {}`での処理 
 * `tableView.cellForRow(at: indexPath)`でまずは、選択した`Cell`を取得します。

 * その後、画面遷移先の`.navigationItem.title`に選択した`Cell`の`textLabel?.text`を反映させる為に`selectCell?.textLabel?.text`の値を利用してます。

```Swift:
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!
    
    let titleDatas = ["Swift","Kotlin","Dart","Python","Ruby","Java","PHP","Go","JavaScript","TypeScript","C#","C++",]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        tableView.dataSource = self
        tableView.delegate = self
    }

}

extension ViewController:UITableViewDelegate{
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        
        let selectCell = tableView.cellForRow(at: indexPath)
        
        let secoundVC = storyboard?.instantiateViewController(identifier: "secoundVC") as! SecoundViewController
        secoundVC.navigationItem.title = "\(selectCell?.textLabel?.text ?? "error")を選択"
        navigationController?.pushViewController(secoundVC, animated: true)
        
    }
}

extension ViewController:UITableViewDataSource{
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        return titleDatas.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        
        cell.textLabel?.text = titleDatas[indexPath.row]
        
        return cell
    }

}
```


#終わり
ご指摘、ご質問などありましたら、コメントまでお願い致します。
go buildはできるのに、VSCodeでgolangのimportがエラーと表示される

めちゃくちゃ詰まったのでメモ。

## 事象

`go build`, `go run hoge.go`は正常に動くのに、VSCode上でimportが解決できないとエラーが表示される。

## 原因
VSCodeで複数のgoのリポジトリを開いているのが原因っぽいです。

```
VSCodeで開いているフォルダ
└ リポジトリその1
└ リポジトリその2
```

と開くと、`gopls`がうまく動かないみたいです。
(疲弊しきって深掘りする気力がなかった・・・)

新しいウィンドウでひとつのリポジトリを開いたら解決しました。

複数のgoのリポジトリをひとつのウィンドウで開きたい場合は、
リポジトリその1をはじめに開いたあと、`Files > Add Folder to Workspace...`にて対応するとよさそうです。


こんな使い方してたの自分だけなのかな・・・
【Python】Cartopyを使って日本地図を作成


## 概要
Cartopyを使って日本地図や世界地図を描く

完成図（ソース上の`cartopy.png`）はこちら。
![cartopy.png](https://user-images.githubusercontent.com/93382642/139532922-de52676b-896e-4726-ad43-5dbdfb79c721.png)






## 環境
Python:     3.9
pip:        21.3.1
Cartopy:    0.19.0
matplotlib: 3.4.1

## インストール
Cartopyやmatplotlibをインストールしていない場合は、`pip`でインストールしてください。
`conda`でも問題ないと思います（未確認）。

```bash:bash
pip install cartopy
```
```bash:bash
pip install matplotlib
```

## 実際に描いてみた

```python:cartopy.py
import cartopy.crs as ccrs
import cartopy.feature as cfea
import matplotlib.pyplot as plt
  
# 描画サイズ指定
plt.figure(figsize=(10, 10))
ax = plt.axes(projection=ccrs.PlateCarree())
  
# ラベル表示
ax.gridlines(draw_labels=True)
  
# 描画位置（Lon, Lat）指定
ax.set_extent((120.0, 160.0, 30.0, 50.0), ccrs.PlateCarree())
  
# 海洋と陸地の色を指定
ax.add_feature(cfea.OCEAN,color='#00FFFF')
ax.add_feature(cfea.LAND,color='#32CD32')
  
plt.title('japan', fontsize=15)
  
# 画像保存
plt.savefig('cartopy.png')
```

## 詳細

GitHubにもソース等を置いています。

https://github.com/khfkd/cartopy
SHA-1をAndoridStud4.2で確認

#内容
Androidのプッシュ通知機能を実装するためにFirebaseにアプリ登録をする際にSHA-1の入力が必要で、AndroidStudioでの確認方法を調べて実施したがうまくいかなかった。
AndroidStudioのGradleタブ内にapp>signingReportという項目があるらしいが見つからない。
AndroidStudio4.2から表示されなくなったらしい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539454/e751bc77-30ce-1fbc-2fff-92da208a38ad.png)

色々ググって解決した方法を備忘録として投稿しておきます。

#SHA-1確認方法

Terminalで以下のコマンドを__「CTRL+ENTER」__で実行するだけ。

```terminal
gradle signingReport
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539454/9b26492a-cf6c-3c8b-d9bd-bf4f929caaaa.png)


こんな感じでRunタブで確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539454/bb76bd06-312d-896a-69c0-175f8fc02848.png)

#参考リンク
[android studio 4.2 doesnt show signing report in gradle bar](https://stackoverflow.com/questions/67490537/android-studio-4-2-doesnt-show-signing-report-in-gradle-bar)
HTMLにjQueryUIの動作環境を作る

## 手順

### 1 VSCodeにHTMLの雛形を作成

VSCodeを起動して、Emmet記法を利用して、*! + Enter*でHTMLの雛形を作る

```
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
  </head>
  <body>        
  </body>
</html>
```

### 2 jQueryの公式サイトよりCDNを記述

jQueryの公式サイトを参照する。
Download－Using jQuery with a CDNから、To see all available files and versions, visit https://code.jquery.comのリンクを参照する。使いたいjQueryのバージョンを指定して、CDNをコピーしてHTMLに貼り付ける。（テストで使う分には、最新のバージョンのuncompressedを選択でOK）
コピーしたCDNをHTMLのbodyの直下の部分に貼り付ける。bodyの直下に書くのが今のトレンド。

上記と同じサイトに、jQueryUIのリンクも同じようにコピーして、HTMLのbodyの直下に貼り付ける。

jquery-3.5.1.jsが、jQuery本体で、jquery-ui.jsがjQueryUIとなる。

```
<body>
  <script src="https://code.jquery.com/jquery-3.5.1.js" integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=" crossorigin="anonymous"></script>
  <script>
  <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js" integrity="sha256-T0Vest3yCU7pafRw9r+settMBX6JkKN06dqBnpQ8d30=" crossorigin="anonymous"></script>
</body>
```

### 3 jQueryUIのCSSファイルのリンク先を記述

上記のjQueryのCDNのリンクサイト内に、jQueryのThemes（テーマ）があるので、好きなテーマを選んで、CSSのリンクをHTMLにコピペする。コピーする方法は、JSファイルのように、CDNのリンク先がコピーできるようになっていないため、Themesのリンクを右クリックして、リンクのアドレスをコピーとしてから、HTMLファイルに貼り付けるといった手順になる。（詳細はここに詳しい http://vdeep.net/jquery-jqueryui-cdn）

ヘッダに書くか、ボディに書くかは迷うところだが、body部の、jsファイルのCDNを記述している行の上でOK。

```
<body>
  <link rel="stylesheet" href="https://code.jquery.com/ui/1.12.1/themes/smoothness/jquery-ui.css">
  <link rel="stylesheet" href="コピペする部分">   # サンプル
</body>
```

### 4 スクリプトを書く

スクリプトを書く場合は、必ず、CDNを組み込んだ部分の下に書くこと。

```
<body>
  <link rel="stylesheet" type="text/css" href="style.css">
  <script src="https://code.jquery.com/jquery-3.5.1.js" integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=" crossorigin="anonymous"></script>
  <script>
    // ひと昔は全てこの内部に書いていた
    // readyはHTML全体が読み込まれた後に実行するメソッド
    $(document).ready(function(){

    });

    //今の書き方
    $(function(){

    });
  </script>
</body>
```

## jQueryUIとは

> jQueryUIとは、jQueryのUI(ユーザーインターフェース)系ライブラリのプラグインの事。色々なthemes（テーマ）が用意されている。テーマとはデザインの事で、テーマを差し替えるだけで、デザインの印象を変える事ができる。jQueryUIを導入するには、jquery-ui.jsとjquery-ui.cssの２つのファイルが必要になる。cssファイルがテーマファイルになる。

> どのテーマがどのようなデザインになっているかを調べるサイト　
https://javascript.programmer-reference.com/jqueryui-theme/
【Nuxt.js】ボタンコンポーネントの作成について

#はじめに
こんにちは。
こちらの記事では、Nuxt.jsでボタンコンポーネントの作成方法を記しています。
誤っている点がございましたらコメントいただけると幸いです。

##実装手順
ボタンの文章、遷移先リンク、色を指定できるように実装します。
（スタイルはTailwindcssで指定しています）

###1. ボタンコンポーネントの作成
componentsディレクトリに、ボタンコンポーネントのファイルを作成して、templateを記述します。

>プロジェクト名/
　├ components/
　│ └ appButton.vue
　└ pages/
　　 └ index.vue
>

```html:appButton.vue
<template>
  <div class="container mx-auto">
    <div
      class="flex items-center justify-center mx-auto w-4/5 h-12 rounded-full cursor-pointer md:w-2/4 md:h-16"
      :class="[btnColor, `hover:${colorOnHover}`]"
    >
      <p>
        <nuxt-link :to="link" class="w-full text-white text-xl md:text-2xl">{{
          text
        }}</nuxt-link>
      </p>
    </div>
  </div>
</template>
```
divタグの`v-bind:class`で、バインドすることでJavaScriptのプロパティを使用することができるようになり、配列で複数のクラスプロパティを使用できるようにする。hoverアクションは、バッククォートを含めたテンプレート文字列``${` `}``で表示する。
ボタンの文章はnuxt-linkの`{ text }`で、遷移先リンクは`v-bind="link"`で記述する。


###2. ボタンコンポーネントの初期値設定
script側で、propsでボタンの文章、遷移先リンク、色初期値の設定を行います。
propsのタイプはすべて文字列型（String）で、それぞれデフォルト値を設定している。

```javascript:appButton.vue
<script>
export default {
  props: {
    text: {
      type: String,
      default: ""
    },
    link: {
      type: String,
      default: "/"
    },
    btnColor: {
      type: String,
      default: "bg-red-300"
    },
    colorOnHover: {
      type: String,
      default: "bg-red-400"
    }
  }
};
</script>
```

###3. ボタンの表示
表示させたいページのファイルにボタンコンポーネントを記述する。

```javascript:index.vue
<template>
  <div class="container mx-auto">
    <myButton text="サービス" link="/service"></myButton>
    <myButton text="ホーム" link="/home" btnColor="bg-blue-300" colorOnHover="bg-blue-400"></myButton>
  </div>
</template>
```

ボタンの文章、遷移先リンク、色をコンポーネントごとに指定することができました。
サービスボタンは色を指定していないので、初期値の`"bg-red-300"`クラスが適用されている。

<img width=“200” src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966101/6645a791-9518-eacd-bec9-0e9af397b506.png">


<br>


#おわりに
ここまでボタンコンポーネントの作成方法についてまとめました。
コンポーネントのデータの受け渡しには、propsのValidationで関数を扱う方法やSlotではHTMLのタグの操作ができる方法もあるので、学びながら記事にしていきたいと思います！

以上、最後まで読んでいただきありがとうございました！
STM32L010とGPIOで約800khz(1.25us)を作る(節電4MHz内部電圧1.5V) HAL

STM32L010とGPIOで約800khz(1.25us)を作る(節電4MHz内部電圧1.5V) HAL

x Mbedのリビジョン143

目的
GPIOのテスト

いろいろ
ごめん、当然、速度が上がらなかった。
667kHzで妥協
たぶん、秋月で買ったWS2812Bは、光るはず。
俺に続け!!
LED1個分(約5mA)を努力の結果、節電 ボタ電駆動できるかも?
VSCのcubeideに移植できるかも?




```c++


/* STM32L010F6P6  -> Mbed NUCLEO-L011K4 program by caa45040 */

//IO Sppd is The 667.53kHz (1.499us)

#include "mbed.h"

#define on1   0b0000000000010000
#define off1  0b0000000000000000

//DigitalOut myled(PA_4);

int main() {

    //クロックの初期化
    HAL_RCC_DeInit();

    //電圧を下げる
    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);//4Mhz 1.5 560uA

    /* 4MHz */
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
    RCC_OscInitStruct.HSIState = RCC_HSI_DIV4;
    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
    HAL_RCC_OscConfig(&RCC_OscInitStruct);
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                                  |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
    HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);

    /* PA4 OUTPUT MODE */
    __HAL_RCC_GPIOA_CLK_ENABLE();
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = GPIO_PIN_4;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    __disable_irq(); // disable interrupt
    //__enable_irq(); // enable interrupt

   //1:1
    while(1) {

        //1
        GPIOA->ODR = on1;
        GPIOA->ODR = on1;
        GPIOA->ODR = on1;

        GPIOA->ODR = off1;
        GPIOA->ODR = off1;


        //2
        GPIOA->ODR = on1;
        GPIOA->ODR = on1;

        GPIOA->ODR = off1;
        GPIOA->ODR = off1;
        GPIOA->ODR = off1;



    }//while

}//main


```
「Spotlight検索」(Mac) ／「ここに入力して検索」(Windows) の活用

こんにちは
Mac では「Spotlight検索」、Windows では「ここに入力して検索」（タスクバーの検索ボックス）を活用すると、文字入力による素早いグローバル検索ができます。

なおさらに効率を上げるための一工夫としては、

* 英語名で検索
  * 例： System Preferences 「システム環境設定」、Contacts 「連絡先」
* ショートカット（キーバインド）により検索欄を表示、同時に文字入力可能状態とさせる

#### ドック／タスクバー
アプリケーションを、ドック(Mac)／タスクバー(Windows) に登録すると、マウスクリック操作で起動できます。上記を補う方法に使えます。
Rails7に標準装備される「import maps」の概要

## イントロダクション

現在のRailsは、プロジェクト作成時のオプションで「—api」と入力することで使える「APIモード」として、サーバーサイドのみで使われることが多い（実際に私の勤めてきた企業の多くはそうであった）が、Railsの作者であるDHHこと、デイヴィッド・ハイネマイヤー・ハンソン氏は、RailsがAPIのみの用途とされることを推奨はしていないようだ。

なぜなら、今回のRails7のアップデートによって、Railsが大きく進化した箇所は「JavaScript」に関することばかりなのだから。

もっとも、大きなプロジェクトをこなす上では、やはりフロントエンドとバックエンドは切り離されることが多いだろう。

だが、小規模開発において、フロントエンドを含めた全てがRails標準のアセットパイプラインのみで完結するのならば、それは個人開発者にとって嬉しいニュースなのではなかろうか。

実際に今私が開発している小規模なWebサービスの構築は、全てがRailsに依存している。
その中でどうしても苦しくなってくるのはJavaScript関連の実装だ。

そして、それが今回のRails7へのアップデートで改善されるのかもしれない。



## import maps（インポート マップス）
「import-map-rails」というGemがRails7には最初から入っているといった感じです。
GitHub: https://github.com/rails/importmap-rails


これが実装されることにより、Webpack, Yarn, npmは不要となり、Railsが最初から用意しているもの（アセットパイプライン）だけでJavaScriptの実行ができるようになります。

```javascript
{
  "imports": {
    "http": "https://deno.land/std/http/server.ts"
  }
}
```

```javascript
import { serve } from 'http'

const body = new TextEncoer().encode('Hello World\n')
for await (const req of serve(':8080')) {
  req.respond({ body })
}
```

このように、設定したキー名だけでインポートできるようになります。
Railsでcssの値を切り替える

自分のポートフォリオを触っているときに、ちょっと表示の有無を設定したいと思いました。
今回表示の切り替えをしていのは、ログインや新規登録を促す画面です。
私が作っているのは写真投稿サイトです。タグを用いて検索した場合はこの表示を消したいと思います。
ログインなしでも投稿の閲覧はできるため、あってもいいかなと思いました。

#実装

cssの切り替えですが、基本的にはjavascriptを用います。
最低限のjavascriptで簡単にできないかなと考えました。

javascriptで何か動きをするにはイベントを設定しないといけません。
例)　click, dbclick, onload,,,,,

[イベント一覧はこちら](https://web-designer.cman.jp/javascript_ref/event_list/)


javascriptでcssの値を変えるには

```
$('cssセレクタ').css('プロパティ : 値')

#change-colorクラスの値を赤にしたい時

$('.change-color').css('color : red')
```

と書きます。
私が想定しているのは特定のページに遷移したとき、ロードされたときに表示を消すようにしたい

使用するイベントは`onLoad`

```
window.onload = function() {
  $('.cssセレクタ').css('display : none')
}
```

とします。

ただこれだと、リロードが入るために表示が消されるので、ちょっと工夫します。

さっきのコードはcssセレクタに新しい処理を追加するという動作なので、

cssセレクタの方も、特定の条件で付与するようにします。

ここでどうやって値を渡そうかなと考えたときに、controllerから渡すことを考えました。
そしてどうやって渡した値を使うのかというと

```
<div class="container bg-light">ここに追加したいとしたら
↓
<div class="container bg-light <%= @selector %> ">
@selectorの中にcontrollerからもらった値(cssセレクタ)を追加します
```

controllerでは,

```ruby:posts_controller.rb
 
def index
  if params[:keyword]
    @selector = "display" ← 適当に名前をつけてください
  end
end
```

ここではindexアクションが呼ばれたときにkeywordが送られていたら、`@selector`に`display`というcssセレクタを代入するとなります！

ここでjsのファイルを書き換えると

```ruby:javascript
window.onload = function() {
  $('.display').css('display : none')
}
```

これでcssセレクタと、その中身を一緒に送ることができます！