OmniAICreator/Qiita-1.07M huggingface dataset:
Python numpy で近似式の計算

- __「pythonでサクッと近似式計算できない？Excelだと6次までらしくて...」__と相談をいただいたのがきっかけで調べてみました。

# 結論
numpyのpolynomial（ポリノミアル：多項式）モジュールを使用してn次近似式を算出できる。
(scipyでもできるらしいが比較検証はしてない）

以下のようなコードで近似可能。
コードは上記のように勝手に @wrblue_mica34 様の書かれた[pythonで近似式の計算](https://qiita.com/wrblue_mica34/items/0f26612207b78b68c4a1) をベースにさせてもらいました。

##ソースコード

``` main.py
import numpy as np
from matplotlib import pyplot as plt

x= np.linspace(-10,10,20)
#y= x**3 +  2*x**2 + 3*x + 10+ np.random.randn(20)*50
#y= x**11 + x**9 + 1000*x**7 + 6*x**5 + 8*x**3 + x**1 + 10 #+ np.random.randn(20)*50
y = 0.0001*x**10 +0.01*x**7 + 1000*x**3 + 10000*x #+ np.random.randn(20)*1000

#近似式の係数
res1=np.polynomial.Polynomial.fit(x, y, deg=1)
res2=np.polynomial.Polynomial.fit(x, y, deg=2)
res3=np.polynomial.Polynomial.fit(x, y, deg=3)
res4=np.polynomial.Polynomial.fit(x, y, deg=4)
res10=np.polynomial.Polynomial.fit(x, y, deg=10)

print("10次近似式")
print(res10)

#近似式の計算
y1 = res1(x)
y2 = res2(x)
y3 = res3(x)
y4 = res4(x)
y10 = res10(x)

#グラフ表示
plt.scatter(x, y, label='original')
plt.plot(x, y1, label='1deg')
plt.plot(x, y2, label='2deg')
plt.plot(x, y3, label='3deg')
plt.plot(x, y10, label='10deg')
plt.legend()
plt.show()
```


##コマンドライン出力結果

``` output
10次近似式
-2.962767826343394e-10 + 99999.99999999747 x**1 +
1.1499998947763862e-08 x**2 + 1000000.0000000066 x**3 -
9.768104439408122e-08 x**4 - 1.380203054314589e-08 x**5 +
2.8865757618439694e-07 x**6 + 100000.00000001301 x**7 -
3.4098936930317207e-07 x**8 - 5.409990936225413e-09 x**9 +
1000000.0000001389 x**10
```

## プロット結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26413/4c05d360-04a7-2a5d-7c28-410310c73dc9.png)



# 参考
- [pythonで近似式の計算](https://qiita.com/wrblue_mica34/items/0f26612207b78b68c4a1)
- [numpy.polynomial.polynomial.Polynomial.fit
method](https://numpy.org/doc/stable/reference/generated/numpy.polynomial.polynomial.Polynomial.fit.html#numpy.polynomial.polynomial.Polynomial.fit)
- [module-numpy.polynomial](https://numpy.org/doc/stable/reference/routines.polynomials.package.html#module-numpy.polynomial)
タプル型について

#・タプル型とは？

・タプル型とは、複数の型をまとめて1つの型として扱うことができる型である。

・タプル型の値をタプルという。

##・タプル型の定義とタプルの生成

```swift
// タプル型の定義
var sampleTuple = (Int, String)

// タプルの生成
sampleTuple = (1,"Hello")
```

##・要素へのアクセス
・要素へのアクセス方法は3つ

####①インデックスによるアクセス

####②要素名によるアクセス

####③代入によるアクセス


##・①インデックスによるアクセス

```swift 
let tuple = (100, "Hello")

print(tuple.0) // 100
print(tuple.1) // Hello
```

##・②要素名によるアクセス

```swift 
let tuple = (int: 100, string: "Hello")

print(tuple.int) // 100
print(tuple.string) // Hello
```

##・③代入によるアクセス

```swift
let int: Int
let string: String

(int, string) = (100, "Hello")

print(int)  // 100
print(string) // Hello


// この方法でも宣言できる
let (int, string) = (100, "Hello")

print(int)
print(string)



```

#参考
・Swift実践入門
ラズパイの情報取得用コマンド

# はじめに
ラズパイの情報を取得するためのコマンドをまとめました。
今後、役立ちそうなコマンドを見つけたら追記していく予定です。

# 検証に使用したOS
以下のOSで検証しました。

```
pi@raspberrypi:~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 10 (buster)
Release:        10
Codename:       buster
```

# コマンド
### システム起動時刻

```
pi@raspberrypi:~ $ uptime -s
2021-07-23 21:11:56
```

※以下のコマンドでは時刻を同期する前の起動時刻しか分からない。

```
pi@raspberrypi:~ $ who -b
         システム起動 1970-01-01 09:00
```

### カーネルのバージョン

```
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 5.10.17-v7+ #1421 SMP Thu May 27 13:59:01 BST 2021 armv7l GNU/Linux
```

※`sudo apt full-upgrade`をした直後では更新結果が反映されないので注意。再起動後に反映される。

### Revision、シリアル番号、モデル
[参考]
https://www.raspberrypi.org/documentation/hardware/raspberrypi/revision-codes/README.md
※一部省略および伏字にしています。

```
pi@raspberrypi:~ $ cat /proc/cpuinfo
Revision        : a32082
Serial          : 00000000********
Model           : Raspberry Pi 3 Model B Rev 1.2
```

### 停電等による電源断の有無を判定
以下のコマンドでシステム起動後の経過時間が分かるため、電源断の有無を判定できる。

```
pi@raspberrypi:~ $ uptime
 22:30:33 up  1:18,  3 users,  load average: 0.30, 0.22, 0.19
```

### 温度

```
pi@raspberrypi:~ $ vcgencmd measure_temp
temp=49.4'C
```

### 電圧異常等の有無および内容
[参考]
https://www.raspberrypi.org/documentation/raspbian/applications/vcgencmd.md
https://github.com/raspberrypi/userland/blob/master/host_applications/linux/apps/gencmd/vcgencmd.1
https://www.raspberrypi.org/documentation/hardware/raspberrypi/frequency-management.md

```
pi@raspberrypi:~ $ vcgencmd get_throttled
throttled=0x0
```

[戻り値の説明（`0x0`は正常を意味する）]

| Hex value | Meaning | 説明 |
|:-|:-|:-|
| 0x1 | Under-voltage detected | 低電圧を現在検知している。 |
| 0x2 | Arm frequency capped | CPUの周波数が現在制限されている。 |
| 0x4 | Currently throttled | 現在、制限を受けている。 |
| 0x8 | Soft temperature limit active | ソフトな制限温度に達している。soft limitは60度、hard limitは85度。 |
| 0x10000 | Under-voltage has occurred | 低電圧が発生したことがある。現在は発生していない。 |
| 0x20000 | Arm frequency capping has occurred | CPUの周波数が制限されたことがある。現在は制限されていない。 |
| 0x40000 | Throttling has occurred | 制限を受けたことがある。現在は制限を受けていない。 |
| 0x80000 | Soft temperature limit has occurred | ソフトな制限温度に達したことがある。現在は制限温度未満。 |
VSCodeのWSLターミナルでbrewが使えないときの対処方法

## 困ったこと

- VSCodeでwslのターミナルを起動したときに、brewと、brewで入れたコマンドが使えない。


- 以下のようにコマンドが見つからないといわれてしまう。

```
$ brew

Command 'brew' not found, did you mean:

  command 'brec' from deb bplay (0.991-10build1)
  command 'qbrew' from deb qbrew (0.4.1-8build1)

Try: sudo apt install <deb name>
```


- brew経由でインストールしたコマンドも同様に見つからない。（以下はkubectlの場合）

```
$ kubectl
kubectl: command not found
```

- 一方で、windows terminalからwslを実行した場合にはbrewコマンドと、brew経由でインストールしたコマンドが実行できる。


## 解決方法
- 以下のコマンドで、`~/.profile`ではなく`~/.bashrc`にbrewのパスを書く。
    - zshの場合は`~/.bashrc` -> `~/.zshrc`に置き換えて実行してください。

```
$ echo 'eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)' >> ~/.bashrc
```


## どうしてbrewが使えなかったのか

### そもそもlinuxbrewってなに？
- mac OSで使用できるパッケージマネージャであるhomebrewには、linuxbrewというlinux向けのバージョンが存在します。

- wslでも以下のページに従ってインストールすることで使用できます。
    - https://brew.sh/index_ja

- macOSと同じターミナル環境をlinuxサーバーやwslでも作りたいとき、aptやyumレポジトリが存在せずbrewでしか提供されていないコマンドをインストールしたいときに便利です。



### 状況の確認
- 冒頭でも書いたように、VSCode上でwslのターミナルを開いたときにはbrew関連のコマンドが実行できません。
- 一方で、Windows TerminalやWSLの標準のターミナル（WindowsのスタートメニューからUbuntuを実行したときに開かれるもの）ではbrewコマンドが実行できます。


- VSCodeのターミナルの場合


```
$ brew

Command 'brew' not found, did you mean:

  command 'brec' from deb bplay (0.991-10build1)
  command 'qbrew' from deb qbrew (0.4.1-8build1)

Try: sudo apt install <deb name>
```

- それ以外の場合

```
$ brew
Example usage:
  brew search TEXT|/REGEX/
  brew info [FORMULA|CASK...]
  brew install FORMULA|CASK...
  brew update
  brew upgrade [FORMULA|CASK...]

...

```

### パスの比較
- たぶんPATHが通ってないんだろう、ということで両者でPATHを比較してみます。

- 以下のコマンドをVSCode側で実行

```
$ echo ${PATH//:/\\n} > VSCode.txt
```

- 次はWindows Terminal側でこのコマンドを実行

```
$ echo ${PATH//:/\\n} > WinTerminal.txt
```



- 両者をdiffコマンドで比べてみると、VSCodeのターミナルにはやはりbrewのパスが存在しません。
    - ということで、これはパスが通っていないのが原因みたいです。


```
diff WinTerminal.txt VSCode.txt
2,3d1
< /home/linuxbrew/.linuxbrew/bin
< /home/linuxbrew/.linuxbrew/sbin
```

### 解決

- linuxbrewのパスは`.profile`に書かれています。これはlinuxbrewのインストール時に以下のコマンドを実行して`.profile`にパスを書くように指示されるためです。

```
$ echo 'eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)' >> ~/.profile
```

- 自分のターミナル環境では`.profile`にはlinuxbrewのパスしか書かれていませんでした。
    - 先ほどのパスの比較ではlinuxbrewのパスだけが抜けていたので、どうやら`.profile`にパスが書かれていることが問題のようです。


- ということで、`.profile`ではなく`.bashrc`にlinuxbrewのパスを書いてみたところ、VSCodeでもbrewが実行できるようになりました。

```
$ echo 'eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)' >> ~/.bashrc
```


### `.profile`と`.bashrc`について
- `.profile`と`.bashrc`はどちらもコマンドのパスやターミナル起動時に実行したいコマンドを記述しておくファイルです。
- どうして`.profile`と`.bashrc`で違いがでるのか、それは両者の読み込まれるタイミングの違いにあります。
  
- 以下の記事にあるように、`.profile`はログイン時に実行されるの対して、`.bashrc`はbashが起動するたびに実行されます。
    - https://qiita.com/magicant/items/d3bb7ea1192e63fba850


- おそらく、VSCodeのターミナルではログイン処理が実行されない（？）のが原因で`.profile`が読み込まれないのではないでしょうか。
    - （注意）完全に推測です。



## zshの場合


- zshの場合は`.zprofile`ではなく、`.zshrc`にlinuxbrewのパスを書き込む必要があります。
 
```
$ echo 'eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)' >> ~/.zshrc
```




## 検証環境

- OS: windows10(21H1)
- VSCode: Version 1.58.2 (June 2021)
- WSL: ubuntu 20.04, WSL2
- Windows Terminal: 
- Shell: 
    - zsh(linuxbrewでインストールしたもの)
    - bash(ubuntuに標準でインストールされたもの）
AtCoder Beginner Contest 211 参戦記

# AtCoder Beginner Contest 211 参戦記

C問題、さっぱり分からないのにものすごい勢いで解かれていて、競プロ典型90問かなと思ったら、本当にそうだった. やってないことが完全にディスアドバンテージになっている.

## [ABC211A - Blood Pressure](https://atcoder.jp/contests/abc211/tasks/abc211_a)

2分で突破. 書くだけ.

```python
A, B = map(int, input().split())

print((A - B) / 3 + B)
```

## [ABC211B - Cycle Hit](https://atcoder.jp/contests/abc211/tasks/abc211_b)

2分半で突破. 書くだけ.

```python
S = [input() for _ in range(4)]

if sorted(S) == ['2B', '3B', 'H', 'HR']:
    print('Yes')
else:
    print('No')
```

## [ABC211D - Number of Shortest paths](https://atcoder.jp/contests/abc211/tasks/abc211_d)

20分?で突破. 最短経路探索 BFS で経路数も記録するだけだよなあとササッと書いたらやっぱりそれで良かった.

```python
from sys import stdin
from collections import deque

readline = stdin.readline

m = 1000000007
INF = 10 ** 18

N, M = map(int, readline().split())

links = [[] for _ in range(N)]
for _ in range(M):
    A, B = map(int, readline().split())
    links[A - 1].append(B - 1)
    links[B - 1].append(A - 1)

costs = [INF] * N
counts = [0] * N

costs[0] = 0
counts[0] = 1
q = deque([0])
while q:
    i = q.popleft()
    c = costs[i]
    for j in links[i]:
        if c + 1 > costs[j]:
            continue
        elif c + 1 == costs[j]:
            counts[j] += counts[i]
            counts[j] %= m
        elif c + 1 < costs[j]:
            costs[j] = c + 1
            counts[j] = counts[i]
            q.append(j)
print(counts[N - 1])
```

## [ABC211C - chokudai](https://atcoder.jp/contests/abc211/tasks/abc211_c)

89分?で突破、TLE3. メモ化再帰で書いて、Go言語で書き直してなどして3回 TLE を食らってから真面目に考えて *O*(*N*<sup>2</sup>) になっとるやんと気づく体たらく. ある位置のある文字の通り数は、その位置までにある一つ前の文字の通り数の合計なので、1文字づつ求めて累積和をすれば *O*(*N*) になった.

```python
from itertools import accumulate

m = 1000000007

S = input()

n = len(S)
a = [1] * n
for c in 'chokudai':
    b = [0] * n
    for i in range(n):
        if S[i] != c:
            continue
        b[i] = a[i] % m
    a = list(accumulate(b))
print(a[-1] % m)
```
JavaScriptを使わないで for のような動きを実現する方法

巷では、このような質問が話題になっているようです👀

> HTML
> Javascriptを使わないでforが実行したい
> 例
>
> ```html
> <p>str1</p>
> <p>str2</p>
> ...
> <p>str100</p>
> → for(i=0;i<n;i++)
> ```

HTMLはスクリプト言語じゃないから無理だ！と言われても、執拗に質問をいろんなプラットフォームで続けているとのこと…。
そこで今回は、できる限り希望に近い解決策を個人的に考えてみました！🥒

## 前提と考察

> HTML

解釈１：HTMLで複数の同じマークアップを繰り返し記述する方法を探しています。という意味。
解釈２：HTMLと同じように記述するけど、JavaScriptを動かせない不思議な環境があって（XML）、そこで実現したい。でもこれがなんだかわからないし、HTMLでできるならXMLでもできるやろ！HTMLって書いとこ。的なノリ

> Javascriptを使わないでforが実行したい

解釈３：具体的には、JavaScriptの`for`文のような「イメージ」であることを表している
解釈４：単純に「ループ」と記載していない　→　コピペでは実現できない　→　連番をコンテンツに含む必要がある（次のマークアップ例からもそんな印象がある。）

> 例
>
> ```html
> <p>str1</p>
> <p>str2</p>
> ...
> <p>str100</p>
> → for(i=0;i<n;i++)
> ```

→ つまり、質問内容は「**静的に、連番テキストを伴う１００個のマークアップを記述したい。最も効率的な方法を教えて欲しい。**」（独自解釈）

### おまけ考察１：JavaScriptを使わない理由

スキル上の問題は、`for(i=0;i<n;i++)`がわかっているならできそうなので除外。

- もしかしたらHTMLじゃなくてXMLなのではないか？（解釈２より）
- HTMLを編集する仕事をしているJavaScriptが使えない第三者のために、楽な実装方法を探してあげている？
- セキュリティ上の理由でJavaScriptを無効にしたブラウザで業務を行わなければならない環境向けに、HTMLを納品する必要がある？
- JavaScriptをサポートしていない独自ブラウザ向けにHTMLを納品する必要がある？

### おまけ考察２：PHPやPythonなどのバックエンドの技術も使えない理由

- HTTPを使わずに、`file`スキームで閲覧する前提？
- あるいはスキル上の問題？

### おまけ考察3：EJSや、ReactなどのSSG、HTMLプリプロセッサを使わない理由

- 既存の運用作業で、開発環境に手を入れられる立場にいない？
- 使えるなら使ってると思うのでスキル上の問題？（なげやり）

## 複雑なコーディングスキルを伴わないHTMLだけでできる方法の結論。

https://qiita.com/tomoki1207/items/8e38eade574f43b624ec

→ [Visual Studio Code](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)で「[vscode-input-sequence](https://marketplace.visualstudio.com/items?itemName=tomoki1207.vscode-input-sequence)」を使う

1. HTMLファイルを開く
2. 自力でループに必要なだけ改行する
3. すべての改行を矩形選択する
4. マークアップを記述する
5. vscode-input-sequenceの機能で連番を入力する
    1. `option+command+0`キーを押下
    2. 最初の数字を入力（0始まりなら0）
    3. `Enter`キーを押下
6. 完成

### 使い方

<iframe width="560" height="425" src="https://www.youtube.com/embed/NMSvFzmxbQ8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Salesforceアドミニストレータ勉強メモ１

備忘録として、Salesforce標準オブジェクト一覧、Salesforce標準オブジェクト日英対応表を作成しました。		
		
参考資料：Salesforce SOAP API 開発者ガイド		
		
| 標準オブジェクト | 英語 | 標準オブジェクトの利用用途、オブジェクトに保存するデータの例 |
|:-----------|:------------|:------------|
| 取引先	| Account| 取引先の企業情報、競合会社、パートナーなどのビジネスに関係する組織や個人に関係する情報を保存します。| 
| 取引先責任者| 	Contact	| 取引先の担当者や顧客の個人情報を保存します。| 
| リード	| Lead| 	見込み顧客情報、見込み商談情報を保存します。| 
| ケース| 	Case| 	顧客からお問い合わせ、質問等を保存します。| 
| キャンペーン| 	Campaign| 	ダイレクトメールによる販売促進、Web セミナー、展示会など、マーケティングキャンペーン情報を保| 存します。| 
| 活動予定| 	OpenActivity| 	オブジェクトに関連する活動予定(将来の行動や未完了のToDo)を保存します。| 
| 商談| 	Opportunity| 	販売または保留中の取引である商談情報を保存します。| 
| 商談商品| 	OpportunityLineItem| 	商談対象の商品情報を保存します。| 
| 納入商品| 	Asset| 	商談が成立し、顧客へ納入した商品情報を保存します。| 
| 契約| 	Contract| 	取引先に関連付けられた契約情報、業務上の合意情報を保存します。| 
| 注文| 	Order| 	契約または取引先に関連付けられた注文情報を保存します。| 
| ソリューション| 	Solution| 	顧客の問題とその問題の解決策についての詳細な情報を保存します。| 
| 商品| 	Product2| 	Salesforce組織で販売している商品情報を保存します。| 
| 価格表| 	Pricebook2| 	Salesforce組織が販売する商品のリストを記載した価格情報を保存します。| 
| アイデア| 	Idea| 	既存の商品またはプロセスに対する拡張の提案など、ユーザがコメントまたは投票できるアイデア情報を保存します。| 
| アイデアのテーマ| 	IdeaTheme| 	アイデア(Idea)の大まかな主題を定義します。例えば、商品に対する改善要望、システムの操作方法に対する改善要望といった、アイデア投稿時のテーマを定義します。| 
| 投票| 	Vote| 	アイデア(Idea)に投票したアイデアタイトルをはじめ、投票情報が保存されます。投票オブジェクトの参照関係から、アイデアに投票したSalesforceユーザ情報の参照などを行えます。| 
| 納入商品| 	Asset| 	顧客が購入してインストールした商業価値のある項目(会社または競合他社が販売した商品等)の情報を保存します。| 
| ユーザ| 	User| 	Salesforce組織のユーザアカウント情報を保存します。| 
| ToDo| 	Task| 	営業活動などのToDo情報を保存します。| 
| 行動| 	Event| 	営業活動などの日々の行動情報を保存します。| 

以上。
主記憶装置と高速化技術

#キャッシュ
レジスタとメモリ、メモリとハードディスクの間には大きな速度がある
その差を埋めるのが__キャッシュ__
レジスタとメモリの間に設けるのが**キャッシュメモリ**
メモリとハードディスクの間に設けるのが**ディスクキャッシュ**
キャッシュメモリにはSRAMがよく用いられる

##プログラムの局所参照性
局所参照性という考え方がどうしてもわからない。。。
定義としては「参照の局所性とは、資源への参照やアクセスが一部分に偏ったり集中すること。また、その度合いとのこと」
情報工学的な考え方

###時間的局所性
最近使われたデータほど再度アクセスされる可能性が高い
キャッシュは時間的局所性を利用している
###空間的局所性
使われたデータの近くにあるデータは再度アクセスされる可能性がある
ペーシング方式は空間的局所性を利用している
###逐次的局所性
使われたデータの隣は逐次アクセス（シーケンシャルアクセス）される可能性が高い

#キャッシュメモリの割り当て方法
主記憶上のデータはブロックという一定長の単位毎にキャッシュメモリへの割り当てが行われる。
ブロックをどの場所（ロケーション）に格納するか管理する方式として３つある

##ダイレクトマッピング方式
ハッシュ演算によってキャッシュ内の単一のロケーションを求め、データを格納
衝突による入れ替えが発生し、ヒット率は低下する
##フルアソシイアティブ方式
任意のロケーションを割てる方式
管理が複雑になる
読み出すたびに全体を検索する必要があり、速度的にも難がある
##セットアソシアティブ方式
メモリブロックをキャッシュ内の２つ以上の配置可能なロケーションに割り当てる方式
キャッシュメモリを２ブロック以上のセットに分け、そのセット内ならどこでも空いてるところを使用する事ができる
ダイレクトマッピング方式とフルアソシアティブ方式の折衷案
現在一般的にこの方法が使用されている
セット内にN個のブロックを持つとき、Nウェイセットアソシアティブと呼ぶ
例）２ウェイセットアソシイアティブ

##メモリインターブ
主記憶装置へのアクセスを高速化するための方法として、キャッシュメモリ以外にあげられるもの
主記憶装置内を複数のバンクに分ける
【Java】AtCoderのABC-211に参加しました（レート：214→205）。

絶不調ですが、今回もA,BのみでC突破できずでした。
レートは214→205。ついに200を切ってしまう直前まで来てしまいました。

###A問題

入力値A,Bを使って、(a-b)%3+bを求める。
割り切れる場合は整数を、そうでない場合は小数点下を求めるような例題になっていたため、出力時に分岐を入れました。


```java
import java.util.Scanner;
import java.util.Arrays;

public class Main{
public static void main(String args[]){
  Scanner sc = new Scanner(System.in);
  int a = sc.nextInt();
  int b = sc.nextInt();
  if((a-b)%3!=0){
  System.out.println((double)(a-b)/3+b);
  }else{
  System.out.println((a-b)/3+b);
  }
}
}
```


###B問題

入力する4つの文字列に、H , 2B , 3B , HR が1つずる存在するか。
簡単なはずが、2回WAを出してしまいました。
・文字列を配列として入力
・ソート
・文字列が、H , 2B , 3B , HRの順で格納されていれば"Yes"を出力。

```java
import java.util.Scanner;
import java.util.Arrays;

public class Main{
public static void main(String args[]){
  Scanner sc = new Scanner(System.in);
  String s[] = new String[4];
  char flg = '0';
  // H , 2B , 3B , HR
  for(int i=0;i<4;i++){
    s[i] = sc.next();
    //if(s[i].equals("H")||s[i].equals("2B")||s[i].equals("3B")||s[i].equals("HR")){
    //}else{
    //flg = '1';
    //}
  }
  
  Arrays.sort(s);
  for(int i=0;i<4;i++){
    //System.out.println(s[i]);
  }
  
  
    if(s[0].equals("2B")&&s[1].equals("3B")&&s[2].equals("H")&&s[3].equals("HR")){
    System.out.println("Yes");
    }else{
    System.out.println("No");
    }
}
}
```

###感想

伸び悩んできました。足しになるか分かりませんが過去問のC問題を繰り返し解く習慣を付けようと思います。他に資格の勉強もあるので、年内茶色が難しいかも・・。せめて300は行きたいです。
GoogleマップのCIDを取得するブラウザ拡張機能をリリースしました

ブラウザ拡張機能 Copy CID を作成・リリースしました。

この拡張機能は、Googleマップを開いているとき、コンテキストメニューに「CIDをクリップボードにコピー」という項目を追加します。マップのURLにCIDが存在していればそれをクリップボードにコピーします。

Google ChromeとMicrosoft Edgeで動作を確認しています。

[CIDをクリップボードにコピー - Chrome ウェブストア](https://chrome.google.com/webstore/detail/copy-cid-to-clipboard/hkkonbjdhiaedfaleeojibmlhdcfpfkj)
[CIDをクリップボードにコピー - Microsoft Edge Addons](https://microsoftedge.microsoft.com/addons/detail/cid%E3%82%92%E3%82%AF%E3%83%AA%E3%83%83%E3%83%97%E3%83%9C%E3%83%BC%E3%83%89%E3%81%AB%E3%82%B3%E3%83%94%E3%83%BC/lffebaidibcigfdngjignknlamokckmo)

GitHubリポジトリ

https://github.com/itagagaki/CopyCID
"after_sign_in_path_for"  ログイン後の遷移先を指定する[Ruby on Rails, device実装]

#"after_sign_in_path_for" の使い方について

##使用例

```ruby:application_controller
 protected
  def after_sign_in_path_for(resource)
    root_path
  end
```
##説明
「after_sign_in_path_for」の役割は、ログイン後に遷移先を指定することができます。
今回はroot_pathなので、ログイン後ホーム画面に遷移します。



###今回出てきた単語について
・[protected](https://qiita.com/akachiryo/items/2e765220d6b2573f64d6)
・(resourse)
・root_path
ghコマンドでリポジトリを作る

# Mac OSの場合

`brew install gh`

（他OSは一旦省きます）

# ghコマンドの認証をします

```bash
gh auth login
```

沿っていきます。

```bash
% gh auth login
? What account do you want to log into? GitHub.com
? What is your preferred protocol for Git operations? SSH
? Upload your SSH public key to your GitHub account? /Users/akito/.ssh/id_rsa.pub
? How would you like to authenticate GitHub CLI? Login with a web browser

! First copy your one-time code: AF2D-350E
- Press Enter to open github.com in your browser... 
✓ Authentication complete. Press Enter to continue...

- gh config set -h github.com git_protocol ssh
✓ Configured git protocol
✓ Uploaded the SSH key to your GitHub account: /Users/akito/.ssh/id_rsa.pub
✓ Logged in as akuraya
```

# リポジトリを作る

```
git init github_template
cd github_template
gh repo create

? Repository name github_template
? Repository description 
? Visibility Public
? This will add an "origin" git remote to your local repository. Continue? Yes
✓ Created repository akuraya/github_template on GitHub
✓ Added remote git@github.com:akuraya/github_template.git
```

https://cli.github.com/manual/gh_repo_create
[Symbol] ハーベスト報酬99%還元ノード運営始めます

# ノード情報
「**symbol-node.takagi-tech.com**」

# 概要

**アップデート（2021年9月5日）**

- ノード報酬を還元する汎用ツールをOSSとして公開しました。
    - [[Symbol] ノード運営者向けハーベスト還元ツールを開発しました](https://qiita.com/nobu_kyutech/items/b77164b77691a76c3b31)
    - https://github.com/ancte0721/symbol-nodefee-kickback-tools
- 1次開発完了のため、「**symbol-node.takagi-tech.com**」ノードでの99%還元は9/5をもって終了とし、今後は **75%還元** で運用を続けます
    - 残り **25%** はSymbol関連の開発や技術記事の執筆活動に充てます
    - 還元による高効率なハーベストをしたい方、自分の活動を応援してくださる方のハーベスト委任お待ちしております


**記事公開時（2021年7月24日）**

- ハーベスト報酬の内、ノード報酬（ハーベスト報酬の25%）の~~99%~~をハーベストしたアドレスへ還元します
    - 1日1回、前日分を集計して還元します
- 還元作業を汎用的なプログラムに落とし込み、~~OSSとして公開予定です~~
    - また、還元系ノード運営者への普及活動、あるいは還元代行のサービス化を検討します
- 99%還元は期間限定ですが、~~終了時期は未定~~です
- ~~残りの1%は還元時の送金手数料に使います~~



# 背景
ハーベスト報酬を還元するノードが数多くありますが、還元作業がプログラムによって完全に自動化されているノード運営者は少ないと感じています。
そんな中、手作業での還元で誤って35万xymを送金してしまう事故が起きました。
（受取人から無事に返金されたようで良かったです）
誤って送金してしまったノード運営者の方は自己責任だとおっしゃっておりますが、手作業である以上、このようなヒューマンエラーを100%防ぐことは不可能で、今回たまたま運悪くこの方だっただけだと思っています。

エンジニアである自分がSymbolコミュニティに貢献できる事を考えたときに、このような手作業による送金ミスを減らすべく、汎用的なハーベスト報酬還元アプリの開発を思いつきました。
また、自らが構築・運用しているノードに委任者が居ないので、このノードを活用したいと思います。
ノード手数料99%還元とすることで委任者を集め、委任頂いた方への還元作業をプログラム化してOSSとして公開予定です。
そして、このアプリを使って頂けるというノード運営者への導入サポートや還元代行サービスを検討していきたいです。


# 自己紹介
- とある会社でデータサイエンティスト・データエンジニアとして働いています
- Symbolローンチの時期からSymbolに興味を持ち、ノードの構築・運営をしていました
- Pythonでのウォレット情報の取得や送金などのサンプルプログラムをGithubに、解説をQiita記事で公開しています
    - これらの記事は英訳され、海外向けにも広く共有されています

https://github.com/ancte0721/symbol-python-training

https://qiita.com/nobu_kyutech/items/9c40a267dcf1f2042faf

https://symbolblog.com/article/getting-started-with-symbol-in-python-part-1/




# 開発するアプリケーションの機能案
1. 指定範囲のブロック高でハーベストしたアドレスへの送金機能
1. 送金額に関して、ノード手数料に対する割合、または絶対値を任意に設定可能な機能
1. 送金限度額を設定し、その金額以上の送金をプログラムが行おうとした場合、送金作業を停止する機能
1. 実際には送金しないが、どのアドレスにいくら送金するか事前に確認できるドライラン機能

他にも案やコメント等ありましたらコメントやTwitterにてご連絡ください。
herokuデプロイで環境変数関連で積んだ話

#開発環境
```
ruby:3.0.1
rails:6.0.4
heroku
Mysql
```

#起こったこと
ruby on railsにてアプリケーションを作成して一度テストでherokuにデプロイしてみようと思い下記コマンドを実行

```
 git push heroku master
```

とワクワクしながらデプロイしてみて無事に成功したと思い、さっそくURLをたたいてみたところ

***We're sorry, but something went wrong***とでかでかと表示されて「いやなんでだよ！」と思いながら、とりあえず正しく表示されないってことはどこか間違いやエラーがているのではと思い、デプロイした際に出てくる細かい文字は読み返して見たところ気になる記述がありました。

```
remote: -----> Preparing app for Rails asset pipeline
remote:        Running: rake assets:precompile
remote:        rake aborted!
remote:        NoMethodError: undefined method `[]' for nil:NilClass

##省略
remote:  !
remote:  !     Precompiling assets failed.
remote:  !
remote:  !     Push rejected, failed to compile Ruby app.
remote: 
remote:  !     Push failed
remote: Verifying deploy...
remote: 
remote: !    Push rejected to hogehoge.
remote: 
To https://git.heroku.com/hogehoge.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/appname.git'
```

「え？なにこれ？」って一瞬思いましたが、よくよく見てみると***NoMethodError: undefined method `[]' for nil:NilClass***と表示されており本番環境では
aws s3に画像を保存するように記述しており、そこで設定した環境変数をちゃんと代入できないと思い下記コードを実行

```
rails c
```
これでAWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_S3_REGION, AWS_S3_BUCKETのすべての環境変数がちゃんと設定できているか確認しました。

つまり環境変数はちゃんと定義されており、問題ないと思い再度プッシュしてみましたが、やはり先ほどと同じエラーが出ます。

そしてherokuにおいてある環境変数を全部大文字から小文字にして、再度プッシュしたらちゃんとアプリケーションが表示されました。

以上です、まだまだ知識不足だと痛感しました・・・
Visual Studio Codeとts-nodeでシンプルなTypeScriptデバッグ環境を作る

# はじめに
VSCodeでTypeScriptをデバッグしたい時、割と環境構築が面倒だったりしませんか？ts-nodeを使えば簡単にデバッグできるようになるので、今回はそのやり方をご紹介します。

# 手順
※プロジェクトディレクトリは作成済みとします
①`npm`を初期化

```shell
npm init
```

②`TypeScript`をインストール

```shell
npm install typescript @types/node@14
```
※「14」の部分はお使いの`Node.js`のバージョンに合わせてください

③`ts-node`をインストール

```shell
npm install ts-node
```

④`launch.json`にエントリポイントを追加

```launch.json
"args": [
    "${workspaceFolder}/src/index.ts"
]
```

⑤`launch.json`に下記設定を追加

```launch.json
"runtimeArgs": [
    "-r",
    "ts-node/register"
]
```

`launch.json`全体ではこんな感じです

```launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "pwa-node",
            "request": "launch",
            "name": "Launch Program",
            "runtimeArgs": [
                "-r",
                "ts-node/register"
            ],
            "skipFiles": [
                "<node_internals>/**"
            ],
            "args": [
                "${workspaceFolder}/src/index.ts"
            ]
        }
    ]
}
```

以上で設定は完了です。シンプルでしょ？

# 動作確認
プロジェクトディレクトリ直下に`src`ディレクトリを作成し、下記のファイルを配置します

```index.ts
import {testClass} from "./test";

const test = new testClass();
test.testFunction();
```

```test.ts
export class testClass {
    testFunction() {
        console.log("testFunction has called");
    }
}
```

エントリポイントである`index.ts`で`testFunction`を呼び出すだけですね

最後に、好きな箇所にブレークポイントをセットしてデバッグ画面で先程作成した`launch.json`を選択し、実行ボタンをクリックします
![スクリーンショット 2021-07-24 22.48.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212159/a89f6066-3187-7fb2-67fc-44538cddf359.png)

まず`testFunction`の呼び出し元がヒットし
![スクリーンショット 2021-07-24 22.52.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212159/06a5d087-d886-56a8-b9c6-ff7af364ea53.png)

次に`testFunction`の内部がヒットすることを確認できました
![スクリーンショット 2021-07-24 22.52.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212159/251c5b30-0a70-3693-5024-62eea55ae4e2.png)

今回は以上です。
【Flutter】DropDownButtonのウィンドウの高さを変更したい

FlutterでプルダウンのUIを実装したい場合はDropDownButtonを使うと思います。

DropDownButtonクラスの`items`にメニューの選択肢のウィジット、よくある例だとTextウィジットの配列を渡し`onChanged`も用意すればタップ時にメニューウィンドウが表示されます。

itemsの数によってよしなにメニューウィンドウの高さを調節してくれますが、候補がいくつも例えば100個ぐらいある場合だと画面の上下いっぱいの高さに広がります。

さらに凄い極端な例で、`isExpanded`にtrueでの横幅に広がる設定も入れてると画面いっぱいに広がってしまい他のUIが見えなくなってしまいます。↓

<img width="400" alt="B9F888EF-5570-47D6-B774-A434F2DA136C.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80912/2ead2a5c-be23-6f06-b38e-0b16beb07f8d.png">


このメニューウィンドウの高さって変更できないの？と調査したらFlutterの2.2.0以上のバージョンだと**menuMaxHeigth**という高さを指定できる引数が新しく追加されていました。
<font color="Red">Flutter2.0.x代や1はできないので注意です</font>


https://flutter.dev/docs/development/tools/sdk/release-notes/release-notes-2.2.0

issue番号76493↓ 
![スクリーンショット 2021-07-24 22.51.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80912/6bc93713-2150-bb85-5387-573831cc55da.png)

**公式ドキュメント↓**

https://api.flutter.dev/flutter/material/DropdownButton/menuMaxHeight.html


# 試してみた

適当に数値を設定するだけです

```Dart

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('ドロップダウン'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Center(
          child: DropdownButton(
            items: List.generate(100, (index) => 'hogehogehoge')
                .toList()
                .map((value) => DropdownMenuItem(
                      value: value,
                      child: Text(value),
                    ))
                .toList(),
            onChanged: (_) {},
            isExpanded: true,
            menuMaxHeight: 450, // ←　追加
          ),
        ),
      ),
    );
  }
```

画面いっぱい広がらず指定の高さのメニューウィンドウで表示されます↓

<img width="400" alt="DDFA3E45-DFA6-41AA-A4F3-539433D23A06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80912/8b6cb306-eea1-a841-776a-61469e5071ff.png">
[Ruby]曜日の設定

# はじめに
本記事では、初学者なりに私が何度も何時間も考え、
ようやく解消したものになります。
備忘録として残したいと思いましたので投稿いたします。

# 曜日の設定
私がトライしたものは、
以下の画像の曜日を設置するものでした。
*すでに完成したものを添付しております。ちょっと遊んでましたw

![曜日画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1768158/9f97b2a3-e0b0-fdc1-92ef-3d3a12ec5f07.png)


# 回答(曜日追加部分についての回答)

*コントローラー*

```ruby
def get_week
    wdays = ['日','月','火','水','木','金','土']

    @week_days = []
    @todays_date = Date.today

    plans = Plan.where(date: @todays_date..@todays_date + 6)

    7.times do |x|
      today_plans = []
      plans.each do |plan|
        today_plans.push(plan.plan) if plan.date == @todays_date + x
      end
    
      wday_num = Date.today.wday + x
      
      if wday_num >= 7
        wday_num = wday_num -7
      end

      days = {month: (@todays_date + x).month, date: (@todays_date + x).day, plans: today_plans, wday: wdays[wday_num]}
      @week_days.push(days)

      end
    end
  end

```


*ビュー*

```ruby
<div class='calendar'>
  <% @week_days.each do |day| %>
    <div class='item'>
      <div class='date'>
        <%= day[:month] %>/<%= day[:date] %>・<%= day[:wday] %>
      </div>
      <ul class='content'>
      <% if day[:plans].length != 0 %>
        <% day[:plans].each do |plan| %>
          <li class='plan-list'>・<%= plan %></li>
        <% end %>
      <% end %>
      </ul>
    </div>
  <% end %>
</div>
```

# ミスしたこと
ビューは特に問題なかったですが、
コントローラーの記述がなかなかできずにいました。

####①曜日を自動的記述できない
日月火水・・・と記述することがなかなかできず、
`繰り返し処理`することだけが頭にあったため、
ひたすら`wday_num = Date.today.wday + 1`
と記述していました。

結果として、
毎日が翌日の曜日になるという表示になっていました。
ex.金金金金・・・・・


####②xという存在
まず、日付については繰り返し処理が完成していたため、
それに気づかなかったのは反省点でした。
①で繰り返し処理ということがわかっていたのに、
それ同様に曜日も設定することの切り返しができていなかった。


####③そもそも作るアプリケーションの理解が浅かった
まず、自分はカレンダーを想像していたため、
１ヶ月分まるまるの表示が必要になると勘違いをしてしまっていました。
つまり、３０回、３１回繰り返し処理が必要だと勘違いをしていたわけです。

今後は、`どんなアプリケーション`なのかをイメージし、`概要を把握`した上で、
取り組むことが必要だと感じました。


####④配列の理解の浅さ

```ruby
wdays = ['日','月','火','水','木','金','土']
wdays[0]

# =>'日'を取得できる
```
初歩の初歩。
ここを理解していたかと言われたら本当はそうではなかったです。
プライドを捨て、できないこと、理解していなかったところは、
理解できるように前に進みます。

# 終わりに
たくさんいろんな人にアドバイスをいただきながら完成しました。
これを完成させるのに２０時間。。
できない自分に腹が立ち、それとともに自信が少しなくなりました。

ただ、
これがプログラミング、
これから就職したらこのようなことが起こるのだと感じました。
また、リアルに近いものを体験できたことは非常に価値のある時間だったとも感じました。

諦めず、自分をコントロールしながら乗り越えていけるよう引き続き頑張ります！
メモリの分類〜応用情報技術者試験に向け〜

#メモリの分類
半導体メモリは２つに分けられる。
それはRAMとROMである。

* RAMはrandom access　memory
電源を切ると内容が消える。（**揮発性**）
読み書き可能


* ROMはread only memory
電源を切っても内容は消えない（**不揮発性**）
読み出しだけ可能

##RAMの種類いろいろ

|名前|説明|
|:--|:--|
|DRAM|Dynamic RAMの略<br>定期的なリフレッシュを必要とする<br>主記憶装置に主に用いられる|
|SRAM|Static RAMの略<br>非常に高速<br>リフレッシュ不要<br>キャッシュメモリとして用いられる|

##ROMの種類いろいろ
read only memoryと言っても、専用の機器を使えば、書き込む事ができる。

###マスクROM
読み出し専門のメモリ。製造時にデータを書き込み、以降は内容を書き込む事ができない。

###PROM
program ROMの略
ユーザーの手で書き換えることのできるROM

|名前|説明|
|--|--|
|EPROM|Erasable PROM<br>紫外線でデータを消去して書き換える事ができる|
|EEROM|Electrically EPROM<br>電気的にデータを消去して書き換える事ができる|
|フラッシュメモリ|EEROMの一種<br>全削除ではなくブロック単位でデータを削除して書き換える事ができる|
VS Code: Select Language Mode をショートカットで

# なぜ？
- Active Editor に JSON 貼り付けた場合にも自動認識してほしい（Power Automateの解析によく使うので）
- メニューで Select Language Mode をしようとしても見つからない
- ショートカットが Select Language Mode の Pop Up に表示されない

で、ずっと無いものだと思ってマウスで操作してたんですが、調べたらちゃんとありました・・という記録

マウスの場合は以下操作
![Select Language Mode by Mouse.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/f3082e69-c7ae-6c8e-a042-235676911414.gif)

# まずはショートカットの紹介
- メニューから
    1. CTRL + Shift + P 
    1. "Change Language Mode" を選択
    1. {language} を選択

:::note info
"Select Language Mode" じゃなかったのが敗因・・Pull Request したら通る・・かな？😄
:::
- ショートカット
    1. CTRL + K, M
    1. {language} を選択
![Select Language Mode by Key.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/0d001915-7f2c-9103-64e6-8f52262a4f32.gif)

### 直接 JSON とかに切り替えるショートカットほしい人用
https://marketplace.visualstudio.com/items?itemName=NferZhuang.change-to-language-mode#:~:text=Provides%20JUST%20one%20command%20to%20Change%20Language%20Mode.,type%20Change%20Language%20Mode%20Type%20HTML%20and%20Enter

# 基本となる拡張子によるファイル認識
通常、拡張子で勝手に認識してくれるようにはなっているので、クリップボードへ貼り付けたりしない限りはこれのおかげで困りはしない筈。ありがたやありがたや🙏
- 設定で、"associations"で検索すれば追加可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/80566d80-036a-efde-4c39-68ad880cf0bb.png)

https://code.visualstudio.com/docs/languages/overview#_changing-the-language-for-the-selected-file

https://code.visualstudio.com/docs/languages/identifiers

# コードを自動認識しようというプロジェクト
<code>window.activeTextEditor.document.languageId</code> に機械学習Modelで判定させた結果を設定しようとしてる？
試そうとしたけど、以下コメントあったんで、期待して待ってます。
Model.json を今度調べないとな・・。
> NOTE: This is only for VS Code. In the future, you shouldn't have to do this.

https://code.visualstudio.com/api/references/vscode-api
【Git】超便利"git restore"で変更の取り消しをする方法

####My Profile
プログラミング学習歴②ヶ月目のアカウントです！
プログラミングスクールで学んだ内容や自分が躓いた箇所等のアウトプットの為に発信しています。
また、プログラミング初学者の方にわかりやすく、簡潔にまとめて情報共有できればと考えています。
もし、投稿した記事の中に誤り等ございましたら、コメント欄でご教授いただけると幸いです。　



#対象者

* 一度実施した変更箇所をもとに戻したい方


#目的

* 変更箇所をもとに戻す

#実際の手順と実例
###1.git restore .

* Terminalで下記コマンドを実行する（ドットが大事）
* 正確にrestoreを解説すると「指定したコミットのファイルをワーキングツリーに復元してくれる」コマンドです
* カレントディレクトリでもとに戻せます

````
$ git restore .
````


###2.$ git restore --source [コミット識別子] [ファイル名]


* これだと指定コミット識別番号の状態にできます。

````
$ git restore --source [コミット識別子] [ファイル名]
$ git checkout [コミット識別子] [ファイル名]
```


###3.ちなみに、、、、

関係ないけどファイル変更差分が見れる下記コマンドすごく使える

````
$ git diff
```



#参照
>[第8話 switchとrestoreを使ってみよう 【連載】マンガでわかるGit ～コマンド編～](https://www.r-staffing.co.jp/engineer/entry/20200131_1)

>[第9話 git diff で差分を確認！【連載】マンガでわかるGit ～コマンド編～](https://www.r-staffing.co.jp/engineer/entry/20200228_1)
MVCモデルを理解する。

##始めに....。
・MVCモデルを理解したいので記事にしたいと思います。



#MVCモデルとは

~Model、View、Controllerに分割をしてコーディングを行うモデルのことを指す。~

役割
・Model　--->システムの中でビジネスロジックを担当。

・View --->表示、入出力の処理を担当。

・Contoroller --->ユーザーの入力に基づき、ModelとViewを制御。

![2E89D206-9F18-4665-9031-2A69F84B7835_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878168/5e282e69-ccec-2971-68b0-9106d3fe1b23.jpeg)

＊記事参考、図引用
(https://qiita.com/s_emoto/items/975cc38a3e0de462966a)

＊上の図　MVCモデルの概念図
(出典：http://www.slideshare.net/MugeSo/mvc-14469802)

#MVCモデルの挙動
Railsチュートリアルをやった際に出てきた図をおさらいしたいと思います。

![03B85BB6-D801-4D62-AB92-83E185F67522.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878168/5b6f9eb2-0754-c5e3-8b79-d3e1f836878b.png)

「/users にあるindexページをブラウザで開く」という操作をしたとき、内部では何が起こっているかについてMVCで説明。


1.ブラウザから「／users」URLをリクエストし、サーバーに送信する。

2.「／users」リクエストはRailsのルーティング機構（ルーター）でUsersコントローラー内のindexアクションを割り当てる。

3.indexアクションが実行されるとUserモデルに問い合わせをする。

4.Userモデルは問い合わせに対して全てのユーザーをデータベースから取り出す。

5.データベースから取り出したユーザーの一覧をUserモデルからコントローラーに返す。

6.Usersコントローラーはユーザーの一覧を変数に保存しビューに渡す。

７.ビューが起動してERB（Embedded RuBy: ビューのHTMLに埋め込まれているRubyコード）を実行してHTMLを生成する。

8.コントローラーはビューで生成されたHTMLを受け取りブラウザに返す。


＊記事、図　参考と引用
（https://railstutorial.jp/chapters/toy_app?version=6.0#sec-mvc_in_action)

#MVCのメリット
・機能が分割され独立しているので変更や修正がしやすく、何かあったとしても影響が出にくい。
Rubyでクラスが定義されていないエラーに遭遇(DRb::DRbUnknown)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462614/34bc8830-f98d-4d1d-b801-2dbcf29bf4d6.png)

dRubyというRubyのスタンダードライブラリにあるプロセス間の通信を可能にするものがあります。

これを使って、バックエンドジョブのGemを今作っています。

[Belated](https://github.com/sampokuokkanen/belated/)

用途としては主にRedis, PostgreSQLが使えない、純粋にRuby, SQLiteだけを使う場合に使えるものとして作っています。
（まだちゃんと使えるものではないですが。。。）

ちょっと試しているときに、`DRb::DRbUnknown`というエラーに遭遇しました。

以下のようなコードでした。

```bash
$ bundle exec belated # Belatedのプロセスを起動
```

Railsのコンソールのなか:

```ruby
class Hello
  def perform
    puts 'hello world'
  end
end
client = Belated::Client.new
client.perform_belated(Hello.new)
```

これで`DRb::DRbUnknown`というエラーになりましたが、原因はBelatedの方はこのコードにアクセスできていないからです。Railsのコンソールで新しく定義したクラスだからですが、ここでこのオブジェクトに対して`reload`を実行して、定義されているかどうかを試すこともできるみたいです。

考えてみれば当たり前ですが、普段一つのプロセスの中でしか動いていないプログラムを書いているとなかなかここまで考えないですね。
Sidekiqのコードを読むと、[Reloader](https://github.com/mperham/sidekiq/blob/master/lib/sidekiq/rails.rb#L7)というクラスにも遭遇しますので、そこも開発環境の考慮が入っているみたいです。

詳細はこちらで確認できます:
https://docs.ruby-lang.org/ja/latest/class/DRb=3a=3aDRbUnknown.html
C#の基本イディオムについてその4~文字列の判定~

C#でコードを書く際に文字列を使用する場合の基本的なイディオムについてまとめた。

## 文字列が同じかどうかを判定する
(例)string型の変数であるnameが"冨岡義勇"かどうかを判定したい場合

~~~csharp
if(name == "冨岡義勇")
~~~

## 文字がnullか空文字かどうかを判定する
(例)string型の変数であるnameがnullか空文字かどうかを判定したい場合

~~~csharp
if(String.IsNullOrEmpty(name))
~~~

こうすることで、
・name == ""
・name.Length == 0
・name == null
などのint型、string型の場合の処理をまとめてやってくれる。

### 値がnullでないことが分かっており、空文字が返ってくる可能性がある場合
その場合は、空文字かどうかを判定すればいいだけなので、

~~~csharp
if (name == String.Empty)
~~~

もしくは

~~~csharp
if (name == "")
~~~
で判定する。

個人的には、 コードの短さと分かりやすさから後者を採用したい。


### 空白だけが入力されているかも判定したい場合
場合によっては、" "のように空白しか入力されていない場合があるが、これかどうかを判定したい場合は、

~~~csharp
if(String.IsNullOrWhiteSpace(name))
~~~
と書くことで、null、" "かどうかを判定できる。

## 値の頭に特定の文字列があるかどうかを判定する
(例)string型の変数であるnameの頭に、「"水柱・"」という値が含まれているかどうかを判定したい場合

~~~csharp
if(name.StartsWith("水柱・"))
~~~

## 値の後に特定の文字列があるかどうかを判定する
(例)string型の変数であるnameの後に、「"様"」という値が含まれているかどうかを判定したい場合

~~~csharp
if(name.EndsWith("様"))
~~~

## Linqを使うパターン
### 値の中に特定の文字があるかどうかを判定する
(例)string型の変数であるnameに、「・」があるかどうかを判定したい場合、

~~~csharp
if (name.Contains('・'))
~~~

LINQのContainsメソッドを使用する。

### 文字列のすべてをチェックするパターン
(例1)パスワードなど、大文字を1文字以上入れるなどの処理が必要な時に、入力されたstring型の変数に大文字が1文字以上入っているかどうかチェックしたい場合

~~~csharp
if(name.Any(el => Char.IsUpper(el)))
~~~

LINQのAnyメソッドを使うことで、　値を1文字ずつチェックし1文字でも、条件を満たしている文字があれば以降の処理をせずに、Trueを返す。
この場合、IsUpperメソッドで大文字があれば、Trueを返す。

(例2)金額や年齢など、数値のみ代入されているかどうかを判定したい場合

~~~csharp
if(name.All(el => Char.IsDigit(el)))
~~~

LINQのAllメソッドを使うことで、値を1文字ずつチェックし、全て条件を満たしていればTrueを返す。
この場合は、IsDigitメソッドで値が数値かどうかを判定し、Trueを返す。

## 参考文献

https://www.amazon.co.jp/gp/product/4774187585/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1

https://www.it-swarm-ja.com/ja/c%23/%E6%96%87%E5%AD%97%E5%88%97%E3%81%AB%E5%A4%A7%E6%96%87%E5%AD%97%E3%81%8C%E5%90%AB%E3%81%BE%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E3%81%A9%E3%81%86%E3%81%8B%E3%82%92%E6%A4%9C%E5%87%BA%E3%81%99%E3%82%8B/1043160810/
OpenFOAM 9 チュートリアルケースの動作確認 : 応力解析、solidDisplacementFoam、穴あき板の応力解析

# ケース
$FOAM_TUTORIALS/stressAnalysis/solidDisplacementFoam/plateHole
# 概要
本チュートリアルケースでは、中央に円形の穴を有する正方形板の線形弾性定常応力解析を行います。板の大きさは辺長 4 m で、穴の半径は 0.5 m です。板の左右端には、$\sigma$ = 10 kPa の一様表面力が負荷されています。本形状では2つの対称面が存在するため、解析領域は板全体の4分の1の部分をカバーすれば十分です。
# 解析モデル
解析モデルを下図に示します。
![figModel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1784513/4e1ab7ff-8c60-536f-bf77-1f931e8dc801.png)
# 解析条件
解析条件を下表に示します。

|項目1|項目2|項目3|単位|設定内容|
|---|---|---|:-:|:-:|
|_system_|_controlDict_|開始時刻|sec|0|
|   |   |終了時刻|sec|100|
|   |   |$\Delta$ _t_|sec|1|
|_constant_|_thermophysicalProperties_|密度 $\rho$|kg/m3|7854|
|   |   |Poisson比 $\nu$|-|0.3|
|   |   |Young率 _E_|Pa|2E+11|
|   |   |比熱容量 _Cp_|J/kg/K|434|
|   |   |熱伝導率 $\kappa$|W/m/K|60.5|
|   |   |熱膨張率 $\alpha$|1/K|1.1E-05|
|   |   |planeStress|-|yes|
|   |   |thermalStress|-|no|

本チュートリアルケースでは、熱の方程式は解かないため、thermalStressはnoとします。
# 解析結果
計算終了時の応力場 _$\sigma$xx_ の分布を下図に示します。
![figSigmaxx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1784513/11a0047a-d262-0a3b-4c89-4948039e7d05.png)
計算終了時の応力場 _$\sigma$xx_ のプロットを下図に示します。
![stress.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1784513/43a82292-816d-8ef3-eedb-e1dbb06f4412.png)
# 実行コマンド
前処理 (Pre-processing)
`run`
`cp -r $FOAM_TUTORIALS/stressAnalysis/solidDisplacementFoam/plateHole .`
`cd plateHole`
メッシュ作成・アプリケーションの実行・後処理 (Post-processing)
`./Allrun`
# 計算時間
0.09 (sec), シングル, AMD Ryzen 7 3750H with Radeon Vega Mobile Gfx
# 参照
- [OpenFOAM v9 User Guide: 2.2 Stress analysis of plate with hole](https://cfd.direct/openfoam/user-guide/v9-plateHole/)
- [XSim](https://www.xsim.info/articles/OpenFOAM/tutorials/stressAnalysis-solidDisplacementFoam-plateHole.html)
TerraformでWindowsインスタンスをデプロイした後に引き続きAnsibleを実行するとCredencialエラーが出て失敗する件

…という名の備忘録です。恥の多い人生を送ってきました。
冪等性とか云々言ってたらこんなことせん方がいいのではないか説も頭にはあるんですが、
だってめんどくさいんだもの。

#なんでこんなめんどくさいことを
TerraformとAnsible、まあ得意分野が違うじゃないですか。
なので、AWSやAzureなどでインスタンスをデプロイするにはTerraformを使い、
その後OSの設定を行う分にはAnsibleで行う計画を立てました。

しかし、2種類のソフトを使って構築の自動化を行うわけじゃないですか。
まあ基本設定のPlaybookなんかは最初に作ってしまうから、そんなことはいいんですよ。
私は1台自動デプロイするのに2回もコマンドを打たねばならないのがもうめんどくさいんですよ。
ナマケモノなので。（ナマケモノに失礼）
そのようなわけで、できればTerraformでAnsibleのコマンドを組み込んだtfファイルを作って実行するか、
Ansible PlaybookでTerraformを実行したい。

AnsibleにはTerraformのモジュールあるみたいなんですが、
僕が調べた時点では「実行結果はTerraformを単独実行したような出方しないよ」という情報が目についたんで早々に投げました。

そこで、Terraformのlocal-execを使うことを画策したわけです。
まあhashicorpの方であまり推奨はしていない（たぶんコマンドの実行結果をhashicorpの方で保証できないから）provisionブロックですが、ある以上は使わせてほしい。
だってそこにあるから。

#どのように構成したか
AWSのEC2インスタンスで、Windows Server 2019をデプロイするという前提。
AWSのクレデンシャルとかは既に解決している前提、というか
Terraform単体、また既にデプロイ済のWindowsインスタンス上でWinRMをリモート通信可能にした状態でAnsible単体で実行可能なのは確認済みです。
ワイは一気通貫に設定してしまいたいんや。

だもんで、インスタンスデプロイ時にユーザーデータでWinRMをLinuxから通信可能な状態に持っていくようなスクリプトを実行します。
BASIC認証の許可と、平文の許可ですね。
ドメイン参加した後ならkerberos認証でも何でも使えばよいのですが、今この瞬間は勘弁してほしい。
ドメイン参加が終わった後に、BASICと平文を不許可に変更し、ポート番号を変えた状態で、
たとえばNTLM認証でローカルのAnsible実行ユーザでwin_pingモジュール使えるとかは確認済です。

「最初からそのユーザーデータに設定させれば良いのでは」という意見は石のように黙殺します。
もうAnsibleのPlaybookできとるんや。ワイはコンコルドなんや。
あと企業のサーバだと、設定項目がいろいろあったりするんで、ユーザーデータが大長編になったりするし
引数も色々渡したかったりするし、めんどくさいんですよ…。

#単体で実行すると通るAnsibleコマンドが、provisionブロックからだと通らない、のは
Terraformの実行ファイル、resourceブロックにec2のデプロイ用の設定値を色々書いて、ユーザーデータも含めて、
そしてその最後にprovision子ブロックを用意してlocal-execでansible-playbookコマンド書きますやん。
実行しますやん。
「Credencialエラー」が出ますやん。
コマンド間違ってんのかと思って、Linuxの画面に出た実行コマンドそのままコピペして実行してみますやん。
通るんだなぁこれが。

これが通るとなると、WinRMの設定はうまくいっている。
では問題は何か？Terraformでの実行ユーザに問題あるのか？
と思ったら、デバッグログ出してみたら単体でAnsible実行した時と同じ、つまり僕のアカウントなんだなぁこれが。
わけがわからないよ。キュウべえになってしまうよ。

だが他の仕事の合間にこれをやってた僕はふと気づいたね。
「ユーザーデータの実行が、全て終わっていないのでは？その前にprovisionブロックを実行してしまっているのでは？」

そこで、provisionブロックに書くコマンド、次のようにしてみたよね。

```
sleep 60;ansible-playbook -i inventory deploy.yml -e newhost
```

ちょっと聞いてくださいませ奥様。こうすると通るんですの。

……。
…………。

……コマンドの実行を遅延させるLinuxコマンド「Sleep」で60秒の遅延時間を与えると、普通に通りましたよ。
つまりユーザーデータの実行がすべて終わらないうちからWinRMに通信かけてるので通らなかっただけ。そりゃ通らないよ。開いてないんだから。
早まるな、コンピュータが早まるんならあいつらはバカなんだからこっちが指示してやれ。
まあつまりそういうことです。私のようになってはいけないとあの子に伝えてほしい(『朝日のあたる家』)。
AWS CDKを使ってBoltをLambdaにデプロイする 

# この記事はなに？

SlackBotにハロワをさせるだけです😅
「既存の記事と多少違う！」という点はPython + CDK + Boltで実装する！という点です。

BoltはSlackの公式ライブラリーで、Slackを使ったアプリが簡単に作れるやつです！
これを使うにはバックエンドのサーバーが必要です。
ここを今回はAPIGateway + Lambdaでやっていきます。
またこのインフラ＆アプリはPython + CDKで実装します！

という内容の記事😅

_2021/09/27_

もっとシンプルにする方法がありました🙇

https://qiita.com/sisii00/items/cec4fa8647b60918e194

# 使ったライブラリー

- [AWS CDK](https://aws.amazon.com/jp/cdk/)
- [awsgi](https://github.com/slank/awsgi)
- [Flask](https://flask.palletsprojects.com/)
- [Bolt](https://github.com/slackapi/bolt-python)

Lambdaで直接Boltは使えないのでFlaskを利用し、
さらにLambdaで直接Flaskは使えないので、awsgiを利用する感じです！

# 実際のコードはこんな感じ

## CDKのスタック

LambdaをRestApiでデプロイします👍

```python:app.py
import os

from aws_cdk import core
from aws_cdk.aws_apigateway import LambdaRestApi
from aws_cdk.aws_lambda import Runtime
from aws_cdk.aws_lambda_python import PythonFunction

APP_NAME = "CdkBoltHelloWorld"

class CdkBoltHelloWorldStack(core.Stack):
    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        lambda_ = PythonFunction(
            self, f"{APP_NAME}Lambda", entry="app", handler="handler", runtime=Runtime.PYTHON_3_8,
        )

        LambdaRestApi(self, f"{APP_NAME}Gateway", handler=lambda_)

app = core.App()
env = core.Environment(account=os.getenv("CDK_DEFAULT_ACCOUNT"), region=os.getenv("CDK_DEFAULT_REGION"))
CdkBoltHelloWorldStack(app, APP_NAME, env=env)
app.synth()
```

## アプリ側

Lambdaの`requirements.txt`はこんな感じ

```python:app/requirements.txt
slack-bolt==1.7.0
aws-wsgi==0.2.6
Flask==1.1.1
```

アプリ本体はこんな感じ

```python:app/index.py
# ---- Boltアプリ ------------------------------
from slack_bolt import App

SLACK_SIGNING_SECRET = "SlackアプリのSIGNING_SECRETを貼り付ける"
SLACK_BOT_TOKEN = "SlackアプリのBotトークンを貼り付ける"
app = App(signing_secret=SLACK_SIGNING_SECRET, token=SLACK_BOT_TOKEN,process_before_response=True)

@app.message("hello")
def message_hello(message, say):
    say(f"Hey there <@{message['user']}>!")

# ---- flaskアプリ -----------------------------
from flask import Flask, request
from slack_bolt.adapter.flask import SlackRequestHandler

flask_app = Flask(__name__)
slack_handler = SlackRequestHandler(app)

@flask_app.route("/slack/events", methods=["POST"])
def slack_events():
    return slack_handler.handle(request)

# ---- Lambda向けハンドラー -----------------------
import awsgi

def handler(event, context):
    return awsgi.response(flask_app, event, context)
```

#　最後に

今回初投稿でした！
これからは定期的に投稿できるようにがんばりますー😆

ブログもやってます！
今回の記事でもうちょっと細かい説明を！という方がいましたらブログの方をみてみてください😆もうちょい詳しいです

https://blog.i-tale.jp/2021/07/d9/

また今回とはちょっと違いますがソースコードはこのへんにありますー

https://github.com/sisi100/cdk_bolt_hello_world

ではでは〜
UE4の Pixel2D買ってみたよ (Part8) アニメーションの通知イベントを作る。

というわけでなんか敵を作るみたいなことを全会言ってた気がするけど
アニメーションのに関して作ることになっているぅぅ


https://www.youtube.com/watch?v=g2BxWexwIuM&list=PLSHq8CaNTAqDalhMyicUJPDH4v8RDXz86&index=10

# 一定間隔の攻撃の作り方(00:00-5:30)

isRangedAttackフラグを作って管理すればOK

フラグを追加
![8.0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/b6307cad-16f6-d5d7-500c-ae191d88d6b6.png)

![8.1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/33f5c502-aeed-a52e-34eb-d110322a7e3c.png)

これでもとりあえず出来るよ。
ただ、攻撃アニメーションの種類があるから別々で作ったほうがかっこいいよね。

# 準備(06:00-)
![8.1.1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/e1b126ad-9595-5374-bba9-3b11372ff6d9.png)

#StateMachineに状態を追加しよう(07:01-)

Idol,Move,jump中の攻撃アニメーションを追加する。
ステータスを３つ追加してアニメーションも３つ設定する。
![8.2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/bf6cd931-0ecd-bfe5-6096-9298faf74d5d.png)

アニメーション終了でステータスを変更するようにする。
![8.3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/a76c30be-ba6c-6f32-de07-3016cab65b0c.png)

![8.4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/505b96e6-b392-7027-b038-bdb3c6cf9e6f.png)

# 出来たから再生する！（アニメーションが無限ループするぞ） (11:00-)
→なんかアニメーションがずっとしっぱなしになるぞ
![8.5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/eeda7402-0b00-0e54-9c6b-45c9bbf675bc.gif)」

理由は簡単で、最初作った奴は３秒(AttackSpeedの設定値)たつと状態が戻る
その間ずっと攻撃にメーションが再生されているからだね。、」

#Delayを使ってアニメーションを作ることができる(15:00)
しかし、この方法だとアニメーション速度によってこまめに変えたりしないと動かないので
修正とかやってられないのでアニメーションに合わせて動くようにしてみる。

#アニメーションにフラグ管理をしよう(15:40-)

07:01分ごろに追加したアニメーションに対してアセットを開く
![8.6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/bcdb3126-7875-a3c1-24b8-5a6dbdfdd833.png)

図のように"通知"を追加する
`RangedAnimFinished` アニメが終わったか？
`RangedProjectileRelease`  矢を発射したい。

![8.8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/809f117d-3426-f30d-217b-851623b2c93e.png)

![8.9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/6fd48ed9-0f86-94c0-a53b-aea81729211d.png)


#キャラクターにカスタムイベントを追加しよう(19:20-)

↓の図では
`RangedAnimFinished` のみだが同様に 
`RangedProjectileRelease` も追加する。
→コンパイルは忘れずに
![8.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/9487b464-8320-61d1-9c34-39707b9142dd.png)

ステータスに対して
![8.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/908bf667-643a-cc22-82f2-269c497a43e9.png)

![8.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/c27865b4-4712-ec0c-04e3-91a1c512ad3a.png)


#キャラクターのBPを設定する(22:00)

キャラクターのBP(BluePrint）を添付図のように変更すればOK

![8.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/f6436fc1-a191-6e70-0e29-7dc1199d10d7.png)

動画終了！
GCP の Load Balancing について

参考リンクだけまとめておく。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/9e2a2d81-8bff-a2be-9f92-656c9080f58c.png)
from [Cousera Google Cloud Platform Fundamentals: Core Infrastructure](https://www.coursera.org/learn/gcp-fundamentals/lecture/wyDK3?t=114)

## Memo

- L7 load balancing のsession affinityは、**Load Balancerが**cookieをセットすることにより、同一sessionのリクエストが割り当てられるバックエンドをstickyにしている。

## Ref 

- [L7ロードバランサとL4ロードバランサ](https://www.kimullaa.com/entry/2019/12/01/135430)
伝わる報告書、レポート、メールが書けるようになる厳選２冊

本稿は、[『Qiita エンジニアフェスタ 2021「今まで買ってよかった技術書を紹介しよう！」』](https://qiita.com/official-events/d409f91fc8b9b44cefb4) 向けの投稿です。

# はじめに ～ 2冊を推薦する理由
以前、レポートや報告書の書き方の本を30～40冊ほど読んたことがありました。結果、まずはこの2冊読んでおけば充分なのでは？と理解した2冊を紹介します。

[**1. 『レポートの組み立て方』 木下是雄 著、1994年、ちくま学芸文庫**](https://www.chikumashobo.co.jp/product/9784480081216/)
[**2. 『【新版】日本語の作文技術』 本多勝一 著、2015年、朝日文庫**](https://publications.asahi.com/ecs/detail/?item_id=17593)

これらの2冊は、事実・意見を的確に伝える文章について論じています。

どちらの書籍も、

* 文章を書く際の原理、原則
* なぜそう書くべきかの理由

が明確で、本書で記述の定石を理解できたら、いろいろな形式の文章に応用できます。

また、

1. は主にレポートの作成
1. は主に文章の作成

に重きを置いて記述されているため、2冊読むことで補完的に知識を習得することができます。

# 書籍の紹介
以下、書籍で「理解・習得できる」 & 「目からウロコが落ちる」要点を3つに絞って列挙します。興味を持たれたらぜひ実際に読んでください。

## 『レポートの組み立て方』
**・理解・習得できるポイント**

1. 事実と意見を区別することの大切さ
1. レポート作成の順序 ～ 主題の決定、材料の収集、構成案の作り方
1. レポートの文章の書き方 ～ 叙述の順序、明確・簡潔な文章、パラグラフと中心文

## 『日本語の作文技術』
**・理解・習得できるポイント**

1. 適切な修飾の順序
1. 伝わる句読点のうちかた
1. 助詞の使い方 ～ 三上文法をもとに「日本語は、主題はあるが主語はない」

# おまけ
以前、ハードの設計部門のひとに、「ソフト設計の人は、日ごろから論理的にプログラムを書いているはずなのに、どうして日本語の文章は下手なの？」と聞かれたことがあります。
その時の私の回答は、我ながらなかなか良かったんじゃないか？ と思っています。
「日本語が下手な人は、プログラムも下手です。そういう人は非論理的で、ちゃんとしたプログラムも書けません」

推薦した書籍の著者はどちらも、文書全体から単語の修飾レベルまで一貫して、日本語を構造的にとらえて議論しています。これはプログラミングの考え方に近いです。つまり、日ごろからプログラムを構造的に書くよう努力している人ならば、人に伝わる報告書もすぐに書けると思います！

# 参考文献
[『レポートの組み立て方』 木下是雄 著、1994年、ちくま学芸文庫](https://www.chikumashobo.co.jp/product/9784480081216/)
[『【新版】日本語の作文技術』 本多勝一 著、2015年、朝日文庫](https://publications.asahi.com/ecs/detail/?item_id=17593)
STUDIO の独自ドメイン反映までの時間は約10分

STUDIO の独自ドメイン反映までの時間は約10分かかるということを検証したので、ご紹介します。

# 背景 STUDIO の独自ドメイン反映までの時間を知りたい

[ノーコードWebサイトを作成ツール　STUDIO](https://studio.design/ja) の独自ドメイン反映までの時間を知りたく、実際に計測してみました。


# STUDIO の独自ドメイン設定手順

[STUDIO 公式ヘルプ 『独自ドメインでサイトを公開する』](https://help.studio.design/ja/articles/4358865-%E7%8B%AC%E8%87%AA%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%A7%E3%82%B5%E3%82%A4%E3%83%88%E3%82%92%E5%85%AC%E9%96%8B%E3%81%99%E3%82%8B) を参考にしつつ、

1. ドメイン登録
1. DNSレコード設定
1. ドメイン接続確認
1. TLS証明書発行

の手順で独自ドメインを設定してみました。


# STUDIO の独自ドメイン反映までの時間の計測結果

手順 『ドメイン接続確認』 と 『TLS証明書発行』 までの間を date コマンドで計測して、STUDIO の独自ドメイン反映までの時間を調べてみました。

```shell
# Amazon Route53 でドメイン設定後、『3. ドメイン接続確認』 直後

$ date
2021年 7月22日 木曜日 22時53分10秒 JST


# 約5分後に独自ドメインでの　STUDIO サイトに https で接続できました ✅

$ date
2021年 7月22日 木曜日 22時58分29秒 JST
```

STUDIO公式ヘルプに約10分という記載があり、今回の技術検証の結果5分と近かったので安心感が有りました。

[TLS 証明書 \| STUDIO U](https://help.studio.design/ja/articles/4358651-tls-%E8%A8%BC%E6%98%8E%E6%9B%B8)

実際に独自ドメインを設定する作業時間は、余裕をもって30分ぐらい見込んでおけば作業完了できそうな印象です。

以上、STUDIO の独自ドメイン反映までの時間は約10分ということを検証した、現場からお送りしました。