OmniAICreator/Qiita-1.07M huggingface dataset:
vimコマンドの一覧

<h1>起動</h1>
コマンド	|内容
--|---
vim <ファイル名>	|vimエディッタの起動（既存のファイルを編集）
vim <新規ファイル名>	|vimエディッタの起動（新規ファイルを作成＆編集）
i	|挿入モード切り替えつ（カーソルに合わせて）
Esc	|挿入モード終了、ノーマルモード切り替え
※vim起動時は「ノーマルモード」で開始される

<h1>終了</h1>
コマンド	|内容
--|--
:q	|Vimの終了（変更があれば場合は終了できない）
:q!	|変更の破棄＋Vimの終了（保存せずに強制終了）
ZZ	|上書き保存＋Vimの終了（元に戻す方法ないので注意）
※「：」コマンドラインモードの開始を指定する時は、コマンド＋Enterキーで実行

<h1>移動</h1>
カーソル移動

コマンド	|内容
---|---
h	|左へ移動
j	|下へ移動
k	|上へ移動
l	|右へ移動
※矢印キーでも可能

単語ごと

コマンド	|内容
--|--
w	|１単語ごとに移動（後）
b	|単語ごとに移動（前）
e	|次の単語に移動（末尾）
ge	|直前の単語の末尾に移動

行

コマンド	|内容
---|---
$	|行末に移動
0	|行頭に移動
^	|最初の非空白文字に移動

文字

コマンド　|内容
--|--
fx	|その行にある文字（x）へ右向きに移動
Fx	|その行にある文字（x）へ左向きに移動
tx	|その行にある文字（x）の直前に移動（右）
Tx	|その行にある文字（x）の直前に移動（左）

カッコ

コマンド　|内容
--|--
%	|対応するカッコへ移動
カーソルがカッコの上にない場合、前方検索する
カーソルがカッコの上にある場合、後方検索する

特定の行

コマンド　|内容
-|-
G	|33Gとすれば３３行目にジャンプできる
gg	|ファイルの先頭にジャンプ
%	|９０％とすればファイルの９０％の場所に移動
H	|画面上に見えている行に移動したい（上）
M	|画面上に見えている行に移動したい（中）
L	|画面上に見えている行に移動したい（下）

スクロール

コマンド　|内容
-|-
CTRL-U	|画面の半分だけスクロール（下）
CTRL-D	|画面の半分だけスクロール（上）
CTRL-E	|１行だけスクロール（上）
CTRL-Y	|１行だけスクロール（下）
CTRL-F	|１画面分スクロール（下）
CTRL-B	|１画面分スクロール（上）
zz	|カーソル位置から前後の行を表示
zt	|カーソル位置を画面の１行目として表示

<h1>文字の挿入</h1>
コマンド　|内容
-|-
i　|カーソル位置からインサートモードに切り替え
o　|空行を下に追加して切り替え
O |空行を上に追加して切り替え
a　|末尾に移動して切り替え

<h1>削除</h1>

コマンド	|内容
-|-
x	|１文字削除
dd	|行の削除
J	|改行の削除
	
<h1>取り消し/やり直し</h1>

コマンド	|内容
-|-
u	|1つ前に戻る（直前の編集結果を取り消し）
U	|1つ前に戻る（直前に編集した行全て）
ctrl + R	|1つ後に戻る（直前の編集をやり直し）

<h1>カウンタ</h1>

コマンド	|内容
-|-
kkkkkkkkk	|９回上へ移動
9k	|９回上へ移動
※コマンドは回数を数値で指定できる

<h1>ヘルプ</h1>
コマンド	|内容
-|-
:help	|バージョンに即した総合案内を表示（F1キー、Helpキーでも可）
:help {subject}	|特定のヘルプ項目を参照
:help x	|コマンドのヘルプを参照
:help deleting	|文字の削除方法を参照
:help index	|vimコマンドの一覧を参照
:help CTRL-文字	|ノーマルモードのコントロール文字コマンドのヘルプを参照
:help i_CTRL-H	|挿入モードコマンドのヘルプを参照
:help v_o	|ビジュアルモードコマンドのヘルプを参照
:help -文字	|コマンドライン引数のヘルプを参照
:help '文字'	|オプションのヘルプを参照
:help エラーID	|エラーIDのヘルプを参照
:help helphelp	|より詳しいhelpの使い方を参照

<h1>ヘルプウインドウの操作</h1>

コマンド	|内容
-|-
ZZ	|ヘルプウインドを終了（Vimは終了しない）
ctrl + ]	|タグジャンプ。ハイパーリンク上にカーソルを置いて、コマンドを実行するとそのタグへ移動
ctrl + T	|タグをポップする（元の場所に戻る）。ジャンプした後にコマンドを実行
ctrl + O	|古い場所へジャンプ
※「|」で囲まれた文字列をハイパーリンク（タグ）と呼ぶ
※「*」で囲まれた文字列はヘルプシステムのタグ（ハイパーリンクの飛び先）を指定

<h1>簡単な検索</h1>
コマンド　|内容
-|-
/文字列	|探したい文字列を検索
/#文字列	|カーソル位置から後ろを検索
?文字列	|探したい文字列を検索（逆方向）
バックスペースキー	|入力文字の訂正
Enterキー	|コマンドの実行
n	|指定した文字列を順々に移動
N	|指定した文字列を順々に移動（逆方向）
:set 'ignorecase'	|大文字小文字を区別させるオプション
:set 'noignorecase'	|大文字小文字を区別させるオプション
/↓or↑	|/だけ押して履歴を遡る。/oでoから始まる履歴を遡る。:にもヒストリ（履歴）がある
*	|文章中の単語検索。文章中の単語にカーソルを置いて、*コマンドで下方向を検索。#コマンドで上方向を検索
/the\>	|"the"で終わる単語を検索。\>は単語がここで終わるという意味
/\the\>	|文字数も含めた完全一致検索

<h1>簡単な検索パターン（正規表現）</h1>
コマンド　|内容
-|-
/^文字列	|行頭にある文字列にマッチ
/文字列$	|行末にある文字列にマッチ
/^文字列$	|完全に一致するものにマッチ
.	|任意の１文字に代替えできる
\.	|.を検索文字列として指定

<h1>マーク</h1>

コマンド　|内容
-|-
G	|ジャンプ後に直前のカーソル位置が記録（マーク）
``	|元の場所へ戻る
CTRL-O	|古いマークへジャンプ
CTRL-I	|新しいマークへジャンプ。Tabと同じ
:jumps	|いままでのジャンプ場所を一覧表示
ma	|文章へマークをつける。a..zまでを指定できる。
`a	|名前付きマークへ移動（画面には何も表示されない）
'a	|アーク設定してある行の行頭に移動

<h1>テキストの変更</h1>

コマンド |内容
-|-
c2wbe	|cはテキストの変更。2wは２単語削除して挿入モード切り替え。beはここの文字列を挿入
cc	|行全体の変更（インデントは残る）
x	|カーソルしたの文字を削除
X	|カーソル左の文字を削除
D	|行末まで削除
C	|行末まで変更
s	|１文字変更
S	|1行変更
rx	|カーソルしたの文字を置き換える。xは変更したい文字
r	|1文字削除＋改行の追加
5r	|５文字削除
5rx	|５文字削除してxを5つ挿入


参考
[vim日本語ドキュメント](https://vim-jp.org/vimdoc-ja/)
Windows 10に.Net 3.5をインストールする方法

Windows 10に.Net3.5を入れる必要があり、Microsoftのサイトからインストーラーをダウンロードし、インストールを試みたのですが、
「0x800f081f」や「0x800F0954」というエラーが発生し、うまくインストールできませんでした。
（いわゆる、ハマったというやつです、、、）

色々と調べた結果、やり方が分かったので、メモとして残しておこうと思います。

# 1. インストール前の準備
***1-1. WSUSを無効にする***
まず、レジストリーエディタを起動します。
![2021-05-03_00h22_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626057/2f56e400-b0ba-d095-5e42-12c2b6ce8fab.png)

次に、以下のキーを探し、値を[1] => [0]に変更します。
>**\HKEY_LOCAL_MACHINE¥SOFTWARE¥Policies¥Microsoft¥Windows¥WindowsUpdate¥AU**

![2021-05-03_00h24_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626057/79ec8999-17ee-143c-7bba-801fd64df5a7.png)

***1-2. Windows Updateを再起動する***
”サービス”を起動します (services.msc)。
![2021-05-03_00h28_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626057/f9f1a3dc-303a-bbd8-ba3a-057da8e9ec01.png)

次に、Windows Updateを探し、再起動します。
![2021-05-03_00h32_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626057/0c91b14e-60ce-d711-b3af-bda08fd0891f.png)

# 2. .Net 3.5のインストール
コントロールパネルを起動し、”プログラムと機能”を選択します。
![2021-05-03_00h36_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626057/d14e1865-9109-28d0-cab0-070845e5349c.png)

次に、*Windowsの機能の有効化または無効化* を選択し、*.NET Framework 3.5 (.NET 2.0および3.0を含む)* を選択します。

![2021-05-03_00h35_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626057/6c1cafee-a23c-591c-89fb-17a8067094e1.png)

# 3. レジストリーを元に戻す
ここまでで、インストールは完了できている（はず）ですので、先ほど変更したレジストリーを元に戻し、
Windows Updateを再起動して、作業は完了です。
（手順は、"インストール前の準備" と同じです。）
【Rails6 × React】devise_auth_tokenでのSNS認証時に初回ログインの場合のみ特定の処理を促す

## 環境

**API**

- Rails6.0

**フロント**

- React



## 目的

Omniauthを用いたSNS認証でのユーザー登録で初回ログイン時にSNS上のアカウント情報から一部変更したり追加情報の入力を促したりしたい。
devise_auth_tokenを用いているが、deviseでも基本は同じように設計していいと思う。



## 実装方法

### ①usersテーブルにTrackable系のカラムを追加する

```ruby
class AddColumnsToUsers < ActiveRecord::Migration[6.0]
  def change
    add_column :users, :sign_in_count, :integer, default: 0, null: false
    add_column :users, :current_sign_in_at, :datetime
    add_column :users, :last_sign_in_at, :datetime
    add_column :users, :current_sign_in_ip, :string
    add_column :users, :last_sign_in_ip, :string
  end
end
```

これらのカラムを追加。上から順に

- サインイン回数
- 現在のログインをした日時
- 最後にログインした日時
- 現在のログイン元IPアドレス
- 最後のログインしたときのログイン元IPアドレス

の情報を持っている

## ②models/user.rbにてtrackableを設定
```ruby
class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,  :trackable, #←これ
         :recoverable, :rememberable, :validatable, :omniauthable, omniauth_providers: [:twitter]
```
モデルにも設定が必要。逆に言うとこれだけでサインイン時に勝手にカラムに値が入っていく。


## ③omniauthでの認証時にユーザーが初回ログインかどうかを判定する

```ruby
def render_data_or_redirect(message, data, user_data = {})
  # 初回ログイン時にはcookieに情報をセット。Oauth認証後ユーザー情報の編集ページに飛ばす
  cookies[:first_session] = { value: true, path: root_path, expres: 10.minutes }  if @resource.sign_in_count == 0 
```

devise_auth_tokenではomniauth_callbacksコントローラーでユーザーが認証できた場合に
render_data_or_redirectメソッドが呼ばれる。このメソッドでアプリ側のページに返す直前で
保存したユーザーのsign_in_countが0の場合にCookie上にfirst_sessionという値を仕込む。期限は10分とかにしとく

## ④フロント側でCookieから初回ログインのtmpデータを取得する

```jsx
class App extends React.Component {

  componentDidMount() {
    const cookies = new Cookies();
    // ユーザー認証が済んでいる場合
    if (authToken) { 
      if (cookies.get('first_session')) {
        // 実際にはユーザー情報編集ページに飛ばす処理を入れる。次のブランチで
        alert('初回ログイン')
      }
      // 中略
      return authToken
    } else {
      return null
    }
  }
```

今回はルートコンポーネントのAppでログイン済みかどうかの判定をするので、
そこにcookieの中にfirst_sessionが存在しているかどうかの判定を行う条件式を実装。
なお、Cookieを読み込むライブラリとしては事前にuniversal-cookieを導入している。

```
npm install universal-cookie
```

## ⑤2回目以降のログイン時にCookieのtmpデータを削除する

tmpデータの有効期限が10分とかにしてるので、10分以内に2回ログインされることも想定して2回目以降のログインでは
Cookieのデータを削除するようにした。

```ruby
# 2回目以降のログイン時にはfirst_sessionのクッキーデータを削除
cookies.delete(:first_session, path: root_path) if cookies[:first_session]
```

### 挙動

ここまでの流れで挙動は以下のようになる。
![recommends-12-1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652172/f1639a37-526f-bd02-6b21-5f327dfffe8b.gif)


### 感想
思ったよりかんたんにできた。
Trackable系のカラムちゃんと使ったことなかったのでこういう使い方ができるのか、と感動した。
Cookieを使って条件分岐しているのでセキュリティ的にどうなの？とかはあるけど一旦置いておく。
[python] for 文の中で 配列.remove() をして要素を一部削除しようとしたが上手くいかなかった例

見てもらった方が早いです。
違いは for 文で回す配列が ``a`` か ``a.copy()`` かです。

```python:上手くいかないコード
a = list(range(10))

for i in a:
    if i == 1:
        a.remove(1)
    elif i == 2:
        a.remove(2)

a
```

```python:output
[0, 2, 3, 4, 5, 6, 7, 8, 9] # 2が削除されてない！
```


```python:上手くいったコード
a = list(range(10))

# a.copy() にした
for i in a.copy():
    if i == 1:
        a.remove(1)
    elif i == 2:
        a.remove(2)

a
```

```python:output
[0, 3, 4, 5, 6, 7, 8, 9] # 2が削除されている
```
【TP転職市場PJ日記その2】laravelの準備も出来たのでDB設計してこうか。

#さて…
laravelの環境構築も終ったので、設計周り着手していこうかと思うが
割と考えて作業しないと時間が無駄に掛かるので時間を掛けないといけないところ
をなるべく考えてやってみる。QCDな観点でみるやーつ。

#やらなきゃいけない設計を整理
思いつくのを列挙...

* 画面設計　→　ちょっとやる
* 処理設計（ざっくり詳細設計）　→　やらん
* DB設計　→　やる

これで行こうと思う。

#DB設計
書けるだけ書いてみた。
ちなみにUsersテーブルはlaravelのmygrationであったやつそのまま使おうと思う。
![DB.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570502/1229d74c-6841-1b57-42bc-653403a1ffe5.png)

各テーブルの説明

・Users:文字通りUserの管理
・Userdetails:ユーザーに紐づく情報管理用テーブル
※といっても今は気になっているユーザー数の集計件数ぐらいしか想定していないｗ
・teammaster : チームマスタ、TPチーム名や所属リーグを管理　サービス内のマスターを扱う
・leaguemaster : リーグ名マスタ
・recruting : 募集テーブル　募集データを扱う、TPチームからのメンバー募集・メンバーからの所属募集を扱う。

※Userテーブルのカラム（列）捕捉
・アカウント停止はよっぽど暇人がいた時用対策で用意。どんどんアクセス不能にさせたる意図で用意。ウイイレにもほしい機能だ＾＾＃
・TwitterのDM機能に送るようのTwitterIDも管理する。

#一旦はこれで要件を満たせるかチェック
・募集しているところ（チームもプレイヤー）がわかる →　よさげ
・評価の見える化（きになるの件数でどれぐらい気になったか）　→　いったんこれで
・既存SNSと連携　→　以下課題があるがいったんGO

#課題
・TwitterのAPIの制限がDM連携でオーバーしないようなロジックも検討。オーバーした場合の代替案としてメール送信で検討。
以下の記事を発見

```
ツイートの投稿やダイレクトメッセージの送信など、Twitterのデータベースに変更を加えるPOST系のAPIには、
一定時間あたりに利用できる回数に制限が課せられている。
ツイートおよびリツイート（合算値）：3時間で300件
いいね：24時間で1,000件
フォロー：24時間で1,000件
ダイレクトメッセージ：24時間で15,000件
```
今回の場合DMが該当するのではと思うが一旦件数だけ認識

#次回は
DBのカラム追加とログイン画面とメニュー画面の実装へ行きたいと思う。
がんばろ＾＾
畳み込み

# 2D畳み込み演算の表現
  |  |  |  | | |
|:-:|:-:|:-:|:-:|:-:|:-:|
|| a | b | c | d | e |
|| f | g | h | i | j |
|| k | l | m | n | o |
|| p | q | r | s | t |

上のような入力画像に対し、以下のような3＊3のカーネル(フィルター/チャネル)を使ってたたみ込むとする。
padding=same, stride=1,dilation rate=1とする。

|  |  |  |
|:-:|:-:|:-:|
| 1 | 4 | 7 |
| 2 | 5 | 8 |
| 3 | 6 | 9 |


gの欄に、畳み込みの結果割り当てられる値は
a+4b+7c+2f+5g+8h+3k+6l+9mとなる

カーネルの9がaに重なる時　最も左上となり、1がtと重なる時に最も右下となる。
総パターン数は（縦にカーネルが動ける行：4＋2）ｘ（横にカーネルが動ける列：5＋2）　＝　6行7列の　42通りとなる。
gの欄は3行3列目にあたる。

これを2つの行列の積で表現するには以下のように並べるとよいと思われる。

左からカーネルにあたる6行x12列

  | | | | | | | | | | | | | | | | |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| 3 | 0 | 0 | 0 || 6 | 0 | 0 | 0 || 9 | 0 | 0 | 0 |
| 2 | 3 | 0 | 0 || 5 | 6 | 0 | 0 || 8 | 9 | 0 | 0 |
| 1 | 2 | 3 | 0 || 4 | 5 | 6 | 0 || 7 | 8 | 9 | 0 |
| 0 | 1 | 2 | 3 || 0 | 4 | 5 | 6 || 0 | 7 | 8 | 9 |
| 0 | 0 | 1 | 2 || 0 | 0 | 4 | 5 || 0 | 0 | 7 | 8 |
| 0 | 0 | 0 | 1 || 0 | 0 | 0 | 4 || 0 | 0 | 0 | 7 |

を　右の入力値　12行x7列　に掛けて

  | | | | | | | | |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| 0 | 0 || a | b | c | d | e |
| … | … || f | g | h | i | j |
| … | … || k | l | m | n | o |
| … | 0 || p | q | r | s | t |
| | | | | | |
| … || a | b | c | d | e || 0 |
| … || f | g | h | i | j || … |
| … || k | l | m | n | o || … |
| 0 || p | q | r | s | t || … |
| | | | | | |
|| a | b | c | d | e || 0 | … |
|| f | g | h | i | j || … | … |
|| k | l | m | n | o || … | … |
|| p | q | r | s | t || 0 | 0 |

見やすさのために適宜空白を入れた。

dilation の幅は　入力値の4x5の四角同士のズレにあたるか。
stride の幅は　カーネルの行を間引きする間隔となるか。
クロスドメイン(XMLHttpRequest)で困った話(POST)

こんにちは takeです。

Chrome Extensionを作成したときにクロスドメイン（XMLHttpRequest）で苦労しました。

#### 今回作成した構成
- ChromeExtension  
     - JavaScript
- WebAPI
    - Nodejs
    - Express
    - Heroku

### 発生した内容
ChromeExtensionからHerokuにデプロイしたAPIへXMLHttpRequestを送る際に困りました。  

僕の場合は  

- Extensionからリクエストを送るとAPI側からHttp StatusCode503が帰ってくる。
- レスポンスは帰ってくるが、送ったリクエストボディがきちんとAPI側で取得することができない。

### やったこと
- ChromeExtension側  
クロスオリジンでPOSTを送る際は下記のコードで動作します。

```
var xhr = new XMLHttpRequest();
    xhr.open("POST", "ここにリクエスト先URL", true);
    xhr.setRequestHeader("Content-Type", "application/json");
    xhr.send(requestBody);
```

ここで注意すべきはContent-typeです。ここが原因でした。  
もともと"application/x-www-form-urlencoded" と設定していたのですが、この状態だとリクエストを飛ばすことができても送ったRequestBodyをWebAPI側で取得できませんでした。

"application/json"に変更することで問題なく動作が確認できました。

少し**application/x-www-form-urlencoded**と**application/json**について調べてみました。
どうやら送るリクエストの大体の形を表す形式が異なるよう

- application/x-www-form-urlencoded
このContent-typeはリクエストボディをクエリパラメータの形で送るようです。

- application/json
このContent-typeはリクエストボディをjson形式で送るようです。

どうやら僕はWebAPI側でリクエストボディの形式をjsonで想定していたのでapplication/jsonでうまくいったようです。

**参考にさせていただいた記事**
https://developer.mozilla.org/ja/docs/Web/HTTP/Methods/POST
https://qiita.com/bellcrud/items/1c7c73d42df10b4107c0


#### WebAPI側  
-  corsの設定  

corsの設定も色々と細かくやりようがありますが、今回はこれでいけました。

```
// CORSを許可する
const express = require("express");
const cors = require('cors');
const app = express();
app.use(cors())
```

お読みいただきありがとうございました。
[はてなブログ](https://take2405-first.hatenablog.com/)もお願いします。
フーリエ級数展開から複素フーリエ級数展開への変換とマイナス周波数の意味

## フーリエ級数展開

ある有限長の関数$f(x)$は下記のように$\cos,\sin$の和でかける。なお、厳密には"="とかけるかどうかは、$f(x)$に細かい条件が課されるのであるが、ここではゆるふわ理解のため"="と記している。

```math
f(x) = \frac{a_0}{2} + \sum_{k=1}^{\infty} a_k \cos(kx) + b_k \sin(kx) 
```

ところで、括弧の$\cos,\sin$の和の部分は、三角関数の和の公式を使えば下記のようにかける。

```math
f(x) = \frac{a_0}{2} + \sum_{k=1}^{\infty} \sqrt{a_k^2+b_k^2} \sin(\theta_k + kx) 
```
ここで $\theta_k = \tan^{-1}(a_k/b_k)$である.　ここでは$\sin$のみで記載しているが$\cos$のみで記載もできる。
つまり、位相0の$\cos, \sin$の和で表現することもできるが、位相$\theta_k\neq 0$ の$\sin$波の和としても表現することができる。任意の関数は様々な周波数のsin波(大きさと位相)を足し合わせているということである。cosとsinを足しているのはこれをある形式で表現したのみである。


## 複素フーリエ級数展開

オイラーの方程式から下記の関係がある。

```math
\cos(\theta) = \frac{1}{2} ( e^{i\theta} + e^{-i\theta}) \\
\sin(\theta) = \frac{1}{2j} ( e^{i\theta} - e^{-i\theta})
```

これをフーリエ級数展開の式に代入してやると、

```math
f(x) = a_0 + \sum_{k=1}^{\infty} \left\{ \frac{a_k - j b_k}{2}e^{j k x} + \frac{a_k + j b_k}{2}e^{- j k x} \right\}
```

この時点では、複素数を導入はしているものの、$f(x)$は実数関数であり、右辺の各周波数の項目も$j$がかかる項目を抽出すると当然0となっている。

```math
\frac{-b_k \cos(kx)+a_k \sin(kx)}{2} j + \frac{b_k \cos(kx)-a_k \sin(kx)}{2} j = 0 
```

ここで、仮に$k$をマイナス(マイナスの周波数)まで拡張することを考えると、

```math
f(x) = \sum_{k=-\infty}^{\infty} \left\{ \frac{a'_k - j b'_k}{2}e^{j k x} \right\}
```

ただし、

```math
a'_k = a_k, b'_k = b_k ( k \ge 0 )\\
a'_k = a_{-k}, b'_k = -b_{-k} ( k \lt 0 )\\
```

としている(条件A)。さて、ここで、$(a'_k - j b'_k)/2 = c_k \in \mathbb{Z}$とおくと、

```math
f(x) = \sum_{k=-\infty}^{\infty} c_k e^{j k x} 
```

となる。実はk<0の時の条件(A)は結果が実関数となるための条件であり、この条件を緩和する(外す)ことで表現する関数$f(x)$を複素関数まで広げられることを意味している。条件(A)は、$ c_k = c_{-k}^{*} $を意味しており、実数関数の場合には複素フーリエ級数展開は「そのような結果を与える」ことを意味している。
【Blender2.92】Cubeにレンガテクスチャを貼る（法線マップ（Normal Map））

環境メモ
⭐️Mac OS Mojave バージョン10.14
⭐️Blender2.92


↓↓完成内容
![スクリーンショット 2021-05-03 0.27.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/3060db63-ef73-90af-9f35-918a8b0ea22a.png)

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">🕍Blender2.92🕍<br>Blenderのシェーディングでレンガのテクスチャを貼ってみたよぉ💕💕<br>法線マップ（Normal Map）で質感だしてみた😊<a href="https://t.co/gg6m9Qnbwh">https://t.co/gg6m9Qnbwh</a><a href="https://twitter.com/hashtag/blender?src=hash&amp;ref_src=twsrc%5Etfw">#blender</a> <a href="https://t.co/cFB0KfgFal">pic.twitter.com/cFB0KfgFal</a></p>&mdash; non (@nonnonkapibara) <a href="https://twitter.com/nonnonkapibara/status/1388917791961477123?ref_src=twsrc%5Etfw">May 2, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# Cubeにレンガテクスチャを貼る
`Cube`を作成する
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/803ce25b-3104-da5f-35e7-173b5a88526d.png)

`Shading`を選択する
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/72aacb41-85a5-092d-5c46-2c686b263833.png)

「Add」-「Input」-「Texture Coordinate」を追加します。
「Add」-「Vector」-「Mapping」を追加します。

レンガテクスチャ（renga.jpg）を追加し`Box`にします。

以下の通り、つなぎます。
![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/ccfa7932-45dc-4301-14db-8077b62e4d30.png)

この時点では、レンガテクスチャは、凹凸がない状態です。

# 法線マップ（Normal Map）
法線マップ（Normal Map）は、モデル表面の法線（normal）を変化させることで凹凸を表現します。

レンガの法線マップは、NormalMap-Onlineのサイトで作成しました。
NormalMap-Online
http://cpetry.github.io/NormalMap-Online/


使い方は、こちらに記載してます。
【Blender】Macで法線マップ（normal map）を指定する方法（glTF Metallic Roughness）
https://qiita.com/nonkapibara/items/0a2319b3b8c978f7cfa2


法線マップを（renga_normal.png）追加。
「Add」-「Vector」-「Normal Map」を追加します。
Color SpaceをNon-Colorにする
Principled BSDFのNormalとつなぎます。
![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/34b28f08-e675-16c9-8b14-5bfd10e0835a.png)


これで完成です。
DockerDesktopでAngularの開発環境を作る

備忘録
# 00.環境
+ Windows10
+ DockerDesktop
+ Ubuntu
+ Angular

# 01.Docker Desktopの設定

https://www.docker.com/products/docker-desktop

```console:WindowsCMD[DockerCommand]
> docker pull ubuntu
```
# 02.Ubuntuの設定
（この辺はイメージ作ればいいんだろうなーと思いながら）

Docker Desktopでイメージを立ち上げて、CLIを起動する。

https://angular.jp/guide/setup-local

`node.js`のインストール時にリージョンの設定やらなにやら出る。

`npm`は途中でインストールが止まりEnterしたら、
上手く進んだのでもし途中で止まって時間かかるようなら。

```console:UbuntuCommand
# apt-get update
# apt install -y nodejs
# node -v
# apt install -y npm
# npm -v
# npm install -g @angular/cli
```

# 03.VSCodeの設定

拡張機能から`Remote - Containers`をインストールする。
左アイコンメニューにリモートエクスプローラ―が選べるようになる。
`02.UbuntuにAngularを入れる`で作成したプロジェクトが表示されるので、プロジェクトから`Open Container`アイコンをクリックすればフォルダーが表示される。

```console:VSCodeのターミナル
# ng serve
```

起動時にコンソールに出てくるURLをブラウザで入力すればとりあえず完成。

# あとがき
最近ようやくDockerDesktop使ってますがCLIのヒストリーの出し方が分からず...。
Dockerも勉強しようかな...。
これからChrome Extensionを作る人が絶対に知っておくべき知識

こんにちわ！takeです。思い切ったタイトルをつけていますが、お手柔らかにお願いします。

今回はJavaScriptの勉強がてらChrome Extension(拡張機能)を作成しました。

その過程で僕が感じた**最低限これを知っておけばChrome Extensionが作れる**という知識をまとめました。

# 目次
- 拡張機能を作るために必要なもの
- manifest Fileについて
- 拡張機能を作るために必要な概念(各スクリプト)の説明
- ファイル構成について
- おまけ

# 拡張機能を作るために必要なもの
Chrome Extensionを作るにあたってに必要なものを下記に示します。
 
- manifest File(manifest.json) 
- Content Script
- Event / Background Page処理
- Browser/Page Action処理

# manifest Fileについて  
これから作るChrome Extensionの設定をするファイルです。必ず作成する必要があります。この設定ができればあとはhtml、css、jsを編集するだけで作成ができます。

ざっとmanifest.jsonのサンプルを載せておきます

```Manifest.json
{
    "manifest_version": 2(基本的に2がおすすめらしい),
    "name": "拡張機能の名前(任意)",
    "version": "任意の数字(0.1とか)",
    "description": "拡張機能の説明",
    "content_scripts": [
        {
            "matches": [
                拡張機能が動作するサイトの設定
            ],
            "js": [
                "スクリプトの設定"
            ]
        }
    ],
    "icons": {
        "32": "画像を指定"
    },
    "background": {
        "scripts": [
            "スクリプトの設定"
        ],
        "persistent": true
    },
    "browser_action": {
        "default_title": "任意"
    },
    "permissions": [
        使用する機能の設定
    ]
}
```

# 拡張機能を作るために必要な概念(各スクリプト)の説明  
### Content Script  
Content Scriptはブラウザに表示されているページの目に見える部分に対して動作するスクリプト
例)背景の色を変える、ボタンの大きさを変える、etc....  

Content Scriptは独立して動作し、他の拡張機能で動作するスクリプトやブラウザで表示しているスクリプトとの競合は起こしません。

##### Content Scriptの特徴
- できること  
DOMの操作ができる
- できないこと
アクセスできるAPI(使用できるChromeAPI)が限られている

### Event / Background Page
##### Event / Background Pageの特徴
Chromeを使用している間動作しているスクリプトです。  
[ココ](https://developer.chrome.com/docs/extensions/mv3/declare_permissions/)に記載されているライブラリを使用することすることができます。
Content Scriptの動作はブラウザで目に見えてわかりますが、これはChromeが動いている間ずっと目に見えない部分で動いています。
##### Event Pageと Background Pageの違い
- Event Page  
目に見えない部分で動作し、呼ばれた際にだけ動作を行う。
- Background Page  
目に見えない部分で動作し、拡張機能をインストールしてからもしくはChromeを起動してから基本的に常に動作を続けます。

Background Pageは常に動作しメモリを消費することに対し、Event Pageは呼ばれた時のみ動作するので現在は主にEvent Pageの使用が推奨されているようです。

manifest.jsonで"persistent"の項目を指定することでEventとBackgroundの切り替えが可能です。   
trueならBackground falseならEventとなります

```manifest.json
"background":{
    "scripts":[
      "background.js"
    ],
    "persistent": false
  }
```

### Browser/Page Action  
拡張機能をインストールするとブラウザの右上に拡張機能のアイコンが表示されます。
Browser Actionはアイコンがクリックされた時に何かの処理をさせることができる。使えるAPIはEvent/Background Pageと同様  


### 簡単にまとめると  

- Content Scriptはブラウザの目に見える部分に動作します。
- Event / Background Pageは目に見えない部分で動作します。
- Browser Actionはアイコンがクリックされた時に動作します。

# ファイル構成について
特にファイル構成に指定はありませんが、個人的に作成する中でいいなと思った構成です。

```
$ tree
.
├── README.md
├── content
│   └── content.js
├── event
│   └── event.js
├── icon
│   ├── icon_32.png
│   └── icon_48.png
├── log
│   └── log.txt
└── manifest.json
```

# おまけ 
今回僕が作成したChrome Extensionの構成は下記のようになっています。
![chrome-extension.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416512/4facba62-2e5f-8cf8-f21a-bd31b26df929.png)

行った処理は閲覧したサイトの名前、URL、日時を取得する機能です。自分のブラウザ使用履歴を記録するために使用していますが、そのうち複数ユーザの履歴を取得しようと思います。

[はてなブログ](https://take2405-first.hatenablog.com/)もお願いします。
【AWS】Egress-onlyインターネットゲートウェイとは、NATゲートウェイとの違い

#プログラミング勉強日記
2021年5月3日
[昨日の記事](https://qiita.com/mzmz__02/items/2bf48c0645d41bc2fb69)でインターネットゲートウェイとNATゲートウェイの違いを理解した。今日は、Egress-onlyゲートウェイというものを初めて知ったのできちんと理解する。

#Egress-Only インターネットゲートウェイとは
　Egress-onlyインターネットゲートウェイを調べてみるとAWSの公式ドキュメントでは以下のように出てくる。

> Egress-Only インターネットゲートウェイは水平にスケールされ、冗長で、高度な可用性を持つ VPC コンポーネントで、IPv6 経由での VPC からインターネットへの送信を可能にし、インスタンスとの IPv6 接続が開始されるのを防ぎます。
引用：https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/egress-only-internet-gateway.html

　Egress-onlyインターネットゲートウェイは、IPv6を利用してインターネットに接続するときに使用する。Egressは<font color = "blue">日本語で装置から出力するタイミングで帯域情報を計測する概念/システム</font>(引用：[ingressとegressの意味と考え方](https://www.manageengine.jp/support/kb/NetFlow_Analyzer/?p=710))という意味で、Egress-onlyというように外部に出ることはできない。
　NATゲートウェイのIPv6版みたいな感じで覚えておくのでいいかも？

#NATゲートウェイとは
　NATゲートウェイについて調べてみるとAWSの公式ドキュメントでは以下のように出てくる。

> ネットワークアドレス変換 (NAT) ゲートウェイを使用して、プライベートサブネットのインスタンスからはインターネットや他の AWS のサービスに接続できるが、インターネットからはこれらのインスタンスとの接続を開始できないようにすることができます。
引用：https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-nat-gateway.html

　VPC内に構成したプライベートサブネットからインターネットに接続するために必要なものがNATゲートウェイ。([一昨日の記事](https://qiita.com/mzmz__02/items/6151277d91ce3b4da82c)でプライベートサブネットについて触れている。)

#Egress-onlyインターネットゲートウェイとNATゲートウェイの違い

- IPv6を使ってインターネット通信を行う場合はEgress-onlyインターネットゲートウェイ
- IPv4使ってインターネット通信を行う場合はNATゲートウェイ
-marchのx86-64向け, CPU命令世代オプション

[GCC 11.0](https://gcc.gnu.org/gcc-11/changes.html), [LLVM 12.0](https://releases.llvm.org/12.0.0/docs/ReleaseNotes.html)から, `-march`オプションに`x86-64`用のCPU命令世代指定が追加されました.
`-march=x86-64-v[234]`のように, 命令セットを対象に, ある程度の範囲に分割して指定することができます.
これまで, `-march=native`としてコンパイルしたCPUに合わせるか, `-march=skylake`などのCPUを固定する方法しかありませんでした.

CPUベンダとしては, 新CPUごとに新しい命令を追加してアピールしたい. 開発者としては, ある程度古いCPUもサポートしながら, 新しい命令も使いたい. このふたつの間を埋める機能といえます.
開発者が, ある命令セットがどのCPUからサポートしているのか, 把握して管理することは手間がかかります.

| オプション | 有効になる命令 | CPU世代 |
| :--- | :--- | :--- |
| x86-64 | CMOV, CMPXCHG8B, FPU, FXSR, MMX, FXSR, SCE, SSE, SSE2 | Pentium 4 |
| x86-64-v2 | CMPXCHG16B, LAHF-SAHF, POPCNT, SSE3, SSE4.1, SSE4.2, SSSE3 | Nehalem |
| x86-64-v3 | AVX, AVX2, BMI1, BMI2, F16C, FMA, LZCNT, MOVBE, XSAVE | Haswell |
| x86-64-v4 | AVX512F, AVX512BW, AVX512CD, AVX512DQ, AVX512VL | Xeon Skylake |
M1 Macでターミナル使ってHomebrewインストールしてみた

#対象の読者
初学者のくせにドヤ顔でM1Macbook買ってヒーヒー言ってる僕みたいな人
#前置き
当方プログラミングを勉強し始めて３週間の若輩者で、GitをアップグレードしようとしましたらHomebrewなるものをインストールしろと言われまして。
わたくし、実は最近Macを買ったばかりでして(初Mac)、それが最新のM1チップ搭載のものなのですね。
「ほーむびゅりゅー」という舌を噛みちぎりそうな単語は人生で初めて聞きましたので、インストール方法をググりました。
そうしましたら、ターミナルで以下のコマンドを実行すればHomebrewがインストールできるとのことで、そのようにしたのでございます。

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

そしたら以下のようになりまして
![スクリーンショット 2021-05-02 23.29.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1326211/8b7f92c3-81d8-2879-df25-a2469324a34f.png)
「英語ばっかでよくわからないけど無事インストール完了かな！＾＾」と思い、バージョン確認のために以下のコマンドを入力。

```
$ brew -v
```

「ドヤァ...」とEnterキーを押すと

```
zsh: command not found: brew
```

なんでなん！？
なんで言われた通りにやってるのに自分のだけ全然違う挙動するん？
これ初学者あるあるなのかな。
#ここから本題
とりあえずググったらM1搭載のMacだと以下の操作が追加で必要とのこと。
てことで前置き長くなりましたが、以下をターミナルで実行すれば大丈夫です:thumbsup:

```
$ echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/r/.zprofile
```

Users/の後のrのところなのですが、人によってディレクトリ名が異なるみたいです。
自分はMacのアカウント名を入れたら大丈夫でした。
上記実行してエラーでなければ次に以下を入力します。

```
$ eval "$(/opt/homebrew/bin/brew shellenv)"
```

これで再度Homebrewのバージョン確認したら僕はできました！
一応以下のコマンドを実行して問題がないか確認しておくといいみたいです。

```
$ brew doctor
```

んで、下記のように応答されたらOKです。

```
Your system is ready to brew.
```

最後に参考サイトも載せておくので、上記でうまくいかなかったら参考にしてみてください！
お疲れ様でした！

#参考サイト
https://original-game.com/homebrew/
【メモ】WSLgでIntelliJを動かす

# 概要

WSLgというLinuxのGUIアプリがWindowsで動く機能がプレビュー版として公開されたそうです。
[Linux GUIアプリがWindowsで動作 ～Microsoft、新しいWSL 2機能「WSLg」を初期プレビュー](https://forest.watch.impress.co.jp/docs/news/1320369.html)

[以前の投稿](https://qiita.com/skta/items/52a961ff022ff2758e11) でXWindowSystem系の設定などをいろいろやりましたが不要になってより便利なので試してみました。

# WSL2をいったんきれいな状態に

```bat:初期化
wsl --unregister Ubuntu-20.04
wsl --install -d Ubuntu-20.04
wsl -s Ubuntu-20.04
```

# Google Chromeをインストール

いろいろ試したところ何故か`jetbrains-toolbox`が起動せず。。。
`glibc`が必要ということで関係ありそうなものを入れてみたけど解決できず。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114225/8f87a1bd-1522-af2d-3184-7a9c2a67db99.png)

Google Chromeをインストールしたら動いたので後程調査をするということにします。。。

```bash:高速化のためリポジトリのURLを書き換え（要注意）
sudo sed -i.bak -r 's!http://(security|archive).ubuntu.com/ubuntu!http://ftp.riken.jp/Linux/ubuntu!' /etc/apt/sources.list
```

```bash:Chrome用リポジトリ追加
sudo wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
sudo sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
```

```bash:インストール
sudo apt update
sudo apt install -y google-chrome-stable
```

# JetBrainsToolboxをインストール
```bash:インストール
cd /tmp
curl -O https://raw.githubusercontent.com/nagygergo/jetbrains-toolbox-install/master/jetbrains-toolbox.sh
chmod u+x jetbrains-toolbox.sh
./jetbrains-toolbox.sh
```

# あとはUbuntuを再起動しToolboxを起動する（以前の記事と同じ）

```bat:ホストマシンで実行
wsl -t Ubuntu
```

```bash:Toolboxを起動
jetbrains-toolbox
```

# ちゃんと動いた！
ウィンドウの枠が少し太いかな？と言うのが少し気になるくらいでちゃんと動きました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114225/b9f9004d-005a-cd7a-7d11-3688a902aa3d.png)

# しかし。。。

IntelliJの方でもWLS対応がどんどん進んでいるみたいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114225/34169584-c6d4-5456-d6c2-5ce4fdc56da8.png)

ちょっとまだ微妙な感じっぽい（sbtが動かない）ですがこちらも楽しみです。
[参考チケット](https://youtrack.jetbrains.com/issue/IDEA-223986)
[参考チケット](https://youtrack.jetbrains.com/issue/SCL-18837)

# ついでに日本語入力対応

いろいろチャレンジ中
まとまったら後程追記します
Paypal,Stripe決済後のサンキューメールを全自動かつ無料で送れるアプリを作った話。


初めて投稿させていただきます、Takaoです。
素人なので間違っている点もあると思いますが、温かい目で見ていただけると嬉しいです。

今回は僕が作成したPayPal,Stripe決済後に自動でサンキューメールを送信するアプリケーションについて書きたいと思います。
以下のリンクからアクセスできます。

[PalPalMailer](https://palpalmailer.work "PalPalMailer")

僕がPaypalやStripeで商品を販売しようとした際に、決済後のサンキューメールを送るアプリをいろいろ探したのですがなかなかしっくりくるのが見つかりませんでした。(というか値段が高い涙)。
僕は商品ごとに送信するテンプレートが選択でき、ステップメール機能もあるアプリが欲しかったのですが、なかなか見つからず(MyASPというサービスを使えばできるようだが月額3000円以上と値段が少し高い)仕方なく自分でこのPalPalMailerを作成しました。

PalPalMailerは無料で決済後のメールを送ることができ、さらに商品ごとに違うテンプレートを送信したり、違うシナリオのステップメールを送ることもできます。
送信したメールが届いたかや開かれたかなどメールのアクションを追跡する機能も付いています。
自分でほしいと思った機能はほとんどつけられたと思います。

アプリの紹介はこれくらいにしてこのアプリに使用した技術について書きたいと思います。

#使用した技術
PalPalMailerはとにかくお金をかけずに作成することにこだわりました。

フレームワーク：Ruby on Rails
データベース：mongodb atlas
プラットフォーム：Heroku
メール送信システム：Sendgrid
決済システム：Stripe

##フレームワーク
まずフレームワークはRuby on Railsを選択しました。最初はRails APIでバックエンド、フロントをReactで構成しようと考えていたのですが、認証周りのセキュリティでどうするのが安全なのかわからず結局Rails単体で構成しました(jwtを使った認証があるそうなのですがlocal storageに保存すべきか否かや、Cookieを使用すべきかで意見が分かれる。)。どうするのが正解なのかわかる方がいたら教えていただけると嬉しいです。
認証はdeviseを使用し、権限管理にはcancancanを使用しました。
実装にあたってこちらの記事を参考にさせていただきました。

[[*Rails*] deviseの使い方（rails6版）](https://qiita.com/cigalecigales/items/16ce0a9a7e79b9c3974e "[*Rails*] deviseの使い方（rails6版）")

[[Rails5]cancancanってなんぞ？](https://qiita.com/betti/items/6807cc5a82b6d676c847 "[Rails5]cancancanってなんぞ？")


##データベース
データベースはMongoDB Atlasを選択しました。理由は単純でHerokuのデータベースのpostgreSQLやMySQLは20000行までしか無料でないので無料で512MBのM0 Sandboxが使えるMongodb Atlasを選択しました。HerokuでMongodb Atlasを利用するうえでこちらのサイトが参考になりました。

[HerokuでMongoDB Atlasを使う方法](https://developer.mongodb.com/how-to/use-atlas-on-heroku/ "HerokuでMongoDB Atlasを使う方法")

RailsでMongoDBを操作するためにMongoidというgemを使ったのですが若干RailsのActiveRecordと挙動が違って少し苦労しました。いろいろ詰まった時はこちらのサイトを参考にさせていただきました。

[Mongoidの挙動の違い](https://qiita.com/kyoshidajp/items/a1e56a8b51feae546013 "Mongoidの挙動の違い")
[Mongoid](https://docs.mongodb.com/mongoid/current/ "Mongoid")

##プラットフォーム
言わずと知れたPaaSのHerokuを利用しました。利用方法についてはほかの方が詳しく書かれているので他の方の記事を参考にしてください。無料で扱うためにクレジットカードを登録して1000時間のdyno時間を使用しています。dynoのスリープを防ぐためにUptimeRobotを使用しています。
UptimeRobotについては以下の記事がとても参考になりました。

[UptimeRobot](https://sweets-engineer.com/heroku2/ "UptimeRobot")

##メール送信システム
メール送信システムにはSendgridを選択しました。最初はGmailを使用する予定だったのですが、SMTPやAPIでは1日当たり100通までしか送信できないので無料で月間で12000通送信できるSendegridを選択しました。実装に当たってはこちらのサイトが参考になりました。

[Rails Sendgrid API](https://techracho.bpsinc.jp/yamada/2018_12_22/67222 "Rails Sendgrid API")

これは利用していて気付いたのですがSendgridはアメリカに本社があり、日本語で書かれたサイトは日本の代行業者(構造計画研究所)が運営しているそうで、日本の代行業者でアカウントを作成するのとアメリカの本社のサイトでアカウントを作成するのとでは送信数や利用できるサービスなどに大きく差があります。料金プランなどを見ていて結構混乱したので利用しようとしている方は気を付けてください。

##決済システム
PalPalMailerを作成するうえで最も苦戦したのは決済システムの実装でした。色々調べましたがStripeが公式ドキュメントも充実しており、導入しやすそうだったので使用することにしました。しかし公式のドキュメントはSinatraで書かれているため公式のドキュメントはあまり参考にならず、こちらの記事を参考にしました。

[Rails Stripe実装](https://qiita.com/tady/items/7617e62b2a5402ebd0fb "Rails Stripe実装")

StripeはRailsのドキュメントこそ少ないですが仕様や利用法などはきれいにまとめられていて調べて解決することがほとんどだったので今後も使用したいと思います。

#最後に
PalPalMailerについてはサイトのフォームからお問い合わせお願いいたします。
あと間違っている点があったら教えていただけると嬉しいです。
たった8行で作れるScalaのFizzBuzz

#コード

```scala:Main.scala
object Main extends App {
  val mapper: Map[Int, String] = Map(3 -> "Fizz", 5 -> "Buzz")

  def fizzbuzz(i: Int): String = mapper.view.filterKeys(i % _ == 0).values.mkString match {
    case "" => i.toString
    case s: String => s
  }

  (1 to 100).map(fizzbuzz).foreach(println)
}
```

# 解説

## match式でなく、filterKeys+valuesを使う理由

※数字と文字の対応関係が増えないことが明らかであれば、シンプルに下記のようなコードを使用したほうが良い
https://qiita.com/nesheep5/items/02cb0b6d1f6dcbe90149

match式では、複数のcaseに該当する場合をうまく表現できない。
このため、数字と文字の対応関係が増えたときに
XとYに該当、Xだけ該当、Yに該当...といったパターンが増えてしまう。

```scala:対応関係が増えた場合.scala
object Main extends App {
  val mapper: Map[Int, String] = Map(3 -> "Fizz", 5 -> "Buzz", 7 -> "Bar")

  def fizzbuzz(i: Int): String = mapper.view.filterKeys(i % _ == 0).values.mkString match {
    case "" => i.toString
    case s: String => s
  }

  (1 to 100).map(fizzbuzz).foreach(println)
}
```

## mapperの役目
3で割り切れるのであれば⇒Fizz、
5で割り切れるのであれば⇒Buzzといった対応関係を示す

## filterKeys(i % _ == 0) とは？

パラメータとして渡された値をkeyで割り切れるmapperだけを取り出す。
_とは、mapperのkey(数字)である。
Railsでフォームを作成していたときに知った２点

#はじめに
プログラミング初学者のため、自分の理解できている範囲内で言語化しています。
何か間違っている情報や改善点などありましたら、コメントいただけますと幸いです。🙇‍♂️

今回はRailsでフォームを作るときにハマったことを紹介しています。

#1 エラーメッセージ 表示によるレイアウトの形崩れ
バリデーションエラーの文言を表示したときに、元のレイアウトが崩れてしまう問題が発生、、、

###原因: field_with_errorsクラスを持つdivタグの出現
エラーメッセージを表示するときは、検証するとわかるが、field_with_errorsクラスのdivが現れる。
これによって形崩れしていた😅

###解決策
他にもあるが、ここではCSSに追記をするだけで良い方法を紹介

```css
.field_with_errors {
  display: contents;
}
```
これを追記するだけ。

#2 text-areaの縮小拡大について
text-areaはデフォの状態では、横と縦にドラッグすることで縮小や拡大が可能だが、
今回の実装の際には左右の縮小はいらなかったので、その抑制方法の紹介

###方法

```css
textarea{
  resize: vertical;
}
```
これで横の縮小を抑制できる

横方向　→　vertical
縦方向　→　horizontal
全方向　→　both    デフォでなっている
縮小無　→　none

##参考文献

https://yukimasablog.com/rails-field-with-errors

https://developer.mozilla.org/ja/docs/Web/CSS/resize
Rubyのmoduleとは？

## moduleとは
クラスと似ており、変数やメソッドを定義することができます。
ただし、クラスのようにインスタンスは生成できませんし、継承もできません。

・moduleでインスタンスを作ろうとした場合
moduleでインスタンスは作成できないため、エラーとなります。

```ruby
module Test
  def hoge
    put "hoge"
  end
end

tester = Test.new

#　エラーメッセージ
undefined method `new' for Test:Module (NoMethodError)
```
・moduleを継承して新しいmoduleを作成することは出来ないのでエラーとなります。

```ruby
module Test
  def hoge
    "hoge"
  end
end

module Test2 < Test
end

# エラーメッセージ
syntax error, unexpected '<'
```

## moduleを使うメリット
上記のようにclassと違って融通の効かない感じがありますが、moduleを使うことで以下のようなメリットがあります。

・多重継承ができる
Rubyは単一継承しか出来ません。しかし、moduleを用いることで多重継承に似た機能を実装できます。
以下のようにincludeしてmoduleを追加することをミックスインと言います。

```ruby
module Test
  def hoge
    puts "Testmoduleが呼び出されている"
  end
end

class User
  # Test moduleを読み込んでいる
  include Test

  def get_user
    # Testモジュールをincludeしているので、hogeメソッドが使える
    hoge()
    puts "get_userが呼び出されている"
  end
end

# Userインスタンスの作成
user = User.new
# Userクラスのget_userメソッドを呼び出す。
# Userクラスで、Testモジュールをincludeしているので、hogeメソッドが使える
user.get_user
```
PHPでpostできるAPIを作ろう！

#はじめに
Swiftを勉強し始めてからSwiftでの仕事をしたいとこだわり続けてきたんですけど、API作るためにPHPの勉強したらPHPちょっと楽しいかもと思っています。

今回は簡単なPOSTできるAPIを作ろう思います。
サーバーサイドはPHP、クライアントサイドはSwiftを使います。

#PHPのコード
説明を挟みながら少しずつコードを加えていく書き方でいきます。

```php:api.php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // 処理
}
```
こちらはリクエストが`POST`かどうかの判定です。
`GET`などの他のリクエストの処理をしたい場合は
`'POST'`の部分を変えてください。

```php:api.php
$response = array();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (isset($_POST['post_message']) === false) {
        $response['error'] = true;
        $response['message'] = "エラーのメッセージ";
    } else {
        // nullじゃないとき
    }
}
```
`isset()`は値がnullかどうかを調べてくれる関数です。
nullならfalse,そうでないならtrueを返してくれます。
今回の場合ポストで送信されてきた`post_message`というキーの連想配列の値がnullの時にレスポンスでエラーを出すようにしています。

以下のコードはnullじゃないときというコメントの下に書いています。

```php:api.php
$post_message = $_POST['post_message'];
//データベースに接続して保存したり...
$response['error'] = false;
$response['message'] = "成功のメッセージ";

//スコープの一番外に
print json_encode($response);
```

`$_POST["キー"]`でpostで送信した値を取り出せます。
php側はこんな感じです。
実際は正規表現などを用いてバリデーションチェック等を挟むことになると思います。

#Swiftのコード

```swift:PostViewController.swift
class PostViewController: UIViewController {
    viewdidLoad() {
        super.viewdidLoad()
        
        let url = URL(string: "apiのURL")!
        let request = NSMutableURLRequest(url: url)
        //httpMethodの設定
        //ここをPOSTにしておくとpostできる（当たり前）
        request.httpMethod = "POST"
        //渡したい値をセットする
        //文字列だけど＝の左の文字列がPHPの連想配列のキーになる。
        //渡したい値が複数ある場合は＆で繋げます。（web開発している人なら当たり前にわかる）
        let postParams = "post_message=swiftからのpost"
        request.httpBody = postParams.data(using: .utf8)
        
        let task = URLSession.shared.dataTask(with: request as URLRequest) { data, response, error in
            if error != nil {
                print("error is \(error!)")
                return
            }
            
            do {
                let myJSON = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
                if let parseJSON = myJSON {
                    var msg: String!
                    msg = parseJSON["message"] as? String
                    print(msg!)
                }
            } catch {
                print(error)
            }
        }
        task.resume()
    }
}
```

今回はpostのAPIについての記事なのでswiftの説明はコメントのみとさせていただきます。

これでビルドしてみるとログに`$response['message']`で設定した文字列が表示されていると思います。
実際にちゃんと値が渡せているか確認するなら

```php
$response['error'] = false;
$response['message'] = "post_message is ".$post_message ;
```
で確認できると思います。

#まとめ
swiftを使う仕事をしたいと思いスキルを上げるために勉強を始めたphpですが割と楽しくなってきてswiftにこだわる気持ちが薄れてきました。
あと、全く関係ない話ですが最近スペースキーの反応が悪いので掃除したんですが直らなくてモヤモヤしてます。

今回は以上です。
忘備のためにWin10環境でAnaconda上にTa-libをインストールする方法を書いておく

Win10環境でAnaconda上にTa-libをインストールした際に少々苦労をしたのでその方法を忘れたときのために書き記しておく。

まず、Pythonはver 3.6、3.9や3.8では現状でインストールが出来なかった。

次に、このページ（Anacondaのquantopian検索結果？)を表示。
https://anaconda.org/quantopian/ta-lib
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487411/ca449b49-e9f5-fe82-962c-b1d7d4fe6326.png)

そこにあるcondaコマンドをコピー
conda install -c quantopian ta-lib


Anacondaコマンドプロンプトに貼り付けてインストール、これで完了（のはず）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487411/3215c278-828d-bfec-fa0a-f4c0467009eb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487411/e61530fa-f824-16ff-22a0-47cc7876349b.png)
DockerでMysqlのコンテナに入る

##コンテナ内に入る

①docker ps もしくは ②docker-compose ps でコンテナIDを確かめる。
#####①

```
$ docker ps
CONTAINER ID   IMAGE           COMMAND                  CREATED          STATUS          PORTS                    NAMES
7d323ba6b1b8   mysql:5.7       "docker-entrypoint.s…"   51 minutes ago   Up 51 minutes   3306/tcp, 33060/tcp      hogelog_db_1
```
$ docker exec -it < コンテナID > sh　（shもしくはbash）

```
$ docker exec -it 7d323ba6b1b8 sh
```

#####②

```
% docker-compose ps   
     Name                    Command               State                 Ports              
--------------------------------------------------------------------------------------------
hogelog_db_1      docker-entrypoint.sh mysqld      Up      0.0.0.0:4306->3306/tcp, 33060/tcp    
```

$ docker exec -it < コンテナNAME > sh　（shもしくはbash）

```
$ docker exec -it hogelog_db_1 sh
```

##コンテナ内に入れたら

```
＃ mysql -u root -p

Enter password: 

```
パスワードを要求されるので、docker-compose.ymlに記述してあるパスワードを入力する。

```
mysql> 
```

接続完了。

```
mysql> exit
Bye
```
いろんなマル

Y子です。

マルの記号を使うことって、よくありますよね。
仕様書で星取表を書いたり、試験成績の記述に使ったり。
スマホからの簡単なメッセージのやり取りの中でも、使うと思います。

でも、似たようなマルが多くて、混乱することがありませんか？
試験成績の合格件数を数えようとして「○（白丸）」を検索しても、「〇（漢数字のゼロ）」で書いてあってヒットせず困った、という経験があります。

今回は、PCやスマホから入力できる「似たようなマル」を、比較してみようと思います。

# Windowsで入力可能なマル
_【[確認環境：Windows 10 Pro (Bld. 19041.928)](https://qiita.com/koiwaiwaiko/items/ef2d457ae1e1a7c8b698 "Windows10のバージョンを確認・表記する")】_
まず、わたしのPCで「まる」を変換して表示される変換候補がこちら。
![Windowsのマル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265690/4aa236e9-04e4-b536-1175-45b68383abe5.png)

次に、資料などのなかで「白抜きのマル」として使いそうな記号・文字をまとめてみます。
上記変換候補との対比もしてみます。

|文字|意味|変換候補|
|:-:|:-|:-|
|○|白丸|1列目6番目|
|◯|大きな丸|1列目9番目|
|〇|漢数字のゼロ|1列目4番目|
|Ｏ|アルファベットのオー（全角）||
|０|ゼロ（全角）||

念のため、これらの文字を代表的なフォントで比較してみます。
![Windowsのマル_フォント比較.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265690/7503ed90-0b7b-ba7e-fafe-dded6c5b4d01.png)

一番気を付けたいのは、「漢数字のゼロ」と思います。
「白丸」を使いたい場面でも、場合によっては白丸より上位の変換候補に表示され、しかも白丸よりきれいなマルに見えたりします。まぎらわしいですね。

# iPhoneで入力可能なマル
_【確認環境：iPhone 7 (iOS 14.4.2)】_
わたしのiPhoneで「まる」を変換して表示される変換候補がこちら。
![iPhoneのマル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265690/903fdade-9356-919f-404f-806328c68a1b.png)

まるい記号が、「マル」をはさみつつ最初の方に9個並んでいます。
これを順に、前述のWindowsの変換候補と比較すると、こうなります。

|文字|意味|Windows変換候補と比較|
|:-:|:-|:-|
|●|黒丸|1列目5番目|
|○|白丸|1列目6番目|
|◉|蛇の目|※6列目5番目（丸中黒⦿）とは違う|
|⚪︎|中白点||
|◯|大きな丸|1列目9番目|
|⚫️|中黒点||
|⚫︎|黒い丸（バリアント絵文字）||
|◎|二重丸|1列目7番目|
|⭕️|速度制限基本||

Windowsではなかなか使わなそうな「蛇の目」や「中白点」などが、変換候補の上位にあり、うっかり仕事の文書などに書き込んでしまうと、検索に引っかからないやっかいな文字を使ったことになってしまいます。

最後の「速度制限基本」は、[Wiktionary](https://ja.wiktionary.org/wiki/%E2%AD%95) にそう書いてあったので転記しましたが、ホントかよって気もします。
> 速度制限基本。日本のカーナビにおける速度制限記号の丸を示す記号。㉈、㉉、㉊、㉋、㉌、㉍、㉎、㉏と組み合わせて使う。

# 参考

https://ja.wikipedia.org/wiki/%E4%B8%B8%E5%8D%B0

# おわりに
どんな変換候補があり、そのうち使いたいのはどれか、を今回知れてよかったです。
マルとして使うのは、「○白丸」「●黒丸」「◎二重丸」あたりに統一するよう、文書作成規約などに規定しておきたいものです。
統一しないと、検索漏れが発生しますし、見た目にも影響しますもんね。

では！　(○_○)ﾉｼ
[Chapter-3]EC2のサーバー環境構築

| タイトル |
|:-|
|  [[Chapter-1]VPCの設定](https://qiita.com/Jackson123/items/c7b0a7a6ae659fe48a3b) |
|  [[Chapter-2]EC2の設定](https://qiita.com/Jackson123/items/53cc698b1b7cfdbfe368) |
| [[Chapter-3]EC2のサーバー環境構築](https://qiita.com/Jackson123/items/821d89184d87b6020df5)  |
|  [[Chapter-4]EC2にRailsアプリの配置](https://qiita.com/Jackson123/items/e91eec2f76774717bdee) |
|  [[Chapter-5]ロードバランサー(ELB)の作成](https://qiita.com/Jackson123/items/a739525d0084747405d7) |
| [[Chapter-6]ACM(AWS Certificate Manager)でSSL証明書を取得](https://qiita.com/Jackson123/items/eb586c33fe3c5b7d9dad)  |
|  [[Chapter-7]Route53の設定](https://qiita.com/Jackson123/items/6b41ebde0eec072a283e) |
|  [[Chapter-8]https化に向けたロードバランサーの設定](https://qiita.com/Jackson123/items/d6819d3dbf304aebd459) |
|  [[Chapter-9]https化によるRoute53の設定](https://qiita.com/Jackson123/items/9ceae188a53f646e55e9) |
|  [[Chapter-10]https化によるNginxの設定](https://qiita.com/Jackson123/items/255263a260f7a833bf1d) |
# はじめに
今回はEC2のサーバー環境構築をしていきます
自分の手順書としてのメモですので画像はありません。あしからず。

## Nginxを設定する
まずサーバーをアップデートします。

```:サーバー
$ sudo yum update
```

## Nginxをインストール

```:サーバー
$ sudo amazon-linux-extras install nginx1.12 -y
```

## Nginxの起動

```:サーバー
$ sudo systemctl start nginx
```

Nginxサービスを有効化します。(インスタンス起動時自動起動)

```:サーバー
$ sudo systemctl enable nginx
```
起動しているか確認(ステータスを表示)

```:サーバー
$ systemctl status nginx
```

##必要なプラグインをインストール

```:サーバー
$ sudo yum install git make gcc-c++ patch openssl-devel libyaml-devel libffi-devel libicu-devel libxml2 libxslt libxml2-devel libxslt-devel zlib-devel readline-devel ImageMagick ImageMagick-devel epel-release
```

##PostgreSQLをインストール

```:サーバー
$ sudo amazon-linux-extras install postgresql11
```

先ほどの方法でインストールされるのは、PostgreSQLのクライアントだけで、サーバはインストールされない。
**postgresql-server**をインストールする

```:サーバー
$ sudo yum install postgresql-server postgresql-contrib postgresql-devel
```

サーバーを初期化します。

```:サーバー
$ sudo postgresql-setup initdb
```

##Node.jsをインストール

```:サーバー
# ダウンロード
$ curl -sL https://rpm.nodesource.com/setup_12.x | sudo bash -

#インストール
$ sudo yum install -y nodejs
```

## Yarnをインストール

```:サーバー
$ curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
$ sudo yum install -y yarn
```

## rbenvをインストール

```:サーバー
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
```

##ruby-buildをインストール

```:サーバー
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ rbenv rehash
```

##Rubyをインストール
ローカル環境にて制作したアプリをどのバージョンのRubyで制作したか確認してください。
アプリのディレクトリ内で`ruby -v`でバージョン確認です。

```:ローカル
$ ruby -v
ruby 2.6.6
```

筆者は2.6.6でインストールします。

```:サーバー
$ rbenv install -v 2.6.6
$ rbenv global 2.6.6
$ rbenv rehash
$ ruby -v
```

## 参考

https://qiita.com/Yuki_Nagaoka/items/dbb185feb6d4f051c2f2
Lightning Experience のロールアウト ⇒ Lightning Experience への移行の準備

１．[設定] の Lightning Experience 切り替えアシスタントに表示されるものはどれですか?
２．Lightning Experience 向けに組織を評価する場合の説明に該当するものはどれですか?
３．Lightning Experience への移行を計画するときに実施することはどれですか?
４．担当役員や関係者に参加してもらうのに最適なタイミングはいつですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/bcdec06a-99f2-f01c-acc1-2850c65451f9.png)
Sự chuyển biến bất ngờ của đất nền thị xã Phú Mỹ

Đất nền thị xã Phú Mỹ hay bất động sản Phú Mỹ trong những thời gian gầy đây có những biến động cực kì tích cực. Tuy cũng là một khu vực ngay gần kề TP.HCM như Bình Dương, Biên Hoà,.. thế nhưng thị xã Phú Mỹ lại mang trong mình cực nhiều lợi thế vượt trội. Với rất nhiều sức hút to lớn tới từ sân bay Long Thành, Cảng Cái Mép. Giá các dự án đất nền có bằng chung nếu so với các khu vực khác là hợp lí. Giá thông thường ở các TP,Vũng Tàu, TP.Bà Rịa thường cao gấp 3-4 lần so với đất nền Phũ Mỹ. Trong khi lợi thế vị trí của Phú Mỹ cũng không hề kém cạnh.
https://diaocbariavungtau.com/dat-nen-thi-xa-phu-my/
セキュリティ業界における資格取得の意味を考える

#はじめに
多数の資格を取得し、さらにまだまだ取得したいと思っている私ですが、改めて資格情報について考えてみます。
ここでは私が知る範囲の情報セキュリティ業界に限定します。

#資格取得のメリット
##金銭的メリットがある（ただし会社による）
会社によっては資格を取得した際の報奨金が出る、昇給がある場合があります。
会社にこの制度がない場合は、金銭的なメリットはありません。

##仕事の幅が広がる
仕事の幅を広げたいという人にはメリットと言えそうです。普段の業務と関連する資格を取る方法と、異なる分野の資格を取る方法があります。
普段の業務をより深く知りたいという場合に資格取得はある程度有効だと思います。どうしても自社流、自己流になりがちなので、スタンダードなやり方を学んでおくというのは必要だと思います。
また、普段の業務とは異なる分野の資格を取得することで、フォレンジックがわかるペンテスターやペネトレーションテストがわかるセキュリティコンサルタントになれるかもしれません。部署移動や転職時にもある程度有効だと思います。

これ以外に官公庁案件等で資格保持者が必要になるケースがあります。官公庁案件をやりたいという場合は資格保持者が有利でしょう。
未知の分野に挑戦するための勉強がてら取得するのも良いと思います。

##単なる趣味（あるいはそれに近い動機）
私の場合は会社から推奨されていることもありますが、主要な動機はこれです。資格取得を重ねていくと、取得すること自体が楽しみになります。
それでよいのかと自問自答してしまうのですが、楽しいので仕方ありませんｗ

#資格取得のデメリット
##金銭的負担がある
資格によって様々なですが、IPAの情報処理技術者試験、情報処理安全確保支援士試験以外の資格試験は全般的に高いです。受験するだけで5万円以上かかる資格はざらにあります。
これに加えて更新費用もかかります。特に情報処理安全確保支援士は更新にかかる費用が莫大です。
会社によっては補助が出る場合もあると思いますが、出ない場合は特に情報処理安全確保支援士を維持するのは難しいでしょう。

##やりたくない仕事をやらされる可能性がある
資格保持者が少ない会社の場合、資格を持っている人がいないという理由でやりたくない仕事をやらされる可能性があります。
ただ、実際にこのようなケースにあったことはないですし、聞いたこともありません。可能性は低いと思われますが、全く興味のない分野の資格は取得しない方が良いかもしれません。

##時間が必要
資格によりますが、1つの資格を取得するためには数十時間の学習が必要です。私がCISSPを取得した際には100時間程度勉強した記憶があります。貴重な人生の時間を削って勉強する必要があります。それだけの価値があるかどうかは検討する必要があります。
人によっては資格取得よりコード書いている方がメリットが大きいと感じるかもしれません。

#個人的見解
人によってはメリットの方が少ないかもしれませんが、私個人はメリットの方が大きいと考えます。
これまで多数の資格を取得しましたが、後悔したことはありませんし、不利益を被ったこともありません。むしろ知識の幅が広がりましたし、広い視点から考えられるようになりましたので、メリットの方がはるかに大きいと感じています。

なお、セキュリティ業界という視点で見ると、業界歴5年以上であれば、情報処理安全確保支援士かCISSPのどちらかは取得しておいた方が良いと思います。この2つは業界内での保持者が多く、会社から取得を求められる可能性が高いです。
これ以外の資格は現在の業務に応じて、CISA、GIAC、OSCPといった資格を取得しておくとベターかなという印象です。

これからセキュリティ業界に入る場合は、特に資格は必要ないと思います。特に学生であれば、基本的なコンピュータの知識、ネットワークやOS、プログラミング等の大学や専門学校で学ぶ知識があればとりあえずは十分ではないかと思います。
それでも資格を取りたいということであれば、情報処理安全確保支援士試験に合格しておくと良いと思います。受験料が安く、対策本が多数存在しており、午前試験は過去問暗記で突破可能、午後試験は国語力である程度解けるという点から、挑戦しやすく、比較的合格もしやすく、さらに落ちてもダメージが少ないのでオススメです。
ISC2やCompTIAなどの国際資格は受験料が高いので、学生にはあまりお勧めできません。
MacでESP32のコンパイルが失敗する時の対処法

#問題
下の様なエラーが出てコンパイルが完了しない。

```
/Applications/Arduino.app/Contents/Java/arduino-builderが255を返しました。
```
#環境
- macOS Big Sur 11.3
- Arduino IDE 1.8.13
- ESP32 DEVKIT V1 (ESP-WROOM-32)
- Arduino IDE ボードマネージャー > esp32 バージョン1.0.4

#解決方法
Arduino IDE ボードマネージャー の esp32 バージョン1.0.5にする。

#詳細
https://entotsu44.hatenablog.com/entry/2021/05/02/180000
kivydで、日本語フォントがnot foundになってしまう件について


日本語フォントを使おうとした際に出るエラーに関して

resource_add_path("C:/Users/info/AppData/Local/Microsoft/Windows/Fonts")
LabelBase.register(DEFAULT_FONT,"日本語フォント.otf")
※otfは拡張子のため、フォントによっては色んな拡張子があります。

Fontのパスを、Windowsのプロパティのままコピーすると
ディレクトリの区切り文字が\になっていますが、
/に変更すると読み込みはうまくいきます。

<h2>よく出るエラー内容はこちら</h2>


```
Traceback (most recent call last):
   File "c:\Users\info\Desktop\MyPython\sample.py", line 9, in <module>
   File "C:\Users\info\anaconda3\lib\site-packages\kivy\core\text\__init__.py", line 315, in register
     raise IOError('File {0} not found'.format(font_type))
 OSError: File ZakkuriGothic-BLK.otf not found

```


<h2>フォントのパスを確認する方法</h2>
１、C:\Windows\Fonts　というフォルダを開き、パスを確認したいフォントを右クリック
２、プロパティを開き、パスを確認
Djangoチュートリアルやったぞ

#自己紹介
 - アプリ開発用の言語経験なし
 - Python+seleniumで業務用にローカルでちょこちょこ、ほそぼそ....
 - 名前かっこいいし ちょっと触ってみたくなっちゃった

#Djangoをやるぞ
めちゃくちゃありがたいチュートリアルあんじゃん
https://docs.djangoproject.com/ja/3.1/
これをやりました。

理解できた範囲で要点をまとめると

 - 何かアプリを作りたいときはDjangoがいい感じのパッケージを作ってくれるぞ
 - データベースも勝手に作ってくれるぞ
 - 命名とか若干おろそかでも許してくれるぞ (たぶん)
 - modelsでやりとりしたいデータを整理して、urlsとviewsで表示を指示するぞ
 - そこに愛情込めてhtmlを作ってやると動くぞ
 - いろいろショートカットのライブラリがあって活用すると楽らしいぞ
 - appをいくつも立てるのを想定してるっぽい

チュートリアルでここまでわかる　と言うことがわかりましたね

#とにかく何か作らんことには

面白くない！のだけれど、

 - すぐにプライベートで何かアプリ化したいものがないな
 - このままでは大好きなクッキークリッカーを実装してしまいかねない
 - 仕事はどうかと言うと、結構ある。ローカルで一人でやってるから他の人に渡せないこととか
 - わからんポイントを整理しておこう
    - サーバーはちゃんと別で勉強しよう、社内サーバー使わないと
    - Django上でSelenium普通に動くらしい
        - [[Django] LiveServerTestCaseを使ってSeleniumによるWeb動作テスト](https://btj0.com/blog/django/selenium/)
    - Django経由すればログイン必要系のやつも他の人に渡せるのか？
    - 数値周りを取得してくるダッシュボードとか作れるといいな

この辺をやっていくことにしましょう。
Amazon Web Services 基礎からのネットワーク＆サーバー構築　8-4(173p)　http error 500　解決メモ

「Amazon Web Services 基礎からのネットワーク＆サーバー構築」の8-4(173ページ)でWordPressの初期設定画面が出るはずのところが「http error 500」が出てしまい、ちょっちハマってしまったので解決メモを残しておきます。

---
```
$ cd ~
```
```
$ cd wordpress
```
でwordpressディレクトリに移動して、

```
$ sudo amazon-linux-extras install php7.3
```
このコマンドを実行します（このコマンドはPHPをアップデートするもの）。
これで動くようになりました。

---

何が原因だったのか、結論から言うとPHPのバージョンが足りていませんでした。
WordPressの最新版は、PHPバージョン5.6.20以降でしか動きません。
しかし、wordpressディレクトリで、

```
$ yum list installed | grep php
```

こちらのコマンドを実行してインストールされているPHPのバージョンを確認してみると、僕の環境ではPHP5.4とバージョンが足りていなかったためwordpressが正常に動作しなかったというわけです。

##その他、使ったコマンド
PHPのエラーを確認するコマンド

- `sudo less /var/log/httpd/error_log | tail -20`
Pythonからインターネットショートカット（拡張子.url）を開く

Windows環境で拡張子が.urlのインターネットショートカットがあるが、これをPythonからブラウザーに開かせたいなと思った。

urlファイルの中身をテキストエディター等で見ると、次のようなiniファイル形式をしている（最小限の記述での例）。

```ini
[InternetShortcut]
URL=https://qiita.com/
```

Pythonでiniファイルを扱うには```configparser```を使用することができる。また、ブラウザーを扱うには```webbrowser```を使用した。
Python 3.6, 3.9で使用できるので、最近のバージョンなら問題なさそう。
Windows 10 + Edge, Ubuntu 20.04 + firefoxで確認したところ、どちらも期待通りに動作した。

```python
import webbrowser
import configparser

# インターネットショートカットファイルパス
filename = 'some.url'

# ini形式でファイルを開く。interpolation=Noneの指定は本文参照。
url_file = configparser.ConfigParser(interpolation = None)
url_file.read(filename)

# URLを読んでデフォルトのブラウザーで表示する。
url = url_file['InternetShortcut']['URL']
webbrowser.open(url)

```

Pythonでは様々な形式のiniファイルを扱えるよう、ConfigParserの引数で指定するinterpolationオプションで変換方式を決めている。ここで、標準だと```%```を特殊な記号として解釈するようになっている。
しかし、インターネットショートカットでは```%2f```のようにURL中の記号や日本語などエンコードすることがあり、このままでは解釈エラーで例外を出してしまう。これを防止するために、```interpolation = None```を指定して変換を無効にしている。

# まとめ

Pythonから拡張子が.urlのインターネットショートカットをブラウザーに表示させる方法を調べた。中身がini形式のファイルなので```configparser```で読み込み、```webbrowser```でブラウザーを開くことで実現した。