OmniAICreator/Qiita-1.07M huggingface dataset:
【Rails】記事投稿に紐づく複数のタグを保存する実装

## 概要
何らかの記事投稿機能があるとして、各記事に紐づくタグを複数設定したいとします。
今回、アンチパターンとともに、サンプルをご紹介します。

## テーブル定義
まず以下のようにテーブル定義されているとします。
![投稿機能.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642155/b85cc5d2-9040-fb94-474f-1859b76741dd.png)

基本的な設計です。
ユーザーは複数の投稿ができる。
投稿は1人のユーザーに従属する。
`1 対 多`の関係ですね。

そこに、「投稿にタグを複数付けられるようにしたい」という要件が発生しました。
そこで以下のようなテーブル定義を検討したいと思います。
![タグ機能.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642155/fdb21694-303f-6342-c5d3-0d3ceef3eabb.png)
1つの投稿は、複数のタグを持てる。
タグは、1つの投稿に従属する。
こちらも`1 対 多`の関係になります。

## 関連付け
```ruby
class User < ApplicationRecord
  has_many :posts, dependent: :delete_all
end

class Post < ApplicationRecord
  belongs_to :user
  has_many :tags, dependent: :delete_all
end

class Tag < ApplicationRecord
  belongs_to :post
end
```

## マイグレーションファイル
※ posts, users は省略
```
create_table "tags", force: true do |t|
  t.references :post, null: false, foreign_key: true
  t.string :tag, null: false
  t.datetime "created_at"
  t.datetime "updated_at"
end
```

## 実装の手順
`posts_controller`で`create`アクションが実行される際に、タグも同時に保存するようにします。

### コントローラー
```ruby: posts_controller.rb
def create
  post = Post.new(post_params)
  post.save!
  post.save_tags(tag_params[:tags]) # <= 追加
  post = post.as_json(methods: [:tags])

  render json: { post: }, status: :ok

  rescue ActiveRecord::RecordInvalid => e
    render json: { errors: e.record.errors }, status: :unprocessable_entity
  end
end

private

def post_params
  params.permit(:content)
end

def tag_params
  params.permit(tags: [])
end
```

`Post`モデルに`save_tags`メソッドを追加します。
引数は`Array`で渡し、それぞれ`INSERT`していくイメージです。

`update_tags`メソッドはタグを編集する際に使用する想定です。
### モデル
```ruby: post.rb
class Post < ApplicationRecord
  belongs_to :user
  has_many :tags, dependent: :delete_all

  def save_tags(set_tags)
    return tags if set_tags.blank?

    results = []

    set_tags.each do |set_tag|
      tag = tags.new(tag: set_tag)
      tag.save!
      results << tag
    end

    results
  end

  def update_tags(set_tags)
    return tags if set_tags.blank?

    tags.destroy_all
    save_tags(set_tags)
  end

  def tags
    tags.pluck(:tag)
  end
end
```

このように実装することで、以下のように投稿に紐づくタグを設定できます。
| id | post_id | tag |
|:-----------|------------:|:------------:|
| 1       | 1        | 新宿         |
| 2     | 1      | 渋谷       |
| 3       | 1        | 池袋         |
| 4         | 2          | 六本木           |
| 5       | 2       | 麻布       |
| 6    | 2     | 富ヶ谷      |

## アンチパターン
それぞれの投稿に紐づくタグを追加する要件が発生したとき、ぱっと思い浮かんだ構造は以下でした。
| id | content | tags |
|:-----------|------------:|:------------:|
| 1 | こんにちは。| ["新宿","渋谷","池袋"]|

ちなみに Active Record の機能の一つに `serialize`があり、まさに上の`tags`カラムのように配列を格納できるようになります。

「めっちゃ便利やん。。」と思うかもしれませんが、インデックスが貼れなかったり、仕様変更に弱いなど多くの副作用があります。

基本的には`serialize`は使用すべきでないでしょう。

以下の記事が参考になるので、詳しくはこちらをご確認ください。
[ActiveRecord serialize / store の甘い誘惑を断ち切ろう](https://qiita.com/jnchito/items/68e91e9bf46f960a79e4)

というわけで、最初の実装とした次第です。

## まとめ
> ひとつひとつの値は個別の列と行に格納しましょう。

引用：SQLアンチパターン
マナビDXクエスト2022に参加して

# はじめに
基本的には自分用のメモとして書きます。また規約上、詳細は言えないのでご了承ください。
あまりネット上に情報ないように思うので、来年は参加したいけど壁を感じて躊躇している方など、もしご質問があれば、気軽にTwitterアカウントの方に連絡下さい。
https://twitter.com/Yu_lign
### 自己紹介
・30代前半
・500人規模の非IT系メーカー勤務
・設計・開発に従事。仕事でプログラミングは使わない。
・G検定取得
・VBAとかjavascriptは最低限わかるレベル（会社でVBAの便利ツール作って使ってもらったりしてました）
・AIのプログラミングやデータ分析に興味があって、今回のプログラムに参加しました。

# マナビDXクエストとは
経済産業省の記事を引用とさせて頂きます。
・日本ではデジタルスキルを持った人材が不足しているが、リスキリングの場がないことを課題に挙げています。
・そこでデジタル人材育成のプラットフォームとして、「マナビDX」ができました。
・3段階のレベルで学習していくモデルですが、今回は全てを経験できました。AIのモデルを設計・構築するというよりかは、AIをどのように導入・運用するかに重きを置いているようです。
・参加費は無料。参加時に簡単なテストがありましたが、今年に関してはほぼ落ちた人はいないのでは？という印象です。（ただプログラミングの知識0の人は課題で苦労しているようで、脱落者が4割近くいました。）
＜参照記事＞
①マナビDXとは
https://www.meti.go.jp/shingikai/mono_info_service/digital_jinzai/pdf/006_03_00.pdf
②マナビDXの前身であるAI Questの紹介
https://www.meti.go.jp/policy/it_policy/jinzai/AIQuest.html
③そもそもデジタルスキルとは
https://www.meti.go.jp/policy/it_policy/jinzai/skill_standard/main.html

### 流れ
期間は9月3日〜翌年2月11日で、第1タームと第2タームに分かれておりました。
各タームで4つの教材の中から1つを選びます。第2タームには現場研修プログラムがありました。現場研修プログラムは、全国の中小企業とタッグを組み、その企業のDX課題を共に解決するというものでした。
教材のテーマは過去のAI Quest2020年と変わっていないと思います。（内容ではなくテーマについて）
https://www.meti.go.jp/policy/it_policy/jinzai/AIQuest.html

基本的には教材は提供するから、後は受講者同士で勝手に勉強してねというスタイルでした。そのために以下2つの工夫がされています。
①学習サイトのSignate Cloudが無料で使いたい放題
・AI(Python)に関するプログラミングスキルが学べます。
・個人で契約すると月2000円くらいかかるらしいです。
・Signate Cloudは、私は今回初めて知りましたが、受講者同士で会話すると大手の会社で社内の教育用に契約しているという会社も多くあるようでした。
https://cloud.signate.jp/
②Slackで受講者同士コミュニケーションが取れる
・自分一人では追い切れない鮮度の高い情報が自動的に入ってくる。
・一部のレベル高い方々が自主的に講座を開いてくれる。
・他受講生の圧倒的なインプット量に圧倒される。刺激される。
　（実際には2000人もいるので、いつも固定の20人くらい？が発信している感じですが）

# まとめ
長くなるのでここでまとめを述べます。
・私個人の結論なのですが、上記のSignate Cloudが無料で使えることと受講者同士の情報交換のメリットが一番大きいと感じました。
・現場研修プログラムは、DX推進活動がかなり泥臭い仕事なのだということは学べましたが、労力の割に得るものが少なく、正直オススメできません。

## 第一ターム概要
需要予測のテーマを選択し、合計５つの課題がありました。
### パワポ提出課題
以下４点について資料を作成、提出しました。③と④については、受講者同士で資料の採点を行うという評価制度もありました。
①要求定義：現状と課題を整理して優先順位付けを行う。
②PoC（コンセプト）定義：予測の対象やAIの学習に使うデータ、目標値を決める。
③AIの導入・運用計画：費用対効果や運用方法、ロードマップの作成。
④プレゼン：①〜③について経営層にAI導入の意思決定をもらうためのプレゼン資料作成　
### プログラミング課題
プログラミングを課題は１つのみで、AIで需要予測を行いました。
基本的にはサンプルコードがあり、それを実行さえできれば、合格点はもらえたと思います。
そこから自分でモデルを変えたり、特徴量を追加したりすることで、予測精度を上げていく検討を行いました。
予測精度はコンペ形式でスコアを受講者同士で競い合うので、楽しく取り組めました。
コンペ後に優秀者の解説を聞く機会もありました。技術的な話なので割愛しますが、クラスター分析後に決定木で学習させる（決定木の気持ちになれ！）ことが大事とのことでした。
## 現場研修プログラム（第2ターム）
・第2タームは現場研修プログラムに参加しました。（教材の取り組みは断念しました）
・参加者同士で５人チームを組む必要がありました。
・自主性が問われますが、私はSlack上のチーム募集掲示板に自分のプロフィールを記載して、記載ある人にひたすら声掛けしました。
・その後、チームでチーム名や強みをまとめた上で、企業とマッチングを待ちます。企業側に選択肢がありました。
・めでたくマッチングすることができ、金属加工メーカーと取り組むことになりました。最初は業務フローを図示化するところから始め、どこに課題があるかを協議しました。
・その結果、営業活動に効率化が必要という結論になりました。特に新規顧客や潜在顧客獲得が出来ていないこと、またそこに割く工数がないことが課題として挙げられました。
・工数割けないということで、HPの問い合わせ顧客に対してアプローチすることにしました。
・HPについては、SEO対策やアクセス解析、UI改善を提案しました。
・問い合わせを頂いた顧客について、MAでリード管理、リード育成し、営業に案件を渡す流れを提案しました。
・HP改良やMAでのDM配信には顧客が求める内容の濃いコンテンツを配信する必要がありますので、SFAやCRMで商談案件や顧客情報を蓄積していき、分析する必要性を説明しました。
・上記をロードマップ、さらにガントチャートでスケジュールをまとめて活動完了としました。
・上記の各ツールを説明するのに多くの時間を割いてしまい、深い内容の議論が出来なかったというのが正直なところです。
・愚痴っぽくなるので省略しますが、チームの運営と企業側にいかに参加・協力してもらうかが大変でした。
・工数に関して言うと、チーム内ミーティングが週1回、1時間あり、それとは別に企業とのミーティングが1,2週間に1回1時間ほど時間を取っていました。もちろん資料作成の時間も別途かかります。
kubeflow elryaを用いたMLOpsについて

Kubeflow Elrya を用いた MLOps (Machine Learning Operations) は、Kubernetes 上で機械学習ワークフローを実行するためのプラットフォームです。Kubeflow Elrya を用いた MLOps を行う場合、以下のようなステップがあります。

1. Kubeflow Elrya をセットアップする: Kubeflow Elrya を使用するには、まず Kubernetes クラスター上にセットアップする必要があります。Kubeflow Elrya のセットアップ方法については、公式ドキュメントを参照してください。

2. Jupyter Notebook を使用したモデル開発: Kubeflow Elrya は、Jupyter Notebook を使用したモデル開発をサポートしています。Jupyter Notebook 上では、Python や R などの言語を使用して、データを処理したり、モデルをトレーニングしたりすることができます。Kubeflow Elrya を使用することで、Jupyter Notebook をクラウド上で実行することができます。

3. Argo Workflow を使用したワークフロー設計: Kubeflow Elrya は、Argo Workflow を使用したワークフロー設計をサポートしています。Argo Workflow は、Kubernetes 上でワークフローを実行するためのツールです。Kubeflow Elrya を使用することで、Argo Workflow を使用して、モデル開発やデプロイメントのワークフローを設計することができます。

4. ワークフローを実行する: Kubeflow Elrya を使用すると、Argo Workflow を使用して設計したワークフローを実行することができます。ワークフローが実行されると、各ステップは順番に実行され、出力は次のステップに渡されます。
ワークフローが完了すると、結果が生成されます。

5. モデルをデプロイする: Kubeflow Elrya を使用すると、モデルをデプロイするためのステップをワークフローに追加することができます。Kubeflow Elrya では、Kubernetes 上で API サーバーを立ち上げるステップを使用することで、モデルをデプロイすることができます。また、Kubeflow Elrya では、Istio を使用した Service Mesh を構築することで、モデルを安全かつスケーラブルにデプロイすることができます。

以上が、Kubeflow Elrya を用いた MLOps の一般的な流れです。Kubeflow Elrya を使用することで、Kubernetes 上で効率的かつスムーズに MLOps パイプラインを構築することができます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2242965/3d662455-6f38-0953-0877-74110e87c589.png)
apache hop を用いたMLOpsについて

MLOps (Machine Learning Operations) は、機械学習のモデル開発やデプロイメントを効率的かつスムーズに行うためのプラクティスです。Apache Hop を用いた MLOps を行う場合、以下のようなステップがあります。

1. データを処理するためのワークフローを設計する: Hop は、データを処理するためのワークフローを設計するためのツールです。データを収集し、準備し、モデルをトレーニングするためのステップを含め、ワークフローを設計することで、MLOps パイプラインを構築することができます。

2. ワークフローを実装する: Hop は、ワークフローを実装するために、Python や R などの言語を使用することができます。また、Hop は、Hadoop や Spark などの大規模データ処理フレームワークを統合することで、大規模なデータセットを処理することができます。

3. ワークフローを実行する: Hop を使用すると、ワークフローを実行することができます。実行されると、各ステップは順番に実行され、出力は次のステップに渡されます。ワークフローが完了すると、結果が生成されます。

4. モデルをデプロイする: Hop を使用すると、モデルをデプロイするためのステップをワークフローに追加することができます。例えば、モデルを API サーバーにデプロイして、外部からアクセスできるようにすることができます。

以上が、Apache Hop を用いた MLOps の一般的な流れです。 Hop を使用することで、MLOps パイプラインを効率的かつスムーズに構築することができます。

![hop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2242965/9e8bd365-7aac-d877-565c-59180beedc62.png)


Apache Hop の使い方について、以下のような内容を含めることができます。

Hop のインストール: Hop を使用するには、まずインストールする必要があります。 Hop は、Java アプリケーションであるため、Java ランタイムがインストールされていることが前提条件です。 Hop のインストール方法については、公式サイトなどを参照してください。

Hop のワークフロー設計: Hop の最も大きな特徴の一つは、データを処理するためのワークフローを設計することができることです。 Hop のワークフローは、XML 形式で記述されます。各ステップは、入力と出力を持ち、それぞれが別のステップに渡されます。ワークフローを設計するには、Hop の提供する豊富なステップを組み合わせることができます。

Hop のワークフロー実装: Hop のワークフローは、Python や R などの言語で実装することができます。 Hop のワークフローでは、Python スクリプトを実行するためのステップを使用することができます。また、Hop は、Hadoop や Spark などの大規模データ処理フレームワークを統合することで、大規模なデータセットを処理することができます。

Hop のワークフロー実行: Hop を使用すると、ワークフローを実行することができます。 Hop のワークフローは、コマンドラインから実行することができます。また、Hop の Web コンソールを使用することで、ブラウザからワークフローを実行することもできます。

Hop のモデルデプロイ: Hop を使用すると、モデルをデプロイするためのステップをワークフローに追加することができます。モデルを API サーバーにデプロイして、外部からアクセスできるようにすることができます。Hop のワークフローでは、REST API を呼び出すステップを使用することで、モデルをデプロイすることができます。
以上が、Apache Hop の使い方の一例です。Hop を使用することで、MLOps パイプラインを効率的かつスムーズに構築することができます。


参考記事：https://www.opensquare.co.jp/seminar_document/127/01.pdf
wslでelixir その5

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
explorer.exe が使えます。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/e5174a47-c5b8-c3d2-06db-58f3435630dd.png)

以上。
TypeScriptをコンパイルしようとすると"tsc"が認識しなかった話

この話ではTypeScriptをコンパイルしようとした際にPowerShellから実行ができなかった事象を備忘録的にまとめています。

# 事象：tsc *.ts が実行できない

``` 'エラーの詳細'
tsc : 用語 'tsc' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラム の名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合 はそのパスが正しいことを確認してから、再試行してください。
発生場所 行:1 文字:1
+ tsc
+ ~~~
    + CategoryInfo          : ObjectNotFound: (tsc:String) [], CommandNotFoundException    
 ```

# 原因：ExecutionPolicyがRestricted（制限付き）であった

``` 'command line'
Dir> Get-ExecutionPolicy
Restricted
```

# 対応：ExecutionPolicyをRemoteSignedに変更する


```
Set-ExecutionPolicy RemoteSigned -Scope Process -Force
```

上記を実行すると
```
Get-ExecutionPolicy
RemoteSigned
```

ExecutionPolicyが変更されたことがわかる。
（これまでにnpm initからやり直した私が恥ずかしい...）

### 参考

https://qiita.com/earthdiver1/items/b3f529c81f5892972a72
読まれる記事のタイトルの付け方

今回は記事のタイトルについて書いていきます。

なぜ今回書くことにしたのかは、Qiitaで見かける記事のタイトルが全然記事と中身が一致していないものを見かけるからです。
タイトルが斬新すぎて「面白そう！」と思って開くも、内容は全然違うものだったり、中身が全く想像できないタイトルを付けている記事がちらほらと。。

そういうのが多いと、**「良い記事だけどもクリックしなくなる」**
というふうになってしまいます。
良い記事は多くの人に読まれるべきですし、Qiitaのようなテック系のブログはなおさら多くの人が見つけやすいタイトルを付けるべきです。

そういうわけで今回は、**”クリックしたくなる”・”検索で見つけやすくなる”タイトルの付け方**をまとめています。
ぜひ、ご自身のブログを書く時に参考にしてみてください。

## 読まれる記事のタイトルの付け方

*「作家は本を始めるだけである。読者が本を終わらせる。」*
*サミュエル・ジョンソン*

### タイトルは記事の顔

**タイトルが重要な理由は、タイトルによってクリックするかどうかを判断するから**です。
どんなに内容が良くてもクリックしたくならないタイトルでは、読まれることはありません。

**逆に、記事の内容が多少悪くてもクリックしたくなるタイトルであれば、記事にアクセスは来ます。**
（内容が悪くても良いとは言ってないので、ご注意を・・・笑）

### タイトルと記事の内容を一致すること

上述で「クリックしたくなるタイトルであれば、記事にアクセスは来ます」と書きましたが、タイトルと記事の内容がバラバラなのは良くないです。
（最近、Qiitaでよく見かけますが・・・）

**タイトルは、記事の内容を代表するものです**

なので、最初から内容もタイトルも決めて書き始めるといいですが、「タイトルがどうしても思いつかない」時は、記事を書いてから内容にあったタイトルを考えるのもアリです。

### タイトルからその記事を読むと「どうなるか？」が分かること

**あなたが記事を読む理由はなんでしょうか？**

**Google検索から見つけた記事をクリックした理由はなんでしょう？**

”検索する”ことの裏側には、必ず検索した理由があります。
だいたいの場合、 **「何か問題を解決したいから」** 検索します。

検索でQiitaの記事に来る時は、プログラミングでエラーを解決したいから。
検索で食べログに行く時は、飲食店を探したいから。

エラーの解決方法がわからない、どの飲食店が良いかわからない。

つまり、”わからない問題”を解決したくて記事を探しているから、**”わからない問題”を解決できるタイトルであれば、クリックしたくなります。**

読者も自分と似たような解決方法を知りたいので、「自分だったら、どういうタイトルだとクリックしたいか？」を考えてみると良いタイトルを付けやすくなりますね。

**Qiitaではエラーの解決、環境構築の設定などができることを分かりやすく伝える**ことが大事だと思います。

### さいごに
:::note
・人はタイトルでクリックするかどうか判断している
・タイトルは記事の内容を代表するもの
・記事を読むと **”問題を解決できる”** ことが分かるタイトルはクリックしたくなる
:::

記事を書く時にちょっと工夫をすれば、アクセスは変わります。
さらに、読者のためにもなります。

また、**どのようなキーワードで検索されるか**考えることも大切ですね。
読み手が検索に使用するだろうキーワードをタイトルに入れることです。

タイトルも内容もしっかり書けていても、検索されるキーワードとミスマッチしているとGoogle検索では表示されません。
以下のサイトは、どういうキーワードの組み合わせで検索されることが多いか見れるツールです。
キーワードを調べる時に便利ですよ。

https://related-keywords.com/

（「php foreah」で検索されるの意外と多いんですね笑）
未経験からエンジニアになる一歩

# HTML
先ずは、HTMLから触りましょう

```html
<html>
<head>ヘッダー</head>
<h1>タイトル</h1>
<div>
		<p>ハローエンジニア</p>
</div>
</html>
```
---
# 理由その１
HTMLは簡単！

---
# 理由その２
HTMLは結果が見える

作ったHTMLをブラウザで見てみましょう！

---

# 理由その３
htmlタグによって
構造的な事が理解できる

```html
<h1>には、 
</h1>で閉じる
```

---
# 理由その４
htmlタグによって
階層構造が理解できる

```html
<html></html>の中に、 
<h1> </h1>でタイトルを入れる
```

---
# 理由その５
間違えてても動く

```html
<html></html>なくても動く 
<h1>で </h1>で閉じ忘れたら
全部タイトルになるだけ笑
```

---
# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
簡単Elixirシリーズ ~ Processを使ってCounterを作ろう！ ~

# 簡単Elixirシリーズ
## Processを使ってCounterを作ろう！

東京にいるけどfukuokaexのYOSUKEです。
最近、[エリクサーちゃんで学ぶ Elixir](https://youtu.be/_QzrB6tTPwA)の動画を作成し始めてるので良かったらチャンネル登録お願いします。本格的に始動するのは年明けからの予定です。

今回は、Processを使ってCounterを作ろう！という小ネタ。（そう、この記事はサクッとがコンセプトW）

Elixirのプロセスについて知りたい人はこちらから見てください。
|> [~ プロセスを知ろう① ~](https://qiita.com/Yoosuke/items/0b50f9537fa1e30eb41d)
|> [~ プロセスを知ろう② ~](https://qiita.com/Yoosuke/items/dd44fc47d29b20330680)
|> [~ プロセスを知ろう③ ~](https://qiita.com/Yoosuke/items/0f02f8e71dcdd5e8a7b8)

プロセスを生成して、カウンターをスタートすると、メッセージで送った数値を受け取って値を表示し、500ミリ秒待って、再度その値に+1をして自分にメッセージを自分自身のプロセスに再度送っています。その後、strat()を再度呼び出して、プロセスを継続する処理を書いてます。


```elixir
defmodule Counter do

  def start_link() do
    spawn(ProcessCounter, :counter, [])
  end

  def start() do
    receive do
      value ->
        IO.puts(value)
        Process.sleep(500)
        send(self(), value + 1)
    end

    start()
  end

end
```

実際に使ってみましょう。 PS, 止める時は```Process.exit(pid, :ok)```を呼び出すと止まります。

```elixir
iex()> pid = Counter.start_link()
#PID<0.122.0>
iex()> send(pid, 1)                 
1
1
2       
3       
4       
5 
iex()> Process.exit(pid, :ok)
true
```

プロセスを使った永続的な処理の例でした。
ただ、プロセスはElixirの関数を利用した実装より複雑になりすぎることがあるので、GenServerやAgent,Taskといった抽象化されたモジュールの関数を利用して実装するのがオススメです。

と偉い人が言っておりました。
【実験中】UnityでAmiVoice を試す①

Unityでの音を拾う方法がなんとなくわかったところで
AmiVoiceのサンプルコードを元に、Unity上で動くのかを
まずは試していきたいと思います。

https://docs.amivoice.com/amivoice-api/manual/client-library/sample-programs/hrp-simple-tester


## 構造の確認
C#のサンプルコードをそのまま持ってくればいけるのでは...と思ったのですが
そう甘くはありませんでした

ファイルの構成を確認し、今回は「HrpSimpleTester」を
改変して使えるか試すことにしたのですが、
.net のバージョンに影響しているのか、「System.Web」の
名前空間に紐づいたコード（HttpUtility）がエラーをはきました。

![aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/b2e24bcb-d255-37d3-b157-c61266bfab30.png)

調べてみると、Unity用に修正する必要がある模様です。
（記事書いてくれてありがとう先輩）

https://www.hanachiru-blog.com/entry/2019/06/30/165934

エラーはでなくなりましたが、果たして動くのか...（ゴクリ

## 結果
Debug.logをはってみましたが何もでてこない...
→Start関数などで呼出かけてませんでした

いざ実行・・・！
![bb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/698a6806-db46-29e1-d3fb-badb4bec3a6c.png)

メッセージは出るようになったので、とりあえず今日のところは
よしとします...たぶんwavのファイル名をAssetから指定していないせいだとは思うのですが、一歩前進したということで...！
コンテナ型仮想化について

●コンテナ型仮想化
ホストOSのリソースを隔離して「コンテナ」という仮想環境を作成する方式。
ホストOSのカーネルを共有することで、仮想マシンやゲストOSを起動せずにアプリケーションやOSの実行環境を構築できるが、ホストOSと異なるOSをコンテナで使用することはできない。

■コンテナ型仮想化を構成する要素
・ホストOS ... 物理マシンにインストールしたOS
・コンテナエンジン ... コンテナを操作、管理するプロセス
・コンテナ ... 区画化されたアプリケーション実行環境
・イメージ ... コンテナの実行に必要なライブラリやアプリケーションをテンプレート化したファイル

●コンテナ型仮想化は、名前空間やcgroups（Control Groups）といったLinuxのカーネルの機能によって実装。

Linux名前空間

・IPC プロセス間通信(IPC)のリソースを分断(System V IPC,POSIXメッセージキュー)
・Network ネットワークに関するリソースを分断(IPアドレス、ルーティングて０ブルなど)
・Mount ファイルシステムツリーを分断
・PID プロセスID(PID)を分断
・User ユーザID(UID)とグループID(GID)を分断
・UTS システム識別子(ホスト名とドメイン名)を分断

●cgroupsによるリソース管理
cgroupsはプロセスをグループ化してグループごとにCPUやメモリなどのリソース割り当て・制限を実現。コンテナごとに名前空間を作成してcgroupsで制御することで、コンテナ単位でリソースを管理できるようになる。
Q. Pythonの"global"ってなに？

関数のなかに書いてあったけど、なにこれ。

# 結論
「この関数では**グローバル変数を上書きするよ**」という宣言。

Pythonでは、関数内から普通にグローバル変数を上書きしようとしてもエラーを吐くようになっている。（グローバル変数の安易な編集を防ぐため）

```py
wallet = 0

def pay(amount):
  wallet -= amount

# UnboundLocalError: local variable 'wallet' referenced before assignment
```

この例では、`pay()`関数内で`wallet`というグローバル変数から引き算しようとしているので、`UnboundLocalError`を引き起こしている。

```py
wallet = 0

def pay(amount):
  global wallet
  wallet -= amount
```


これで解決。

# おわりに
Pythonくん、こういうところ意外と親切。
コントローラを共通化したModuleに対応するビューを自動で検索させる

# ユースケース

Railsで、複数のコントローラに似たActionがあるときに、それらを1つのModuleに切り出して、共通化することがありますよね。controllers/concerns/xxx_feature.rb のようなファイルに切り出すパターンです。

このとき、対応するビューも共通化したいことがあります。たとえば、showアクションを共通化している場合、こんな感じで自分で指定やれば、もちろんできます。

```ruby:xxx_feature.rb
def show
  ...
  render "shared/xxx/show"
end
```

ただ、以下のような点が不満です。

1. 面倒。
2. あるコントローラでは共通化ビューを使いたい、あるコントローラでは直接コントローラで自前のカスタムビューを使いたいという切り分けをしようとすると、テンプレートの有無を調べたりして煩雑になる。

特に、2については耐え難いと感じて、方法を調べました。

# 解決方法

バッチリ、エレガントな方法がありました。

```ruby:xxx_feature.rb
module XxxFeature
  extend ActiveSupport:Concern

  class_methods do
    def local_prefixes
      super.push("shared/xxx")
    end
  end
end
```

これで、コントローラのパス（controller_path）とコントローラの継承しているクラスの間に、このモジュールに対応するビューのパスを挟み込むことができます。

便利！！
デイトラ「Web制作コース」　受講内容をアウトプット 12日目


学んだことをアウトプットしています。完全に自己満足ですので悪しからず。
以下の点を確実にアウトプット
①何で学んでるか
②日々の学習内容
③学びのポイント
④制作物
⑤+αで参考にした記事
⑥+αでやってみたこと

①デイトラ「Web制作コース初級編」　Bootstrapでｻｲﾄを作ろう
②　1）Bootstrapを使って簡単なｻｲﾄの作成
③ Card decks,Grid cards
　⇒画像とその説明文、余白をいい感じの配置にしたﾃﾞｻﾞｲﾝ

　list
　⇒ﾘｽﾄの色々なﾃﾞｻﾞｲﾝ

　Forms
　⇒ﾌｫｰﾑの様々なﾃﾞｻﾞｲﾝ
　
④なし
⑤VS Codeで選択範囲をHTMLﾀｸﾞで囲むｼｮｰﾄｶｯﾄｷｰを設定する方法の調査
　→https://qiita.com/MToyokura/items/da4fb3477affd0278506
　ctrl＋E＋Mに決定

　Bootstrapでよく使うｸﾗｽ
　https://qiita.com/nakanishi03/items/c80a16b9b9796c25f890

　ﾏﾙﾁｶｰｿﾙの使い方
　https://qiita.com/TomK/items/3b1f5be07d708d7bd6c5

　Visual Studio Codeでソースを自動整形する方法
　https://kakechimaru.com/vscode_alignment/


⑥なし
100記事記念：若手エンジニア向け：自信と不安の間から脱出する方法

若手エンジニアの皆さん、今、自信に満ち溢れていますか？それとも不安にかられてますか？
僕の様なオジサンエンジニアになれば、自信も不安もそれなりコントロール出来ています。いや出来てないかもしれないけど、心の対処は出来てます。
若い頃は色々と悩みもありました。比較的、不安な状態は少なかったですが、モチベーションのためにはマインド管理は重要な仕事の一つだと思います。

# この記事は100記事目
11月の初めに
「よしアウトプットをしっかりとやっていこう！何が良いのか分からないけど、とりあえず2ヶ月、12月末までに100記事書くぞ！」
と決めて約2ヶ月が立ちました。今回が100記事目となります。
![スクリーンショット 2022-12-30 6.33.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/5492c79e-79a1-8778-22a0-9bd11c59ffa9.png)
今まで記事をちゃんと続けて書いたのは久しぶりで、とても不安な気持ちで一杯でした。アウトプットのスキルも少しずず上がってきたと思いますが、これは、きっと過大評価だと思ってます。

# ダニング=クルーガー効果
```
ダニング＝クルーガー効果とは、能力の低い人は自分の能力を過大評価する、という認知バイアスについての仮説である。 
1999年にこの効果を示したコーネル大学のデイヴィッド・ダニングとジャスティン・クルーガーの説明によると、
このバイアスは、能力が低い人々の内的な錯覚と、能力の高い人々の外的な錯覚の結果として生じる。
```
1999年と比較的新しい説ですね。ダニングさんとクルーガーさんが提唱したのでダニング=クルーガー効果と呼ばれてます。
認知バイアスのひとつで、自身の能力や容姿、言動や立ち振る舞いなど様々な場面において、実際の評価と自己評価にズレが生じる心理現象みたいです。

絵にするとこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/9cb6becb-c722-ca8b-44a2-b02b664d1f49.png)

# 逆のインポスター症候群
```
インポスター症候群とは、自分の能力や実績を認められない状態を指します。 
仕事やプライベートを問わず成功していても、
「これは自分の能力や実力ではなく、運が良かっただけ」
「周囲のサポートがあったからにすぎない」と思い込んでしまい、
自分の力を信じられない状態に陥っている心理傾向のことです。
```
ダニング=クルーガー効果の絶望の谷の時期にインポスター症候群が起こるのでは無いと思います。
インポスター症候群は、常に不安の間にいる事によりチャレンジ出来なかったり、心配しすぎてしまう状況です。

# 自己肯定感の弱さ
最近、自己肯定感という言葉もよく聞きます。
```
自己肯定感とは、自らの在り方を積極的に評価できる感情、
自らの価値や存在意義を肯定できる感情などを意味する言葉である。
しかし、後述のように定まった定義はなく、他の類似概念との弁別も充分とは言えない。 
```

# 皆、不安や自信の間にいる
僕は仕事柄、社長系の方々と会うことが多いのですが、皆さん揃って自己肯定感がめちゃくちゃ強いです。折れない心を持ってます。という風に見えます。
しかし、しっかりと話してみると、すごく不安の中で強がっていたり、共感すると喜んでくれたりします。実は、皆自信を持ってる風に見えるけど不安の中にいる事が多いんです。かっこよくプレゼンしてる人でも実は心臓バクバクしてたりします。

# まとめ
若手エンジニアの皆さんにお伝えしたかったのは、あなたと同じ様に皆不安を抱えているとう事。
そして、自信があっても実は、バカの山にいるだけでまだまだ世の中は広いという事です。
今が終わりでなく、常にインプットをする事を止めてはいけません。そしてインプットした事をアウトプットする事でより深いナレッジへと昇華していきます。ぜひ、続けてみて下さい。
今後も記事を書いていきますので、イイね、フォローよろしくおねがいします！
Mac,PHP環境構築（MAMP）

学校のPHPの授業でMacを使用している方が困っていたので投稿します。
学校ではXAMPPを使用していましたが、MAMPを使います。
https://www.mamp.info/en/downloads/
リンクからお使いの端末に合わせて、ダウンロードしてください。
MAMP PROは使わないので、自分は削除しています。
アプリを起動させたら、確認のためにファイルを作成し、名前は”check.php”中身は
```check.php
<?php
echo "Hello PHP";
?>
```
としています。
![スクリーンショット 2022-12-30 3.19.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085337/b9179559-d8c3-ba0a-608c-3dde7fcb7345.png)
このファイルをFinderのアプリケーションのMAMPのhtdocsの中に入れます。

さっきのファイルをブラウザで表示したいと思います。
アプリの『Preferences』でポート番号を確認。（初期値は8888？）
![スクリーンショット 2022-12-30 3.27.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085337/77611350-560f-9606-33c1-566c5780ce8f.png)
電源ボタンが緑色に光っていることを確認。
ブラウザのURL入力欄に。
localhost:8888/check.php
と入力、もしhtdocsの中にphpフォルダを作っていたら。
localhost:8888/php/check.php
![スクリーンショット 2022-12-30 3.31.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085337/45e944e1-6992-aad1-1651-69d1146df0c0.png)
上記画像通り表示されていれば完了です。

簡単なものですが、ご覧いただきありがとうございます。
Houdiniから静的なFBXを出力する(VRChat向け)

# 前提
Unity 2019.43f1
Houdini Indie 19.5.435
VRChat SDK 3.1.10

HoudiniのFBX出力はIndie以上のライセンスで可能。

# FBXの出力
[Rop FBX Output](https://www.sidefx.com/ja/docs/houdini/nodes/sop/rop_fbx.html)を使うとSOP NetworkでFBXを出力できる。

### 階層付きFBX
Rop FBX Outputの設定で階層付きFBXを出力できる。
`Build Hierarchy from Path attribute`を有効化し、`Path Attribute`と同じ名前のstring型のアトリビュートをプリミティブに設定すれば階層付きのFBXが出力される。例えば、`"/obj1/obj2/obj3"`という値の`path`アトリビュートを`Path Attributes`に設定した場合、以下のような階層が出力される。ただし最上位の名前は`Output File`で設定した値になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3085312/ae9bd40d-f155-1141-4284-b771c5d170c1.png)
上記の方法だと全てのオブジェクトが同一の座標系で表現されるため、個々のオブジェクトにピボット情報を付与できない。そのような構造を表現したい場合は以下の記事を参照。

https://qiita.com/kajitaj63b3/items/2aec4406cd87affcef4b

https://qiita.com/d658t/items/d9ff6682595312e92ab9

### スケールの調整
デフォルトだとUnity側は1/100倍のスケールで出力される。
Rop FBX Outputの`Convert Unit`を有効化するか、Unity側のFBXのinspectorから`Model>Convert Units`を無効するとスケールが一致する。前者はtransformのscaleを100倍して対応されるので、scaleを1に保ちたい場合は両方の`Convert Units`を無効化する。あるいはHoudini側でスケールを100倍する仕組みを自力で作ってしまうのが良いかもしれない。

# 頂点情報の対応
対応する名前のアトリビュートを設定することで以下の頂点情報が出力できる。
| 種類 | 名前 | アトリビュート | 変数の型 | 備考 | 
| -- | -- | -- | -- | -- |
| 法線 | `N` | vertex | vector | vertex以外に設定しても出力可 |
| 頂点カラー | `Cd` | vertex | vector | Unity側で[0,1]の範囲にクランプされる |
| UV | `uv` | vertex | vector | uv2以降は`@uv2`,`@uv3`のように設定  |
| マテリアル | `shop_materialpath` | primitive | string |  |

- `@N`, `@Cd`はpoint/vertex/primitiveそれぞれに設定できるが、出力する際はvertexに移してそれ以外のアトリビュートは消した方が安全
- Houdiniのuvはvectorで扱われるが、Houdini側でuv.zに値を設定してもunity側のuv.zは0になる
- Unityの頂点カラーの精度は8bit
- Unity側でどの頂点情報を持っているのかはメッシュのinspectorのプレビューウィンドウで確認できる

# 関連記事

https://note.com/futafusa/n/n483c20da7398

- アバター（リグ付きFBX)を扱う方法を解説した記事

https://qiita.com/kajitaj63b3/items/c52e288d9ea6a78d119e

- 法線やマテリアルについてのより詳細な内容が書かれている
[Flutter][Slack][備忘録] Slackにhttpを使用してメッセージを通知する

## 前提
- SlackのWeb hook URL取得済

## 期待値
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3081664/f66969ac-79b3-2751-b22d-e9e841faa39c.png)

## Flutter コードサンプル
```dart
import 'package:flutter/material.dart';
import 'dart:convert';

import 'package:http/http.dart' as http;

class SlackNoticeWidget extends StatelessWidget {
  const SlackNoticeWidget({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Center(
          child: Container(
            child: ElevatedButton(
              child: Text("http"),
              onPressed: (() async {
                Uri url = Uri.parse("Slack web hook URL");
                Map<String, String> headers = {
                  'content-type':
                      'application/x-www-form-urlencoded;charset=UTF-8',
                };

                final postData = {"text": "<!here> Flutter to Slack Test"};

                String body = jsonEncode(postData);

                http.Response resp =
                    await http.post(url, headers: headers, body: body);

                print(resp.statusCode);
              }),
            ),
          ),
        ),
      ),
    );
  }
}

```

## GIT
https://github.com/lemon-solt/learning/blob/main/flutter/slack_notice_widget.dart

## パッケージ
`http: ^0.13.5`
https://pub.dev/packages/http
python、pip関連のメモ書き

#### pip listとpip freezeでパッケージ一覧表示と違いについて

pythonのpipでインストールしたパッケージとバージョンを一覧表示する場合、pip listかpip freezeでできます。

```
$ pip list
$ pip freeze
```

両者の違いは、出力形式にあるようです。

##### 参考サイト

・[pip listとpip freezeの違い](https://it-jog.com/py/piplistfreeze)
・[Python, pip list / freezeでインストール済みパッケージ一覧を確認](https://note.nkmk.me/python-pip-list-freeze/)
c-quick を straight.el 経由でロードする

2024/02/23 更新

[c-quick](https://qiita.com/javacommons/items/e7fe1ba09d4311af9aea) を [straight.el](https://github.com/radian-software/straight.el) でロードしたい場合は以下を .emacs または init.el に入れてください(但し git のインストールが必要です)：

```elisp:~/.emacs or ~/.emacs.d/init.el
(defvar bootstrap-version)
(let ((bootstrap-file
       (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
      (bootstrap-version 6))
  (unless (file-exists-p bootstrap-file)
    (with-current-buffer
        (url-retrieve-synchronously
         "https://raw.githubusercontent.com/radian-software/straight.el/develop/install.el"
         'silent 'inhibit-cookies)
      (goto-char (point-max))
      (eval-print-last-sexp)))
  (load bootstrap-file nil 'nomessage))

(straight-use-package '(c-quick :type git :host github :repo "emacs-pkg/c-quick"))
(require 'c-quick)
```

----

尚、straight.el ではパッケージを最新化するのに手動で操作をする必要があります。以下の記事をご覧ください：

https://qiita.com/javacommons/items/4dd0f1b74213437c04ec

----

以下の記事にも追記しました。

https://qiita.com/javacommons/items/c4e85585604d850370b6

https://qiita.com/javacommons/items/e7fe1ba09d4311af9aea

https://qiita.com/javacommons/items/87f7c1f12fac5eedb152

よろしくお願いいたします。

https://twitter.com/qiitapoi/status/1608764903703343104
EC2にデプロイしたLaravelからRDS (SQL Server)へ接続する

# はじめに（前提条件）
この記事では、AWS上でRDS (SQL Server)を作成し、EC2インスタンスからマイグレーションが成功することを目標とします。
そのためEC2でのLaravelアプリのデプロイは完了しているものとします。

Webサーバはnginxを使用しています。
# RDSのDBインスタンス設定
## データベースの作成
それではまずデータベースを作成します。
公式サイトに手順が分かりやすく載っていたのでそちらに沿って作っていきます。
SSMSからの接続まで説明されているのでせっかくなので接続できるか確認しておきましょう。

https://aws.amazon.com/jp/getting-started/hands-on/create-microsoft-sql-db/
## セキュリティグループの設定
次に、EC2からアクセスするために必要な設定をします。
先程作成したDBインスタンスのページを開き、「接続とセキュリティ」タブからVPCセキュリティグループの
リンクをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710430/3be0d43e-e521-5cbe-bced-030f1580351a.png)
このセキュリティ設定のインバウンドルールを編集します。
以下のように設定し、ルールの保存を押します。
<table>
  <thead>
    <tr>
      <th>項目</th> <th>値</th>
    </tr>
  </thead>
  <tr>
    <td> タイプ </td> <td>MSSQL</td>
  </tr>
  <tr>
    <td> ソース </td> <td>許可したいEC2が所属するセキュリティグループ</td>
  </tr>
</table>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710430/d407c15c-e94d-7ef8-d5ec-63d59dc5322e.png)
※二つ目のルールはSSMSからの接続を許可するために設定しています。
# EC2インスタンス設定
## SQL Serverとドライバのインストール
EC2上にSQL Serverと必要なドライバをインストールします。
Microsoftの公式サイトが分かりやすいです。

https://learn.microsoft.com/en-us/sql/connect/php/installation-tutorial-linux-mac?view=sql-server-ver16#step-2-install-prerequisites-ubuntu

EC2インスタンスへTeraTermなどでSSH接続し、必要なインストールを行います。
自分が打ち込んだコマンドは以下のようになります。
```shell
sudo su
sudo yum-config-manager --add-repo https://packages.microsoft.com/config/rhel/7/prod.repo
exit
sudo yum update
sudo yum remove unixODBC-utf16 unixODBC-utf16-devel #to avoid conflicts
sudo ACCEPT_EULA=Y yum install -y php msodbcsql mssql-tools unixODBC-devel php-devel php-pear php-pdo php-xml re2c gcc-c++ gcc
amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2
sudo pecl install sqlsrv
sudo pecl install pdo_sqlsrv
sudo sudo amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2
echo "extension=sqlsrv" >> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`
echo "extension=pdo_sqlsrv" >> /etc/php.d/30-pdo_sqlsrv.ini
exit
sudo setsebool -P httpd_can_network_connect_db 1
sudo systemctl restart nginx #restart web server
```
`php -m`と入力し、モジュールの一覧に`sqlsrv`と`pdo_sqlsrv`があればインストール出来ています。
```
$ php -m
[PHP Modules]
bcmath
bz2
...中略...
pdo_sqlsrv #こいつ
...中略...
sqlsrv　#こいつ
```
# .envファイルの編集
最後に.envファイルの編集をしましょう。編集はVimでしました。（何でも良いです）
DBの設定をこんな感じにしておきます。
<table>
  <thead>
    <tr>
      <th>項目</th> <th>値</th>
    </tr>
  </thead>
  <tr>
    <td> DB_CONNECTION </td> <td>sqlsrv</td>
  </tr>
  <tr>
    <td> DB_HOST </td> <td>RDSで作成したDBのエンドポイント</td>
  </tr>
<tr>
    <td> DB_PORT </td> <td>1433</td>
  </tr>
<tr>
    <td> DB_DATABASE </td> <td>データベース名</td>
  </tr>
<tr>
    <td> DB_USERNAME </td> <td>マスターユーザ名</td>
  </tr>
<tr>
    <td> DB_PASSWORD </td> <td>マスターパスワード</td>
  </tr>
</table>

```:.env
...省略...
DB_CONNECTION=sqlsrv
DB_HOST=RDSで作成したDBのエンドポイント
DB_PORT=1433
DB_DATABASE=データベース名
DB_USERNAME=マスターユーザ名
DB_PASSWORD=マスターパスワード
...省略...
```

これでマイグレーションが通るはず！！
なぜかGUIが表示されなくなった（CUIが表示される）ubuntu20.04LTSのデータをUSBメモリ経由で退避する

なぜかGUIが表示されなくなった（CUIが表示される）ubuntu20.04LTSのデータをUSBメモリ経由で退避する方法の備忘録です

#### 用意するもの

・なぜかGUIが表示されなくなった（CUIが表示される）ubuntu20.04LTSのPC
・USBメモリの（FAT32でフォーマットしておく）

#### やること

USBメモリをPCに指し、CUI上でmount処理を実施

以下を参考にさせていただく

>https://gihyo.jp/admin/serial/01/ubuntu-recipe/0639
>```
>$ mount /dev/sdb1 /mnt
>
>まず「/dev/sdb1」は十分に容量があり、きちんと動くストレージデバイスのパーティションのファイル名です。環境によって異なるので注意してください。
>USBストレージなら接続した直後に「dmesg | tail」すれば、デバイスファイル名がわかるはずです。
>```

ここで`/dev/sdb1`は`dmesg`に表示されているデバイスを参照する。また、`mkdir /mnt/test`のようにディレクトリを作成しておく。
これでmountができたらデータをコピーして`umount /mnt`しておく。

シンプルな方法ですが、いざというときに助かります。
特に自宅で遭遇したときに睡眠時間を削って調べるのはもう嫌だ。。

# 参考

https://gihyo.jp/admin/serial/01/ubuntu-recipe/0639

https://ex1.m-yabe.com/archives/3457
> mount: wrong fs type, bad option, bad superblock on /dev/sdb,
       missing codepage or helper program, or other error
       In some cases useful info is found in syslog - try
       dmesg | tail  or so

以下のように`/dev/sdb`のように指定してしまったときもでる（`/dev/sdb1`ではなく）
>$ mount /dev/sdb /mnt
ネットワークスペシャリスト試験合格【令和4年春期】

2022年も終わるのに！4月に受けたネットワークスペシャリスト試験の結果を報告していなかったので、qiitaにも書き残しておこうと思いました。誰かのお役に立てば。

# 背景
ネットワークスペシャリスト試験の受験は2回目で、[去年一度落ちています。](https://qiita.com/foxtail1979/items/5fcdab0a85b230fb3c08)
その際に振り返った原因は、午後試験の対策ができていなかったことです。
特に午後Ⅱは問題文も長く、問題文に特化した内容を踏まえて回答しなければならず、情報処理技術者試験特有の回答のクセに合わせる対策が必須であると感じていました。

# 得点
![86FAE527-6DD2-4F07-B2D4-22D3AF2907FF.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581105/b74adc26-63e7-5ac5-3aab-1fea37f870b6.jpeg)
午後1が良く頑張れていたかなと思います。

# 教材
使ったテキストは次の通り。昨年不合格になったときに午後Ⅱで落ちていたので、基礎知識は身についているだろうと思いいわゆる教科書的な本は用意しませんでした。

[2022 ネットワークスペシャリスト「専門知識+午後問題」の重点対策](https://amzn.asia/d/f0HOT5l)
こちらはどちらかというと演習用といった感じ使いました。ネスぺR3で質を身につけて、重点対策で量をこなすといった使い分けのイメージです。

[ネスペR3 - 本物のネットワークスペシャリストになるための最も詳しい過去問解説](https://amzn.asia/d/cqzMvuJ)
収録している過去問は量こそ少ないですが、午後問題に対する「考え方」を身につけさせてくれる本です。午後対策に何をしたらいいのかわからないなら、買って損はないです。

[ネットワークスペシャリストドットコム](https://www.nw-siken.com/s/)
過去問道場というところで、午前対策として過去問を解くのに便利です。


# 勉強方針
勉強方法やスケジュールはこんな感じです。

## 10〜2月
仕事が忙しかったのと、昨年受験したから知識はそこまで抜けてないだろうと思い、午前Ⅱの過去問を週一程度のペースで解き直す程度しかできず。
Webサイトで過去問対策ができると、スキマ時間を活用できるのと、勉強のためのノートを開くとかペンを用意するといった手間が省けるので、かなりオススメです。

## 3月
いい加減やらないとなと思い、午後試験対策を始める。情報処理試験特有のクセのようなものを掴むために、いきなり午後Ⅱ対策から始めました。ネスぺR3で昨年の過去問を解く→重点対策で過去問の量をこなす→解説を読みつつ答え合わせ→問題文から自分がヒントをきちんと拾えているかチェック→以下繰り返し…と言った感じです。

# まとめ
資格を取るたびに嬉しさはありますが、それ以上に知識だけの人間にならないようにきちんと本業に還元していこうという思いがあります。合格のために必要な努力を積み重ねられる自分のことは誇りに思いつつ、実務への活かし方も考える必要があるなと感じています。

なお、この年の秋期試験(令和4年秋期)にプロジェクトマネージャー試験に合格しました。その話も別の記事で書こうと思います。
GPUを搭載しているPCにubuntu20.04LTSをインストールしたのにnvidia-smiが期待通り動いてくれない（No devices were foundと出る）

GPUを搭載しているPCにubuntu20.04LTSをインストールしたのにnvidia-smiが期待通り動いてくれない（No devices were foundと出る）

```
ubuntu@ubuntu-FRONTIER:~$ nvidia-smi
No devices were found
```

いやっ、確かにGPU搭載しているはず、、RTX3060Tiがついてるはず、、ケース開けたらしっかりそこにありました。
と、絶望していたところ、以下の神記事と出会いました。
作者のy-vectorfieldさんありがとうございます、、
お勧めされたNVIDIA GPUドライバーをインストールして同現象になってしまっていました
詳細は該当記事に詳しく記載いただいておりますのでそちらをご参照くださいm(_ _)m

> https://qiita.com/y-vectorfield/items/72bfb66d8ec85847fe2f
> よって、上記を踏まえて、以下の様にインストールコマンドを実行します。(バージョン番号はお勧めされたバージョンと同じ物(最新版)を選択しています。)
> sudo apt install -y nvidia-driver-525
> sudo reboot

# 参考

https://qiita.com/y-vectorfield/items/72bfb66d8ec85847fe2f
TP-Link AC600 WiFi 無線LANのドライバインストールに若干手こずったが成功した際のメモ

TP-Link AC600 WiFi 無線LANのドライバインストールに若干手こずったが成功した際のメモ

ubuntu20.04LTS環境を無線LAN接続するべく、
TP-Link AC600 WiFi 無線LANを購入した。

https://www.amazon.co.jp/gp/product/B07MXHJ6KB/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&th=1

デフォルトではドライバの提供がなく、インストールが必要だったがなかなか見つからなかった。
最終的に以下記事の手順を参考にさせていただきインストール成功した。
（手順は参照先手順とほぼ同様であり割愛させていただく、ただ他にも多くの記事があり古いものも散見されるので、同じ環境ではまった人がいたら役立つかもと思い本記事を備忘メモ的に残させていただきます）

>https://qiita.com/takaf05/items/5034e9234331ed6ecf2f
>TP-Link Archer T2U Nano AC600
>RTL8812auのドライバーをインストールで動作確認できました。
>
>RTL8812auドライバのインストール方法
>まずgithubからドライバーのソースを持ってきます。
>
>```
>git clone https://github.com/aircrack-ng/rtl8812au.git
>```
>
>ダウンロード後、当該ディレクトリに移動し、
>
>```
>sudo make dkms_install
>```
>
>とするだけで良いです。再起動すれば、T2Uが認識されています。
>なお、インストールにはdkmsパッケージが必要になります。詳細はReadMeに記載されていますので、そちらも参照ください。

また、上記はソースコードをネットから取得する必要があり、有線LANも使えない環境だと辛いかもしれない
USBメモリかなにか経由で上記ソースコードをもってきてビルドして使う必要があるかもしれない
github actionsでpython version 3.10 を指定したつもりが3.1と認識されてエラーになる

github actionsでpython version 3.10 を指定したつもりが3.1と認識されてエラーになる

例えば、以下のようにgithub actions用の.yamlファイルにpython-versionを記載するとエラーになる

```.github/workflow/test.yaml
...
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: [3.9, 3.10]
...
```

以下のissueによると、python-version指定時は`'3.9'`などシングルクオートでかこう必要があるらしい。
3.10は数字扱いでパースされ3.1と解釈されてしまうらしい。

> https://github.com/actions/setup-python/issues/160
> ```
>    Please pay attention that task input follow semver notation.
>
>    As for the confusing error message, it is a feature of YAML parsing. When you specify input like
>
>    version: 3.10
>    3.10 is parsed as a number and it is trimmed to 3.1 that looks like expected behavior for numbers.
>    You should specify input with quotes to treat it as string.
>
>    version: '3.10'
>```

以下のように`'3.9','3.10'`などシングルクオートでかこうことで解決

```.github/workflow/test.yaml
...
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: ['3.9', '3.10']
...
```

# 参考

https://github.com/actions/setup-python/issues/160
簡単Elixirシリーズ ~ Agentについて知ろう ~

# 簡単Elixirシリーズ
## Agentについて知ろう

東京にいるけどfukuokaexのYOSUKEです。
最近、[エリクサーちゃんで学ぶ Elixir](https://youtu.be/_QzrB6tTPwA)の動画を作成し始めてるので良かったらチャンネル登録お願いします。本格的に始動するのは年明けからの予定です。

簡単 Elixirシリーズでは小ネタをサクッと書いていこう。というコンセプトで作っていきます。

さて、Agentを理解する上で先にプロセスについて知って欲しいので、プロセスについてまだ知らない方は是非以下コラムを先に読んでください。

https://qiita.com/Yoosuke/items/0b50f9537fa1e30eb41d

https://qiita.com/Yoosuke/items/dd44fc47d29b20330680

https://qiita.com/Yoosuke/items/0f02f8e71dcdd5e8a7b8

さて、準備ができたところで本題に入りたいと思います。

## Agentを知ろう！

Agentとは、プロセスに状態を保存するためのシンプルなラッパーのようなもので、簡単Elixirシリーズ　~ プロセスを知ろう③ ~ では、プロセスに状態を持たせたままに永続的に状態を追加していく例を書きました。

このような、状態を保持する仕組みをAgentを利用して作成する所からAgentを理解していきたいと思います。

まずは、プロセスを生成すると同じようにAgentを利用して状態を保持できるプロセスを生成します。

そして、Agentに用意された update関数とget関数で状態を更新し、その状態を確認する事ができます。

```elixir
# Agentを利用したプロセス生成
iex()> {:ok, pid} = Agent.start_link(fn -> 42 end)

# Agentを利用した値の更新
iex()> Agent.update(pid, fn state -> state + 1 end)
:ok
# Agentを利用した値を取得する方法
iex()> Agent.get(pid, fn state -> state end)
43
```

Agentの仕組みがわかったので、上記のカウントを保持するコードをリファクタリングしてみます。

```elixir

defmodule Count do
  use Agent

  def start_link(initial_value) do
    Agent.start_link(fn -> initial_value end, name: __MODULE__)
  end

  def value do
    Agent.get(__MODULE__, & &1)
  end

  def increment do
    Agent.update(__MODULE__, &(&1 + 1))
  end
end
```

これを使って、カウントを更新していきましょう。

```elixir
iex()> Count.start_link(2)
{:ok, #PID<0.187.0>}
iex()> Count.value        
2
iex()> Count.increment
:ok
iex()> Count.value        
3
iex()> Count.increment
:ok
iex()> Count.increment
:ok
iex()> Count.value        
5
```

こんな感じで、Agentを利用すると、状態を保持して扱えるので便利ですね。
Heroku よくわからないエラー(エラーコード10)になった時

Herokuでよくわからないエラー(10)が出て解決しないとき。
```
heroku stack:set heroku-18
```
理由はよくわからないけど、これで治ること多かったです。
最近有料になって使う機会減ったけど、備忘録として投稿。
Igor Proで行列から特定の複数列を取り出して新しい行列を作成する。

## はじめに
Igor Proって日本語の情報少ないですよね。
1次元の配列 (colMaskwv、0と1で指定) によって指定された列のみを行列から取り出して新しい行列を作りたかったのですが、うまくいかなかったので作ってみました。
もっと簡単な方法がある気がするのですが、見つけられず
pythonならファンシーインデックスですぐできるのにと思いながら作りました。

もっと簡単な方法をぜひ誰か教えてください・・・・！

2023/01/12
@kitaka様にコメントいただき、より簡潔なコードをご教示いただきました。
コメント欄をご覧ください。
kitaka様、大変ありがとうございます・・・！


## 参考
前半はwavemetricsのForumに載っているコードを参考にさせていただきました
https://www.wavemetrics.com/node/20893

## コード
```Igor Pro: extractCols.ipf
Function/wave remove_blank_cols(inwave)
	wave inwave
	matrixop/o/free inwaveCopy = inwave^t

	variable numOfRows = dimsize(inwaveCopy,0) 
	variable numOfCOls = dimsize(inwaveCopy,1)
	Redimension /N=(numOfRows*numOfCOls) inwaveCopy
	WaveTransform zapNaNs  inwaveCopy
	variable numOfRowsChanged = numpnts(inwaveCopy)/numOfCOls 
	Redimension /N=(numOfRowsChanged, numOfCOls) inwaveCopy
	matrixop/o destWave = inwaveCopy^t
	return destWave
end

Function/wave extractCols(wv, colMaskwv)
	wave wv, colMaskwv
	matrixop/o/free inwave = wv+1
	matrixop/o/free extractedWave = scalecols(inwave, colMaskwv)
	matrixop/o/free extractedWave = replace(extractedWave, 0, NaN)
	wave destWave = remove_blank_cols(extractedWave)
	matrixop/o destWave = destwave-1
	return destWave
end
```

## 使い方
使い方は単純で、対象行列をwv, 抽出したい列を1,　削除したい列を0で指定した配列をcolMaskWvに入れます。


```math
wv = 
\begin{pmatrix}
0 & 1 & 2 \\
0 & 1 & 2 \\
0 & 1 & 2
\end{pmatrix}\\
\\
colMaskWv = 
\begin{pmatrix}
0 & 1 & 1 \\
\end{pmatrix}
```
なら
```math
destWave = 
\begin{pmatrix}
1 & 2\\
1 & 2 \\
1 & 2
\end{pmatrix}  
```
です

colMaskWvを適当に変更すれば、任意の組み合わせの列を取り出せるはずです

ちなみにマニュアルを見るとWavetransformのところでmultidimensionの時にはmatrixopのreplaceNaNsを使いなさいと書いてありますが、こちらでは置換するだけなのでNaNの行や列を削除することができませんでした。

## おわりに
Igor Proで行列から特定の複数列を取り出して新しい行列にするスクリプトを作ってみました。
本当にこれ、ほかの方法ないんでしょうか？？ 私の探し方が下手なだけなきがすごくしています。。。
Igor proで特定のディレクトリ以下のすべてのファイルパスを取得する。

## はじめに

Igor proはpxpファイル内にデータを格納できます。また、pxpファイル内にディレクトリを作ることができ、複数の似たようなデータを解析する際にデータを分けることができて便利です。

データが多くなってくると、解析を一つ一つ打ち込んでやるのが大変になってきます。特に解析条件を変えて何度も　となると嫌になります。

そこで、カレントディレクトリ以下に存在するファイルパスを取得できれば、ループに組み込んですべてのデータに同じ解析をできると思いました。

正直、ほかの言語なら全くどうということのないことなのですが、Igor proは情報が少なくて若干苦労したので残しておきます。

たぶん組み込み関数をちゃんと知っている人ならもっと簡単なコードでかけるんだと思います。わかる人いらっしゃったら教えてください。
あとコードの汚さはご容赦いただけますと幸いです。

## コード
```Igor pro:GetFilePaths
Function/wave GetSubDirNames()
	String SubDirName
	Variable index = 0
	Variable NumOfSubDirs = countobjects(":", 4)
	make/T/o/n=(NumOfSubDirs) SubDirNames
	do
		SubDirName = GetIndexedObjName(":", 4, index)
		SubDirNames[index] = SubDirName
		if (strlen(subDirName) == 0)
			break
		endif
		index += 1
	while(index<NumOfSubDirs)
	return subDirnames
End

Function GetFilePaths()
	wave/t SubDirNames
	String FileName
	Variable index = 0
	variable i=0
	variable j=0
	variable cnt=0
	
	make/T/o tempFilePaths = ""
	wave/t SubDirNames = GetSubDirNames()
	variable NumOfSubDirs = dimsize(SubDirNames, 0)
	do
		String currentDir = ":"+ SubDirNames[j] 
		i=0
		do
			Variable NumOfFiles = countobjects(currentDir, 1)
			FileName = GetIndexedObjName(CurrentDir, 1, i)
			if (strlen(FileName) == 0)
				break
			endif
			tempFilepaths[cnt] = CurrentDir + ":" +  FileName
			cnt+=1
			i+=1
		while(i<NumOfFiles)
		j+=1
	while(j<NumofSubDirs)
	duplicate/t/o/R=[0,cnt-1] tempfilePaths Filepaths
	killwaves tempfilepaths, SubdirNames
End
```

## 使いかた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529689/5fd040d1-f7c3-743e-2105-07e74b8bcf29.png)
上図のようなデータの構造になっていた際に下記のGetFilePaths()を実行すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529689/f26de1a3-330a-fb68-2f55-ea7ae9289c6a.png)

このようなpathをまとめたwave, Filepathsが手に入ります。

あとは一つ一つのwaveを処理するには
```Igor pro:
make/o temp = $filepaths[0]
```
のような形で取り出せばよいと思います。
実用の際には、上記でwaveのコピーを作って、処理をして別のWaveに格納
を繰り返すループを使いました。

## ポイント
正直ポイントは GetIndexedObjName(sourceFolderStr, objectType, index)だけです。 (ただしこれにたどり着くにも少し時間がかかった) 

この関数は、指定されたディレクトリ (SourceFolderStr) の特定のオブジェクト (ObjectType)の指定番目 (index)　を返すというものです。指定番目ではなく、全てのファイルパスをリストにして返す　という関数があればよかったのですが、少し調べた感じではなかったので、ややてこずりながら作る羽目に・・・

ちなみに
Objecttype=1 はファイル
Objecttype=4はディレクトリです。

## 注意
Igor proでは、数字のみのフォルダ名やwave名はシングルクォーテーションを付けて表現しています。
例えば上記で、サブディレクトリの名前を1225　などとしていた場合、'1225'と指定することが必要です。その場合には上記のスクリプトでは動かないので注意してください。

あとこれは私が引っかかった部分ですが、
```Igor pro:
make/o temp = $filepaths[0]
```
の部分で、\\$FilePaths[0]をFilepaths[0]にすると動きません。$を付けなかった場合、データ型がStringになるので、パス指定には使えないからです。

## おわりに
igor proでサブディレクトリ以下のすべてのファイルパスを取得する方法についてまとめました。
[Python / AWS lambda] AWS Lambda実行時にnumpyのRuntime.ImportModuleError

# エラー内容

```bash:Cloudwatch Logsのロググループで確認
[ERROR] Runtime.ImportModuleError: Unable to import module 'src.handlers.filename': 

IMPORTANT: PLEASE READ THIS FOR ADVICE ON HOW TO SOLVE THIS ISSUE!

Importing the numpy C-extensions failed. This error can happen for
many reasons, often due to issues with your setup or how NumPy was
installed.

We have compiled some common reasons and troubleshooting tips at:

    https://numpy.org/devdocs/user/troubleshooting-importerror.html

Please note and check the following:

  * The Python version is: Python3.9 from "/var/lang/bin/python3.9"
  * The NumPy version is: "1.24.1"

and make sure that they are the versions you expect.
Please carefully study the documentation linked above for further help.

Original error was: No module named 'numpy.core._multiarray_umath'

Traceback (most recent call last):
```



# 対処

「numpyをinstall（build）するときのpythonのバージョン」と「AWS Lambdaのruntimeに使用するpythonのバージョン」を一致させた。


# 原因

numpyをinstall（build）したときに使用していたpythonのマイナーバージョンと、AWS Lambdaのruntimeのpythonのマイナーバージョンが異なっていたためにこの問題が発生していた。

今回は、Lambdaのruntimeがpython3.9、numpyをinstall（build）したときのバージョンがpython3.8だった。

numpyは他の多くのpipパッケージとは違い、C言語で書かれたコードのbuildが発生するので、細かな差分があればすぐにエラーになってしまうのだろう( ˘ω˘)ｽﾔｧ。。。


# 参考記事

他にもこんな記事がある模様。

https://qiita.com/kt215prg/items/d934c92226524a88714f
coc-nvimでのruby環境セットアップするメモ



## LSP 
候補のメソッドなどを表示

```bash
gem install solargraph
```

```vim
:CocInstall coc-solargraph
```

## Lint
静的解析
syntax errrorなどを書きながら通知してくれる

```bash
gem install rubocop
gem install rubocop-performance
gem install rubocop-rails
```

```vimscript
Plug 'dense-analysis/ale'
```


## vim-rails

https://github.com/tpope/vim-rails

```vimscript
Plug 'tpope/vim-rails'
```
NSX-T でセグメントが消せなくなったときの対処方法（API）

メモを兼ねた備忘録。
NSX-T を使用していて、いったん既存のネットワーク構成を削除したい（コンピュートマネージャを消したい時など）ようなシチュエーションでは、まず使用しているセグメントを消すことになるが、たまにセグメントが一向に消せない時がある。

よく見てみると、セグメントのポート/インターフェイスがカウントされており、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084968/edbc157b-8770-c56d-2e68-f0039d448d94.png)

詳細を確認すると、セグメントから削除したはずの VM がゾンビのようにずっと残り続けている。
NSX Manager のアプライアンスを再起動したりしても、消えることがない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084968/60204f3a-d196-d218-7a3f-b2c5d596f745.png)

# 対処法
上記のようになった場合は NSX API より、当該の接続先（Logical Port）を削除する。

まずは認証情報を取得：
```bash
[root@example ~]# CRED='admin:yourpassword'
[root@example ~]# MGR_IP=<NSX Manager IP address>
[root@example ~]# curl -ks -u $CRED -X GET https://$MGR_IP/api/v1/node/version /* 動作を確認 */
{
  "node_version": "3.2.1.2.0.20541216",
  "product_version": "3.2.1.2.0.20541212"
}
```

続けて、Logical Port を取得し、上記「セグメント ポート名」にマッチする「display_name」のエントリを探し、対応する「id」を控える。
```bash
[root@example ~]# curl -ks -u $CRED -X GET https://$MGR_IP/api/v1/logical-ports
  :
    "ignore_address_bindings" : [ ],
    "internal_id" : "1abc773e-c04b-40f6-b80b-a2e756390892",
    "resource_type" : "LogicalPort",
    "id" : "1abc773e-c04b-40f6-b80b-a2e756390892", <---★
    "display_name" : "centos-test-001.vmx@9c3f5f1c-e02e-4396-86c9-89360e94310e",
    "tags" : [ {
      "scope" : "policyPath",
      "tag" : "/infra/segments/seg50x/ports/default:1abc773e-c04b-40f6-b80b-a2e756390892"
  :
 snip
```

API を使用して、対象 Logical Port の削除を実行する（エラーが返らないことを確認）。控えた id の後ろに "?detach=true" を指定与する。
```bash
[root@example ~]# curl -ks -u $CRED -X DELETE https://$MGR_IP/api/v1/logical-ports/1abc773e-c04b-40f6-b80b-a2e756390892?detach=true
```

その後、NSX UI よりセグメントの削除をリトライする。

# 23/01/25 追記
のちに NSX UI からも Logical Port の削除が可能なことに気づいた。
少しわかりづらいが、右上のトグルスイッチからマネージャモードに変更し、ネットワーク項目から対象の Logical Port を探し出し、削除する。
![NSX-test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084968/d1a4c130-0e4a-1cf9-9bd0-a08f7cb6c45e.png)

なお、ポリシー/マネージャモードの切り替えトグルスイッチがデフォルトでは　UI に表示されない場合がある。その際は、
`システム ＞ 設定 ＞ 全般設定 ＞ ユーザー インターフェイス ＞ ユーザー インターフェイス モードの切り替え`
よりスイッチの有効化を行っておく。
WSL2 に Docker をインストールする

# はじめに
WSL(Windows Subsystem for Linux) では、Windows 上でネイティブの Linux を起動することができます。WSL では、Docker をインストールして、イメージを起動することもできます。
ここでは、WSL に Docker CE をインストールする方法を説明します。Docker Desktop は、使用していません。

# 前提条件
- Windows 11
    - もしくは、Windows 10 バージョン 2004(20H1) Build 19041 以降
- WSL (ディストリビューション: Ubuntu) インストール済 + sytemd の有効化
    - セットアップは、[Microsoft ストア版 WSL(Windows Subsystem for Linux) インストール](https://qiita.com/hiromasa-masuda/items/355fe0c882a1a0abe1e1)を参照ください。

# パッケージ リポジトリへ Docker を追加
パッケージ一覧の更新を行い、必要なパッケージをインストールします。

    $ sudo apt-get update

    $ sudo apt-get install ca-certificates curl gnupg lsb-release

公式の GPG 公開鍵をダウンロードして、/etc/apt/keyrings/docker.gpg として保存します。

    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

パッケージ  リポジトリに docker を追加します。

    $ echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Docker CE のインストール
パッケージ一覧を更新します。

    $ sudo apt-get update

Docker CE, Docker Compose をインストールします。

    $ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

hello-world イメージを実行して、正しくインストールされたことを確認します。


    $ sudo docker run hello-world
    ...
    Hello from Docker!
    ...

ここで、「docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.」と表示されて、正しく実行できない場合は、systemd が有効化されていないため、docker demon が起動されていません。[WSL で systemd を有効化](https://qiita.com/hiromasa-masuda/items/355fe0c882a1a0abe1e1#wsl-%E3%81%A7%E3%81%AE-systemd-%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88) してください。systemd を有効化することで、でLinux 起動時に docker デーモンを起動できます。もしくは、`sudo service docker start` で手動で、デーモンを起動することもできます。

次に、docker グループにカレントユーザーを追加して、特権なしで docker を起動できるようにします。(オプション)

    $ sudo usermod -aG docker $USER

グループへの追加を有効化するために、シェルを終了して、再度、シェルを開きます。
sudo なしで、hello-world イメージを実行します。

    $ docker run hello-world
    ...
    Hello from Docker!
    ...

# 参考

- [Install Docker Engine on Ubuntu](https://docs.docker.com/engine/install/ubuntu/)
- [Docker Engine post-installation steps](https://docs.docker.com/engine/install/linux-postinstall/)
- [systemd と Docker の管理・設定](https://docs.docker.jp/engine/articles/systemd.html)
- [Microsoft ストア版 WSL(Windows Subsystem for Linux) インストール](https://qiita.com/hiromasa-masuda/items/355fe0c882a1a0abe1e1)
ubuntu20.04LTSでmkvファイルを再生しようとするもエラーがでる（the playback requires an H.264(High Profile) decoder plugin that is not installed.）

ubuntu20.04LTSでmkvファイルを再生しようとするもエラーがでる（the playback requires an H.264(High Profile) decoder plugin that is not installed.）

```
the playback requires an H.264(High Profile) decoder plugin that is not installed.
```

[こちら](https://linuxhint.com/install-h264-decoder-ubuntu/)を参考に、以下のようにパッケージをインストールして解決（選択肢はYES）

```
sudo apt update
sudo apt install libdvdnav4 gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly libdvd-pkg -y
sudo dpkg-reconfigure libdvd-pkg
sudo apt install ubuntu-restricted-extras
```

```
sudo dpkg-reconfigure libdvd-pkg
```

```
sudo apt install ubuntu-restricted-extras
```

# 参考

https://linuxhint.com/install-h264-decoder-ubuntu/
アンテナサイト管理人になりたくて参考にしたサイト【まとめラボとか】

「何もせずに稼ぎたい！」

誰しも一度は臨む夢を実現するために「アンテナサイト管理人」を目指してみました。
結果として、サイトの作成まで行けたのでその時に参考にしたサイトを紹介したいと思います。

<h2>事前情報収集に使ったサイト</h2>
敵を知らずば戦はできんということで色々調べた際にとても参考になったサイトを紹介します。
<h3>まとめラボ -5chアンテナサイト&まとめサイト攻略特化メディア</h3>
<a href="https://matome-labo.com/">https://matome-labo.com/</a><br>
このサイトは非常に参考になりましたね。
運営している人が100近いアンテナサイトとまとめサイトを運営してきた猛者の方で、明らかに他のアンテナサイト情報サイトとは質が違いました。
まずはここで一通り記事を見るのがいいと思います。<br>個人的にはLINEマガジンがよかったです。


<h2>サイト作成時に使ったサイト</h2>
<h3>RSSフィード指定するだけ！たった10分でアンテナサイトを作る方法</h3>
<a href="https://blog.56doc.net/Entry/417/" rel="nofollow">https://blog.56doc.net/Entry/417/</a><br>
このサイトが一番簡単にアンテナサイトを作ることができました。GoogleAPIを使って、jsファイルにRSSフィードをツラツラ書いてアップロードするだけでアンテナサイトができました。<br>
ただし、非常に柔軟性が薄く、細かい調整（各フィードの個別記事化等）がうまくできなかったので、ちょっと稼ぐには物足りなかなといったところです。

<h3>アンテナサイトを自作する方法を語る</h3>
<a href="https://newmatoan.com/uneinikki/85/" rel="nofollow">https://newmatoan.com/uneinikki/85/</a><br>

柔軟性を持たせられるアンテナサイトはどうやって作るのか？と模索していた時に出会ったサイトです。Cronを使ってDBに格納していくという方法でアンテナサイトを作るということで、割と簡単に作ることができました。<br>が、しかし。Cronを高頻度でぶん回して大量のRSSを引っ張ってくるためレンタルサーバーが死にました。かなり高いプランにしないとダメだったのでこちらも名残惜しいが断念。

<h3>楽々運営アンテナサイトをまるっと格安で作成！プログラミング不要で自動本文抜粋＆自動サムネイル取得の高品質アンテナサイト</h3>
<a href="https://shop.matome-labo.com/items/60921770">https://shop.matome-labo.com/items/60921770</a><br>
さて、まともに稼げそうなアンテナサイトが作れずかなり困っていたところで出会ったのがこちらのサービスです。<br>
ええ、最終的には外注しましたすんません（笑）<br>
こちらのサービスは最初に話した「<a href="https://matome-labo.com/">まとめラボ</a>」が出しているアンテナサイト作成代行サービスです。こちらのサービスは、「Cron」「プラグイン」を使用せずwordpressでアンテナサイトを作成し、フィードの個別記事化等も問題なくできるサービスでした。IFTTTを使ったアンテナサイトとなっており、作り込まれていて「なるほどぉ〜」と感心しました。現在はこちらで作成したアンテナサイトを運営しております。


アンテナサイトについては、世の中は役に立たない記事がかなり多いので参考になれば幸いです。