OmniAICreator/Qiita-1.07M huggingface dataset:
LPIC102試験直前見直し用チートシート(シェルとシェルスクリプト編)

# はじめに
LPIC102(シェルとシェルスクリプト分野)で問われやすいコマンドや要点などをまとめた記事です。
寝る前の10分でざっと読んで各単元の復習に活かすも良し、試験直前に読んで最後の詰め込みに使うも良しです。
このシートがLPIC102を受けられる方の支えになれば幸いです。

# チートシート(シェルとシェルスクリプト分野)

**コマンドとオプション**

| コマンド | 説明 |
|:-|:-|
|set|シェルや環境変数の表示<br>-o：オプションの設定状態を表示<br>-o オプション：オプションを有効化<br>+o オプション：オプションを無効化|
|declear|変数を宣言<br>-f：定義済みの関数を表示|
|function|関数を定義|
|export|シェル変数を環境変数として登録
|alias|エイリアスを設定<br>書式：alias エイリアス='コマンド'<br>(オプションなし：登録されているエイリアスの表示)|
|unalias|指定したエイリアスを削除<br>-a：エイリアスを全削除|
|env|現在の環境を表示/変更後の環境で指定したコマンドを実行<br>-i：環境変数が設定されていない状態にする<br>-u：環境変数を一時的に削除|
|unset|指定した環境変数を削除|
|read|シェルスクリプト内で標準入力からの入力を受け付ける際に利用|
|source|現在のシェルでスクリプトを実行(.で置き換えることも可能)|
|seq|連続した数値を自動的に生成<br>x y z：xからzまでyずつ増加<br>x y：xからyまで1ずつ増加<br>x：1からxまで|
|exec|指定したコマンドを既存のジョブに置き換えて実行|

**setコマンドの主なオプション**

| オプション | 説明 |
|:-|:-|
| allexport | 作成/変更した変数を自動的にエクスポート |
| emacs | emacs風のキーバインドにする |
| ignoreof | Ctrl + D でログアウトしないようにする |
| noclobber | 出力リダイレクトによる上書きを禁止 |
| noglob | メタキャラクタを使ったファイル名展開を無効 |
| vi | vi風のキーバインドにする|
| noexec | 実際には実行せず確認のみ行う |

**testコマンドの主な条件式**

| 条件式 | 説明 |
|:-|:-|
|-f|ファイルが存在すれば真|
|-d|ディレクトリが存在すれば真|
|-r|ファイルが存在かつ読み取り可能であれば真|
|-w|ファイルが存在かつ書き込み可能であれば真|
|-x|ファイルが存在かつ実行可能であれば真|
|-L|シンボリックリンクが存在すれば真<br><font color="Red">Lは大文字であることに注意</font>|
|-e|パスが存在すれば真|
|ファイル1 -nt ファイル2|ファイル1の修正時刻がファイル2より新しければ真|
|ファイル1 -ot ファイル2|ファイル1の修正時刻がファイル2より古ければ真|
|数値1 -eq 数値2|数値1と数値2が等しければ真|
|数値1 -ge 数値2|数値1が数値2以上であれば真|
|数値1 -gt 数値2|数値1が数値2より大きければ真|
|数値1 -le 数値2|数値1が数値2以下であれば真|
|数値1 -lt 数値2|数値1が数値2未満であれば真|
|数値1 -nt 数値2|数値1が数値2と等しくなければ真|
|文字列1 = 文字列2|2つの文字列が等しければ真|
|文字列1 != 文字列2|2つの文字列が等しくなければ真|
|条件1 -a 条件2|両方の条件式が真であれば真<br><font color="Red">&&ではないことに注意</font>|
|条件1 -o 条件2|いずれかの条件式が真であれば真<br>|


:::note
英語に直して考えれば全て暗記する必要はない。(例. ge = greater equal)
:::

**bashログイン時に読み込む環境設定ファイルの順序**

|順序| ファイル | 説明 | 備考 |
|:-|:-|:-|:-|
|1|/etc/profile |ログイン時に実行され、全ユーザから参照される<br>**環境変数**などを設定 |  -|
|2|/etc/bash.bashrc|bash起動時に実行され、全ユーザから参照される|Debian系のみ|
|3|~/.bash_profile|ログイン時に実行される<br>ユーザ独自の**環境変数**などを設定|-|
|〃|~/.bash_login|ログイン時に実行される|~/.bash_profileが存在しない場合に読み込まれる|
|〃|~/.profile|ログイン時に実行される|~/.bash_loginも存在しない場合に読み込まれる|
|4|~/.bashrc|bash起動時に実行される<br>ユーザ独自の**エイリアス**などを設定|-|
|5|/etc/bashrc|~/.bashrcから参照される|-|
|ログアウト時| ~/.bash_logout| ログアウト時に実行される |

**対話型シェルを起動した際に読み込まれるファイル**

|順序| ファイル | 説明 |
|:-:|:-|:-|
|1| ~/.bashrc | ユーザ個別ファイル |
|2| /etc/bashrc | 全体設定用(RedHat系) |
|〃| /etc/bash.bashrc | 全体設定用(Debian系) |

**制御構文**

```md:if文
if 条件式
then
　実行文1
else
　実行文2
fi
```

```md:for文
for 変数名 in 値のリスト
do
　実行文
done
```

```md:while文
while 条件文
do
　実行文
done
```

```md:case文(値3以降は省略)
case 式 in
　値1)
　　実行文1) ;;
　値2)
　　実行文2) ;;
esac
```

:::note
基本的な制御構文の書式は暗記しておく。case文の;;などは忘れがちなので注意
:::

**スクリプトに渡す引数**

| 変数名 | 説明 |
|:-|:-|
|$0|シェルスクリプト名|
|$n (n=9以下の数値)|n番目の引数|
|${N} (N=10以上の数値)|N番目の引数|
|$#|引数の数|
|$@|すべての引数 (スペース区切り)|
|$*|すべての引数 (環境変数IFS区切り)|
|$?|直前に実行されたコマンドの終了ステータス|
|$$|現在のシェルのプロセス番号|

# LPIC102対策用チートシート リンク集
[ユーザーインターフェースとデスクトップ] (https://qiita.com/kjstudy_englife/items/44cc9d5585e1aff73e4d)
[管理タスク] (https://qiita.com/kjstudy_englife/items/dd01a5ad684ea1cc9194)
[必須システムサービス] (https://qiita.com/kjstudy_englife/items/e7c587744b486f0f90f7)
2つのSpreadsheetをGASで差分チェックする方法

## 概要

スプレッドシートを使っているとたまにDiffを見たいときってありませんかね？
私はあります。

スプレッドシートのままDiffができたらいいんですが、ググってると全然見つからないので一度Excelに出力してExcel形式でDiffを見る方法も考えたんですが、Windows関連しか記事が見つからず、参考になる記事を見つけたとしても野良アプリをインストールして使う方法ばかりでセキュリティ的にそれはやりたくないという・・・

一応、以下の記事が参考になりそうだったんですが、StackOverflowの記事は差分をビジュアライズする機能はなく、Officeの杜さんが正しくやりたいことをまとめられていたものの200行以上のコードがあってわかりづらいなと思い、自分でもGASで軽量なDiffツールを作ることにしました笑

- [Google Apps Scriptで2つのスプレッドシートの差分を取り出してみる](https://officeforest.org/wp/2021/01/30/google-apps-script%E3%81%A72%E3%81%A4%E3%81%AE%E3%82%B9%E3%83%97%E3%83%AC%E3%83%83%E3%83%89%E3%82%B7%E3%83%BC%E3%83%88%E3%81%AE%E5%B7%AE%E5%88%86%E3%82%92%E5%8F%96%E3%82%8A%E5%87%BA%E3%81%97%E3%81%A6/)
- [How do I create a readable diff of two spreadsheets using git diff?](https://stackoverflow.com/questions/114698/how-do-i-create-a-readable-diff-of-two-spreadsheets-using-git-diff)

### 参考記事

- スプレッドシート関連
    - [【GAS】1行で書ける！特定列の最終行・特定行の最終列を取得する方法](https://moripro.net/gas-get-specified-lastcol-lastrow/)
    - [【GAS】スプレッドシートのセルに背景色を設定し、色掛けする方法(setBackground)](https://auto-worker.com/blog/?p=3830)
    - [Spreadsheet Service | Apps Script | Google Developers](https://developers.google.com/apps-script/reference/spreadsheet/)
- Googleドライブ関連
    - [【GAS】Google Apps Scriptでスプレッドシートを複製コピーする方法とは？](https://monoblog.jp/archives/3044)
    - [【GAS/Googleスプレッドシート】ファイル自身が格納されているフォルダの取得方法](https://rikoubou.hatenablog.com/entry/2019/12/05/164851)

## スクリプト

GASに関する初歩的なことは、過去の記事「[GAS 入門（Spreadsheet → GoogleDrive → Slack）](https://qiita.com/gremito/items/ac11f66f8ed3323a5e68)」にまとめているので、初めて触る方は先にこっちを見ていただけるとmm

GitHub Gistにアップしています。
[gremito/diffSpreadsheets.gs](https://gist.github.com/gremito/36fac8050df5e738b8044242180f5e67)

差分を比較する2つのスプレッドシートは、一旦GASにIDをハードコーディングする形にしていますが、Officeの杜さんの記事と同じように[Google Picker](https://qiita.com/howdy39/items/a7de282e6dd5350f7a7c)を使うようしたいのと、差分を見るシート名や行数と列数の指定などもGASにハードコーディングになるので、この辺はそのうち使いやすいように調整したいなと。

やっていることは、以下のフローで処理しています。

1. `SpreadsheetApp.openById()`でスプレッドシート情報を取得
1. `getSheetByName()`で指定したシート毎にシート情報を取得
1. `getRange().getValue()`と``で指定した行数と列数を元にセル情報を取得
1. ↑の差分元と比較元の値が違う場合は差分情報として行数と列数の値をキャッシュ
1. `DriveApp.getFileById()`で差分元のスプレッドシートが管理されているGoogleドライブ情報を取得
1. ↑を元に`DriveApp.getFileById().makeCopy()`で差分元のスプレッドシートを複製
1. キャッシュした差分情報を元に複製したスプレッドシートに`setBackground()`で差分の箇所を色付け


## 実行

テストデータとして以下のスプレッドシートを用意しました。

<img width="300" alt="スクリーンショット 2021-11-03 18.36.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/e2ff9c47-c317-3aa4-0b29-108d76a7d445.png"> <img width="300" alt="スクリーンショット 2021-11-03 18.36.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/cc7b3e53-5432-cbcc-23cc-455a596cad14.png">

どちらかのスプレッドシートからGASを作ってもいいですし、同じ階層にGASを作っても同じように動作します。
GASエディタ上で実行すると以下の結果となります。

<img width="500" alt="スクリーンショット 2021-11-03 18.35.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/454b1718-b82a-5371-5c1f-6f55e274a26e.png">
<img width="300" alt="スクリーンショット 2021-11-03 18.39.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/405986e2-6b6f-3c22-c2f0-adb6a66a2dba.png">


## 課題

ハードコーディングをリファクタリングしたいし、テストデータにあるハイパーリンク有無も差分ありで比較したい。
Blynk の REST API を使う

# まとめ

- https://blynkapi.docs.apiary.io/ は古い。動かない。
- https://docs.blynk.io/en/blynk.cloud/https-api-overview こちらを参照すべき

Blynk の REST API を使おうと思ってググると https://blynkapi.docs.apiary.io/ がトップに出てきます。しかしながらどうやらこれは古い API らしく、これにしたがって書いても動きません。
後者を使いましょう。

古い: 

```shell
$ http "http://blynk-cloud.com/$token/get/V0"
HTTP/1.1 400 Bad Request
access-control-allow-origin: *
connection: keep-alive
content-length: 14
content-type: text/plain;charset=utf-8

Invalid token.
```

ナウ:

```sh
$ http "https://blynk.cloud/external/api/get?token=$token&V2"
HTTP/1.1 200 OK
access-control-allow-origin: *
connection: keep-alive
content-encoding: gzip
content-length: 27
content-type: application/json;charset=utf-8
```

# トラブルシュート
https://docs.blynk.io/en/blynk.cloud/troubleshooting にあるように、GEO DNS の問題に当たることがあるらしい？
【Vue.js】条件付きレンタリング　v-show

#v-showとは
要素のdisplay cssプロパティを切り替えることで表示/非表示を切り替えることができる。

#書き方・解説
```HTML:HTML
<div id="app"> 
 <p v-show="toggle">
    Hello Vue.js!
  </p>
</div>
```
```Vue.js
 var app = new Vue({
   el: "#app",
   data: {
     toggle: false
   }
 })
```

toggleがfalseなのでHello Vue.jsは表示されません。デベロッパーツールを見てみると、

![スクリーンショット 2021-10-24 15.42.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/d4549c4d-d22d-29f1-4742-db7bb86333ec.png)

選択された部分のように`display: none;`とされ非表示にされています。trueの時は問題なく表示されます。
また、v-showの場合、v-ifとは違い`v-else`とくっつけても反映されずエラーが起きてしまいます。
v-ifとv-showは役割は似ていますが、ちょっと違った部分がありますので、別記事で違いを解説したいと思います。



#まとめ
・`display: none;`の切り替えで表示/非表示を切り替えてる。
・v-showはv-elseと続けて書いても反映されずエラーが起こる。


#最後に
今回はv-showについてアウトプットしました。
今回の記事を読んで質問、間違い等あればコメント等頂けると幸いです。

今後ともQiitaにてアウトプットしていきます！

最後までご愛読ありがとうございました！
ERROR: (gcloud.container.clusters.create) ResponseError: code=400, message=Failed precondition when calling the ServiceConsumerManager: tenantmanager::185014: Consumer xxx should enable service:container.googleapis.com before generating a service account.

超初歩的な内容です。
バックエンドエンジニアではないのですが、k8sを少しずつ勉強し始めました。
GKE上でクラスタを作成する際に下記のcommandを叩いたときにタイトルのエラーに遭遇しました。
`gcloud container clusters create k8s --cluster-version 1.21.5-gke.1300 --zone asia-northeast1-a --num-nodes 3`

## 原因
GKEのAPIを有効にしていなかった。。
https://www.edureka.co/community/92987/precondition-serviceconsumermanager-tenantmanager-128906744611

## 対処方法
コマンドでやるなら、
`gcloud services enable service:container.googleapis.com`

GUIでやるなら、「有効にする」ボタンを押しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360150/eda0de25-0326-0c9f-3c5a-457639f623d0.png)
VMware Workstationキャッシュ削除

ホストOS：CentOS Stream 8
VMware Workstation 16.1.2

ホームパーティション`/home`が知らないうちに使用率100％になろうとしていた。サイズは500GB。ホームフォルダのプロパティを見ても百数十GBしか使っていない。

思い当たりが無く焦ったが、「ディスク使用量アナライザー」とかいうツールが入っていたので見てみると、原因はVMwareのキャッシュ。ホストーゲストのファイルコピーで溜まったキャッシュらしい。

場所は`~/.cashe/vmware/drag_and_drop/`
このフォルダのファイルを丸ごと消して解決。
LPIC300 ③Sambaの基礎

# SMBとは
windowsのファイル共有で用いられるプロトコル。CIFSと呼ばれることもある。
SMBは本来NetBIOS上で動作するプロトコル。over TCP/IP で利用することも可能（NBT）。さらにTCP上に直接SMBを実装したものをDirect Hosting of SMBと呼ぶ。  

- SMBのポート番号
  - NBTではTCP139 と UDP137,138 を使用する
  - Direct Hosting of SMBではTCP445を使用する

# Sambaとは
SMBプロトコルを用いるWindows互換サービスをLinux上で実装したもの。  
**SMB＝Sambaではない！！**

## Sambaの機能
- ファイル・プリンタ共有サービス
- 名前解決（NetBIOS名の解決。WINSサーバ機能）
- ブラウジング（windowsの「ネットワーク」にコンピュータ一覧を表示）
- ドメインクライアント（ドメインに基づく認証・認可）
- ドメインコントローラ（NTドメイン、ADドメインの情報管理）
## Sambaサーバのプロセス
- smbd： ファイル共有などのSambaサーバのメイン機能部
- nmbd： NBT名前解決、WINSサーバ、ブラウジングの提供
- winbindd： Winbind機能
- samba： ADドメインコントローラ機能（Samba4にのみ存在）

## smb.conf
Sambaの設定を行うためのファイル

- bind interface only = yes
- unix charset / dos charset  
- log level (debug level)  3程度までがおすすめ  
クラス毎のカスタマイズもできる log level =3 auth:10 

## 関連コマンド
- testparm  コンフィグのチェック
- smbcontrol
    - nmbd reload-config 
    - smbd shutdown 
    - smbd debug 5  ログレベルの動的変更
- smbstatus



# 認証
- sambaの認証はsambaユーザとしての認証とLinuxユーザとしての認証の両方が行われる
- linuxユーザがあることがsambaユーザ作成の前提になる
- ただしlinuxユーザはシェルやホームディレクトリ、linuxパスワードがなくても問題ない
- encrypt password no とするとlinuxパスワードで認証を行う(windowsから平文パスワードを送る必要）


## SambaユーザのDB
- Sambaのパスワードの保存場所は下記の通り指定する

```
passdb backend smbpasswd / tbdsam / ldapsam
```

- TDBはsamba独自の簡易DB バイナリ形式
 - tdbbackup   -v でDBの正常性チェック
 - tdbdump 画面に内容を表示する
 - tdbtool DBの編集 ? でヘルプ

## sambaユーザの作成
- pdbedit or smbpasswd
-  -a ユーザ作成
-  -x ユーザ削除
- smbpaswd ユーザ名 パスワード変更

## ユーザーマッピング
- 基本はwindowsユーザ名＝Linuxユーザ名
- username map パラメータに指定したファイルでユーザのマッピングができる
- username map scrip を使うとwindowsユーザ名を引数としたスクリプトでLinuxユーザ名を決定できる


## sambaとLinuxの認証情報同期
### samba → Linuxの同期
```
unix password sync = yes
```

- pamを使わない場合  
    passwd program
    passwd chat

- pamを使って変更する場合  
    pam pssword change = yes

### Linux → Samba の同期
pam_smbpassモジュールを設定

```
password suffiicient pam_smbpass.so use_authtok
```

# 認証DB
- passdb backend で設定
- pdbedit -i xxxx -e yyyy でパスワード保存形式の変更


## ゲスト認証
- map to guest
- guest account
【Reactアプリにて、firestoreのテストにJestを使った際に陥ったエラー】

### 遭遇したエラー

```jsx
@firebase/firestore: Firestore (8.8.1): FIRESTORE (8.8.1) INTERNAL ASSERTION FAILED: Unexpected state
```

### 実際に躓いたCode

（Codeが悪いというより設定に問題があった。）

```jsx
// usersCollectionを操作するAPIリクエスト関数をテストする
import { getAllUsers } from './apis/FireStoreAPI'

describe('usersCollectionを操作する関数のテスト', () => {
    test('users 認証アクセス', async () => {
        const result = await getAllUsers()
        console.log(result)
    });
}
```

### 【解決したCode】

以下コメントをテストファイルの先頭に追加するだけ

```jsx
/**
 * @jest-environment node
 */
```

```jsx
/**
 * @jest-environment node
 */
// usersCollectionを操作するAPIリクエスト関数をテストする
import { getAllUsers } from './apis/FireStoreAPI'

describe('usersCollectionを操作するAPIリクエスト関数テスト', () => {

    test('users 認証アクセス', async () => {
        const result = await getAllUsers()
        console.log(result)
    });
})
```

### 【参考にした記事】

以下記事によると、jestの環境にnodeを指定しなければ、firestoreを操作するような`get()`などのメソッドは失敗するらしい。
[Using TDD to Test and Deploy Firestore Security Rules Locally](https://eliteionic.com/tutorials/using-tdd-to-test-deploy-firestore-security-rules/#3-setting-up-jest)

> When testing your security rules, it is best to use the `node` environment rather than `jsdom` (which is the default). You can either set your `testEnvironment` in your `jest.config.js` file to `node` (this might cause problems for you) or just put the following at the top of any of your Firestore security rules test files:
> 

> セキュリティルールをテストする際には、jsdom（デフォルト）ではなく、node環境を使用するのがベストです。jest.config.jsファイルのtestEnvironmentをnodeに設定するか（これは問題を引き起こすかもしれません）、Firestoreセキュリティルールのテストファイルの先頭に以下を記述します。
>
LPIC 300 ②LDAPによる認証

# PAM、NSSとLDAPの連携
- LinuxでLDAPと連携して認証を行うには、PAMとNSSを使う
  - PAM： pluggable authentication module
  - NSS： name service switch 

## LDAPサーバの設定
- LDAP上に、accountオブジェクトクラスとposixgroupオブジェクトクラスを使ってユーザアカウントとグループのデータを格納する
- これらのオブジェクトは cosine.scheme と nis.scheme に定義されているので、これらをLDAPサーバで読み込むことが必要（slapd.confに記述）

### データの追加
- ユーザデータはLDIFで記述してaddしてもよいが、MigrationToolを使うとローカルのアカウント情報をLDAPに移行することもできる
- パスワードは slappasswd でハッシュ化して登録する

## クライアントホストの設定
NSSとPAMの設定が必要

### NSSの設定
LDAPのアカウント情報を参照するために用いる  
LDAP参照用のNSSモジュールは古い`nss_ldap`と新しい`nslcd（nss-pam-ldapd）`がある  

- 参照するLDAPサーバの設定
  - nss_ldap ⇒  `/etc/ldap.conf`  または `/etc/pam_ldap.conf` または`/etc/pam_ldap.secret`
  - nslcd（nss-pam-ldapd） ⇒   `/etc/nslcd.conf` 
 
- LDAPのアカウント情報をアカウントマスタとして使用することの設定  
`/etc/nsswitch.conf`に ldap を追記する。記載順序が参照順序になるので、LDAPアカウントを優先的に見るならfilesより前に記述。
```
paswd: files ldap
shadow: files ldap
group: files ldap
```

- /etc/openldap/ldap.conf の設定  
ldapsearchなどのコマンドのデフォルト値の設定

### pamの設定
認証をつかさどる。NSSが取得したLDAPの情報で認証することを許可する  
`/etc/pam.d/system-auth` または `/etc/pam.d/password-auth`  に追記

### 設定とテスト
- `authconfig-tui`  
NSSとPAMの設定を一括で実施する（RHEL系）
- `getent`  
クライアントでLDAPの参照ができているかどうかテストするとき使う

### キャッシュ
- nscd（Name Service Chache Daemon）を使うとLDAP認証情報をクライアント側でキャッシュできる

# Active Directory、KerberosとLDAPの連携
## Kerberosとは
- 身元を保証するチケットを使ってシングルサインオンを実現する機構
- 認証された対象をプリンシパルと呼ぶ
   - ユーザプリンシパル
   - サービスプリンシパル
   - ホストプリンシパル

- Kerberosサーバには秘密鍵を置く。ユーザは秘密鍵を生成するためのパスワードを記憶しておく
- KerberoからTGTを取得するにはkinitコマンドもしくは pam_krb5を用いる
  - kinit パスワードを直接入力する
  - pam_krb5 OSログインパスワードを使う

## Kerberoの設定
- kdc.conf サーバの設定ファイル
- krb5.conf クライアントの設定ファイル
## Kerberosの構築手順
- confの作成
- kdbの作成
- rootのユーザプリンシパルの作成  
  アクセス制御を行わずにKerberosデータベースを制御できる`kadmin.local`コマンドを使う
- サーバの起動
```
  service kadmin start
  service krb5kdc start
  ```
- ユーザプリンシパルの作成  
```
  kadmin: add_princで生成
```
- LDAPサーバ用のサービスプリンシパルの作成  
  - LDAPサーバで`kadmin`コマンドを使用し、Kerberosサーバにプリンシパルを作成する
  - `ktadd`コマンドで秘密鍵をKerberosサーバの`/etc/openldap/ldap.keytab`に保存する
- LDAPサーバにKerberos用の設定を追加して再起動  
`/etc/slapd.conf` と `/etc/sysconfig/ldap` に設定を追記して再起動

- 各ホストでポストプリンシパルを作成
- pam nssの設定にKerberosを追加
- 上記完成すると、ポストログイン時にKerberosでチケットが発行され、ほかホストへパスワードなしでログインできる    

※sshではGSSAPIAutentication yes の設定必要。
Scala 2桁の数字を分割して足し上げるときに.toIntでハマった話

# 概要

Scalaで、0-10までの数字をforで回して、
すべての数字を足し上げる際に型でハマった時の解消方法

※一旦IntをStringにCastしたのに、またIntに戻すの？っていう疑問は重々承知ですが、2桁の数字を分解して足し上げる問題があり、、、不可解ですがコードの行数がかなり少なくなったのでこのような書き方をしました。

## ハマった事象

```Ng.scala
var r = 0  
for (i <- 0 to 10) {
    val sum = i.toString.toList.map(_.toInt).sum
    if (min <= sum && sum <= max) r += i
  }
  println(r)
  // Int: 0
```
Lisｔ（１，２，３，４...）をmapでIntにして、sum関数で足し上げればOK!じゃなかった...
足し上げたと思った結果が0

## 原因調査

型を調べてみた

```Search.scala
  ...
  for (i <- 0 to 10) {
    val sum = i.toString.toList.map(n => {
        println(n.getClass)  // 上記コードに波括弧と型を出力するコードを追記
        n.toInt
    }).sum
    ...
  // Char
  // Char...
}
```
型がCharになっていたため、足し上げができずに出力結果が0に...


## Charを数値にするためには`asDigit`を使う

解決方法としては、以下のコードのように_.toIntにしていたコードを_.asDigitにすればできた。
※asDigit()メソッドは、文字を数字の形で表現するために使用する関数。

```Ok.scala
  var r = 0
  for (i <- 0 to 10) {
    val sum = i.toString.toList.map(_.asDigit).sum // _.toIntから_.asDigitに書き換え
    if (min <= sum && sum <= max) r += i
  }
  println(r)
  // Int: 13
```
#
https://www.bold.ne.jp/engineer-club/java-char
【Python】デバッグ用のグラフ描画関数

#背景
Anacondaの商用有償化でVSCodeで実装およびデバッグを行っているが、デバッグ時にグラフを書くためのコードの記述が面倒

#対策
pyplotのimport、グラフの描画、メモリの解放までやってくれる関数を作成する。

#コード
```python
def dbplot(*args):
    import matplotlib.pyplot as plt
    # 可変長引数を一つの文字列に結合する
    argument = ""
    for i,val in enumerate(args):
        if i==0:
            argument += "args[{}]".format(i)
        else:
            argument += ",args[{}]".format(i)
    # 文字列をplotの引数として実行
    exec("plt.plot({})".format(argument))
    # グラフ表示
    plt.show()
    # グラフエリアをクリア
    plt.clf()
    # グラフのメモリ解放
    plt.close()

if __name__ == "__main__":
    # グラフ描画用に適当な配列を準備
    x = [1,2,3,4,5]
    y = [1,2,3,4,5]
    z = [2,4,6,8,10]

    # デバッグ用プロット関数実行
    dbplot(x,y,x,z)
```
STM32で Printf() を使い Teraterm で デバッグ

**はじめに**
1年以上前の 2020年8月に[STM32L432](https://www.st.com/ja/microcontrollers-microprocessors/stm32l4x2.html) を用いた開発環境をWindows上で構築した。
この時 非常に参考になったのは、[この記事](https://qiita.com/desertfox_i/items/c6391e7d38148cfd4041) です。

ここでは、STM32で printf() を使える様にしたので メモ書きとして記します。

---
**Printf()を用いて Tera Term で デバッグ(文字出力)**

[参考にした記事](https://qiita.com/desertfox_i/items/c6391e7d38148cfd4041)に Lチカ(STM32 のLEDを点滅) を実現する ソースコードが記載されている。
今回、ここに Printf() を実装した。もちろん、Lチカ 以外でも 同じ方法で Printf()が実現出来る。
※STM32 のUART 設定は、usert.c で行われているので ソースコードを見てください。
&emsp;デフォルトのままであれば、Terminal Adapter側で下図の設定で動作します。
![2021-11-03 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2056854/bd8ea7fc-4ea3-d8df-cf75-8f55ed93aeef.png)

◎syscalls.cの追加
 &emsp;\Src フォルダーの中に syscalls.c を置く。 
 &emsp;syscalls.cは、STM32CubeMX と STM32L4用のパッケージをインストールした時点で下記に
 &emsp;サンプルコードとして置かれているので これをコピーして使う。

~~~
C:\Users\xxxx\STM32Cube\Repository\STM32Cube_FW_L4_V1.17.0\Projects\NUCLEO-L432KC\Examples\PWR\PWR_ModesSelection\SW4STM32\syscalls.c
~~~

◎main.c のソースコードを変更

~~~C
/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
------- 省略 -------

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */
------- 省略 -------

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    printf("LED Toggle!!\r\n");
    HAL_GPIO_TogglePin(LD3_GPIO_Port, LD3_Pin);
    HAL_Delay(5000);//ms

  }
  /* USER CODE END 3 */
------- 省略 -------
~~~

◎usert.c のソースコードを変更

~~~C
/**
  ******************************************************************************
  * @file    usart.c
  * @brief   This file provides code for the configuration
  *          of the USART instances.
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
------- 省略 -------

/* USER CODE BEGIN 1 */
/* Add by My.Name for Printf */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
 HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);
 return ch;
}
/* USER CODE END 1 */
------- 省略 -------
~~~

---
☆2021年11月 3日(水) 午後18時40分 初版(Ver1.00) 作成

---
JupyterLabのkernelにアイコンを設定する。

# はじめに

JupyterLabに自分でカーネルを追加したりとか、
アイコンが設定されていないカーネルを追加したときに
見た目がちょっと寂しいと思った時に役立つかも知れないTIPSです。

# 手順

## kernelのパスを確認する

`jupiter kernelspec list` で確認できます。
うちの子の環境だとこんな感じ。

```bash
# jupiter kernelspec list
Available kernels:
  ir             /home/jovyan/.local/share/jupyter/kernels/ir
  julia-1.6      /home/jovyan/.local/share/jupyter/kernels/julia-1.6
  ruby           /home/jovyan/.local/share/jupyter/kernels/ruby
  swift          /home/jovyan/.local/share/jupyter/kernels/swift
  python3        /opt/conda/share/jupyter/kernels/python3
  xcpp11         /opt/conda/share/jupyter/kernels/xcpp11
  xcpp14         /opt/conda/share/jupyter/kernels/xcpp14
  xcpp17         /opt/conda/share/jupyter/kernels/xcpp17
  jslab          /usr/local/share/jupyter/kernels/jslab
  jupyter-php    /usr/local/share/jupyter/kernels/jupyter-php
  tslab          /usr/local/share/jupyter/kernels/tslab
```

## kernelのフォルダの中にアイコンファイルを配置する。

kernelのフォルダの中に、下記のような名前でPNGファイルを置く。
`logo-64x64.png` `logo-32x32.png`

## 画面を確認

うちの子の例だと、PHP、JavaScript、TypeScript、Swiftに
アイコンを設定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298004/6b3f10ff-ef35-8325-c282-b31a540517c7.png)
AWSのコンソール画面を英語設定してみた

[zenn](https://zenn.dev/mo_ri_regen/articles/aws-english-setting)のほうでも同じ記事を投稿しています📮
[zenn](https://zenn.dev/mo_ri_regen)ではフロントエンドのことも含め、いろいろ投稿しているのでぜひご覧ください👋

AWS は日本語のドキュメント [^1]が充実しているので、あまり英語にするメリットがなさそうだと思われるかもしれないのでメリットを考えてみました。

[^1]: 公式ドキュメント以外にもクラスメソッドの[ブログ](https://dev.classmethod.jp/tags/aws/)など企業レベルで発信している会社もある

## 英語にするメリット

- 強制的に英語に触れることができる
  これが一番メリットだと思います。
  英語を勉強したいなと思っても意識して勉強って難しい 😓 ので、少しでも英語を使わざるを得ない環境にすることで英語に慣れることができます。

- 日本語訳に振り回されない
  Amazon はアメリカの会社なのでどうしても和訳という作業が発生してしまいます。主要なサービスは影響ないと思いますが、マニアックなサービスだとおかしい日本語になっていることもあるので、訳に振り回されずに AWS に触れることができます。

:::message alert
たとえば ec2 のインスタンスを選ぶときなどお金がかかるところでは、過剰なスペックなものを選ばないように、心配なときは日本語に戻しましょう。
:::

## やりかた

1. コンソール画面左下に日本語があるところをクリックします。
   ![コンソール画面日本語](https://gyazo.com/c4219694e2220a6afcbfcbe23088bfa4.png)
2. 言語が選べるのでそこから English(US)を選びます。
   ![英語を選択](https://gyazo.com/f9e6cfc8a7a4cb98a6acbf99d99c2a37.png)
   英語になりました 🎉
   ![コンソール画面英語](https://gyazo.com/fc772dbe6f426d2d6635d3eb7f00839c.png)
Thymeleafについて

めちゃくちゃわかりやすいのがあったので
メモ程度にURLを貼っときます
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

[全般的にはこちらから](https://qiita.com/NagaokaKenichi/items/c6d1b76090ef5ef39482)

[th:fieldとth:objectについてはこちらから](https://casual-tech-note.hatenablog.com/entry/2018/10/10/224250)

[これも良かった！]
(https://javazuki.com/articles/thymeleaf-basic-output.html#_th_block_%E3%82%BF%E3%82%B0)
時系列データの対数差分を取る　【python】

・時系列データ

時系列データとは、ある時間とその時の何かの値が時系列に沿って記録されているデータです。
例えば、株価の日時データは一日単位の時系列データになります。

・VARモデルと因果推論

VARモデルとは、その時系列データに対し、「ある時点でのデータはそれより前のデータ幾つかの重ね合わせで表せる」というモデルで、過去のデータ点幾つかに対して線形モデルを作って回帰し、未来のデータ点を予想することができます。このモデルでは、Granger因果、インパルス応答分析など、ある2種類のデータ列に、どちらかからどちらかへの因果（例えば、１日の気温とその日のアイスの売り上げなど）があるかどうかを分析することができます。

詳細は省略しますが、その際にデータの対数差分を取る必要が出てくることがあります。
これは、単位根過程のデータに対して対数差分を取ることで見せかけの回帰を回避できるためです。

・対数差分の取り方
※全てのデータが正の数であることが条件。
①全てのデータに1を加える。
※負の数になることを回避するため。
②データの対数を取る。
③各データからそれぞれ一つ前のデータを引く。


・Pythonコード

```Python3
import numpy as np

def logdiff(df):
    
    df_ = df.copy()
    df_ = np.log(df_ +1)
    df_ = df_.diff() 
    df_ = df_.iloc[1:,:]
    return df_


```
【Docker】起動中のコンテナのシェルに接続する方法

この記事では、Dockerにおいて起動中のコンテナのシェルに接続する方法について詳しく解説する。

Udemyの「[ゼロからはじめる Dockerによるアプリケーション実行環境構築](https://www.udemy.com/course/docker-k/)」を参考。
## 接続する際の2つのコマンド
コンテナのシェルに接続するには、

1. **docker attach**
1. **docker exec**

のどちらかのコマンドを使用する。この2つのコマンドの違いを次に解説する。

### ①docker attachを使用するパターン

```terminal
$ docker attach <コンテナ名　または コンテナID> # シェルに接続できるのはコンテナでシェルを実行している場合のみ
```
docker attachコマンドを使用した場合は、コンテナのPID 1(※)のプロセスの標準入出力に接続される。コンテナ起動時にコマンドでシェルを起動した場合は、attachを使用することでそのシェルに接続できる。

ただし、起動時にデーモン(※)を起動していた場合はそのデーモンの標準入出力に接続されてしまう。

また、attachで接続した後に「**exit**」で抜けた場合、pid 1のプロセスが終了してコンテナも停止してしまうことにも注意が必要。

プロセスを終了せずに接続状態を抜けるには、「**Ctrl+P**」を入力した後に、「**Ctrl+Q**」と　入力する。ただし、起動時に「**-it**」 オプションをつけていなければこれらのコマンドで抜けることはできない。

```terminal:例
$ docker run --name connect-test -it(このオプションをつける) -d ubuntu /bin/bash(シェル)
```


:::note info
【PID 1とは】
一般的にPID 1は「initプロセス」と呼ばれており、システムが起動した際に最初に起動するプロセス。このinitプロセスの役割は、ゾンビプロセスの除去とサブプロセスへのシグナルの伝搬。

引用元：https://casualdevelopers.com/tech-tips/how-to-fix-the-pid-1-problem-for-dockerized-nodejs-app/
:::

:::note info
【デーモンとは】
Linuxにおいて常駐型のプログラムのことをデーモンと言う。例えば、Webサーバーのプログラムなどはデーモンとして起動し続け、クライアントからのリクエストがあった際に常に応答を返せるように常駐する。

引用元：ゼロからはじめる Dockerによるアプリケーション実行環境構築
:::

### ②docker execを使用するパターン

```terminal
$ docker exec -it <コンテナ名　または コンテナID> /bin/bash # 今回はbashを使用しているが別のシェルでも可 
```
docker exec自体は起動しているコンテナ内で、任意のコマンドを実行するためのコマンド。シェルの氷刃入出力に接続するには、シェルを「**-it**」オプション付きで実行する。

docker attachと違い、「**exit**」で抜けてもコンテナが停止することがなく、誤って停止させてしまうことを考慮するとdocker execの使用の方が望ましい。

## まとめ
docker execを使用する方が、exitで抜けてもコンテナは起動状態を保つことができるので、単純にシェルに接続したい場合はdocker execを使用するのが安全。
M1MacでECSにデプロイする時の注意点

M1Macを使用していて、AWSのECSを利用したコンテナデプロイをしようとしている方に注意点があります。
今回の内容は私がかなりハマった部分であるため、自分用のメモとして投稿しようと思いますが参考にしてくださる方がいれば嬉しいです。


M1Mac使用者がECSデプロイで気をつけなければいけないことはCPUアーキテクチャについてです。私を含め、初学者や駆け出しエンジニアの方からすればなんだそれ？ってなるのではないでしょうか。


**CPUアーキテクチャとは...**
じゃあそのCPUアーキテクチャってなんなのとなるのですが正直、私もまだしっかりと理解することはできていないです。そのため、CPUアーキテクチャについて分からないよって方がいれば一度検索して調べてみてください。
そうするとx86やARM64やAMD64といた型番のようなものが出てきたと思います。
CPUアーキテクチャには今あげた３つのように種類があるとだけわかっていればいいと思います。



実際にローカルで立ち上げているDockerコンテナがある方は以下のコマンドを実行して確認してみてください。



dockerイメージを確認

```
docker images
```

確認したいイメージ名を当てはめてコマンドを実行

```command
docker inspect {イメージ名}
```

すると長いコードがいっぱい出てきますがその中にArchitectureという部分があると思います。
そこに書かれているのがDockerイメージで使用するCPUアーキテクチャになります。
ちなみに筆者は```"Architecture": "amd64"```と表示されました。


Dockerfileでイメージを作成する時にFROMでベースとなるイメージを明記すると思います。
ちなみにこれは私がRailsの環境を構築する時に作成したDockerfileのFROMの部分です。

```Dockerfile
FROM ruby:3.0.2-alpine3.14
```

M1Mac使用者がこのようにDockerfileでベースとなるイメージを指定すると
CPUアーキテクチャがARM64のイメージを作成することになります。

ローカル環境でDockerを立ち上げる場合は問題ないのですがECSでコンテナデプロイをする場合はCPUアーキテクチャがAMD64と明記されているDockerイメージを使用しなければなりません。
それはECS側がARM64のCPUアーキテクチャに対応していないためです。

そのため、ECRにプッシュするDockerイメージを作成するDockerfileでは以下のようにCPUアーキテクチャを指定する必要があります。

```Dockerfile
FROM --platform=linux/x86_64 ruby:3.0.2-alpine3.14
```

こうすることでCPUアーキテクチャがAMD64と明記されるようになると思います。
そしてECSでしっかり機能するようになると思います。

仮にARM64と明記されたDockerイメージをECRにプッシュしてECSで動かそうとすると
コンテナが停止してしまい停止理由が```Essential container in task exited```と出てきます。

すでにローカルでDocker環境を立ち上げている方はローカルでARM64用のパッケージなどが使われていないか確認する必要がある場合もあります。私はRailsの環境のnokogiriというのがARM64用のものを使用していてECSでnokogiriに関するエラーが表示されてかなり悩まされました。参考にしてみてください。

分かりづらい部分もあったと多いますが誰かの助けになれば幸いです。ありがとうございました。
where メソッドで複数のカラムから同時に検索する方法

## 開発環境
ruby 2.6.5
Ruby on Rails 5.2.5

## 本題
複数のカラムの情報まとめてあいまい検索したかったら

 ```
Task.where("content LIKE ? or title LIKE ?", "%#{params[:task][:search]}%", "%#{params[:task][:search]}%")
```

こんな感じで２つのカラムと２つの条件式をいれることで
まとめて検索できる。

SQL のプレースホルダーが ActiveRecord の where メソッドでも使える


それぞれの？の数と引数の数が一致しないとだめみたいなので、
条件が同じなら上みたいにする


参考にした記事

https://rowingfan.hatenablog.jp/entry/2018/04/28/010000
MySQLを使うときに、No database selected担ったときの解決策

業務でMySQLを使うときに、

```
MySQLのテーブルの内容を確認してほしい。
```

と言われたので、

```
mysql -u root
```

でMySQLへログインをして調べようとしたときに、

```
show tables;
```

でまずはテーブルの名前を取得しようと思ったのですが、

```
No database selected
```

というエラーが出てしまって詰まってしまいました。なので、その時の対処法を共有したいと思います。

#　対処法

```
use DB_NAME;
```

を使うこと。
例えばblogというDBのカラムの情報を取得したいのであれば、

```
use blog;
```

と最初に入れてあげてそこから

```
show tables;
```

としてあげないと、どのDBのテーブルの情報を取得したらいいのかわからないので、タイトルのエラーが出てしまうわけです。まだまだSQLを勉強して間もないので、こういった初歩的なミスをしてしまうのですが、頑張ってかけるようになりたいと思います。

さて、これだけだと味気ないので、MySQLのuse文について調べたことをまとめてみたいと思います。

# USE構文について
公式リファレンスには、USE構文を用いることでDBを指定することができ、それはセッションが終了するまでその指定は続く。
そして、このUSE構文を使ってDBを指定してあげれば、use構文で指定したDBに対して、カラムの追加やテーブルのドロップなどの操作を行うことができます。そして、これはMySQL8.0で試した範囲なので、5.7ではわからないのですがuse構文を使って指定したあとに、use構文をもう一度使ってDBを指定してあげれば、捜査対象のDBを切り替えることができます。

SQL初心者の人の人の手助けになればと思います。
1週間でMicrosoft Azure Data Fundamentals（DP-900）を取得した勉強法

Microsoft Azure Data Fundamentals（DP-900）に合格したので、勉強法を共有します。 
Azureの資格の中では、初級者向けの資格でかなり難易度は低い印象でした！  

勉強すれば誰でも取れる資格だと思うので、この記事が参考になれば嬉しいです！！

## 勉強を始める前の知識と経験
■ クラウド系の保有資格
・Microsoft 認定資格 
　　- Azure Fundamentals（AZ-900）
・Google Cloud 認定資格 
　　- Cloud Digital Leader
　　- Associate Cloud Engineer
　　- Professional Cloud Architect
　　- Professional Data Engineer
・AWS 認定資格
　　- クラウドプラクティショナー

割と資格を取るのが好きで、Google Cloudを業務で扱っている背景もあり、クラウド系の資格は比較的慣れています。
DP-900は、試験名の通り、データベースやビックデータ、分析ワークロード、データパイプラインなどの***データエンジニアリングの知識***が問われるのですが、似たジャンルの資格である Google Cloud 認定資格 Professional Data Engineerを既に取得していたので、比較的難なく理解できました。

## 勉強方法
勉強時間は、1週間程度（約 10時間）でした。  

使用した勉強リソースは、[Microsoft Virtual Training Days](https://www.microsoft.com/ja-jp/events/top/training-days.aspx?activetab=a1%3aprimaryr3)と [専用のラーニングパス](https://docs.microsoft.com/ja-jp/learn/certifications/azure-data-fundamentals/)の2つのみです。
どちらも無料なので、Azureは勉強しやすい環境が整っているな…と感心しました（笑）

#### 1. Microsoft Virtual Training Days

https://www.microsoft.com/ja-jp/events/top/training-days.aspx?activetab=a1%3aprimaryr3

こちらは、Microsoft社が定期的に実施しているオンライントレーニングです。
開催頻度も高く、DP-900に関しては約 12,500円する***試験費用が無料になるバウチャー***がついています！！
※ AZ-900 と AI-900のトレーニングにもバウチャーが付いている模様  

試験に特化したトレーニングなので、こんな問題が出題されるから覚えておきましょう… のようなアドバイスも含まれていたり、オンラインでそのまま質問が出来たりなど、かなり有益です。
ある程度 IT経験があれば、これを真面目に受けるだけでも合格できる気がします。  

また、このトレーニングの特典として 復習用の教材が閲覧できるようになるんですが、これが超優秀です。。
動画形式の講義 + 模擬問題 という構成になっているんですが、この中で使用されている模擬問題が***非常に本番の試験問題に近い***です。 （というか 7~8割程度同じような問題が出ていたような。。あまり大きな声では言えませんが。。）  

結論、DP-900の取得を目指す上での最短ルートは Microsoft Virtual Training Daysをフル活用することだと断言できます！

#### 2. ラーニングパス

https://docs.microsoft.com/ja-jp/learn/certifications/azure-data-fundamentals/

こちらは、常時公開されているので、いつでもどこでも使えるのがメリットです。
DP-900のためのラーニングパスなので、試験との関連度も高くおススメできます！  

ただ、本番形式の模擬問題を解いてみることができないのが難点です。。
ラーニングパスの各モジュールにも復習問題が付いているので、理解度の確認はできますが、本番の試験問題とは少々異なる形式で出題されるので、注意が必要です。  

ラーニングパスで Microsoft Virtual Training Daysの受講前に軽く予習をして、復習教材の模擬問題で知識チェックをするのが王道だと思います。

## 受験後の感想
試験時間 45分のうち 20分程度残して終了できました。
Fundamentalレベルの資格なので、そこまで難易度は高くないだろうと思っていましたが、想定より簡単でした。

とか言ってますが、Microsoft Virtual Training Daysが優秀なだけです。。
試験合格を目指す方は、くどいようですがトレーニングを受けましょう。

## 試験のTips
・Azure未経験者だと、データベース系のツールについての問題は覚えておかないと間違えなく解けないので、特徴をしっかり覚えるとよいと思います。（ SQL Server Data Toolsとか Azure Data Studioとか名前が似てるので… ）  

・非リレーショナルデータに関する問題も多く出題されていました。キー/値(バリュー)ストア、ドキュメント、列ファミリ、グラフ、オブジェクトなどの違いを正確に理解しておくことをおすすめします。
（Microsoft Virtual Training Daysで聞いたTipsですが、列(***C***olumn) ファミリは ***C***assandra、グラフ(***G***raph)は ***G***remlinと頭文字を関連させると覚えやすいとのことでした！ 1,2問はこれに助けられたので紹介しておきます（笑））

## 最後に
エントリー資格であり、勉強リソースが整っているので、すきま時間に勉強するだけでも取得を目指せます！
ビッグデータとか最近よく聞くから勉強してみたい！ Azureの資格をとりあえず取りたい！という方には最適な試験なのではと思います。  
それでは、皆様のご検討をお祈りいたします！
WP Offload Media Liteプラグインを使用して画像をS3に保存できない場合の対処方法

# 背景
EC2上にWordPressを構築し、WP Offload Media Liteプラグインを使用して投稿画像をS3に保存しようとしたところ、画像がS3にアップロードされない現象が発生しました。
私の場合、gdというライブラリをインストールすることで解決しました。

# 症状
サイトヘルスとWP Offload Media Liteプラグインの設定画面にgdがインストールされていないというメッセージが出ていることに気付きました。

## WordPressの管理者画面のサイトヘルス
> 必須モジュール gd がインストールされていないか、無効化されています。

## WP Offload Media Liteプラグインの設定画面
> WP Offload Media Requirement Missing — Looks like you don't have an image manipulation library installed on this server and configured with PHP. You may run into trouble if you try to edit images. Please setup GD or ImageMagick.

# 対応方法
以下のコマンドでgdをインストール後、httpd.serviceを再起動します。

```
$ sudo yum install -y php-gd
$ sudo systemctl restart httpd.service
```
Vue.jsのstoreの中のgettersからgettersを呼び出すには

わかれば簡単なのですが、知らないとググってもなかなか見つけられなかったので、メモしておきます。

gettersの関数が呼び出されるとき、第1引数は state なのですが、第2引数に getters が渡されるようです。

なので、以下のように書けます。

```javascript
getters: {
    foo(state) {
    	return state._foo;
    },
    bar(state, getters) {
  	    return 2 * getters.foo;
    },
}
```
google.auth.exceptions.RefreshError: ('invalid_grant: Invalid JWT: Token must be a short-lived token (60 minutes) and in a reasonable timeframe.

## 状況
ローカルPC(WSL)からGCSのバケットを作成しようとしたときに、タイトルのエラーが発生。

## 原因
サーバー側(GCP)とクライアント側の時刻がずれているために起こる。

参考：https://developers.google.com/identity/protocols/oauth2/service-account#error-codes

## 対処法
NTPサーバーと時刻同期させる。
`ntpdate time.google.com`

time.google.comはGoogleが提供する[NTP](https://ja.wikipedia.org/wiki/Network_Time_Protocol)サーバーです。

参考
https://developers.google.com/time/?hl=ja
https://cloudplatform-jp.googleblog.com/2016/12/ntp.html
Cocoapods インストールで手間取ったところのメモ(Flutter)

Flutter開発中にcocoapods 使おうとしたらインストールに手こずった話と、インストールしたcocoapods がIntelliJから読み込めなくて困った話

IntelliJ使ってるけど、Android Studio でも多分同じはず

# TL;DR
- 最新版のruby を使ってインストールしてください
- gem のpath をきちんと通してください

## 環境
```
- macOS 11.5.2
- IntelliJ IDEA 2021.2.1 (Community Edition)
- Flutter 2.5.3 (Dart SDK 2.14.4)
```

# 症状
`flutter doctor` で以下のようなエラーが出て、iPhone Simulator にアプリがデプロイできなくなった。

```
[!] Xcode - develop for iOS and macOS
    ✗ CocoaPods not installed.
        CocoaPods is used to retrieve the iOS and macOS platform side's plugin code that responds to your plugin usage on the Dart side.
        Without CocoaPods, plugins will not work on iOS or macOS.
        For more info, see https://flutter.dev/platform-plugins
      To install see https://guides.cocoapods.org/using/getting-started.html#installation for instructions.
```

エラー文面に従って`cocoapods` のインストールを試みるも失敗。

```
$ sudo gem install cocoapods

Building native extensions. This could take a while...
ERROR:  Error installing cocoapods:
	ERROR: Failed to build gem native extension.

    current directory: /Library/Ruby/Gems/2.6.0/gems/ffi-1.15.4/ext/ffi_c
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/bin/ruby -I /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0 -r ./siteconf20211103-95050-3b6zow.rb extconf.rb
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.
...
...
To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /Library/Ruby/Gems/2.6.0/extensions/universal-darwin-20/2.6.0/ffi-1.15.4/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in /Library/Ruby/Gems/2.6.0/gems/ffi-1.15.4 for inspection.
Results logged to /Library/Ruby/Gems/2.6.0/extensions/universal-darwin-20/2.6.0/ffi-1.15.4/gem_make.out
```


# 解決法
## 1. 最新のruby をインストールする
元々入ってたやつ↓

```
- ruby 2.6.3p62 (2019-04-16 revision 67580) [universal.arm64e-darwin20]
- gem 3.0.3
```

`rbenv` を使って最新版をインストールしてみる（詳しいrbenv の使い方は割愛）
https://github.com/rbenv/rbenv

```
- ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [arm64-darwin20]
- gem 3.2.22
```

この状態で試してみたら、すんなりインストールできた

```
*** LOCAL GEMS ***

cocoapods (1.11.2)
cocoapods-core (1.11.2)
cocoapods-deintegrate (1.0.5)
cocoapods-downloader (1.5.1)
cocoapods-plugins (1.0.0)
cocoapods-search (1.0.1)
cocoapods-trunk (1.6.0)
cocoapods-try (1.2.0)
```

ちなみに、古いバージョンのcocoapods なら最新版のruby を使わなくてもインストールできるようだが、
flutter 起動時のminimum requirement に引っかかってしまう


## 2. InelliJ からロードできるようにする
terminal から`flutter run` で実行した場合は無事起動できるようになったのだが、なぜかIDEからは起動できないという事象が発生した

調べてみると、同じ症状に悩まされている人も

https://github.com/flutter/flutter-intellij/issues/4981

gem のpath を`bashrc` や`zshrc` に記述して再起動すると解決する

```
export PATH=$HOME/.rbenv/shims/gem:$PATH
```

どうやらGUI経由で起動されたAndroid Studioと、Terminal経由で起動されたAndroid Studio でPATHの読み込み結果が変わるらしい？
確かに上記のpath を通していない状態でも、`open` コマンドでIntelliJ 自体を立ち上げてみたらちゃんとCocoapodsのpathが通っていた
git lfsの使い方メモ

git lfsを使った際, リポジトリのpushまでが数回エラーで躓いたのでメモ

## 前提
gitの導入
git LFSの導入
  導入などは [こちら](https://support-ja.backlog.com/hc/ja/articles/360038329474-Git-LFS%E3%81%AE%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95#LFS%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB) の通りに

## リポジトリ作成からpushまで

**(1)gitリポジトリの作成**

```
git init
```

**(2)LFSの設定**

```
git lfs install
```

**(3)LFSで管理したいファイルを設定**
※ `git add` を行う前に実行する

```
git lfs track "${ファイル名}"
```
powershellでのファイル容量確認方法は [こちら](https://qiita.com/fujimohige/items/9637007c2ce8e8639337) を参考に
linux, macだと `find . -size +100M -ls` で見るのが楽そう([参考](https://qiita.com/takish/items/4b397caa5549a39a8194#git-lfs%E3%81%A7%E7%AE%A1%E7%90%86%E3%81%97%E3%81%9F%E3%81%84%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E8%A8%AD%E5%AE%9A))

**(4)LFSの確認**
(3)で管理対象に置いたファイルは `.gitattributes` に記述される
内容確認には以下コマンドを使用

```
git lfs track
```

**(5)pushまで**
通常の `git push` と同じ流れ

```
git add .
git commit -m "${commit message}"
git remote add origin ${httpsのgit URL}
git push origin main
```

## うまくいかなかったこと

### remote URLがSSHのものを利用している

httpsのURLに張り替えたところ動いた

```
git remote set-url origin ${https url}
```

### 先に add, commit をしてしまった

```
# addに関して
git rm --cached -r .

# commitに関して
git log
git reset -soft ${git logで調べた戻りたいコミット}
```

上記コマンドで `git add`, `git commit` の取り消しを行ったが `git push` 時に再度エラー発生... 
結局gitリポジトリを削除し、再度 `git init` から行うことで解決


 


## 参考

- [Git LFSの使用方法 - BackLogヘルプセンター](https://support-ja.backlog.com/hc/ja/articles/360038329474-Git-LFS%E3%81%AE%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95)
- [git push fails with LFS - GitHub Issue](https://github.com/git-lfs/git-lfs/issues/1089)
- [Failing to push large files - GitHub Issue](https://github.com/git-lfs/git-lfs/issues/1933)
- [Git LFSの導入方法 - Qiita](https://qiita.com/takish/items/4b397caa5549a39a8194)
- [git add を取り消す - Qiita](https://qiita.com/yukure/items/89562e5eb1d03995dc5b)
- [PowerShellで特定のフォルダ以下のフォルダの容量チェック](https://qiita.com/fujimohige/items/9637007c2ce8e8639337)
Next.jsとHasuraを連携してデータを画面に出すところまでやる（ためのpages/配下のuseQuery作成）...3

## はじめに

以下のゴールを達成するため、本日はついに、Next.jsとHasuraを連携してデータを画面に出すところまでやります。

特に今回は、Next.jsでApollo Clientを使ってSSR(SSG)する仕組みの部分を見て行くと思います。

![イメージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14191/a82854a4-b7ba-4ddd-bf48-c7678f452d7f.jpeg)

Hasuraにあるデータやエンドポイントは既に用意してあります。

## 最終的なゴール

以下のような構成のアプリを作ることです。

![スクリーンショット 2021-10-18 17.27.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14191/e8a9a2e1-2723-4fec-77ef-be3b9eefdd81.png)

### 目的

- 仕事で使っている技術のキャッチアップと復習
- 使う可能性がある技術の理解度向上

## 前回のおさらい

Next.jsとHasuraを連携してデータを画面に出すために、

前回は、Next.js公式の実例集からサンプルをパクって

https://qiita.com/ryosuketter/items/a626062a59bcf67b3151

ディレクトリもまんま真似して作成しました。

`lib/apolloClient.ts`

ここに、apolloClientインスタンスを作成したり、初期化に関する処理を作成しました。

詳細👇

https://qiita.com/ryosuketter/items/a626062a59bcf67b3151

### pages配下の実装

`pages/_app.tsx`に

- 前回の記事作成したやつで、作成した`initializeApollo`
- libにあるapolloClientから、`ApolloProvider`

を、読み込みます。

```ts
const client = initializeApollo()
```

変数`client`をコンポーネントの全てで使えるようにするために

`ApolloProvider`で囲みます。

結果は👇


```ts
import '../styles/globals.css'
import { AppProps } from 'next/app'
import { ApolloProvider } from '@apollo/client'
import { initializeApollo } from '../lib/apolloClient'

function MyApp({ Component, pageProps }: AppProps) {
  const client = initializeApollo()
  return (
    <ApolloProvider client={client}>
      <Component {...pageProps} />
    </ApolloProvider>
  )
}

export default MyApp
```

そうすると

```ts
<Component {...pageProps} />
```

の中（全pages）で、`client`が使えるようになります。

#### Hasuraからくるデータを表示pagesを作成する

`initializeApollo()`の実行結果から生成され、変数`client`に格納されたデータから

Hasuraにクエリを投げて、Hasura上で以前作成したユーザーデータを取得するまでやります。

https://qiita.com/ryosuketter/items/8b01d53d0609f78c2e0e

新しいファイルを用意します。

ディレクトリ名

```
pages/hasura-main.tsx
```

まずはモジュールの読み込み部分から

```ts
import { VFC } from 'react' // ReactのFCの型
import Link from 'next/link' // Next.js の　Linkコンポーネント
import { useQuery } from '@apollo/client' // apolloClientでHasuraからデータを取得するためのHooks
import { GET_USERS } from '../queries/queries' // ユーザー情報GETするクエリ
import { GetUsersQuery } from '../types/generated/graphql' // 自動生成された型
import { Layout } from '../components/Layout' // Layoutコンポーネント
```

```ts
const FetchMain: VFC = () => {
  const { data, error } = useQuery<GetUsersQuery>(GET_USERS)
  return (<コンポーネント/>)
}
```

大事なのは、ここですね。

```ts
const { data, error, loading } = useQuery<GetUsersQuery>(GET_USERS)
```

`loading`を取ることも可能です。

全体の構文を解説

```
useQuery<型>(実行したいクエリ)
```

ジェネリクスでimportした自動生成された`GET_USERS`クエリのデータ型の定義をしています。

返り値は

```ts
const { data,   // 取得データが格納されるところ
        error,  // 通信中エラーになったら trueになる
        loading // 取得中trueになる
}
```

今日のところは以上です。

次の記事では、通信ステータスごとの出し分け処理や、いよいよ、データを画面に出すところまでやります。

## アウトプット100本ノック実施中

https://qiita.com/ryosuketter/items/713474dbd009870e4103
rspec date_field の値のテストが出来ない

rspec のテストのとき date_field のフォームうまくテストできなかった

## 開発環境
ruby 2.6.5
Ruby on Rails 5.2.5
rspec-rails (5.0.2)

## 本題


```:rspecのスクリプト
fill_in "task[deadline]", with: "2019-11-11"
expect(page).to have_content "2019-11-11"
```

日付の入力欄に `date_field` を使っている箇所があるんだけど
そこのテストが上のコードでは上手くが出来ない

細かく見てみると

```
"2019-11-11"
```
と入力している部分がエラー時には

```
201911-11- 
```
と入力されてしまっている

調べたら

https://teratail.com/questions/301872

上の記事で同じような質問があった

再度

```
fill_in "task[deadline]", with: "002019-11-11"
```
と書き直す

確認の項目も

```
expect(page).to have_content "2019-11-11"
```
と変更

再度テスト
しかし再びエラー

エラーメッセージは

```
 expected to find text "002019-11-11" in "Task was successfully created
```

どうやら `002019-11-11` と入力しても
内部的にはそうなっていないみたいなので

```
 expect(page).to have_content "2019-11-11"
```
と書き直す

するとうまくいった
Notta Bot｜Zoom会議を録音して文字起こしする

元記事：[https://www.notta.ai/blog/add-notta-bot-to-transcribe-zoom-live-meeting](https://www.notta.ai/blog/add-notta-bot-to-transcribe-zoom-live-meeting)
![add-notta-bot-to-transcribe-zoom-live-meeting_title.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2226142/27065745-abe5-53e9-6447-4784974a5ab3.png)


本日、Zoomの会議を文字起こしするための新機能「Notta Bot」をリリースしました。

Zoom会議に“Notta Bot”を追加するだけで、高性能AIが自動で録音&リアルタイム文字起こしを実施。Notta Botはユーザーのパーソナルアシスタントとなり、議事録作成に要する時間と手間を大幅に削減します。ユーザーが会議そのものに集中できる、ストレスフリーなリモートワーク環境へ導きます。​

Notta Botを使ってZoomの会話を録音・文字起こしする方法をご紹介します。

※Notta Bot機能を利用するには、有料会員登録が必要です。

1.**[Notta Web版](https://app.notta.ai/dashboard)**にログインします。

![add-notta-bot-to-transcribe-zoom-live-meeting_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2226142/013ffcd2-57c0-1428-fe8c-2d345776ca18.png)

2.**Zoomミーティング**をクリックします。
![add-notta-bot-to-transcribe-zoom-live-meeting_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2226142/8602767b-0008-78f9-e171-95428e6ec5eb.png)

3.**Zoom会議の文字起こし**をクリックし、Zoomの招待URL（※）とお名前を入力します。

　※進行中のzoom会議のみ文字起こしできます。

![add-notta-bot-to-transcribe-zoom-live-meeting_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2226142/4418e217-23b1-00ec-3c6f-a9b17183a798.png)

4.**文字起こしする**をクリックします。

![add-notta-bot-to-transcribe-zoom-live-meeting_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2226142/589bdc3c-617a-27bf-7e30-2686b64bbf0c.png)
![add-notta-bot-to-transcribe-zoom-live-meeting_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2226142/cbd12279-5587-b6b0-2151-5775d24229d3.png)

5.接続が完了すると、Notta BotはZoom会議に追加されます。

　会議やインタビューの状況にもよりますが、話者の方々に「Notta Bot」を使うことを事前にお知らせください。

![add-notta-bot-to-transcribe-zoom-live-meeting_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2226142/2dd08776-cdc5-7534-94b4-bc1f1e81c3c1.png)

6.Notta Botが会話の内容を自動で録音・文字起こしします。

　録音を終了するときは、画面下部中央の **■** アイコンをクリックしてください。

![add-notta-bot-to-transcribe-zoom-live-meeting_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2226142/505a7cf3-6d37-5934-418a-8c4b2209aa71.png)

7.録音を終了すると、文字起こしデータはNottaで保存され、パソコンやスマホで簡単に編集・共有できます。
![add-notta-bot-to-transcribe-zoom-live-meeting_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2226142/790584a2-928f-7759-e015-87781cd8da97.png)


---

Nottaは無料体験できますので、試してみましょう。
‍
‍**Web版**
‍‍Google ChromeやMicrosoft Edgeから[Web版](http://www.notta.ai/)をアクセスできます。（無料）
‍
‍**Chrome拡張機能**
‍Chrome web storeから[Notta拡張機能](https://chrome.google.com/webstore/detail/notta-speech-to-text-tran/kdelkaogljjcbjffjmahedaobfjineig?hl=ja)をインストールできます。（無料）
‍
‍**アプリ版‍**
iOSアプリは[App Store](https://apps.apple.com/jp/app/notta-%E9%9F%B3%E5%A3%B0%E3%81%AE%E9%8C%B2%E9%9F%B3%E3%81%A8%E6%96%87%E5%AD%97%E8%B5%B7%E3%81%93%E3%81%97-ai%E9%9F%B3%E5%A3%B0%E8%AA%8D%E8%AD%98%E3%82%A2%E3%83%97%E3%83%AA/id1480649572)からダウンロードできます。（無料）
Androidアプリは[Google Play](https://play.google.com/store/apps/details?id=com.langogo.transcribe&hl=ja&gl=US)からダウンロードできます。（無料）
Vitisをダウンロードしてみた

今後自分で再現できるようにメモしておきます。

## 環境

Windows 10
Lenovo製

## 手順

Unified Installerをダウンロード、Windows用の2021.2をダウンロードしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/96ff382d-c091-6b36-2a2e-81566c1651a7.png)

インストーラーをダウンロードしたら、開きます。時間がたつとウェルカムページに飛ぶ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/d2c95874-dfcb-4c82-0dc8-5499b0992c61.png)

自分のメアドなどを打ち込んで、Download and Install Nowを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/d60ff4bc-0565-2435-7044-6ea16ab3e701.png)


Vitisを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/92e0b505-7e51-ad5a-09c9-6efb8cbbdfe9.png)

自分はUltrascaleしか必要ないので、ほかのチェックを外しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/529631c1-66e0-78f2-cecf-0799a66567fd.png)

同意する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/81208277-260a-d35c-b81a-99fe58799e43.png)

ダウンロード場所はそのままで

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/724d75f7-a726-ffd8-9757-ce5ec5a37cfd.png)

サマリーはこんな感じ.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/90425ff5-d65e-1460-37da-8fe94508b707.png)

これでとりあえず完了。
[Kotlin]Roomデータベースを使う時に出るエラーの対処法(M1 Mac環境)

#概要
KotlinのプロジェクトでRoomを使うと
![スクリーンショット 2021-11-03 16.24.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/c12027cb-e48e-a1fe-e930-4b46d757f53d.png)
こんな感じのエラーが出てきました。

`A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution > java.lang.reflect.InvocationTargetException (no error message)`

M1Mac環境で出るエラーのようですが、[stackoverflow](https://stackoverflow.com/questions/63649694/a-failure-occurred-while-executing-org-jetbrains-kotlin-gradle-internal-kaptexec)を参考にして解決する事が出来ました。


#本文
`build.gradle(:app)`

```kotlin

dependencies {
    // Room components
    implementation "androidx.room:room-runtime:2.3.0"
    kapt "androidx.room:room-compiler:2.3.0"
    implementation "androidx.room:room-ktx:2.3.0"
    androidTestImplementation "androidx.room:room-testing:2.3.0"
}
```

この記事を書いている時点のバージョン(2.3.0)だとエラーが出ましたが、バージョン2.2.4(もしくは2.2.5)に下げるとエラーが出なくなります。

```kotlin

dependencies {
    // Room components
    implementation "androidx.room:room-runtime:2.2.4"
    kapt "androidx.room:room-compiler:2.2.4"
    implementation "androidx.room:room-ktx:2.2.4"
    androidTestImplementation "androidx.room:room-testing:2.2.4"
}
```
#補足
そのうち改善されると思いますので、最新バージョンでエラーが出ていない方は最新バージョンをお使いください:balloon:
コーディング、どうする？

##「ありがとう」「すみません」の無限ループ列車とコーディング

数ヶ月前、IT系の企業に社会復帰し、早３ヶ月。PMまわりの仕事に関わらせていただいている。学ぶことが多すぎて、毎日、チーンと意気消沈で終わることが多い。救いは、出会いと学びがあること。

人との関わりが多い仕事のため、「thanks」「sorry」 「ありがとうございます」「すみませんでした」、の４フレーズはひっきりなしに使う。その中で、「sorry」と「すみません」については、超アジャイルの高速化が止まらない（悲）。ちまたではAgile is Deadアジャイルは死んだらしいということで、仕事がシンプルに「ありがとう」を中心に回せるようにLean化したいところである。

さて、自分の連日の意気消沈の理由は多々あるのだが、技術知識アップのために、今更ながらコーディングの101（基礎）から、学ぼうかとと少し考え初めている。

Linuxコマンドをかろうじて知っていたことが、まさかここで役立つなんて、、、という小さいガッツポーズの出来事があった。ちなみに大きな声では言えないが、かろうじて知っていたコマンドは`cd`, `ls -l`, `split`,といった爆笑級のもの。

言語習得はどちらかというと得意なはずが、なぜかコーディングはいまだかつて、スムーズに頭に入ってきたことがない。
例えば、1行１行読まずに、本の速読のときのようにページの全体を見れば、なにかしら画面上にイメージが浮き上がってくるようにまでなる、、、ということもあるのだろうか。

コードをみればmatrixの世界観（古！）は、別として、
とりあえず、短期習得なら、コーディング系のブートキャンプか、セルフコースだよね、、、とリサーチをはじめてみた。私のほうに、今更だけど、コーディングを学びたいという人もいるかもしれないので、自分の覚書的にリストアップしてみました。

##短期、詰め込みブートキャンプ系
未だビリーのブートキャンプが頭に浮かぶのは私だけ？
60時間で学んで習得できるのであれば、誰でもプログラマーになれそうと思わせるところが、本当はどうなのかが気になるものの、経済的余裕と60時間があれば試す価値はあり。


#####[CODE CHRYSALIS](https://www.codechrysalis.io/)　主にJavaScript

#####[LeWagon](https://www.lewagon.com/ja)　Web系:Ruby, データサイエンス系：Python

#####[TokyoStack](https://www.tokyostack.com/?ref=39)　Python, Java



##セルフラーニング
無料のものもあるが、有料のほうが質がいいと友人イチオシがpluralsight.
お金を払ったほうが必死になるっていう部分もあり、知識とググらずにすむ時間をお金で買えるならプライスレスか？ただし自分で続けるモーチベーションキープが課題。

#####[Pluralsight](https://www.pluralsight.com/codeschool) 
#####[Udemy](https://www.udemy.com/)

#####[edX](https://www.edx.org/)

[coursera](https://www.coursera.org/)

[code academy](https://www.codecademy.com/)

[freeCodeCamp](https://www.freecodecamp.org/)



##世界的大学にが行き放題！
有名所のオープン講義。時間があれば覗いてみる価値あり。

######ハーバード
https://online-learning.harvard.edu/catalog/free

######MIT 
https://ocw.mit.edu/index.htm

######スタンフォード
https://online.stanford.edu/free-courses



コーディングさえできればOK！なんてことはないし、
実際の開発には、gitとかオープンソースライブラリを上手に使う、開発環境の安全な構築などコードが書ける以外の知識部分を積み上げて行く必要がある。どのITのレイヤーでもセキュリティ部分というのがクローズアップされていることを考えると、コーディングとセキュリティに関する知識は大切。[Snyk](https://snyk.io/)が推奨しているような安全なコードで開発プロセスからのボトムアップでセキュリティを強固にという考えというのも普通になるのだろうと思う。


どうやってコーディングの知識を習得する部分で、調べていたけれど、
コーディングブートキャンプより、海外旅行に行きたくなってしまった。lol


最後まで記事を読んでいただきありがとうございました！