OmniAICreator/Qiita-1.07M huggingface dataset:
amazon-linux-extrasのミドルウェアサポート期間について

# 前提知識：OSのサポートとは具体的に何をしてくれるのか？

> OS のサポート期間とは不具合を修正するプログラムや、セキュリティを強化するプログラムなどの更新プログラムを提供する期間のことをいう。
> cf. https://pc-freedom.net/basic/%E4%BB%8A%E3%81%95%E3%82%89%E8%81%9E%E3%81%91%E3%81%AA%E3%81%84-linux-%E3%81%AE%E3%80%8C%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E6%9C%9F%E9%96%93%E3%80%8D%E3%81%A8%E3%81%AF%EF%BC%9F/

Linux OS = カーネル＋周辺ソフトウェア（cf. https://wa3.i-3-i.info/word1961.html ）であり、これがメンテナンスの対象となる。
具体的に何がアップデートされているのかというと、Amazon Linux2では https://aws.amazon.com/jp/amazon-linux-2/release-notes/ に記載されているような、kernel系のものとか、opensslとか、perlとか、pythonとか。。要は初期でパッケージ化されているものたち。

# 前提知識：Linuxディストリビューションは各々に独立しているわけではない

Fedora(RHELの開発版という位置付け) -> RedHat Enterprise Linux -> (RHELの複製) CentOS / Amazon Linux / Scientific Linux

> CentOSはRed Hat Enterprise Linuxのクローン
RHELは有償ながら、ソースは公開されている。なぜなら、RHELもLinuxだからだ。GPLのオープンソースを使っている以上、ソースは公開しないといけない。
CentOSは、そのソースを利用して、RHELとの完全互換を目指したLinuxディストリビューションだ。Red Hatとはまったく関係のないグループが、勝手に作ったディストリビューションである。今でも、Red Hatが公開したコードを元にCentOSが作られ続けている。
cf. 今更聞けない！CentOSとRed Hatの違いとは？
https://eng-entrance.com/centos_redhat

# パッケージ側でサポートが終了してもディストリビューションがサポートしてくれることもある

バックポート

> PHP 本体のセキュリティサポートは、例えば PHP 5.4 だと 2015/09/14 で終了4しているが、ディストリビューション側が脆弱性の対応を独自に行っている。
https://qiita.com/bezeklik/items/0823b14789d96f847d09

# AWS EC2 の amazon-linux-extras

> amazon-linux-extras とは、Amazon Linux 2 インスタンスにある PHP、Python、Golang、MariaDB などのパッケージをより新しいバージョンで利用できるようマネジメント管理するコマンド。
パッケージを最新にアップグレードする時に使える便利なコマンドです。例えば、php のバージョンアップなどで活躍できます。
cf. https://hapicode.com/server/aws-amazon-linux-extras.html#extras-library-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

> Extra Packages for Enterprise Linux (EPEL) のような位置づけで、通常はディストリビューション標準のパッケージを利用する一方で、特定のパケージではより新しいバージョンを試せます。
https://dev.classmethod.jp/articles/how-to-work-with-amazon-linux2-amazon-linux-extras/

ただし、amazon linux extrasで入れたソフトウェアについてはAWSは長期サポートはしないというポリシーっぽい。

> Extrasトピックのコンテンツは、長期サポートとバイナリ互換性に関する Amazon Linux ポリシーの対象外でございます。[2]よって、Extrasトピックで提供されるPHP7.3のサポート期限は、アップストリームのライフサイクルに準じます。

# 参考：EPEL/remiリポジトリ

どちらもサードパーティーのリポジトリ。なおremiを使うにはEPELが依存関係にあるのでEPELも使うことになる。

> remiリポジトリは、サードパーティリポジトリと呼ばれる、CentOSが標準で用意している以外のサードパーティが提供しているリポジトリの一種です。
 
> PHPスタックの最新バージョン、フル機能、およびその他のソフトウェアを、FedoraおよびEnterprise Linux（RHEL、CentOS、Oracle、Scientific Linuxなど）のユーザーに提供します。
が挙げられるようです。最新のphpをインストールできるということですね。
remiが提供しているパッケージには、php以外にもApacheやMySQLも入っているので、remiのパッケージを使うことでLAMP環境を構築できます。remiの使用に際して注意点があります。最新のパッケージを入手できるものの、発見されてないセキュリティホールが残っていたりするので信頼性が不安です。また、remiはサードパーティリポジトリでCentOSのサポート対象外なので、利用は自己責任です。
https://www.geekfeed.co.jp/geekblog/centos-remi-epel-php

> epelとは
> rhelの公式リポジトリに無いパッケージをfedoraの有志が作ってる。パッケージの信頼性は担保されてないので要注意。
> remiとは
> RedHatの中の人である、remiさん（♂）が提供してくれているリポジトリ。目的はphpやその他のソフトウェアをできるだけそのまま（最新バージョン）で提供すること。様々なバージョンのphpが在る。インストールにはepelが先にインストールさている必要がある。
> cf. https://it-afi.com/centos/post-1251/
pipでインストールしたものが「command not found」になるときの対処法

##前置き
pipで何かライブラリ等をインストールして、使用しようとしたら、「command not found」になることが過去に多々ありました。

最近はPythonを使っていなかったのですが、社会人になってしばらくしてまたPythonをやりたくなってジュピターノートブックをpipでインストールした際に、
「command not found」で動かないという事象が出ました。

今回はこれに対する簡単な対処法です。

##パスを確認する

```shell:ターミナル
command not found: jupyter
```
こうなった時は、まずはライブラリのパスを確認します。

```shell:ターミナル
pip3 show jupyter
```

すると、このように表示されます。

```shell:ターミナル
Name: jupyter
Version: 1.0.0
Summary: Jupyter metapackage. Install all the Jupyter components in one go.
Home-page: http://jupyter.org
Author: Jupyter Development Team
Author-email: jupyter@googlegroups.org
License: BSD
Location: /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages
Requires: ipykernel, ipywidgets, jupyter-console, nbconvert, notebook, qtconsole
Required-by:
```

##bashの設定ファイルにパスを通す

この中の、
Location: /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages
の部分に、ライブラリ(今回はjupyter)がインストールされています。

なので、このパスをbashの設定ファイルに追記してやります。

```shell:ターミナル
export PATH=/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages:$PATH
```

上記のコマンドでは、bashの設定ファイルに追記をしています。
そして、追記が終わったら、下記のコマンドを打ちます。

```shell:ターミナル
source ~/.bash_profile
```

こちらでは、export~で追記した内容を設定ファイルに反映させています。

これで、作業は終了です。
required init?(coder: NSCoder) を今更調べた

Storyboardを使用せずUIViewやcellなどのサブViewをinit()すると

```swift
required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
```

これを付けて！！と出てくるので,これまでは何も考えずにfixを押してましたが今更調べてみました。

そもそも
 
```swift
init?(coder: NSCoder) {
}
```

これはNSCodingプロトコルで定義されているメソッドらしい。（単純にこのプロトコルをUIViewが準拠しているからお知らせしてくれる）
NSCodingとは二つのメソッドを定義している
 ```init?...```他に ```func encode(with: NSCoder)```が存在する。
ドキュメントをそのまま翻訳すると、
 ```init? ```
⇨ アーカイブされていないデータから初期化されたオブジェクトをかえす。必須なやつだよ
 ```encode```
⇨ アーカイブで受け取ったやつをエンコードするよん

あんましよくわからない。。（英語弱者なだけかもしれないけど。。）

続いて ```NSCodingProtocol```
 ``` NSCodingProtocol```はクラスをエンコード、デコードするための二つのメソッドを提供しているよ（```init?```と ```encode（）```）。アーカイブやディストリビューションをするための基盤となるプロトコルです。
アーカイブってなに？
⇨オブジェクトとデータをディスクに保存し格納すること
ディストリビューションってなに？
⇨オブジェクトやデータと異なるスレッド間やプロセスでコピーすること））
OOP設計の原則に基づいてエンコード、デコードされるオブジェクトはインスタンス変数のエンコードやデコードをする責任があるので、
 ```init?()``` 提供されたデータから自身をインスタンス化するようにオブジェクトに指示する必要がある。
 ```encode()```提供されたインスタンス変数をエンコードする（アーカイブする）指示をオブジェクトに指示する

requiredが出てくるのではprotocolにinitをすると自動的にそうなるらしい。
うーん。理解が三ミリくらいしか進まなかった
[React] TypeScript基礎

React初心者です。
React+TypeScriptについて勉強した時のTypeScriptについてのメモです。

## TypeScriptとは？
- Microsoftが開発したオープンソースの言語。
- JavaScriptに型という概念を組み込むことで安全にバグの少ない開発ができるように。
- 開発者間で認識を合わせやすい。
- エディタで補完が効くので開発効率UP。
- コンポーネント志向のReactと相性がいい。

## TypeScript基本の型
- boolean型

```typescript
let bool: boolean = true;
```

- number型 数値

```typescript
let num: number = 0;
```

- string型 文字

```typescript
let str: string = "AA";
```

- Array型 配列

```typescript
let arr1: Array<number> = [0, 1, 2];
let arr2: number[] = [0, 1, 2];
```
- any型 どんな方でもエラーにならない

```typescript
let any1: any = false;
```

- void型 関数の型でvoidは何も返却していないことを表す

何も返却していない場合は、TypeScriptが察してくれるのであえて書かなくても平気。

```typescript
const funcA = (): void => {
  const test = "TEST";
}
```

- null型 nullを表す。

```typescript
let null1: null = null;
```
- undefined型 何も設定されていない状態を表す

```typescript
let undefined1: undefined = undefined;
```

- object　型 オブジェクト内の型を指定

```typescript
let obj: { id: number, name: string  } = {id: 0, name: "AAA" };
```

## 実装の例1 (引数に型指定)
```typescript
export const Test = () => {
  const calcTotal = (num: number) => {
    const total = num * 5;
    console.log(total);
  };
  const onClickTest = () => {
    calcTotal(10);
  };

  return (
    <>
      <button onClick={onClickTest}>実行</button>
    </>
  );
};
```
計算した合計をコンソールで出力する。
この場合引数に型を指定しないと`calcTotal(10);`の部分の数値に"1,000"のような形の文字列を入れた時`NaN`とコンソールに出力されてしまうので型を指定することで安全。
ちなみに`calcTotal("10");`のような数値の文字列を入れた場合はJavaScriptが変換してくれるので計算結果が普通に出力される。

## 実装の例2 (返却値の型指定)
```typescript
export const Test = () => {
  const calcTotal = (num: number): number => {
    const total = num * 5;
    return total
  };
  const onClickTest = () => {
    console.log(calcTotal(10));
  };

  return (
    <>
      <button onClick={onClickTest}>実行</button>
    </>
  );
};
```
今度は計算結果を返却する場合、返却値の型を指定することで`total`の値が数値であることを保証。

## 実装例3 (変数の型指定)
```typescript
export const Test = () => {
  const calcTotal = (num: number): number => {
    const total = num * 5;
    return total
  };
  const onClickTest = () => {
    let total: number = 0;
    total = calcTotal(10)
    console.log(total);
  };
  return (
    <>
      <button onClick={onClickTest}>実行</button>
    </>
  );
};
```
変数の型を指定することで変数は数値であることを保証。
所有者不在のチームへ所有者を追加する

## この文書は？

　所有者不在のチームへ所有者を追加する方法や注意事項についてまとめた文書です。


## 背景等

　システム上1人になった所有者をメンバーに落としたり所有者を削除することはできないようになっていますが、

- 所有者が退職しアカウントがなくなってしまった
- 所有者が長期休みなどで実質機能しなくなった

など、所有者が全くいない状態のチームが出来上がることがあります。チームについては必ず管理用IDを所有者に含めるなどのある程度の回避策はありますが、プライベートチャネルはIT管理者の預かり知らないところで作られることもあるため、完全に防ぐことは難しいです。

　簡単に所有者を追加することはできますが、いざとなると慌てるので手順をメモ。


## 所有者不在チームへの対応

　[Microsoft 365 管理センター](https://admin.microsoft.com/#/homepage)へ管理者IDでログインします。
「チームとグループ」→「アクティブなチームとグループ」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151198/15ab46d3-c468-bcde-a7d1-224e8623713f.png)

　対象のチームをクリックすると右側にメニューが表示されるので、「メンバー」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151198/6d3e0e89-333b-8e1b-7775-ebd8a8de663f.png)

「すべての所有者の表示と管理」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151198/04d4a799-7d11-1e83-4756-f0b45aab0ca8.png)

「所有者の追加」をクリックし、追加の所有者を登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151198/e71af352-0bdf-dc91-ad0a-0d0246523fe8.png)
　
　しばらくするとTeams側にもこの設定が反映され、新たな管理者が追加されます。


## 所有者不在プライベートチャネルへの対応

　[Microsoft Teams 管理センター](https://admin.teams.microsoft.com)にアクセスし、「チームを管理」をクリックします。チームの一覧が表示されるので、対象のプライベートチャネルのあるチームをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151198/66863a41-4c77-7f71-0dde-32540d1398ab.png)

　対象のチームをクリックし、「チャネル」を選ぶとチャネルの一覧が表示されます。対象のプライベートチャネルをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151198/5971302f-574f-d101-916a-16c4e69266e6.png)

　メンバー一覧が表示されるので、ここから所有者を改めて追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151198/d55b7192-2faf-4a31-3719-b02080eaa316.png)



## 再発防止

　完全な再発防止は難しいため限定的になりますが、以下のようなことが考えられます。

- Teams管理者IDを必ず所有者に追加しておく
    - ユーザ側所有者でTeams管理者IDを消すことは可能なため、完全には防げない
- 年1回のチームの棚卸し・権限検証を実施する
    - 急な退職等には対応しきれない


## 最後の所有者は削除できない

　Teams上で最後の所有者をメンバーにしようとしても、以下のような表示でエラーとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151198/48831287-468f-43d0-5fa0-ac5324c5755e.png)

　管理センターからも、最後の所有者は削除できません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151198/43a69692-5244-c77a-f652-8605aefa87de.png)



## 参考

- [孤立したグループに新しい所有者を割り当てる](https://support.microsoft.com/ja-jp/topic/%E5%AD%A4%E7%AB%8B%E3%81%97%E3%81%9F%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AB%E6%96%B0%E3%81%97%E3%81%84%E6%89%80%E6%9C%89%E8%80%85%E3%82%92%E5%89%B2%E3%82%8A%E5%BD%93%E3%81%A6%E3%82%8B-86bb3db6-8857-45d1-95c8-f6d540e45732?ui=ja-jp&rs=ja-jp&ad=jp)
    - Teamsのチーム以外のグループの所有者不在時も、この方法で対応出来るようです。
【ご紹介】iPadで英論文を爆速超快適に読めるようになるショートカットver.2【DeepL】

# いんとろ
みなさん論文読んでますかー！？僕はあんまり読めていません。
さて、そんなこんなで英語の論文を読むのに必要なのが、もはやお馴染みの[DeepL](https://www.deepl.com/translator)。翻訳がないとやってられませんよね！
パソコン版ならちゃんとしたアプリもあるしCommandにC連打でバシッと翻訳してくれます。
こんなのがiPadにもほしい！ということで作りましたよショートカット。
**いろいろやることはありますが、一度セットアップしちゃえばiPad最強の論文ヨミヨミマシンになること間違いなし！**

# もちべ
「でもそんなこと言ったってDeepLのショートカットなんて巷によくあるじゃん？」「既にAssistiveTouchに割り当ててるよ！」
確かにそうです、でもよくあるショートカットにはいくつかの不満がありました。

- 数式があると途切れる！
- ちょっと縦に長くて見にくい！

![IMG_4495.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339688/747db7e6-bb49-63ab-314c-344c6e1aefff.jpeg)


特に数式があると途切れてしまうというのは、論文を読んでいるときには**致命的**です。
と、いうわけでちゃんとAPIを叩くようにして問題解決しました、なのでVer2.0です。

# 動く様子
*※このiCloudリンクは古いものです。*

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">できた！<br>よくあるDeepLのショートカットだと、途中に数式とか特殊文字とか含むとそこで途切れちゃったりしてうまく翻訳できないから、直接API叩いて翻訳するようにした<br>結果も見やすいようにカスタマイズ<br>AssistiveTouchにショートカット割り当てて爆速<a href="https://t.co/4cUUiUfePf">https://t.co/4cUUiUfePf</a> <a href="https://t.co/r4M5oIvBIh">pic.twitter.com/r4M5oIvBIh</a></p>&mdash; Hiro (@hiro2do) <a href="https://twitter.com/hiro2do/status/1448999226898202626?ref_src=twsrc%5Etfw">October 15, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

![IMG_4499.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339688/94bcaa0e-a92f-6670-fe1c-602c08611fb4.jpeg)

# 使い方
DeepL APIを利用しているので**認証キー**をもらわないといけません。

## Step1 会員登録

[こちらのDeepLのサイト](https://www.deepl.com/pro#developer)から会員登録をします。
無料会員だと、

- 1ヶ月あたり500,000文字の上限があること
- 法人レベルのセキュリティが確保されていないこと

に注意してください。
また、無料会員でもクレジットカード番号の入力を求められますが、勝手に請求が来ることはないそうです。

# Step2 認証キーをコピー
**認証キー**をコピーします。アカウント情報の下の方にあるでしょう。
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:fx
という形をしています。

# Step3 ダウンロードとセットアップ

https://www.icloud.com/shortcuts/cbefaf27e4984887bed07124da43da5c

こちらからショートカットをダウンロードし、先程の**認証キー**を貼り付けます。

さらに、使うAPIによって、

| アカウント | APIのアドレス |
|:-----------|------------:|
| 無料       | https://api-free.deepl.com/v2/translate   |
| Pro     | https://api.deepl.com/v2/translate     |

と分かれているので、違う方は削除してください。
Pro版ではテストしてません、ご了承ください。

# Step4 (おまけ)AssistiveTouchに登録

**設定→アクセシビリティ→タッチ→AssistiveTouch**をオンにします。
このようにショートカットを登録すれば、テキストをコピーしたあと、黒ポッチを連打すればDeepLが開きます。

![IMG_0907.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339688/4495f652-75ff-e06d-7ce8-2d03d187bb73.jpeg)

また、**設定→アクセシビリティ→ショートカット（下の方）**からこのように設定し、

![IMG_0908.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339688/f3cdc2e1-5204-a037-fc3f-eae32d91a38a.jpeg)

**設定→コントロールセンター**でアクセシビリティのなんたらかんたら追加してやれば、黒ポッチの表示/非表示を簡単に切り替えることができます。

![IMG_0910.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339688/cfe5b9b9-f497-f3b5-4f56-254d31df0d1e.jpeg)

# 参考文献

[DeepL API](https://www.deepl.com/ja/docs-api/)
[【サンプル・デモあり】Bootstrap4でコピーしてTooltip(ツールチップ)を表示する](https://mo22comi.com/2021/01/10/bootstrap-copy-and-tooltip/)
git hooksでpre-commit hooksを使って自動化した話

git のcommit前にlintやらを差し込みたいなということgit hooksを使って設定してみました。

# git hooksとは
gitが提供している公式の機能でgitの特定のイベントをトリガーにして自分が設定したscriptを実行させる機構です。
例えば、push前にtestを実行をさせたり、commit前にlintを走らせたりできます。
今回は、commit前にlintを走らせる処理を書きました。

## 設定方法(pre-commit)
git hooks自体はgitに内蔵されています。
具体的には.gitの中にscriptのサンプルファイルがあります。

terminal でgitで管理しているプロジェクトのrootに移動して
下記のコマンドでhooksファイルがあるディレクトリに移動しましょう。

```shell
cd .git/hooks/ 
```

すると、以下のファイルがあり、 `.sample` という文字列をファイル名が除外して

```
chmod a+x <ファイル>
```
と権限を与えればhooksが有効になります。

```
applypatch-msg.sample     fsmonitor-watchman.sample pre-applypatch.sample     pre-merge-commit.sample   pre-rebase.sample         prepare-commit-msg.sample
commit-msg.sample         post-update.sample        pre-commit.sample         pre-push.sample           pre-receive.sample        update.sample
```

今回は pre-commitを使いたいので以下の用にリネームします。

`pre-commit.sample -> pre-commit`

## pre-commitのscriptを書く
実際にscriptを書きましょう。　
今回はgolang-ci-lintを使って

* lintを実行させる
* formatを実行させる

を行いたいので以下のようにしました。

```shell
#!/bin/sh

echo "lint start"

cd $(git rev-parse --show-toplevel)
RESULT=$(golangci-lint run pkg/...)

if [ -n "$RESULT" ]; then
echo "lint failed"
  exit 1
fi

git add .
echo "lint finish"
```
### lintの実行場所を固定にする

下記は必ずscriptの実行場所が必ずproject rootになるように、gitの管理場所を取得して、そのディレクトリに移動するようにしています。

```bash
git rev-parse --show-toplevel
```

### lintの実行結果を格納

下記はlintの実行結果を格納しています。
これはあまりよろしくなく、本来は終了ステータスを格納すべきですが、誤ってそのまま実行結果の文字列を格納しちゃってます。

```bash
RESULT=$(golangci-lint run pkg/...)
```

### 強制的にformatをかけてcommitさせる

pre-commit内でgit addしてる理由は、format後のファイルをステージするためにです。

```bash
git add .
```

golangci-lintはauto formatの機能があるので、実際のcommitは以下の処理順番になります。

* git commit コマンドを打つ
* pre-commitが発火
* golangci-lint run pkg/...　でファイルにformatがかかる
* git add .
* formatがかかって変更されたファイルが新たにstageされる
* commit 処理が走る

このようにしておくと、formatのかけ忘れなどを防ぐことができます。

# 管理方法
これでhooksは完成しましたが、.git内にファイルがある関係上このままではgit管理ができません。

なのでhooksファイルとhooksの参照先ファイルを変更します。
変更方法は以下の通り

適当なディレクトリを作り、そこのhooksファイルを移動

```bash
mkdir .githooks
mv ./git/hooks/pre-commit .githooks/
```

gitのhooksファイルの参照先を変更

```bash
git config core.hooksPath .githooks
```

hooksに実行権限を付与

```bash
chmod a+x .githooks/pre-commit
```

これで、hooksファイルの管理場所が.gitでは無くなったのでgit管理できるようになりました。

# 最後に
hooks といえば husky 自分で作るのは面倒くさいと敬遠していたのですが、重い腰をあげて作ってみると思いのほか簡単にできました。
何かの参考になれば幸いです。

それでは良い git hooksライフを
AWSを使った動画配信についてメモ

# AWSを使った動画配信についてメモ

## AWS Media Services

動画配信に使えるAWSの一連のサービス群

![スクリーンショット 2021-10-17 21.48.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336049/faaf6f65-ee0f-cbd8-c133-c7be2178adc0.png)

![スクリーンショット 2021-10-17 21.50.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336049/5ec36183-9178-173a-41c1-e7ebc8f3c6c8.png)

上記2つの画像は下記動画より参照
[【AWS Black Belt Online Seminar】AWS Media Services で始めるライブ動画配信](https://www.youtube.com/watch?v=HGUSCZd5zCw)

## ハンズオン 01 [AWSで動画配信をはじめよう](https://aws-mediaservices-jp.workshop.aws/)

前提:
- 有効なAWSアカウントがある
- OBSをインストールしていること

- 第一章 シンプルな HLS ライブ配信
    - 所要時間20-30分
    - AWS MediaStoreとMediaLive、OBSだけで完結する
    - OBS→MediaLive→MediaStore→hls.jsを使って配信確認

※ 第一章のハンズオンをした場合の料金 合計で0.68ドルぐらいかかりました。
数分程度のストリーミングでこれなのでやっぱり配信はお金掛かりますね。
![スクリーンショット 2021-10-17 16.29.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336049/2bfc337a-6295-bd89-5c29-981fab2411cc.png)


## OBS

- OOS リポジトリ→https://github.com/obsproject/obs-studio
- C, C++で書かれている
- 動画データの転送にはReal Time Messaging Protocol (RTMP) を使う
- [How to Use OBS Studio - Complete Tutorial for Beginners!](https://www.youtube.com/watch?v=-puA85ciDEM)

### インストール

- [【解説】OBS Studio(Mac版)のダウンロード・インストール方法](https://soundorbis.com/obs-mac-howtodl-install/)

## プロトコル

![スクリーンショット 2021-10-17 21.45.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336049/eb770384-3247-7e60-be9c-4e0c586cd35e.png)
[上記Black Belt 動画より](https://youtu.be/HGUSCZd5zCw?t=390)

### HLS(HTTP Live Streaming)

参照 [HTTP Live Streaming, HLSのまとめ　概要・仕組み・課題など](https://jp.vcube.com/sdk/blog/hls-http-live-streaming.html)

- HLSはApple社が開発した技術
- 現在ではHTTPストリーミング配信では最も多く利用されているプロトコル
- HLSはインデックスファイル（.m3u8）とセグメントファイル（.ts）に分かれて配信される
    - ハンズオン第一章で配信開始後にMediaStoreで.m3u8の拡張子を探した理由
- インデックスファイル（.m3u8）は動画をスムーズに再生させるように以下を記述
    - 配信形式を指定、
    - tsファイルの順番や秒数
    - ファイル名を定義
- セグメントファイル（.ts）
    - 動画コンテンツを格納したファイル
    - インデックスファイルに定義された規則に従って再生

### RTMP (Real Time Messaging Protocol)

参照: [RTMPの2021年以降の話 ~ Adobe Flash以外の動画配信での使われ方](https://dev.classmethod.jp/articles/rtmp-2021-and-beyond/)

- Adobe が開発している、Adobe Flash プレーヤーとサーバーの間で、音声・動画・データをやりとりするストリーミングのプロトコル
    - Flashの技術なので現在サーバ→デバイスなどの技術として使われているわけではない
    - 現在でも映像をストリーミングサーバなどに伝送する場面で活用されている
- TCPベース
- すぐには無くならないだろうが、別のプロトコルもあるのでゆくゆくは廃れるかも
Webアプリで作るのか、ネイティブで作るのか

#結論
ターゲットによって変わる。

ユーザー視点で見るとネイティブは、まずインストールしないと使われないので、ここでマーケティングの違いが出てくるかなと思います。

どんなサービスで、どのターゲットに向けて開発するかによって選択が変わるので、これから各々のメリデメを記述していくが、正直結論○○で作る方が良いとはいえない。（そりゃそう）

開発コストを十分にかけられるのであれば、どっちも作ればいいんじゃねとも言える。

#Webのメリデメ
###メリット
- 審査がない
- 新規ユーザー獲得に有利
- 開発コストがかからない
- アップデートの所作が不要
- インストール不要
- 課金制にしても手数料かからない

ストア申請が無いの良いですね。
アップデートを早く出来る。
また、フレームワークの豊富さやエンジニアが多いので、開発コストが削減できます。

###デメリット
- 継続的に使うのに不便
- 出先で使いたい
- プッシュ通知が来ない
- ネイティブと比較すると速度が遅い
- ずっとインターネットに接続している

PC持っている人少ないので、スマホで見ることが多いと思います。
その際に、毎回検索する必要がある（ブックマークしないといけない）、通信量が多いWebアプリは不利ですね。

#ネイティブのメリデメ
###メリット
- リピーターに強い
- 通信が少ない
- Webと比較すると動作が速い
- スマホ自体の機能使える
- PCよりもスマホ持っている人の方が圧倒的に多い

OSに最適化されているので、動作が直感的で速い。
また、API通信を必要に応じて行うので、通信量が少ないのが良いですね。

###デメリット
- アップデートに審査を通す必要がある
- インストールしないと使えない
- 課金制にするときストアに手数料を払う（知らんかった！）
- モバイルエンジニアが絶滅危惧種

個人開発の壁、審査。
謎に弾かれるときある。
経験したことないですが、iOSだとより厳しいみたいですね。

#個人的に
モバイルエンジニアとしては、スマホ自体の機能を使える点でネイティブが優れているなぁと思いました。
個人開発でカメラインテントや位置情報を使った機能を実装することでかなり充実したアプリにすることが出来たので。

#参考

https://yapp.li/magazine/2093/
rmコマンドが理解できてなかった

#はじめに
現在プログラミング学習を始めて３ヶ月目の初学者です。
学んだことをqiitaに投稿という形でアウトプットするため、また備忘録として記事を作成しました。

##Nginxの設定ファイルを編集
```
sudo vi /etc/nginx/conf.d/アプリケーション名.conf
```
nginxのconfファイルを設定しファイルの構文チェックをするため

```
sudo nginx -t
```
を実行、すると下記のエラーが出た

```
nginx: [emerg] duplicate upstream "puma" in /etc/nginx/conf.d/アプリケーション名.conf:1
nginx: configuration file /etc/nginx/nginx.conf test failed
```
ファイルが重複している、と出ているので

```
sudo rm vi /etc/nginx/conf.d/アプリケーション名.conf:1
```
で削除してみるがNo such file or directory
viはpathに関係ないコマンドで、:1がNginxの設定ファイルの1行目を指しているだけでpathに必要ないと分かったので、削除してもう一度実行したら上手く行きました。


##最後に
qiitaへの投稿に慣れていないので、分かりづらい上に情報が少ないですが、これから欠かさず投稿していこうと思います。
これからWeb開発を始める人に知ってほしいGitHubプロジェクト

## はじめに
当記事ではProgrammingを始める方や学生でこれからエンジニアを目指されている方々に私がよく紹介しているGitHubのプロジェクトを紹介します。基本英語ベースのプロジェクトですが、どのプロジェクトもきっと皆さんのキャリアにとって役に立つはずです。ぜひお役立ていただければと思います。
また、指導者、教育者側の方々も、教材として参考になるかと思います。

2021/11/14追記
MicrosoftがGitHubで無償で公開している学習教材をまとめました。こちらも合わせてお読みください。

https://qiita.com/ozora/items/9c801d3b0137eccc32fa

## 1. Web Developer Roadmap

https://github.com/kamranahmedse/developer-roadmap

このプロジェクトではWeb Developerになるまでにどのような知識が必要なのかを体型的にまとめてくれています。
これはFrontendのRoadmapの例ですが、以下のようにTopicにつき質問がいくつかあるのでそれに答えられるようになっていけば必然とFrontend開発を学ぶことができます。

![frontend.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407956/1d648d3b-77cd-3305-e211-a13a8a338ede.png)

HPもあり、こちらの方だとより詳しく言語ごとのロードマップなども紹介されています。

https://roadmap.sh/


## 2. AI Expert Roadmap

https://github.com/AMAI-GmbH/AI-Expert-Roadmap

こちらはWeb開発ではないけど似たようなプロジェクトがあったので参考までに。
AIを学びたい方向けのロードマップ。

## 3. First Contributions

https://github.com/firstcontributions/first-contributions

エンジニアだろうとデータサイエンティストだろうとGitHubを使った共同開発はもはや避けては通れません。
First ContributionsではどのようにしてPull Requestを作りコミュニティやチームに貢献しするのかを実際に体験することができます。GitHubでPull Requestを作ったことがない人は1度こちらで練習しておきましょう。

ちなみにこちらのプロジェクトは日本語に翻訳されています。

https://github.com/firstcontributions/first-contributions/blob/master/translations/README.ja.md

## 4. RealWorld

https://github.com/gothinkster/realworld

RealWorldはMedium.comのクローンアプリをデモアプリとして提供しています。
100を超える言語やフレームワークごとにそれぞれ実装されており、自分が学びたい言語、フレームワークの実務レベルの使い方をデモアプリを再現することで学ぶことができます。
難易度は少し高いですが、お勧めです。私は今でも新しいフレームワークについて学ぶ機会があると一度こちらでフレームワーク独特の書き方や作法などを確認したりしています。

## 5. Web Development for Beginner

https://github.com/microsoft/Web-Dev-For-Beginners

Microsoftが提供しているウェブ開発のために学習教材。Microsoftが提供しているだけあって教材の質はかなり高い印象です。HTML,CSS, JSがメインのコースです。

## 6. Awesome

https://github.com/sindresorhus/awesome

Programmingの世界では分野ごとの便利なライブラリや情報を集めたAwesomeというレポジトリがGitHub上に存在します。基本的にどの分野でもAwesomeが作られており、自分がこれから勉強する言語、フレームワークの情報を集めたりするのにお勧めです。

## 7. Coding Interview University

https://github.com/jwasham/coding-interview-university

こちらはコーディングインタビューのための情報をまとめたもの。
就職が近い方は目を通しておくといいでしょう。

## 終わりに

どのプロジェクトも有益ですので自分に合ったものをぜひ使ってみてください。
これらのプロジェクトは知っているだけで違うとおもいますので、これから学習を始める方の一助になれば幸いです。
GR-ROSE と Node.js のプログラムの間でシリアル通信（一方向）

表題の件を試した際のメモです。
GR-ROSE と Node.js のプログラムとの間で、一方向のシリアル通信を軽く試してみます。

## GR-ROSE側
以下の公式のプログラムを動かしてみます。

●GR-ROSE チュートリアル：IDE for GRでスケッチ | Renesas
　https://www.renesas.com/jp/ja/products/gadget-renesas/boards/gr-rose/project-arduino-sketch-ide-gr

開発には IDE for GR を使う形で、手順は上記のページ内のとおりです。
書き込みをする際、GR-ROSE のリセットボタンを押して USBドライブとして認識させてから行う、というのがあったりします。

プログラムは以下で、サンプルほぼそのままです。
遅延の設定だけ、100ミリ秒から 1秒に変えています。

```c
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(PIN_LED1, OUTPUT);
}
 
void loop() {
  // put your main code here, to run repeatedly: 
  digitalWrite(PIN_LED1, LOW);
  delay(1000);
  digitalWrite(PIN_LED1, HIGH);
  delay(1000);  
  Serial.println("hello");
}
```

こちらの動作確認を、IDE for GR のシリアルモニタで行っておきましょう。

以下のように、一定時間ごとに「hello」という文字列が出てくれば OK です。
![シリアルモニタで動作確認](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/7782eb99-c304-deda-7cb8-c36a8089b077.jpeg)

## Node.js側
Node.js側は、以下を使ったりするとシリアル通信を扱えるようになります。

●serialport - npm
　https://www.npmjs.com/package/serialport

かなり前ですが、以下の記事に出てくるお試しの際に、利用したことがありました。

●#toio を Alexa や micro:bit から操作する 〜概要編〜（JavaScriptライブラリを使ってみた） - Qiita
　https://qiita.com/youtoy/items/0ee56f5395e3f4c72c51

今回は、読み取りだけできれば良いので、[公式ドキュメントの Readline Parser のサンプル](https://serialport.io/docs/api-parser-readline)を利用します。
以下で「【自分の環境に合わせて変更】」と書いている部分は、ご自身の環境の設定に合わせて変更してください。

```javascript
const SerialPort = require('serialport')
const Readline = require('@serialport/parser-readline')
const port = new SerialPort('/dev/【自分の環境に合わせて変更】')

const parser = port.pipe(new Readline({ delimiter: '\r\n' }))
parser.on('data', console.log)
```

GR-ROSE は PC につないだまま動作させ、その状態でプログラムを実行すると、以下の出力が得られました。
![Node.jsのプログラムの実行結果.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/d41fc7ae-c818-3840-df82-c4f4debfffac.jpeg)

## おわりに
とりあえず、公式サンプルを流用した GR-ROSE と Node.js のプログラムの間でシリアル通信を試しました。

さらに、両方のプログラムに処理を追加していって、何か面白そうなものを作っていければと思います。
FTPサーバーとSFTPサーバーについて

#はじめに
未経験からwebサービスの開発エンジニアになって２週間目のペーペーエンジニアです！！
業務の中でFTPサーバー、SFTPサーバーというワードが出てきて、「聞いたことあるけど何のことだっけ？？？」という恥ずかしい事態になったので、ここに私の調べた知識を残します。
#FTPとは??
まずFTPは（File Transfer Protocol）の略です。文字通りファイルの転送を行うプロトコルになります！！
プロトコルは通信を行うときのルールのことです。ルールをお互い決めて通信しあわなければ、データの送受信できないですからね！！
###参考
https://www.keyence.co.jp/ss/general/iot-glossary/protocol.jsp
#FTPサーバーとは
FTPサーバーはファイルの送受信を行うためのソフトウェアです！！___ソフトウェアだったのです笑___
常識なのかもしれませんが、私が思い描いていたのはFTPサーバーというサーバーがあるのかと思っていたのですが、FTPプロトコルに則ってファイルの送受信を行うソフトウェアだったのです！！！なるほどなるほど笑笑
ではよくSFTPサーバーという名前も耳にしますが何が違うの？？
___予想は S がキーワードではないかと考えていました。___Safetyかな？？
#SFTPとは
安全という部分では一致しましたが、少し違いました！！sshにより暗号化された通信路を利用するファイル転送プロトコルなんです。
SSHについては以前記事書いたので、見てみてください笑


###参考
https://qiita.com/yusei_boxing/items/f993f2c7f9a0ec50b7bc
BuildNetDiagram - ネットワーク論理構成図自動生成ツール(Excel VBA)の紹介

### SNMPマネージャのネットワーク構成図自動生成機能

ネットワーク管理の世界では、

SNMPマネージャーと呼ばれる管理ツールがあり、Auto Discovery機能を使ってマネージャ側からICMPやSNMPで通信できるノード（IPアドレス）を検出し、

さらにSNMPを使って検出したノードからMIB情報を取得し、それらの情報からネットワーク構成図を自動生成する機能が用意されています。

ネットワーク構成図を自動生成する機能については、UNIXのX WINDOWが普及していた頃の1990年代前半にはすでにSNMPマネージャに実装され製品化されていました。

- SNMPマネージャ製品例
 - Zabbix<br>
     https://www.zabbix.com/
 - SNMPc<br>
     https://www.castlerock.com/products/snmpc/
 - HP OpenvView<br>
     https://ja.wikipedia.org/wiki/OpenView_Operations

ネットワーク構成図の自動生成結果については、ベンダーによってSNMP MIBの実装状況も異なるので、完璧な図を自動出力だけに頼って作成するのは難しく、自動生成後に手作業でノードやリンクの情報を修正・追加しなければならない場合がほとんどです。
また、物理構成についても反映させようとすると、１枚の図面に収めるのは困難です。

### 自分で取得したconfigからの自動生成について

SNMPマネージャを使って構成図を確認出来るのは、当然ですが、社内にいるユーザーで、管理コンソールの操作権限が与えられている人だけですよね。

構築中・更改中のNWシステム等で、
NW機器の設定情報(config)から、NW構成図を、さっと書き出したい時があります。

そんな時に便利なのが、こちらのツール。

### BuildNetDiagram - ネットワーク論理構成図自動生成ツール(Excel VBA)

https://www.vector.co.jp/soft/winnt/net/se517337.html

**(2021/10/20にver1.05の公開が開始されました）**

このツールでは、
事前にshow running-configなどの実行結果を自分で取得して用意しておく必要がありますが、
それらの取得結果からネットワーク論理構成図を自動生成します。

Cisco, AlaxalA, Foundary Networks, Fortigate, Aruba, BIG-IP等の機種のconfigの出力結果から、IPアドレスが割り当てられているインタフェース（物理インタフェースまたはVLAN）を自動で抽出し、ネットワーク論理構成図を自動生成します。自動生成の処理は、Excel VBAを使用しています。

ネットワーク論理構成は、取得したインタフェースIPアドレスの一覧を作成し、所属するネットワークをバス状に配置しています。同一のネットワークアドレスが使用されていれば、同一のバスで結ばれます。

しかし、あくまで同一のアドレスであれば結んでいるだけであって、実際の物理的接続が確立していることを保証しているわけではありません。
 
生成結果はExcelのShapeオブジェクトとして出力されるため、生成後に配置や大きさなどのプロパティを変更したり、コピー＆ペーストなどの操作で、他のアプリケーションに転用することも可能です。

|メーカー|config取得コマンド|BuildNetDiagramで検索対象の論理インタフェース設定コマンド|
|---|---|---|
|Cisco|show running-config|interface <インタフェース名><br>　ip address <IPアドレス>...|
|AlaxalA|同上|同上|
|BigIron|同上|同上|
|FastIron|同上|同上|
|HPE Aruba|同上|同上(vlanは書式が異なる)|
|Juniper|show configuration &#x7C; display set|set interfaces <インタフェース名> family inet address <IPアドレス>|
|Fortigate FW|show|edit <インタフェース名><br>　set ip <IPアドレス>...||

- BuildNetDiagramでの論理構成図出力例

 - 付属のsample2
![20211016_125600_sample2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262326/ed1b27af-62b0-a6fb-953c-c5b902d170ea.png)

 - インタフェース数が数千の場合
![DVC213oU8AAZPx3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262326/a2b0ef23-29e9-b471-abec-82af254d0b49.jpeg)
SpringBootのプロジェクトにlombok導入する

# はじめに
前回、[SpringBootの始め方](https://qiita.com/kihara-takahiro/items/366c4393731a9db02caf)で簡単なAPI作成ができるようにしました。今回は前回の記事にlombokを導入してボイラーコードを減らせるようにしつつJSONでPOSTされた結果をもとにレスポンスを返すようにしてみようと思います。

# Lombokの導入
## Lombokってなに？
[Lombok](https://projectlombok.org/)は Javaにおけるボイラープレートコードをソースコードから排除するために使用するライブラリです。
例えば`getter`や`setter`をJavaでは書くことが多いのですがこれらのコードを書かなくても良くすることで本質的に必要ではないコードを減らすことができます。

## build.gradleの設定
前回作成した`build.gradle`に`org.projectlombok:lombok`を追加します。

```gradle:build.gradle
plugins {
	id 'org.springframework.boot' version '2.5.5'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	// Lombokを使用するために追加
	compileOnly 'org.projectlombok:lombok'
}

test {
	useJUnitPlatform()
}

```
準備といえばこれくらいでlombokは簡単に導入できます。
eclipseになんかlombok用の設定が必要だった気もしているのですが…(コンパイルはできるけど入力補助してもらえないと思います)
既にその設定が入ってしまっているので、自分の環境では再現できませんのでうまくいかなかったときにはその視点で見てみていただければと思います。

# JSONの内容をそのまま返すようなエントリーポイント作成
## リクエストの作成

```java:TestRequest.java
package com.example.demo.app.request;

import lombok.Data;

@Data
public class TestRequest {
	private String test;
}
```

## レスポンスの作成

```java:TestResponse.java
package com.example.demo.response;

import lombok.Data;

@Data
public class TestResponse {
	private String test;
}

```

## エントリーポイントの作成
前回作ったコントローラーに`test2`を追加します。

```java:TestController.java
package com.example.demo.app.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import com.example.demo.app.request.TestRequest;
import com.example.demo.response.TestResponse;

@RestController
public class TestController {

	@GetMapping("/test")
	public String test() {
		return "Hello World";
	}
	
	@PostMapping("/test2")
	public TestResponse test2(@RequestBody TestRequest request) {
		var response = new TestResponse();
		response.setTest(request.getTest());
		return response;
	}
}

```

見ると分かるのですが`TestRequest`や`TestResponse`には`getter`や`setter`を記載してませんが、`@Data`のアノテーションがついているため`getTest`や`setTest`が使えます。(`@Data`はほかにもいろんなコードが追加されますがここでは省略)

# 動作確認
JSONをリクエストしてみると下記の通りそのままJSONを返却してくれるようになってます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524088/165ffcc6-476f-228b-367f-1716494142c7.png)

# おわりに
lombokを使うのは長くJavaをやってきた人にとって抵抗がある人もいるんじゃないかと思いますが、実際に使ってみると便利なことも多いなと思いますし、今回紹介したものだけでなくいろんなコードの省略が可能なのでぜひ使ってみていただければと思います。
FreeFEMの計算結果をParaviewで可視化

#WSL環境でFreeFEMを使う
wsl環境だとgnuplotでの可視化にxmingが必要だったりで、計算結果が可視化しずらかったのでParaviewで可視化した。


# 公式チュートリアルを解く
FreeFEMの公式ドキュメントのThermal Conductionを例題として実施する
問題設定と境界条件は公式を参照されたい。

https://doc.freefem.org/tutorials/thermalConduction.html

```FreeFEM:ThermalConduction.edp
// Parameters
func u0 = 10. + 90.*x/6.;
func k = 1.8*(y<0.5) + 0.2;
real ue = 25.;
real alpha=0.25;
real T=5.;
real dt=0.1 ;

// Mesh
mesh Th = square(30, 5, [6.*x,y]);

// Fespace
fespace Vh(Th, P1);
Vh u=u0, v, uold;

// Problem
problem thermic(u, v)
    = int2d(Th)(
          u*v/dt
        + k*(
              dx(u) * dx(v)
            + dy(u) * dy(v)
        )
    )
    + int1d(Th, 1, 3)(
          alpha*u*v
    )
    - int1d(Th, 1, 3)(
          alpha*ue*v
    )
    - int2d(Th)(
          uold*v/dt
    )
    + on(2, 4, u=u0)
    ;

// Time iterations
ofstream ff("thermic.dat");
for(real t = 0; t < T; t += dt){
    uold = u; //equivalent to u^{n-1} = u^n
    thermic; //here the thermic problem is solved
    ff << u(3., 0.5) << endl;
    plot(u);
}
```
# Paraviewで読み込める形式で出力
Paraviewはvtkファイルでしか読み込めないので、上記のサンプルコードの結果をvtkファイル形式で書き出す。
公式チュートリアルのVisuallizationを参考に作成した。

```FreeFEM:vtk.edp
load "iovtk"

mesh Th = square(10, 10, [2*x-1, 2*y-1]);

fespace Vh(Th, P1);
Vh u=2-x*x-y*y;

int[int] Order = [1];
string DataName = "u";
savevtk("u.vtu", Th, u, dataname=DataName, order=Order);
```
1行目のload文と下3行でvtkファイルに書き出しているので、その部分を先のThermal Conductionに追加する。

```FreeFEM:ThermalConduction.edp 

load "iovtk" //追記

// Parameters
func u0 = 10. + 90.*x/6.;
func k = 1.8*(y<0.5) + 0.2;
real ue = 25.;
real alpha=0.25;
real T=5.;
real dt=0.1 ;

// Mesh
mesh Th = square(30, 5, [6.*x,y]);

// Fespace
fespace Vh(Th, P1);
Vh u=u0, v, uold;

// Problem
problem thermic(u, v)
    = int2d(Th)(
          u*v/dt
        + k*(
              dx(u) * dx(v)
            + dy(u) * dy(v)
        )
    )
    + int1d(Th, 1, 3)(
          alpha*u*v
    )
    - int1d(Th, 1, 3)(
          alpha*ue*v
    )
    - int2d(Th)(
          uold*v/dt
    )
    + on(2, 4, u=u0)
    ;

// Time iterations
int[int] Order = [1];  //追記
string DataName = "u";  //追記
ofstream ff("thermic.dat");
for(real t = 0; t < T; t += dt){
    uold = u; //equivalent to u^{n-1} = u^n
    thermic; //here the thermic problem is solved
    ff << u(3., 0.5) << endl;
    plot(u);
    savevtk("u"+ t*10 +".vtu", Th, u, dataname=DataName, order=Order); //追記
}
```
savevtkの第一引数は書き出すファイル名。
paraviewで時系列の結果を表示するため、for文中で各時間の結果を書き出した。
paraviewで読み込む際にグループファイルとして認識される。
for文では時間刻み0.5秒で計算しているが、parviewで表示の時間刻みが1ステップ単位のため、経過時間をそのままファイル名とするとうまく表示できなかったため、経過時間を10倍したを数値をファイル名に着けたし書き出した。

# 可視化
書き出したvtkファイルをParaviewで読み込んで、コンターでuの分布を表示することができた。

初期状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368218/3efc790f-0c56-e294-0ac5-4507adc624c3.png)

5秒後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368218/f62a9006-a625-5609-572a-80d794b25eee.png)

以上、Ubuntu版FreeFEMをWSLで回し、Paraviewで結果を可視化できた。
JDMCエンジニアの会のご紹介

# 1.エンジニアの会とは
はじめに、JDMCエンジニアの会とは何なのかについてご紹介します。
JDMCエンジニアの会は、その名の通りJDMC（日本データマネジメント・コンソーシアム）という団体のコミュニティ事業として、2017年から活動をしています。

JDMCについては、公式Webサイトにある会長のご挨拶をご覧ください。
[JDMC公式サイト-ご挨拶](https://japan-dmc.org/about/)

> 〜会長挨拶より抜粋〜
設立当初より真にデータを活用し、企業の国際競争力に貢献することを目指し、会員企業が自らの枠を超えて積極的にデータマネジメントの普及に向けた活動を行っていただける場の提供とデータ活用のための様々な情報発信を行う団体です。

普段データに触れる立場にいる方、あまりデータに触れないが興味はある方、エンジニアの会と名付けてはいますが、どなたでも気軽に参加いただける交流の場です。

# 2.立ち上げた背景
JDMCでは、テーマを設定した研究会や、セミナー・勉強会、参加企業による定例セミナーなど、内容の濃い素晴らしい事業が行われています。
しかしエンジニアにとって、そこで得た知識・知見、他社の事例を、自社へ持ち帰って実践することは中々難しく、データ活用の幅が広がらないことを課題として感じていました。

そんな中、エンジニアがなるべく簡単にかつ実際にデータに触れてみる場を作り、手を動かしながらデータ分析を体験できる場づくりをしていこう、ということで「エンジニアの会」と銘打ったコミュニティを立ち上げることになりました。

# 3.活動内容
このエンジニアの会では、なるべくカジュアルに参加できるイベントを企画し、エンジニアが明日持ち帰って実践できるデータ分析体験をしてもらうことを目標に活動しています。

立ち上げた2018年から2年間は、まず誰もが気軽にデータの収集を行うことを体験することを目標に、オープンデータや、データを収集するアプリケーションなどを活用しながら、小さなデータ分析基盤の仕組み作りをハンズオン形式で行いました。

その後、好評ではあったものの、テキスト通りに作ることに終始してしまうという、課題感も残ったハンズオンからフェイズを変え、「可視化と分析」にフォーカスしたより実践的な場づくりを目指します。

JDMC会員の企業にご協力をいただき、マスキングされたマーケット・顧客データを活用した分析コンテストを計画し、年間を通した活動の中で分析に必要な知識・手法を学び、その集大成として実データを用いたコンテストにより参加者がその知識を発揮する場を提供しました。

この辺りになると、エンジニアの会への参加者も、エンジニアだがデータ分析とは距離のあった人や、データ分析とデータを元にした企画・提案などを職業とする非エンジニアの人など、様々な経歴やスキルを持つ人が集まってきていることが分かってきました。

そこで2021年からは、さらに一歩、現場で使える体験を提供するため、経営に刺さるデータ分析と可視化とは何か、課題設定〜プレゼンまでを体験する取り組みを行っています。

このようにエンジニアの会では、共に学びながら、持ち帰って実践できる体験の場を提供することを重視した活動を続けています。

# 4.情報発信
情報発信の場としては、JDMCのWebサイト以外にも、エンジニアの会も含めたJDMCジャーナルを公開しています。
こちらでは、各種セミナーや部会の様子、もちろんエンジニアの会の開催レポート、さらには各参加企業様がもつ
知見などに触れられるコンテンツを用意しています。
[JDMC公式サイト](https://japan-dmc.org/about/)
[JDMCジャーナル](https://japan-dmc.org/)

また、こちらのQiitaでも、JDMCエンジニアの会として活動を発信する場としてどんどん投稿していく予定です。
みなさまお楽しみに！

# 5.終わりに
さいごに、データドリブンな意思決定が重要と言われている時代、JDMCが果たす役割は大きいと感じています。
そのJDMCをカジュアルな側面から支える事業として、エンジニアの会を成長させて行けたらと思っています。

もし、興味を持っていただけたら、お気軽に事務局までお声がけください。

日本データマネジメント・コンソーシアム（JDMC）事務局　
info@japan-dmc.org
Goでcsvデータを読み取り、DBに保存

# はじめに
csvのデータをDBに保存しなけらばならなくなり
csvデータをDBに保存する　機能を作成しましたのでメモ程度に記載します。

環境は　echo+gorm+docker です

##ディレクトリ

```
Project
├──docker
|    ├──go
|    |   └──Dockerfile
|    └──mysql
|     
├──docker-compose.yml
└── src | 
     └──go
        ├── controllers
        ├── database
        ├── csv
        |    └──schooldata.csv
        |
        ├── db (migationとかseedとか)
        ├── dbconfig.yml
        ├── go.mod
        ├── go.sum
        ├── main.go
        └── fresh.conf
```
##実行するgoファイル

今回は
schoolsというテーブルに
csvの学校データを大量に読み込むという想定で作成しました。

```golang
package main

import (
    "encoding/csv"
    "os"
    "fmt"
    "api/database"
    "github.com/jinzhu/gorm"
   _ "github.com/jinzhu/gorm/dialects/mysql"
)

type Schools struct {
    Area   string    `gorm:"column:area"` //学校の所在地
    Name   string    `gorm:"column:name"` //学校名
}

func main() {

    db := dbconnect.Connect()
    defer db.Close()
    
    if err := readingcsv(db);err != nil {
        fmt.Println(err)
    }

}

func readingcsv(db *gorm.DB) error {

   
    //読み込むCSVファイルを記載
    csvFile, err := os.Open("csv/schooldata.csv") 
    fmt.Println("csvは読みこめませんでした")
    if err != nil {
        return err
    }
    defer csvFile.Close()

    reader := csv.NewReader(csvFile)
    reader.FieldsPerRecord = -1
    record, err := reader.ReadAll()
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }

    for i := 0; i < len(record); i++ {
        fmt.Println(record[i][0])
        fmt.Println(record[i][1])

        schools := Schools{Area: (record[i][0]),Name:(record[i][1])}
    
        if err := db.Create(&schools).Error; err != nil {
            fmt.Printf("%+v", err)
        }
    }
    return nil
}

```

あとは実行するだけ

```docker
docker-compose exec go go run main.go
```
再帰関数の処理される順番

Pythonでアルゴリズムの学習中に再帰関数を学んだが、「再帰関数でループしたらその下の行の処理いかないんじゃね？」みたいな感じで処理の順番があやふやなところが多いので、下の例を実装しながら理解を深めていく。

## 再帰関数とは
定義中の関数の中で、その関数（自分自身）が呼び出される関数のこと。「再帰呼び出し」とも呼ばれる。
繰り返し処理などで使われる。

## 実装
再帰関数totalでどのような値が出力されるか考える。

```python:Python
def total(data):
    if data <= 1:
        return data

    value = total(data - 1)

    return sum(value)


def sum(value):
    return value + 3


print(total(3))
```
まず、引数に`3`が入れられたtotal関数が呼び出される。ここで、引数`data`が`1`以下の場合は「1」が返されるが、現状は`3`なので無視。

次に、変数`value`が定義されているが、ここで同じ関数が呼び出される(再帰呼び出し)。引数は`data - 1`なので、`2`になる。ここでは`return sum(value)`に進まず、total関数が再び上から処理される。引数dataは`2`で１以上なのでdataはreturnされず、再び変数`value`が定義される（引数は1）。ここでついに引数dataが`1`になったので、`1`がreturnされ（無限ループすることはない）、引数が`2`のtotal関数の変数`value`の値は`1`になる。そして、`return sum(value)`に進むことができる。

sum関数は引数に`+ 3`した値を返すだけなので、ここでは`1 + 3 `で`4`が返される。ここで、引数が`2`のtotal関数は`4`が返されたので、引数が`3`のtotal関数の変数`value`に`4`が与えられる。そして、`return sum(value)`に進み、`4 + 3`で`7`が返され、`7`が出力される（引数が`3`のtotal関数を出力するのでこれで終わり）。



## まとめ
様々なソートのアルゴリズムで難しい再帰関数の使われ方がされており、理解に苦しんでいたが、これを機に少しは楽になった。再帰関数はあまり使うことはないと思うが、頭の片隅にでも入れておくと良いだろうと思った。
laravel-mixの4から6へのアップデート

2021/10/16時の最新版は`laravel-mix@6.0.34`
6から`npm run dev`などで展開されるスクリプトに変更があるのでpackage.jsonを修正する必要がある。

https://qiita.com/hiro5963/items/b76042762eb39133d80c
expressでの静的ファイル指定方法

NodeJSのexpressを使用してWEBアプリを作った際に画像ファイルの読み込みで苦労したので備忘録として記載する

簡単なファイル構成
※内容の説明に不要なものは記載を省略

```
root
 ├ public
 |  ├ img
 |  |   └ exsample.png
 |  ├ css
 |  └ JavaScript
 ├ views
 |  ├ contact
　　|  |    └contact.ejs
 |  └ iundex.ejs
 └app.js   
```

まずはapp.jsで静的なファイルが使えるようにする

```app.js
app.use("/public", express.static("public"));
```

これによって/publicを公開され、全HMLファイル（今回はejsファイル）で使用できるに用なる

あとはejsファイルで以下のように記載するだけ

```index.ejs
　　<img src="/public/img/example.png"　alt="テスト画像画像"　/>
```

ejsファイルのディレクトリの階層が変わっても問題ないです

```contact.ejs
　　<img src="/public/img/example.png"　alt="テスト画像画像"　/>
```

これでディレクトリが深くなったりしても問題なく画像が表示できます。
日記 WindowsのChromeでSSL証明書がLet's Encryptのサイトが開けないので新しいルート証明書を手動でインストールした

## 概要

### 現象

SSL証明書がLet's Encryptのサイトを開くと次のようになる
「この接続ではプライバシーが保護されません。www.hoge.jp では、悪意のあるユーザーによって、パスワード、メッセージ、クレジット カードなどの情報が盗まれる可能性があります。NET::ERR_CERT_DATE_INVALID」
となるのでわざわざ詳細情報を開いてから"アクセスする"をクリックしないといけないのがわずらわしい
※FirefoxはOSにあらかじめインストールされているルート証明書を無視するので発生しない
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1765459/fcc4532a-a2a4-470e-fda0-b3cba30eeb72.png)

### 原因

Windowsにインストールされているルート証明書「DST Root CA X3」の期限が2021/09/30のため
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1765459/a7342152-82ff-40eb-f590-6f16955e582c.png)


### 対応

手動で新しいルート証明書「ISRG Root X1」をLet's Encryptから拾ってきてインストールする

## インストール手順

### 1.「ISRG Root X1」をダウンロード

次のページを開き保存
https://letsencrypt.org/certs/isrgrootx1.pem.txt

### 2.インポートする

インターネットオプションを開きコンテンツタブを選択し、証明書ボタンをクリックする
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1765459/422f75c1-6ef5-7cce-a389-61391b4c7db9.png)
インポートをクリック
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1765459/6f35c3c0-a11a-6cd2-e423-b94f3fb8e452.png)
ダウンロードしたisrgrootx1.pem.txtを選択
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1765459/651fb834-4ff5-30e2-01a6-2db317c579e5.png)
拡張子の絞り込みがデフォルトでかかっているので「すべてのファイル(*.*)」に変更して選択
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1765459/40ff074e-e3d4-8630-8c10-e691becf2a8b.png)
証明書ストア-「信頼されたルート証明機関」へ
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1765459/de2739e6-d514-74d3-7503-01d98d24f2f5.png)
インストール
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1765459/9fb0ed6f-45b1-b128-8e89-a7f89b76b3ab.png)
「信頼されたルート証明機関」に「ISRG Root X1」がある事を確認
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1765459/bf7f9b3e-7bf5-4389-d111-c3e43e78fede.png)

### 3.「ISRG Root X1」が有効になっている確認する

Chromeを再起動してから、次のページへアクセスする
https://valid-isrgrootx1.letsencrypt.org/

以上
テスト49

```vb
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lparam As Any) As Long

Private Const BM_CLICK As Long = &HF5
Private Const WM_ACTIVATE As Long = &H6

Sub Word_End()

Dim hWnd As Long
Dim btn_hwnd As Long
Dim strPassword As String
Dim str As String

Shell "winword.exe C:\Users\User\Desktop\VBA練習\PDF\test3.pdf"
'---------------------
'間違ったPWを入れる処理
'---------------------

'「パスワードが正しくありません～」のメッセージボックスのハンドルを取得
Do Until hWnd <> 0

    hWnd = FindWindow("#32770", "Microsoft Word")
    DoEvents
    
Loop

'ｃ⌒っﾟωﾟ)っφ　ﾒﾓﾒﾓ...

'OKボタンのハンドル取得
btn_hwnd = FindWindowEx(hWnd, 0&, "Button", "OK")

'OKボタンをフォーカス
Call SendMessage(btn_hwnd, WM_ACTIVATE, 1, 0&)

'OKボタンを押す
Call SendMessage(btn_hwnd, BM_CLICK, 0, 0&)

End Sub
クライアント視点で Samba サーバが公開しているディレクトリを確認する


|本シリーズのトップページ|
|:--|
|[[備忘録] Samba サーバおよびクライアントの実践例](https://qiita.com/robozushi10/items/47ea76140de4d3605cf3)|

## 概要

クライアント視点から Samba サーバ (192.168.1.1) が公開しているディレクトリを確認する.
接続アカウントは「foo」とする.
また、Samba サーバには MYPROJECT という共有フォルダがあるものとする ([関連記事](https://qiita.com/robozushi10/items/7ff0626e928884b764c6))

```bash
$ smbclient -L 192.168.1.1 -U foo
WARNING: The "syslog" option is deprecated
Enter WORKGROUP\foo's password:
 
        Sharename       Type      Comment
        ---------       ----      -------
        print$          Disk      Printer Drivers
      🛑MYPROJECT       Disk
        IPC$            IPC       IPC Service (Cosmos server (Samba, Ubuntu))
Reconnecting with SMB1 for workgroup listing.
 
        Server               Comment
        ---------            -------
 
        Workgroup            Master
        ---------            -------
        WORKGROUP            XXXXXXXXXXXXX
【TypeScript】useRefを使ってテキストフィールド実装

```ts
import { useRef } from "react";

const sendInput = (inputValue: string | undefined) => {
  console.log(inputValue)
  
}

function App() {
  const inputRef = useRef<HTMLInputElement>(null);
  return (
    <div className="App">
      <input ref={inputRef} type="text" />
      <button onClick={()=>sendInput(inputRef.current?.value)}>送信</button>
    </div>
  );
}

export default App;
```
git diff　コメント行無視で変更行数を数える

自分用メモ。論理LOCでステップ数を数えるため用。
（新規ファイルではなく既存ファイルの変更行数を数える）

**変更した行数の確認**

```
git diff --stat -w -B -I '^\s*\/' <変更前のコミットID> <変更後のコミットID>
```

**変更した内容の確認**

```
git diff -w -B -I '^\s*\/' <変更前のコミットID> <変更後のコミットID>
```

<変更前のコミットID> <変更後のコミットID>に関してはブランチ同士でも確認可能

--stat 変更行数を確認するときに役立つ
-w スペースのみの変更も無視する
-B 空行の追加・削除を無視する
-I　正規表現にマッチした表現を無視する

正規表現　'^\s*\/'
* 直前の文字が０回以上繰り返す場合にマッチ
\s　垂直タブ以外のすべての空白文字
^　直後の文字が行の先頭にある場合にマッチ

以下のサイトを参考にさせていただきました。大変助かりました。
<dl>
  <dt>git diff関連 参考サイト</dt>
  <dd>https://qiita.com/uedatakeshi/items/5e467b3aaa7a0ecfa011</dd>
  <dd>https://maku77.github.io/git/stats/count-changes.html</dd>
  <dd>https://iww.hateblo.jp/entry/20110605/p1</dd>
　　　　<dt>正規表現 参考サイト</dt>
  <dd>https://murashun.jp/article/programming/regular-expression.html</dd>
</dl>
【Mac】悪質なソフトウェアかどうかをAppleでは確認できないため開けられないファイルを開ける方法

#はじめに

mysqlの学習を進めるなかで、MySQL Workbenchのインストール後開けることができず一瞬戸惑ったので記録しておきます。

#起こったこと

![4ECBDCBE-A926-49DC-9898-ADE08958D614.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/973512/22c26f75-9df0-acbb-7eab-fcb7ea05ea14.jpeg)

#対処法

controlキーを押しながらクリックすると「開く」が選択可能に！
rollup-plugin-postcssを調べていたメモ

## これは何

- コンポーネントライブラリを作るためにRollupを使っています
    - https://www.npmjs.com/package/rollup-plugin-postcss
- RollupでCSS Modulesで書いたスタイルをバンドルするために`rollup-plugin-postcss`を使っていて、設定にハマってしまったのでメモとして残す記事です

:::note alert
この記事は「単にライブラリを使用するだけでは解決できなさそうで、ライブラリ自体にPull Requestを出すでもしないといけない」ことを示すための記事であり、根本的な解決には至りません。ライブラリ使用を諦めるか、次善策として別なオプションを使うかを判断するのに参考にしてもらえれば幸いです。
:::

## 前提

CSS Modulesを扱うために`rollup.config.js`の中でpluginsで`rollup-plugin-postcss`を使い`extract: true`と`modules: true`を指定していました。

```javascript:rollup.config.js
// ...いくつかのプラグインのimport
import postcss from "rollup-plugin-postcss"

export default [
  {
    input: "src/index.ts",
    output: [], // 中身は省略
    plugins: [
      // ...いくつかのプラグインの呼び出し
      postcss({ extract: true, modules: true })
    ]
  }
]
```

現時点ではビルドしたフォルダの構成はこのようになっています。

- build
    - components
    - index.css
    - index.d.ts
    - index.js
    - index.js.map

## 変えようと思った箇所と理由

「`extract: true`にするとcssファイルを1つにバンドルしてくれるから良いじゃん」と思っていたものの、よくよく考えると以下のようなことが起きるので設定を変えようと考えました。

- ライブラリを使う際、グローバルなスタイルとして`import 'library-name/index.css'`のように指定しないといけない
- ライブラリが大きくなれば当然CSSのファイルも大きくなる

## トライしたことと分かったこと

ひとまず、単に`extract: true`を抜いてビルドしてみます。

```diff_javascript:rollup.config.js（変更後）
  export default [
    {
      input: "src/index.ts",
      output: [], // 中身は省略
      plugins: [
        // ...いくつかのプラグインの呼び出し
-       postcss({ extract: true, modules: true })
+       postcss({ modules: true })
      ]
    }
  ]
```

するとビルドしたフォルダの構成がこのように変わりました。

- build
    - components
    - node_modules
        - style-inject
            - dist
                - style-inject.es.js
                - style-inject.es.js.map
    - index.d.ts
    - index.js
    - index.js.map

`index.css`が消えたのは狙い通りですが何故か`node_modules`が生成されてしまっています。

この状態でimportしても`Uncaught Error: Cannot find module '../node_modules/style-inject/dist/style-inject.es.js'`と表示され、使えません。

依存関係に`style-inject`を含めるなど試していたのですが、結局上手くいきませんでした。

色々調べていたらこんなIssueを発見。

https://github.com/egoist/rollup-plugin-postcss/issues/381

要約&意訳&拙訳ですが、以下のような話をしています

- `Uncaught Error: Cannot find module '../node_modules/style-inject/dist/style-inject.es.js'`と出てしまう
- `style-inject`を依存関係に含めつつ、ビルドされたコードのうち'../node_modules/style-inject/dist/style-inject.es.js'の部分を'style-inject'に書き換えてしまえば動いた
- 実は2021年5月にPull Requestが作られているものの、テストが失敗しているのでマージされていない
    - https://github.com/egoist/rollup-plugin-postcss/pull/375
- しかも`style-inject`にはスタイルを逆順に注入する問題が見つかり、詳細度の違いで意図せぬスタイルを引き起こすかもしれない
    - https://github.com/egoist/style-inject/issues/23

力技で書き換えるだけならまだしも、書いたのと逆順にスタイルが注入されるのは困りそうです。

## 最終的に

`extract: true`のままにするか、他のライブラリでCSS Modules対応を考えるか、いっそCSS in JSでライブラリのスタイルを組み直すか……。
いずれにせよ、別な方法を考えないといけないことだけは分かりました。

同じ箇所にハマって時間を使ってしまう人が減れば良いなと思って投稿します。
Sambaでアカウント「foo」を使って「パスワードあり」の共有フォルダを公開する

|本シリーズのトップページ|
|:--|
|[[備忘録] Samba サーバおよびクライアントの実践例](https://qiita.com/robozushi10/items/47ea76140de4d3605cf3)|

## 概要

Sambaでアカウント「foo」を使って「パスワードあり」の共有フォルダを公開する．
共有フォルダは /home/foo とする.

アカウント「foo」を Linux の /etc/passwd と、Samba サーバの両方に作っておく点が
初見だと分かりにくいと思う (私はそうでした)


## 環境

```bash
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS"
```

## 手順

### 1. Sambaサーバである Linux 上にアカウント「foo」を作成しておく

もしも細かく設定したい場合は、useradd のオプションを確認してください.

```bash
$ sudo useradd foo
```

### 2. Windows 向けのアカウント「foo」を作成する

Samba では Linux 上の /etc/passwd は使えないので、
pdbedit[^1]を使って Windows 公開向けのアカウント「foo」を作成する.

```bash
$ sudo pdbedit -a foo
```

これによりアカウント「foo」を使って Samba 認証が可能になる

```
Windows ユーザ
　↓
Samba サーバが管理するアカウント「foo」
　↓
Linux の /etc/passwd のアカウント「foo」
```

### 3. /etc/samba/smb.conf の [global] で「security = user」にしておく

・https://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-rg-ja-4/s1-samba-servers.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/7da34f54-5f98-9fc9-8531-60dbc2397a3e.png)


### 4. /etc/samba/smb.conf に [homes] セクションを作る

他のアカウントを作成した場合も /home/(アカウント) が公開できるようにしておく.
この辺りはセキュリティを考慮して調整が必要だと思う.

```
[homes]
    comment = Home Directories
    browseable = no
    writable = yes
```


### 5. Samba を再起動する

```bash
$ sudo systemctl restart smbd.service
```

　

以上

[^1]: smbpasswd コマンドでも可能なはず
[備忘録] Samba サーバおよびクライアントの実践例


## 概要

Samba に関するメモです.
単発的に使用しているので、雑多です.

|コンテンツ|一言|
|:--|:--|
|[[02] PowerShell実践例 ... Samba 認証の自動化](https://qiita.com/robozushi10/items/4b5cca2e91b19bee86b2)|Samba クライアント視点|
|[クライアント視点で Samba サーバが公開しているディレクトリを確認する](https://qiita.com/robozushi10/items/03660db22f70d44b75db)|Samba クライアント視点|
|[「Samba でパスワード無し」且つ「読み書き可」の共有フォルダを作る](https://qiita.com/robozushi10/items/7ff0626e928884b764c6)|Samba サーバ視点|
|[Sambaでアカウント「foo」を使って「パスワードあり」の共有フォルダを公開する](https://qiita.com/robozushi10/items/9b279472ce5f31906382)|Samba サーバ視点|