OmniAICreator/Qiita-1.07M huggingface dataset:
SQL未経験者にオススメのユーデミー動画講座6選!データ分析したい人向け

タイトルの通りSQL初心者におすすめのユーデミー講座のまとめです。
ウェブアプリ開発を始めたい人やPython等でデータ分析を始めたい人におすすめです。

## はじめてのSQL ・データ分析入門 -データベースのデータをビジネスパーソンが現場で活用するためのSQL初心者向コース
おすすめ度：★★★★
・[はじめてのSQL ・データ分析入門 -データベースのデータをビジネスパーソンが現場で活用するためのSQL初心者向コース](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fstandard-sql-for-beginners%2F)
### この講座で学べる内容
・SQLを使用してデータベースからデータを取得する
・データベースのデータを更新できる
・SQLを使用してデータ分析を実行する
・MySQLをmacOSまたはWindowsにインストールできる
・データベース構造の変更ができる
・MySQLを操作できる
・MySQL公式ツール MySQL Workbenchが使用できる
## 3時間で学ぶ SQL ・データベース 超入門【丁寧な解説+演習問題で SQL データ抽出の基本が身につく】標準 SQL
おすすめ度：★★★★
・[3時間で学ぶ SQL ・データベース 超入門【丁寧な解説+演習問題で SQL データ抽出の基本が身につく】標準 SQL](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fsql-begginer%2F)
### この講座で学べる内容
・SQLの基礎的な文法を、未経験者が本当に理解すべき項目だけ厳選して、少しづつ丁寧に学んでいきます。
・SQLを用いた簡単なデータ分析を行う経験が得られます。
・SQL・データベースとは？という内容から説明をはじめるので、知識ゼロからでも取り組むことができます。
・講座終了後には、SQL・データベースの基礎的な概念を理解し、もっとSQLについて学びたい！というマインドになっていることを目指します。
## BigQuery で学ぶ非エンジニアのための SQL データ分析入門
おすすめ度：★★★★★
・[BigQuery で学ぶ非エンジニアのための SQL データ分析入門](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fbigquerysql%2F)
### この講座で学べる内容
・BigQueryを学習環境とした、データ分析のための標準SQL記述方法で、以下の句やテクニックを含みます。
・基本的な句（select, from, where, order by, group by, having, limit）
・集計関数（sum, max, min, avg, count）
・関数（round,ceiling, floor, abs,mod,cast, concat, left, length, replace,trim,split,regex_xxx, date,date_add, date_sub,date_trunc,current_date）
・分析関数（rank, row_number, first_value, last_value, lead, lag）
・JOIN、サブクエリ、テーブル同士の集合演算
## 最新版:　基本情報技術者試験+応用情報技術者試験+Python+SQL　初心者からプロのエンジニアになる講座
おすすめ度：★★★★★
・[最新版:　基本情報技術者試験+応用情報技術者試験+Python+SQL　初心者からプロのエンジニアになる講座](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fkihonjoho-oyojoho%2F)
### この講座で学べる内容
・企業の経営戦略、マーケティング、財務、技術戦略、システム戦略に関する知見
・システムの開発技術、プロジェクトマネジメント、サービスマネジメント、システム監査に関する知見
・ITのテクノロジーに関する知識、アルゴリズム、コンピュータアーキテクチャ、データベース、ネットワーク、セキュリティ関する知見
・AI, IoT, ビッグデータなどの最新の分野の知識
・Pythonについて詳細な文法を用いたプログラミング（ボーナスコンテンツ）
・SQLについて基礎的な内容（ボーナスコンテンツ）
・システムの基礎的な内容、システムの性能などシステム開発で必須となる要素（ボーナスコンテンツ）
## 経験ゼロからSQLServerをインストールしてある程度SQLが書けるようになる方法
おすすめ度：★★★★
・[経験ゼロからSQLServerをインストールしてある程度SQLが書けるようになる方法](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fanderson_sqlinit%2F)
### この講座で学べる内容
・SQLServerがインストールできる
・基本的なSQLが書けるようになる
・データベース設計や正規化が理解できる
・設計したテーブルの作成ができる
・内部結合と外部結合が理解できる

## 関連記事
・[Java初心者に超オススメ出来るUdemy動画講座7選まとめ。最速マスター特化](https://qiita.com/ykimura517/items/946193f715776db44770)
・[Typescript入門におすすめのユーデミー講座5選。JS未経験者も可](https://qiita.com/ykimura517/items/1f3f59f64193a495542f)
・[【Androidアプリ開発】Kotlin初心者向けの超おすすめUdemy講座6選をまとめた](https://qiita.com/ykimura517/items/2ca099a9f19ec5ff4e4e)
初心者による初心者のためのGatsbyJS覚書7（ブログのコンテンツを準備する）

##この記事について
この記事はGatsbyJS初心者の新卒２年目が作成しています。
参考資料として書籍を使用していますが、筆者がビギナークラスのため読んでいて「？」となる部分や間違っている箇所もあるかと思います。
参考までに、そして間違えている箇所がありましたらご連絡いただけると嬉しいです。

##Chapter7：ブログのコンテンツを用意する　備忘録メモ

1.Contentfulの準備
2.GraphQLでデータを取り込む準備をする

####Contentfulの準備

ContentfulのFreeプランを利用してSpace「Blog」を作成します。
Githubのアカウントを持っていればすぐに作成できます。

今回は購入本のGithubからダンロードできるContentfulのデータをインポートする方法でデータを作成したいと思うので
指示書の指定通り「Settings > Locales」から「ja-JP」を選択し、保存します。

![スクリーンショット 2021-08-29 13.17.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281399/7bdee908-1a46-48a6-86ac-3d83fbb393dc.png)

スペースIDとアクセストークンを控えておきます。
「Settings > API　Keys」の「Content delivery/previews token」のタブから確認できます。
ない場合は「Add API key」から作成します。

![スクリーンショット 2021-08-29 13.22.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281399/4baac34b-9307-b1e8-1a9a-82bcd17b89f6.png)


パーソナルアクセストークンを作成します。
API の管理画面に戻り、「Content management tokens」のタブに切り替え、「Generate Personal Token」をクリックします。
生成されたトークンは一度きりしか表示されないため、必ず控えておくようにします。

![スクリーンショット 2021-08-29 13.32.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281399/b6c06d4f-c4fd-e861-e0d2-65aca53e45fd.png)

Contentfulのデータをインポートする
※この手順は購入本のGithubからダンロードできるContentfulのデータがある前提で進みます
ない場合はスキップしてください。

`importConfig.json`を開いて中身を更新

```json
{
  "spaceId": "XXXXXXXXXXXXX",
  "managementToken": "XXXXXXXXXXXXXXXXXXXXX", //前工程のパーソナルアクセストークンを使用する
  "contentFile": "blog-ja-JP.json"
}
```
`contentful-data/`配下で実行
トークンはパーソナルアクセストークンを使用する

```sh
npx contentful-cli login --management-token xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```
インポートを実行。
ロケールが間違っているとエラーがでるので注意

```sh
npx contentful-cli space import --config importConfig.json
```

「The import was successful.」と表示されたらログアウトする

```sh
npx contentful-cli logout
```

#### GraphQLでデータを取り込む準備をする

プラグインを準備する

```sh
npm install gatsby-source-contentful
```

`gatsby-config.js`に下記を追記。
コード内にトークンを残さないために環境変数を使用する。

```js
{
  resolve: `gatsby-source-contentful`,
  options: {
    spaceId: process.env.CONTENTFUL_SPACE_ID,
    accessToken: process.env.CONTENTFUL_ACCESS_TOKEN,
    host: process.env.CONTENTFUL_HOST,
  },
},
```

サーバーを起動する
このときのアクセストークンは、アクセストークンを使用。
パーソナルアクセストークンではエラーとなる。

```sh
CONTENTFUL_SPACE_ID=XXXXXXXX CONTENTFUL_ACCESS_TOKEN=XXXXXXXXXX CONTENTFUL_HOST=cdn.contentful.com gatsby develop -H 0.0.0.0
```

GraphQLを開き、インポートしたデータが選択できるようになっていれば成功。
![スクリーンショット 2021-08-29 13.45.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281399/22eda1a1-e8f9-cf1f-7c18-b9b64c9ab5ee.png)

今回はここまで。
[Ruby] sortメソッド

##はじめに
今回はsortメソッドという配列の順番を並び替えられるメソッドを紹介します。


##sortメソッド
配列に対して使います。

配列に対してsortメソッドを使うと中身を昇順に並び替えてくれます。

```ruby
array = [1, 5, 3, 2, 4]
array.sort
=> [1, 2, 3, 4, 5]
```

またreverseメソッドを組み合わせれば降順にできます。

```ruby
array.sort.reverse
=> [5, 4, 3, 2, 1]
```

文字列にも使えます。

```ruby
array = ["b", "a", "d", "f", "e", "c"]
array.sort
=> ["a", "b", "c", "d", "e", "f"]
```


```sort!``` とすることで破壊的に使用することも可能です。
Wordpressでカスタム投稿の新着順にユーザー一覧を作成する

`get_users`を使えば、ユーザーの一覧を取得できます。
[関数リファレンス/get users
](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/get_users)

ユーザーID、登録日でソートすることはできけど、カスタム投稿の新着順にソートするできないみたい。

検索してみても、同じようなことをしてるサイトが見つからなかったけど、やってみたらできたので、それのメモ。

## 完成形

まずは完成形を。

```php
<?php
$userlist = []; // 最終的に出力するユーザー一覧の配列

// ユーザーを取得
$args = [
  'orderby' => 'ID',
  'order' => 'ASC',
];
$users = get_users($args);

foreach ($users as $user){
  $uid = $user->ID;
  $usernicename = $user->user_nicename;

  // ユーザーに紐付く最新記事の取得
  $args = [
    'orderby' => 'post_date',
    'order' => 'DESC',
    'post_type' => 'photos', // カスタム投稿タイプを指定。例としてphotos
    'author' => $uid,
    'numberposts' => 1,
  ];

  $mypost = get_posts($args);
  if (!$mypost) { // 投稿がないユーザーは除外
    continue;
  }
  $postid = $mypost[0]->ID;
  $postdate = $mypost[0]->post_date;

  $userlist[] = [
    'usernicename' => $usernicename,
    'displayName' => $user->display_name,
    'postdate' => $postdate,
  ];
};
// ユーザーを投稿の新着順にソート
array_multisort(array_column($userlist, 'postdate'), SORT_DESC, $userlist);

foreach ($userlist as $post) : ?>
  <li>
    <a href="<?= get_bloginfo("url") . '/user/' . $post['usernicename'] ?>">
      <p class="name"><?= $post['displayName'] ?></p>
    </a>
  </li>
<?php endforeach ?>
```

一応解説します。

## ユーザー取得
ここでユーザー一覧を取得します。
最終的に投稿日順に並び替えるので、ソート順はなんでもいいのですが、ここではIDの昇順で取得。

```php
// ユーザーを取得
$args = [
  'orderby' => 'ID',
  'order' => 'ASC',
];
$users = get_users($arga);
```


## ユーザーごとに新着記事を取得
取得したユーザー一覧を`foreach`で回します。
その中でユーザーが投稿したカスタム投稿の最新記事を取得し、`$mypost`に格納します。
また、記事の投稿がないユーザーは表示したくないので、`if (!$mypost) `で スキップしてます。

```php
  // ユーザーに紐付く最新記事の取得
  $args = [
    'orderby' => 'post_date',
    'order' => 'DESC',
    'post_type' => 'photos', // カスタム投稿タイプを指定。例としてphotos
    'author' => $uid,
    'numberposts' => 1,
  ];

  $mypost = get_posts($args);
  if (!$mypost) { // 投稿がないユーザーはスキップ
    continue;
  }
```

## 投稿日を取得して配列に格納する
取得した最新記事から`post_date`を取り出し、`$userlist`に格納する
ここまでできたらもう一息です。

```php
  $postdate = $myposts[0]->post_date;

  $userlist[] = [
    'usernicename' => $usernicename,
    'displayName' => $user->display_name,
    'postdate' => $postdate,
  ];
```

## カスタム投稿の新着順でソート
`array_multisort`で`postdate`順にソートしてやれば、投稿日順にソートされたユーザー一覧配列の出来上がりです。
あとはこの配列を`foreach`で出力してやれば、完成です。

```php
array_multisort(array_column($userlist, 'postdate'), SORT_DESC, $userlist);

foreach ($userlist as $post) : ?>
  <li>
    <a href="<?= get_bloginfo("url") . '/user/' . $post['usernicename'] ?>">
      <p class="name"><?= $post['displayName'] ?></p>
    </a>
  </li>
<?php endforeach ?>
```

## 最後に
これで取得したユーザー一覧をカスタム投稿の新着順に並べることができました。
ちなみに、`get_the_post_thumbnail_url($mypost[0]->ID)`としてやれば、記事に登録されたアイキャッチ画像を取得することができます。

やってみたら意外と簡単にできたました。

もし同じようなことをしたい人がいたら、参考にしてくれたら嬉しいです。
「pythonのnumpyで行列の計算」を参考にWolframAlphaとSymPy Liveでやってみたい

wolframalphaを教えて下さい。
①??? 「行列の各成分の積」の方法がわかりませんでした。
　　　mtahematicaの*と.の違いを教えて下さい。
　　　https://reference.wolfram.com/language/tutorial/LinearAlgebra.html#22223
②??? wolframalphaは、 {}を使うのが正しいですか？

# original link

https://qiita.com/popo62520908/items/31a2f9c608aaba2615a4



#wolframalphaで 

#### 行列(matrix)の作成

https://www.wolframalpha.com/input/?i=%5B%5B1%2C2%5D%2C%5B3%2C4%5D%5D&lang=ja

#### 行列の転置(transpose)

https://ja.wolframalpha.com/input/?i=%5B%5B1%2C2%5D%2C%5B3%2C4%5D%5D++%E3%81%AE%E8%BB%A2%E7%BD%AE

https://ja.wolframalpha.com/input/?i=%5B%5B1%2C2%5D%2C%5B3%2C4%5D%5D+%5ET

#### 逆行列(inverse matrix)の作成

https://ja.wolframalpha.com/input/?i=%5B%5B1%2C2%5D%2C%5B3%2C4%5D%5D++%E3%81%AE%E9%80%86%E8%A1%8C%E5%88%97

https://ja.wolframalpha.com/input/?i=%5B%5B1%2C2%5D%2C%5B3%2C4%5D%5D++%5E-1

#### 行列の積

https://ja.wolframalpha.com/input/?i=%5B%5B1%2C2%5D%2C%5B3%2C4%5D%5D++*+%5B%5B1%2C2%5D%2C%5B3%2C4%5D%5D%5E-1

　乗算記号の省略可能

https://ja.wolframalpha.com/input/?i=%5B%5B1%2C2%5D%2C%5B3%2C4%5D%5D+++%5B%5B1%2C2%5D%2C%5B3%2C4%5D%5D%5E-1

#### 行列の和

https://ja.wolframalpha.com/input/?i=%5B%5B1%2C2%5D%2C%5B3%2C4%5D%5D++%2B+%5B%5B1%2C2%5D%2C%5B3%2C4%5D%5D

#### 行列の差

https://ja.wolframalpha.com/input/?i=%5B%5B1%2C2%5D%2C%5B3%2C4%5D%5D++-+%5B%5B1%2C2%5D%2C%5B3%2C4%5D%5D%5ET

#### 行列の各成分の積
教えて下さい。
X = np.array([[1,2],[3,4]])
print(X * X)

#### 行、列の数

https://ja.wolframalpha.com/input/?i=Dimensions+%5B%5B1%2C2%2C3%5D%2C%5B4%2C5%2C6%5D%5D

結果
{2, 3}


#SymPy Liveで

```python
from sympy import *
myM=Matrix([[1,2],[3,4]])
#
print("#",myM)
print("#",myM.transpose())
print("#",myM.inv(),myM**(-1))
print("#",myM*myM**(-1))
print("#",myM*myM)
print("#",myM+myM)
print("#",myM-myM.transpose())
print("#",myM.multiply_elementwise(myM))
print("#",Matrix([[1,2,3],[4,5,6]]).shape)
#
pprint(myM)
pprint(myM.transpose())
pprint(myM.inv())
pprint(myM**(-1))
pprint(myM*myM**(-1))
pprint(myM*myM)
pprint(myM+myM)
pprint(myM-myM.transpose())
pprint(myM.multiply_elementwise(myM))
pprint(Matrix([[1,2,3],[4,5,6]]).shape)
# Matrix([[1, 2], [3, 4]])
# Matrix([[1, 3], [2, 4]])
# Matrix([[-2, 1], [3/2, -1/2]]) Matrix([[-2, 1], [3/2, -1/2]])
# Matrix([[1, 0], [0, 1]])
# Matrix([[7, 10], [15, 22]])
# Matrix([[2, 4], [6, 8]])
# Matrix([[0, -1], [1, 0]])
# Matrix([[1, 4], [9, 16]])
# (2, 3)
#
#⎡1  2⎤
#⎢    ⎥
#⎣3  4⎦
#⎡1  3⎤
#⎢    ⎥
#⎣2  4⎦
#⎡-2    1  ⎤
#⎢         ⎥
#⎣3/2  -1/2⎦
#⎡-2    1  ⎤
#⎢         ⎥
#⎣3/2  -1/2⎦
#⎡1  0⎤
#⎢    ⎥
#⎣0  1⎦
#⎡7   10⎤
#⎢      ⎥
#⎣15  22⎦
#⎡2  4⎤
#⎢    ⎥
#⎣6  8⎦
#⎡0  -1⎤
#⎢     ⎥
#⎣1  0 ⎦
#⎡1  4 ⎤
#⎢     ⎥
#⎣9  16⎦
#(2, 3)
```

#参考


https://alphamath.school.blog/2020/03/08/%E8%A1%8C%E5%88%97%E3%81%AE%E8%A8%88%E7%AE%97/

https://alphamath.school.blog/reference/
[Unity]３点から得られる平面にQuad/Planeオブジェクトを移動する

小ネタ。

表題の問題を解こうとネットを検索するとたいてい平面の数式に遭遇し、オブジェクトの回転に変換する方法を見つけにくいので書いてみる。大した話ではなく、メモ程度。

##要件として
ここでは
「ある物体の角度に応じて、その物体の正面の障害物を壁で覆うようにQuadオブジェクトを配置したい」
とする。
なお Plane を使う場合は面の方向が90度異なるので、以下の説明に補正が必要になる。「正面」でない場合も同様。

##作戦は
「物体から正面に3点のレイキャストを発行し、ぶつかった３点に沿うように Quad オブジェクトを移動する」
としよう。このとき、検出された3点に沿うように矩形オブジェクトの姿勢を指定するのが今回のテーマ。

##外積から法線を得る
3点あると三角形ができるが、そのうちの二辺のベクトルで外積を作ると、平面に垂直なベクトルを得られる。じっさい平面の式というのは法線ベクトルそのものなので、これを知ってればこの問題は解けたも同然。

##LookRotation
Unity にはベクトルに向かうための Quaternion.LookRotation という関数があるので、先程の法線に適用すれば完成。なお安定性のため、第二引数の up ベクトルも指定する。法線ベクトルとワールド空間の右ベクトルの外積で fwd というベクトルを作っておく（状況に応じて対応は分かれる）。

## code

以下。Quadのpositionは3点の重心とした。

```c#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Wall : MonoBehaviour
{
    public Transform Target;

    void FixedUpdate()
    {
        var orgPoints = new Vector3[] {
            new Vector3( 1f, 1f, 0f),
            new Vector3(-1f, 1f, 0f),
            new Vector3( 0f,-1f, 0f),
        };
        var hitPoints = new Vector3[3];
        bool existsCollider = true;
        for (var i = 0; i < orgPoints.Length; ++i) {
            var org = Target.TransformPoint(orgPoints[i]);
            var dir = Target.TransformDirection(Vector3.forward);
            RaycastHit hit;
            if (Physics.Raycast(org, dir, out hit, Mathf.Infinity, 1 << 3 /* layerMask */)) {
                hitPoints[i] = hit.point;
            } else {
                existsCollider = false;
            }
        }
        if (existsCollider) {
            var norm = Vector3.Cross(hitPoints[1] - hitPoints[0], hitPoints[2] - hitPoints[0]).normalized;
            var up = Vector3.Cross(norm, Vector3.right);
            var center = (hitPoints[0] + hitPoints[1] + hitPoints[2])/3f;
            var rot = Quaternion.LookRotation(norm, up);
            transform.position = center;
            transform.rotation = rot;
        }
    }
}
```
このスクリプトを Quad オブジェクトに適用し、Target には判定するためのプレイヤーなどの物体を入れておく。レイキャストを投じる対象はレイヤー３を指定。

以上です。
【Androidアプリ開発】Kotlin初心者向けの超おすすめUdemy講座6選をまとめた

アンドロイドのアプリ開発をしたい初心者向けのkotlinのUdemy講座のまとめです。
なお基本的にJavaの経験はなくてもOKです。

※ユーデミーは普段数万円する講座がセール時に数千円に値引きされていることがあります。
従ってセール時の購入がおすすめです。

## はじめての Kotlin【Java 知らなくてOK！丁寧な解説で Android に必要な Kotlin の基本を学習】
おすすめ度：★★★★★
・[はじめての Kotlin【Java 知らなくてOK！丁寧な解説で Android に必要な Kotlin の基本を学習】](	https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fkotlin-beginner%2F)
### この講座で学べる内容
・Kotlin の基本的な文法や特徴について学びます。
・Android 開発に取り組むために必要なKotlin の基本の知識が身に付きます。
・Java の前提知識不要でKotlin の学習ができます。
・ラムダ式やオブジェクト宣言など、Kotlin が持つ簡潔な表現方法を学ぶことができます。
## Kotlin と JUnit で学ぶ、はじめてのユニットテスト【丁寧な解説＋演習問題で プログラミング 中級者になろう】
おすすめ度：★★★★
・[Kotlin と JUnit で学ぶ、はじめてのユニットテスト【丁寧な解説＋演習問題で プログラミング 中級者になろう】](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Funittest-kotlin-junit%2F)
### この講座で学べる内容
・ユニットテストを開発に使うための知識を学びます。
・ユニットテストとはなにか？なぜ行うのか？を理解できます。
・JUnitをはじめとしたテスティングフレームワークについて理解できます。
・ユニットテストの基本・本質について理解できるので、他の環境にも応用できる知識が得られます。
## Kotlin プログラミング入門講座【Java 知識不要の初心者コースで基礎知識を学ぼう！】
おすすめ度：★★★
・[Kotlin プログラミング入門講座【Java 知識不要の初心者コースで基礎知識を学ぼう！】](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fkotlin-developer%2F)
### この講座で学べる内容
・Kotlin の基本的な文法や特徴について学習します
・Kotlin の特徴である簡潔なコード表現について学習します
・「null 安全性 」「オブジェクト指向」など Kotlin の特徴を学習します
・Java 知識は不要で Kotlin を学習することができます
## Java知識ゼロOK！プロのAndroid開発者になるためのマスターコース
おすすめ度：★★★★
・[Java知識ゼロOK！プロのAndroid開発者になるためのマスターコース](	https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fandroidjavapro%2F)
### この講座で学べる内容
・Android Studioを利用してアプリを開発できるようになります。
・Javaの基本的なプログラミング構文を学習できます。
・タイマーを使ったアプリを開発できるようになります。
・ボタンナビゲーションとWebViewを使ったブラウザーアプリを開発できるようになります。
・端末の実機を使用して加速度センサーと連動したアプリを開発できるようになります。
・音の出るアプリやスライドショーアニメーションを使ったアプリを開発できるようになります。
・データベースを使った本格的アプリケーションを開発できるようになります。
・マテリアルデザインで格好いいデザインのアプリを開発できるようになります。
## 【3日でできる】はじめてのAndroidアプリ開発入門【Android Studio 2.3・Java 8対応】
おすすめ度：★★★★★
・[【3日でできる】はじめてのAndroidアプリ開発入門【Android Studio 2.3・Java 8対応】](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fandroid2master%2F)
### この講座で学べる内容
・Android Studio 2.1でAndroidアプリを開発できるようになります。
・Androidアプリ開発に必要なJavaの知識を学べます。
・データベースを使用したアプリが作れるようになります。
・NoSQLデータベースRealmが扱えるようになります。
・Gradleを使用したプラグイン管理ができるようになります。
## はじめてのAndroidアプリケーション開発
おすすめ度：★★★★★
・[はじめてのAndroidアプリケーション開発](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fandroid_beginner%2F)
### この講座で学べる内容
・Androidと今までの携帯電話やパソコンとの違いがわかる
・Androidプログラミングの基本的な流れがわかる
・Android Studioの基本的な使用方法がわかる
・作成したアプリケーションをエミュレータ(Android Virtual Device)に格納し実行できる

## 関連記事
・[Java初心者に超オススメ出来るUdemy動画講座7選まとめ。最速マスター特化](https://qiita.com/ykimura517/items/946193f715776db44770)
・[Typescript入門におすすめのユーデミー講座5選。JS未経験者も可](https://qiita.com/ykimura517/items/1f3f59f64193a495542f)
ubuntu-20.04でDockerコマンドの実行ができない　「独学エンジニア」講座で困った点 win10 レッスン2-23 Dockerインストール

初記事なので、まずは公開する。（Markdownの学習は後回し！笑）

<h1>困った点</h1>
<p>講義通りでは、ubuntuウィンドウでdockerコマンドを実行してもエラー。<br>
バージョンすら表示できなかった。（推奨環境はMacなので、しょうがない。。）<br>

<h1>解決</h1>
エラーメッセージ取り忘れたが、メッセージに従ってマニュアル参照し、解決。</p>

<a link="https://docs.docker.com/desktop/windows/wsl/">https://docs.docker.com/desktop/windows/wsl/</a>

<p>Docker Desktopの歯車マーク(setting)から以下に示すUbuntu-20.04にチェック<br>
→Docker Desktop再起動</p>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1243830/33907e25-0232-094e-5a5a-a31e454c8810.png)
Client Side Rendering(CSR) / Static Site Generation (SSG) / Server Side Rendering (SSR) 

https://www.youtube.com/watch?v=vn4n8EO_kFQ&list=PLGT7Exkshx4ifQpZkjim4yJN52D00Ej3c&index=5

# CSR

![スクリーンショット 2021-08-29 12.05.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402245/8f976904-bdd6-ea23-ed11-926a9ea17907.png)

#### 概要

- ブラウザがサイトにアクセスすると、`<script>`要素だけ書いた、中身が空のHTMLを返す
- JS読み込み、APIでデータ取得(ページは表示されない)
- データが出揃ったらReactなどでDOMをレンダリングする

#### メリット
- クライアントサイドで動くことだけを考えれば良いので実装が単純
- HTMLとJSなどの静的ファイルを返せばいいので動的なサーバーの運用コストがない
    - 動的なURLをHTMLに向けるためのルーティングは必要(SSGより面倒)

#### デメリット
- 初期表示のパフォーマンスが出ない
- JSが実行できないクライアントが内容を読めない
  - SEOの問題は少ない(検索エンジンのクローラーがJS実行できるようになった)
  - OGPが生成できない

#### 用途
- 管理画面やGmail



# SSG

![スクリーンショット 2021-08-29 12.15.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402245/41e13178-791e-1b20-a18c-76831f8278b4.png)

#### 概要

- デプロイのタイミングなどで事前にHTMLを静的に作成
- ブラウザがサイトにアクセスすると、プリレンダリングされたHTMLを表示(クリックイベントなどの振る舞いはない)
- `<script>`要素からJSをロード
- Reactでレンダリング

#### メリット

- 初期表示のパフォーマンスが良い
- JSが実行できないクライアントでも読める(OGP生成可能)
- サーバ不要でS3や静的CDNを活用できる

#### デメリット
- ビルドする対象が多い場合、ビルド時間が長い
- コンテンツが追加されたり変更される度にビルドが必要になる
- コンテキストによる内容の出しわけが困難
    - ビルドされる静的ファイルに情報を含めずにクライアントサイドで出し分けると、レイアウトシフトが発生してしまう

#### 用途
- コンテンツが頻繁に更新されないブログなどのメディア　


# SSR

![スクリーンショット 2021-08-29 12.16.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402245/96ea3ea3-d7a1-b3ff-0726-e74331dce18d.png)

#### 概要

- Railsと同じ
- ブラウザがサイトにアクセスすると、サーバーが動的にHTMLを生成して返す
- SSGと同じコンテンツ表示

#### メリット
- CDNを使えばSSGと同様のパフォーマンスを得られる
- コンテキストによってサーバーでの生成内容を変えれる

#### デメリット
- 動的なサーバーを運用する必要がある
    - 実装が複雑になる
    - クライアントとサーバーで同じコードを用いるが、実行環境がクライアントはブラウザ、サーバーはNode.jsで異なる
    - Nextで複雑さが多少軽減される

#### 用途
- SSGでは難しい、更新頻度が高い大量のコンテンツを持つページ


# CSR vs SSG vs SSR

- まずは CSRかSSGのどちらかを検討
    - 静的にHTMLを生成するのが難しくない場合CSR
- コンテンツ的に静的生成が難しくてOGPの対応や初期レンダリング速度に妥協できない場合SSR

- サイト全てを統一する必要はない
    - レシピページはSSR、その他はCSR 
    - ブログ記事はSSR、コメントはCSRとか
G-cluster ワークショップテキスト


クラウドゲーム機 G-cluster ! 幻となったこのゲーム機を Hack してオリジナル Linux マシンにしてしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/51aad18d-d4fc-dd4e-8f1c-94ae0abdeae2.png)



2021/08/29 に行う低レベル勉強会のワークショップ

「【OSC会津参加企画】低レイヤ・OS・セキュリティワークショップ」
https://lowleveltokyo.connpass.com/event/222262/

のテキストです。


「OSC2021 Online/Aizu 低レイヤ・OS・セキュリテイ LT大会」
https://ospn.connpass.com/event/220482/
イベント内のLT枠(20分)で行うオンラインワークショップです。

# 実験内容

基本編 シリアルコンソールを接続、動作確認、ファームウェアの書き換え、 LEDコントロール(Lチカ)
応用編(時間が余れば行います) ネットワーク接続、telnet による操作、HDMI経由での何かの出力

# 用意するもの

ワークショップ用のキットとして、以下を用意しています。

- G-cluster
- USBシリアルモジュール
- ジャンパケーブル

これに加え、以下を用意してください。

- USBメモリ
- micro-B USBケーブル(充電用でもOKです)
- PC(Windows/Mac/Linux いずれもOKです)

# 書き込みカスタムファームイメージ

 https://drive.google.com/drive/folders/1WIXbvQ8ezD_zM5BsjBMsiC1ex8hgc2up
こちらから README を読み、該当のバイナリをダウンロードしてください。



# テキスト

- 「G-cluster 殻割り指南」https://qiita.com/nanbuwks/items/a2de7e2fe3c6e457b934
- 「G-cluster をピン立てして CH340 USBシリアルモジュールでアクセス」https://qiita.com/nanbuwks/items/56ce3351929e97c8bb21
- 「G-cluster の起動動作をシリアルコンソールで見る」https://qiita.com/nanbuwks/items/9ec8388b5b5f638c9012
- 「G-cluster の U-boot で遊ぶ」https://qiita.com/nanbuwks/items/2492718d5efe85633ef6
- 「U-Bootから非署名なファームウェアを焼く方法」https://scrapbox.io/gcluster/U-Boot%E3%81%8B%E3%82%89%E9%9D%9E%E7%BD%B2%E5%90%8D%E3%81%AA%E3%83%95%E3%82%A1%E3%83%BC%E3%83%A0%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%92%E7%84%BC%E3%81%8F%E6%96%B9%E6%B3%95
- 「【遊ぼう】LEDの出力を変更する方法」https://scrapbox.io/gcluster/%E3%80%90%E9%81%8A%E3%81%BC%E3%81%86%E3%80%91LED%E3%81%AE%E5%87%BA%E5%8A%9B%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95
- 「【遊ぼう】画面に任意の文字を表示してみよう」https://scrapbox.io/gcluster/%E3%80%90%E9%81%8A%E3%81%BC%E3%81%86%E3%80%91%E7%94%BB%E9%9D%A2%E3%81%AB%E4%BB%BB%E6%84%8F%E3%81%AE%E6%96%87%E5%AD%97%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%97%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86
- 「【遊ぼう】自分の音声を流す方法」https://scrapbox.io/gcluster/%E3%80%90%E9%81%8A%E3%81%BC%E3%81%86%E3%80%91%E8%87%AA%E5%88%86%E3%81%AE%E9%9F%B3%E5%A3%B0%E3%82%92%E6%B5%81%E3%81%99%E6%96%B9%E6%B3%95



# 資料


@gpioblink じぶりんさんのプレゼン資料「激安Linuxボード G-cluster改造のすべて」
https://speakerdeck.com/gpioblink/ji-an-linuxbodo-g-clustergai-zao-falsesubete


Tips 集まとめサイト：
https://scrapbox.io/gcluster/
Zoomで「手を挙げる」方法

よく聞かれるので、まとめておきます。Zoomのバージョン等により表示される内容は変わってきます。

# Windows 10 のパソコンから

1. ウィンドウの下側から「リアクション」→「手を挙げる」をクリック
![tewoageru.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113168/f86421e1-4e69-1571-c2de-7ba499134680.jpeg)

2. 手を挙げている間は手のマークが表示される
![tewoageruto.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113168/52ba4027-a6bd-bf9d-5165-f6a6d2427edf.png)

3. 「手を降ろす」こともできる
![tewosageru.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113168/3b109d3b-0dc9-7662-746c-56a0b27e69d1.png)

# iPhone から
![スクリーンショット-2021-03-26-12.26.42 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113168/58770961-5aab-6d40-3fd3-8a2fc05b3ab8.png)
【Android Kotlin】Calendarクラスを使用して今日の曜日を取得する

## 1. 今日の曜日を取得する
```MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Calendarクラスをインスタンス化する．
        val calendar: Calendar = Calendar.getInstance()
        // 今日の曜日を取得する．
        val day: Int = calendar.get(Calendar.DAY_OF_WEEK)

    }
}
```

## 2. 取得した今日の曜日を TextView で表示する
```MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        ~ 省略 ~

        // レイアウトのtext_viewをTextViewという変数で扱う．
        val textView: TextView = findViewById(R.id.text_view)

        // dayの値によって表示する曜日を変える．
        if (day == Calendar.SUNDAY) {
            textView.text = "日曜日"
        } else if (day == Calendar.MONDAY) {
            textView.text = "月曜日"
        } else if (day == Calendar.TUESDAY) {
            textView.text = "火曜日"
        } else if (day == Calendar.WEDNESDAY) {
            textView.text = "水曜日"
        } else if (day == Calendar.THURSDAY) {
            textView.text = "木曜日"
        } else if (day == Calendar.FRIDAY) {
            textView.text = "金曜日"
        } else if (day == Calendar.SATURDAY) {
            textView.text = "土曜日"
        }

    }
}
```

### 補足： if 式の代わりに when 式を使った方が簡潔！
```MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        ~ 省略 ~

        // dayの値によって表示する曜日を変える．
        when (day) {
            Calendar.SUNDAY -> textView.text = "日曜日"
            Calendar.MONDAY -> textView.text = "月曜日"
            Calendar.TUESDAY -> textView.text = "火曜日"
            Calendar.WEDNESDAY -> textView.text = "水曜日"
            Calendar.THURSDAY -> textView.text = "木曜日"
            Calendar.FRIDAY -> textView.text = "金曜日"
            Calendar.SATURDAY -> textView.text = "土曜日"
        }

    }
}
```

when 式は文字通り**式**なので，以下のように評価結果をそのまま変数に代入できる．

```MainActivity.kt
        textView.text = when (day) {
            Calendar.SUNDAY -> "日曜日"
            Calendar.MONDAY -> "月曜日"
            Calendar.TUESDAY -> "火曜日"
            Calendar.WEDNESDAY -> "水曜日"
            Calendar.THURSDAY -> "木曜日"
            Calendar.FRIDAY -> "金曜日"
            Calendar.SATURDAY -> "土曜日"
            else -> "該当無し"
        }
```
Typescript入門におすすめのユーデミー講座5選。JS未経験者も可

タイトルの通り初心者にオススメのTypescriptのユーデミー動画のまとめです。
Javascriptの経験がある方が望ましいですが、JS未経験者も想定読者としています。

## Firebase + React Hooks(TypeScript)によるWebアプリ開発
おすすめ度：★★★★★
・[Firebase + React Hooks(TypeScript)によるWebアプリ開発](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Ffirebase-react-hookstypescriptweb%2F)
### この講座で学べる内容
・FirebaseとReact Hooks連携
・TypeScriptによるReact 開発
・FirebaseのCloud storage / Cloud firestore / Authorization / Hosting
・Material UI
## 超TypeScript入門 完全パック
おすすめ度：★★★★
・[超TypeScript入門 完全パック](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Ftypescript-complete%2F)
### この講座で学べる内容
・TypeScriptの基礎的な型と応用的な型、コンバイラの設定方法、クラスやインターフェースの使い方
・ジェネリクスや、デコレーター、モジュール、Webpack、React、Node jsを使った実践的な開発方法
・オブジェクト指向プログラミングを使った、健康管理アプリの作成とTypeScriptでのJavaScriptライブラリーの使い方
## ハンズオンで学ぶTypeScript - JavaScript エンジニアのためのTypeScript徹底入門
おすすめ度：★★★★
・[ハンズオンで学ぶTypeScript - JavaScript エンジニアのためのTypeScript徹底入門](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fts-for-js-developers%2F)
### この講座で学べる内容
・TypeScriptの開発環境の構築方法、TypeScriptの型定義の読解方法及び定義の方法
・TypeScriptの体系的な言語仕様：TypeScriptを支える全プリミティブ型から複雑な型制約を実現するUtility TypesとConditional Typesまで
・TypeScriptでReactアプリケーションを実装する事例
・TypeScriptで起こり得る諸問題とそれらの解決方法
## [JIRA編]React Hooks/TypeScript + Django REST APIで作るオリジナルJIRA
おすすめ度：★★★★
・[[JIRA編]React Hooks/TypeScript + Django REST APIで作るオリジナルJIRA](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fjirareact-hookstypescript-django-rest-apijira%2F)
### この講座で学べる内容
・React Hooks
・TypeScript
・Redux ToolKit
・Django REST Framework
## 【世界で7万人が受講】Understanding TypeScript
おすすめ度：★★★★
・[【世界で7万人が受講】Understanding TypeScript](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Funderstanding-typescript-jp%2F)
### この講座で学べる内容
・TypeScriptの使い方と機能（型、ES6サポート、クラス、ESモジュール、インターフェースなど）とTypeScriptプロジェクトで必要となるその他の知識
・TypeScriptとは何か？
・TypeScriptのメリットとその理由
・TypeScriptの全般的な機能を実際のプロジェクトで適用する方法
・ReactJS や NodeJS / Express のアプリケーションでTypeScriptを利用する方法

## 関連リンク
・[Java初心者に超オススメ出来るUdemy動画講座7選まとめ。最速マスター特化](https://qiita.com/ykimura517/items/946193f715776db44770)
reactのfragmentについて

#本記事について
本記事はReact.Fragmentに関して書いた記事です。筆者の備忘録的な位置付けも兼ねており、間違い等あるかもしれませんが、何かありましたら、お手数ですがコメント等でご連絡いただけますと幸いです。

#Fragmentとは
シンタックスシュガーのこと。通常、<font color ="red">Reactコンポーネントはルートの要素が一つでないといけない</font color ="red">。returnでは一つの要素しか返せないが、Fragementを使用することでその制約を外すことができる。
わかったようなわからないような,,,
#公式の例
例えば、以下のようなコードがあるとする。
Tableクラスでは、`Columns`コンポーネントを呼び出している。

```jsx
class Table extends React.Component {
  render() {
    return (
      <table>
        <tr>
          <Columns />👈ここで呼び出してる
        </tr>
      </table>
    );
  }
}
```
こちらは先ほど呼び出された`Columns`コンポーネント。
returnの中には、`div`要素で囲われた`一つの要素`がreturnされている。`div`要素の中にtd要素が入っているイメージ。
上に書いたように、reactコンポーネントでは一つの要素をreturnするため、

```jsx
class Columns extends React.Component {
  render() {
    return (
      <div>👈これがないと、二つの要素をreturnしようとしてしまうので、あえて`div要素`で囲うことで要素を一つにまとめている。
        <td>Hello</td>
        <td>World</td>
      </div>
    );
  }
}
```
最終的なイメージとしては以下のコードが返ってきている。

```html
<table>
  <tr>
    <div>
      <td>Hello</td>
      <td>World</td>
    </div>
  </tr>
</table>
```
ここで、< div ></ div >タグで囲わずにReact.Fragmentを使用すると`Columnsコンポーネント`は以下のような記述となる。

```jsx
class Columns extends React.Component {
  render() {
    return (
      <>👈React.Fragmentの代用。（<React.Fragment>でもよい。)
        <td>Hello</td>
        <td>World</td>
      </>
    );
  }
}
```
すると最終的に以下のコードが返ってくるイメージ。

```html
<table>
  <tr>
      <td>Hello</td>
      <td>World</td>
  </tr>
</table>
```
余計な<div>がないため、デザイン崩れ等の対策となるようです。

# < React.Fragment >と< div>< /div>で要素を囲った時の違い
前者ではkeyを持つことができる。現時点では、フラグメントに渡せる唯一の属性のよう。
将来的にはもっと増えるかも...?
>key はフラグメントに渡すことができる唯一の属性です。将来的には、イベントハンドラのような他の属性を渡すこともサポートするかもしれません。

とのこと。
結局、デザインのこととか考えるとfragmentを使用した方がいいのか？？？書くのも楽そうだし...

# < React.Fragment >と< div>< /div>で要素を囲った時の違い2
・単純に< React.fragment >を使用する方が時間がかかるようです。
スタイルを当てないからdivタグ使わずにReactFragment使っちゃえ〜、という考え方は安直なのかもしれない...

#結論
結局、時間がかかってもスタイル崩れや余計な要素までreturnしてしまうことを考えればReactFragmentを利用するのが無難なのかもしれないが、どういった仕組みなのかは理解しておいた方がいいだろう、というふわっとした結論に行き着いてしまった。。。


#参考
公式ドキュメント

https://ja.reactjs.org/docs/fragments.html#short-syntax

こちら、fragmentと<div>タグを使用した際の比較をまとめてくれている記事です。
ありがとうございます。。。


https://zenn.dev/januswel/articles/c80ac055b72955d71d41
GitHub　git subtreeの使い方

# はじめに

git subtreeの軽いまとめです。

git submoduleはリモートをコミットIDで管理しますが、subtreeは登録したレポジトリのコミットにsubtreeで登録したレポジトリの変更を含めます。

subtreeを使用すると、サブのリモートレポジトリの変更がメインのレポジトリの変更に加わるので、コードレビューがやりやすくなります。

メインのレポジトリの開発で、サブのレポジトリも共に開発が行われるようなケースにおいて、メリットが大きいです。

サブのレポジトリの変更が頻繁ではない場合や、コミット単位でサブのレポジトリを使いたい場合はsubmobuleの方が適しています。

ただ、環境ごとに設定する必要があることと、設定したことを忘れいていると結局使わないってことにもなりがちなので、あまりおすすめはしません。

## リモートの登録

```terminal
git remote add <任意のリモート名> <レポジトリのURL>
git remote add libft git@github.com:kohkubo/libft_v3.git
```

## subtreeのインポート

```terminal
git subtree add --prefix=<サブディレクトリのパス> <リモート名> <リモートのブランチ名>
git subtree add --prefix=lib/libft libft main
```

## 子のレポジトリのpush, pullについて

親のレポジトリでは、subtreeを使用する際に特が必要なことはありません。
子のレポジトリに対して、行った変更を反映させたい段階、もしくは、子のレポジトリの更新を受け取りたいときにgit subtreeコマンドを使ってpushやpullをすることになります。

### subtreeをpushする

subtreeに関連のあるcommitをした後、subtreeにpushすることで、レポジトリに変更を反映させることができます。

```terminal
git subtree push --prefix=<サブディレクトリのパス> <リモート名> <リモートのブランチ名>
git subtree push --prefix=lib/libft libft main
```

### subtreeをpullする

```terminal
git subtree pull --prefix=<サブディレクトリのパス> <リモート名> <リモートのブランチ名>
git subtree pull --prefix=lib/libft libft main
```
RAIDコントローラーとは

## 勉強前イメージ

データの割り振りはRAIDコントローラーを通ってる？

## 調査

### RAIDコントローラーとは

複数のストレージを1台のように運用する
ディスクやデータの管理を行う機械のこと。

ストレージの状態を管理し、データの読み書きの窓口となる機械で、
形状としては半導体チップや、それを組み込んだ電子基板の形で入っている。
RAIDコントローラーで制御されるRAIDのシステムをハードウェアRAIDという。
逆にソフトウェアRAIDもある。

ソフトウェアRAIDよりもCPUの不可は少ないが、
導入コストはハードウェアRAIDの方が高い。

## 勉強後イメージ

全部RAIDコントローラーを通して
データが書き込まれてるみたい。。
てことは壊れたら書き込まれないのか

## 参考

- [RAIDコントローラ 【RAID controller】 ディスクアレイコントローラ](https://e-words.jp/w/RAID%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9.html)
MFA 登録する

## ユーザ作成

- ユーザを追加

まずrootアカウントでユーザを作成します。

![1IAM Management Console - Google Chrome 2021-08-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/8d7fa0d2-4d6a-18fe-1e9f-06b346fb4258.png)


- ユーザの詳細設定

ユーザを作成します。
ユーザ名とパスワードどうするか、コンソールへのアクセスどうするかなど設定します。

![2IAM Management Console - Google Chrome 2021-08-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/918b06b0-dab6-495b-aaaa-62786fe0f1e3.png)


- アクセス許可の設定

今回は一旦こちらをアタッチします。

![20IAM Management Console - Google Chrome 2021-08-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/7045583f-12a0-325b-1f21-b4d954922f82.png)



- タグの追加

タグはなし。

- 最終確認

問題なければ作成します。

![21IAM Management Console - Google Chrome 2021-08-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/c9741665-f168-d2f8-0078-c4c4e8871b4d.png)



- パスワード確認

qiita_testユーザのパスワードを確認します。

![5IAM Management Console - Google Chrome 2021-08-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/04a25f86-92d9-56a6-dd8b-c78229b642e0.png)


## ログイン

- ログイン

![7Amazon Web Services Sign-In - Google Chrome 2021-0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/4a446a5f-f59d-feeb-94dc-829ca131fadc.png)


- パスワードの再設定

ログインが完了する前に、パスワードの再設定を行います。

![6Amazon Web Services Sign-In - Google Chrome 2021-0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/923d19ab-d03e-b404-778a-25b60c607193.png)


- ログインできました

![8AWS Management Console - Google Chrome 2021-08-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/a4bf28b9-905a-d991-49a2-0d84ad93c1c2.png)


## MFAの設定

- MFAの設定

マイセキュリティ資格情報へ進む。

![9IAM Management Console - Google Chrome 2021-08-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/a316920f-f767-3cde-a5a3-8468891c9720.png)


- MFAの割り当て

MFAデバイスの割り当てを行います。

![10IAM Management Console - Google Chrome 2021-08-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/dc849372-6fdb-8456-ab0a-5e6707003bf0.png)


- MFAデバイスの管理

![11IAM Management Console - Google Chrome 2021-08-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/1f6c2ecc-35db-2774-1a63-e43d76662083.png)

- 仮想 MFA デバイスの設定

「Google認証システム」 というスマホのアプリでQRコードを読み込みます
QRコードを表示 をクリックするとQRコードが表示されます

![22IAM Management Console - Google Chrome 2021-08-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/324e4652-41de-11a1-7d72-20ba74d1d938.png)


また、「連続する 2 つの MFA コードを以下に入力」 で
MFAコード1,2にスマホで表示された数字を入れます。
MFAコード1に1回目。数字が変わったらMFAコード2に2回目を入れます。

![23IAM Management Console - Google Chrome 2021-08-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/5787b4b1-4c9c-9d7d-5291-408fa4d61225.png)


- 再度ログイン

先ほどと同様にログインします。

![24Amazon Web Services Sign-In - Google Chrome 2021-0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/517fc8a6-3e34-7acb-f6d8-5182ea9fca08.png)


MFA認証の数字を入れて、送信を行うと
ログインします。

![25Amazon Web Services Sign-In - Google Chrome 2021-0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/f33462ac-577e-c34b-3d01-29778e784d67.png)
【1章】コマンドラインを学ぼう

今回はコマンドラインについての記事を書いていきたいと思います！
コマンドと呼ばれる命令を使うことで、コンピュータに様々なプログラムを実行させることができます。
特にUNIXコマンドにおいて開発をする上で最低限必要な基礎知識を学んでいきたいと思いますのでよろしくお願いいたします！

##コマンドラインとは
コマンドラインとは、普段クリックなどをしてコンピュータを操作をするのに対して、文字だけでコンピュータを操作するためのものです。今回はUNIXコマンドについて学びますが、主にLinuxやmacOSで利用されるコマンドの一種です。

##コマンド（命令）
ターミナルと呼ばれるものにコマンド（命令）を入力することで、コンピュータに指示を与えることができます。

##ファイルを作成するコマンド
まずは、ファイルを作成するコマンドを見ていきます。ファイルを作成するには、**touch**コマンドを使います。

```ruby:ターミナル
 $ touch ファイル名
```

**「touch ファイル名」**と入力して実行することで、空のファイルを作成することができます。コマンドは入力した後にEnterキーを押すことによって、実行することができます。

##ファイルの中身を表示する
**catコマンド**を使うことで、ファイルの中身を表示することができます。
catコマンドは**「cat ファイル名」**と入力することで使うことができます。

```ruby:ターミナル
 $ cat ファイル名
```

catコマンドを実行したときに、存在しないファイルを指定すると下記のようなエラーが出力されます。エラーが出た場合、実行したコマンドは無効になりますので注意してください。

```ruby:ターミナル
 $ cat ファイル名  #存在しないファイル名だった場合

cat: ファイル名: No such file or directory #エラー文が表示される
```

##補完機能
コマンドラインには**補完機能**というものがあり、ファイル名やフォルダ名を入力するときにファイル名の入力途中に**Tabキー**を押すことで、残りのファイル名を補完してくれる機能です。これを使うことにより、効率が良くなるだけでなく、先程のような存在しないファイル名によるエラーなどを防ぎやすくなります。

##ディレクトリを作成する
コマンドを用いて、新たにフォルダを作成することもできます。ちなみに、コマンドラインではフォルダを**ディレクトリ**と呼びますので、注意してください。ディレクトリを作成するには、**mkdirコマンド**を使います。

```ruby:ターミナル
 $ mkdir ディレクトリ名
```

mkdirコマンドは「mkdir ディレクトリ名」と入力することで使うことができます。

##ディレクトリの移動
コマンドラインでは、ファイル構造を意識することが大切です。例えば、touchコマンドを実行すると自分が今いるディレクトリ内にファイルが作成されます。
では、「html」というディレクトリを作成したとします。「html」というディレクトリの中に新しいファイルなどを作成したい場合には、基本的に「html」ディレクトリに移動してから作成する必要があります。また、自分が今いるディレクトリを**カレントディレクトリ**と言います。

ディレクトリを移動するためには**cdコマンド**を使います。
**「cd ディレクトリ名」**とすることで、指定したディレクトリに移動することができます。

```ruby:ターミナル
 $ cd ディレクトリ名
```

cdコマンドでも、存在しないディレクトリを指定するとエラーが出力されます。また、指定できるのはディレクトリ名だけでファイル名を指定することはできませんので注意してください。

##カレントディレクトリを確認する
コマンドラインでは、現在作業しているディレクトリを把握していることが大切です。そのため、作業中のディレクトリを確認するには**pwdコマンド**を使います。

```ruby:ターミナル
 $ pwd
```

##ディレクトリの中身を表示する
ディレクトリを移動するときなどには、ディレクトリの中身を見れた方が便利です。ディレクトリの中身を確認するには、**ls（エルエス）コマンド**を使います。

```ruby:ターミナル
 $ ls
```

lsコマンドで確認できるディレクトリとファイルは、基本的には1つ子の階層だけです。

##1つ親のディレクトリ
cdコマンドでディレクトリを移動する方法を学びましたが、**1つ親のディレクトリに移動するときに「cd 1つ親のディレクトリ名」としても移動することができません。**
コマンドラインでは、1つ親のディレクトリを**「..」**で指定します。
よって、1つ親のディレクトリに移動したい場合のコマンドは**「cd ..」**となります。

```ruby:ターミナル
 $ cd ..
```

##ディレクトリを指定しないcdコマンド
cdコマンドでは、ディレクトリを指定せずに「cd」のみで実行すると、ホームディレクトリと呼ばれるディレクトリに移動することができます。ホームディレクトリは、ユーザーが作業をするときに起点にするディレクトリのことを言います。

今回はここまでとし、次章ではファイルやディレクトリを移動や名前変更、コピーや削除に関する操作をコマンドを使って行っていきたいと思います。
最後までご覧いただきまして、ありがとうございました！
Androidの画像ライブラリ（Picasso、Glide）のセットアップと使用方法


仕事で画像表示を表示する処理を扱うことがあり画像ダウンロードやキャッシュを
良しなに扱ってくれるライブラリの「Picasso」「Glide」を調べたので
基本的な情報をメモ程度の内容で記載します。

## Picasso

Squareが開発したライブラリ
GithubのURLは[こちら](https://github.com/square/picasso)

## Glide

Googleが開発したライブラリ
GithubのURLは[こちら](https://github.com/bumptech/glide)

双方のライブラリ共にコード１行で基本的には画像読み込みから
ImageViewに画像を設定することが可能になります。

## セットアップ

```build.gradle
repositories {
  //Glideを使用するために設定
  google()
  mavenCentral()
}
```

```app/build.gradle
dependencies {
  //Picassoを使用するために設定
  implementation 'com.squareup.picasso:picasso:2.71828'

  //Glideを使用するために設定
  implementation 'com.github.bumptech.glide:glide:4.12.0'
  annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
}
```

```AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="パッケージ名">

　　//インターネット上の画像を取得する場合は追加
    <uses-permission android:name="android.permission.INTERNET" />

</manifest>
```


## 使用方法

・画像を取得して表示する場合

```MainActivity.kt

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        //取得した画像を表示するImageView
        val imageView = findViewById<ImageView>(R.id.image)

        //Picassoを使用して画像を表示する場合
        Picasso.get()
            .load("表示したい画像URL")
            .into(imageView)

        //Glideを使用して画像を表示する場合
        Glide.with(this)
            .load("表示したい画像URL")
            .into(imageView)
    }
}

```

`load `メソッドに表示したい画像のURLを設定し`into `メソッドに画像を適用するimageViewを設定

・画像を取得に失敗したときのエラー画像を表示する場合

```MainActivity.kt

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        //取得した画像を表示するImageView
        val imageView = findViewById<ImageView>(R.id.image)

        //Picassoを使用した場合
        Picasso.get()
            .load("表示したい画像URL")
            .error("エラー時に表示したい画像名")
            .into(imageView)

        val requestOptions = RequestOptions()
            .error("エラー時に表示したい画像名")

        //Glideを使用した場合
        Glide.with(this)
            .load("表示したい画像URL")
            .apply(requestOptions)
            .into(imageView)
    }
}

```

Picassoの場合は`error `メソッドに表示したい画像名を設定します。
Glideの場合は`RequestOptions() `を作成して作成した`RequestOptions() `変数を`apply `設定で可能になります。
エラー時の画像は基本的には`drawable `ファイル内に保存されていると思うので`R.drawable.画像名 `と設定すれば問題ないかと考えます。


## 最後に
PicassoとGlideのセットアップ方法と基本的は使用方法を今回は記載しました。
メモ書き程度の内容になりますが以上になります。
【unity】

DynamicBoneでボーン変形するオブジェクト
回転するオブジェクトの先端に子オブジェクトとしてつけた時と、独立させてscriptで座標を合わせた時、
その動作はほとんど変わらない
角度等参照せず、座標だけで動作を制御してるっぽい
centos 空き容量チェック

エラーが出た

結論
vps の 空き容量不足。
よってファイルを削除すれば良い。

```

FTPのエラー
[2021/08/29 11:33] Failed to transfer file 'C:\Users\xxx\config\cache.php': could not put FTP file "ftp://xxx/config/cache.php".
[2021/08/29 11:33] Automatic upload completed in 209 ms: 1 item failed

Laravelのエラー
ErrorException (E_WARNING)
file_put_contents(): Only 0 of 8977 bytes written, possibly out of free disk space

/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php122
/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php122

```

# 対応

```

df -h

/dev/vda2        50G   49G   49G  99% /
devtmpfs        911M     0  911M   0% /dev
tmpfs           920M     0  920M   0% /dev/shm
tmpfs           920M   17M  904M   2% /run
tmpfs           920M     0  920M   0% /sys/fs/cgroup
tmpfs           184M     0  184M   0% /run/user/1000
tmpfs           184M     0  184M   0% /run/user/994


```

おや？ /dev/vda2 が重いです。
はい。では、まずはhtml置き場まで移動

`cd /var/www/html/`


```

du -h --max-depth=1
998M    ./aaa.net
2.9G    ./bbb.com
5.1M    ./munin
8.0K    ./acme
22.9G    ./ccc.net
15G     .

```

はい、ccc.net いりませんので消しましょう


フォルダごと消すので、 rm コマンドは注意して使ってね！

```

rm -rf ccc.net


```

はい、これで容量が空きました。
OSとは

#はじめに#
　パソコンに関わる仕事をしている人だけでなく、一般的にOSという言葉はよく耳にするのではないでしょうか。
「あー、WindowsとかMacとかのことでしょ？」
という人は少なくないと思いますが、正確に説明できる人は少ないと思います。
今回はそんなOSについてまとめていきたいと思います。


#OSとは#
>オペレーティングシステム（英: Operating System、略称:OS、オーエス）とは、コンピュータのオペレーション（操作・運用・運転）を司るシステムソフトウェアである。

↑(Wikipediaより引用)
　この通り、OSとはコンピュータを操作してくれるソフトウェアのことです。これはパソコンに限らず、スマートフォンやデジタル家電にも入っています。
　
　もう少し具体的に言うと、例えばパソコンを操作する際、マウスでカーソルを動かしてクリックしたりキーボードを叩いて文字を入力したりしますよね。あれはOSがマウスやキーボードといったデバイスからの信号をキャッチしてアプリケーションに伝えているからこそ成り立っています。
　他にも主記憶装置や外部記憶装置の管理、他のネットワークとのデータ通信制御などの役割を担っています。これらは多くのソフトウェアで共通して利用される機能で、OSはそういった機能を備えた最も基盤となるソフトウェアになります。パソコンがパソコンとして機能するためにはOSが必須ということです。

#OSの種類#
　OSにはいくつかの種類があります。中でも主要なものをご紹介していきます。

・パソコン
【Windows】
　Microsoft社が開発したパソコンに搭載されているOSです。パソコンのOSでは約80％のシェアを誇っています。
【MacOS】
　Apple社が開発したパソコンに搭載されているOSです。初めてGUIが導入されたことで知られています。
【Linux】
　Windows、MacOSに次いで多く使われているOSです。無料で配布されているオープンソースであることが特徴です。現在も有志で改良が続けられています。

・スマートフォン
【iOS】
　Apple社が開発したOSで、iPhoneシリーズに搭載されています。
【Android】
　Google社が開発したOSで、iPhoneシリーズ以外のスマートフォンに搭載されています。


#まとめ#
　OSとは何か、OSの種類についてまとめてきました。
　いずれにしても、もはや我々の生活には欠かせないものと言っても過言ではないでしょう。また、プログラミングを学習する上で最も基盤となる知識の一つなのでしっかり押さえておきましょう。
GRUB と U-boot の比較

# GRUB

PC の場合は GRUB を使うことが一般的。

## 非UEFI BIOS の場合：

- BIOSが起動
- ブートメディアのブートローダー(ハードディスクなどの場合は最初のセクタ)から GRUB ステージ1として boot.img を起動
- 必要に応じ、GRUB ステージ1.5としてcore.img を起動
- ファイルシステムから /boot/grub などの中にある GRUB ステージ 2 を起動
- カーネルを起動

## UEFIの場合：

- UEFI が起動
- ブートメディアの UEFI システムパーティション 中のEFIアプリケーションとして grub.efi や grubx64.efi などを起動
- カーネルを起動

## カーネルを起動したあと

- カーネルとして vmlinuz を起動(bzImage形式の自己解凍ファイル)
- 初期 RAM ディスクとして initrd ないし initramfs を展開し初期ルートファイルシステムとしてマウント
- RAMディスク内の /linuxrc ないし /init を起動し、ストレージ内の本番ルートファイルシステムを初期ルートファイルシステムに代わってマウント
- 本番ルートファイルシステム内の /sbin/init を実行

# U-boot

組込みシステムの場合は U-boot を使うことが一般的

※ 調査中

- マイコンの内蔵メモリからブートコードがステージ1として起動
- ブートコードにより、U-boot が起動
- uImage 形式のイメージを参照
- uImage ヘッダから展開先アドレスなどを取得、uImage ペイロードを検証
- uImage ペイロードを必要に応じ解凍、指定アドレスに展開
- 展開したカーネルを起動

## uImage 基礎知識

U-boot で読み込める形式は2つ

- zImage 形式
- FIT 形式

FIT形式は署名などが付けられます
eslint において、 while(1)で警告が出るのを.eslintrc.json の設定で回避する方法

## 動作環境
```
$ node -v
v15.14.0
$ npm -v
7.7.6
$ npm list --depth=0
eslint@7.32.0
```

# 目的
- eslint を使っていて、 `while(1)`を書くだけでeslintの警告が出るのをなんとかしたい。

## コードを変えて警告を回避する方法
- .eslintrc.json 設定を変更しない場合は、以下のように変更して回避する

```
  [NG] while (1) {}
  [OK] for (;;) {}
```

## .eslintrc.jsonを設定して回避する方法
- .eslintrc.json 設定を変更して回避する場合は、以下のように指定する。

```
  "rules": {
    "no-constant-condition": 0
  }
```
【Web API The Good Parts】を読んだメモ

# なにこれ
Web API The Good Parts
という本を読んだメモ

# 2章
## URIの設計の原則
### 短く入力しやすいURI
- 無駄な名前を含めるな(get_ とか service_とか

### 人間が呼んで理解できるURI
- 省略語を使うな(addrとかsvとか

### 大文字小文字が存在してないURI
- product id 1~100はこのAPI、101以降はこのAPIみたいなことをするな


### 改造しやすい（Hackable）なURI
### サーバ側のアーキテクチャが反映されてないURI（.phpみたいな）
### ルールが統一されたURI

覚えやすくどんな機能を持つURIなのかがひと目で分かる

エンドポイントには極力動詞をつけない。get post putでどの処理か分かるので

URLはハイフン繋ぎが良い。理由はgoogleのSEO的にハイフンだと別単語で認識する。アンダースコアは繋げるから(ただしjson apiは知らん、フロントの話っぽいから)

## SSKDs
Small Set of Known Developers

## LSUDs
Large Set of Known Developers 

覚えやすく機能が一目でわかるエンドポイントに
適切なhttpメソッドを使え
英単語、単数形と複数形に注意

# 3章 

キャメルかスネークか統一しろ！混ぜるな危険

user registration data timeは
registerdAtにできる。userリソースだからuserいらない

性別は文字列で表現が大多数

レスポンスはできるだけフラットに！
エラーの形式を統一、クライアントがエラー詳細を理解できるように

# web apiチェックリスト
- URIが短く入力しやすい
- URIが人間が呼んで理解
- URIが小文字のみ
- URIが改造しやすいか
- URIのルールは統一されてるか
- 適切なHTTPメソッドを利用しているか
- URIで利用する単語は、多くのAPIで同じ意味に利用されているものを選んでいるか
- URIで使われている名詞は複数形か
- URI中にスペースやエンコードを必要とする文字が入ってないか
- ページネーションは適切に設計されてるか
- データ形式の指定には、クエリパラメーターを使う方法をサポートしているか
- response.bodyの内容はクライアントから指定できるか
- データの構造は可能な限りフラットになってるか
- response.bodyとして多くのAPIで同じ意味に利用されてる一般的な単語を選んでるか
- response.dataはなるべく少ない単語数で表現してるか
- 複数の単語を連結する場合、API全体を通して統一してあるか
- response.bodyで変な省略形を使用していないか
- response.body名は単数形 or 複数形と合ってるか
- error時にはクライアントが原因を切り分けられる情報を含んでるか
- 適切なステータスコードが返るか
- メンテナンス時には503を返すようになってるか
- APIのversionは管理されているか
【初心者向け】バリデーションについて〜Laravel〜

今回は、バリデーションの概要と設定方法、エラーメッセージの表示方法について説明します。
#バリデーションとは
バリデーションとは、ユーザーが入力した情報がその仕様や文法などに照らして適切な形式で記述されているかをチェックするための仕組みです。
たとえば、数字で入力してもらいたい年齢欄に名前を漢字で入力されたらサービスの提供を適切に行えなくなってしまいますよね。
それを防ぐためにバリデーションを利用します。

#バリデーションの設定方法
コントローラーのアクション内に以下のように記述すれば、バリデーションを設定することができます。

```php:〇〇Controller.php
$rules([
    '連想キー（カラム名）' => 'バリデーションルール',
]);
$this->validate($request, $rules);
```

複数のバリデーションルールを設定したいときは、「｜」を使って繋げて記述します（例：'required | max:500'）。

バリデーションは、送信された情報が要求した形式に合致していなかったらフォーム画面が再表示される仕様になっているため、このままでは、ユーザーはフォームがちゃんと送信できたのか、今の送信は何がだめだったのかが分かりません。
そこで、ユーザーにも分かるようにエラーメッセージを表示し、再入力しやすいように入力した値はフィールドに残してあげます。

#エラーメッセージの表示方法
フォームを用意したテンプレートを以下のように修正していきます。

```php:index.blade.php
<div>
    @error('カラム名')
    <span class="input-error">{{ $message }}</span>
    @enderror
    <input type="text" name="name" value="{{ old('カラム名') }}">
</div>
```
このようにすることで、カラムごとにエラーメッセージを表示してあげることができます。
また、inputタグにvalue="{{ old('カラム名') }}"を入れてあげることで、前回入力した値が再表示されるようになります。

#エラーメッセージの日本語化
このままだと、エラーメッセージは英語で表示されてしまうので、日本語に変えたい人は以下の設定が必要になります（やり方は何通りかあります）。

1) config>app.php内に記述されている'locale'=>'en'を'locale'=>'ja'に修正します。
2) resources>lang内に「ja」というディレクトリを作成し、その中にvalidation.phpファイルを作成します。
3) resources>lang/en>validation.phpの中身を2)で作ったvalidation.phpにコピペします。
4) ja>validation.php内の該当するバリデーションルールのThe以降の部分を日本語に書き換えます。

以上で、自分が表示させたい日本語のエラーメッセージが表示されるようになります。
別のやり方は調べたらいろいろ出てくると思うので、ググって自分が1番いいと思う方法で実装してみてください。
S3 オブジェクトをプレフィックス・サフィックス両方で検索する

s3 でプレフィックス、サフィックス両方を使ってオブジェクトを取得したいとき、
boto3のメソッドはプレフィックスのみでしか検索できなくて少し不便だったので自作の関数を用意して実装しました。

引数`suffix`に正規表現で検索文字を入れると、ヒットするオブジェクトが配列で返ってくる

```python
import boto3
import re
def get_s3_objects(bucket, prefix, suffix):
    suffix += "$" # 末尾文字を付与
    s3 = boto3.client("s3")
    obj_list = s3.list_objects_v2(Bucket=bucket, Prefix=prefix)["Contents"]
    obj_list = list(filter(lambda x: re.compile(suffix).search(x["Key"]), obj_list))
    return obj_list
```
crontab可視化ツールcronvお試し


crontabの実行タイミング(スケジュール)を良い感じに可視化してくれるツールを探していたときに見つけた`cronv`を試してみます。

- https://github.com/takumakanari/cronv

![cronv_overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59081/8bcb5535-fdd4-6a9b-5379-8128cf961378.png)

# 環境

- MacOS

# goコマンドインストール

インストールはgoでビルドするようなので、まずはgoをインストール。

```bash
$ brew install go

$ go version
go version go1.17 darwin/amd64
```

# cronvインストール

READMEとは少し違うのですが、以下のようにやったらインストールできました。

```bash
$ go get github.com/takumakanari/cronv/cronv
$ chmod -R +w ~/go
$ cd ~/go/pkg/mod/github.com/takumakanari/cronv@v0.5.0
$ go build -o ./cronv github.com/takumakanari/cronv/cronv
$ cd cronv
$ ./cronv --help
Usage:
  Cronv v0.4.1 [OPTIONS]
  :
```

# 試しに生成する

```bash
$ cd ~/go/pkg/mod/github.com/takumakanari/cronv@v0.5.0/cronv
$ cat ../example/crontab | ./cronv -o ./my_cron_schedule.html
$ open .
```

良い感じです。

![open.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59081/9824cc89-ca24-2928-560e-429826e3ee81.jpeg)

![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59081/4ece9924-81f0-ec11-bdd8-16a9d9c12b44.png)

細かいオプションもろもろは [README](https://github.com/takumakanari/cronv/blob/master/README.md) にいろいろ記載があるため、そちらを参照してみてください。

以下、自分用メモ。

```bash
# 2020/08/31 00:00 から 1日分 の crontab をビジュアライズ
cat ~/git/crontab/batch_srv/crontab.txt | ./cronv -o ./batch_srv.html -w 180  --from-date '2020/08/31' --from-time '00:00' -d 1d --title batch_srv
```
SSH接続で WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!の対処法

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
```
初見だとみんなビビるこのエラーに毎回当たるので
ここいらでメモ

# エラー内容
SSHホスト鍵が変わってるよ！って怒られてる
過去にssh接続したサーバーと同じIPに接続しているのに
接続先の公開鍵情報がknown_hostsに書かれている内容と変わっていると出る

## 前提：known_hostsとは
ssh接続を一度でも行なったサーバのホスト鍵(公開鍵と秘密鍵のセット)の情報がknown_hostsというファイルに格納される
テキストファイルなのでcatコマンドで確認可能
場所：~/.ssh/known_hosts
`[host],address 暗号スイート 公開鍵`
で記述されている

# 対処法
known_hostsから情報を削除する

```
$ ssh-keygen -R [接続先ip]
```
# 参考

> https://l-w-i.net/t/openssh/auth_001.txt
[シリーズ 全2回] オンプレでの動的プロビジョニング用 NFS サーバの構築手順メモ

# 概要

Kubernetes (k8s) の静的および動的プロビジョニングの動作確認のために、
下表の通り PC 2台を準備して、オンプレ上に NFS を構築したときの記録である

|No|用途|k8sノード名|形態|IP|OS|NIC|備考|
|:--|:--|:--|:--|:--|:--|:--|:--|
|1|k8sマスタ|PC1|物理ホスト|192.168.10.115|Ubuntu18.04|eno1|NFSサーバ にする|
|2|k8sノード|node01|物理ホスト|192.168.10.84|Ubuntu18.04|eno1|NFSクライアントにする|


|コンテンツ|実践時期|
|:--|:--|
|[[01] オンプレでの動的プロビジョニング用 NFS サーバの構築手順メモ (サーバ側)](https://qiita.com/robozushi10/items/2059127eb7dcafe8a52d)|2021/06|
|[[02] オンプレでの動的プロビジョニング用 NFS サーバの構築手順メモ (クライアント側)](https://qiita.com/robozushi10/items/2059127eb7dcafe8a52d)|2021/06|