OmniAICreator/Qiita-1.07M huggingface dataset:
機械学習のお勉強〜matplotlib編〜

#機械学習のお勉強〜matplotlib編〜

今回はmatplotlibの勉強をしたのでそのアウトプットをします。

##1.matplotlibとは？

データの可視化をしてくれる外部ライブラリです。
numpy,pandasと同様Pythonには最初は入ってないけどAnacondanには最初からインストールされています。

##2.データの可視化をすると何がいいの？

外れ値を素早く見つけることができます。

例えばお菓子の値段の統計を取っていたとします。
１個１００円前後のお菓子の中に１個１万円のお菓子のデータがあったらおかしいですよね？
そのおかしいデータを瞬時に見つけるのはとても難しいですが、グラフなどでデータを可視化することで瞬時に見つけることができます。

ここ１つだけ変な点があるなぁ？ってなります(笑）

##3.基本的な使用方法

###インポート

```python:test.ipynb
#matplotlibのインポート
import matplotlib.pyplot as plt
%matplotlib inline
```

上記を実行しましょう。
%matplotlib inlineはJupyterNotebookで使うときだけ使用しましょう。
今回はpyplotの機能だけ使うのでpyplotだけインポートします。

###グラフの描画

```python:test.ipynb
#グラフのサイズの設定(4×4)
plt.figure(figsize=(4,4))
#グラフの作成
plt.plot([1,2,3,4,5],[6,7,8,9,10],label='test')
#x軸の名称
plt.xlabel('x軸')
#y軸の名称
plt.ylabel('y軸')
#グラフタイトル
plt.title('タイトル')
#上記凡例をグラフに反映
plt.legend()
#グラフを表示
plt.show()
```

基本的な関数は上記。
plt.show()に関しては記載しなくてもグラフは表示するので好みでどうぞ。

xの２乗のグラフを記載するなら、、、

```python:test.ipynb
import numpy as np

#1~10の配列をxに代入
x = np.arange(0,11,1)
#yの値をxの２乗にする
y = x ** 2
plt.plot(x,y,label='y = x^2')
#x軸の名称
plt.xlabel('x軸')
#y軸の名称
plt.ylabel('y軸')
#グラフタイトル
plt.title('y = x^2')
#上記凡例をグラフに反映
plt.legend()
#グラフを表示
plt.show()
```

これで出来ます。

###複数のグラフを表示する。

次に複数のグラフを表示する方法を記載します。

```python:test.ipynb
#2行２列　トータルのサイズが８×8のグラフを作成
fig,ax = plt.subplots(2,2,figsize=(8,8))
#x,y,zの範囲を設定
x = np.arange(0,11,1)
y = x ** 2
z = x ** 3
#グラフの作成
ax[0,0].plot(x,x,label='x = x',color='red')
ax[0,1].plot(x,y,label='y = x^2'),color='green')
ax[1,0].plot(x,z,label='z = x^3'),color='blue')

#グラフの設定
for i in range(2):
  for j in range(2):
    ax[i,j].set_xlabel('x軸')
    ax[i,j].set_ylabel('y軸')
    ax[i,j].legend()

plt.tight_layout()
```

figに全体のサイズに縦横8サイズのグラフを作成
その中に縦横２サイズのグラフを4つ作成しています。

tight_layout関数は、グラフ同士被らないようにする関数です。

###その他グラフの作成

これまでは棒グラフのみでしたが他のグラフももちろん作成できます。

```python:test.ipynb
#円グラフ
plt.pie()
#ヒストグラム
plt.hist()
#散布図
plt.scatter()
```

引数は割愛していますが、円グラフ、ヒストグラムは各データの割合や推移
散布図は組データの確認に使うので興味があれば調べてみてください！

#4.まとめ

機械学習これまでやってきましたが楽しいです！
普段こういういろいろなことが可能な言語をしてきていなかったため、出来ることが多いのはいいなぁ・・・ってなります。
明日以降もアウトプットに投稿しますが、拙くなってしまうのは見逃してください・・・

以上
チーム開発（デプロイ作業）

本番環境のマイグレーションファイル確認方法
作業中のディレクトリで
cd db/migrate
ls
cat ファイル名

priceカラムがないエラー、本番環境にカラム追加が反映されなかった
https://gyazo.com/f195fd0a8fbb6c3d52e4fb46746af2f8
https://gyazo.com/313a9a7af4168766f2170d9fc0758d8b
ユニコーンプロセスをkillしていなかった為反映されなかった
本番環境のターミナル
ps aux | grep unicorn
kill master番号
でkillをして
ローカルターミナルで
bundle exec cap production deploy
で反映できるようになった


本番環境でカテゴリー選択ができない
https://gyazo.com/ec95db1fd196305f8ec971697ae06f5e
https://gyazo.com/100c4a64f15c1b19da676f963901159e
参考サイト
https://qiita.com/keitah/items/71acb21cea7d4cd4b448
サイト通りにやったらできた。

なんとか三日かかってやっと完成！！！
undefined method 'page' for # <Array:0x000........>が出たときの対処法

#はじめに
gem kaminariについて、新しい発見があったので、記録として残す。

#今回のエラー

```controller.rb
インスタンス変数 = オブジェクト.page(:params[:page]).per(10)
```


```index.html.haml
= paginate インスタンス変数
```

と定義したところ、エラーが出た。

エラー文

```
undefined method 'page' for # <Array:0x000........>
```


**なぜ？？？**

#実は、、、

私の解釈では、、

```controller.rb
インスタンス変数 = オブジェクト.page(:params[:page]).per(10)
```

のつもりだったのが、

```controller.rb
インスタンス変数 = 配列.page(:params[:page]).per(10)
```

の間違いだった。

#解決策

kaminariの公式ページを読めばわかるのだが、

通常.pageメソッドはActive Recordのオブジェクトにしか適用されないらしい。

今回はそうではなく、配列（Array）だったのでエラーが出ていたようだ。

そこでkaminariでは、配列にも.pageメソッドを使用できるやり方がある。

```controller.rb
インスタンス変数 = Kaminari.paginate_array（配列）.page(params[:page]).per(10)
```

これで解決した。

#おわりに


あまり深く理解せず使用していたジェムがたくさんあるが、こういうエラーがきっかけで、
改めて公式レファレンスを読むことの重要性を感じた。


公式レファレンスを読み進めていくと、新しい発見もたくさんあるので非常に楽しいので、皆さんもいろんなgemの公式レファレンスを読んでみてほしい。


####参考記事
公式レファレンス
https://github.com/kaminari/kaminari/blob/master/README.md

kaminariでundefined method `page' for #<Array:0x000xxxxxxと出た
https://haayaaa.hatenablog.com/entry/2019/03/11/215042
rails newするとCould not load command "rails/commands/server/server_command". Error: uninitialized constant URI::Generic.と表示される時の対処法

#####Vagrantを使って環境構築をしている際、エラーに遭遇したので記録を残しておきます。

## 構築環境

Ruby 2.5.0
Ruby on rails 5.1.7
Vagrant 2.2.7
Virtual Box 6.1.4
rbenv 1.1.2

##発生したエラー
```
$ rails new
#省略
[WARNING] Could not load command "rails/commands/server/server_command". Error:
uninitialized constant URI::Generic.
```

##解決した方法
Rubyのバージョンを2.5.7に上げるとこのエラーは解消されました。

```
#バージョン2.5.7のRubyをインストール
$ rbenv install 2.5.7
#省略

#使用する全体のrubyのバージョンを指定
$rbenv global 2.5.7

#Rubyのバージョンを確認
$ruby -v
ruby 2.5.7p206 (2019-10-01 revision 67816) [x86_64-linux]

$rails new
#うまくいきました
```

https://stackoverflow.com/questions/59961343/failing-to-start-up-default-rails-server
この質問を参考にしてバージョンを変えてみたんですが、よく読むと2.5.7でも同じ現象が起こったって書かれてますね...。原因が分かる方は教えていただきたいです。
AtCoder Judge System Update Test Contest 202004 参戦記

# AtCoder Judge System Update Test Contest 202004 参戦記

初の全完で、順位も上位9%という. なんで rated じゃないんですか!(机をバンバン).

## [A - Walking Takahashi](https://atcoder.jp/contests/judge-update-202004/tasks/judge_update_202004_a)

2分で突破. すでに日に当たっている場合は、現在位置が答え. 現在位置がL未満ならLが答え、現在位置がRを超えているのならRが答え.

```python
S, L, R = map(int, input().split())

if L <= S <= R:
    print(S)
elif S < L:
    print(L)
elif S > R:
    print(R)
```

## [B - Picking Balls](https://atcoder.jp/contests/judge-update-202004/tasks/judge_update_202004_b)

6分で突破. R と B に分別して、Rを小さい順に表示した後、Bを小さい順に表示するだけ. 小さい順は当然 sort するだけ.

```python
N = int(input())

R = []
B = []
for _ in range(N):
    X, C = input().split()
    if C == 'R':
        R.append(int(X))
    elif C == 'B':
        B.append(int(X))

R.sort()
B.sort()
if R:
    print('\n'.join(str(r) for r in R))
if B:
    print('\n'.join(str(b) for b in B))
```

## [C - Numbering Blocks](https://atcoder.jp/contests/judge-update-202004/tasks/judge_update_202004_c)

12分で突破. N がせいぜい9なんだから総当りをすればいいだけ. itertools.permutations 愛してる.

```python
from itertools import permutations

a1, a2, a3 = map(int, input().split())
a = [a1, a2, a3]

N = a1 + a2 + a3
result = 0
for p in permutations(range(1, N + 1)):
    X = [p[:a1], p[a1:a1 + a2], p[a1 + a2:]]
    flag = True
    for i in range(3):
        for j in range(1, a[i]):
            if X[i][j] <= X[i][j - 1]:
                flag = False
    for i in range(1, 3):
        for j in range(a[i]):
            if X[i][j] <= X[i - 1][j]:
                flag = False
    if flag:
        result += 1
print(result)
```

## [D - Calculating GCD](https://atcoder.jp/contests/judge-update-202004/tasks/judge_update_202004_d)

23分半で突破. ナイーブにやると *O*(10<sup>10</sup>) で TLE. X を全ての A と GCD を取るのは、全ての A の GCD と X の GCD を取るのと同じ. これで X が 1 にならない場合は *O*(10<sup>5</sup>) になり片付いた. X が 1 になった場合の操作回数だが、A の GCD を順に取っていって変わったところだけが候補になるので、変わったところだけをチェックするようにする. これでどのくらいオーダーが下がるのかは不明だけど、直感的には大きく下がるはずなので、提出したら無事 AC.

```python
from math import gcd

N, Q = map(int, input().split())
A = list(map(int, input().split()))
S = list(map(int, input().split()))

gcd_a = A[0]
a = [(1, A[0])]
for i in range(1, N):
    t = gcd(gcd_a, A[i])
    if t != gcd_a:
        gcd_a = t
        a.append((i + 1, gcd_a))

for i in range(Q):
    X = S[i]
    t = gcd(gcd_a, X)
    if t != 1:
        print(t)
    else:
        for j, g in a:
            if gcd(X, g) != 1:
                continue
            print(j)
            break
```

追記: みんなにぶたんで解いているようなので、にぶたんでも解いてみたw

```python
from math import gcd

N, Q = map(int, input().split())
A = list(map(int, input().split()))
S = list(map(int, input().split()))

for i in range(N - 1):
    A[i + 1] = gcd(A[i + 1], A[i])

for i in range(Q):
    X = S[i]
    t = gcd(A[-1], X)
    if t != 1:
        print(t)
    else:
        ng = -1
        ok = N - 1
        while ok - ng > 1:
            m = (ok + ng) // 2
            if gcd(X, A[m]) == 1:
                ok = m
            else:
                ng = m
        print(ok + 1)
```
【Swift】定数と変数の使い方

## 概要
Swiftの学習中の備忘録です。
基本の基本、変数と定数の使い方についてまとめています。

## 筆者環境
- MacBook Pro (13-inch, 2019)
- macOS Catalina（Version 10.15.4）
- Xcode(Version 11.4) 
- Swift5.2

## 定数 let
定数は定義した初期値を”後から上書きすることがないもの”に使います。
不意にデータの書き換えが行われないように、
基本的には定数を使い、上書きが必要な値のみ変数で定義するのがいいようです。

```swift

let msg: String = "Hello!" 
//String型（データ型）のmsg(定数名)に"Hello!"(初期値)を代入

let msg = "Hello!"
//データ型を省略して書くことも出来る（型推論）
```
上書きしようとするとエラーが出る。

```swift

let msg = "Hello!"
msg = "Good Bye!"

//エラー文
Immutable value 'msg' may only be initialized once
//不変の値である"msg"は一度しか初期化できない（変更できない）。
```

## 変数 var
定数は定義した初期値を”後から変更する可能性のあるもの”に使います。

```swift

var msg: String = "Hello!" 
//String型（データ型）のmsg(定数名)に"Hello!"(初期値)を代入

var msg = "Hello!"
//データ型を省略して書くことも出来る（型推論）
```

定数と違い、上書き出来る。

```swift

var msg = "Hello!"
msg = "Good Bye!"

print(msg)
// Good Bye!
```

## 最後に
以上、簡単ですが定数と変数の使い方についてでした。
学習を進める中で、追加したい内容が出てきたら都度追記していきます。
とある学生がゲーム開発をしてみた#1

![15860905798095799768931741981966.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614245/6675e541-bb42-9757-55d4-13d577b70410.jpeg)
愛用のwindows君です。

はじめまして、Jonahです。
タイトルの通り、これからゲーム開発の様子をちょこちょこ載せようと思ってます。

独学なので、効率のいい悪い点も多々ありますが、暖かい目で見守って頂けると幸いです(*´ `*)

主にUnityで話を進めますね。
ページネーションするときの公式・実装

# ページネーションするときによく使う計算式

検索エンジンの結果や、MySQL等のデータベースから得た値をウェブ等のUI上にページネーション付きで、一覧表示するときに頻繁に使う計算です。もはや公式レベルに頻出しますので、一応まとめたいと思います。

# 変数

- limit: 1ページあたりに表示する件数
- offset: 何件目から表示するか(0から始まる)
- totalCount: 総ヒット件数

# 公式😅

### 現在のページ番号を求める
検索結果の1ページ目、2ページ目....と連番になる中で、今何ページ目にいるかを計算します。

- ``Trunc``は小数点以下切り捨てを示します。
- 事前にlimitが0より大きいことをチェックしないといけません。

```
page = Trunc(offset / limit) + 1
```

### 最大ページ数を求める

ページネーションで最後のページ番号を求める式

- ``Trunc``は小数点以下切り捨てを示します。
- 事前にlimitが0より大きいことをチェックしないといけません。

```
paginationLength = Trunc(totalCount / limit) + 1
```

### 前のページがあるか

```
hasPreviousPage = offset > 0
```

### 次のページがあるか

```
hasNextPage = offset + limit < totalCount
```

### ページ番号からoffsetに変換

```
offset = (page - 1) * limit
```
ASP.NET Core Blazor WebAssembly で構成ファイルを扱う

ドキュメントを軽くあさってみたら Blazor WebAssembly で、既に構成ファイルの扱いまでサポートしているんですね。

[ASP.NET Core Blazor hosting model configuration](https://docs.microsoft.com/en-us/aspnet/core/blazor/hosting-model-configuration?view=aspnetcore-3.1)

ということで試してみました。

Blazor WebAssembly のプロジェクトを作成しておきます。

NuGet のパッケージの管理で Blazor まわりのライブラリが 3.2 の Preview 3 以降であることを確認します。

では、構成ファイルを置いてい置きましょう。Blazor WebAssembly では wwwroot の下に構成ファイルを置くみたいです。こんな感じで。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70288/38f16304-9a6b-372a-fc73-fbce6659a627.png)

それぞれの中身はこのようにしてみました。

```json:appsettings.json
{
  "message":  "Hello from appsettings.json"
}
```

```json:appsettings.Development.json
{
  "envMessage":  "Hello from appsettings.Development.json"
}
```

```json:appsettings.Production.json
{
  "envMessage": "Hello from appsettings.Production.json"
}
```

そして、Program.cs で以下のようにして IConfiguration から適当なクラスにマッピングして DI 出来るように下準備をしてやります。

```csharp:Program.cs
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Text;
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;

namespace BlazorApp3
{
    public class Program
    {
        public static async Task Main(string[] args)
        {
            var builder = WebAssemblyHostBuilder.CreateDefault(args);
            builder.RootComponents.Add<App>("app");

            builder.Services.AddBaseAddressHttpClient();

            // IConfiguration から AppSettings クラスにして DI できるようにしておく
            builder.Services.AddSingleton(p => p.GetRequiredService<IConfiguration>().Get<AppSettings>());

            await builder.Build().RunAsync();
        }

    }

    // appsettings.json の値を入れるよう
    public class AppSettings
    {
        public string Message { get; set; }
        public string EnvMessage { get; set; }
    }
}
```

あとは、普通に DI するなりして使いましょう。こんな感じで

```html:Index.razor
@page "/"
@inject AppSettings _appSettings
<h1>Hello, world!</h1>

Welcome to your new app.

<p>@_appSettings.Message</p>
<p>@_appSettings.EnvMessage</p>
```

因みに、Program.cs で Configure メソッドで DI コンテナに登録して `IOptions<T>` で受けるのは出来ませんでした。Configure をするには、IConfiguration のインスタンスが必要で、それをしようとしたら `builder.Build().Configuration` で取得しないといけないのですが、`builder.Build()` は 2 回やると `appsettings.json` とかを読み込むための Stream を 2 回読むことになっているっぽくて、そこで例外が出てるように見えます。（深追いはしていない

Blazor のアプリを実行してみると、ちゃんと思った通りのメッセージが出ます。開発者ツールで見てみると appsettings.json と appsettings.Development.json を、サーバーから取得していることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70288/47d80495-a67c-64ca-96bc-5931b15d7738.png)

Production の方は、何処かにデプロイされると読み込まれるらしいです。試しに、Azure ストレージアカウントの Blob の静的サイトのホスト機能を使って作ったサイトに置いてみました。発行をして発行先フォルダーの wwwroot フォルダーの下を全部 Blob の $web コンテナーにコピーします。

今度はちゃんと Hello from appsettings.Production.json というメッセージが出てますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70288/4d7d49bc-82a8-f903-c2ed-6952409f28c4.png)



## まとめ

ちゃんと動くね。ということで、ドキュメントにも書かれていますが、このような仕組みなので URL に appsettings.json と打ち込むと生 JSON が手に入っちゃうので、間違っても秘密な情報は書かないように気をつけましょう。
Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | オンライン授業の準備(機材編)

# はじめに

本記事では、Microsoft Teams を活用して授業を実施するための方法を解説いたします。
今回はちょっと息抜きに **「オンライン授業の準備(機材編)」**について説明します。

以下の記事も参照してください。

- [10分でできる Office 365 Education A1 の利用開始手続き](https://qiita.com/hisaho/items/74b6ba9ba9b4f501f74c)
- [10分でできる Office 365 Education のユーザー登録](https://qiita.com/hisaho/items/58e4e4024ee73280ece7)
- [Microsoft Teams | 10分でできる 授業で利用するチームの準備する](https://qiita.com/hisaho/items/2667f3d8979aa92f79c2)
- [Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | 教材の共有](https://qiita.com/hisaho/items/5e365ffb63ca9ab83f6c)
- [Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | 授業日程を登録する](https://qiita.com/hisaho/items/fa57301d79b64ced3568)
- [Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | オンラインで出席を取る] (https://qiita.com/drafts/544b006af2cd4fa58e3e)

# マイク性能が重要

社内会議でも自分の顔を映して会議することはめったにありません。
オンライン授業の場合は資料を映しつつ小窓で教師の顔を映した方がよいといった意見もありますが、「プレゼン資料のみ」と「資料＋ビデオ」では通量に雲泥の差があります。学生たちの通信環境を鑑みるとビデオは使わない方がよい気がします(世の中Webカメラの品薄みたいですね)。

オンライン授業では音声品質は非常に大事です。Microsoft Surface シリーズは、高性能なマイクがついているので、外付けのマイクをつける必要はないと思いますが、場合によってはマイクを付けた方がよいかもしれません。皆さんはどのようなマイクを利用しているのでしょうか？

私が愛用しているものをいくつか紹介したいと思います。

# Jabra SPEAK510
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/861e6cf7-dfb8-c734-8d4b-c5845bee4f28.png)

JABRA はデンマークの会社で、業務用およびBluetoothヘッドセット分野における世界シェアNO.1のヘッドセットメーカーです。Jabra SPEAK510はUSB、Bluetooth でPCやスマートフォンと接続できます。携帯性に優れているので出張先でのテレカンに欠かせないアイテムです。エコーキャンセラー、DSP等搭載していますので雑音のないクリアな音声を届けることができます。

# MARANTZ PRO 放送用コンデンサーUSBマイク Umpire
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/21930442-6715-0fdd-2ba1-263b345baefd.png)

自宅で使っているのがマランツのコンデンサーUSBマイクです。USB接続でPCとつなげることができ、ドライバーも不要です。ポップガードがついていますので、ポップノイズを防ぐことができます。
goで作ったツールインストールするの面倒くさい

## goでツール作ろう

「まくる」と言うほどには作ってないけど。
ところで、go製のツールいっぱいあるけど、管理だるくない？

install は楽ちん。

```
$ go get github.com/foo/bar
```

で、一月ほど経った頃に、 `bar` がアップデートしたらしいことを知る。
さて、なんだっけなと思いながら

```console
$ go get github.com/bar/bar
```

あれ、通らねえやとなる。しょうがないので、調べてああそうだ、fooさんだったこれ、となる。
…ならまだしも、変なツールインストールしちゃったりしたら目も当てられない。

そしてさて、新しい環境作るかな、となるとこれをインストールしたツール分繰り返す。
だるい。

## homebrewっぽくしたい

作った。
https://github.com/kyoh86/gordon

```console
$ gordon install foo/bar
$ which bar
/home/kyoh86/.local/bin/bar
$ gordon update
$ gordon uninstall foo/bar
$ gordon dump GordonDumpFile
$ gordon restore GordonDumpFile
```

あら便利。

## 制限

- GitHub Releasesにアップロードされたアセットしか見てない。
- GitHub Enterpriseへの対応が適当（環境がない）のでバグがありそう。
    - `$ gordon config set github.host hogehoge.com` とか `$ gordon config set github.user foo` とかして使えるはず。
- アセットにはGOOS相当（windowsとか）とGOARCH相当（386とか）を含んでないと駄目。
- バイナリとmanファイルだけインストールする。

適当に作ったので、まだ全然ブラッシュアップできてない。
賛同者の方いらっしゃいましたらContributeお待ちしています。

## もらえたら嬉しいツッコミその他

- GitHub Releasesつかうのだるい
    - → goreleaserを使え。良いぞ。
- Linuxbrew使えば？
    - → はい。
手軽でおしゃれな開発環境

#概要
個人的な開発環境のまとめです。
少し多機能な開発環境にしたい。
でも、手軽にすぐ使えるようなものがいい。
そんな人向けです。

#環境
- ubuntu 18.04 

#完成図
最終的にこんな感じの画面になります。
左にエディタ、右にターミナルというレイアウトになっています。
ターミナルは上下2つに分割しています。
![6d8ukWmIZId8q5J1586080328_1586080390.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192626/aa274281-992f-b45a-74e6-63f71c6b6505.png)

#エディタ
vscodeを使っています。
intellisenseについて、候補の表示と選択のショートカットをカスタマイズしておくと、
使いやすくなるのでおすすめです。

- [VSCodeのキーボードショートカットのオススメ設定例](https://qiita.com/noanoa07/items/0e22d7115a35498e0e08)
- [ubuntuでCtrl＋Spaceを無効化](https://qiita.com/tanaka009/items/4a91cf0fa930c65bd79e)
- https://qiita.com/keitean/items/04727aeb673d1822107e
- https://routecompass.net/vscode/

##Dracula Official
見やすくてかっこいいので Dracula theme で統一しています。

https://draculatheme.com/visual-studio-code

##vim
vscode で vim のような操作が出来ます。
完全に会得できればとんでもない速度で作業できるのではないかと思い修行中です。

#ターミナル
##terminator
画面分割のため terminator を使ってます。
terminator は難しい操作を覚えなくても使え、手軽です。
右画面にターミナルを開き、上下に分割した状態でレイアウトを保存しておきます。
起動したときに保存したレイアウトのまま開けます。

####ショートカット
`Ctrl + Shift + N`　→ ターミナル間の移動
`Ctrl + Shift + O`　→ ターミナルを上下に分割する。

##Dracula theme
Dracula theme にします。
これに加え、筆者はターミナルタイトルバーの色を、
アクティブなときはピンク、アクティブでないときは背景と同じ色になるように設定しています。

https://github.com/OmarElebiary/terminator-dracula

####カラーコード
Background `#282a36`
Pink `#ff79c6 `

https://github.com/dracula/dracula-theme


#シェル
#fish
fishを使っています。
fishのインストールについての説明は他に分かりやすい記事が沢山あるのでここでは省略します。

インストールしたら、`.bashrc`に以下の一文を追記します。
`.bashrc`はbashを起動するときに読み込まれるファイルです。

fishをデフォルトのシェルにすると環境によっては動作がおかしくなるようなので、
bashを開いてからfishを起動するという動作をするようにします。

```bash:.bashrc
fish
```

#実際の作業の例
1. `Ctrl + Alt + T`　→ ターミナルが開く(画面の右半分にfishが起動した状態で上下に分割されて)
2. `$ cd ディレクトリ名` → 任意のディレクトリに移動
3. `$ code ファイル名` → ファイルをvscodeで開く
4. (コードを書き始める)
5. `Alt + Tab` → ターミナルに移動
6. `Ctrl + Shift + N` → 下側のターミナルに移動
7. (試したいコードの検証をする)
8. `Alt + Tab` →　vscodeに戻る

といった具合に、キーボードから手を離さずに作業できます。
EC2について


#EC2とは

インスタンス単位で任意のAZにインスタンスを立ち上げてサーバーとして利用できるサービス

#特長
・柔軟性が高い(短時間で使いたいサーバーを立てることができる)
・世界中のリージョンから選択できる
・セキュリティグループでトラフィックの制御できる
・AMIを使うことで同じサーバーをいくつも起動できる

#インスタンス作成の流れ
1. OSイメージの選択
2. インスタンスタイプの選択
3. ストレージの選択
4. セキュリティグループの設定
5. SSHキーペアの選択

###OSイメージの選択

以下のOSから選択可能
・AMI(AWSが提供)
・Windows
・Mac
・Linux
・カスタムAMI(自作)

※データはS3内に保存される

###インスタンスタイプの選択

<img width="1409" alt="スクリーンショット 2020-04-05 19.40.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272157/85dbadd9-31a0-dbe3-e1d6-d37bca7b6641.png">

タイプの項目のt2,t3はファミリー(種類)と世代(バージョン)とを表しており、後半は大きさを表す。
下に行けば行くほどスペックが良いがその分値段も上がるので用途に適したタイプを選択することが大切

また、インスタンスの細かい設定もできる。
インスタンスの詳細設定の項目で重要度が高いであろう設定項目は以下である。

・ネットワークとサブネット(VPCとの紐付け)
<img width="743" alt="スクリーンショット 2020-04-05 19.50.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272157/c4be7c25-2c2e-b41c-9b96-1c522ee4a527.png">

※VPCのについては別途記事書きます

<img width="472" alt="スクリーンショット 2020-04-05 20.00.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272157/2d792b92-60ee-c7ac-3875-091acb913a66.png">
・終了保護の有効化
　→本番環境で誤ってインスタンスを終了させないため
・モニタリング
　→CloudWatchのモニタリングを有効にすることによってインスタンスの状況を可視可できる

・AMIの設定
<img width="852" alt="スクリーンショット 2020-04-05 20.04.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272157/dfccba86-69c7-f2f9-845e-d9a5fb67157e.png">
頻繁に使用するコマンドまたは各インスタンスに共通のソフト(Apache等)を入れたい時に
AMIを設定することによってインスタンスを立ち上げた際に設定したコマンドを実行してくれる。
※別途記事作成予定

###ストレージの選択
<img width="289" alt="スクリーンショット 2020-04-05 20.09.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272157/77a61723-4d4f-a40b-b9fe-3d19f626fbc5.png">

ストレージの種類と容量を選択できる
種類には画像の3パターンある
・汎用SSD(gp2)
　→小〜中規模のDB。仮想デスクトップ等

・プロビジョンド IOPS SSD(io1)
　→高いI/O性能を必要とするもの。大規模DB等

・マグネティック(standard)
　→旧世代ボリューム。基本は使用しない

###セキュリティグループの設定
<img width="1427" alt="スクリーンショット 2020-04-05 20.13.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272157/25158f9d-4a71-c417-d48d-e0d08cac08f9.png">

初期表示ではSSH接続が許可されており、SSHでログインするにはキーペアが必要になる
また、特定の通信を許可したい場合はセキュリティグループに接続方法とIPアドレスの範囲を指定したルールを追加する

###SSHキーペアの選択
<img width="705" alt="スクリーンショット 2020-04-05 20.21.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272157/6077b4ff-3d07-286c-c025-84e615847681.png">
インスタンスの接続に必要になるキーペアを設定する
無くさないようにしっかり管理することが大切

※インスタンスのログイン・SSHのBASHコマンド操作については別途記事作成予定

#関連サービスリンク
・VPC
・データベース各種
・CloudWatch
・AutoScalling
・セキュリティグループ

などなど
いろんな空白文字を削除する【Python】

#概要
半角スペース、全角スペースを始めとする色んな種類のスペースをまとめて削除する方法をまとめます。
#環境
macOS Catalina バージョン10.15.4
python 3.8.0
#コード
##改行コード、タブ、スペースなどをまとめて削除
`str.split()`を使う

```Python
#\u3000は全角スペース
text = "a\u3000 b\t\nc\r\n"
text = ''.join(text.split())
```
##改行コード（\r\nや\n）だけをまとめて削除
`str.splitlines()`を使う

```Python
text = "a\u3000 b\t\nc\r\n"
text = ''.join(text.splitlines())
```
##いくつかのスペース（例えば全角スペース、半角スペース、タブ）をまとめて削除
`str.translate()`を使う

```Python
text = "a\u3000 b\t\nc\r\n"
table = str.maketrans({
  '\u3000': '',
  ' ': '',
  '\t': ''
})
text = text.translate(table)
```
他にもたくさん削除したい文字がある場合は、`str.maketrans()`の引数を内包型表記で書くと楽です。

```Python
text = "a\u3000 b\t\nc\r\nd\x0ce\x0bf"
table = str.maketrans({
    v: '' for v in '\u3000 \x0c\x0b\t' #もしくは['\u3000',' ','\x0c','\x0b','\t']
})
text = text.translate(table)
```
#補足：正規表現の利用
コメントで正規表現を使う方法について、アドバイスいただきましたので、以下にまとめさせていただきます。コメントありがとうございます。

```Python
import re

#改行、タブ、スペースなどをまとめて削除
text = "a\u3000\n\n b\t\nc\r\nd\x0ce\x0b\rf\r\n"
text = re.sub(r"\s", "", text)

#改行コード（\r\nや\n）だけをまとめて削除
text = "a\u3000\n\n b\t\nc\r\nd\x0ce\x0b\rf\r\n"
text = re.sub(r"[\r\n]", "", text)

#いくつかのスペース（例えば全角スペース、半角スペース、タブ）をまとめて削除
text = "a\u3000\n\n b\t\nc\r\nd\x0ce\x0b\rf\r\n"
text = re.sub(r"[\u3000 \t]", "", text)
```

#参考
1. [スペースは" "だけじゃない的な話](http://anti.rosx.net/etc/memo/002_space.html)
2. [yohhoyの日記 - 空白文字を一括削除](https://yohhoy.hatenadiary.jp/entry/20160821/p1)
3. [Pythonで改行を含む文字列の出力、連結、分割、削除、置換](https://note.nkmk.me/python-string-line-break/)
Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | オンラインで出席を取る

# はじめに

本記事では、Microsoft Teams を活用して授業を実施するための方法を解説いたします。
今回は **「オンラインで出席を取る」**について説明します。

以下の記事も参照してください。

- [10分でできる Office 365 Education A1 の利用開始手続き](https://qiita.com/hisaho/items/74b6ba9ba9b4f501f74c)
- [10分でできる Office 365 Education のユーザー登録](https://qiita.com/hisaho/items/58e4e4024ee73280ece7)
- [Microsoft Teams | 10分でできる 授業で利用するチームの準備する](https://qiita.com/hisaho/items/2667f3d8979aa92f79c2)
- [Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | 教材の共有](https://qiita.com/hisaho/items/5e365ffb63ca9ab83f6c)
- [Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | 授業日程を登録する](https://qiita.com/hisaho/items/fa57301d79b64ced3568)

# Microsoft Forms を使って出欠席を取る

Microsoft Forms を使ってオンラインで出欠を取る方法に関して説明します。

- Web ブラウザで[https://forms.microsoft.com/](https://forms.microsoft.com/) にアクセスします。
- **[新しいフォーム]** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/93678de3-ae0c-8aa0-52ba-0dc9f15abedd.png)
- **「タイトル」**に開講日と授業名を入れます。
- **「質問」**に「これからいう番号を入れてください。」と入力します。
- **[必須]**をONにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/6e993db5-a073-0b8d-4f82-f09f99297fdb.png)
- **[共有]**をクリックし、**[自分の所属組織内のユーザーのみが回答可能に]**を選択し、URLの**[コピー]**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/5e84248e-eaf2-3d6f-438a-09971170464d.png)
-授業のTeamsに入り、**[会話]**のアイコンをクリックします。右側に**[会議チャット]**が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/03c65348-851f-2259-287a-41bf5db583fe.png)
- FORMSでコピーしたURLをペーストし、送信アイコンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/b107aee0-e48d-5ce9-3dc3-1f88b92586f3.png)
- 学生のTeamsの会議チャットにURLが送信されます(学生は画面右上に学と表示されています)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/eb5ca993-fcba-14fe-698d-caa37fa62a9d.png)
- 学生がこのURLをクリックするとFORMSが開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/1110c6c2-93b4-bae9-7b9f-2d85f91832e5.png)
- 先生は、Teams内で**「15」**を入力してくださいと指示します。
- 学生は、**「15」**を入力し、**[送信]**をクリックします。
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/0fb59451-959f-7fac-f5be-afcb76322a74.png)
- 学生の画面では、**[回答が送信されました]**と表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/ea14d228-a1d2-a6ee-b3f4-098aad949077.png)
- 先生のFORMSの画面で**[回答]**をクリックすると回答されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/c15fcbe9-21c4-87aa-2aed-9f838859cc90.png)
- **[Excelで開く]**をクリックすると、Excelファイルがダウンロードされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/62b352e7-a52e-72e0-a7c9-850dad18b4b6.png)
- Excel ファイルには、回答者のメールアドレス、開始時間、完了時間、回答が入力されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/b6f046b3-dbaa-631a-cece-9a5c03fe7ca6.png)
- 回答と回答時間を加味し、授業に出席していることとします。
[Python] Headless Chrome を AWS Lambda で動かす

記事の内容はこちらを参照してください。
https://mishimay.github.io/afd7f247f101fbe25f30/
<!--


1. serverless-chromeをダウンロードして解凍
    - 以下の `chromium 64.0.3282.167` で動作確認した
    - https://github.com/adieuadieu/serverless-chrome/releases/tag/v1.0.0-37
1. chromedriverをダウンロードして解凍
    - 以下の `chromedriver_linux64.zip` で動作確認した
    - https://chromedriver.storage.googleapis.com/index.html?path=2.37/

1. 実行権限付与
    - `chmod 777 <ダウンロードしたファイル>`
1. `chrome` フォルダにダウンロードしたファイルを入れて、zipに固める
1. Lambdaレイヤーにzipをアップロード
1. Lambdaレイヤーにseleniumをアップロード
    - 以下を参考のこと
    - https://qiita.com/mishimay/items/e107b685381cca0493bf
1. Lambda関数に上記2つのレイヤーを追加
1. 以下のようなコードで実行できる

```python
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

def lambda_handler(event, context):
    options = Options()
    options.binary_location = '/opt/chrome/headless-chromium'
    options.add_argument('--headless')
    options.add_argument('--no-sandbox')
    options.add_argument('--single-process')
    options.add_argument('--disable-dev-shm-usage')

    browser = webdriver.Chrome('/opt/chrome/chromedriver', chrome_options=options)
    browser.get('https://www.google.com')
    title = browser.title
    browser.close()
    browser.quit()

    return {"title": title}
```


## 参考
https://blog.ikedaosushi.com/entry/2018/12/22/231421
https://qiita.com/nabehide/items/754eb7b7e9fff9a1047d

## 環境
 
macOS 10.15.4
Python 3.7.7


-->
GitLabを使用したCIの構築とSlackとの連携

# CI環境の構築
少し遅くなりましたが、アプリのCI環境がある程度整ったのでまとめます。
前回までで作成したUnit,Widget,Integrationのテストコードを`.gitlab-ci.yaml`に記載することで、gitにpushしたときやMergeした時にテストが動くように設定します。

```.gitlab-ci.yaml
image: openjdk:8-jdk

variables:
  ANDROID_COMPILE_SDK: "28"
  ANDROID_BUILD_TOOLS: "28.0.2"
  ANDROID_SDK_TOOLS: "4333796"


stages:
  - build
  - test
  - deploy


UnitTests:
  stage: build
  script:
    - pwd
    - ./unit_test.sh
  tags:
    - mac-ci-runner

WidgetTests:
  stage: test
  script:
    - ./widget_test.sh
  tags:
    - mac-ci-runner

IntegrationTests:
  stage: deploy
  script:
    - ./test.sh
  tags:
    - mac-ci-runner

```

この時、`.gitlab-ci.yaml`を実行するRunnerを実行しないと、実行した際に`flutter : command not found`となってしまうため、RunnerをflutterコマンドがインストールされているMac上に構築する必要があります。
その方法は、[GitLab CI RunnerをMac上に構築する
](https://qiita.com/takamii228/items/64fd6879e6acce845980)の記事をご参照ください。

以上の設定を完了するとCICD > Pipelines　では以下のようになり、テストが実行されていることが分かります。
（本当はPush,Merge,tag pushの時などで実行するテストを分けたかったのですが、それは次回取り込みます）

<img width="692" alt="スクリーンショット 2020-04-05 19.59.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555381/f37a10b5-41d0-6920-9ef9-431b865b0cb1.png">


# テストの結果をSlackに通知させる
次にGitlabとSlackの連携を行います
## Slack側の設定
1. [Slack API](https://api.slack.com/)にアクセスし、**Messaging**のIncoming Webhooksを選択。
<img width="957" alt="スクリーンショット 2020-04-05 20.03.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555381/27706c7d-0d33-cf38-0a60-95f6eb817fe5.png">

2. **Create your Slack app** に遷移し、`アプリ名`を設定し、`通知させたいチャンネル名`を選択する
(まだSlackのアプリなどでワークスペースを作成していない場合は、この段階で作成しておく)
<img width="648" alt="スクリーンショット 2020-04-05 20.05.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555381/546b427e-2568-891b-0f09-b24d8211bb69.png">

3. 作成が完了すると該当のアプリの画面に遷移するので、**Activate Incoming Webhooks**を**ON**に設定し、**Webhook URL**をコピーしておく。ここでSlack側の設定は完了
<img width="637" alt="スクリーンショット 2020-04-05 20.10.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555381/80e4b3f5-6435-400c-a7a0-d50adda573bf.png">

## GitLab側の設定
1. 対象のプロジェクトの**Settings**の**Integrations**に遷移する。
2. 遷移先のページの**Slack notifications**に遷移する。
3. ページ内で通知の対象としたい契機を選択する。
4. **Test settings and save changes**を選択すると無事設定完了です。この段階で前項で設定したSlackのチャンネルに通知が行きます。

<img width="830" alt="スクリーンショット 2020-04-05 20.14.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555381/52a2eee1-4bbe-fa4b-c227-a13fcd1e5f3f.png">

# まとめ
以上でアプリのCI設定が完了しました。
テストが失敗した際も通知が行くので、テスト実行に時間がかかって、他の作業に取り掛かっている時などは便利ですね。
自分が参画しているプロジェクトのクオリティにはまだまだ届きませんが、一連の流れは一旦理解できたかと...
次はCD環境の構築を行います。
ASP 例題２ コイン問題２

# 問題
以下のユーロ硬貨を持っているとする(総和は148セントになる)。
20セント硬貨 4枚
10セント硬貨 4枚
5セント硬貨 4枚
2セント硬貨 4枚
合計がちょうど93セントになる組合せはあるだろうか?
各3枚の場合はどうか？

# 回答
```Prolog:example2.lp
num(4).
{coin_2cent(1..X)}=1:- num(X).
{coin_5cent(1..X)}=1:- num(X).
{coin_10yen(1..X)}=1:- num(X).
{coin_20yen(1..X)}=1:- num(X).

:- not 93 = 2*A + 5*B + 10*C + 20*D, coin_2cent(A), coin_5cent(B), coin_10yen(C), coin_20yen(D).
```
## 解説
`num(4)`で各コインの枚数を指定する。
`{coin_2cent(1..X)}=1:- num(X).`は
`{coin_2cent(1..4)}=1:- num(4).`となり、2セント硬貨は1～4枚のいずれか使用する、という解釈になる。

# 参考
[Coprisによる制約プログラミング入門](http://bach.istc.kobe-u.ac.jp/copris/docs/intro-ja.html)
https://potassco.org/

# 他の問題
[ASP個人的ポータル](https://qiita.com/Ganesha/items/b443046a26826fc97dae)
flutter run で起きたエラー（No supported devices connected.）

#はじめに
作成したアプリを実行するためにターミナルにて以下を実行したところ、
エラーが発生したので原因を解説します。

```
flutter run
```

#エラー内容
エラー内容としてはこちらになります。

```
A new version of Flutter is available!
To update to the latest version, run "flutter upgrade".
No supported devices connected.
```

実際のターミナル画面では以下のように表示されています。
<img width="569" alt="スクリーンショット 2020-04-05 19.51.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578233/00058938-cd04-85b7-2bd4-07587dc7df87.png">

#エラーの原因
#### 1.結論
結論から申し上げますと、
**Flutterの最新バージョンにアップデートが必要**ということです。

#### 2.解説
では以下解説していきます。
まずエラー文に何が書いてあるのか翻訳してみましょう。

`A new version of Flutter is available!`
Flutterの新しいバージョンが利用可能です！

`To update to the latest version, run "flutter upgrade".`
最新バージョンに更新するには、「flutter upgrade」を実行してください。

`No supported devices connected.`
サポートされているデバイスが接続されていません。

となります。
翻訳そのままですね。
エラー文2行目の**flutter upgrade**をターミナルにて実行しましょう。

```
flutter upgrade
```

するとアップグレードが始まり、最後に以下が表示されます。
<img width="579" alt="スクリーンショット 2020-04-05 20.10.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578233/34bd8c97-fa49-2da6-3e3a-5a855042a853.png">

確認ができたら、もう一度**flutter run**を実行すると無事にアプリが起動します。

```
flutter run
```

#最後に
解説は以上となります。
最後までご覧くださりありがとうございました。
[vue]テーブル内のチェックボックスをまとめてチェックする

codepenを使ってみたかったので備忘がてら投稿

<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="html,result" data-user="shota-yamane" data-slug-hash="WNvqOMw" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="マトリクス内のチェックボックスをまとめてチェックする">
  <span>See the Pen <a href="https://codepen.io/shota-yamane/pen/WNvqOMw">
  マトリクス内のチェックボックスをまとめてチェックする</a> by shotanekoneko (<a href="https://codepen.io/shota-yamane">@shota-yamane</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

tdタグ内のチェックボックスがチェックされたときに
thタグ内のON/OFFに対応してないので
ごまかしでボタンに置き換えるか or そこの処理は新しく実装が必要・・・
PycharmでAWS CLIのプロファイルを切り替える

## 概要
Pycharm + AWS Toolkitで開発をしている時に、別アカウントの環境(CLIでプロファイル設定済み)に切り替えたいことがありました。ソースに変更を加えずに環境を切り替えたかったのですが、環境変数を設定するやり方が楽だったので紹介します。

## 方法
Edit Configurations > Environment variables から設定します。
日本語化してる人は、「構成の編集 > 環境変数」です。
<img width="259" alt="スクリーンショット 2020-04-05 19.53.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451175/6b799252-91fe-bfba-3e6e-797c51189381.png">


設定する環境変数は以下の2つです。それぞれに利用したいプロファイル名を設定します。

```
AWS_DEFAULT_PROFILE
AWS_PROFILE
```

(例)user01というプロファイル名を使う場合
<img width="493" alt="スクリーンショット 2020-04-05 19.41.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451175/2d32dd03-6ffc-b242-f7f9-6c54d9c62644.png">


これで、ソースの実行時に環境変数で設定したプロファイルが利用されます。

## 余談
Pycharmの画面右下にプロファイルが表示されていますが、これをクリックして変更しただけだと切り替わらない？もよう...
これだけで切り替わるとさらに楽になるのですが...
<img width="296" alt="スクリーンショット 2020-04-05 20.02.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451175/aa4a996c-0dc8-8952-3656-4a7d1b124d08.png">
IBM i (旧AS400）の自己学習メモ０５　IBM i Access Client SolutionsをMacにインストール

# 自己学習メモインデックス

[IBM i (旧AS400）の自己学習メモ　インデックス](https://qiita.com/You_name_is_YU/items/3964849e7803c8eaf767)

# 概要

`Mocha TN5250 Lite`だとコードページの1399が選択肢に出てこず、日本語データを扱うような環境としては不十分だと感じたので、ACS（IBM i Access Client Solutions）の環境を用意したいと思います。

## Javaのインストール

ACSを利用するために、Java SE 8u241をインストールします。
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html

Terminalから`java -version`を実行して以下のようになっていれば準備OK

```shell
$ java -version
java version "1.8.0_241"
Java(TM) SE Runtime Environment (build 1.8.0_241-b07)
Java HotSpot(TM) 64-Bit Server VM (build 25.241-b07, mixed mode)
```

## ACSのインストール

ACSのダウンロードページから、ACSをダウンロードします。
https://www.ibm.com/services/forms/preLogin.do?source=swg-ia
<img width="1066" alt="スクリーンショット 2020-03-22 16.49.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/f7b6b825-8054-9118-b11e-2c9d50011d6d.png">

ダウンロードしたzipを解凍し、IBMiAccess_v1r1 -> Mac_Application -> install_acs を実行する。

<img width="882" alt="スクリーンショット 2020-03-22 16.51.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/cdb1908f-0a1d-6e2d-e591-5e7e331957c7.png">

開発元が不明のためこのままではインストールできないよ。という警告がMacではよく出るが、
そんな時はシステム環境設定 -> セキュリティとプライバシーから、「このまま開く」を押下する。

<img width="780" alt="スクリーンショット 2020-03-22 16.53.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/821d4baa-3482-8609-63dc-e4373f8307a3.png">

なんか色々インストールしますか？ Yes or Noと聞かれるが、とりあえず全部Yesでインストール。

## ACSの設定→フリーのIBM i開発環境へ接続

ACSを起動する。

<img width="792" alt="スクリーンショット 2020-03-22 16.57.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/817a4729-e9dc-14d5-a24c-c5c2831e737a.png">

一番下までスクロールして「はい」を押下。

<img width="664" alt="スクリーンショット 2020-03-22 16.58.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/32dad54c-5ada-efa9-b57e-04f76020312a.png">

ACSが起動する。
左ペインから[管理]->[5250セッション管理機能]を選択。

<img width="1099" alt="スクリーンショット 2020-03-22 17.00.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/1259964b-1ce3-4f39-7081-9778f2b93c47.png">

新規ディスプレイ・セッションボタンを押下。

<img width="697" alt="スクリーンショット 2020-03-22 17.01.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/38754fc4-b5cc-8ce4-6244-0c8dde2a0d9f.png">

以下の画面イメージを参考に設定する。
今回は1399を利用したかったため、コードページを1399に設定。
設定が完了したらOKボタンを押下。

<img width="954" alt="スクリーンショット 2020-03-22 17.06.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/3b576d65-7f26-2f97-1831-df83cc8b2a8a.png">
ログイン画面が表示されるのでIDとパスワードを入力してOKボタンを押下。

<img width="979" alt="スクリーンショット 2020-03-22 17.11.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/38dbc042-8b55-dd2d-2e62-0b989df80dff.png">
PUB400.comで作成したフリーのIBM i環境へ接続できた。
<img width="1088" alt="スクリーンショット 2020-03-22 17.12.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/0efb2df2-824a-f6da-d4a6-b26bd934b89a.png">
Linux でカーソルを自分で選んだ写真にする

もともとあるカーソルテーマを少しいじる。
~/.icons とかにカーソルテーマがインストールされてると思う。
~/.icons/"カーソルテーマ"/cursors/ 内にあるのが各種カーソルファイル。ファイルの形式は X11 カーソルファイル。
これらカーソルファイルを自分の好きなカーソルファイルに置き換えればいい。
ちなみに一番一般的な左上向いた矢印は left_ptr ファイルである。
【Azure】AZ-900を受けた

# はじめに
つい先日、AZ-900 Microsoft Azure Fundamentalsを受けました。
試験が始まってから1年弱経っていて、合格体験記を残されている方も結構いらっしゃいますが、自分も残しておきます。

# 試験概要
Azure関連の試験の中で一番初歩的な試験。AWSだと「クラウドプラクティショナー」のレベルらしい。
内容はクラウドの概念・Azureのコアサービス・Azureの料金体系に関するもの。

  * 問題数：**42問**
  * 時間：60分
  * 合格点：700/1000点
  * 料金：13750円
 
自分が今までに受けた人の合格体験記を見た限りでは、問題数は**44問**と書かれている方がほとんどだったので、当日「えっ？」と思いました。時間と合格点は同じでした。最近形式が少し変わったのでしょうか。<del>料金も少し前より高いような・・・</del>

# 自分の知識レベル
「クラウド」については、授業で軽くやったことあるな～という程度。
「Azure」については、触り始めて2か月くらい。portalとVScodeを使ってちょくちょくAzure Machine LeaningやAzure Functionsあたりをいじっていた程度です。
技術系の資格として他に持っているのは応用情報技術者。ネットワーク関連も用語は一応知ってるくらいで、経験値はない。

# 勉強したこと
先輩に「こんなのあるよ」と言われたのがAzureをいじり始めてすぐくらいで、そのころは「いつか受けるか」程度にしか思っていませんでした。
合格体験記を読んでていつでも受けられることを知り、問題集が発売されたと聞いて少し読んでみたらいけそうだったので、「じゃあ受けるか」と思って受けました。この試験のために勉強したのは2週間くらいでしょうか。

### 参考書
一番まともにやったのが、3月に発売されたばかりの『[合格対策 Microsoft認定 AZ-900:Microsoft Azure Fundamentalsテキスト&問題集](https://www.amazon.co.jp/%E5%90%88%E6%A0%BC%E5%AF%BE%E7%AD%96-Microsoft%E8%AA%8D%E5%AE%9A-AZ-900-Microsoft-Fundamentals%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88/dp/4865942319)』という本。
発売されてすぐ買って、試験を受けるまでに2周か3周読んで章末問題をやりました。
この本を読んでるだけで、試験に必要な知識は身につくと思います。説明が簡潔で読みやすいのでおすすめです。

### Azureの基礎
Microsoft公式の[Azureの基礎](https://docs.microsoft.com/ja-jp/learn/paths/azure-fundamentals/)という公式ラーニングパスです。
多くの方が勉強に使われていますが、自分は最初の概念説明のセクションを1回読んだだけです。全部で(公式だと)10時間くらいで、文字量が多くて読んでも頭に入りづからったので、最初のセクションだけでやめてしまいました。
Azureにほとんど触れたことがない・クラウド自体もほぼ知らない、という人でもわかるように書かれている印象でした。

# 申し込み
[このページ](https://docs.microsoft.com/ja-jp/learn/certifications/exams/az-900)の『Pearson VUEでスケジュール』から申し込みます。
学生は『Certiportでスケジュール』からやってくれと書かれていますが、そちらだと周りにテストセンターがどこにも出てこなかったのでできませんでした。
個人情報を入力して、試験場所で『ローカルテストセンター』を選択すると最寄のテストセンターを探せます。センターを選択したら、空き日程を選択してクレカを登録すれば予約完了です。
直近でもほぼ毎日どこかの時間が空いていました。

終わったらMicrosoftアカウントに登録したメールアドレスにメールが来ます。

# 当日
メールで試験開始15分前までに着くよう指示されます。
会場についたら身分証を2点（両方署名入り、片方は写真入り）提示し、顔写真を撮って荷物を預けて別室に入ります。
受験スタイルは就活のいわゆる"テストセンター"とほぼ同じです。

最初の方の問題以外は、チェック欄にチェックしておけば見直しできます。
問題集で解いていた問題と結構違う問題が出てきて、判断に迷うことも結構ありました(応用情報みたいに、過去問とほぼ一緒だから即答、ということはあまりなかった)。

25分くらいで終わりました。その場で結果が通知されてスコアレポートがもらえます。805点で合格でした。

そのあとメールが来て、添付のリンクから資格の証明書などがDLできます。

# 感想
基礎知識といっても、実際に使っていると自然に得られる知識がほとんどなので、普段使っている人なら苦労せずにとれるのではないかと思います。

ただ、いかんせん資格自体についての情報量がかなり少ないと思います。本屋に行っても、Azureの使い方を記した本などは売っていても、問題集・参考書はほぼありません。このあたりはAWS系の資格と比べると勉強しづらい点ではないかと思います。

機会があればぜひ上位資格も取ってみたいです。
SVDで直行行列を掛けて次元削減できるのは何でなんだろう？

# 目的
SVDで次元削減する時に最後行列掛けてるんだけど、あれって何で？ていうのを調べたけど分からなかったので、どこまで行きついたのかを記録しておく。いつか分かってこの記事を完成させよう。という訳で半分自分用めもです。

# 参考にした記事
+ [PCAとSVDの関連について](https://qiita.com/horiem/items/71380db4b659fb9307b4#pca-%E3%81%AE%E6%95%B0%E5%AD%A6%E7%9A%84%E8%A1%A8%E7%8F%BE)
+ [【技術解説】潜在意味解析(LSA) ～特異値分解(SVD)から文書検索まで～](https://mieruca-ai.com/ai/lsa-lsi-svd/)
+ [主成分分析と固有値問題](https://blog.aidemy.net/entry/2017/10/19/222941)
+ [特異値分解とLSIの意味](https://abicky.net/2010/09/05/131612/)

# 分かっていること
+ PCAで最後に行列をかけるが、なぜそれがいいのか
+ SVDの証明
+ 何となくの意味（潜在的な意味空間に写像する、だいたいPCAと一緒、etc）

# 分からないこと
+ なぜX=SΣVとなった時のVを使うのか？？
GitHub の「Fork」ボタンを「パクる」に置き換える UserScript

```javascript
// ==UserScript==
// @name         Replace Fork with パクる for GitHub
// @namespace    https://foooomio.net/
// @version      0.1
// @description  だから、そういうことじゃなくて💦
// @author       foooomio
// @license      MIT License
// @match        https://github.com/*
// @run-at       document-idle
// @grant        none
// ==/UserScript==

// 元ネタ: https://twitter.com/IiToshihide/status/1246487047545556992

(() => {
  'use strict';

  const $ = document.querySelector.bind(document);

  function main() {
    $('.pagehead-actions .octicon-repo-forked').nextSibling.textContent = 'パクる';
  }

  new MutationObserver(main).observe(
    $('#js-repo-pjax-container'),
    { childList: true }
  );

  main();
})();
```
PHPStorm2019.3でCode FormatterのPrettierを使えるようにする

# はじめに

[公式サイトのヘルプ](https://pleiades.io/help/phpstorm/prettier.html)に解説があるのですが、行間が読み取れない部分や、Windowsのyarnの場合だとパスがわからなくて困ったので備忘録として作りました。

また、このドキュメントでは、prettierはGlobalでインストールを行います。プロジェクト個別にインストールをされる方は、このドキュメントでは説明していないので、公式サイトのヘルプを参考に設定を行ってください。

# 準備
1. [node.js](https://nodejs.org/ja/)をインストールする
2. [yarn](https://classic.yarnpkg.com/ja/)をインストールする
3. PHPStormのプラグインで「Prettier」をインストールする
![2020-04-05_18h59_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133291/22d794d4-bcc7-f649-1876-141c7d2b8469.png)

# Prettierをインストールする

1. PHPStormのターミナルまたは、Windowsのcmdを起動する
1. `yarn global add prettier`でインストールする
![2020-04-05_19h29_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133291/a9fbe0b4-75dc-6f15-57fa-eff929ef5706.png)

# PHPStormにPrettierを設定する。

1. ファイル → 設定をクリックして、設定ダイアログを表示します。
2. 設定ダイアログの左上のサーチボックスに`prettier`と入力します(①)。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133291/99ac6fd3-0f14-0382-adeb-3621bbbf533b.png)
3. 「言語＆フレームワーク」→「JavaScript」→「Prettier」をクリックします(②)
4. `Nodeインタープリター`は、PHPStormが自動検知して入っていると思いますが、未検知の場合は、ご自分で設定を行ってください(③)。たぶん、`"C:\Program Files\nodejs\node.exe"`にあると思います。
5. `Prettier　パッケージ`として、`C:\Users\<ユーザ名>\AppData\Local\Yarn\Data\global\node_modules\prettier`を設定します。ここがわからなくてnpmでもprettierを入れてしまいましたTT
6. 最後に`OKボタン`をクリックして設定を保存します。

# Prettierで再フォーマットする

`ctrl+shift+A`で検索ダイアログをだして、`アクション`から`Prettierで再フォーマット`を選択するとフォーマットされます。

私の環境ですと`Ctrl + Alt + Shift + P`に割り当てられているので、こちらでも実行できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133291/09ce01fb-452c-edd6-5a84-6e6ac0452268.png)

# Prettierコードスタイルルールを適用するには?

プロジェクトに`.prettierr`を作成して、以下のようなコードスタイルルールを記述します。

```yaml
{
  "trailingComma": "es5",
  "tabWidth": 4,
  "semi": false,
  "singleQuote": true
}
```

このファイルを作成後、package.jsonを開いたら、公式ヘルプにもある通り、適用するかどうかがと確認が出てきます。

![2020-04-05_19h22_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133291/d31d3000-c3ae-0294-85d9-e9786a05ffa3.png)

# 保存時にPrettierが実行されるようにする。

こちらの記事を参考に設定を行ってください。
[WebStormで自動保存時にPrettierを実行するようにしたら、キレイなコーディングがとても捗る。](https://qiita.com/suin/items/7953a1460e9721bab83d)


# 参考URL

* [PHPStormでCode FormatterのPrettierを使えるようにする](https://qiita.com/HirotoIchinose/items/35ab4b19adae3e7fa8ef)
*[WebStormで自動保存時にPrettierを実行するようにしたら、キレイなコーディングがとても捗る。](https://qiita.com/suin/items/7953a1460e9721bab83d)
【Swift】ターミナルでバージョン確認

## 概要
Swiftの勉強をはじめました。
当たり前のことですが、自分が扱うSwiftのバージョンを把握しておかないと学習も進まない訳で…
という訳で、ここではターミナルを使ったバージョン確認の方法を備忘録としてまとめています。

## 筆者環境
- MacBook Pro (13-inch, 2019)
- macOS Catalina（Version 10.15.4）
- Xcode(Version 11.4) 

## バージョン確認
ターミナルを起動し、以下のコマンドを入力することで、Swiftのバージョンを確認することができます。

```
 $ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -version
```
結果

```
Apple Swift version 5.2 (swiftlang-1103.0.32.1 clang-1103.0.32.29)
Target: x86_64-apple-darwin19.4.0
```

Swiftのバージョンが"5.2"であることが確認できました。

## 【おまけ】PATHを通す

上記の通りでもバージョン確認はできますが、一度PATHを通しておくと色々便利ですね。
僕はまだだったので以下の手順でPATHを通しました。

### Swiftコマンド実行ファイルの格納場所を確認
ターミナルで以下を実行します。

```
$ which swift
```
結果

```
/usr/bin/swift
```


### 設定ファイルの編集
ターミナルで以下を実行します。

```
$ vi ~/.bash_profile
```
設定ファイルが開くので、以下を追加します。

```
# 編集開始　i

export PATH=$PATH:/usr/bin/swift

# 保存　esc →　:wq
# 保存せずに終了 esc →　:qa!
```

### 設定ファイルの更新
設定の変更を反映させるために以下を実行

```
$ source ~/.bash_profile
```

### バージョン確認
PATHが通ったかの確認も含めて、バージョン確認します。

```
$ swift -version
```
結果

```
Apple Swift version 5.2 (swiftlang-1103.0.32.1 clang-1103.0.32.29)
Target: x86_64-apple-darwin19.4.0
```
これで完了です！

### 【おまけのおまけ】PATHを通した後のエラー
PATHを通して、一度目のバージョン確認の時、以下のようなエラーが出ました。

```
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```

どうやら直前にmacOSをアップロードしていたのが原因のよう。
以下のコマンドを実行し、Xcodeをインストールすることで解決し、無事PATHが通りました。

```
 $ xcode-select --install
```
Rails 最近の投稿を取得

##概要

Railsの基本的な投稿アプリで、postした詳細ページにそのユーザーの最近の投稿が一緒に表示されているというアプリをよく見かけます。

その際のデータ取得の方法を残しておきます。
　
[![Screenshot from Gyazo](https://gyazo.com/5454d0c47cdc93300cc44a336df3fcaa/raw)](https://gyazo.com/5454d0c47cdc93300cc44a336df3fcaa)

##コード

私はこのコードでデータを取得しました。

```ruby

@recent_posts = Post.where(user_id: @post.user_id).order(created_at: :desc).limit(4)
```

しかし、これだと取得したデータとshowページのデータが同じという事が起こるので
view側で

```ruby

    <% @recent_posts.each do |post| %>
      <% unless post.id == @post.id %> #この行を追加
        <%= link_to post_path(post) do %>
          <%= image_tag post.image %>
          <p><%= post.name %></p>
        <% end %>
        <p><%= post.updated_at.strftime("%Y/%m/%d")%></p>
      <% end %>
    <% end %>
```

eachする時にunless文でshowページのpost.idと異なるものだけ表示するようにしました！

以上です。
[Oracle Cloud] Computeにログインする鍵を紛失したとき、パスワード認証をバイパスしてコンソールログインする

# はじめに

Computeにログインする鍵をどこに保存したかわからなくなることが、まれによくあると思います。

そんなときに、シリアルコンソールを利用して、パスワードなしでログインして鍵を追加する方法です。

※OEL7(GRUB2)では、RHEL6(GRUB)の時のようにシングルユーザモードで起動しただけではパスワードなしでログインすることができないようです。

※ 以前、コンソールログインを試した時の記憶で、パスワード認証ユーザを先に作っとかないとだめと思いこんでいました。5/15まで無償公開されている [Oracle Universityの講座 (Oracle Cloud Infrastructure Architect Professional Workshop)](https://www.oracle.com/corporate/blog/free-certifications-oracle-oci-autonomous-033020.html) を見て、パスワード認証をバイパスする方法が紹介されていたので、お！と思いやってみました。が、[公式ドキュメント](https://docs.cloud.oracle.com/ja-jp/iaas/Content/Compute/References/serialconsole.htm)にちゃんとやり方書いてあるのですね。。

# 手順
※OEL7.xを前提とした方法です。

## cloud shellを起動
ここでは、シリアルコンソールにSSHアクセスするための環境として、Cloud Shellを利用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/0eccaa74-45df-c32a-6693-f3d02d9c755a.png)

cloud shellからコンソールアクセス用の鍵ペアを生成します。

```
$ ssh-keygen -t rsa

$ cat .ssh/id_rsa.pub

→ 出力された公開鍵をコピーします。
※Cloud Shellのコピーは、コピー範囲を選択後にCtrl+Insert

```

## コンソール接続の作成

ログインできなくなったComputeインスタンスの管理画面まで遷移します。

「コンソール接続の作成」ボタンを押します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/083ba597-9c4f-ab7d-3a97-4fe2ae8bc66d.png)

先ほど、Cloud Shell上で作成した公開鍵をペーストして、「コンソール接続の作成」を押下します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/e8626f33-381b-5888-da6d-62bdaee1213b.png)

作成が完了したら、コンソール接続の右側のメニューを押して、「SSHを使用して接続」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/298566c6-5785-128f-fce6-6fd104c43205.png)

接続用コマンドの文字列をコピーします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/6c2ef693-1451-b2a0-1fa8-ada21c131a28.png)


## コンソールに接続
Cloud Shellに戻って、コピーした接続用コマンドの文字列をペーストとします。
※Cloud Shellのペーストは、Shift+Insert

ログインすると、こんな感じにプロンプトが表示されてます。
※何も表示されない場合は、1回Enterキーを押下すると表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/b28f0ea1-a786-6a4a-f62a-3e6d2bb32477.png)

このままだと、パスワード認証できるユーザがいない場合はログインできないので、一度リブートします。(リブートは、コンソールメニューの「再起動」ボタンから実施)
リブート後、以下の画面で十字キーを押して画面を止めて、キーボードのeを押して編集画面に遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/3a8ea7dd-730d-1657-ed3c-096caa5ffbe0.png)

※cloud shellの画面を最大化しておいたほうが編集しやすいです。
linuxefiから始まる行の行末に、init=/bin/bashを追記して、Ctrl+Xキーを押下してブートします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/850937be-6d95-9470-dbac-d790213baa2b.png)

ブート後、ログインプロンプトではなくbashが起動してきたら成功!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/84583da4-d385-0e44-66e9-6a4d1566f3a2.png)

## SELInuxが有効な環境では、コンテクストを維持するためポリシーをロードする

```
# /usr/sbin/load_policy -i
```

## リマウント
このままだと、/ファイルシステムがread onlyでマウントされているので、rwでリマウントします。

```
# mount -o remount,rw /
```

## ファイルの修正
$HOME/.ssh/authorized_keysに公開鍵を追記します。


## systemdを起動する
systemdを起動せずに、exitした場合、私の環境ではカーネルパニックが発生してしばらく操作できなくなりましたのでご注意ください

```
# exec /usr/lib/systemd/systemd
```
systemdの起動後、一応もう一回再起動しておく

## シリアルコンソールを抜ける
※シリアルコンソールに接続中にセッションが切れると、セッションが残ってしばらくログインできなくなるので、ちゃんと抜けておきましょう

以下のキーをすばやく実行すると抜けれます
~.

## コンソール接続を消す

使い終わったら、コンソール接続は消しておきましょう
ブートモードについて

eMMC Boot、SD Boot、Serial Boot、USB Bootが存在する。

<https://github.com/beagleboard/beaglebone-black/wiki/System-Reference-Manual#535_Boot_Modes>


# eMMC Boot デフォルトのブート。eMMCに書かれているOSをブートする

1.  SD Boot SDカードからのブート。加えてeMMCに書かれているOSの書き換えができる
2.  Serial Boot SerialからFWをダウンロードしてブートする
3.  USB Boot USBからブートする

beagleboard.org ではSeiral BootとUSB Bootは対応していない。


# ブートの切り替え

bootボタンを押していなかったらeMMCで起動
bootボタンを押して起動すると、SD Boot -> Serial Boot -> USB Bootの順で起動を試みる

Resetボタンによるリセットの起動だとbootボタンの確認をしないため、Power off/Onの起動でブートを切り替える必要がある


# Bootコンフィグレーション

評価ボードなどのブートの順番はROMブート -> SLP(Secondary program loader)ブート -> uBootの順となる。SLPがデバイスを初期化してU-bootに制御を渡す．

<https://github.com/beagleboard/beaglebone-black/wiki/System-Reference-Manual#67_Boot_Configuration>

ROMブートがbootボタンを読みとりどこからブートするかを決定する．そして，xloader(SLP)をSOC上のSRAMに展開して実行する．

<https://www.slideshare.net/sysplay/beaglebone-black-booting-process-78730088>

xloaderはペリフェラルとクロックの設定をしてUBootをボード上のSDRAMに展開して実行する

uBootはデバイスツリーを読み取りカーネルをSDRAMに展開してbootする．


# ブート


## ubootの構築

linaroを使用するBBBはAM3358(Cortex-A8 32bit)のためarm-eabiを使用する．
linaroのgccを使用する．

```bash
yay -S arm-none-eabi-gcc74-linaro
```

configs以下に対応しているボードのコンフィグレーションが記載されている．今回は~am335x<sub>evm</sub><sub>defconfig</sub>~を使用する．

```bash
CROSS_COMPILE=arm-none-eabi-
HOSTCC=gcc-7.4
export CROSS_COMPILE
make am335x_evm_defconfig
make
```


### SDカードへの書き込み

primaryパーティションをブータブルで作成してFAT32にてフォーマットする．
u-bootでビルドした~MLO~と~u-boot.bin~を書き込む．先に~MLO~を書き込む必要がある．


## UART

シリアルはUART0に115200 8N1で出力されるので3.3V Serial-USB端子をJ1端子に接続する．

microSDカードをBBBに挿入して，bootボタンを押しながら起動する．
Serialにu-bootのログが表示されるので~Hit any key to stop autoboot~が出力されたら何かのキーを押下してu-bootのshellに入る．


## ネットワークブート

ホストPC側でdnsmasqなどでDHCPとtftpを立てる．

u-bootのシェルで~dhcp~コマンドを実行するとネットワークブートが始まる．デフォルトでは~zImage~を0x82000000にロードする．