OmniAICreator/Qiita-1.07M huggingface dataset:
Photon Voice2 でボイスチャット（その２：マイクのオンオフ切り替え、音声の範囲設定）


この記事の続きです。

https://qiita.com/tatsuya1970/items/fb3d734bce1621f74c78


## マイクのオンオフ切り替え


### ボタン作成

(1) ボタンを作る　UI > Buttun
TEXTは不要なので削除

(2) Inspector のImage マイクのアイコン画像を入れる
今回はインポートしたアセット「Photon Voice2」にデフォルトで入ってる画像「gizumo-microphone-off」を使用した。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291592/d0b06512-d9f7-db79-3e17-be103c7c0d30.png" width=20% >

（３） 大きさを調整する。
 
[![Image from Gyazo](https://i.gyazo.com/04496c285d54454a700fbeec6c22fc38.png)](https://gyazo.com/04496c285d54454a700fbeec6c22fc38)

<br>

### マイクのオンオフの方法

PunVoiceClientオブジェクトの　Recorder コンポーネントの Transmit Enabled でマイクのオンオフの切り替えができる。

[![Image from Gyazo](https://i.gyazo.com/4fd628089b4d05ef6df687ef8fd733e9.png)](https://gyazo.com/4fd628089b4d05ef6df687ef8fd733e9)


### スクリプト

ボタンをクリックによって、マイクのオンオフの切り替えをするスクリプトを書く。

```　MicController.cs
using Photon.Voice.PUN;
using Photon.Voice.Unity;
using UnityEngine;
using UnityEngine.UI;

public class MicController : MonoBehaviour
{
    public Sprite imageMic0;
    public Sprite imageMic1;
    public Image buttonImage;
    private Recorder avatarRecorder;
    
    void Start()
    {
        buttonImage = GameObject.Find("micButton").GetComponent<Image>();
        buttonImage.sprite = imageMic0;
        avatarRecorder = GameObject.Find("PunVoiceClient").GetComponent<Recorder>();
        avatarRecorder.TransmitEnabled = false;
    }

    public void OnClick()
    {
        buttonImage = this.GetComponent<Image>();
        if (buttonImage.sprite == imageMic0)
        { 
            buttonImage.sprite = imageMic1;
            avatarRecorder = GameObject.Find("PunVoiceClient").GetComponent<Recorder>();      
            avatarRecorder.TransmitEnabled = true;
        }
        else if (buttonImage.sprite == imageMic1)
        {
            buttonImage.sprite = imageMic0;
            avatarRecorder = GameObject.Find("PunVoiceClient").GetComponent<Recorder>();
            avatarRecorder.TransmitEnabled = false;
        }
    }
}
```


### ボタンの設定

ボタンのInspectorウインドウで、

(1) buntton > OnClick() にHierachyのボタンオブジェクトをアタッチし、OnClick関数を紐づける。

(2) 先ほどのスクリプトを追加し、
マイクの画像をアタッチする。
今回はインポートしたアセット「Photon Voice2」にデフォルトで入ってる画像を使用した。

ImageMic0 に gizumo-microphone-off.png
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291592/d0b06512-d9f7-db79-3e17-be103c7c0d30.png" width=20% >

ImageMic１に gizumo-microphone.png
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291592/db717d4b-fa54-83ca-5983-d6ea62336df5.png" width=20% >


Button Imageに ボタンオブジェクトをアタッチする。


[![Image from Gyazo](https://i.gyazo.com/0e7193768538add0e57f812b91c9ddbd.png)](https://gyazo.com/0e7193768538add0e57f812b91c9ddbd)


## 音声の範囲設定

現実社会のように、遠くになるほど聞こえなくなるような設定をするにが、AudioSourceを3D設定にします。
AudioSource の　spatialBlend を 1　にします。

下画像のケースでは、3メートルまで普通に聞こえて、以降10メートルまで低減し、それより遠くは音が聞こえません。

[![Image from Gyazo](https://i.gyazo.com/6156feaf8f88307e25bf7986b0639ab5.png)](https://gyazo.com/6156feaf8f88307e25bf7986b0639ab5)


以上です。
eslint-plugin-functionalを使ってReactでのイミュータブルを強制する

## 目次
- Reactで変数がイミュータブルであることがなぜ重要か
- eslint-plugin-functionalを使ってイミュータブルを強制する

## Reactで変数がイミュータブルであることがなぜ重要か
※ そんなのもう知ってるよ！って方はスキップしてください。
#### そもそもイミュータブルとは？
は[こちらの記事](https://sbfl.net/blog/2018/09/25/javascript-immutable-programming/)が分かりやすいので参考にしていただければ

#### Reactにおけるイミュータブルの重要性
一般にイミュータブルだと一度定義した変数が不変なため、コードの挙動が予測可能というメリットがある。

さらに、Reactにおけるイミュータブルであることのメリットは状態（変数）を更新したにもかかわらず、Reactがそれを検知できず、画面に更新が反映されないというバグ？を防ぐことができることできること。

#### ミュータブルな変更をおこなった場合にどうなるか
Reactのコンポーネントはstateまたはpropsが更新されたら、更新を検知し再レンダーするが、"更新された"の判断はimmutableな変更を前提にしている。つまり、メモリの参照先を比較している。なので、オブジェクト型のstateやpropsをmutableに変更した場合、メモリの参照先は変更前後で同じなため、reactは変更を検知できない。

stateやpropsをミュータブルに変更した場合、再レンダーされないだけで、値としては更新されているので、別のトリガーで再レンダーが起こったときに、隠れていたの差分が現れて、バグっぽく動いてしまう。

↓mutable changeを押した差分が、immutable changeをした際に現れる。
https://codesandbox.io/s/react-typescript-forked-fd5r40?file=/src/App.tsx
![タイトルなし.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495868/08f0d7b5-3de5-1a87-2b5b-79fff659ef3b.gif)




上の例ではコンポーネントの自身のstateの更新の例を挙げたが、constで定義されるような通常の変数も、コンポーネント内で使用している他のコンポーネントのpropsに渡した場合に同じことが起こるため、変数もimmutableであるべき。

上記のような理由から、特にReactでは変数全般はイミュータブルであることが重要。

#### イミュータブルにするにはどうしたらいいか？
Typescriptでオブジェクト型の変数をイミュータブルにするにはreadonlyをつければOK。[参考](https://typescript-jp.gitbook.io/deep-dive/type-system/readonly)

ただ、、、
開発中に毎回readonlyをつけるのは面倒だし、つけ忘れがあるかもしれない、、、

そこで、eslintにeslint-plugin-functionalというimmutableを強制してくれる設定があるので使おう、というお話！

## eslint-plugin-functionalを使ってイミュータブルを強制する
#### 設定方法
基本的に[公式のgithub](https://github.com/eslint-functional/eslint-plugin-functional)を見ながらeslintを設定すれば良い。

eslint-plugin-functionalは
>An ESLint plugin to disable mutation and promote functional programming in JavaScript and TypeScript.

とあるように、名前の通りjs, tsの関数型プログラミングをサポートするもので、イミュータブルを強制する以外にも、さまざまな設定ができる。

設定と適用されるルールの対応は、表になっている。

例えば、　**no mutations**のルールの場合

設定は以下の3種類があり、
🙈：　plugin:functional/no-mutations
🙉：　plugin:functional/lite
🙊：　plugin:functional/recommended

それぞれの設定の際に適用されるルールは✅が表で付いている項目になる。
※↓の通り、**no mutations**の場合はどの設定にしても全てのルールが適用される。
<img width="600" alt="noMutation" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495868/f87eb308-77b8-dc9c-abbe-0521de56f88c.png">

ミュータブルな変更をさせないだけであれば以下の設定でOK。
```
{
  ...
  "plugins": [
    ...
    "functional"
  ],
  "extends": [
    ...
    "plugin:functional/no-mutations",
  ]
}
```

プラスアルファでより関数型の要素を取り入れたいのなら**lite**や**recommended**を設定すると良い。

個人的には**lite**にして、**no-return-void**など、どうしてもないと不便なもののみ個別にoffにするのが良さげ。

#### その他設定しておいた方がいいこと

- vscodeのeslint拡張機能をいれ、保存時のeslint自動修正
readonlyを自分で毎回書かなくて良い。

- 自動テストでのeslintもチェック
仕組みとしてイミュータブルであることを保証できる。レビューアとしてもイミュータブルになっていることが保証されているので、レビュー観点の削減にもなる。
字幕ファイル(.sub)から単語を切り出してみる

# はじめに

- 字幕ファイルから単語リストを切り出しておきたい。。。
- そうだ、Command の -w 機能で切り出してみよう

# 前提

- 対象のファイルは .sub のフォーマット
- .sub の例
```text
{16819}{16850}Yeah, I am.
```

# やってみる 

- 単語数

```terminal
$ cat some_subtitle.sub | awk '{print substr($0,index($0,"}")+1)}' | awk '{print substr($0,index($0,"}")+1)}' | grep -o -E '\w+' | sort | uniq | wc -l
    1602
```

- 単語表示

```terminal
$ cat some_subtitle.sub | awk '{print substr($0,index($0,"}")+1)}' | awk '{print substr($0,index($0,"}")+1)}' | grep -o -E '\w+' | sort | uniq
000
1
10
10K
12
12th
13th
157
15th
16
 :
 :
wrong
yeah
year
years
yet
yo
you
young
$
```

- ファイルに保存

```terminal
$ cat some_subtitle.sub | awk '{print substr($0,index($0,"}")+1)}' | awk '{print substr($0,index($0,"}")+1)}' | grep -o -E '\w+' | sort | uniq > wordlist.txt
```

# さいごに

- かんたんでしたね
20日の試験対策でAWS Certified Solutions Architect - Professional(AWS SAP)に合格した話

# はじめに
- こんにちは！すずめの戸締りをみて感動した今日この頃です。
- 今回は、20日の学習期間でAWS Certified Solutions Architect - Professional（以下、AWS SAP）を1発合格したので、何をしたかについて紹介します。
- 2022/6/8に勉強開始し、2022/6/28に合格
- AWS SAP合格までに取得済みのAWS認定資格は、CLFのみ

# 対象者
- AWS SAPの取得を目指している方
- AWS CLFくらいの知識はある方

# 内容
1. AWS SAPとは
2. 試験結果
3. 勉強方法
4. 勉強時間
5. テストを受けてみた感想

# 1. AWS SAPとは
AWSではこんな感じでこの資格を説明していますね。


> この資格は、認定を受けた個人が、複雑な問題に対する複雑なソリューションの提供、セキュリティ、コスト、パフォーマンスの最適化、および手動プロセスの自動化における高度な知識とスキルを証明するために役立ちます。この認定は、組織がクラウドイニシアティブを実施するための重要なスキルを備えた人材を特定して育成するための手段です。

出典：https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/

# 2.試験結果

スコアは、761 / 1000でした。合格ラインは750らしいので、ギリギリです。笑

# 3.勉強方法

- 結論：
私は、はじめの5日間で参考書2周＋参考書の問題理解に集中し、残りの15日間で問題集解きまくって、わからない箇所は基礎から復習をひたすら繰り返しました。

- 具体的には、以下の４つを実施しました。

１. AWSの研修を3日間受けた
→私は会社で受けることができたので利用しましたが、必ずしも受ける必要はありません。
→研修内容は、講師の方が次の２で紹介する参考書の中身を解説してくださり、問題を解いていく形式でした。

２. 参考書を2周する、付属の問題は理解するまでやる
→全体を2周しました。問題を解く時に、サービス名すら知らないのと、知っているのだと難易度が変わってきます。
ここでは、あー確かこんな感じのサービスだよねくらいの定着率で大丈夫だと思います。私は問題を繰り返し解く中で定着しました。（覚え切る必要はない）
→問題を解いている時にわからないことがあったら、参考書でその部分を集中的に繰り返し復習しました。
→2周といいましたが、参考書に含まれる問題は確実に理解しました。ここに関しては、理解できるまでやる/調べることが重要だと考えます。
→私が使用した参考書は以下です。
> 参考書名：AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル
URL:https://www.sbcr.jp/product/4815609061/

３. 問題集を解きまくる
→koiwa clubとかUdemyとか公式模擬問題とかなんでもいいです。私はkoiwaをおすすめしますが、試験勉強はudemyのみで合格した知り合いもいます。
→なぜ、この選択肢が間違っているのか、あっているのかを理解することに力を入れて勉強しました。
　これによって、問題文が異なっていても似たようなアーキテクチャを組んでる問題を解けるようになりました。
　例えば、なんでこれSQS使う必要あるんだろうとか、なんでCloudFrontにWAFを連携させる必要あるんだっけとかです。
→実際にアーキテクチャを紙に書いてみてイメージを頭に入れるように勉強することも非常に価値があったと考えています。

４. AWS Black BeltやYoutubeなどで、わからない/理解が曖昧なサービスを徹底的に調べる
→そのサービスの特徴や用途を知っておくことは問題を解く上で非常に重要なので、活用しまくりました。
→私はIAMについて理解することに苦しんだのですが、Black Beltセミナーや、AWSのサービスを紹介しているYoutuberの説明を何度も繰り返し視聴して、
　理解に役立てました。そのため、少し手間に感じるかも知れませんが、２、３で理解できないことがある場合は、実施することをおすすめします。
→どのサービスについての説明を見たなどをあまり覚えてはいないのですが、上で例に出したIAMの解説はこちらを参考にしていました。

Black Beltセミナー：【AWS Black Belt Online Seminar】AWS Identity and Access Management (AWS IAM)
URL：https://www.youtube.com/watch?v=K7F5yTThynw


このように、参考書やBlack Belt（基礎）　➡︎　問題集（演習）➡︎ なにが分からないか分析　➡︎ 基礎　➡︎　・・・といったイテレーションにより、知識を定着させていきました。
時間があれば、実際にAWSを触ってみて理解を深めるのも有効だと思います。

# 4.勉強時間

最後に勉強時間についてです。
- プライベートで予定がない時は、ほぼ試験勉強に注ぎました。BBQの後とかも。
- トータルの勉強時間は、20日間で、少なくても7~80hくらいは費やしていると思います。
- ちなみに試験当日は有給休暇を取得しています。

# 5.テストを受けてみた感想
- シンプルに難しかったです。私はSAAを受けたことがないのでSAAについてはわかりませんが、CLFとは次元が違います。（ここは試験勉強しているときから感じてましたが）
- テスト中は、「再試験いつ予約しようかな〜」とか本気で考えてましたが、諦めずにアーキテクチャ書いてみたり、問題文を繰り返し読んだりしてなんとか食らいつきました。必ず受かるという気合いが最重要かもしれません。笑
- 試験が終わって合格の文字が画面にでたときは、震え上がって、バク宙をキメてやろうかと思いました。
- 結局、地球7週半して落ち着きました。
- その後にルーフトップバーに行き、ビールを呑んで優勝しました。


# おわりに
- 今回はAWS SAPを取得したときの勉強方法について紹介しました。
- 合格した時にちょうど、チューター（スクラムマスター）として、AWSを用いたWebサービス開発を行う新入社員研修に参画しており、勉強した知識を使って、アーキテクチャに関するアドバイスができたので、学んだことをすぐに活用できて嬉しかったです。
- それでは！
Pythonでエージェントベースシミュレーション: 直接・内容バイアス(Mesoudi, 2021)




この記事では、Alex MesoudiのRで書かれたチュートリアルをpythonに翻訳する。
下記の記事ではバイアスのある伝達についてのモデルが紹介されている。

https://bookdown.org/amesoudi/ABMtutorial_bookdown/model3.html

文化的形質の伝達におけるバイアスは直接・内容バイアスと間接バイアスの二種類がある。前者は、文化形質がより記憶に残りやすい、発音しやすいなどの理由から他の文化形質と比べて伝達されやすい傾向のことを指し、後者は文化形質の持ち主の特性によって伝達されやすくなる傾向のことを指す。本稿では、前者をモデル化する

# エージェントベースシミュレーション

まずは、必要なライブラリをインストールする。

```python:python
import pandas as pd
import numpy as np
import random
import math
import matplotlib.pyplot as plt
!pip install japanize-matplotlib
import japanize_matplotlib
```

コードは次のようになる。

```python:python
def biased_transmission(N, s, p_0, t_max, r_max):
    output = pd.DataFrame(np.tile(float('nan'), (t_max, r_max))) 
    output.columns = ["run_" +  str(i) for i in range(r_max)]
    for r in range(r_max):
        agent = pd.DataFrame(random.choices(["A", "B"], k=N,  weights=[p_0, 1 - p_0]), columns = ["trait"])
        output.iloc[0, r] = sum(agent["trait"] == "A") / N

        for t in range(1, t_max):
            previous_agent = agent.copy()

            demonstrator_trait = pd.DataFrame(random.sample(agent["trait"].to_list(), N), columns = ["trait"])
            copy = np.random.rand(N)
            agent[np.logical_and(demonstrator_trait["trait"] == "A", copy < s)] = "A"

            output.iloc[t, r] = sum(agent["trait"] == "A") / N
    
    plt.figure(figsize=(10, 5), dpi=100)
    plt.plot(output)
    plt.title(f'N = {N}, s = {s}')
    plt.xlabel('世代数')
    plt.ylabel("形質Aを持つエージェントの割合")
    plt.xlim([0, t_max])
    plt.ylim([0, 1])
    plt.show()
```

p_0を0.01として形質Aが極めて少ない初期値で、シミュレーションしてみる。

```python:python
biased_transmission(N = 10000, s = 0.1, p_0 = 0.01, t_max = 150, r_max = 5)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581047/7d319059-5293-13e0-1375-52642497412d.png)

シミュレーションの結果、初期状態において形質が極めて少ない割合でも、形質が他の形質と比べて有利であるならば世代を経るごとに人口の大部分を占めていくことが見て取れる。



# 数値シミュレーション

数値シミュレーションの場合、次のようになる。

```math
p′=p+p(1−p)s

```

```python:python
p = np.repeat(float(0), 150)
p[0] = 0.01
s = 0.1

for i in range(1,150):
    p[i] = p[i-1] + p[i-1]*(1-p[i-1])*s 


plt.figure(figsize=(10, 5), dpi=100)
plt.plot(p)
plt.title(f's = {s}')
plt.xlabel('世代数')
plt.ylabel("形質Aを持つエージェントの割合")
plt.xlim([0, 150])
plt.ylim([0, 1])
plt.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581047/2d68df64-e50a-1e11-0abb-f057feb7789b.png)
GitHubのScheduled remindersで自分に関連したアクションを捕捉しやすくする

GitHubのScheduled remindersはレビュー待ちのPRを定期的にSlack上でリマインドしてくれる機能として使っている人もいるかと思いますが、実は自分に関連したアクションをリアルタイムでDMに通知してくれる機能もあります。

## 対応している通知
Organizationごとに以下の通知を設定できます。この設定は個人設定になります。
`You are assigned a review`, `Your team is assigned a review` (自分 (自チーム) がレビュワーにアサインされた), `Your PR has merge conflicts` (自分のPRがコンフリクトした) 辺りはGitHubのSlack通知 (GitHub + Slack Integration) では通知されないので便利ですね。

* You are assigned a review
* Your team is assigned a review
* Your PR is approved or has changes requested
* You are made an assignee
* Someone comments on your PR
* Someone comments in a thread you're in
* You are mentioned in a comment
* Someone merges your pull request
* Your PR has merge conflicts
* Your PR has failed CI checks

## 設定方法
1. 対象のOrganizationのScheduled remindersの個人設定 ( `https://github.com/settings/reminders/{organization名}` ) を開きます。
1. (Scheduled remindersとSlackを連携していない場合のみ) `Authorize Slack workspace` をクリックしてSlackと連携します。
1. `Enable real-time alerts` にチェックを入れ、有効にしたい通知にチェックを入れます。
1. `Create reminder` (既にScheduled reminders作成済みの場合は `Update reminder` ) をクリックします。
paiza.ioでelixir その102

# 概要
paiza.ioでelixirやってみた。
練習問題やってみた。

# 練習問題
htmlをスクレイピングせよ。

# 参考にしたページ

https://qiita.com/torifukukaiou/items/17d55cf896c24b13350e

# サンプルコード

```

:inets.start
:ssl.start

url = "https://qiita.com/advent-calendar/2022/elixir"
url = String.to_charlist(url)
{:ok, {_status, _headers, body}} = :httpc.request(url)
body = IO.iodata_to_binary(body)
|> IO.iodata_to_binary
|> String.split("encryptedId")
|> Enum.map(fn s -> 
    Regex.named_captures(~r/"user":{"urlName":"(?<user>.*?)",/, s) 
end)
|> Enum.slice(2..-1//1)
|> Enum.map(fn %{"user" => user} -> 
    user 
end)
|> Enum.frequencies
|> Enum.sort_by(fn {_user, cnt} -> 
    cnt 
end, :desc)
|> IO.inspect
|> Enum.reduce(0, fn {_user, cnt}, sum -> 
    sum + cnt 
end)
|> IO.puts


```

# 実行結果

```
[
  {"torifukukaiou", 42},
  {"RyoWakabayashi", 41},
  {"zacky1972", 25},
  {"mnishiguchi", 24},
  {"piacerex", 11},
  {"the_haigo", 10},
  {"ShigeItoEx", 7},
  {"GeekMasahiro", 7},
  {"Yoosuke", 7},
  {"nako_sleep_9h", 5},
  {"miwacchi", 5},
  {"t-yamanashi", 5},
  {"westbaystars", 3},
  {"k-j-y", 3},
  {"koga1020", 3},
  {"ta_to_jp", 2},
  {"kyawaguchi", 1},
  {"mokichi", 1},
  {"Gsann", 1},
  {"a_utsuki", 1},
  {"def_elixir", 1},
  {"kikuyuta", 1},
  {"ohr486", 1},
  {"hisaway", 1},
  {"nanbut14", 1},
  {"Goody27", 1},
  {"Alicesky2127", 1},
  {"pojiro", 1},
  {"tomoaki-kimura", 1},
  {"koyo-miyamura", 1},
  {"GKBR", 1},
  {"MzRyuKa", 1},
  {"tamanugi", 1},
  {"myasu", 1},
  {"tuchiro", 1}
]
219
```

# 成果物

https://paiza.io/projects/P_RzG2At9d7gaAPUQd5UkQ


以上。
napariで選択したポイントの座標を取得して表示する

# 目的
napariで開いた画像中にPointを手動で置き、キーボードで「i」を入力したら、そのPointの座標をコンソールに表示したい。

# コード
```get_selected_coordinate.py
import glob
import napari
import numpy as np

from skimage import io


dir_name = "./data"
file_names = glob.glob(dir_name + "/*.tif")
stack = np.array([io.imread(file_name) for file_name in file_names])

viewer = napari.view_image(stack)
points_layer = viewer.add_points(ndim=3)

@viewer.bind_key('i')
def print_coordinates(viewer):
    for point in points_layer.data:
        print(f"frame, x, y: {point[0]}, {point[2]}, {point[1]}")

napari.run()
```

# 出力
画像内でPointを指定して「i」を押すと、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23570/8b3173c9-1f5f-ddb9-fe77-0bb8ae36b0a8.png)

コンソールに座標が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23570/e28483c2-433d-1342-7199-4257b360861b.png)


# ポイント
## ポイントレイヤーの作成
ndim=3を指定することで、frame番号も取得することができる。
```python
points_layer = viewer.add_points(ndim=3)
```
## 関数のキーへのバインド
GUIで「i」を押すと、print_coordinates関数を実行してくれる。
```python
@viewer.bind_key('i')
def print_coordinates(viewer):
    pass
```
## 座標の取得
全てのPointの座標をnumpy arrayで返してくれる。
```python
points_layer.data
```
開発チームの有給を守るのはアジャイルと強いリーダー

[開発とビジネス・経営の境界線 by NewsPicks](https://qiita.com/advent-calendar/2022/newspicks)カレンダー 22日目の記事になります。

## サマリ

* 企業として有給消化を推奨するだけでは有給は消化されない
* 気兼ねなく有給を取得するための仕組みが必要で、それを担うのはアジャイル開発と強いリーダーである

という話をします。

## 背景

これまで有給休暇のとりにくい組織で働いた経験のない人、あるいは「認められた権利は行使して当然」という強い心をお持ちの方には共感いただきにくい話かもしれません。

筆者の経験で、有給休暇を気兼ねなく取れた環境と、そうでない環境とがありました。

会社がブラックで有給なんて体調不良以外認めていないとか、上司が渋い顔をするとか、決してそういうわかりやすい阻害要因があるわけでなくても、有給を取りたくてもなかなか取れない状況が続いた会社と、そうでない会社とがあり、この違いは何なのだろう、と考えたのが本記事の経緯になります。

## なぜ有給がとれないか

会社として有給消化を推奨しているにも関わらず、（気持ちよく）有給を取得できない状況というのは、個人の経験としては以下のような場合でした。

* 個人／チームとして、期日までにやらなければならない仕事が（休んでしまうと）終わらなそうである
* リリース直前のため、毎日緊急の対応が入ってくるので穴をあけられない
* プロジェクトが炎上中で、無理やり休みをとったとしても気持ち的にリフレッシュできない

ポイントとしては、たとえ会社として「遠慮せず有給取っていいよ」と言ったところで、それを取れるかどうかは、そういう状況を作り出すことができるかどうかによる、言い換えると、**気持ちよく有給をとれる状況を作るためには技術が必要だ** ということです。

プロジェクトが炎上中という最後のケースについては、ある程度（炎上してからでは）どうにもならない部分もあり、まず炎上させないためにどうするか、という話になるかと思うので本記事の内容からは少し外れます。

それ以外のケースについてですが、個人的に有給の取りやすさに寄与していたなと思う要素として、「アジャイル開発」と「強いリーダー」を挙げることができます。

## アジャイル／スクラム開発が担保してくれるもの

ウォーターフォールなど、イテレーションのない開発スタイルの場合、「では2か月後の○月末までにこの機能の実装完了としましょう」といったスケジュールの立て方をすることが多いと思います。

通常、この「2か月後の○月末まで」という見積もりを立てる段階では、（ある程度バッファを設けるにせよ）その間にとる休暇の予定まで考慮していないことが多いでしょう。

そもそも、数か月単位で精緻な工数を見積もること自体が難しく、結果として、期日近くなった段階で進捗が思わしくなくて休みを取れなかったり、期日が遠くても、見通しのわからない不安から有給の取得に慎重になりがちです。

アジャイル開発により、イテレーション（スプリント）が1～2週間単位で区切られていれば、短期的にはその期間での成果のみに集中することができます。

有給取得の予定がイテレーション開始前にわかっていれば、あらかじめその人の作業工数（キャパシティ）から引いておくことができるため、休んだことによる作業の遅延を気にする必要がありません。

## 強いリーダー

ところが、チームとしてアジャイル開発・スクラム開発を導入しただけでは、それは開発サイドの論理でしかありません。

それをビジネスサイドに認識・理解してもらうために、開発サイドの強いリーダーが必要となります。

リーダーという呼び方をしていますが、それは組織によってスクラムマスターであったり、CTOであったりすると思います。

とにかく、 **中長期的に精緻な見積もりは不可能であり、その代わりにイテレーション単位で動く成果物を共有することを約束し、必要に応じて期日の調整または機能の取捨選択を継続的に行う** ということを企業文化として根付かせる働きをする人が必要です。

その努力なしに、開発内の閉じた世界でのみアジャイル開発を導入したところで、ビジネスサイドから「○○日までになんとしてもリリースが必要だ。進捗はどうなってる？」という横やりが入ることになり、結果「有給は取ってもいいけど自己責任で」のようなおかしな言説が横行することになります。

エンジニアの仕事に限った話では全然ありませんが、「休んでいるときは緊急の対応を受けられない」「休暇の取得によりイテレーション単位の成果にばらつきが生じることがある」というごく当たり前の文化も、それを文化として根付かせ・維持しようと戦う人がいなければ容易に失われてしまうものです。

## 以上

アジャイル開発の思想に限らず、開発の論理をビジネスサイドと共有し、また逆にビジネス観点で死守すべき論理を理解し、相互理解を深めることが組織として正のループを回すために重要です。

有給休暇の取得という本内容をその一例として消化いただければ幸いです。
Salesforce認定Platformアプリケーションビルダー試験の公式サンプル問題解説してみた-16

こんにちは

Salesforce認定Platformアプリケーションビルダー試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

https://trailhead.salesforce.com/ja/content/learn/trails/platform-app-builder-certification-prep

今回は

Platform アプリケーションビルダー試験に向けた学習
認定 Platform アプリケーションビルダー資格の受験準備: Data Modeling and App Deployment (データモデリングとアプリケーションリリース)
アプリケーションのリリースについて

にある問題2問目をご紹介します

なお今回の内容は動画でも公開しております

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

<iframe width="560" height="315" src="https://www.youtube.com/embed/_EGuapF5hPE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

![partial.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/8a733285-488d-baae-a647-a2ac4a7e615b.png)


正解はAです

Sandboxはいくつか種類があり、特定の目的により特定のSandboxを正しく使用しましょう

![Sandbox.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/e7b9aefe-7a5a-cdd7-a29a-db42af94bf30.png)



容量2GBはPatcial copyかFullしかないですね
なお、Partial cpoyよりも上位互換のFullについては今回の要件と比べて適していないので間違いです

詳細はこちらのヘルプをご確認ください


種類別 Sandbox ライセンスおよびディスク使用制限
https://help.salesforce.com/s/articleView?id=sf.data_sandbox_environments.htm&type=5
【初心者向け🔰】HTMLの書き方

## 概要
HTMLの書き方について、IT 初学者向けにまとめた記事。

この記事は、[初心者向けHTML解説動画](https://youtu.be/_O8ci3h5FhM)のまとめ記事です。
より詳細な説明を聞きたい方は動画をご覧ください。

## HTML は HTML ファイルの中に記載する

拡張子 `.html` のファイルを用意し、その中に記載する。
ファイル名は、「test.html」など、`.html` の前がテキトーな名前でも動くが、
トップページになるファイル名は「 **index.html** 」とするのが世界共通のお作法となっている。

### HTML ファイル１つで、１ページ

基本的には、HTML ファイル１つで、Webブラウザ１画面分となる。
つまり、100ページのブログサイトは、100個の HTML ファイルが必要ということになる。

今後、学習する Web 技術の中には、技術的な仕組み上、１ページ分ではないこともあるが、概念としては本来１ファイル１ページである。

## HTML の記法（基本）

HTML は基本的に、「**タグ**」と呼ばれる目印で文字や値をサンドイッチの様に挟み込み、表現する書き方。

```html
<タグ>画面に表示する内容</タグ>
```

タグを含めた、全体を「 **要素（Element）**」と言う。
これが画面内の１部品となる。

「タグ」は、世界共通であらかじめ決められた英数字が当てはめられる。
[非常にたくさんの種類](https://developer.mozilla.org/ja/docs/Web/HTML/Element)があるので、実際に画面を作る時に、検索をしながら徐々に覚えていくしかない。

> h1, span, div, input, table, button, textarea ...など

### 開始タグと終了タグ

先頭のタグを「開始タグ」、末尾のタグを「終了タグ」と呼ぶ。

```html
<タグ>画面に表示する内容</タグ>
^^^^                 ^^^^
開始タグ               終了タグ
```

タグの中には、開始タグのみで要素が作れるものもある（終了タグがない）

```html
<タグ 画面に表示する内容・設定>
```

### HTML は見やすく書こう

下記の２つは、実際に画面に表示されると、どちらも同じ結果（表示）になる。

例１）
```html
<タグ>画面に表示する内容</タグ>
```

例２）

```html
<タグ>
  画面に表示する内容
</タグ>
```

ブラウザに読み込まれる際、改行や空白は無視される（一部の例外あり）。
ブラウザは、ソースコードを解析する際に、タグが正しく書かれてさえいれば、１行に１万文字の HTML が書かれていても、問題なく表示することができる。

ただ、私たち人間が開発をする上で、ソースを見やすくするために、例２）のように、**改行** や **「インデント（字下げ）」** を使って見やすく書くのがよい。

### 属性 （Attribute）

タグには、オプション指定機能が存在し、要素の見た目を変化させたり、表示内容を補足したりすることができる。これを「 **属性（Attribute）**」と言う。
属性は、開始タグの中に設定し、属性の右側には「値」が設定される。

```html
<タグ オプション(属性)=“ついでに、こんな事もしてほしい(値)”>
  画面に表示する内容
</タグ>
```

どんな属性/値が設定できるかは、タグによって決まっている。
これも、開発しながら徐々に覚えていくしかない。

### タグは入れ子にできる

タグによっては、以下の様に「入れ子構造」にすることができる。
入れ子になっている場合、タグの内側にある他のタグも全て含めて「１つの要素」とみなす。

```html
<タグA>
  <タグB>
    <タグC>内容１</タグC>
    <タグD>内容２</タグD>
  </タグB>
</タグA>
```

このように、入れ子のタグもたくさん用意し、ようやく画面１ページ分となるイメージ。

## 画面表示に最低限必要な４タグ

画面を構成するタグとしては、以下のタグが最低限必要

```html
<!doctype html> 👈 ❶
<html> 👈 ❷
  <head> 👈 ❸
    ブラウザには表示されないけど、大切な設定情報
  </head>

  <body> 👈 ❹
    実際にブラウザ画面に表示される内容
  </body>
</html>
```

**❶ doctype** ：HTML の１行目に必ず記載する宣言文（HTML のバージョンと仕様を定義する）、書き方が特殊
**❷ html** ：中身が HTML であることを宣言するタグ
**❸ head** ：画面には出ないが、色んな設定をする領域
**❹ body** ：実際に Web ブラウザ画面に表示される領域

実際に、画面表示に必要なHTMLの中身は以下の通り（それぞれの説明はまた別記事で）。

```html
<!doctype html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>タブ表示テキスト</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
</head>

<body>
  <!-- 画面に表示される領域 -->
</body>
</html>
```


## コメント機能

HTML には「コメント」という機能があり、コメント化した部分は画面には表示されない。

```html
<!-- お問い合わせ時の注意事項 --> 👈 ここは画面に表示されない
<p>以下の項目は全て入力してください。</p>
```

コメントを使って、開発者向けにメモを残す事ができる。

また、これを利用して、画面の要素を非表示にしたりする。
コメント機能を使って、非表示にすることを「コメントアウトする」と言う。

```html
<!-- お問い合わせ時の注意事項 -->
<!-- <p>以下の項目は全て入力してください。</p> -->  👈 ここも表示されない
```

上記は、一旦画面から消してみるけど、やっぱり後で表示させるかも…といった時に利用する。

以下の様に、複数行まとめてのコメントアウトもできる。

```html
<!--
お問い合わせ時の注意事項
<p>以下の項目は全て入力してください。</p>
-->
```

**コメント機能の用途は以下の通り**

- 他の人が見た時のために、わかりやすくメモを残す
- 自分が久しぶりに見てもわかるように、メモを残す
- 表示されない仕様を利用して、一時的に要素を非表示（コメントアウト）にする

---

### 参考

この記事は、以下の動画のまとめ記事です。詳細は動画をご覧ください。

https://youtu.be/_O8ci3h5FhM
Go標準パッケージtestingを利用したテスト方法

## 概要
Goには標準でtestingというパッケージが用意されている。今回はこれを使用する。
## テストコードの作成方法

テストコードを書くファイルは`_test.go`という形式で命名する。
Goのテストはテスト対象のソースコードと同じパッケージに含める必要がある。
以下のような関数を作成することでテストコードを作成していく。

```go
func Test対象関数名(*testing.T) {
	hogehogehogehoge
}
```

## 実際のテストコード

`decode()`という関数をテストしている。

```go
func TestDecode(t *testing.T) {
  post, err := decode("post.json")

  if err != nil {                      
    t.Error(err)
  }
  if post.Id != 1 {                                    
    t.Error("Wrong id, was expecting 1 but got", post.Id)
  }
  if post.Content != "Hello World!" {                         
    t.Error("Wrong content, was expecting 'Hello World!' but got", post.Content)
  }
}
```

### ポイント

- 関数を実行し、エラーが返って来ていれば、エラー出力をしてあげる。
- `t.Error()`は`Log()`を呼びだしてから`Fail()`を呼び出すメソッド。`Log()`はエラーログにテキストを記録する。`Fail()`はテスト関数に失敗した記録を残しつつ、テストは継続して実行する。

## テストの実行

`_test.go`ファイルがあるディレクトリへ移動して、以下のコマンドを実行

```go
go test
```

### オプション

詳細出力

```go
-v
```

カバレッジ確認

```go
-cover
```

## テストのスキップ

特定のテストをスキップすることもできる。
あらかじめ、スキップしたいテストを以下のようにif文で囲んでおく。

```go
if testing.Short() {
	テストの内容
}
```

実行時に`-short`オプションをつけて実行する

```go
go test - short
```

## テストの並列実行

テストを並列で実行することもできる。テスト時間の短縮に役立ちそう。
並行で実行できるようにしたいテストに以下のコードを追加する。テストケースの一番最初に一文加えるだけでいい。

```go
t.Parallel()
```

実行時に`-parallel`オプションをつける。`-parallel`の後に`スペース+数値`を追記すれば、最大でいくつのテストケースを並列実行させたいか？を指定できる。

```go
go test -parallel 3
```

## ベンチマークテスト

ベンチマークを測定するためのテストケースを作成することもできる。
ベンチマークテストは以下のように書く。

```go
func Benchmark対象関数名(b *testing.B) {
  for i := 0; i < b.N; i++ {
    対象の関数 
  }
}
```

### ポイント

- 引数に`*testing.B`を取る。
- ベンチマークを取りたいコードを`b.N`回繰り返してくれる。

### ベンチマークテストの実行

実行時に`-bench`オプションをつける。全てのベンチマークテストを実行する場合は`.`を、そうでない場合は対象のファイルを指定する。

```go
go test -bench .
```

`-run`オプションをつけると、機能テスト(ベンチマークテストではないもの)を無視してテストを実行できる。`-run`の後に実行したい機能テストを指定するとその機能テストだけは実行される。`-run x`のように存在しない機能テスト名を指定すれば全ての機能テストはスキップされる。
#20 Spring Mybatisを利用したデータベース操作[1. 環境構築、テーブル作成]

# #20 Spring Mybatisを利用したデータベース操作[1. 環境構築、テーブル作成]
この記事ではMybatisの環境構築とOracleDBを用いたテーブルの作成を行います。

# 前提条件
この記事はSpringの最低限の知識が必要になります。
また、なるべく分かりやすく書くつもりですが、この記事の目的は自分の勉強のアウトプットであるため、所々説明は省略します。

# 前回まで
前回の記事ではOracleデータベースの接続設定を行いました。

https://qiita.com/Jackoguro/items/808d9fff90f39962c3cd

# 構築環境
1. 各バージョン
Spring Boot ver 2.7.5
mybatis-spring-boot-starter ver 2.2.2
Model Mapper ver 3.1.0
jquery ver 3.6.1
bootstrap ver 5.2.2
webjars-locator ver 0.46
thymeleaf-layout-dialect ver 3.0.0

2. 依存関係
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884987/24d5b167-b0c1-4851-dc67-13e5d58d1138.png)

# 成果物

# 今回行うこと
今回は以下の流れに沿って進めていきます。
1. MyBatisとは
1. MyBatisとModelMapperのダウンロード
1. application.propertiesに追加の記述
1. テーブルの追加
　1. M_USER
　2. M_PRODUCT
　3. T_PURCHASE
　4. T_STOCK

## 1. MyBatisとは
MyBatisとは高度な機能が用意されたO/Rマッパーです。O/RマッパーとはJavaクラス(オブジェクト)と、データベースをマッピングするフレームワークです。ObjectとRelation(テーブル)をマッピングするため、O/Rマッパーと呼ばれます。

MyBatisはObjectとSQLを**xmlファイル**を用いてマッピングします。xmlファイル意外にもSQLを書くことはできますが、管理の点からあまり使用されないそうです。

## 2. MyBatisとModelMapperのダウンロード
MyBatisとModelMapperの両方をダウンロードするには``pom.xml``に以下の内容を記述します。
```xml:pom.xml
        <!--省略-->

		<!-- MyBatis -->
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.2.2</version>
		</dependency>
		<!-- Model Mapper -->
		<dependency>
			<groupId>org.modelmapper.extensions</groupId>
			<artifactId>modelmapper-spring</artifactId>
			<version>3.1.0</version>
		</dependency>

        <!--省略-->
```

:::note
Model Mapper：インスタンスの内容をコピーするライブラリ
:::

## 3. application.propertiesに追加の記述
``1. MyBatisとは``で説明したようにSQLはxmlファイルに記述します。その記述するファイル場所をapplication.properties記載します。
また、``logging.level.パッケージ名=ログレベル``を指定することができます。下記コードでは``com.example``パッケージ内のログレベルを``debug``に変更しています。これによりMybatisなどのログが出力されます。

```properties:application.properties

# 省略

# MyBatis
mybatis.mapper-locations=classpath*:mapper/*.xml

# Log Level
logging.level.com.example=debug
```

## 4. テーブルの追加
ここではテーブルと初期データの追加を行います。
今回は以下の4つのテーブルを作成します。

:::note warn
この記事を書いている本人はテーブル作成に関してあまり知識がないのでこのテーブルの書き方で合っているか微妙です。
:::

### 1. M_USER
ユーザー情報を持ったマスタテーブル
- USER_IDを主キー
- USER_NAMEとPASSWORDをNOT NULL
- ACCOUNT_ICONの属性をBLOB型(後で変更する可能性有り)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884987/14136a26-9741-f96f-d823-b6ece4f9f354.png)

### 2. M_PRODUCT
商品情報を持ったマスタテーブル
- PRODUCT_IDを主キー
- PRODUCT_NAMEとPRODUCT_PRICEEをNOT NULL
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884987/d244091f-9882-2c58-c67c-8cd7f1114ec9.png)

### 3. T_PURCHASE
どのユーザーがどの商品をいつ、何個購入したか記録するトランザクションテーブル
- USER_IDとPRODUCT_IDを主キー(複合主キー)⇒これが正しいか不明(ごめんなさい)
- COUNTとPURCHASE_DATEをNOT NULL
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884987/a5bded5a-0c73-b3b2-f9d7-4ded4ce7a0f8.png)

### 4. T_STOCK
商品の在庫数を記録するトランザクションテーブル
- PRODUCT_IDを主キー
- PRODUCT_STOCKをNOT NULL
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884987/a550f89d-51e5-34fe-f4e3-670faf81b896.png)


# 最後に
今回は環境構築とテーブルの作成を行いました。
今後はSQLを用いたデータの変更等を行っていきます。
Javaで何か作ってみる(2022/11/26 Day37)

## 今日やった事
- Twitterで、ビンゴゲームの課題があったので、やってみた。  
&rarr;コミットした内容は[こちら](https://github.com/takamatsuryota3/Java/commit/8c72460de8d9c9d6c7e3ad6343e65552046b834d)
## 参考にしたもの
- [Javaでビンゴゲームのコードを作成したい](https://teratail.com/questions/kav3aoefaf30b6)  
&rarr;ここに答えが書いてあるようなものだが、見てやっても意味ないので、極力見ないようにしている。
- [【Java】ビンゴカード作成問題を解く - Qiita](https://qiita.com/kim-shun/items/fee32cf0cb3cc009756a)  
&rarr;こちらも同様。

## 所感
- 今日はカードの準備まで作ってみた。
## 明日の予定
- ビンゴゲーム作成を進めていく。
Javaで何か作ってみる(2022/11/25 Day36)

## 今日やった事
- Twitterで、ビンゴゲームの課題があったので、やってみた。  
&rarr;コミットした内容は[こちら](https://github.com/takamatsuryota3/Java/commit/8d7e37c6f041810d3773df0f13592d5511ef075d)
## 参考にしたもの
- [Javaでビンゴゲームのコードを作成したい](https://teratail.com/questions/kav3aoefaf30b6)  
&rarr;ここに答えが書いてあるようなものだが、見てやっても意味ないので、極力見ないようにしている。
- [【Java】ビンゴカード作成問題を解く - Qiita](https://qiita.com/kim-shun/items/fee32cf0cb3cc009756a)  
&rarr;こちらも同様。

## 所感
- 今日はとりあえず、ファイル作成のみ。
## 明日の予定
- ビンゴゲーム作成を進めていく。
ABC279回答メモ

0.はじめに
　Cまでは順調に解けましたが、D以降がどうにもなりませんでした。
　解説を見ると、Dはおぼろげな解き方はあってましたが
　実装する力が足りませんでした・・・。

1.A - wwwvvvvvv
　文字列を1文字ずつ参照し、vなら1、wなら2を加算していく感じで解けました。

　https://atcoder.jp/contests/abc279/submissions/36797012

2.B - LOOKUP
　S列を先頭から参照していき以下をチェック
　　1) 現在の参照アドレス+T列の長さがS列の長さを超えている
　　　→これ以上調べても一致することは無いため”No”を表示して終了
　　2) 現在の参照アドレスから続くT列の長さ分の文字列と
　　　 T列を比べる
　　　2-1)一致した場合
　　　　”Yes”を表示して終了
　　　2-2)不一致の場合
　　　　Continue
　文字数も少ないので十分AC頂けました。

　https://atcoder.jp/contests/abc279/submissions/36804012

3.C - RANDOM
　思いついた解法でTLEが出ないか不安でしたが
　まぁ、やってみたらいけました。
　【考え方】
　　1)S表を1列目から読んでいき列ごとの文字列Siを得る
　　2)文字列Siを辞書Sに登録
　　　同一の文字列が辞書にない場合は値に1をセット
　　　すでに同一の文字列があった場合は値に1を加算
　　3)T表を1列目から読んでいき列ごとの文字列Tiを得る
　　4)辞書SにTiがあるかを検索
　　　4-1)Tiがない場合
　　　　→”No”を表示して終了
　　　4-2)Tiがある場合
　　　　4-2-1)該当キーの値が0の場合
　　　　　→”No”を表示して終了
　　　　4-2-2)該当キーの値が1以上の場合
　　　　　→該当キーの値から1を減算
　　5)Tiのチェック最後まで終了
　　　→”Yes”を表示して終了

　https://atcoder.jp/contests/abc279/submissions/36811558

以上
エンジニアのコピペ、その功罪を問う

### はじめに

「長いコマンドを書くのが面倒」「頭が冴えずコーディングが捗らない」など、
ついついコピペ操作をやりたくなる場合があります。
エンジニアのコピペ、そのメリット・デメリットを考えます。

### まず、コピペのデメリットから

#### スキル向上を阻害する

新しいプログラミング言語の勉強で、サンプルコードをコピペし実行してみる、
一発でOKになったので、これでなんとなくわかったように感じるときがあります。

後になって、同じコードを自分で書けない、自分のものになっていないと気付く。
自分の頭で頑張って0から書けるように、日頃から訓練したほうがよいかもしれません。

#### 考える力の足かせとなる

ソースコードを断片的にコピペで組み立て、1つのプログラムが完成するかもしれません。
ただし、自分の頭でロジックを組み立てる過程が抜けており、論理思考力の向上を阻害する結果に。

#### 現場で痛い目に遭う

現場によっては、インターネットアクセスが厳しく制限されます。
社内のように自由にGoogle検索やmanページを使えない場合も。
お客様のチェック下で(セキュリティ監視)作業する場合は、緊張感も倍増します。

恥ずかしい思い出ですが、コマンドオプション思い出せず電話で同僚にヘルプを求めたことが。
痛い目に遭わないため、普段からコピペに頼らずコマンドを書き上げる習慣をつけたいものです。

### でも、コピペにメリットもある

#### ミスを減らす

本番環境の作業に必要なコマンドは、失敗を許さないため万全を期すべきです。
あらかじめ検証済みコマンドで操作手順を作成しておき、
作業時にそのままコピペまたはスクリプト実行する。
タイプミスを防ぐための安全対策となります。

#### 作業効率が上がる

OSSから必要機能を利用または改変することで、開発効率や品質向上につながる場合あります。
ただし、著作権侵害にならないように、ライセンスにはきをつけましょう。

蛇足で、普段よく使う長いコマンドは、コピペして使用するより、
エリアスやショットカットを作成しておくとよいかもしれません。

### おわりに

コピペの功罪を自分なりに考えてみました。
目的や状況に応じて使い分けるとよいかもしれません。
Git for Windowsのsshコンフィグディレクトリを変更する

# 背景
MicrosoftアカウントでWindowsにログインしてgit-bash(Git for Windows)を使用すると、sshのコンフィグディレクトリが `C:\Users\姓名\.ssh` になるので、別のフォルダに変更する。

# Version
PortableGit-2.38.1-64-bit.7z.exe

# 準備
## アーカイブ展開
7zアーカイブを展開する。PortableGitというフォルダが作成されるので、
フォルダ名をPortableGit-2.38.1-64-bitに変更する。
（複数のバージョンを扱う可能性があるため）

PortableGit-2.38.1-64-bitフォルダを C:\opt に配置する。
以降は C:\PortableGit-2.38.1-64-bit フォルダで作業を行う。

## fstab修正

あらかじめ C:\home\firstname を作成しておく。
次に、etc/fstabに以下を追加する。

```
C:/home	/home	ntfs	binary,auto 0 0
C:/opt	/opt	ntfs	binary,auto 0 0
```

# 起動
git-bash.exe をダブルクリックする。

# 設定変更
## /etc/passwd 作成
$USERNAME は姓名のユーザー名なので、その行をフィルタして/etc/passwd に保存する。

```
$ mkpasswd.exe | grep $USERNAME > /etc/passwd
```

## /etc/passwd 修正
1列目のユーザー名と最後から2列目のホームディレクトリを適宜修正する。
ホームディレクトリは /c/home/... のようにスラッシュで開始する。

## バッチファイル作成
以下のようなバッチファイルをC:\PortableGit-2.38.1-64-bit フォルダに作成する。

```
set USERNAME=firstname
set USER=firstname
set HOME=/home/firstname

cd C:/home/firstname & start %~dp0\git-bash.exe
```

## git-bash終了
設定を反映させるため、一度git-bashを終了する。

# 動作確認
## git-bash再起動
バッチファイルをダブルクリックし、git-bashを起動する。

# sshコンフィグディレクトリ確認
ssh-keygenを実行し、/c/home/firstname の下の .ssh フォルダにキーが生成されようとしていることを確認する。

```
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/c/home/firstname/.ssh/id_rsa):
```
[Mapデータタイプ] 5分で実装可能！！！Dictionaryを応用しヒューマンリーダブルなコードを書こう

## 概要
- 関数の中にif文で条件分岐する際に、Dictionaryを使う場合と使わない場合で比較をし、その違いを紹介する
## 目的
- PythonにおけるDictionary、関数の理解
- ヒューマンリーダブルなコードを書く意識を高める
## Dictionaryとは
- キーと値をペアで管理できるデータタイプ
```python
dict_test = {"key": "value"}
print(dict_test["key"]) # キーを指定して値へアクセスできる
# "value"
```

# 今回実装するのは自宅電話番号のバリデーション
- 市外局番が**050**で始まる場合は11桁のみを許容する。
- 市外局番がそれ以外で始まる場合は10桁のみを許容する。

## Dictionaryを使用しないケース
```base.py
#　上にはクラスの定義とpydanticのデコレータでバリデーションを記述している
# 省略↑
    def home_phone_number_local_area_code_split(self):
        if self.home_phone_number[0:3] == "050":
            local_area_code = self.home_phone_number[3:7]
        else:
            local_area_code = self.home_phone_number[3:6]
        return local_area_code

    def home_phone_number_subscriber_number_split(self):
        if self.home_phone_number[0:3] == "050":
            subscriber_number = self.home_phone_number[7:11]
        else:
            subscriber_number = self.home_phone_number[6:10]
        return subscriber_number**
```

```receive.py
# 値を受け取るファイル
# payloadの中の該当部分↓

  "home_phone_no1": base_credit.home_phone_number[0:3],
  "home_phone_no2": base_credit.home_phone_number_local_area_code_split(),
  "home_phone_no3": base_credit.home_phone_number_subscriber_number_split(),
```
- base.pyにおいて定義したクラスの中でdef関数を2つ作成する
- それぞれ050から始まるか否かで条件分岐をし、3つの分割の仕方を変化させている
- receive.pyにおいて入力を受け取るときは関数をそのまま呼び出している
## Dictionaryを使った場合
```base.py
#　上にはクラスの定義とpydanticのデコレータでバリデーションを記述している
# 省略↑
def parse_phone_number(phone_number):
    parsed = {}
    parsed["area"] = phone_number[0:3]

    if parsed["area"] == "050":
        parsed["local_area"] = phone_number[3:7]
        parsed["subscriber"] = phone_number[7:11]
    else:
        parsed["local_area"] = phone_number[3:6]
        parsed["subscriber"] = phone_number[6:10]

    return parsed
```

```receive.py
# 値を受け取るファイル
# payloadの中の該当部分

phone_number = base.parse_phone_number
"home_phone_no1": phone_number["area"],
"home_phone_no2": phone_number["local_area"],
"home_phone_no3": phone_number["subscriber"],
```
- base.pyにおいてDictionaryを用いて条件分岐をさせている
- こうすることで1つの関数ですむ
- また、受け取る際にも具体的な変数名を指定して値を取ってこれるので非常に明示的であり、受け取るフィールド（ここでは"home_phone_no1"など）との対応関係が意味合い的に確認できる

## 結論
- Dictionaryはヒューマンリーダブルなコードを書く際に必要不可欠なもの
- ぜひ、応用して美しいコードを書いていこうぜ！！!
## 参考
- 参考にした記事はありません

#### この記事が誰かにお役に立てたら幸いです。
PowerShellでスクリプトが管理者で実行されているか確認する

`PowerShell`でスクリプトを作成する場合、スクリプトの実行時に管理者権限かどうかをチェックしたい場合があるかと思います。

`PowerShell`では`Requires`ステートメントが用意されており。
こちらを利用すると、必要な条件を満たしていない場合のスクリプト実行を制限できます。

この`Requires`ステートメントの中に管理者で開始する条件があります。

## ドキュメント

[about_Requires](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_requires?view=powershell-7.3)

## #Requires RunAsAdministrator

[runasadministrator](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_requires?view=powershell-7.3#-runasadministrator)

`#Requires`の`RunAsAdministrator`を利用して、管理者で開始されるよう制限をかけます。

```powershell:RunAsAdministrator.ps1
#Requires -RunAsAdministrator

Write-host "HelloWorld"
```

上記スクリプトファイル`RunAsAdministrator.ps1`を用意し、管理者特権ではない状態で実行すると下記の通りエラーとなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/e1b0c0bf-3f5b-8da6-f1bc-e1c04f1f9cd8.png)

エラーメッセージに`Administrator`で実行してくださいと出ています。

なおドキュメントに記載ありますが、この`RunAsAdministrator`が使えるようになったのは`PowerShell 4.0`からとなるようです。
2022年現在、`PowerShell 4.0`の環境をさわることは減りましたが、少しだけ気にしておきたいポイントではあります。

## 余談　WindowsPrincipal.IsInRole メソッド　で管理者実行か判定

[WindowsPrincipal.IsInRole メソッド](https://learn.microsoft.com/ja-jp/dotnet/api/system.security.principal.windowsprincipal.isinrole?view=net-7.0)

`.NET`のWindowsPrincipalクラスのIsInRoleメソッドで管理者実行されているか確認ができます。

PowerShellでは下記を実行し、`True`となれば管理者実行と判断できます。

```powershell
[System.Security.Principal.WindowsPrincipal]::new([System.Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/e499f7b4-a15c-5029-0854-de7c0665e888.png)

上記画像では、実行結果が`False`となっているため、管理者では実行されていないと判断できます。

## 総評

`PowerShell`スクリプトでは簡易に管理者実行に制限でき便利です。
令和4年秋 基本情報技術者試験に合格しました。

## はじめに
2年ほどWeb系エンジニアをしている、たらむと申します。
仕事ではRuby on Railsを使用して開発業務をしています。

令和4年秋の基本情報技術者試験に合格することができたので、
試験勉強の振り返りをしたいと思います。

## 試験結果
午前：75点
| テクノロジ | マネジメント | ストラテジ |
|:-:|:-:|:-:|
| 80%  | 70%  | 74%  |

午後：80点
| セキュリティ | データベース | マネジメント | アルゴリズム | 表計算 |
|:-:|:-:|:-:|:-:|:-:|
| 100%  | 100%  | 46% | 88% |  64% |

## 勉強時間
試験の半年前（5月）から、
平日は通勤時間を使って3時間程度、休日は6時間くらい勉強しました。
セキュリティ、アルゴリズム、データベース、表計算に関しては、過去問全てを解きました。
マネジメント／ストラテジ、SW設計に関しては、過去問5年分くらい解きました。
午前対策については、教科書をサラッと一通り読んだ後は、過去問10年分を9割取れるまで解きました。

今回で4度目の受験だったので、
トータルでは1～2年近くは勉強していたのではないでしょうか…
午前は通るけど、午後のアルゴリズムや表計算が解けず、
30点台で不合格ということを繰り返していました。


## 勉強の仕方を変えた
今回は”誰かに説明できるレベルまで理解する”という勉強の仕方に変えました。

そのきっかけになったのは、
IT未経験の友達から、今回の基本情報技術者試験を受けるから勉強を教えてほしいと言われたことです。

自分は3回も受験していたので、ある程度説明できるだろうと思い引き受けたのですが、
友達にうまく説明できないし、
突っ込まれたり質問されたときに、答えることができないことがありました。
ここで初めて、自分は内容を全然理解できていなかったことに気づけました。

それからは、友達にわかりやすく説明できるか？ということを意識して、
内容を理解するようにしたところ、
勉強の理解が進み、過去問の点数が上がっていき、合格することができたという次第です。。

友達、本当にありがとう…

## 基本情報技術者試験を受けて良かったこと
・ITの知識を広く浅く理解することができた。
・業務のふとしたタイミングで、基本情報の勉強しててよかった～と思うことがある。（セキュリティ、ネットワーク、データベース、アルゴリズムなど）
・物事を理解する時は、誰かに説明できるくらい理解することが大事なことに気づけた。
・自分は長文読解が苦手だということに気づけた。（読書しよう。）
・自分で立てた計画を達成したことで自信をつけることができた。
・履歴書の所持資格に基本情報技術者試験を書ける。
・会社から資格手当をもらえる。
・周りに合格したことを伝えたら、祝福された。←


## おわりに
基本情報技術者試験はCBTになってからは合格率が4割の試験なので、
たいして難しい資格ではないと思いますが、
自分の場合は合格するまでかなり苦労しました。

今回の試験も、データベースが出題されなかったり、
アルゴリズムや表計算が自分の相性にあわない問題だったら、
おそらく不合格だったでしょう…。
運が良かったです。

”誰かに説明できるレベルまで理解する”という勉強法は、自分にはかなり効果的だったので、
自分と同じように万年不合格だという方は是非試してみてください！
ナノ秒まで測れる時間計測デコレータ

ナノ秒まで測れる簡単な方法が見つからなかったので作成しました。
python3.7以降で使えます。
```python:時間計測デコレータ
import time
from functools import wraps

def proc_time(f):
    @wraps(f)
    def _wrapper(*args, **kwargs):
        st = time.perf_counter_ns()
        res = f(*args, **kwargs)
        t = (time.perf_counter_ns() - st) * 0.000000001
        print(f'{format(t,".2E")} sec')
        return res
    return _wrapper
```


```python:実行テスト
@proc_time
def a():
    pass

a()
```

```python:結果
7.70E-07 sec
```
軽い関数を用意して100nsオーダーまで計測できることを確認しました。
スマレジ・アプリマーケットのアプリ開発のはじめ方 ②スマレジ・デベロッパーズのアカウント登録（全5回）

# はじめに

スマレジ・デベロッパーズについて学んできたことを、『スマレジ・アプリマーケットのアプリ開発のはじめ方』というタイトルで投稿します。全 5 回中の 2 回目です。

https://developers.smaregi.jp/

スマレジ公式のチュートリアル、その他開発パートナーの方が書いた Qiita 記事などを参考にしながら、調べたり手を動かしてきた内容について、記事にしていきます。

## 投稿内容（全 5 回）

本連載は以下の順序で投稿します。

- [① スマレジ・デベロッパーズとは](https://qiita.com/ryamate/items/e04e0ef65cc676afa5d0)
- **② スマレジ・デベロッパーズのアカウント登録**
- [③ アプリの新規登録](https://qiita.com/ryamate/items/fa9d26b87c3d1ef38a2b)
- [④ アプリアクセストークン取得 API の使い方](https://qiita.com/ryamate/items/792f54231474d6a9a1c9)
- [⑤ 商品一覧取得 API の使い方](https://qiita.com/ryamate/items/e16e5547f539853f4d6e)

2 回目の今回は、 **②スマレジ・デベロッパーズのアカウント登録** についてです。

スマレジ・アプリマーケットのアプリ開発者になるために、スマレジ・デベロッパーズのアカウントを登録して、開発環境を準備します。（正直、今回の記事は必要ないくらい簡単です。笑）

※ スマレジ公式のチュートリアルの対応箇所はこちらです。

https://note.com/smaregi_devtaro/n/n01a5daa192f2

## 目次

[1. スマレジ・デベロッパーズのページにアクセス](#1-スマレジデベロッパーズのページにアクセス)
[2. 必須項目の入力](#2-必須項目の入力)
[3. 受信したメールの確認](#3-受信したメールの確認)
[4. スマレジ・デベロッパーズへのログイン](#4-スマレジデベロッパーズへのログイン)

# 1. スマレジ・デベロッパーズのページにアクセス

ブラウザで、スマレジ・デベロッパーズのページにアクセスします。

https://developers.smaregi.jp/

トップ画面右上「無料でアカウント作成」を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/f1c02f2f-6b3f-6749-643c-d0f4a301f455.png)

# 2. 必須項目の入力

必須項目を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/ad13f3e7-66b6-3b13-bea2-bc95681cd188.png)

「利用規約及びプライバシーポリシーを確認し、同意します」にチェックを入れ、「アカウントを作成する」を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/b8500cf9-9f7a-62cc-0047-215d3e222ddd.png)

しばらく待ちますと、…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/eef1ad2f-9ea3-3ac6-1351-13cb23aa5e5c.png)

「スマレジ・デベロッパーズのログインはこちらから」を押して、ログインできるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/d717851f-5f58-d146-16f6-dffd793e6b19.png)

https://accounts.smaregi.dev/login?client_id=dev-site

# 3. 受信したメールの確認

併せて、メールが届きますが、認証などのためではないため、確認のみです。「契約ID」は今後よく使うものです（ログイン後の管理画面で常に表示されているため、メモは必要ないです）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/81634b13-955b-43cc-2466-52d4d17b4350.png)

# 4. スマレジ・デベロッパーズへのログイン

登録した際のメールアドレス、パスワードを入力し、スマレジ・デベロッパーズへログインします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/77609d22-9a53-9b52-46c5-8eb11b34e10a.png)

スマレジ・デベロッパーズへログインできました！（アカウント作成完了）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/f2b40670-9768-c9c2-5bd9-8c8d5f322e70.png)

# **おわりに**

めっちゃ簡単でしたね！

今回は、 **② スマレジ・デベロッパーズのアカウント登録** でした。
スマレジ・アプリマーケットのアプリ開発者になるための、スマレジ・デベロッパーズのアカウント登録して、開発環境が準備できました。

次回は、 **[③ アプリの新規登録](https://qiita.com/ryamate/items/fa9d26b87c3d1ef38a2b)** です。
スマレジ・デベロッパーズでのアプリの新規登録の方法を確認します。（公開する新規登録ではなく、アプリを開発する前段階としての登録です）

ありがとうございました。
脅威インテリジェンスって何だ？

# 本記事の目的

1 か月前(2022 年 10 月末)に ISO/IEC27001 の改訂がなされた。本改訂に伴い「脅威インテリジェンス」について検討しないといけなくなる(はず)。ただ、脅威インテリジェンスが何なのか？よく理解していなかったのでこの機会に学んでみた。そのメモ。

https://activation-service.jp/iso/column/7146

# 脅威と脆弱性について

まずはここの概念を押さえることから。以下記事を参考にさせていただくと・・・

https://www.ashisuto.co.jp/security_blog/article/201911-isms.html

* 脅威：システム又は組織に危害を与える事故の潜在的原因
    * 変えることができない = 脅威をなくすことは基本できない
* 脆弱性：脅威によって影響を受ける内在する弱さ
    * 変えることができる = 脆弱性を軽減することはできる

上記 URL の「脅威：泥棒」と「脆弱性：古いタイプの簡易なドア鍵」の喩えは分かりやすいなと思う。

* 脅威(泥棒)をなくすことは自分たちにはできない
* でも、脆弱性(古いタイプの簡易なドア鍵)を変えることで、脅威に対抗することができる。

# 本題

ここからの内容は、以下記事を大いに参考にさせていただいてます。

https://www.nri-secure.co.jp/blog/points-of-threat-intelligence

## 脅威インテリジェンスとは

上記 URL によると、**脅威インテリジェンス = 攻撃者の意図や能力、設備などに関する情報を整理および分析することで有益な知識を導き出し、使用可能なものに変えたもの** とのこと。

これに続いて上記 URL 記事では例として

> ある会社の情報セキュリティ担当者のあなたは、ある日、同業他社で大規模な情報漏洩事故が発生したことをニュースで知りました。そのとき、あなたがどのような行動を起こすかを想像してみてください。

と質問を投げかけている。他社で何か大きなインシデントが起きた際に「自分の組織は大丈夫かな？今のルール・やり方を見直したほうがいいかな？」と考えて何らかの改善アクションを取ることがなくはないと思うのだが、脅威インテリジェンスって結局こういうアクションのことを指しているといえそう。

一例として、2022 年 6 月におきた、尼崎市での USB 紛失の件を見てみる。

https://xtech.nikkei.com/atcl/nxt/column/18/01157/080500068/?P=2

こちらは結局情報流出には至ってないので脅威は実質関わっておらず、脅威インテリジェンスを考える例としてはちょっとよろしくないところもあるが・・・記者会見でパスワードの桁数を漏らすなど良くないことがいくつかあった。これを見て人によっては、

* 業務で USB 使うのやめたほうがいいかも
* USB 使うとしても利用者制限をかけたほうが良さそう
* パスワードの桁数公表なんてするもんじゃないけど、社員みんなそこまでのリテラシー持ってるのかな・・・

など思うところが出てくるはず。こういった懸念を受けて改善行動を起こすのが「脅威インテリジェンス」という考えで良さそう。

## 具体的に何をすればよいか

ここまで「脅威インテリジェンスとは何か」について書いてきたが、では実際にどうしたらいいのか？という話に移る。上記記事では 3 つのポイントについて説明しているが、特に「収集対象とする情報の明確化」が重要そう。

収集する情報については大きく以下の 3 つに種類分けできるという。

![fig1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/d55f3078-b033-d709-e454-d3260d99700a.png)

具体例についても書いてくれているが、以上を自分なりに噛み砕くと、それぞれの情報を踏まえてのアクション例は以下のようになるかと。

| 種類 | アクション例 |
|---|---|
| Strategic | <a pref="https://www.ipa.go.jp/security/vuln/10threats2022.html"> IPA の「情報セキュリティ10大脅威」</a> をもとに、組織としてのセキュリティ対策方針を検討する <br> 例えば、「ランサムウェアの脅威対策に向けて、組織内のアンチウィルスソフト・OS アップデートを強く推進していく」とか  
| Operational | 他社での被害事例を踏まえて、自社環境を再度調査する <br> 例えば、他社でランサムウェアによる被害が出ているのであれば「そもそも自社って対策立ててたっけ？十分なことやってたっけ？」と振り返ってみる
| Tactical | 脅威で観測される具体的な事象に関する情報 <br> 例えば、攻撃元 IP が分かっているのであればそこからのアクセスはブロックするように設定する、とかだろうか。脅威に対抗するために直接使う情報、といったイメージ

めちゃくちゃかいつまんで言うと、「ちゃんと情報収集して、ちゃんと対策しましょうね」ということ。

# 終わりに

* 脅威インテリジェンスについて理解はしたが、実際にこれを実践するとなるとなかなか難しいところはでてきそう。
    * Strategic・Operational な情報についてごく一部しか集められなさそう
    * Tactical な情報について、実際に機器に正しく登録できているのか、見直しできているのか不安
* だからこそ脅威インテリジェンスのサービスが生まれているのだろうけど。
【初心者向け🔰】HTMLとは何か？（Webブラウザの本当の役割）

## 概要

「HTML」の概念を理解しやすくするための、IT 初学者向けの記事。
※ この記事では、「書き方」については言及しません。

この記事は、[初心者向けHTML解説動画](https://youtu.be/5lPETs_HM2g)のまとめ記事です。
より詳細な説明を聞きたい方は動画をご覧ください。

## HTML とは

「HTML」とは、「HyperText Markup Language（ハイパー・テキスト・マークアップ・ランゲージ）」の略で、Webページを構築するための言語。

HTMLで書かれたファイルを、Webブラウザで開くと、ブラウザが HTML を解析して画面上にグラフィカルに描画してくれる。
![HTMLとは_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/34f2bca2-5ff6-505e-7be2-29d24906ceaf.png)

Webページを表示した状態で、右クリックし「ソースを表示」などの機能を実行すると、そのWebページのHTMLとしての姿を見ることができる。

「ソース」とは、 **Source（源）** のことであり、ブラウザに表示されている画面の、変換前の HTML などの文字列全体を「ソースコード」と呼ぶ。
つまり、ソースコードが書けるようになれば、誰でもWeb画面を作る事ができる。

### HTML を書くのは、魔法を唱えるようなもの

ソースコードの中身は、「ボタン」「画像」「入力エリア」などを意味する文字の集まりである。

例えば、「炎を生み出す魔法陣」を描けば、炎が出現する様に、
HTMLで「ボタンを生み出す記述」をすれば、ブラウザ上にボタンがグラフィカルに表示される。
![HTMLとは_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/77de35c5-9a17-2428-32af-231f05e67939.png)

ソースコードを書くことはさほど難しいことではなく、画面に表示される“呪文”の書き方を１つ１つ覚えていけば、思い描いたWebページを作ることができる。

## Webブラウザの本当の役割

一般的に、Webブラウザは「インターネットで画像や情報を検索したり、Webサイトを見るためのもの」くらいにしか認識されていないが、実際は以下のような機能を持った **アプリケーション** である。

- HTML 等の言語を解析して、ブラウザ画面上に描画する
- アドレスバーに入力された宛先から、コンテンツを取得し、読み込む
  - 宛先が「PCの外部」の場合、ネットワークにつながって通信を行う機能も持っている
- ソースコードを表示したり、画面上で読み込んだコードを加工して、シミュレートしたりできる（取得元のコードは改変しない）
  - 他にも様々なメンテナンス機能が存在する（※ 本記事では割愛。別記事にする予定）

![HTMLとは_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/71d99bff-2a0d-22d1-6841-c7d1daa4ea27.png)

## Web ページにおける HTML の役割

HTMLおよび他のWebページに関わる言語は、画面表示において以下の役割がある。

- HTML：画面の構造を決める
- CSS：画面を装飾する
- JavaScript（JS）：画面に動きを与える

![HTMLとは_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/1482d3a8-08e5-722a-912f-f3bed8607c2d.png)

まずは、HTMLの書き方を覚えて、実際にWebブラウザで画面表示する練習から始めてみると良い。

---

### 参考

この記事は、以下の動画のまとめ記事です。詳細は動画をご覧ください。

https://youtu.be/5lPETs_HM2g
paizaラーニング「階乗の末尾に 0 はいくつ付く？ Python3編」

https://paiza.jp/works/mondai/loop_problems2/loop_problems2__factorial_zero
#### 私の解答
```Python3
n = int(input())
ans = 1
for i in range(2,n+1): 
    ans = ans * i
    
div_count = 0
while True:
    if ans % 10 == 0:
        ans //= 10
        div_count += 1
    else:
        break

print(div_count)
```
前の2種類の問題の解答を組み合わせて作りました。解答例と比べて長すぎますね。
#### 解答例
```Python3
N = int(input())

count_zero = 0
while N > 0:
    count_zero += N // 5
    N //= 5

print(count_zero)
```
- 整数 N を受け取ります。また、末尾の 0 の個数を保持する変数を宣言します。
- N! の末尾に 0 がいくつ付くのかという問題は、N! が 10 で何回割れるのか、つまり N! を素因数分解すると 2 * 5 がいくつ出てくるのかという問題と同じであると考えられます。
- また、N! を素因数分解したとき、2 より 5 の方が出てくる頻度は少ないので、5 が何個含まれるのかを数えればよいことになります。

私は、このような考えは全く浮かびませんでした。。。
社会人が大学と大学院の違いについて記事にしてみた！

# はじめに
大学（4年制）と大学院の違いについて、後輩に聞かれたのでこちらに記載することにしました。ここでは理系の大学（4年制）と理系の大学院の違いについて記載しています。文系はよくわからないです。学生の立場でどんな感じに違うのか書いていくことにします。大学院入試についてはここでは記載していませんが、どこかで記事にしようかとは思っています。


# Who am i ?
某SIerでエンジニアをしています。修士課程は修了しています。自分は博士課程に行こうかなと考えていたのですが、修士課程と博士課程は全くの別物ということがわかったので、修士課程を修了した後は普通に就職することにしました。

# この記事の想定読者

- 理系の4年制大学在学中で、学部と大学院の違いについて知りたい人or興味を持っている人
- 現在、修士課程在学中の学生or社会人で、博士課程に進もうか迷っている人
- その他

# 大学と大学院の違いについて
4年制の大学の場合、3年間は勉強でひたすら必修科目や専門科目、一般教養科目などの単位を稼ぎ、最終的には卒業論文や発表会などを経て卒業するといった感じになります。これに対して、修士課程も似たような感じではあるのですが、修士課程の場合は単位の取得に加えて、研究を並行してやらないといけません。また、学会発表なども修士課程の修了要件に入っていてマストだったりします。なお、自分の所属していた大学院での話にはなりますが学会発表がマストになっていました。あと案外知られていないことなのかもしれませんが、大学教員が大学院生のことを同僚として接してくるということも違いに含まれるかもしれません。学部生のときは大学教員の専門分野に依らずわりと自由に研究テーマを選べることが多いように感じますが、修士課程になるとある程度は指導教員の専門分野に偏りがちです。

# 修士課程と博士課程の違い
これも知られていないかもしれないですが、修士課程と博士課程は全くの別物です。自分の所属していた大学院だと修士課程で留年する人はほとんどいないのですが、博士課程だとほとんどの場合は留年します。なぜこのようなことが起きるのかというと、自分の論文が学会誌に掲載されないと博士課程の修了要件を満たせないからです。そもそも論文には査読付きの論文と査読なしの論文があり、修士課程の場合には査読なしでも問題ないのですが、博士課程の場合は査読をパスしないといけません。査読付きの論文を提出しないと学会誌には掲載されないため、ハードルが高くなっているというわけです。なお、これが一つならまだいい方なのですが、複数の学会誌に掲載されるとなると、さらにハードルが高くなってしまいます。このため、全体的に修士課程までで大学院を修了して、その後は企業などに就職するといったケースが多くなっているというわけです。学部生と修士課程修了生の場合は卒業式・修了式なるものが存在するのですが、博士課程の場合は修了要件を満たし次第、順次修了ということもあり、卒業式・修了式には参加できないこともあるのだそうです。こういった面から博士課程在学中の就職活動は現実的ではないため、学部生や修士課程修了生と違い、博士課程を修了してから行うこともあるのだそうです。

# 日本と海外の大学院の違い
海外の大学院へ進学したことないので、このあたりの話は聞いたことないのですが、海外の場合は日本と違い博士課程まで行く人がかなり多いのだそうです。ただ修了要件なんかはよくわからないです。ひょっとしたら海外で働きたいと思っている人は博士課程の進学まで考えておいてもいいのではないでしょうか。

# 博士課程まで進みたいと考えている人はどんな人がいるか
自分の周りで多かったのは起業したいと思っている人は博士課程まで進学している人いましたね。あとは上記でも述べたように海外で将来働きたいと思っている人。あとは大学などの研究機関で研究したいと思っている人はマストだと思います。正直、目的は人それぞれかもしれないですが。

# 最後に
最近、社会人でも修士課程に進学してみたいという話を少なからず聞くので、時代も変わったなーと思いつつ、博士課程の学生の話などを聞くと、色んな事情があるとは思っています。社会全体が少しずついい方向へ変わってきていて、最近は文科省なども博士不足を日本全体の課題として認識しているようで動きが見られます。今後についても随時という感じですね。

以下、参考まで。

https://www.mext.go.jp/kaigisiryo/content/000147972.pdf
paizaラーニング「階乗の計算 Python3編」

https://paiza.jp/works/mondai/loop_problems2/loop_problems2__factorial
#### 私の解答
```Python3
n = int(input())
ans = 1
for i in range(2,n+1): 
    ans = ans * i
print(ans)
```
#### 解答例1
```Python3
N = int(input())

factorial = 1
for i in range(2, N + 1):
    factorial *= i

print(factorial)
```
 #### 解答例2
```Python3
from math import factorial

N = int(input())

print(factorial(N))
```
- Python の場合、 math モジュールの factorial 関数を使用すると、階乗の計算を行うことができます。
paizaラーニング「毎日増加するお金 Python3編」

https://paiza.jp/works/mondai/loop_problems2/loop_problems2__inc_percent
#### 私の解答
```Python3
A, B = map(int, input().split())
num = 0
while A <= B:
    A = int(A * 1.1)
    num += 1

print(num)
```
前の問題の解答例を参考にしたからか、全く一緒でした！！！

#### 解答例
```Python3
A, B = map(int, input().split())

num = 0
while A <= B:
    A = int(A * 1.1)
    num += 1

print(num)
```