OmniAICreator/Qiita-1.07M huggingface dataset:
Kali Linuxでログインループが起きた

#???なエラー?

今日いつも通りHackTheBoxやろうと思ったら、一般ユーザーでログインしたら、一瞬真っ暗になって永遠に繰り返すことになった、、、。
*環境はMacBook ProのVirtualboxです。
![VirtualBox_Kali_15_02_2021_20_14_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/848369/da08be7d-fb0b-c7e8-5087-a2239f539212.png)

#対策

まず再起動し、Grubメニューの'Advanced options for Kali GNU/Linux'を選択します。
次に、linuxと書いてあるところの最後にroと書いてあるはずなので、roからrwに変更します。
そして、末尾にinit=/bin/bashを追加してあげ、controll+Xでターミナル画面に移ります。
![VirtualBox_Kali_15_02_2021_20_25_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/848369/9f0a620e-f50c-0e49-a717-8d97a78e46bb.png)

#再設定
移ったら、早速`passwd`でパスワードの初期化を行います。
私はrootとユーザーの設定をしました。
設定したら`exec /sbin/init`を実行して終了します。

![VirtualBox_Kali_15_02_2021_20_27_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/848369/c90b5271-ce84-fa19-3f8d-3f42d63cbc7f.png)

#結果
rootでログインしたら無事に通常通りできましたが、一般ユーザーでは相変わらず
ログインループを抜け出すことはできませんでした。直接`sudo su [一般ユーザーの名前]`でログインするしか
なさそうです。

↓参考URL
>https://linuxhint.com/reset_password_kali_linux_2020/
HerokuにDjangoアプリをデプロイする時にCSS反映されない問題

# 概要 #
Django で簡単なWebアプリケーションを作ったので heroku にデプロイしたところ、cssファイルが反映されなかった。
備忘記事。

# 対処法 #
ローカル環境で <code>python manage.py collectstatic</code> を実行して、静的ファイルを集めるディレクトリを作成したまでは良いものの、それを <code>.gitignore</code> に追加してしまっていたのが原因だったので、それを ignore せずに<code>git add .</code>してあげた後にデプロイしたらいけた。

# そもそも #
Django プロジェクトにおいて、ローカル環境と本番環境で静的ファイルを参照するディレクトリは違うらしい。

Django のチュートリアルとかでは大体以下のようなセッティングになっていると思う。

```settings.py
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') # -> 本番環境で参照されるディレクトリ
STATICFILES_DIRS = [os.path.join(BASE_DIR, "static")] # -> ローカル環境で参照されるディレクトリ
```

まず、<code>STATIC_ROOT</code>は本番環境で静的ファイルを使う際に参照されるディレクトリ。
つまり、<code>heroku run python manage.py collectstatic</code>で<code>staticfiles</code>に静的ファイルが集められて、集められた静的ファイル達が参照されることになる。

また、<code>STATICFILES_DIRS</code>はローカル環境で参照されるディレクトリで、<code>DEBUG=True</code>になっている時に機能する。

herokuにデプロイされた後、<code>heroku run bash</code>でアップロードされたファイル群？を見れるが、その時に参照するべきstaticfilesがなかったことで今回は気づいた。
【Git】知らなかったGitコマンド・grepの使い方(備忘録)

#プログラミング勉強日記
2021年2月15日
基本的なgitの操作しかしらなかったので、今日知った便利なコマンドをまとめる。

#Gitコマンド一覧

`$ history`：コマンドの履歴を確認。
`$ git log`：コミット履歴を確認。コミットをコミットメッセージの一覧の形で表示する。
`$ git log -1`：最近のログを1件だけ出力する。
`$ git log --since=2021-2-1`：2021年2月1日以降のログを出力する。
`$ git log master`：ブランチ指定してログを出力する。
`$ git log -p ファイルパス/ファイル名`：特定のファイルを指定してログを出力する。
`$ git diff --name-only`：変更点を表示するときに、変更があったファイルのパスだけを表示。

#grepとは

> grepは、UNIXおよびUnixオペレーティングシステムにおけるコマンド。テキストファイル中から、正規表現に一致する行を検索して出力する。

[Wikipedia grep](https://ja.wikipedia.org/wiki/Grep)

#`$ git grep`の使い方
　`$ git grep`コマンドを使えば、Git管理下のファイルのみを対象としてgrepする。

```:特定の単語を含むか調べる
$ git grep "word"
```

```:大文字小文字を区別する
$ git grep -E "word"
```

```:大文字小文字を区別しない
$ git grep -i "word"
```

#参考文献
[Gitリポジトリ内をgrepする git grep はシンプルで超便利](https://dev.classmethod.jp/articles/useful-git-grep-command/)
[ruby]クラス変数、インスタンス変数の違い

#初めに
簡単にアウトプットさせてもらいます

#クラス変数とは
クラス変数とはそのクラス内で定義された変数であり、@@から始まる変数となります。


#インスタンス変数とは
インスタンス変数とはそのクラスのインスタンスで使用できる変数です。@から始まる変数となります。

#例

```ruby:クラス変数
class Muscle
  @@name = "大胸筋が歩いてる！！"

  def initiallize
    @@name
  end

  def workout
    puts @@name
  end
end

muscle = Muscle.new
muscle.workout

#実行結果
#大胸筋が歩いてる！！
```

```ruby:インスタンス変数
class Muscle

  def initialize(name)
    @name = name
  end

  def workout
    puts "#{@name}"
  end

end

muscle = Muscle.new("大胸筋が歩いてる！！")
muscle.workout

#実行結果
#大胸筋が歩いてる！！
```

結果としてクラス変数と同じですが、インスタンス変数に値が入るのはインスタンス生成時です。

#まとめ
インスタンス変数とクラス変数の違いは、インスタンス毎に値が固有であるか否か
adb: error: stat failed when trying to ...を解決する

# adb: error: stat failed when trying to ...を解決する

adb pushなどをするときにパーミッションエラーがでます

```sh

$ adb push test.txt /data/app_flutter/
adb: error: stat failed when trying to push to /data/app_flutter/: Permission denied
```

# 解決方法

```sh
$ adb root
```
を実行してから再度コマンドを実行する
HackTheBoxにてExploit completed, but no session was createdの対処法

#問題点

昨日、HackTheBoxのVIPを契約したんだけど、マシン攻略でどうしてもセッションが取れない不具合がおきた。
ちなみに、チャレンジしたのは初心者に有名な[Lame](https://www.hackthebox.eu/home/machines/profile/1)です。
調べてみると、初心者特有のエラーらしいので、日本語の記事がなかったからHackTheBoxを始めた方のお役に立てたら幸いです。

#対策
Lameに挑戦し、最後にmsfconsoleでexploitを送ると、以下の画面のようにexploitは完了しましたが、セッションは取れなかったというメッセージが出てしまいます。これは、HackTheBoxの_HTB Lab Access Details_に書いてある_HTB Network IPv4_が鍵です。つまり、自分のPCのIPアドレスではなく、HackTheBoxが指定したIPアドレスを使えということです。
![1*8W6oH_5mFlw5-EUMuAOAtw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/848369/5dc08b57-b2c3-c15b-fe21-df28cee61667.png)

kali linuxだと、`ip addr`コマンドを用いると、eth0の下に`tun0`と書いてある(画像の青い部分)ところに、_HTB Network IPv4_のアドレスを、MetasploitのLHOSTに指定してあげると無事にセッションがつながります！
![スクリーンショット 2021-02-08 20.58.14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/848369/238374a8-136c-9c47-0b58-96c25adcba97.jpeg)
[Azure Automation] Runbook で変数を呼び出す方法 (PowerShell)

## Azure Portal 上で変数を作成する

[共有リソース] - [変数] - [変数の追加] で作成可能です。
暗号化設定をすると、Portal 上から値が表示されないようになります。

![2021-02-13_16h21_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423135/c2e1b54a-3ff4-7f97-89cb-24ca4f2cbe85.png)


## Runbook 上で変数を呼び出す
設定した変数値を Runbook 上で呼び出す場合、内部コマンドレット `Get-AutomationVariable` を使用します。

~~~Powershell
$TestString=Get-AutomationVariable -Name "TestStringVariable"
$TestBool=Get-AutomationVariable -Name "TestBoolVariable"
$TestDateTime=Get-AutomationVariable -Name "TestDateTimeVariable"
$TestInt=Get-AutomationVariable -Name "TestIntVariable"
$TestNull=Get-AutomationVariable -Name "TestNullVariable"

Write-output "TestStringVariable : $TestString"
Write-output "TestBoolVariable : $TestBool"
Write-output "TestDateTimeVariable : $TestDateTime"
Write-output "TestIntVariable : $TestInt"
if($TestNull -Eq $null)
{
    Write-output "TestNullVariable is null"
}

# TestStringVariable : Hoge
# TestBoolVariable : True
# TestDateTimeVariable : 01/01/2021 01:23:45
# TestIntVariable : 12345
# TestNullVariable is null
~~~

## 複合型変数の作成と呼び出し
`Get-AzVM` で取得した VM 情報のような複数の情報を変数に格納する場合、複合型変数が利用できます。
複合型変数はAzure Portal 上からではなく、`New-AzAutomationVariable` コマンドレットを使って作成します。
なお、Runbook から `New-AzAutomationVariable` を使うには、Az.Automation モジュールをあらかじめインポートしておく必要があります。


~~~Powershell
$Conn = Get-AutomationConnection -Name AzureRunAsConnection
Connect-AzAccount -ServicePrincipal -Tenant $Conn.TenantID `
       -ApplicationId $Conn.ApplicationID `
       -CertificateThumbprint $Conn.CertificateThumbprint

$vm = Get-AzVM -ResourceGroupName "<VM が属する RG 名>" -Name "<VM 名>"
New-AzAutomationVariable -AutomationAccountName "<Automation Account 名>" -ResourceGroupName "<RG 名>" `
                         -Name "TestVMVariable" -Encrypted $false -Value $vm 
                         

$TestVm=Get-AutomationVariable -Name "TestVMVariable"
$TestVmName=$TestVm.Name.ToString()
$TestVmLocation=$TestVm.Location.ToString()

Write-output "TestVMVariable VM Name : $TestVmName"
Write-output "TestVMVariable VM Location : $TestVmLocation"
~~~

## 参考資料
- Azure Automation で変数を管理する：https://docs.microsoft.com/ja-jp/azure/automation/shared-resources/variables
- New-AzAutomationVariable：https://docs.microsoft.com/ja-jp/powershell/module/az.automation/new-azautomationvariable
KonyでSMSを送信する方法


### 目次
1. はじめに
2. 実装方法
3. まとめ

 

### 1. はじめに

本記事では、アプリで電話番号とテキストメッセージを指定して、
メッセージアプリを開き、SMSを送信する方法について説明します。  
それでは実装方法を紹介していきます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/6cc8005b-ae54-4770-a71d-c1e5d76da3af.gif" width="300px">
 

### 2. 実装方法

##### 2-1. Widgetの追加
ベースとなる画面を作成します。
今回はこのように作成いたしました。

 ![image001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/a729810b-31ed-bbf2-6475-cd37fed689c2.png)






















##### 2-2. メソッドの作成
続いて、SMSを送るためのメソッドを作成します。
 
* **frmDemoController** に、**sendSMS**メソッドを追加します。


```js:frmDemoController.js  
define({
  sendSMS: function() {
    var phoneNo = this.view.txtPhoneNum.text;
    var text = this.view.txtContent.text;
    kony.phone.sendSMS(phoneNo, text);
  }
});
```

作成したメソッドについて解説をしていきます。

まず、```phoneNo``` と ```text``` には、それぞれテキストボックス・テキストエリアから取得したテキストを設定します。


**kony.phone.sendSMS(phonenumber, text)**
このAPIを使うと、指定した電話番号宛に、指定したテキストが入力された状態で
SMSのメッセージアプリを開くことができます:clap_tone1:

| パラメータ | 説明 |
|:----- | :------ |
| phonenumber [String] |SMSを送信したい電話番号|
| text [String] | SMSの内容 |



今回は、取得したphoneNoとtextをそれぞれにセットします。 

##### 2-3.  **btnSend**ボタンに作成したメソッドを指定

**btnSend**を選択して、画面右のプロパティから**Action**を選択。
**onClick** 横の **Edit** > **Invoke Function** を選択して **sendSMS** を設定します。

 
![image002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/81c1cb12-4bd8-6d8d-3ed6-709acdbc2c43.png)

ここまで実装は完了です。
AndroidとiOSでどのようになったか見てみましょう！

#### 結果

 

-       Android

 
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/6cc8005b-ae54-4770-a71d-c1e5d76da3af.gif" width="300px">





 

-       iOS
        
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/a2f77ac7-b2ae-7771-8cda-61866963b53d.gif" width="300px">



 




 

### 3. まとめ

 

この記事では、Konyを使って指定した電話番号にテキストメッセージを送信する方法を説明しました。
Konyを使えば、このように簡単な方法でSMS送信を実装できます。ぜひ試してみてください！

 

#### 参考

 

_Kony Doc_

 

https://docs.kony.com/konylibrary/visualizer/viz_api_dev_guide/content/kony.phone_functions.htm
デプロイ時のマイグレーションエラー　Mysql2::Error: BLOB/TEXT column '〜' can't have a default value　について

Herokにアプリケーションをデプロイする際、
'heroku run rails db:migrate'でHeroku上でマイグレーションを実行しようとしたところ、

```
StandardError: An error has occurred, all later migrations canceled:


Mysql2::Error: BLOB/TEXT column 'profile' can't have a default value
```

というエラーが発生しました。今回はこのエラーの解決を行いたいと思います。

#内容

###マイグレーションの確認
まず、Heroku上でマイグレーションしようとした際に、エラーが生じたということは、マイグレーションファイルに何らかの問題があると想定されます。
そこで、　'rails db:migrate:srtatus'　で現在のマイグレーションファイルの状況を確認します。

```
rails db:migrate:srtatus
=>
 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20210211014935  Devise create users
   up     20210211120907  Create prototypes
   up     20210211125648  Create active storage tablesactive storage
   up     20210213030202  Create comments
```
全てアップですのでローカルのマイグレーションは問題ないと思われます。
一方で
'heroku run rails db:migrate：status' を実行すると、

```
 Status   Migration ID    Migration Name
--------------------------------------------------
D, [2021-02-15T02:04:37.398144 #4] DEBUG -- :    (2.1ms)  SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC
  down    20210211014935  Devise create users
  down    20210211120907  Create prototypes
  down    20210211125648  Create active storage tablesactive storage
  down    20210213030202  Create comments
```
ダウンとなっております。

**ローカル上のマイグレーションが問題なくても、Heroku上でマイグレーションが有効でない場合があります。**

そのため、デプロイする際には、ローカルとHeroku両方でアプリケーションの挙動確認をする必要があるようです。
Herokuにアップする際は　'heroku run rails db:migrate：status'　を行いましょう。




###db/migrate内のファイルを確認

エラー文の２行目に注目します。
「'profile'カラムがデフォルト設定とすることができません」という内容のエラーです。

カラムについての記述は　db/migrate のファイルを確認します。
![devise_cerate_user.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985033/21194ae7-0465-8120-fc3f-0891d3681efc.png)
以下の defailt::"" が間違っているだろうと考えられます。

```devise_cerate_user.rb
      t.text   :profile,            null: false, default: ""
      t.text   :occupation,         null: false, default: ""
      t.text   :position,           null: false, default: ""
```

こちらを

```devise_cerate_user.rb
      t.text   :profile,            null: false
      t.text   :occupation,         null: false
      t.text   :position,           null: false
```

とします。
マイグレーションファイルを書き換えたので、rails db:rollbackしてから、rails db:migrateします。（今回はrails db:resetを行いました）

Githubに修正をpushしてから、再度、　'heroku run rails db:migrate’を実行。

うまく行きました。

総括
ローカル上のマイグレーションファイルが正常でも、Herokuにデプロイする際に無効となってしまうことがあります。
Herokuにアップする際は、忘れず　’heroku run rails db:migrate’を行い、ローカルとHeroku両方で挙動確認をしましょう。
モンティホール問題について考える

# 前書き

モンティモール問題についてはググってください。
今回は確率について、条件付き確率の公式、面倒な計算、外れる確率がうんぬんを利用せずに求めます。
数学ガチ勢が見たら発狂するかもしれません。

3つの扉をA,B,Cとして、Aを選択し、Cの扉が司会者に開かれて外れだと分かったときの
Aが当たりの確率、Bが当たりの確率について考えます。

# 考える

Nを十分に大きい数だとします。
3N回A,B,Cの扉に抽選が行われ、毎回Aの扉を最初に選ぶとします。
司会者が扉を開く前はA,B,Cがそれぞれ当たりである確率は1/3です。
つまり、それぞれN回当たりに選ばれます。

ここで各扉が当たりの時、Cが何回開かれるか考えます。
Aが当たりの場合、BかCの扉が1/2で開かれるのでCはN/2回開かれます。
Bが当たりの場合、ルール上Cが必ず開かれるのでCはN回開かれます。
Cが当たりの場合、ルール上Bが必ず開かれるのでCは0回開かれます。

Cが開かれたときAが当たりの確率は

```math
Cが開かれたときAが当たりの回数 \div Cが開かれた回数 = \frac{\frac{N}{2}}{\frac{N}{2} + N + 0} = \frac{1}{3}
```

Cが開かれたときBが当たりの確率は

```math
Cが開かれたときBが当たりの回数 \div Cが開かれた回数 = \frac{N}{\frac{N}{2} + N + 0} = \frac{2}{3}
```
となり、確率が求まりました。

# おまけ

プログラム書けって人用
ソース的にはゴミです。

```javascript
function 乱数(最小, 最大) {
    return Math.floor(Math.random() * (最大 + 1 - 最小)) + 最小;
}

const A = 0;
const B = 1;
const C = 2;

let Cが開いた回数 = 0;
let Cが開いてAが当たりだった回数 = 0;

for (let i = 0; i < 10000; i++) {
    const あたり = 乱数(A, C);
    let 開ける場所;
    if (あたり === A) {
        開ける場所 = 乱数(B, C);
    }
    else if (あたり === B) {
        開ける場所 = C;
    }
    else {
        開ける場所 = B;
    }
    if (開ける場所 === C) {
        Cが開いた回数++;
        if (あたり === A) {
            Cが開いてAが当たりだった回数++;
        }
    }
}

console.log("Cが開いてAが当たる確率: " + (Cが開いてAが当たりだった回数 / Cが開いた回数));
```
rails 日本語にする！

# はじめに
今回はrails6でgemをインストールした際に、日本語ではない場合があります。
日本語に変更したい場合に、ファイルに記述することで日本語に変更することができます。
今回simple_calendarをgemでインストールしましたので、そのgemのカレンダーを日本語にしてみたいと思います。

# 開発環境
macOs: catalina
rails: 6.0.0
ruby: 2.7.2

# 方法
まずはsimple_calendarを導入します。
こちらはどこに記述しても構いません

``` ruby
gem  'simple_calendar', '~> 2.4'
次に
bundle install
```

このままではカレンダーが英語のままです。
日本語にしたい場合は、gemをインストールして、以下のコードをファイルに指定します。

```ruby:gemfile
gem 'rails-i18n'
bundle install
```

```ruby:application.rb 
module Scheduler
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 6.0
    config.i18n.default_locale = :ja ←これを追加
    // 省略
  end
end
```

これでカレンダーは日本語に変わります。
BasicTeX on mac in 2025


##### Distribution
配布的な？

* TeXLive
* MiKTeX

##### BasicTeX
TeXLiveを元にしたMacOS用のディストリビューションでscheme-smallに相当するもの[らしい](https://texwiki.texjp.org/?BasicTeX)。

```zsh
brew install --cask basictex
```
pathが通らない時は

```zsh
echo 'export PATH="$PATH:/usr/local/texlive/2021basic/bin/universal-darwin"' >> ~/.zshrc
```

```zsh
sudo tlmgr update --self --all#とりま更新
sudo tlmgr install luatexja #日本語したい
sudo tlmgr isntall haranoaji #日本語標準フォントがIPAEXから原ノ味に変更された。
```

##### Package
足りないパッケージを補う。

```bash

sudo tlmgr install [package]

#一例
pxrubrica biblatex wrapfig minted fvextra catchfile xstring framed multirow trimspaces transparent svg courier luatex85 xypic bussproofs rsfs lualatex-math selnolig biber genealogytree tcolorbox environ framed standalone varwidth circuitikz scsnowman tikzfill
```

##### luaotfload
MacにはFont Bookというアプリが純正で入っていて、フォントを追加でインストールすることができる。`luatex`はフォント検索に`luaotfload`を使っていて`texmf.cnf`に

```config:/usr/local/texlive/2025basic/texmf.cnf
#//はフォルダの意味
OSFONTDIR=/System/Library/AssetsV2/com_apple_MobileAsset_Font7//
```
を追記して

```zsh

luaotfload-tool -u -f
```
とすれば、追加したフォントも使用可能になる。

##### requirements
* minted

```zsh
brew install pygments
```

* svg

```zsh
brew install inkscape
```

### Error
```zsh
tlmgr: Remote database (revision xxx of the texlive-scripts package)
seems to be older than the local installation (rev xxx of
texlive-scripts); please use a different mirror and/or wait a day or two.
```
サーバーをミラーに切り替える。例えば日本なら
```zsh
sudo tlmgr option repository https://ctan.tikz.jp/systems/texlive/tlnet
```
Verilog-HDLでうまくいかない時の対処法

# 概要
Verilog-HDLを使っていて___「ちょっとコードを修正しただけなのに突然うまくいかなくなった」「コードにちょっとミスがあるみたいなレベルじゃなくて明らかに挙動がおかしい」___みたいな事態に何度も遭遇したので、今回はその時の解決法を記録しておきたいと思います。
なお、前提として今回は基本的に順序回路（always文）のお話になります。
# 主な対処法３つ
### 不必要なif文（条件分岐）を減らす
そのまんまです。if文の使用をできる限り避けます。
「いや、if文使わないと複雑な機能作れないじゃん！？無茶言うな！！」と思ったそこのあなたは次を試してみてください。
### bit数を必要最小限にする（16bit化、なんなら8bit化）
こちらもほぼそのまんまです。「ここには２桁の数字しか入らないけどなんとなーく32bitにしてる」みたいなことはありませんか？
実はそれ、あんまりよくないです。bit数を削減するだけでかなり動作が改善します。
一時的に大きな数字が登場する場合も、そのまま不用意にレジスタ（reg変数）に格納せず、計算を進めて数字が小さくなってからレジスタに格納します。
そうすることで、賢くレジスタのbit数を削減することができます。
### ブロッキング代入の使用はできるだけ避ける
こちらは少々複雑なので、まずは「ブロッキング代入」から説明していきます。
当たり前ですが、C言語などのプログラミング言語では、上から順に処理が行われていきます。
   
    /*今aに0が代入されているものとする
    a = 1;
    b = a;

例えばこのようなコードがあったとすると、まずaに1が代入されて、次にbにaの値（すなわち1）が代入されます。
一方、Verilog-HDLでは、基本的に___代入が同時並行に行われます___（これをノンブロッキング代入といいます）
どういうことかというと、例えばさっきと似たようなコードがあったとすると
    
    /*今回もaに0が代入されているものとする
    a <= 1;
    b <= a;

aに1が代入される（ここまではさっきと同じ）一方、それと___同時に並列して___次の行（とさらにそれ以降の）代入が行われます。今回であればbにaの値（つまり0、___1はまだ代入が完了していない___）が___同時に___行われています。
なぜこのような仕様になっているかというと、順序回路としてはこちらのほうが自然だからですね。Verilog-HDLはあくまでプログラミング言語ではなく順序回路ということです。
ここで「ん、代入記号なんかおかしくない？イコールじゃなくて矢印みたいになってるじゃん。イコールに戻せば”普通の”代入に戻るんじゃない？」って思った方、その通りです。C言語のように「普通に」記述すれば「普通に」代入が行われます（ブロッキング代入）。
「なんだ騙された！いつも通りに書けばいつも通りに動いて何も問題ないじゃないか！！」と思うかもしれませんが、実は___それこそが罠です___。
「普通の」代入（ブロッキング代入）は多用すると動作がおかしくなります。
というわけで長くなってしまいましたが、always文では基本的に順序回路として自然な___ノンブロッキング代入を使いましょう。ブロッキング代入を使うのは、それを使わないと望みの動作が実現できそうにない！どうしても使いたい！！というときだけです___。

# なんでこれでうまくいくの？
ここまで色々書いてきてアレなのですが、___実は僕もいまいちよくわかっておりません。あくまでもやってみたらうまくいったという話です。___
ただif文、多数のbitの演算、ブロッキング代入の三つには共通項があります。それは、___時間がかかる___ことです。
if文では、条件式に使われる変数の更新を待つためか、前の行に書いた文がすべて実行完了するまで待ちます。多bit演算は、どうやら桁上がり処理の計算に時間がかかっているようです（下の桁の計算が終わり、繰り上がりが起こるか否か判明して初めて次の桁の計算を開始できる）。ブロッキング代入は、先ほど説明したように上の文の代入完了を待ってから次の文の代入処理を行います。
___これらの処理を「待っている」間にクロックが進み、まだ処理が全て終わり切っていないのに次の処理が始まってしまう。これこそがうまくいかない原因のようです。___
（じゃあクロックさえ遅くすれば万事解決するの？と思いましたが、残念ながら僕の貧相な知識では明確な答えは出せません、ごめんなさい…）
# その他の注意点
### 重複する代入は避ける
ブロッキング代入のところで詳しく説明しましたが、Verilog-HDLでは基本的に代入は同時並行に行われます。
ここで、次のようなコードを考えてみましょう。
    
    /*変数の宣言は済んでいるものとする
    a <= 0;
    a <= 1;

もしこれが通常のC言語であれば、「最初の一行、完全に無意味になってるじゃん(笑)」で済みますが、Verilog-HDLではそれだけでは済みません、もっと重大な問題が起こります。
そうです、aに0と1が___同時に___代入されます。「一つの変数に二つの値を同時に代入？どうなるの？」答えは簡単です、不具合が起こります。
このようなおかしな記述は必ず取り除いておきましょう。
### PS/2キーボードの厄介な仕様
FPGAにキーボードを接続してスキャンコードを読み取る場合、キーを押したときと離したときの間に一瞬だけ___謎のスキャンコードが送り込まれる___模様（詳細不明、押したときのものでも離したときのものでもないのは確か）
想定外のスキャンコードが読み込まれた際に余計なことをしないよう、プログラムを工夫しましょう。
### コメントの全角文字
全角文字なんて使うわけないじゃん！と思うかもしれませんが、なんと___コメントでも___全角文字の使用はご法度とのこと（未確認）
コメントで日本語を使っている方は見直したほうがいいかもしれません。
# まとめ
以上です。ブロッキング代入、ノンブロッキング代入はバグの元なのでしっかり説明していたら結構長くなってしまいました。
というわけでわかりやすいように最後に要点をまとめておきます。

___if文はできるだけ使うな！
16bit(できれば8bit）で計算しろ！
基本はノンブロッキング代入！___

おしまい！質問、間違いの指摘等大歓迎です！！
# 環境
コンパイラ:Quartus Prime Lite (Ver 20.1)
FPGA:DE1-SoC (tesasIC社)
# 参考
if文使いすぎるとうまくいかないよ！ということを主張する記事
https://www.cqpub.co.jp/dwm/contents/0043/dwm004301230.pdf
紙幣貨幣の枚数の合計が最小になるような払い方。

もっと良い書き方がある気がするけど、とりあえず作ってみたので。

# 作ったコード(Java)
```java
import java.util.*;

public class Main {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		long n = Long.parseLong(sc.next());

		LinkedHashMap<Integer, Long> map = countMoneyNum(n);

		// 結果表示
		for (Map.Entry<Integer, Long> entry : map.entrySet()) {
			System.out.println(entry.getKey() + " : " + entry.getValue() + "枚");
		}

	}

	// 紙幣貨幣の枚数を求める関数
	public static LinkedHashMap<Integer, Long> countMoneyNum(long n) {

		LinkedHashMap<Integer, Long> map = new LinkedHashMap<Integer, Long>();
		for (int unit : new int[] { 10000, 5000, 1000, 500, 100, 50, 10, 5, 1 }) {
			long a = n / unit;
			if (a != 0) {
				map.put(unit, a);
			}
			n = n % unit;
		}
		return map;
	}
}
```

# 上記コードの実行結果

例：「42195」を入力した場合

```
42195
10000 : 4枚
1000 : 2枚
100 : 1枚
50 : 1枚
10 : 4枚
5 : 1枚
```

例：「16666」を入力した場合

```
16666
10000 : 1枚
5000 : 1枚
1000 : 1枚
500 : 1枚
100 : 1枚
50 : 1枚
10 : 1枚
5 : 1枚
1 : 1枚
```

# 注意点
LinkedHashMap（putした順序を覚えてくれているHashMap）を使っているので、
10000→5000→1000→500→100→50→10→5→1
の順に出力される。出力順を変えたいときや2000円札を考慮したいときは改変が必要。
また、バリデーションっぽいことを何もしていないので、入力がおかしいとき（Long型におさらまない値とか「1以上の自然数」ではない値とか）の動作は保証しない。

おしまい。
React with TypeScript・Plain CSSを使用したweb開発における命名規則まとめ！

# 概要
表題の通りReact with TypeScript・Plain CSSを使用したweb開発における命名規則を端的にまとめていきます。


## 何故まとめるのか
「コードが読みやすくなる」からです。
他人に対してだけ読みやすくするだけでなく、未来の自分にむけて読みやすくしておくことも重要です。
雑に書いていると過去に自分が書いたコードを読む際に、苦しめられることになります。


## React Component

表記方法：ディレクトリ名、ファイル名、コンポーネント名に
アッパーキャメルケース（パスカルケース）を使用する

```Typescript
HelloWordlComponent
  HelloWordComponent.tsx
  HelloWordComponent.css
```

```tsx
function HelloWorldComponent(props) {
  return <h1>Hello, {props.name}</h1>;
}
```

## React Component以外のファイル名

表記方法:スネークケース

```
snake_case.ts
snake_case.js
```


## Typescript

### 変数
表記方法：ローワーキャメルケース
品詞：基本的に名詞

```TypeScript
const helloWorld:string = 'hello world'
```

#### 補足
場合によってはPrefixを入れる.
Booleanの場合はisなど。
オブジェクト、配列


### 定数

表記方法：コンスタントケース
品詞：基本的に名詞


```TypeScript
const HELLO＿WORLD:string = 'hello world'
```

### 関数
表記方法：ローワーキャメルケース
品詞：動詞＋目的語

```TypeScript

function getFooData(){
}

```

### クラス名
表記方法：アッパーキャメルケース
品詞：名詞

```TypeScript

class Foo {
 private _foo:string

 constructor(foo){
   this._foo = foo
 }

 onUpdateFoo(){
 }
}

```

##### クラスのメソッド

表記方法:ローワーキャメルケース
品詞：動詞＋名詞

### type
表記方法：アッパーキャメルケース
品詞：名詞

```TypeScript

type FooBar = {
 foo:string
}

```

メンバーはローワーキャメルケース

### interface
表記方法：アッパーキャメルケース
品詞：名詞

```TypeScript
interface FooBar {
  foo:string
}

```

### enum
表記方法：アッパーキャメルケース
品詞：名詞

```TypeScript

enum FooBar {
  foo
}

```

### Plain css
BEMを推奨します。
BEMとはページを構成する要素をBlock,Element,Modifierという三つの分類に当てはめ、CSSクラスを命名する規則です。
ここではBEMの詳細には触れず、端的に例示のみ行います。

一般的なBEMは`block__element--modifier`のように
blockとelementの間はアンダースコア二つ、elementとmodifierの間はハイフン二つで区切ります。

```html

<div class="article-list">
  <div class="article-list__article-title">
    タイトル
    <span class="article-list__article-subtitle">サブタイトル</span>
  </div>
</div>
```
引用
https://qiita.com/Takuan_Oishii/items/0f0d2c5dc33a9b2d9cb1


#### 表記方法

| 表記名 | 例 | 
| :---: | :---: |
| キャメルケース、ローワーキャメルケース | camelCase | 
| パスカルケース、アッパーキャメルケース | PascalCase,UpperCamelCase | 
|スネークケース|snake_case|
|ケバブケース,チェーンケース|kebab-case,chain-case|
|コンスタントケース,アッパースネークケース,アッパーケース|CONSTANT_CASE|

#### リファレンス
https://google.github.io/styleguide/jsguide.html#naming-rules-common-to-all-identifiers
https://basarat.gitbook.io/typescript/styleguide#type
http://getbem.com/introduction/
https://qiita.com/Takuan_Oishii/items/0f0d2c5dc33a9b2d9cb1
Azure Reposでブランチポリシーを設定する方法

## はじめに

Azure Reposはリポジトリのブランチ単位でポリシーを設定できます。
ポリシーではPRの完了条件を設定でき、適切に行うことで対象ブランチをきれいに保ちやすくなります。

## ブランチポリシーの設定方法

ブランチポリシーは以下から設定します。

__Project Settings > Repos - Repositories > リポジトリを選択 > Branch Policies - ブランチを選択__
![スクリーンショット_2021-02-15_17_35_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/169cecfa-9734-bf84-5df4-23ddaf0012ca.png)

PRのマージ先となるブランチにポリシーを設定します。
私はGit-flowを採用しているので `develop` ブランチを選択しました。

## ブランチポリシーの一覧

私が設定しているブランチポリシーを紹介します。

### 必須レビュアー数

必須レビュアー数を設定します。

__[Require a minimum number of reviewers]チェックをON > [Minimum number of reviewers]に必須レビュアー数を入力__
![スクリーンショット_2021-02-15_17_35_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/02155c4b-79c9-e12f-a175-57c94cd40543.png)

私は必須レビュアー数を1人にしました。
プロジェクトによって適切に設定してください。

### コメントの解決

コメントの解決を必須にするかどうか設定します。

__[Check for comment resolution]チェックをON > 「Required」を選択__
![スクリーンショット_2021-02-15_17_35_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/aebd6aec-7096-4f35-c0ee-2087b4e49e90.png)

私は全コメントの解決を必須にしました。

### パイプラインの実行

PR時に実行するパイプラインを設定します。

__Build Validationで[+]をクリック__
![スクリーンショット_2021-02-15_17_37_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/e75e96d4-f73b-b423-5605-a9e0eee8f1da.png)

__Build pipelineで実行するパイプラインを選択 > Triggerで「Automatic」を選択 > Policy requirementで「Required」を選択 > [Save]をクリック__
![スクリーンショット_2021-02-15_17_39_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/1163cc73-64be-191c-b013-a4a96d39653b.png)

私はビルドと単体テストを行うパイプラインを自動で実行し、成功しないとPRを完了できないようにしました。

保存に成功すると、一覧に追加されます。
![スクリーンショット_2021-02-15_17_39_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/bc1c80b7-7cea-3beb-d767-5c0fecd0f1d1.png)

### レビュアーの自動追加

自動追加するレビュアーを設定します。

__Automatically included reviewersで[+]をクリック__
![スクリーンショット_2021-02-15_17_40_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/ce40f597-7082-0383-c08b-e5143cb915e9.png)

__Reviewersで自動追加するレビュアーを選択 > Policy requirementでOptional（任意）かRequired（必須）か選択 > [Save]をクリック__
![スクリーンショット_2021-02-15_17_41_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/71b37c35-0125-6e81-8a4e-09a29fe7091a.png)

私は任意レビュアーを自動追加するようにしました。
必要に応じて必須で追加したり、複数人追加したりしてください。

保存に成功すると、一覧に追加されます。
![スクリーンショット_2021-02-15_17_41_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/a09920e3-9b28-98d2-57fe-64c14febd2c6.png)

## おわりに

これでAzure Reposを使った開発が捗ります！

## 参考リンク

- [Build Azure Repos Git repositories - Azure Pipelines | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/devops/pipelines/repos/azure-repos-git?view=azure-devops&tabs=yaml#pr-triggers)
- [Protect your Git branches with policies - Azure Repos | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/devops/repos/git/branch-policies?view=azure-devops)
- [Azure DevOpsでPull Request時に自動で様々なチェックを実施する](https://zenn.dev/vatscy/articles/a689dc9aaf5b97ef91bd)
- https://twitter.com/the_uhooi/status/1361208754717433860?s=20
MVCアーキテクチャについて自分なりに調べてまとめる

備忘録

#はじめに
MVCアーキテクチャで開発をしているが、ふわっとした理解なのでまとめて理解を深めるのが目的。

#そもそも、アーキテクチャって？
`効率よく開発・運用していくための設計方法`の事を指します。

この設計方法を意識せず、開発していくといくつもの問題が生じてしまいます。

・テストがしにくい
・改修や機能の追加が困難
・チーム開発時の役割分担がしにくい

etc...

など書いていくときりがないです。

#FatViewController
アーキテクチャを採用していないアプリの最たる問題例として「`FatViewController`」が挙げられます。

アプリも複雑になっていくと、その分やることが増えてきますよね。
API通信、アラート表示、ログイン機能、エラーハンドリング、画面遷移などなど...。

この処理のコードを全て`ViewController`に書き込んだとしましょう。
アプリ自体は動きますが、中身はグチャグチャになることが予想されます。

これをViewControllerが肥大化したということで「`FatViewController`」と呼ばれています。

「Fat」は日本語訳すると「太っている」ですが
ここでの意味は`抱える責務が多くなっている状態`を表します。
[節子、それViewControllerやない…、FatViewControllerや…。](https://niwatako.hatenablog.jp/entry/2017/09/15/192705)

#MVCアーキテクチャ
以上の問題を避けるために考えられた設計方法の一つが、`MVCアーキテクチャ`です。
`Model`・`View`・`Controller`の頭文字を取ってMVCと呼ばれています。

ではそれぞれの役割について触れていきましょう。

####・Model(class、structなど)
データの保持、`ビジネスロジック`を担当している。

※ビジネスロジックというのは、「`そのシステムにおける、システム固有の処理を行う部分`」を指します。飲食店を検索するアプリなら`飲食店情報の取得`などの部分。

####・View(UIView、xib、storyboardなど)
アプリ画面の表示など`UI関係`を担当している。

####・Controller(UIViewController)
ユーザーの入力に基づいて，`ModelとViewの制御`を担当している。

#MVCの流れ
![cocoaMvc.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743730/49b869ca-6973-5c5a-b3bb-7c5c1a95fed1.jpeg)
出典：[今更MVCとかでiOSアプリつくってみた（Swift）・改](https://qiita.com/am10/items/1a877dc2939962a40aaf#mvc-%E3%81%AB%E3%82%88%E3%82%8B%E5%88%86%E5%89%B2)

例えば、

・ユーザーからの入力アクションを`ViewがControllerへと通知`し、`Modelのデータを更新`したり。

・`Modelからのデータ更新の通知`を受けて、`ControllerがViewの表示を更新`したり。

など。

この流れの説明として凄く分かりやすい記事があったので載せておきます。
[MVCモデルについての私の解釈](https://qiita.com/kazukishimamoto/items/58e111041bc7966df313#%E7%B0%A1%E5%8D%98%E3%81%AA%E3%82%AF%E3%82%A4%E3%82%BA%E3%82%A2%E3%83%97%E3%83%AA%E3%81%A7mvc%E3%83%A2%E3%83%87%E3%83%AB%E9%96%8B%E7%99%BA%E3%82%92%E6%84%9F%E3%81%98%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F%E3%83%BC%E3%81%A8%E3%81%84%E3%81%86%E3%81%93%E3%81%A8)

#おわりに
結局、MVCにしても他のアーキテクチャにしても

「`何かしらのルールで1ファイル(1クラス)の責務を分けて、他に影響がないように小さくする分け方`」

だということです。

私はまだMVCでしかアプリを開発したことがないので他のアーキテクチャも経験したいですね。
【個人開発】オフ会などのための待ち合わせサービス作成しました

# はじめに

個人開発で初めてサービス作成をしました。サービス開発的な点や技術的な点、UX的な点で助言をいただきたいです。

# サービス概要
匿名で待ち合わせ相手と、位置情報の共有、チャット、音声通話を行い、スムーズな待ち合わせを行えるような仕組みを用意しています。

サービス名: アノMeet
URL: https://anomeet-admin.web.app/

### 利用シーン

* オフ会での待ち合わせ
* 婚活での待ち合わせ

# 対応課題
初めて会う人との待ち合わせで、以下のような経験をしたことがありませんか。

* 顔がわからないから、別の人に声をかけてしまった
* （相手もしくは自分が）待ち合わせ場所を間違えてしまった or 勘違いしてしまった
* 待ち合わせるときの細かいコミュニケーションがうまくいかなかった

事前に電話番号やLINE IDなどの交換をしていれば解消するかもしれませんが、そこまでの仲で無い人とも待ち合わせることもあります。
そこで匿名での待ち合わせのためのサービスを作りました。

# 使い方
###トップページでログインします。
![top.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583720/eadd0206-3edc-0d02-4dc5-22d71c14691e.png)

匿名ログインとメールアドレスなどを使ったログインを用意しています。

### 待ち合わせ登録
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583720/8ffbc9bf-7c62-baec-f3fa-4a654797eeb0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583720/68435354-dd28-d357-50f4-c19b157f55d0.png)
待ち合わせの名称と待ち合わせ時間を入力し、待ち合わせ場所を地図から選びます。
匿名なのでURLを知っていれば誰でもはいれるようになっていますが、パスコードを知っている人のみに限るということもできます。

### 待ち合わせページの共有
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583720/4837a5a9-6375-11c2-34dd-d130bafce486.png)
登録した待ち合わせを表示すると、待ち合わせメンバーで共有するようのページができます。これを待ち合わせメンバーに連携します。

### 待ち合わせページ入室
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583720/df74e24b-859c-8c8b-b130-9aaa810c3d17.png)
各待ち合わせメンバーが待ち合わせページを開き、自分の名前（ニックネーム）を指定し入室します。

### 待ち合わせページの利用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583720/4f62c27d-f6c5-a500-7272-3f35e52dbf03.png)
待ち合わせのために、チャット、音声通話、位置情報共有を行いスムーズな待ち合わせを目指します。
### 音声通話受信時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583720/6a63968f-93a3-ae28-0d6a-649e15cf3e70.png)


# 利用技術
* デプロイ先: Firebase
 * Firebase Realtime Database
 * Firebase Authentification
 * Firebase Hosting
 * Firebase Functions
* 使用言語/フレームワーク
 * 画面側: Vue.js(Nuxt SSR)
 * サーバ側: JavaScript（Firebase Functions)
* その他
 * 地図: mapbox
 * 音声通話: SkyWay
 * 通知: Push.js
 * CI/CD: circleci
 * e2eテスト: cypress

# 苦労したところ/工夫したところ

* AWSにするかGCPにするか悩んだのですが、管理をシンプルにしたいなと思い、地図サービスにGoogle Mapを使うからFirebaseにしました。Google Mapを使って作ったところ、API呼び出しが思ったよりも多く、無料枠等を考え、mapboxに移行しました。AWSで作ってもよかったなと思っています。
* サービス設計を気を付けました。
 * 匿名で安全なサービスにしたいと思い、操作者の自宅がわからないように位置情報共有に場所の制約や時間の制約を設けたり、音声通話が苦手な人のために音声通話を許可しないと実施できないようにしました。
 * 簡単に利用できるように、もろもろ初期値を用意しているので、クリックだけで簡単に使えるようにしました。
 * 音声通話受信時に、Web Notificationで通知したり、通話のUIをCSSで電話っぽくなるようにしました。

# 終わりに

個人開発ではありますが、どのようなサービスが良いのかということを考えながら仕様を検討していきました。仕様検討しつつ実装しつつを好きにできるので個人開発を楽しめました。
あとは、少しでも使ってくれる人がいて、感想などいただければありがたいです。

個人開発ですが、CI/CDやe2eテストは実プロジェクトでは他の人にお願いすることが多く、自身でやることは今まで少なかったのですが、自身で設計・実装する機会ができ、学習する良い機会になりました。

新型コロナウイルス蔓延による非常事態宣言で外出自粛などしている状況ではありますが、徐々に新規感染者が減っていっていると思います。非常事態宣言が解除され、リアルで会う際に使われていってくれると幸いです。
長尾製作所 OLIOSPECオリジナル　NVIDIA JETSON XAVIER NX 開発者キット用ケースを使ってみた

JETSON XAVIER NXにケースが欲しいと思いOLIOSPECオリジナルのケースを購入しました。
Aliexpress等で安価なケースが色々ありますがアンテナを交換する必要がある為、本商品を見つけ購入しようと思いましたが
昨年末に在庫切れになり、先日再入荷に伴い購入してきました。
##スペック
素材：スチール
製造：長尾製作所
価格：2750円
https://www.oliospec.com/shopdetail/000000009950/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/0e045be1-1ff5-c560-dd86-a7d707c449a9.png)
##感想
微妙
ナダ電子さんのJetson Xavier NX用アルミケースをお勧めします。
https://www.nada.co.jp/jetsonxaviernx_box/
何故か？

それでは順番に見ていきましょう。
製品は、ビニール袋にそのまま入っています。
傷上等な梱包形態です。
付属品は、写真のスペーサーやネジ類です。
![DSC_0838 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/130fa5af-4c73-f133-9764-37b84a5de174.jpeg)
##塗装ムラ・ダマリは当たり前
残念ながら、塗装ムラや塗装ダマリが普通にあります。
![DSC_0845 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/d7b7ef44-9cda-1956-0cb1-36e4384b81b9.jpeg)
プレス痕が残るというのと別で、塗装の品質は低いです。
##ネジのサイズが違う
とりあえず組んでみました。
ケース固定用スペーサーがスゴイ硬いんです。
後でわかる事ですがM2.6を使用しています。(JetsonのネジはM2.5です）
これは現品確認したのでしょうか？
![DSC_0848 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/c2965f82-1d43-f256-5249-b8393f0cf86e.jpeg)
前から見ると結構良いですね
![DSC_0849 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/aa57569e-63b0-cbd3-6257-80fa524e49dd.jpeg)
では後ろは？
##MicroSDスロットが使えない
MicroSDが刺さりません。
設計不良です。
Z方向で最低2㎜程度は下にする必要があります。
(現状のスペーサーを使う場合、穴のサイズを上に拡大する約3㎜）
![DSC_0852 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/95d7a573-be03-31ec-c251-002834365610.jpeg)
##スイッチを付ける
ナダ電子さんと同じくLED付きスイッチが使用できるようになっています。
スイッチを用意します。
![DSC_0856 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/dfc58e86-e195-a0f8-a1f3-c8312e777288.jpeg)
LEDとスイッチの端子をジャンパーピンで逃がして接続します。
MicroSDはギリギリ当たりません。
写真のジャンパーピンは位置が間違えています。赤色の部分にさしてください。
![DSC_0859 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/5ec9555f-6f0f-e3a3-8e04-5ed3341fed60.jpeg)
##スペーサーを入れる
次に、赤丸のネジの下にスペーサーを入れます。
ワッシャー数枚または、ナットを入れます。
M2.5のナットを使用したら使えずM2.6は問題なく通ったのでM2.6のネジを使用していると推定されます。
![DSC_0862 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a806fcff-28c1-cf92-e9c7-33c76de0611f.jpeg)
組み上げた状態です。
![DSC_0869 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/253c6c8d-143d-f5ba-c394-ed27fed90197.jpeg)
無事MicroSDが使えるようになりました。

素人の私がいうのもなんですが
長尾製作所さんは、面白そうな製品を作っているだけにもう少し設計を煮詰めてはいかがでしょうか？
オリオスペックさんの特製という事でオリオスペックさんのお店としてのクオリティもその程度かと思ってしまいます。
値段相応という事で、残念でなりません。
##ネジサイズについて
念のため、外したネジを計測し、ナットとも勘合した所M2.5のようです。
長尾製作所さんが用意している付属のM2.6スペーサーを取り付ける際に非常に硬かったのはネジサイズが違うといえそうです。
###Jetsonのネジ
![DSC_0878 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/1f930158-695c-162e-2117-f856bf29c834.jpeg)
###M2.6ネジ
![DSC_0879 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/13e4f590-d773-858a-ff13-a4f0d279489c.jpeg)

**ネジの外径はネジ山がさらわれておりM2.5⇒2.5㎜ではありません。
RaspberryPi OS に Python3 用の RPi.GPIO を入れる

RPi.GPIOを使いたい。

# 環境

2020-12-02-raspios-buster-armhf-lite.zip

```

pi@raspberrypi:~ $ cat /etc/issue
Raspbian GNU/Linux 10 \n \l
```


Python2 なら使えるが

```
$ python
Python 2.7.16 (default, Oct 10 2019, 22:02:15) 
[GCC 8.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import RPi.GPIO as GPIO


```

Python3 だと使えないので

```

pi@raspberrypi:~ $ python3
Python 3.7.3 (default, Jul 25 2020, 13:03:44) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import RPi.GPIO as GPIO
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'RPi'

```

まず PIP3 をレポジトリからインストール

```

$ sudo apt install python3-pip
```


```

.
.
.
0 upgraded, 25 newly installed, 0 to remove and 33 not upgraded.
Need to get 51.4 MB of archives.
After this operation, 84.3 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
.
.
.
```

次に rpi.gpio を入れる

```

$ sudo pip3 install rpi.gpio


```

```
$ python3
Python 3.7.3 (default, Jul 25 2020, 13:03:44) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import RPi.GPIO as GPIO

```

使えました
Javaでbit全探索するときのいつもの形。

# そもそもbit全探索って何
**[ぐぐる](https://www.google.com/search?q=bit%E5%85%A8%E6%8E%A2%E7%B4%A2)**と山ほど見つかります。。。

# 自作のコード(Java)
```java
public class Main {

	public static void main(String[] args) {

		// 「2の5乗」回ループ
		for (int i = 0; i < (1 << 5); i++) {

			// 5回ループ
			for (int j = 0; j < 5; j++) {
				if ((1 & i >> j) == 1) {
					System.out.print("o");
				} else {
					System.out.print("x");
				}
			}

			System.out.println(" " + i);
		}

	}

}
```

# 上記コードの実行結果

```
xxxxx 0
oxxxx 1
xoxxx 2
ooxxx 3
xxoxx 4
oxoxx 5
xooxx 6
oooxx 7
xxxox 8
oxxox 9
xoxox 10
ooxox 11
xxoox 12
oxoox 13
xooox 14
oooox 15
xxxxo 16
oxxxo 17
xoxxo 18
ooxxo 19
xxoxo 20
oxoxo 21
xooxo 22
oooxo 23
xxxoo 24
oxxoo 25
xoxoo 26
ooxoo 27
xxooo 28
oxooo 29
xoooo 30
ooooo 31
```

おしまい。
社会人2年間の集大成！占いサイトを作成した話①

# はじめに
約1年かけて占いサイトを作成しました:crystal_ball:主にHTML、CSS、JavaScriptを使用しています。社会人1年目からフロント言語には興味があり勉強を行っていたというのもあり作成に至りました。
1年前にはイメージは完成していたものの作業がなかなか進まず、本格的に作業をしたのはこの半年です。
webサイトの作成方法から占いサイトの中身について紹介します。

# 占いサイトのイメージ図を作成
実装の難易度に限らずとりあえず自分が作りたいものを書いてみました:point_up_tone1:
この絵を見ながら実装を進めていきました。いわゆる設計書です。
![8DB03BAB-3401-4BE3-9EA1-30C082133D29.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700107/3b6773e6-8660-87b5-e6f8-2907e4e5f780.jpeg)
![AB6174E5-2E75-4703-B309-69D17A20677C.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700107/f3ce92d5-8ac0-6406-f905-bb050052997c.jpeg)

# 環境の用意
NetlifyとGitHubを連携し環境を用意しました。
Netlifyとは静的コンテンツのホスティングサービスで、無料でドメインを取得できます。※その代わりアクセス数の制限などがあります

詳しくはこちらの記事にNetlifyとGitHubの方法が記載されています。
[Netlifyで静的サイトのホスティングをする](https://qiita.com/sugo/items/2ee64887d682b0dae635)

デプロイまでの運用方法は以下のやり方で行いました。
**１、**masterの下に開発ブランチを作成。
**２、**開発ブランチから画面毎のブランチを作成。
**３、**画面毎のブランチから開発ブランチにマージしたタイミングでデプロイを走らせる。
何度かデプロイが上手くいかずエラー画面が表示されることもありました:disappointed_relieved:
Netlifyのページ内は英語で書いてあり、翻訳しても変な日本語だったので操作が少し難しかったです。

# ホーム画面の紹介
作成したサイトのホーム画面はこちらとなります！！
自信が書いた絵よりもポップな感じに仕上がりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700107/7dfb7351-c6be-bf56-e5be-aec3e2ea14c4.png)
設計書と比較してみるとレイアウトが少々変わってしまいました。
自分で作っているからこそ変更できるのがいいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700107/9141de8c-6ee8-ff34-0ebf-5ee0ba931767.png)

今回はここまでとなります。
次回では作成したページ１つ１つの紹介を行っていきます:point_up_tone1:

続きはこちら！
[社会人2年間の集大成！占いサイトを作成した話②](https://qiita.com/nacho0707/items/a64618cb87a0df533e9d)
macから対象サーバへ鍵なしでログイン出来るようにする

macからローカルの鍵を指定し、接続することが煩わしく感じた時の為の備忘録として記します。

##前提
使用するOS：mac
接続したいサーバ：AWS上のLinux

##手順
①ログインユーザーをつくる

```
# useradd test
```
②ユーザーのログインパスワードを設定する

```
# passwd test
  New Password : hoge
```

③sshd_config設定を変更する

```
# sudo vi /etc/ssh/sshd_config 

###以下の行を修正する###
PubkeyAuthentication yes
PasswordAuthentication yes
```

④sudo権限を追加

```
# sudovi

###以下行を追加###
test   ALL=(ALL)  ALL
```
⑤sshdを再起動する

```
# systemctl restart sshd
```

⑥ログイン確認をする

```
# ssh test@IPaddress
```

##後日談
・上記の方法で設定してしまうと、他ユーザでログインする時も絶対パスワードの入力を求められるので、
　他ユーザのパスワード設定もしておいた方がいいです。。。設定していなくてログイン出来なくなりました。

##参考サイト
https://kazmax.zpp.jp/linux/lin_sshrsa.html
reflectパッケージで構造体情報を取得

# reflectパッケージ
GO言語におけるreflectパッケージですが、
発生遅くありません？

思いついてから実装まで一体何フレかかってんだと。
特にしばらく実装から離れていると、さらに時間がかかりますよね。

そこで、そこらへんを少しずつTipsとしてまとめていければと思ってます。

# 構造体の変数名とタグを取得
```
package main

import (
	"fmt"
	"reflect"
)

// 構造体
type Skill struct{
	p int64 `tag:"弾拳"`
	pp int64 `tag:"烈掌"`
	ppk int64 `tag:"烈空脚"`
}

// 構造体情報を出力
func do(I interface{}) {
	v := reflect.ValueOf(I)
	t := v.Type()
	for i := 0; i < t.NumField(); i++ {
		name := t.Field(i).Name
		tag := t.Field(i).Tag.Get("tag")
		fmt.Println("name="+name+" tag="+tag)
	}
}

// メイン処理
func main() {
	do(Skill{})
}
```
現場からは以上です。
Cypress でファイルダウンロード

Cypress 6.3.0 でファイルダウンロードの機能アップがされていたので、簡単に紹介します

公式は以下を参照ください
https://github.com/cypress-io/cypress-example-recipes/tree/master/examples/testing-dom__download

# できるようになったこと

* ダウンロードのダイアログを表示させずにファイルダウンロードをテストできるようになった
* ダウンロードされたファイルはデフォルトで `cypress/downloads` に入る（設定で変更可）
* `cypress run` のたびに `cypress/downloads` の中身がクリアされる（クリアしないように変更可）

# 設定
cypress.json に下記を記載（なお、下記の値はデフォルト値なので、このまま使うなら記載不要）

```json
{
    "downloadsFolder": "cypress/downloads",
    "trashAssetsBeforeRuns": true
}
```

* downloadsFolder　：　ダウンロード先のフォルダ
* trashAssetsBeforeRuns　:　`run` 時にダウンロードフォルダの中身を消すかどうか

# テストコード例

Wikipedia から画像をダウンロードしてみます

```typescript
/// <reference types="cypress" />
context.skip('File Download', () => {
    Cypress.config().baseUrl = 'https://ja.wikipedia.org';

    beforeEach(() => {
        cy.viewport(1280, 800);
        cy.visit('/wiki/TypeScript');
    });

    it('can download file', () => {
        cy.title().should('contain', 'TypeScript');

        // ダウンロードのリンクをクリックする
        cy.get('a[href*="Typescript_logo"]').click();
        cy.get('.mw-mmv-view-expanded').click();
        cy.get('.mw-mmv-download-button').click();
        cy.get('.mw-mmv-download-go-button').click();

        // ダウンロードしたファイルに対して、なんらかのチェック等
        const filename = 'cypress/downloads/Typescript_logo_2020.svg';
        cy.readFile(filename, 'binary').then(buffer => {
            expect(buffer.length).to.be.gt(1000);
        });
    });
});
```

ダウンロードページに行くまでに何回か画面遷移するので少し長くなっていますが、ダウンロードリンクがあるページを開いて、ダウンロードリンクをクリックするだけで基本的には OK


# うまくいかない例

なぜかうまく行かない場合もあり、下記は Qiita のロゴをダウンロードしてみた場合です

```typescript
/// <reference types="cypress" />
context('File Download', () => {
    Cypress.config().baseUrl = 'https://help.qiita.com';

    beforeEach(() => {
        cy.viewport(1280, 800);
        cy.visit('/ja/articles/others-brand-guideline');
    });

    it('can download file', () => {
        cy.title().should('contain', 'デザインガイドライン');

        cy.get('[href="/images/qiita-png.zip"]').click();
    });
});
```

ダウンロード自体はできて、ダウンロード先のフォルダにファイルが保存されるのですが、その後 `page load` がタイムアウトしてテストが止まってしまいます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/871926/e9083434-34e1-82ae-b750-af0b3372b413.png)

Github の Issues にも上がっているので不具合なのかなとも思いますが（ https://github.com/cypress-io/cypress/issues/14857 ）、もし解消方法がご存知の方がいれば教えてもらえると助かります
複数のカラムをまとめて住所として設定する[GoogleMap] [Geocoding]

#環境
ruby 2.6.5
rails 6.0.0
MySQL
Github

#実現させたいこと
Google Maps Platformを利用し、アプリケーションにマップを表示させる。
その際に、すでに構築しているデータベースのテーブル内の複数のカラムをまとめて住所として扱いたい

#記事を投稿するに至った背景
投稿主はアプリの作成の段階で、住所に関するカラムを「都道府県」、「市区町村」、「それ以降」というように分類しており、一方で、Qiitaに投稿されている記事では、ほぼ全てが一つのカラム（例 address）で完結させていた。
そのためデータベース状況が異なり、多くの記事を参考にさせていただいたが、うまくマップを表示させられなかったので解決までの過程を投稿します。

ですので、現段階で住所に関するカラムを１つのみで構成しようという方は以下の記事を参考にしてください。
https://qiita.com/osugi_san/items/72d58bf034dc2db9d02c

#前提
以下の文章は上記のURLの「住所に関するカラム以外」のプロセスを行ってからコーディングをお願いします。

投稿主のデータベース
テーブル　board
カラム　prefecture_id(都道府県),municipality(市区町村),edaban（番地）


#解決策
モデルに以下の文を記述

```ruby:board.rb
  def address
    [self.prefecture.name,self.municipality,self.edaban].compact.join()
  end
```

このように入力することで、カラムのデータをaddressという変数にまとめることができます。

余談ですが、join()の()内にハイフンなどを置くことでデータ間に入力したものを置くことができます。

今回はデータとデータの間は空白であることが望ましいので記述しません。

最終的な記述は以下の通りです。

```ruby:board.rb

(略)

geocoded_by :address
after_validation :geocode

def address
    [self.prefecture.name,self.municipality,self.edaban].compact.join()
end

(略)

```

これで無事にマップを表示させることができました。

#まとめ
ご覧いただきありがとうございました。

データベースを設計しなおせば良いのでは？と思った方もいるかと思いますが、おっしゃる通りです。
それでもよかったのですが、やり方が分からずDB設計をし直すのは、私個人のプライドが許さなかったので、どうにかして自力で解決をしました（笑）

同じようにデータベースの構成を崩したくない、２つ以上のカラムを使ってgeocodingしたい、という方々の手助けになれば幸いです。
Fess データストアクロールを実行すると No CSV file となる

# 環境
- Windows10 Pro 64bit 又は Windows Server 2016
- Fess 13.9.3
- Elasticsearch 7.9.3



# 現象

- データストアクロール対象ディレクトリに CSV ファイルが存在しているが「CSV ファイル無し」と扱われる
- 過去のインデックスが削除される
- 再度、クロールを実行すると正常に読み込まれる

クロールログ（1回目）

```
2021-02-03 11:35:51,643 [20210203113538-1] INFO  directories=C:/fess_crawl_list
2021-02-03 11:35:51,652 [20210203113538-1] WARN  No CSV file.
2021-02-03 11:35:51,842 [20210203113538-1] INFO  Deleted 7 old docs.
2021-02-03 11:35:56,612 [DataStoreCrawler] INFO  [EXEC TIME] crawling time: 5055ms
```

クロールログ（2回目）

```
2021-02-03 11:38:22,851 [20210203113809-1] INFO  directories=C:/fess_crawl_list
2021-02-03 11:38:22,887 [20210203113809-1] INFO  Loading C:\fess_crawl_list\data_store.csv
2021-02-03 11:38:24,080 [20210203113809-1] INFO  Sent 2 docs (Doc:{process 78ms, send 232ms, size 8KB}, Mem:{used 152MB, heap 406MB, max 512MB})
2021-02-03 11:38:24,521 [20210203113809-1] INFO  Deleted 0 old docs.
2021-02-03 11:38:27,731 [DataStoreCrawler] INFO  [EXEC TIME] crawling time: 5010ms
```

# 結論
Fess の公式フォーラム CodeLibs で質問したところ運営の Shinsuke Sugaya さんが回答してくださった。
https://discuss.codelibs.org/t/no-csv-file/1456

- データストアクロール対象ディレクトリに CSV ファイルが存在しているが「CSV ファイル無し」と扱われる
- 再度、クロールを実行すると正常に読み込まれる
  - 仕様（ファイルのタイムスタンプが 1分以上経過しないと対象とならない）

**自身が検証していた際、CSV 作成後に間髪を入れずクロールを実行させていたことが原因であった。**

- 過去のインデックスが削除される
  - 仕様（データストアクロール設定のパラメーターに `delete_old_docs=false` を追記することで削除処理をオフにできる）
Pythonで場合分けされたグラフを描こう！

# 結論
**np.vectorize**を使え！

# 詳しく

場合分けされたグラフを描く記事があまり見当たらなかったので、書いてみました。

次のような関数のグラフを描くことを目標にします(ただし、$-2 \leq x  \leq 4$)。

```math
f(x) = 

\left\{ \begin{array}{lll}
  \mathrm{e}^{-|x|}\cos(50x) & (x \geq 0) \\
  x + 1 & (-1 \leq x < 0) \\
  \cos(\frac{13\pi}{3 + x}) & (otherwise)
\end{array} \right.

```

```python
import numpy as np

x = np.linspace(-2, 4, 1000)
def myFunc(x):
  if x >= 0:
    return np.exp(-np.abs(x)) * np.cos(50*x)
  elif -1 <= x and x < 0:
    return x + 1
  else:
    return np.cos(13*np.pi/(3+x))

npmyFunc = np.vectorize(myFunc)

fig, ax = plt.subplots()
ax.plot(x, npmyFunc(x))
plt.show()
```

![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663887/76c0321a-ec6a-31bf-f210-62f81ba21f34.png)

関数をベクトル化することで、ndarrayを引数として受け取れるようになっています。

for文で関数に値をつっこみ、新しいリストに入れてプロットするやり方もできますが、こっちの方が簡潔に書けると思います。
xamppでPHPからaccessにデータを繰り返し登録していたら急にエラーが出て焦った

データ移行の案件で、30万件のデータをaccessに登録、削除していたら、急に以下のようなエラーが出て書き込めなくなりました。

**SQLSTATE[HY000]: General error: -1206 [Microsoft][ODBC Microsoft Access Driver] データベース '|' を開くことができません。アプリケーションで認識できないデータベースであるか、またはファイルが破損しています。**

## とりえあずググる

こちらの記事を参考にさせていただきました。
[Access 2010 (x64) で 2GB 以上のデータベースを扱えない](https://ez-net.jp/article/81/a2yIHklK/2aeLDr8nt9Fp/)

accessのサイズを確認すると、たしかに2GBを超えていました。。。

## トランザクションログ？

昔SQLServerで、サイズが大きすぎてインポートできない問題を思い出し、トランザクションログを削除する機能がないか調べました。

## データベース最適化で解決

データベースツール内の「データベースの最適化／修復」を押したところ、ファイルサイズが
2GB → 10MB まで小さくなったので解決しました。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278955/f605c97a-7bdc-da71-8721-96092e06711e.png)
TencentCloudでSESの設定

仕事でTencentCloudを使うことになったけど、触ったことないのでさっぱりわからず
メルマガ的なことをやりたいのでまずはマネコンからメール送信、SDKつかってプログラムからメール送信的な感じで進めていこうかと


#### 送信元ドメイン登録
TencentCloudのマネコンから
Simple Email Service > Sender Domain > createボタン

![スクリーンショット 2021-02-05 20.51.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294537/aa2ef0e7-c976-210f-feeb-4e6ad81a386c.png)

作成したドメインのVerifyを押すとSPF／DKIMレコードが表示されるのでDNSへ登録
ちゃんと登録されてないと送信元ドメインとして使用できない

登録後はVerifyからsubmitを押すと有効になる
ほっといたら承認されるのかと思って無駄な時間を過ごしてしまった・・・

承認されればステータスが「Verification passed」になる
![スクリーンショット 2021-02-10 10.57.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294537/ce9cd76d-a6e6-d9a3-c8be-2113afc6967a.png)


#### 送信元メアド登録
TencentCloudのマネコンから
Simple Email Service > Sender Address > createボタン
![スクリーンショット 2021-02-10 11.02.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294537/20946ff8-7930-31a8-b766-c9de79a5b108.png)

Sender Domain：送信元ドメインを選択
Email Prefix：＠より前のメアド
Sender Name：表示名？
まあ、適当に

#### メール本文作成
TencentCloudのマネコンから
Simple Email Service > Email Template > createボタン
![スクリーンショット 2021-02-10 11.10.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294537/f7a0c299-20d9-6143-b8c6-8a8089e64159.png)

Template Name：テンプレート名。なんでも
Template Type：HTMLメール or テキストメール
Email Summary：メールの概要
Email Body：本文。HTMLメールならHTMLファイルのアップロード、テキストメールなら直接入力かな？
「こんにちは　{{name}}　さん！」みたいに変数も利用可能

submitを押すとステータスが「Under review」になる
ドキュメントによると、ここから承認段階に入り３営業日くらいで承認されるとのこと。
検閲・・・？？


>After the template is submitted, it will enter the review stage and can be used upon approval. The review will be finished within three business days.

#### メール送信
TencentCloudのマネコンから
Simple Email Service > Email Sending
![スクリーンショット 2021-02-15 17.14.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294537/03b7bae4-6dbe-e9e0-3430-b67a13e5fbd7.png)


Template：作成してしたテンプレートを選択
Subject：件名
From：送信元メアド登録の中から選択
To：送信先
Variables：変数設定。json形式


#### その他
メールは送信できたものの少し使いづらいような・・・
・テンプレートのレビューの３営業日かかる
・変数展開が１このみ？送信対象者によって名前を変更するとかできない？
・APIを使用しても１回で送信できるのは５０人とのこと。
うーん・・・
一瞬でサンクスページをつくる(Bootstrap)

# 一瞬でthanks_pageをつくる(Bootstrap)

![スクリーンショット 2021-02-15 17.11.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676810/7cc39369-61f2-641f-abd6-a9ae97c34d48.png)


なにかformを送信した後に、遷移先のthanksページのサンプルがあればいいかなと思い、記述。
css を書かずにできます。

## headタグの中に忘れないように。bootstrapを読み込みます
```
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
```
bootstrapを読み込みます

jumbotron(ジャンボトロン)では, ヒーローユニットスタイルのコンテンツの表示できます。ジャンボトロンの使い方の例を示します。

オプションで viewport 全体を拡張して, サイトに主要なマーケティングメッセージを表示できます。
下記参考
https://getbootstrap.jp/docs/4.3/components/jumbotron/

## source code
```
<div class="jumbotron text-center">
  <h1 class="display-3">Thank You!</h1>
  <p class="lead"><strong>Please check your email</strong> for further instructions on how to complete your account setup.</p>
  <hr>
  <p>
    Having trouble? <a href="">Contact us</a>
  </p>
  <p class="lead">
    <a class="btn btn-primary btn-sm" href="https://bootstrapcreative.com/" role="button">Continue to homepage</a>
  </p>
</div>
```
ページ内遷移をスムーズに動かす挙動はブラウザ標準でできる

タイトルオチです。

ページ内リンクをスムーズなスクロールで遷移する挙動はJavaScriptを利用して実装するのがあたりまえだと思っていましたが、
**それ、ブラウザ標準でできるよ。**
というのを知ったのでメモ

# scroll-behavior: smooth;
https://developer.mozilla.org/ja/docs/Web/CSS/scroll-behavior

```css
html {
  scroll-behavior: smooth;
}
```
htmlもしくはbodyに対してこのCSSのプロパティを加えるだけでページ内遷移のスクロールがスムーズになります。

### IE
IEにはこのプロパティはサポートされていないので別途ポリフィルを導入する必要があります。
https://github.com/iamdustan/smoothscroll

```js
import smoothscroll from 'smoothscroll-polyfill';

// kick off the polyfill!
smoothscroll.polyfill();
```

ブラウザ標準バンザイ🙌
IEバイバイ