OmniAICreator/Qiita-1.07M huggingface dataset:
[Angular 8] environment.tsをDIする (シンプル)


InjectionTokenを使う。declare typeで型をエイリアスしたらいい感じになる。

定義側:

```environment.ts

import { InjectionToken } from '@angular/core';


export const environment = {
  production: false
};

export declare type Environment = typeof environment;

export const ENVIRONMENT = new InjectionToken<Environment>(
  'Environment',
  {
    providedIn: 'root',
    factory: () => environment // こうするとModuleのprovidersに設定せずともDIされる
  }
);

```
利用側:

```some.service.ts
import { Inject, Injectable } from '@angular/core';
import { Environment, ENVIRONMENT } from '../path/to/environment';

@Injectable()
export class SomeService {
  constructor(@Inject(ENVIRONMENT) private environment: Environment) {
    console.log(environment.production);
  }
}
```
初心者によるプログラミング学習ログ 173日目

# 100日チャレンジの173日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

173日目は

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>173日目<br><br>今日もwebサイトコーディングの課題<br><br>すすみがわるい。<br>メンターさんに聞いてしまった。。。<a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a> <a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1200515939642429440?ref_src=twsrc%5Etfw">November 29, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
超初心者がRuby使ってターミナルでやっと日本語出力させた話

問題発生時の状態

バージョン
ruby 2.6.3
rbenv 1.1.2

・引っかかってしまったところ
irbを起動し日本語を出力させようとしたところ"\U+FFE3"と表示されてしまいました。
なお英語に関しては問題なく出力ができていました。

・仮説
色々と調べてみた結果、どうやらreadlineを読み込めていないことが原因であるようです。

参考：
https://reasonable-code.com/ruby-readline/

しかし、ここで紹介されている通りに手順を進めたにも関わらず、何度試してもrbenvをアンインストールすることができませんでした。最終的にはアンインストールをするという方法は回避することにしました。

・どのようにして解決したか
rubyのバージョンが問題発生当時は2.6.3であったが、最新は2.6.5だったため、それをインストールしてみた。インストールの手順については、Progateさんのコラムを参考にして進めました。

参考：
https://prog-8.com/docs/ruby-env
rails-tutorial第4章

###helperメソッドとは
便利そうなメソッドをhelperに定義しておいてそれを呼び出す。

```app/helpers/application_helper.rb
module ApplicationHelper

  # ページごとの完全なタイトルを返します。
  def full_title(page_title = '')
    base_title = "Ruby on Rails Tutorial Sample App"
    if page_title.empty?
      base_title
    else
      page_title + " | " + base_title
    end
  end
end
```

これにより、page_titleが空の場合は、縦棒をいれずにbase_titleだけをタイトルタグに入れることができる。

```app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title><%= full_title(yield(:title)) %></title>
    <%= csrf_meta_tags %>
    <%= stylesheet_link_tag    'application', media: 'all',
                               'data-turbolinks-track': 'reload' %>
    <%= javascript_include_tag 'application',
                               'data-turbolinks-track': 'reload' %>
  </head>
  <body>
    <%= yield %>
  </body>
</html>
```
titleタグを先ほどhelperに定義したdef full_title(page_title = '')を使って実装している。
yield(:title)によりprovide(:title, "About")のように定義したタイトルを参照できる。
provideとyieldはセットで考える。

###pry
irbを拡張したものとしてpryという機能がある。
これはgemをインストールすることで使うことができる。

```
$ gem intall pry
$ pry
```
このコマンドにより、pryを使える。

###putsメソッドについて

```
[3] pry(main)> puts 'foo'
foo
=> nil
```
上記のnilは計算の結果を返している。そのため、putsはfooを出力するがメソッド自体は何も返さない。

###?の付くメソッド
?の付くメソッドは基本的にtrue か　falseを返すようになっている。
自分でメソッドを定義するときもそれを気をつけながら定義する。

###nilと''の違い
nilをto_sメソッドで文字列にしたものが''
つまり、''は0文字の文字列である。

###Ruby(オブジェクト指向スクリプト言語)について

Rubyはメソッドを呼び出すという言い回しをしているが、実は少し違う。
オブジェクト指向スクリプト言語は、オブジェクトとのメッセージのやりとりだと考える。

```
[18] pry(main)> 'foobar'.length
=> 6
```
上記は、foobarの文字列は何文字？
俺は6文字だよー
という会話で成り立っている。


###ブロックの考え方

```
>> (1..5).each { |i| puts 2 * i }
2
4
6
8
10
=> 1..5
```
ブロック付きメソッドはメソッドの引数にRubyの処理を渡していると考えるとわかりやすい。

###メソッドチェーンについて

```
[20] pry(main)> %w[foo bar baz].map { |i| i.upcase }.join
=> "FOOBARBAZ"
```
このようにメソッドで評価された値にさらに . でメッセージを与えることをメソッドチェーンという。


###ハッシュでなんでシンボルを使うのか？

```
[30] pry(main)> 'name'.object_id
=> 23088500
[31] pry(main)> :name.object_id
=> 88028
[32] pry(main)> 'name'.object_id
=> 24142460
[33] pry(main)> :name.object_id
=> 88028
```

文字列オブジェクトはオブジェクトidが毎回違う。整数はオブジェクトidが毎回同じ。ただ、シンボルにすると、object_idが毎回同じになっている。
labelとしてシンボルオブジェクトを使うと毎回同じなので毎回計算する必要がない。シンボルは人間にもわかりやすい表現ができ、整数のように計算するコスト削減ができパソコンにも優しいということ。

###ハッシュの省略記法

```
[34] pry(main)> h1 = {:first => 'yokota', :second => 'daiki' }
=> {:first=>"yokota", :second=>"daiki"}
[35] pry(main)> h1
=> {:first=>"yokota", :second=>"daiki"}
[36] pry(main)> h2 = { first: 'yokota', second: 'daiki' }
=> {:first=>"yokota", :second=>"daiki"}
[37] pry(main)> h2
=> {:first=>"yokota", :second=>"daiki"}
```
シンボルを右側に書き、=>を省略した形で書くことができる。

###classもオブジェクトの1つ

Rubyではあらゆるものがオブジェクトである。それはclassも例外ではない。
Stringにclassをするとclassクラスということがわかる。
Classクラスにsuperclassをするとmoduleクラスということがわかる。

また自分でクラスを定義するとき、親クラスに何も指定しないと、デフォルトでObjectクラスが継承される。
Java(add2)

前回使用したArrayList「array」にaddメソッドで指定の場所へ要素を追加挿入する。

    ArrayList<String> array = new ArrayList<String>();
    
    array.add("日本語");
    array.add("英語");
    array.add("フランス語");
    array.add("中国語");
    array.add("ドイツ語");

    System.out.println(array);

    [日本語, 英語, フランス語, 中国語, ドイツ語]

インデックス1へ要素「イタリア語」を挿入する。

    array.add(1,"イタリア語");
    System.out.println(array);

リストの中を出力すると以下のようになる。

    [日本語, イタリア語, 英語, フランス語, 中国語, ドイツ語]

指定した場所に要素が挿入され、それ以降の要素が後ろにズレる。
因みに、存在しない場所を指定して要素を挿入しようとすると
「IndexOutOfBoundsException」という例外が発生する。
Electron && React のconsole error対応メモ

# Electron

## Electron Security Warning

### Node.js Integration with Remote Content

```
Electron Security Warning (Node.js Integration with Remote Content) This renderer process has Node.js integration enabled
    and attempted to load remote content from 'http://localhost:3000/'. This
    exposes users of this app to severe security risks.
 
For more information and help, consult
https://electronjs.org/docs/tutorial/security.
 This warning will not show up
once the app is packaged.
```

electron上で、http経由のコンテンツを読み込んだ時に発生。
デバック中は、local上でReactを動かしているので発生する。
パッケージ化すれば発生しないエラー。

```js
process.env.ELECTRON_DISABLE_SECURITY_WARNINGS = '1';
```

を、 `electron.js` にて追記すれば表示されなくなる。

[参考]
- [Security, Native Capabilities, and Your Responsibility | Electron](https://electronjs.org/docs/tutorial/security#electron-security-warnings)
- [Electron Security Warning (Node.js Integration with Remote Content) · Issue #213 · maximegris/angular-electron](https://github.com/maximegris/angular-electron/issues/213)

### Insecure Resources

```
/.../node_modules/electron/dist/Electron.app/Contents/Resources/electron.asar/renderer/security-warnings.js:95 Electron Security Warning (Insecure Resources) This renderer process loads resources using insecure
  protocols.This exposes users of this app to unnecessary security risks.
  Consider loading the following resources over HTTPS or FTPS. 
 - http://localhost:3000/static/js/bundle.js
- http://localhost:3000/static/js/0.chunk.js
- http://localhost:3000/static/js/main.chunk.js
  
 
For more information and help, consult
https://electronjs.org/docs/tutorial/security.
 This warning will not show up
once the app is packaged.
```

同上


### Insecure Content-Security-Policy 

```
Electron Security Warning (Insecure Content-Security-Policy) This renderer process has either no Content Security
    Policy set or a policy with "unsafe-eval" enabled. This exposes users of
    this app to unnecessary security risks.
 
For more information and help, consult
https://electronjs.org/docs/tutorial/security.
 This warning will not show up
once the app is packaged.
```

同上

# React

## semantic ui

### table

```
Warning: validateDOMNesting(...): <th> cannot appear as a child of <thead>.
```

    <Table.Header>
      <Table.Row> <- 抜けてたw
        <Table.HeaderCell>

[参考]
- [Table - Semantic UI React](https://react.semantic-ui.com/collections/table/#types-pagination)

## CORS

```
Access to fetch at 'https://...' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
```

- https://github.com/electron/electron/issues/1990#issuecomment-252428760
Paizaをやるときに役立つ？？Python標準入力取得方法

# はじめに
MDG（名古屋大学 安田・遠藤・浦田研究室） Advent Calendar 2019　初日（12/1）に投稿させていただきました！！
プログラミングを始めて2年弱 & Qiitaへの投稿は初めてなので， もっときれいなコードの書き方はあるかと思います． アドバイスがあればどんどんコメントいただけると幸いです．

# Python3での標準入力取得方法
#### 複数行かつ複数列の標準入力取得  
~~~python
num = [list(map(int, input().split())) for i in range(2)]
~~~

#### 複数行かつ1列の標準入力取得
~~~python
n,m = [int(input()) for i in range("行数")]
~~~

#### 1行かつ複数列の標準入力取得
~~~python
a,b=map(int,input().split())
~~~

#### 多次元配列の値取得の記述
~~~python
answer = num[0][0]*num[1][1]-num[0][1]*num[1][0]
~~~
あまり知られていない（と思う）CSS中央寄せテクニック

CSS中央寄せテクニックとして、

```
position: absolute;
left: 0;
right: 0;
margin: auto;
```
はあまりにも有名だが、
親要素より大きな要素を中央寄せしようとすると左寄せになってしまう問題がある。

<img width="978" alt="スクリーンショット 2019-11-30 18.31.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88012/cbe8d24d-bda1-d36a-f555-32e3d6f680e0.png">

この問題を解消するためのCSSの書き方が以下になります。

```code:css
position: absolute;
left: -100%;
right: -100%;
margin: auto;
```
<img width="513" alt="スクリーンショット 2019-11-30 18.39.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88012/ab676c98-6225-8daa-3184-8c39781dd5ce.png">
※`left` `right` は必ずしも `-100%` でなくてもよい。
厳密には親要素からはみ出した数値の半分を`left` `right` にマイナス値で設定する。
上記の場合だと、

`親：400px - 子：600px = -200px`
`-200px / 2 = -100px`
`left: -100px;` `right: -100px`

## こんなときに使える
コンテナー内にあるセクション要素の背景が、コンテナーを突き抜けてるようなデザインだった場合、いちいちコンテナー内からセクション要素を外に出す必要がなくなる。
<img width="1177" alt="スクリーンショット 2019-11-30 20.30.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88012/a82a779f-7367-d00d-56a1-09fbf8c1fd0a.png">

```code:css
section2 {  
  position: relative;

  &::before {
    content: '';
    display: block;
    position: absolute;
    z-index: -1;
    left: -100%;
    right: -100%;
    margin: auto;
    width: 100vw;
    height: 100%;
    background: url(bg.jpg);
  }
}
```
シェルスクリプト シェル関数内変数

##### グループコマンド {} で関数を定義した場合、グローバル変数のように扱われる

```bash:shell-func-variable1.sh
VAL="A"
echo "1:${VAL}"
func()
{
  VAL="B"
  echo "2:${VAL}"
}
func

echo "3:${VAL}"
```

```bash:shell-func-variable-result1.sh
$ ./shell-func-variable1.sh
1:A
2:B
3:B
```

##### サブシェル () を使って関数を定義した場合、ローカル変数のように扱われる

```bash:shell-func-variable2.sh
VAL="A"
echo "1:${VAL}"
func()
(
  VAL="B"
  echo "2:${VAL}"
)
func

echo "3:${VAL}"
```

```bash:shell-func-variable-result2.sh
$ ./shell-func-variable1.sh
1:A
2:B
3:A
```

##### local コマンドを使って、ローカル変数をつかう。
```bash:shell-func-variable3.sh
VAL="A"
echo "1:${VAL}"
func()
{
  local VAL="B"
  echo "2:${VAL}"
}
func

echo "3:${VAL}"
```

```bash:shell-func-variable-result3.sh
$ ./shell-func-variable1.sh
1:A
2:B
3:A
```
UnityのGameView上に好きな画像載せれる拡張を作った

こんちにわ！
今回、ちょっとしたUnityの拡張機能を作ったのでご紹介します。

2024/11/01　最新のUnityで動くように修正しました

#作ったもの
UnityのGameWindowに好きな画像を重ねられる機能です。
![sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178782/4204eeac-cd37-fd11-c554-ef75179e5858.gif)

上記の画像のようにドラッグ・アンド・ドロップで
GameViewの表示にぴったり合うようにして
手元の好きなイメージが重ねられて
透明度を変えてそれぞれの画像を見ることができます。
予めGameViewのサイズを画像のアスペクト比と合わせておく必要があります

#なんで作ったの？
開発をする際にUIの仮配置を行うときに当たりになる物が欲しく
今までは、
1. UIデザイン画像をインポートする
2. 新しくImageオブジェクトを作る
3. サイズや位置、表示順など調整する
4. UI画像アタッチする
5. アルファ変えながら画像見て調整する
6. 他のアス比にしても大丈夫か3-4を繰り返す
7. 不要になった画像とGameObject削除
8. おわり！
とやっていたのですがこの方法では手数が多く
仮画像をうっかり入れそうになったり不要なGameObject残したり
してしまい不便でした。

そのため今回の機能を作ってみました。
これにより
1. Windowを開く
2. 画像をドラッグ・アンド・ドロップする
3. アルファ変えながら画像見て調整する
4. 他のアス比にしても大丈夫か2-3を繰り返す
5. おわり!
な感じでそんなに手間を掛けずプロジェクトを汚さず
確認できるようになりました。

#使い方
1. GameViewを表示します。表示してないと動かないです。理由は後述
2. ImageOverlapWindowを開きます。
3. Windowがでるので自分の好きな画像をドラッグ・アンド・ドロップでぺっちょんします。(大人の事情でPNGしか対応できてないです
4. 下にスクロールすると怪しいスライダーが出るのでそれを動かすと透明度変わります。
5. GameViewと同じサイズで追従するのでチェックボックスで切り替えられます。
6. おわり！

＊予めGameViewのサイズを画像のアスペクト比と合わせておく必要があります。

#内部の実装について
```C#
    RenderTexture GetGameTexture()
    {
        var gameMainView = GetMainGameView();
        if (gameMainView == null)
        {
            return null;
        }

        var t = System.Type.GetType("UnityEditor.GameView,UnityEditor");
        if (t == null) return null;
        var renderTexture = t.GetField("m_TargetTexture",
            BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField | BindingFlags.FlattenHierarchy |
            BindingFlags.SetField);
        if (renderTexture == null)
        {
            return null;
        }

        return (RenderTexture) renderTexture.GetValue(gameMainView);

    }

    public static EditorWindow GetMainGameView()
    {
        var t = System.Type.GetType("UnityEditor.GameView,UnityEditor");
        if (t == null) return null;
        var getMainGameView = t.GetMethod("GetMainGameView", BindingFlags.NonPublic | BindingFlags.Static);
        if (getMainGameView == null) return null;
        var res = getMainGameView.Invoke(null, null) ?? GetWindow(t);
        return (EditorWindow)res;

    }
```
上記のようにReflectionで取得してGameViewのRenderTextureを無理やり拾ってきて表示しています。
リフレクションでGameViewを出してるWindowを取得して
その中のRenderTextureを取得している感じになります。
そのためタブ切り替えとかでGameViewが隠れると表示が更新されなくなります。

また、OSによってUVが反転したりしてしまったので
シェーダーでその辺り直して二枚合成して表示しています。
[全体のコードはこちらからDLできます。](https://github.com/sutaa12/UnityUtlity/tree/master/UnityExtensiton/Assets/Editor/ImageOverlayGameViewWindow)

#反響
社内でデザイナーさんがUIの配置調整をやっているため
こちらのツールを利用してかなり楽に配置できているようです。
作ってよかった！思っております。
[パッケージで欲しい人はこちら](https://github.com/sutaa12/UnityUtlity/releases/tag/20241101)

＊画像を重ねる際に専用のシェーダーを利用してるのでそちらも必要になります

参考にしたサイト
http://d.hatena.ne.jp/shinriyo/20140807/p2
Ruvimine

RUNTEQ AdventCallendar 2019 3rd Article

## *Rubymine* with *Vim*


1. Install plugin *IdeaVim*
<img width="1001" alt="スクリーンショット 2019-11-30 午後8.00.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181754/d57efcfe-f74f-e122-0e76-008e6e38ce92.png">

2. Reboot Rubymine
<img width="468" alt="スクリーンショット 2019-11-30 午後8.27.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181754/69a63b48-bbdd-e149-568f-bc715c43e9ba.png">


3. *Vim*
<img width="851" alt="スクリーンショット 2019-11-30 午後11.24.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181754/2040baa9-71f0-8cb9-7c04-68c37abd2f26.png">



4. *Happy!*
<img width="448" alt="スクリーンショット 2019-11-30 午後8.25.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181754/536388b6-47e6-50eb-f0a8-e9a77f23917e.png">




                   ・
                   ・
                   ・

[解説]
・ideaVimというプラグインを導入すると、RubyMine上のコードエディタがVimになります。

・Vimの設定は`~/.vimrc`の設定を引き継ぎますが、インデントやタブなどの設定はRubyMineに準拠します。
・RubyMine上のVimの設定を個別に定義したい場合は`~/.ideavimrc`を作成して記載してください。

・Vim力の低下を感じた際には Terminalのプラグインを入れ、ショートカットキー（option + t など）を設定することで即座に素のVimを起動できるようにしてください。
<img width="324" alt="スクリーンショット 2019-11-30 午後11.09.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181754/d0cdd292-b9d6-3649-9ac1-cd0063501972.png">
<img width="1006" alt="スクリーンショット 2019-11-30 午後11.10.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181754/cf2acc75-9c82-fad4-14c7-31b5dbe072eb.png">

<img width="1237" alt="スクリーンショット 2019-11-30 午後11.11.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181754/76d62541-c0b4-8432-e410-ab9798dc7b41.png">

・Vimに嫌気が差したら`option + v`で無効化してください。
以下の条件でiPadOSでアプリが消えるときは再起動しろ

完全に載せるつもりなかったんだけど、日付が変わってしまうとバッチ処理に投げつけられるのか知らないけど記事が変更されなかった。死
明後日くらいにはまじめな記事がデます

PCユーザーならなにか問題が起きたときの基本、再起動。iPadであるのが意外だった

## 環境

- Apple iPad (第7世代)
- OS version(13.1.3)

以下の場合には再起動すると治ります

- Apple Storeから規約違反でアプリが消えたわけではない
- Spotlight検索をすればアプリが出てくる

再インストールを何度してもバグるので、再起動したら直りました。あへ～なんで～？

## 懺悔のTips

 音ゲーをするときにマルチタスク機能が呼び出されて音ゲーが止まって困る場合は以下の手順でオフにしましょう。

![20191205_192003000_iOS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106327/89db1519-7581-d7ee-b93a-b6d01708c657.png)
設定からHomeScreenのMultiTaskingを選択して
![20191205_192009000_iOS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106327/1247cef9-6540-6203-4ae5-4b9bcf48c894.png)
ジェスチャーをオフにしましょう。これ、アプリごとに設定できたりしないかなぁ。iPadOSの良さを２割くらいつぶしてるよねこれ
catalina zsh 先頭の文字

# はじめに
mac系のパソコンで使うterminalを開くと
初期状態ではこのような誰々のmacbook proから始まります。
<img width="512" alt="スクリーンショット 2019-11-30 19.48.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387055/d66bf4a2-6da2-55de-49cb-530e2924b9a8.png">

プログラミング初心者なのでこのような記述がどのような場面で役に立つのかわかりませんが
個人的にはこれがかなり目障りなので自分なりにアレンジを加えたいと思います。

完成形がこちらです。

<img width="464" alt="スクリーンショット 2019-11-30 20.21.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387055/5de8ff58-bec3-0c81-f089-ec25ad7c2569.png">


# いざアレンジしよう

設定を書くファイル、あるいはzshを使うにあたり必要なファイルを作成します。

```
touch ~/.zshenv && touch ~/.zprofile && touch ~/.zshrc
```

設定内容を書きます。
.zshrcファイルの中に`PROMPT='%C:'`と書くコマンドです。

```
echo "PROMPT='%C:'" >> ~/.zshrc
```

# 説明
bashを使っていたときは先頭の文字のアレンジは
`PS1=`と言うような形で設定ができましたがzshでは、
`PROMPT=`と言う形になります。これが分からなくて1日戦っていました。

そのあとは自分の好きなようにカスタマイズの条件を書きます。
自分の場合は現在のディレクトリがどこにあるかわかればいいだけなので`%C`を使いました。

他にも色を変えたり、時間を表記させたりすることができます。
詳しくはこちらをご覧ください。

http://www.sirochro.com/note/terminal-zsh-prompt-customize/

このQiitaの大半もこのサイトを参考に書きました。
同じ内容で困った方は参考になれれば幸いです。
[Python3]スクレイピング虎の巻

何回もスクレイピングをやってだいたいわかってきたので、備忘録としてここに書いておこう。

使う言語はタイトルの通りPython、何と言ってもBeautifulSoupが便利すぎる！

# インポート

インポートするのはだいたいこれだ

```python
import json
import os
import requests
import requests_cache
from bs4 import BeautifulSoup
```

- json: 取得したデータの保存用に
- os: ディレクトリ操作とかに
- requests: 便利なファイル取得
- requests_cache: キャッシュとしてローカルにデータを貯められる
- BeautifulSoup4: 神器

## 定数

UserAgentはスクレイピングには必要だ

```python
HEADERS = {'User-Agent': 'Mozilla/5.0'}
```

# 関数

## soupを取得する関数

いろいろ試したけど、`lxml`が一番しっくりくる。
もし取得でうまくいかない時は、これを変えよう。
`html5lib`なんかはブラウザとほぼ同じに解析してくれる。

もし取得済みの場合はキャッシュのデータを使うようにする。
サーバへの無駄な負担は出来る限り減らす。

```python
def get_soup(url):
    # キャッシュを使う
    requests_cache.install_cache()

    response = requests.get(url, headers=HEADERS)
    return BeautifulSoup(response.content, 'lxml')
```

# CSSで取る

soupから目的のタグを取る時はCSSセレクタを使用する。

```python
links = soup.select('div#menu div.box a')
```

Chromeやsafariの開発モードで`$$('div#menu div.box a')`とか入力すればデバッグできる。

## いろいろな要素を取る

上記で抽出したものから要素を取る

```python
for link in links:
    link.string      # aタグで囲まれたテキストがとれる
    link.get('href') # hrefのリンクがとれる
```

テキストの中身をごっそり取る場合には`link.get_text()`でもいい。

これらをだいたいゴニョゴニョやる！

# スクレイピングした情報を保存する

だいたい以下のように保存する。

- ファイルに保存（.json, .jpgとか）
- DBに保存（だいたいSQLite）

## ファイルに保存

途中

## DBに保存

途中
ゼロから始めるcodewars kata　数独、ナンプレ

codewars kataではプログラミングと実用英語が同時に学べます。天才的サイトです。
githubアカウントがあれば30秒で始められます
興味が沸いたら今すぐ[ここから始めよう](https://www.codewars.com/)

ちなみにpython以外でも多くの言語でチャレンジ出来ます

# 今日のコード
課題がSudoku（数独）だったりサイトの名前がkata（型）だったり等級表記がkyu（級）だったりこのサイトは日本が好きみたい
ちなみにKumite（組手）とかいうサービスもあるみたいです


## 1.数独[Did I Finish my Sudoku?](https://www.codewars.com/kata/53db96041f1a7d32dc0004d2/)[5kyu]
### Q 入力の盤面において数独が終わったかどうか判定せよ
[数独のルール](https://www.nikoli.co.jp/ja/iphone/sd_tutorial/)置いときます
縦、横、3*3エリアにおいて1~9を並べるやつですね

###例1
##### 入力：盤面

```
[[1, 3, 2, 5, 7, 9, 4, 6, 8]
,[4, 9, 8, 2, 6, 1, 3, 7, 5]
,[7, 5, 6, 3, 8, 4, 2, 1, 9]
,[6, 4, 3, 1, 5, 8, 7, 9, 2]
,[5, 2, 1, 7, 9, 3, 8, 4, 6]
,[9, 8, 7, 4, 2, 6, 5, 3, 1]
,[2, 1, 4, 9, 3, 5, 6, 8, 7]
,[3, 6, 5, 8, 1, 7, 9, 2, 4]
,[8, 7, 9, 6, 4, 2, 1, 5, 3]]
```

##### 出力：'Finished!'
agvz

###例2
##### 入力：盤面

```
[[1, 3, 2, 5, 7, 9, 4, 6, 8]
,[4, 9, 8, 2, 6, 1, 3, 7, 5]
,[7, 5, 6, 3, 8, 4, 2, 1, 9]
,[6, 4, 3, 1, 5, 8, 7, 9, 2]
,[5, 2, 1, 7, 9, 3, 8, 4, 6]
,[9, 8, 7, 4, 2, 6, 5, 3, 1]
,[2, 1, 4, 9, 3, 5, 6, 8, 7]
,[3, 6, 5, 8, 1, 7, 9, 2, 4]
,[8, 7, 9, 6, 4, 2, 1, 3, 5]]
　　　　　　　　　　　  #5　#3  #縦に見たとき5,3がそれぞれ足りない
```
##### 出力：'Try again!'

### My Answer

```
import numpy as np
def done_or_not(board):
    sets = set([i for i in range(1,10)])
    board = np.array(board)
    if not [1  for j in range(9) if not set(board[j]) == sets or not set(board[:,j]) == sets] ==[]:
        return 'Try again!'    
    if not [1 for i in range(9) if not set(board[i//3*3:i//3*3+3,i%3*3:(i%3*3)+3].flatten()) == sets ] ==[]:
        return 'Try again!' 
    return 'Finished!'
```
sets = {1~9の集合}として
縦横列がこの集合になっているか
各エリアがこの集合になっているか
をそれぞれチェックしてる感じですね
Codewarsっぽいコードになってきた気がする…
可読性が低いのでいいのか悪いのか分からん

### Best Answer

```
import numpy as np
def done_or_not(aboard): #board[i][j]
  board = np.array(aboard)

  rows = [board[i,:] for i in range(9)]
  cols = [board[:,j] for j in range(9)]
  sqrs = [board[i:i+3,j:j+3].flatten() for i in [0,3,6] for j in [0,3,6]]
  
  for view in np.vstack((rows,cols,sqrs)):
      if len(np.unique(view)) != 9:
          return 'Try again!'
  
  return 'Finished!'
```
これはなんていうか…めっちゃ見やすいですね
np.vstack()で縦横四角を2次元配列に並べて
np.unique()で何種類の要素があるかを見ているんですね
len(set())で同じことをしようとしてたことがあったけどこんな便利な機能があるとは
内包表記ｶｺｲｲじゃなくてちゃんと端的で見やすいコードを書けるよう精進します。


### あとがき
CSSとHTMLの勉強を始めました
Terraformで指定したバージョンを利用する

## 利用できるバージョン確認

```
tfenv list-remote
```

## インストール

```
tfenv install 0.12.16
```

## インストールされているバージョン確認

```
tfenv list
```

出力結果

```
* 0.12.16 (set by /usr/local/Cellar/tfenv/1.0.1/version)
  0.12.12
  0.12.7
```

## バージョン確認

```
terraform --version
```

出力結果

```
Terraform v0.12.16
+ provider.aws v2.40.0
+ provider.local v1.4.0
+ provider.null v2.1.2
+ provider.template v2.1.2
```
今更きけない桁数の求め方

#はじめに
どうも僕は衝撃を受けました。こんな桁数の求め方があったのかと。とても恥ずかしくて周りには言えないです。でも、僕と同じ境遇に立っている人がいるかもしれません。
そいう人たちのために僕が犠牲となって、共有しようと思います。

扱う言語はC++です。

# 桁数の求め方
簡単にいうと、整数を文字列にして文字列の長さを求めれば桁数が出る。それだけです。
簡単ですね。

それではC++を使って実際にコードを書きます。


```sample.cpp

#include <iostream>
#include<string>


using namespace std;

int main(){

    
    int n1 = 987654321;
    int n2 = 12345;
    int n3 = 159;

    string s1 = to_string(n1);
    string s2 = to_string(n2);
    string s3 = to_string(n3);

    int ans1 = s1.length();
    int ans2 = s2.length();
    int ans3 = s3.length();

    cout << ans1 << endl << ans2 << endl << ans3 << endl;
}

```

はい。簡単ですね。こんなこと今更知ったわけですよ。

以上です。最後までお付き合いいただきありがとうございます。
[UE4]Unreal PythonからコンソールコマンドやPythonを実行する

Unreal Pythonからコンソールコマンドを実行することで、Pythonでは出来ない処理(QUIT_EDITORなど)を行うことが出来ます。
###Unreal Pythonからコンソールコマンド実行
```python:qiita.py
import unreal

Editor = unreal.EditorLevelLibrary.get_editor_world()
unreal.SystemLibrary.execute_console_command(Editor, "任意のコマンド")
```

また、さらに別のPython実行に繋げる事もできます。
###Unreal PythonからUnreal Python実行
```python:qiita.py
import unreal

unreal.PythonScriptLibrary.execute_python_command("任意のスクリプトかパス")
```
execute_python_command_exという関数もありますが、こちらはステートメントとして実行するかファイルとして実行するかどうかと、実行時のスコープ制御が可能になっています。
フィールド名について

Splunkのフィールド名でちょっとわかりづらいところがあるのでまとめてみた。

#空白のあるフィールド名
当たり前といえば当たり前だけど
`"field 1"`とダブルコーテーションでくくる必要がある。
でもいつもダブルコーテーションかというとそうでもない。

##サンプル

```Splunk:SPL
| makeresults
| eval "field 1"=now()
| eval result1=strftime("field 1","%c")
| eval result2=strftime('field 1',"%c")
| eval result3=strftime($field 1$,"%c")
| table "field "1 result*
```

##結果

| field 1 | result2 | result3 |
|--:|:--|:--|
| 1575106884 | Sat Nov 30 18:41:24 2019 | Sat Nov 30 18:41:24 2019 |

ということで`field 1`の結果がでない。
根拠は見つけきれていないけど、**`eval`等の引数で使用するときのフィールド名は`''`で囲う必要がある。**
あと、**`$$`で囲うのは`map`以外でも使える。**

#rename

```Splunk:SPL
| makeresults
| eval "field 1"=now()
| eval result1=strftime("field 1","%c")
| eval result2=strftime('field 1',"%c")
| eval result3=strftime($field 1$,"%c")
| table "field "1 result*
| rename "field "* as field_*
```

`foreach`や`rename`で使用できる`*`。
そもそも、`"field "*`の時点で少しおかしい感じがするが問題なく使用できる。

```Splunk:SPL
| makeresults
| eval "field 1"=now()
| eval result1=strftime("field 1","%c")
| eval result2=strftime('field 1',"%c")
| eval result3=strftime($field 1$,"%c")
| table "field 1" result*
| foreach result*
    [rename <<FIELD>> as result_<<MATCHSTR>>_<<MATCHSTR>>]
```
`foreach`内でも`rename`は使えるので凝ったフィールド名一括変換はこちらで実施できる。

フィールド名については[Knowledge Manager Manual](https://docs.splunk.com/Documentation/SplunkCloud/8.0.0/Knowledge/Aboutregularexpressionswithfieldextractions)に
>Proper field name syntax
Field names must conform to the field name syntax rules.

>Valid characters for field names are a-z, A-Z, 0-9, . , :, and _.
Field names cannot begin with 0-9 or _ . Leading underscores are reserved for Splunk Enterprise internal variables.

数字から始まるフィールドは使えないよ。とか書いてある。

#_から始まるフィールド名
[Use default fields](https://docs.splunk.com/Documentation/SplunkCloud/8.0.0/Knowledge/Usedefaultfields)に書いてある通り。

```Splunk:SPL
| makeresults
| eval test=""
| fields -*
```
このクエリーの結果は`_time`が残る。
しっかり除きたい場合は`fields -_*`を使用するか、`table`で残したいフィールドを明示する。
csvで出力する時、意識しないといろいろ付いてくるのはここら辺。

ただこの`_`をつけると`*`から外れるのはうまく使うと`foreach`のフィールド指定を除外に使える。

```Splunk:SPL
| makeresults
| eval get=_time
| rename get as _get
| eval test = _get
```
終わったら戻してやればいい。なんか表示が消えてしまうからびっくりした。
#{}を含むフィールド
JSONなんかでよく見かける。

```Splunk:SPL
|makeresults
|eval "test{}.test"="test"
```

| _time | test.test |
|:--|:--|
| 2019/12/25 10:37:40 | test |
作ろうとすると消えてしまう。
JSONデータを`spath`するとそんなことはないのだけど。
仕方がないので、戻してあげる

```Splunk:SPL
|makeresults
|eval "test{}.test"="test"
|foreach * 
    [rename <<FIELD>> as "test{}.test"]
```
`foreach`を使っているのは、変化したフィールド名を手打ちしたくなかったから。
変化するといえば、`multikv`をCSVで使う時フィールド名に空白が入っていると _(アンダーバー) に変更してしまう。

#まとめ
Splunkの出力で日本語のフィールド名やスペースが入ったフィールド名を使いたい時はある。
でも計算するときとかこのようにいろいろ気にしなきゃいけないので、最後の最後で`rename`する方がいいです。
JavaScriptのビルトインオブジェクトを拡張する

例えば、配列を拡張してrubyのように`first`で1件目のエントリーを取得できるようにするにはどうすればよいか、
といったことを紹介します。

```javascript
const arr = [1, 10, 100, 200]
arr.first // -> 1
```

拡張する方法を紹介する記事ですので、拡張している内容は特に重要ではありません。

# 注意

グローバルなものを変更してしまう内容を紹介しています。

一見便利に思えても、名前が衝突する可能性があったりしますので、実用するべきかどうかは慎重に検討してください。

（僕は個人の実装物でしかやりません）

そして、実装する内容も、本当に汎用的に使えるものに絞ったほうがよいです。

# Mathオブジェクトに関数を拡張

この場合、単に好きなキー名に関数をアサインしてしまって大丈夫です。

```javascript
Math.sum = (...numbers) => {
  return numbers.reduce((prev, current) => prev + current)
}

Math.sum(1, 10, 100) // -> 111
```

↑与えられた可変長引数の数値を全て合計して返す関数です。可変長引数や`reduce`の解説は省略。

```javascript
Math.average = (...numbers) => {
  return Math.sum(...numbers) / numbers.length
}

Math.average(1, 10, 100) // -> 37
```

↑与えられた可変長引数の数値の平均を返す関数。さっきの`sum`を再利用。

```javascript
Math.randomInt = (min, max) => {
  return Math.floor(Math.random() * (max + 1 - min)) + min
}

Math.randomInt(1, 100) // -> 55
```

↑第一引数〜第二引数の範囲で、ランダムに整数を返す関数。

# Arrayのprototypeにgetter/setterを定義

prototypeを拡張する際は、`defineProperty`を使ってください。

```javascript
Object.defineProperty(Array.prototype, 'first', {
  get () {
    return this[0]
  },
  set (value) {
    this[0] = value
  }
})

const arr = [1, 10, 100, 200]
arr.first // -> 1
arr.first = 5
arr.first // -> 5
```

配列の1件目にアクセスできるプロパティを実装してみました。

# Arrayのprototypeに関数を拡張

同じく`defineProperty`を使い、`value`に定義します。

```javascript
Object.defineProperty(Array.prototype, 'random', {
  value () {
    return this[Math.randomInt(0, this.length - 1)]
  }
})

const arr = [1, 10, 100, 200]
arr.random() // -> 10
arr.random() // -> 200
```

↑配列内から一つのエントリーをランダムに取得します。さっきの`randomInt`を再利用。

```javascript
Object.defineProperty(Array.prototype, 'clear', {
  value () {
    return this.length = 0
  }
})

const arr = [1, 10, 100, 200]
arr.clear()
arr // -> []
```

↑配列を空にする関数です。

（配列は`arr.length = 0`で空にできますが、仕様を知っていないと何をしているか意味がわかりません。`arr = []`なら分かりやすいけど、別のオブジェクトになってしまうのでやっていることが全然変わってきます。なので明確な名前をつけて関数化しました。）

# プリミティブ型のラッパーオブジェクトも拡張

手順は同じです。

```javascript
Object.defineProperty(Number.prototype, 'half', {
  get () {
    return this / 2
  }
})
const num = 1280
console.log(num) // -> 1280
console.log(num.half) // -> 640
console.log(num.half.half) // -> 320
console.log(num.half.half.half) // -> 160
```

数値を半分にします。



# 補足

### defineProperty

さきほどのdefinePropertyの第三引数で渡した`記述子`には、`get`, `set`, `value`以外にもありますので、詳しくは以下をご覧ください。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

### Objectのprototype

もちろん`Math`や`Array`以外でも同じ方法で拡張できますが、`Object`のprototypeは変更するとあらゆるものに影響してしまうのでやめたほうが良いです。
【初心者向】配列とハッシュ取り出し方、活用の仕方

Railsを何人かに教えていて、配列の取り出し方が怪しいのではないかと思えたので
勉強会資料として書きます。

配列というのはデータを複数入れることができるものです。
例えば`@basic1 = [1, 2, 4, 8, 16, 32]`
この時、複数入った中身を取り出すには

`number = @basic1[0]`
のように書く。

`[0]`というのがインデックス番号になって、0番目から始まります
今回の場合なら
0番目が`1`、1番目が`2`、2番目が`4`、3番目が`8`、4番目が`16`、5番目が`32`
となります。

ビューに表示するときは例えば

```.erb
<h1>基本１</h1>
<div>
<h2>basic1</h2>
  <% @basic1.each do |b| %>
    <%= b %><br>
  <% end %>
</div>

```

```/sample-blog/app/controllers/users_controller.rb
  def basic1
    @basic1 = [1, 2, 4, 8, 16, 32]
  end
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260345/6a7c45bb-6fde-2301-264e-56f14c03aad3.png)

同じパターンで

```/sample-blog/app/controllers/users_controller.rb
  def basic1
    @basic2 = ["aaa", "bbb", "ccc", "ddd"]
  end
```


```.erb
<h2>basic2</h2>
<div>
  <% @basic2.each do |b| %>
    <%= b %><br>
  <% end %>
</div>
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260345/a75028ca-a7a3-2aca-1753-35a59589cfed.png)


# 配列の中に配列

少し複雑な場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260345/9428b7c6-c1b6-902d-73f4-c3906e441978.png)

```.rb
def basic1
    @basic3 = [[1, 2, 3],[3, 4, 5]]
end
```

```.erb
<h2>basic3</h2>
<div>
  <% @basic3.each do |basic| %>
    <p><%= basic %></p>
  <% end %>
</div>
```
繰り返し１回目はindexが１繰り返し２回目はインデックスが1
indexが`0`のところは`[1, 2, 3]` 1のところは`[3, 4, 5]`


今度は全部表示させたい（取り出したい）場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260345/7186837d-cf65-578a-6b55-7b6515b9894e.png)

```.erb
<h2>basic3-2</h2>
<div>
  <% @basic3.each do |basic| %>
    <% basic.each do |b| %>
      <%= b %><br>
    <% end %>
  <% end %>
</div>
```

eachの繰り返しの中にeachがあります。
1回目のループでbasic = `[1, 2, 3]`が取り出されるのでこれをさらにループにかけると`1` `2` `3`
2回目のループでbasic = `[3, 4, 5]`が取り出されるのでこれをさらにループにかけると`3` `4` `5`
と中身を取り出すことができます。


# 配列の中にハッシュ

```.rb
@basic5 = [
      {name: "佐藤", mail: "satho@gmail.com"},
      {name: "田中", mail: "tanaka@yahoo.co.jp"}
    ]
```


一つ目の要素が`{name: "佐藤", mail: "satho@gmail.com"}`
二つ目の要素が`{name: "田中", mail: "tanaka@yahoo.co.jp"}`

以下のように取り出すことができます。

```.erb
<h2>basic5-1</h2>
<div>
  <% @basic5.each do |b| %>
    <p><%= b[:name] %></p>
    <p><%= b[:mail] %></p>
  <% end %>
</div>

<h2>basic5-2</h2>
<div>
    <p><%= @basic5[0][:name] %></p>
    <p><%= @basic5[1][:mail] %></p>
</div>
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260345/05e3b54d-35de-3d2f-a81e-d85b2660f5be.png)

こんな感じで取り出すことができます。
bashのプロンプトを七色にする

無味乾燥なプロンプトに、色付けします。

```shell
export PS1="¥$(pwd | sed -e's/¥//¥[¥e[1;37;41m¥]¥//'{1..1000..7} | sed -e's/¥//¥[¥e[1;30;42m¥]¥//'{2..1000..7} | sed -e's/¥//¥[¥e[1;30;43m¥]¥//'{3..1000..7} | sed -e's/¥//¥[¥e[1;37;44m¥]¥//'{4..1000..7} | sed -e's/¥//¥[¥e[1;37;45m¥]¥//'{5..1000..7} | sed -e's/¥//¥[¥e[1;30;46m¥]¥//'{6..1000..7} | sed -e's/¥//¥[¥e[1;30;47m¥]¥//'{7..1000..7} )¥[¥e[0m¥] \\$ "
```

変更後、
![nanairo2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25456/a87efdd1-95fe-c423-ce0d-4e277e76fc4e.png)

pwdの出力を、 区切り文字`/` の出現順ごとに色を変えています。

環境
==
```shell
$ cat /etc/issue
Ubuntu 18.04.3 LTS \n \l
```
巡回符号、BCH符号について

## 概要
Berlekamp-Massey algorithm　からスタートして、符号理論を全く知らないことに気づき、まわりまわって**巡回符号**、**BCH符号**について勉強してみたので備忘録的にまとめました。

## 内容

- 巡回符号
- BCH符号

について簡単にまとめてみる。

##　巡回符号
> ある線形符号のn個の符号で構成される符号語として$(c_0, c_1, ..., c_{n-1})$があるとき、それをサイクリックに巡回させたものも符号語である時、この線形符号を巡回符号と呼ぶ。

一般的に**巡回符号は符号語を係数とした多項式**で書かれ、その多項式は排他的論理和（XOR）を加算としたガロア拡大体で定義されている。
細かい巡回符号の生成方法は[ウィキペディア](https://ja.wikipedia.org/wiki/%E5%B7%A1%E5%9B%9E%E7%AC%A6%E5%8F%B7)にも詳しくまとめられているが、ここで面白いのは、**情報多項式と$x^{n-m}$の積（つまりシフト演算）を計算だけすれば、その答えを生成多項式で割ることで符号化が実装できる**ことである。すなわち、**シフトレジスタ**を使うことで簡単に符号化ができる。対照的にハミング符号を用いる際は、符号長が大きくなるにつれて符号回路の複雑さが加速度的に増すことになる。

<img width="407" alt="Screen Shot 2019-11-30 at 16.58.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/64a04721-4dd4-767e-d09c-c9f53124d485.png">


## BCH符号
最もよく研究されている符号のうちの１つ。

細かい計算はWikipediaで事足りるので、簡単にまとめる。

自然数qの有限体を考え、$n = q^m-1$として、1のn乗根を、m次のガロア拡大体で求める($\alpha$)。
$\alpha$のi乗を解にもつ原始多項式を求め、**生成関数をそれらの原始関数の最小公倍数の関数と定義する**。
このとき、幾つの原始関数を選ぶところがdに対応している。つまり、3つの原始関数の最小公倍数関数を生成関数とすれば、d=3のBCH符号となる。

復号に関しては、いくつかやり方はあるが、パターソン方式などが有名である。


今日はここまで。
もうちょい勉強したいです。
終わり。
ハミング距離、線形符号、アダマール符号について

## 概要

**Berlekamp-Massey algorithm**　からスタートして、符号理論を全く知らないことに気づき、まわりまわって**線形符号**、**アダマール符号**などについて勉強してみたので備忘録的にまとめました。

## 内容

どれも日本語と英語のウィキペディアをベースに勉強しただけになります。

## ハミング距離
**ハミング距離**とは、２つのベクトルが与えられた時、各要素を比べて行って、**異なる要素**があるたびにカウントを増やし最後のカウントの出力のことです。
たとえば、$10010$と$11011$のハミング距離は、２つの要素が異なるので２になります。
言い換えると、２つのベクトルが与えられた際に、片方のベクトルの幾つの要素を変更すれば他方と等しくなるかをカウントしたものです。

## そもそも、符号とは
**符号**とは、**誤り訂正に使われる手法**です。情報を送信者から受信者にノイズのある条件下で送る、つまり受信者は受け取った情報にノイズがあるかもしれず、あったならノイズを検出し訂正する必要がある。という状況化で、受信者にその手段を与えます。

## ブロック符号における最小距離
ブロック符号は、$(n, k, d)_q$ のような表記をされることが多く、それはブロック符号に使われる**ブロックのサイズ**がnであり、メッセージの長さ（送る**ブロックの個数**）はk個であり、その**符号の最小距離**がdである。というような意味です。
ここで、最小距離とは、いかなるペアの異なるメッセージが符号化された時の、最小のハミング距離のことで、次のようにかかれます。
<img width="239" alt="Screen Shot 2019-11-30 at 16.31.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/7b23b466-9b13-d25b-6129-a1fc856718e2.png">
この**最小距離がdのとき、$d/2 -1 $以下のエラー個数であれば、受信側で訂正ができます**。

## 線形符号
**線形符号**は誤り検出訂正に使われるブロック符号のうちの１種類になります。他の符号に比べて、**符号化と復号化が効率的であるという特徴**を持ちます。

とりあえず、有限体の拡大体を考えた際、それがn次元線型空間であるとします。その中のk次元線型空間を(n,k)線形符号と呼びます。k次元線型空間Cはk個の基底ベクトル（$g_1, g_2, .., g_k \in F^n $）を指定することで定まるが、それらの基底ベクトルを並べた$n \times k$の行列を線形符号$C$の**生成行列**（$G$）と呼びます。また、Cを**連立一次方程式で指定することも往々に可能**であり、その時に用いる行列のことを**パリティ検査行列**（$H$）と呼びます。線形符号$C$の基底を上手くとることで、下図のような形式に$G$および$H$を取ることができます。このような$G$、$H$を**組織符号形式**と呼びます。

<img width="254" alt="Screen Shot 2019-11-30 at 15.37.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/019d3f5a-b0ae-9025-1936-aa6aa5bd9b39.png">

よって、例えば入力ベクトルが$k$次元だった場合、まず**生成行列**によって$n$次元の符号を作り送ります。受信者は**パリティ検査行列と受信した情報を用いてシンドロームを生成**。シンドローム表から対応する**コセット・リーダ**を計算し、それを受信した情報から引き算することで**エラーを訂正**できます。

たとえば、
<img width="597" alt="Screen Shot 2019-11-30 at 15.37.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/143758c3-cb08-486f-a9c0-0b26d968f17b.png">

のような場合、この符号は $[7,4,3]$ と書くことができ、１ビットのエラーを訂正することができます。
このハミング符号と呼ばれる方式に関しては、訂正能力に関して、$[2^r-1, 2^r -r -1, 3]_2$ の符号です。

## アダマール符号

**アダマール符号**に関しては、$[2^r, r, 2^{r-1}]_2$の符号であり、**符号化により多くのデータを送らなければならない反面、多くのビット($r^{r-2}-1$個)を訂正可能である**。
アダマール符号はアダマール行列からきており、アダマール行列とは各行が直行しているという条件を持つ行列のことで、
<img width="124" alt="Screen Shot 2019-11-30 at 16.11.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/503e8fe5-4905-b1f0-0454-3d8a26179c5c.png">

それは上記の条件に書き直せる。また、アダマール行列の生成は再帰的に行うことができ、
<img width="479" alt="Screen Shot 2019-11-30 at 16.11.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/5a314977-3e90-faf0-d258-baa9afd002b3.png">
それはこう書けます。


## 終わりに
今回はここまで。
終わり。
リード・ソロモン符号と復号 について

## 概要
縁があって **Berlekamp-Massey アルゴリズム**について調べたら、深淵にはまったのでできるだけ備忘録的にまとめてみました。

## 前回は
>Berlekamp-Massey アルゴリズムは、一番短いLinear feedback shift register (LFSR) を、与えられたバイナリの出力シークエンスから求めるアルゴリズムである。
また、このアルゴリズムは、体上のlinearly recurrent sequenceを与えられた時に、それのminimal な多項式を見つけることができる。

というBerlemap-Masseyアルゴリズムの定義について理解しました。
ウィキペディア先生の解説をもうちょい下ってみます。

## 内容

> The Berlekamp–Massey algorithm is an alternative to the Reed–Solomon Peterson decoder for solving the set of linear equations.
>Berlekamp-Massey アルゴリズムは、線形方程式のセットを解くための、リード・ソロモンデコーダーの代替となる。

これについて考えてみます。

## リード・ソロモン符号と復号

正直、この[ウィキペディア記事](https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%BC%E3%83%89%E3%83%BB%E3%82%BD%E3%83%AD%E3%83%A2%E3%83%B3%E7%AC%A6%E5%8F%B7)がわかりやすすぎて素晴らしいので、そちらを見て欲しいのですが、簡単にまとめます。

まず何がしたいのかと言うと、ある**信号が飛んできたとき**に、それが正しいかどうか判定したい、また、**信号がエラーを含んでいるとすればそれがどこに含まれ、どうやればエラーを訂正できるか**。という問題に対して、

#### 符号化

送る情報（ビット列）を**シンボルと呼ばれるブロックに分ける**。例えば１ブロック１バイトであれば８ビットです。この時、**８ビットを１シンボル**とした場合には、そのシンボルの情報を、**８次の最小多項式から定義される拡大体であるガロア体**を定義し、１シンボルの情報をこのガロア体を用いて１つの生成多項式として書きます。さらに、例えばこの符号化を２シンボルのエラーに対応させたいとすると、その望みのシンボル数に対応した**生成多項式**を生成します。
まとめると、

1. リードソロモン符号と呼ばれるものを有限体である**ガロア体**を用いて生成し、
2. 送りたい情報を符号化します（この多項式のことを**情報多項式**と呼ぶ。）
3. それに付随して**生成多項式**というものも生成、送信します。

ここまでが**符号化**であり、データ受信者はこれを元にエラーを訂正します。（復号）


#### 復号

情報を受け取った側はエラーを含んでいる可能性のある情報を受け取っているわけですが、その**訂正（復号）**は、いくつかやり方があるようで、そのなかでも**ピーターソン法**を用いると、

1. **シンドローム**という数値をガロア体の根と受け取った多項式から算出します。
2. **シンドロームを元に作った行列の行列式**を計算し、誤りを含む**シンボルの数をまず断定**します。
3. その後、**誤りを含むシンボルの位置について断定**します。
4. 位置を断定した後は、連立一次方程式を用いて、**断定したエラーを含む次数の項を補正する数値を算出**します。
5. もともと受け取った情報（多項式に）この補正数値を対応した次数の係数とした補正多項式を足し合わせ、**エラーを訂正**します。


#### おわりに
これらをもとに、Berlekamp-Masseyアルゴリズムについてもう少し踏み込んで見たいとおもいます。
【備忘録】ファイルまたはアセンブリ，またはその依存関係の 1 つが読み込めませんでした。は .config ファイルを疑う

# 問題
自分で .NET Framework のアプリケーションをビルドして実行すると動作するファイルを，友人のコンピュータに転送し実行したところ次のような例外が投げられ正常動作しなかった。


> System.IO.FileNotFoundException: ファイルまたはアセンブリ '***', またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。
(Exception.ToString より抜粋)

また，転送する際に含めたファイルを自身のコンピュータの別のディレクトリに展開し実行すると，次のような例外が投げられ正常動作しなかった。


> System.IO.FileLoadException: ファイルまたはアセンブリ '***'、またはその依存関係の 1 つが読み込めませんでした。見つかったアセンブリのマニフェスト定義はアセンブリ参照に一致しません。 (HRESULT からの例外:0x80131040)
警告: アセンブリ バインドのログ記録がオフにされています。

> アセンブリ バインドのエラー ログを有効にするには、レジストリ値 [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) を 1 に設定してください。

> 注意: アセンブリ バインドのエラー ログに関連するパフォーマンス ペナルティがあります。

> この機能をオフにするには、レジストリ値 [HKLM\Software\Microsoft\Fusion!EnableLog] を削除します。
(Exception.ToString より抜粋)

# 原因
.exe.config ファイルが実行ファイルと同じディレクトリに存在しない。

# 解決策
.exe.config を実行ファイルと同じディレクトリに配置する。(アーカイブに含める。)
Berlekamp-Massey algorithm について

## 概要
縁があって **Berlekamp-Massey アルゴリズム**について調べたら、色々面白かったのでまとめました。


## 内容

> Berlekamp-Massey アルゴリズムは、一番短いLinear feedback shift register (LFSR) を、与えられたバイナリの出力シークエンスから求めるアルゴリズムである。
> また、このアルゴリズムは、体上のlinearly recurrent sequenceを与えられた時に、それのminimal な多項式を見つけることができる。

はい、１つ１つ追っていきましょう。

## シフトレジスタについて
まず、**シフトレジスタ**について簡単に解説します。[こちらのサイト](https://synapse.kyoto/glossary/shift_register/page001.html)がなかなか詳細に解説していました。すばらしい。
こちらを読むとわかるのですが、シフトレジスタを理解するのに、**Dフリップフロップ**と、**マルチプレクサ**について知る必要があります。
Dフリップフロップは、簡単に言うと、**１ビットの情報を記録するメモリ**です。Dフリップフロップは、D信号の論理（０か１かを）をクロックがLからHに遷移した時に記憶し、クロックの周波数後にQに出力として吐き出す働きをします。

**マルチプレクサは、セレクタとも呼ばれ**、Sの外部入力がLかHかによって、**AもしくはBの入力をYに渡すかを決定**します。例えが、SがLの時はBの論理をYに渡し、Hの時はAの論理をYに渡します。

これを踏まえて、例えば４ビットのシフトレジスタには、２つの異なる動作があります。
１つ目は、シフトレジスタの１つの端子に、**Hを入力してシリアル入力モード**にした場合で、２つ目は**Lを入力してパラレル入力モード**にした場合です。

1. **シリアル入力モード**の場合
クロックが進むごとに、各出力がシフトしながら出力されます。たとえば、出力が４つあり、Q1, Q2, Q3, Q4 のときは、Q2の出力が１つ前のクロックでのQ1の値、Q3の出力は１つ前のクロックでのQ2の値、。。。という風にです。
このシフト動作を、シフトレジスタに記憶している数値への演算と考える場合、この演算を**シフト演算**と呼びアmす。

2. **パラレル入力モード**にした場合
クロック信号の立ち上がり時に、各Q信号を取り込み、それをD信号に受け渡す、単なるパラレル入力パラレル出力のレジスタ（**ストレージレジスタ**）として働きます。

## LFSR (Linear Feedback Shift Register)
**LFSR**は、上のシフトレジスタで、入力が１つ前の状態の線形変換で構成されているものです。１ビットに対して一番よく使われる線形演算はXORです。
LFSRにへの初期入力のことをシードといい、LFSRのオペレーションが**決定的**、つまりある時刻での状態が決まると、その次の状態が一意に決まると言う特性があります。また、LFSRが有限個の状態を持っていることを考慮すると、LFSRの状態にはある周期がありますが、うまくフィードバック関数を選ぶことでその**周期を「長く」取ることができます**。これを利用し、LFSRは**擬ランダム数の生成**や、**擬ノイズの生成**などに使われます。


## Berlekamp-Massey アルゴリズム に戻ってみる。

> Berlekamp-Massey アルゴリズムは、一番短いLinear feedback shift register (LFSR) を、与えられたバイナリの出力シークエンスから求めるアルゴリズムである。
> また、このアルゴリズムは、体上のlinearly recurrent sequenceを与えられた時に、それのminimal な多項式を見つけることができる。

まず、LFSRを勉強したことによって、１文目は理解できるようになりました。つまり、出てくる**出力シークエンス**（シフト演算シークエンス）が与えられた時に、**どのようなフィードバックを持ったシフトレジスタが組まれているかを求めるアルゴリズム**であると言うことです。

２文目に関しても、**線形で回帰的に得られるシークエンスが与えられた時**に、これらのシークエンスを解にもつ**最小多項式を求めることができる**、と言うことです。
回帰シークエンスに関しては[ウィキペディアに詳細に解説してあります](https://en.m.wikipedia.org/wiki/Recurrence_relation)が、簡単にまとめると、$a_t = W(a_0, a_1, ..., a_{t-1})$　で書かれるようなシークエンスのことです。
また、最小多項式についても解説してあります。[ここ](https://en.m.wikipedia.org/wiki/Minimal_polynomial_(field_theory))


## おわりに
以上、Berlekamp-Massey アルゴリズムの一番最初の定義についてまとめて見ました。
次は具体的にBerlekamp-Massey アルゴリズムの内容について踏み込んでいけたらと思います。
CUDA10.2をUbuntu18.04にインストール





#準備
システムの状態を最新にします。
万一のためLinuxカーネルヘッダーもインストールしておきます。

```bash
$ sudo apt update 
$ sudo apt upgrade
$ sudo apt install linux-headers-$(uname -r)
```

#CUDA 10.2のインストール
###プリインストールされているNVIDIAグラフィックドライバとCUDAのアンインストール
CUDAは他のUbuntuのパッケージのように以前のバージョンから自動でアップグレードできません。
マイナーバージョンの違いも自動でアップグレードされません。
このマイナーバージョンの違いがグラフィックなどのトラブルを引き起こします。
そのため一度NVIDIAのグラフィックドライバとCUDA関係を全てアンインストールします。
設定ファイルも消去します。

- CUDAインストールの際正しいバージョンのNVIDIAグラフィックドライバが入ります。
- この方法以外のインストールでは正しいバージョンのNVIDIAのグラフィックドライバが入らないことがあります。

```
$ sudo apt purge nvidia*
$ sudo apt purge cuda*
$ sudo apt autoremove
$ sudo apt autoclean
$ sudo rm -rf /usr/local/cuda*
```


###CUDAのインストール
```
$ sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
$ echo "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64 /" | sudo tee /etc/apt/sources.list.d/cuda.list
$ sudo apt update 
$ sudo apt -o Dpkg::Options::="--force-overwrite" install cuda-10-2 cuda-drivers
```
NVIDIAドライバを読み込むために、一度Ubuntuを再起動。

```
$ reboot
```

###パスの追加
インストールしたCUDA 10.2に対して`.bashrc`にパスを追加します。
(bashでなく他のshellを使う人は適宜読み替えてください)
その後設定を再読込して適用します。

```
$ echo 'export PATH=/usr/local/cuda-9.2/bin${PATH:+:${PATH}}' >> ~/.bashrc
$ echo 'export LD_LIBRARY_PATH=/usr/local/cuda-9.2/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}' >> ~/.bashrc
$ source ~/.bashrc
$ sudo ldconfig
```

#確認
これでCUDA 10.2が実行できるようになりました。
以下のコマンドでNVIDIAドライバのバージョンとCUDAのバージョンを確認できます。

```
$ nvidia-smi
$ nvcc -V
```
それぞれこのように返ってきたら成功です。
![00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285516/6274986f-beee-cb51-01c3-78658909b935.png)
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285516/1d1b1c75-2595-2863-36a1-7010d38afa08.png)
Atoms Designは？

# 概念
- Atoms Design とは、UI コンポーネントをより組織化することを目的とした方法論です。

# 目的
- 作成したコンポーネントを再活用するために
- 状況に合わせて変更して使いやすいコンポーネント作成のために

# 説明
- ![atomic-design.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541902/83ff93c8-f3a1-666a-8a69-dd9fcdbffcda.png)
- Atoms Design構成要素 
 - Atmos
 - Molecules
 - Organisms
 - Template
 - Pages
- ![atoms.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541902/7d726b1d-25e6-3a85-434a-33dcc37eb89c.jpeg)
 - Atom は主に native hmtl タグが対象となる。 そしてコラムパレットとアニメーションのような抽象的な要素も含まれていてもう分かれない要素である。
- ![molecule.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541902/be6f7d8e-0e8b-13a0-07ff-3b42ec831745.jpeg)
 - Moleculesはatomsのグループであり、それぞれに関連する要素を結合して作成する。
- ![organism2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541902/c62dae77-df24-a627-0f35-2825f72f5b90.jpeg)
 - organismはAtomたちのグループまたはMoleculeそして他のorganismまでも含む概念
- ![template1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541902/1deead54-6015-7d98-f9aa-c7e882461e45.jpeg)
 - TemplatesはPagesらで使われるLayoutを意味
- ![page1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541902/5fbea628-9540-fb55-81a3-0eaea82f3afb.jpeg)
 - ページはテンプレートの特定のインスタンスを意味

# 参考サイト
- http://atomicdesign.bradfrost.com/chapter-2/
技適がとれたラズパイ4が発売されたのでいじってみる

#Raspberry Pi 4 インストール
## Raspberry Pi 4用のインストールメディアを作る
普通は32GBまではFATフォーマット、64GBはexFATでフォーマットするが、NOOBS for Raspberry PiはexFATに対応していない。
そのため、64GB以上のSDXCをFATでフォーマットしてNOOBSで使えるようにするための方法が公式サイトに書いてあります。

https://www.raspberrypi.org/documentation/installation/sdxc_formatting.md

### Windows用
以下のページからguiformat.exeをダウンロードして使用します。
http://www.ridgecrop.demon.co.uk/index.htm?guiformat.htm
![guifomat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/9d6e28fd-ceb7-8bb5-8987-df88e4ab8c1a.png)

[Start]釦を押下して、[Close]釦が有効になったら完了です。

プロパティでFAT32になっていれば成功です。
![guifomat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/e99ef55c-8e5c-0c8b-7e8d-c1805e3ab961.png)

## Raspbianを入手する
簡単に進めたいので以下のURLからNOOBSを選択しZIPファイルをダウンロードします。
https://www.raspberrypi.org/downloads/
![noobs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/ae7f88f8-8db8-05cc-774e-a91bddd1cda3.png)

ダウンロードが出来たら、上記で作成したSDカードに展開します。
![file.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/caa372e1-711b-2355-73c3-aa31ee095dac.png)

## インストール
1. Raspbian Full(RECOMMENDED)を選択し、言語を「日本語」、キーボードを「jp」にしてインストール
2. Set CountryもCountryを「Japan」、Languageを「Japanese」、Timezoneを「Tokyo」で選択
3. Change Passwordでパスワードを設定
4. Set Up Screenは、デフォルトのまま（チェック無し）
5. Select WiFi Networkで自宅のWiFiを選択して、パスワードを設定
6. その後、自動的にUpdate Softwareが始まるのでしばらく待つ
7. System is up to dateのダイアログが出てOKを押すとSetup Completeとなり再起動してインストールは終了！

EV2785に繋いでセットアップしていたので再起動後は4K出力されておりました！
すごいなー。

## sshの設定
/boot/sshという空のフォルダを作成する。

```
pi@raspberrypi:~$ sudo mkdir /boot/ssh
```

「設定」-「Raspberry Piの設定」の「インターフェイス」タブを選び、SSHを有効にする。

再起動

```
pi@raspberrypi:~$ sudo reboot
```

TeraTermなどで接続してみる。

https://ja.osdn.net/projects/ttssh2/

## 現在のバージョンの確認

```
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.19.75-v7l+ #1270 SMP Tue Sep 24 18:51:41 BST 2019 armv7l GNU/Linux
```
VL805の初期ファームウエアは発熱が問題視されているという記事を読んだのでeepromのアップデートが必要かなと思いましたが、確認すると最新版が入っていました。
ひと安心。

```
pi@raspberrypi:~ $ sudo rpi-eeprom-update
BOOTLOADER: up-to-date
CURRENT: 2019年  9月 10日 火曜日 10:41:50 UTC (1568112110)
 LATEST: 2019年  9月 10日 火曜日 10:41:50 UTC (1568112110)
VL805: up-to-date
CURRENT: 000137ab
 LATEST: 000137ab
```
AWS Transfer for SFTP で作ったエンドポイントにsftp すると Connection closedとなる

# 結論

IAMの信頼関係が間違っている可能性が高いです。

IAMでAWS Transfer for SFTP 用に作ったRoleを確認して信頼されたエンティティがtransfer.amazonaws.comになっていることを確認しましょう。

![Role.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51203/b3f6cb62-eb32-d1ff-9a38-406aaa8f4c7d.png)

EC2でRoleとか作ってしまうとここが違うので権限が割りてられなくてConnection Closedになります。

# 気づいた経緯

## SGとか？

Publicで作っていれば、外部からアクセスできる。SGの設定はない。
（VPCの場合どうなるのかよくわかってないです）

## 社内のセキュリティツールが悪さをしている？

EC2インスタンスを立ててそこからsftpしてみたらConnection closedなので関係ない

## SSH鍵がおかしい？

```
 sftp -v -i ~/.ssh/id_rsa sftp-user@sftp-server
```
でセッションを追ってみたところ、

```
debug1: Authentication succeeded (publickey).
```
という記述があるので認証は成功している。
その後
```
Transferred: sent 2900, received 2924 bytes, in 2.3 seconds
Bytes per second: sent 1282.7, received 1293.3
debug1: Exit status 1
Connection closed
```
で異常終了しているので、ログイン後のAWSへのアクセスで問題がありそう。

## IAMの権限がたりない？
Admin権限にしてみたが、やはりConnectionclosed

## AWS Transfer for SFTP のログ

ログ自体が存在しない。。。
あれ？もしかしてまったくIAMの権限が渡ってない？　
あ、もしかして、AWS Transfer for SFTP 用のサービスって存在する？　した、、、すいません、、、EC2で作ってました、という落ちでした。我ながら恥ずかしい。

# 最後に

AWS Transfer for SFTP の良い略称知っている人がいれば教えて下さい。
Zephyr + STM32L476 > SPI > SPI_2定義でwest buildエラーになる。SPI_1では成功する。

```txt:動作環境
ホストOS: Ubuntu 18.04 LTS
ボード: STM32L476 Nucleo-64 (以下、STM32L476)
RTOS: Zephyr 2.1.0-rc1
```

### SPI_2の使用

- [Docs / Latest » Supported Boards » ARM Boards » ST Nucleo L476RG](https://docs.zephyrproject.org/latest/boards/arm/nucleo_l476rg/doc/index.html)

SPIの定義は[こちら](https://docs.zephyrproject.org/latest/boards/arm/nucleo_l476rg/doc/index.html#default-zephyr-peripheral-mapping)にSPI_1, SPI_2, SPI_3の定義がある。

### west build時にエラー

SPI接続のSRAMをSTM32L476から使用しようとしていた。

```
$ west build -p auto -b nucleo_l476rg samples/drivers/wrk_23K256SRAM_191128/
```

下記のようなエラーが出る。

```
zephyr/include/generated/generated_dts_board_fixups.h:201:24: error: 'DT_ST_STM32_SPI_FIFO_40003800_IRQ_0' undeclared (first use in this function); did you mean 'DT_ST_STM32_SPI_FIFO_40013000_IRQ_0'?
 #define DT_SPI_2_IRQ   DT_ST_STM32_SPI_FIFO_40003800_IRQ_0
                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
```

その他、SPI_2関連のエラーが複数でる。

### prj.conf

prj.confは以下のようにしていた。

```
CONFIG_STDOUT_CONSOLE=y
CONFIG_FLASH=y
CONFIG_SPI=y
#CONFIG_SPI_1=y
CONFIG_SPI_2=y
#CONFIG_SPI_ASYNC=y
```

CONFIG_SPI_2をやめてCONFIG_SPI_1でに変更後、west buildすると問題なくビルドできた。
SPI_2の定義がうまくいっていないようだ。