OmniAICreator/Qiita-1.07M huggingface dataset:
魔法JS☆あれい 第1話「popでpushした、ような……」

登場人物

丹生（にゅう）あれい
魔法少女「魔法（マジカル）JS（女子小学生）☆あれい」として活動中。

イテレー太
正体不明の魔法生物。

目次

第1部「ミューテーター・メソッド編」
* 第1話「popでpushした、ような……」
* [第2話「shiftはとってもunshiftって」](https://qiita.com/8amjp/items/3fc1b2defd28ba1c2df3)
* [第3話「もうsortもreverseも怖くない」](https://qiita.com/8amjp/items/86f5294981fbebd3fe2d)
* [第4話「fillも、spliceも、copyWithinもあるんだよ」](https://qiita.com/8amjp/items/0741e35b70ea32711265)

第2部「アクセサ・メソッド編」
* [第5話「joinなんて、concatなわけない」](https://qiita.com/8amjp/items/229c41ad2146728abd89)
* [第6話「indexOfなの絶対lastIndexOf」](https://qiita.com/8amjp/items/f7e421722e419c1c0a7d)
* [第7話「includesのsliceと向き合えますか？」](https://qiita.com/8amjp/items/007ac192399225db3843)

第3部「イテレーション・メソッド編」
* [第8話「filterって、ほんとfindとfindIndex」](https://qiita.com/8amjp/items/f7014b09c5c2a6440a74)
* [第9話「someなの、everyが許さない」](https://qiita.com/8amjp/items/ec91d29f8f166b45efbb)
* [第10話「もうmapにもforEachにも頼らない」](https://qiita.com/8amjp/items/25859c085119cdceed89)
* [第11話「最後に残ったreduceとreduceRight」](https://qiita.com/8amjp/items/c3f58868fd773e1d2da2)
* [最終話「flatの、最高のflatMap」](https://qiita.com/8amjp/items/219ea5e1b7ebb7252cf6)

## pop()

イテレー太「あれい、すべての前置きを端折るけど、今戦闘の真っ最中だよ！」
あれい「楽してんじゃねえよこの駄犬が」
イ「犬じゃなくてイテレータ型魔法生物だよ！　そして敵を倒すにはあれいの配列魔法が必要なんだ！」
あ「人の話を聞けこの雑種」
イ「僕が魔法世界から召喚したデータを、あれいの配列魔法を使って、敵の弱点に合わせた値に変換して`return`する事で、ダメージを与えることができるんだ！」
あ「なら最初からまともなデータを用意しろよポンコツ」
イ「さて、今回僕が召喚したデータは……これだよ！」

```js
items = ['羽二重餅', '水ようかん', '梅月せんべい'];
```

あ「……それ、全部福井の銘菓じゃねえか。相変わらず福井県民丸出しだな」
イ「そして、今回の敵の弱点は、『配列の最後の要素』だよ！　さあ、配列の最後の要素を`return`してぶつけるんだ！」
あ「だから最後の要素だけ召喚しろっつってんだろこのボロ雑巾」
イ「頼んだよ！　あれい！」
あ「面倒くせえなあ……」

```js
return items.pop();
```

イ「おおっ！　やったよ、あれい！　梅月せんべいが炸裂したよ！　梅月せんべいで敵をやっつけたよ！」
あ「お前ちょっと黙ってろ」

### 解説

`pop()` メソッドは、配列を操作するメソッドの中でも最も基本的なものです。
[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/pop)によると……

> `pop()` メソッドは、配列から最後の要素を取り除き、その要素を返します。このメソッドは配列の長さを変化させます。

つまり、積み重ねられたカードから、一番上に乗っているカードを1枚取って、そのカードを相手に返すようなイメージです。配列というスタック構造のデータの操作としては、最も直感的にわかりやすい動きですね。

## push()

イ「おっと、次の敵が出てきたよ！」
あ「どうなってるんだこの街は」
イ「さて、僕が魔法世界から召喚したデータは、今こんな状態になっているよ！」

```js
items = ['羽二重餅', '水ようかん'];
```

あ「そうだな」
イ「そして、新たに魔法世界から召喚したデータは、これだ！」

```js
newItem = '五月ヶ瀬';
```

イ「このデータを、元の配列の最後に追加した上で、その最後の要素を敵にぶつけるんだ！」
あ「……それこそ直接ぶつけりゃいいじゃねえか。バカなのかお前は」
イ「いいから！　急いで、あれい！」
あ「面倒くせえなあ……」

```js
return items.push(newItem);
```

あ「……おい、効いてないぞ」
イ「わははは、引っかかったね！　`push()`メソッドの戻り値は、配列の要素の数なんだよ！」
あ「お前どっちの味方なんだよ」

### 解説

`push()` メソッドも、最も基本的な操作の一つですね。
またまた[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/push)によると……

> `push()` メソッドは、配列の末尾に 1 つ以上の要素を追加することができます。また戻り値として新しい配列の要素数を返します。

つまり、積み重ねられたカードの上に、さらにカードを乗せるようなイメージです。これも直感的にわかりやすい動きですね。
また、このメソッドの戻り値は、配列の要素の数です。例えば、空の配列に1つの要素を`push()`した場合、戻り値は1になります。

----
イ「さて、ピンチだよ！　どうする、あれい！」

```js
return items[items.push(newItem)-1];
```

あ「これでいいのか」
イ「あ、うん……攻撃できたね」
あ「だからどっちの味方なんだよ」

```js
return items.slice(0, items.push(newItem)).pop();
```

あ「これでもいいのか」
イ「あ、`slice()`とかはもっと後の話で出てくるからまだやめて……」

## 次回予告

shiftは、配列から最初の要素をなんでも一つ取り除いてあげる。
なんだって構わない。どんな要素だって取り除いてあげられるよ。

[第2話 shiftはとってもunshiftって](https://qiita.com/8amjp/items/3fc1b2defd28ba1c2df3)
VBAの感嘆符演算子

#概要
AccessVBAのサンプルコードで「Me!TextBox」のように「.」ではなく「!」で繋げているものがあって気になったので調べると感嘆符演算子というものらしい。
(自動翻訳が半端でMSのページではよくわからない名前になってるが感嘆符演算子でいいはず)
参考：[MSのリファレンス](https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/program-structure/special-characters-in-code)

##例と謎
```visualbasic:UserForm1.frm
Private Sub TextBox1_Change()
    Debug.Print TextBox1.Value, "Meを省略して使う場合"
    Debug.Print Me.TextBox1.Value, "Meを入れた使い方"
    Debug.Print Me!TextBox1.Value, "Meと感嘆符を使う場合"
    Debug.Print Me("TextBox1").Value, "Meから直にTextBox1を文字列で指定する場合"
    Debug.Print Me.Controls!TextBox1.Value, "Controlsから感嘆符を使う"
    Debug.Print Me.Controls("TextBox1").Value, "ControlsのItemを省略する"
    Debug.Print Me.Controls.Item("TextBox1").Value, "Itemも省略せずに使う"
End Sub
```

説明によると文字を引数として受け取るデフォルトプロパティにリテラルを直に渡して呼び出せるものらしい。
上記のフォームのTextBox1のValueを呼び出す処理は全部正しく動作する。
上の3つはValueの上でCtrl+Jを押すと候補が出てくるが、4番目以降の方法では候補が出ない。
これはどれもControls.Item("TextBox1")の省略形で、Controls.Itemの戻り値はObject型なので候補が出ないのは分かる。
謎なのは3番目だ。
「Me!TextBox1」は「Me.Controls.Item("TextBox1")」と等価だと思うのだが、なぜか前者だけ候補が出てくる。
感嘆符演算子でアクセスしても型による候補が有効になるのは知る限りフォーム特有の動きなので、なにか特殊な処理があるのかそれこそがディクショナリアクセスというものの性質なのか……。

##使い方
```visualbasic:ADODB.bas
Dim Recordset As ADODB.Recordset
Set Recordset = New ADODB.Recordset
Dim Connection As ADODB.Connection
Set Connection = New ADODB.Connection
Connection.Open "いろいろ"
Recordset.Open "SQL", Connection
With Recordset
    Do Until .EOF
        Debug.Print !名前.Value, !番号.Value, ![空白も 行ける].Value
    Loop
End With
```
ADODBを使った例でRecordsetに対して感嘆符演算子でアクセスしているものをたまに見る。
これはRecordset.Fields.Item("名前").Valueと同じ挙動をする。
データベースのフィールド名は常に固定なので処理によってはこれで十分動く。
ただしアルファベットを使ったフィールド名の場合はVBEでは大文字と小文字が新しく宣言された変数名等によって変わることがあるのでそこで意図しない動きをすることがあるかもしれない。
そのまま使えない文字列については「[]」で囲うことで指定できる。

###他の使い方
```visualbasic:Dictionary.bas
'渡す側
Dim Dic As Scripting.Dictionary
Set Dic = New Scripting.Dictionary
With Dic
    !Name = ThisWorkbook.Name
    !FullPath = ThisWorkbook.FullName
    Set !Book = ThisWorkbook
    Set !Dic = New Scripting.Dictionary
    With !Dic
        !Nest = "入れ子もできる"
    End With
End With
'受け取り側
With Dic
    Name = !Name
    FullPath = !FullPath
    Set Book = !Book
    Nest = !Dic!Nest
End With
```
変な使い方としてはDictionaryで使う。
Dictionaryは存在しないキーを指定して値を設定すると新規キーとしてその値を登録できる。
汎用インタフェースを使って引数を渡す場合に使うとParamArrayと違って役割が明確になる。
すべてVariant型になるのはParamArrayと同じだが、毎回渡すためだけにDictionaryを作る必要があるのでそこだけは手間。
[Mockito] 3.2.4 → 3.3.xにアップデートしたら（イケテナイところが）エラーになった件

Mockito 3.2.4から3.3.x(3.3.3)にアップデートしたら・・・スタブを設定しているコードが冗長？だったことが原因でエラーになってしまいました。

# どんなコードだったの？

こんなコードでした。

```java
when(rs.getInt("column")).thenReturn(100);		
assertEquals(Integer.valueOf(100), TYPE_HANDLER.getResult(rs, "column"));
		
when(rs.getInt("column")).thenReturn(0);
assertEquals(Integer.valueOf(0), TYPE_HANDLER.getResult(rs, "column"));
```

# どんなエラーになったの？

こんなエラーです。

```
org.mockito.exceptions.misusing.UnnecessaryStubbingException: 
Unnecessary stubbings detected.
Clean & maintainable test code requires zero unnecessary code.
There are 1 unnecessary stubbing (click to navigate to relevant line of code):
  1. -> at org.apache.ibatis.type.YearTypeHandlerTest.shouldGetResultFromResultSetByName(YearTypeHandlerTest.java:44)
Please remove unnecessary stubbings or use 'lenient' strictness. More info: javadoc for UnnecessaryStubbingException class.
```

# 何がイケテナイの？

どうやら・・・`thenReturn` のところがイケテナイようで、以下のようにしたらエラーがなくなりました。

```java
when(rs.getInt("column")).thenReturn(100, 0); // 一箇所に集約！！
assertEquals(Integer.valueOf(100), TYPE_HANDLER.getResult(rs, "column"));
assertEquals(Integer.valueOf(0), TYPE_HANDLER.getResult(rs, "column"));
```

まーね・・・という感じです。

# コードを直さないとダメなの？

明確な意図がない場合は基本的にはコードを直した方がよいと思いますが、エラーメッセージにも記載があるように「lenient」モードにすることでこのエラーを抑止することができます。以下に、抑止する方法をいくつか紹介します。

> **NOTE:**
>
> ざっと調べた範囲で見つけた抑止方法なので、他にももっとよい方法があるかもしれません！！

## `@Mock` の `lenient` 属性の利用

アノテーションを利用してモックオブジェクトを生成している場合、アノテーションの属性指定で抑止可能です。

```java
// @Mock
@Mock(lenient = true)
protected ResultSet rs;
```

## `MockSettings#lenient()` の利用

`Mockito#mock` メソッドを利用してモックオブジェクトを生成している場合は、メソッドのオプション指定で抑止可能です。

```java
// ResultSet rs = mock(ResultSet.class);
ResultSet rs = mock(ResultSet.class, withSettings().lenient());
when(rs.getInt("column")).thenReturn(INSTANT.getValue());
assertEquals(INSTANT, TYPE_HANDLER.getResult(rs, "column"));
when(rs.getInt("column")).thenReturn(0);
assertEquals(Year.of(0), TYPE_HANDLER.getResult(rs, "column"));
```

## `Mockito.lenient()` の利用

`Mockito.lenient()` を使用して抑止することもできますが、この方法で抑止するくらいなら、ちゃんと直しちゃった方がよいでしょう。

```java
// when(rs.getInt("column")).thenReturn(100);
lenient().when(rs.getInt("column")).thenReturn(100);
// ...
```

## JUnit 5編： `@MockitoSettings` の `strictness` 属性の利用

JUnit 5(`MockitoExtension`)を利用している場合は、`@MockitoSettings` アノテーションの属性指定で抑止可能です。
この設定は、`Mockito#mock` メソッドを使用している部分にも適用されるみたいです。

```java
@MockitoSettings(strictness = Strictness.LENIENT) // これを追加
@ExtendWith(MockitoExtension.class)
abstract class BaseTypeHandlerTest {
  // ...
  @Mock
  protected PreparedStatement ps;
  // ...
}
```

> **NOTE:**
>
> 本エントリでは触れませんが、JUnit 4でも同様のオプションが用意されているみたいです。

# まとめ

Mickitoは単体テストの前提を整えるのに非常に便利なライブラリですが、それらのコードをクリーンな状態を保たないと後から見た時に「これ何やってるんだっけ？」みたいな状態になりがちなので・・・こういったチェック機構はありがたいですね（直し方がわからない時がたまにありますが・・・:sweat_smile:）。
ただ・・・ライブラリのレポート内容が絶対的に正しいとは限らないので、レポート内容とコードを見極めたうえで、必要に応じて「lenient」モードの利用も検討するとよいと思います。
Atcorder153 A~C問題

Atcorder153
https://atcoder.jp/contests/abc153/tasks

#A問題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/641eb611-ab65-f3de-f616-79c2ce377f5b.png)

```A問題.c++
#include <bits/stdc++.h>
#define rep(i,n) for (int i=0; i<(n); i++)
using namespace std;
typedef long long ll;
typedef pair<int,int> P;

int main(){
    int H,A; cin >> H >> A;
    int ans=H/A;
    if (H%A!=0) ans++;
    cout << ans << endl;
}
```

#B問題

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/efbae787-90aa-6939-8224-d1d487294dcb.png)

```B問題.c++
#include <bits/stdc++.h>
#define rep(i,n) for (int i=0; i<(n); i++)
using namespace std;
typedef long long ll;
typedef pair<int,int> P;

int main(){
    int H,N; cin >> H >> N;
    vector <int> A(N);
    int sum=0;
    rep(i,N){
        cin >> A[i];
        sum+=A[i];
    } 
    
    if (sum>=H) cout << "Yes" << endl;
    else cout << "No" << endl;
}
```

#C問題

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/943fc55f-71b0-7f0f-c719-f4e1012e4d0d.png)

```C問題.c++
#include <bits/stdc++.h>
#define rep(i,n) for (int i=0; i<(n); i++)
using namespace std;
typedef long long ll;
typedef pair<int,int> P;

int main(){
    int N,K; cin >> N >> K;
    vector <int> H(N);
    rep(i,N) cin >> H[i];
    
    ll ans=0;
    sort(H.begin(),H.end());
    rep(i,N-K) ans+=H[i];
    
    cout << ans << endl;
    return 0;
}
```
Atcorder153 A~D問題

Atcorder153
https://atcoder.jp/contests/abc153/tasks

#A問題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/641eb611-ab65-f3de-f616-79c2ce377f5b.png)

```A問題.c++
#include <bits/stdc++.h>
#define rep(i,n) for (int i=0; i<(n); i++)
using namespace std;
typedef long long ll;
typedef pair<int,int> P;

int main(){
    int H,A; cin >> H >> A;
    int ans=H/A;
    if (H%A!=0) ans++;
    cout << ans << endl;
}
```

#B問題

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/efbae787-90aa-6939-8224-d1d487294dcb.png)

```B問題.c++
#include <bits/stdc++.h>
#define rep(i,n) for (int i=0; i<(n); i++)
using namespace std;
typedef long long ll;
typedef pair<int,int> P;

int main(){
    int H,N; cin >> H >> N;
    vector <int> A(N);
    int sum=0;
    rep(i,N){
        cin >> A[i];
        sum+=A[i];
    } 
    
    if (sum>=H) cout << "Yes" << endl;
    else cout << "No" << endl;
}
```

#C問題

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/943fc55f-71b0-7f0f-c719-f4e1012e4d0d.png)

```C問題.c++
#include <bits/stdc++.h>
#define rep(i,n) for (int i=0; i<(n); i++)
using namespace std;
typedef long long ll;
typedef pair<int,int> P;

int main(){
    int N,K; cin >> N >> K;
    vector <int> H(N);
    rep(i,N) cin >> H[i];
    
    ll ans=0;
    sort(H.begin(),H.end());
    rep(i,N-K) ans+=H[i];
    
    cout << ans << endl;
    return 0;
}
```

#D問題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/bed23020-e9f4-86b2-60e6-e97b3f3cd5bd.png)

```D問題.c++
#include <bits/stdc++.h>
#define rep(i,n) for (int i=0; i<(n); i++)
using namespace std;
typedef long long ll;
typedef pair<int,int> P;

int main(){
    ll H; cin >> H;
    ll tmp=0;
    while(1){
        if (pow(2,tmp)<=H && H<pow(2,tmp+1)) break;
        tmp++;
    }
    
    ll ans=0;
    for (int i=0; i<=tmp; i++) ans+=pow(2,i);
    
    cout << ans << endl;
    return 0;
}
```

#まとめ
・D問題 何個か実験してみて**法則性**を見つける！
GitHubActionsのformat関数を使えばhashFilesの引数にenvを渡せる

# はじめに

GitHubActionsのformat関数を使えばhashFilesの引数にEnvを渡せることを知ったので，その紹介です

# 結論

`format` 関数を使う

```yaml
key: ${{ runner.os }}-cargo-registry-${{hashFiles(format('{0}/Cargo.lock', env.WORKING_DIRECTORY))}}
```

# 背景

GitHubActionsでキャッシュを使う際，.lockファイルをハッシュ化しそれをキー値として利用します

```yaml
# https://github.com/actions/cache/blob/master/examples.md#rust---cargo
- name: Cache cargo registry
  uses: actions/cache@v1
  with:
    path: ~/.cargo/registry
    key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}
- name: Cache cargo index
  uses: actions/cache@v1
  with:
    path: ~/.cargo/git
    key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }}
- name: Cache cargo build
  uses: actions/cache@v1
  with:
    path: target
    key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }}
```

このときに下記のようにhashFilesに渡す引数のlockファイルに，特定のサブディレクトリ上のものを指定したい
できれば特定のアプリに依存する処理をあちこちに書かずにこれを実現したい
下記を使えば前者は実現できるのですが，ディレクトリ名を変更した際にステップすべてを書き換える必要があるのでなるべくやりたくなかった


```yaml
- name: Cache cargo build
  uses: actions/cache@v1
  with:
    path: target
    # subappに依存している
    key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/subapp/Cargo.lock') }}
```


## 調査
まっさきに思いついた方法はyamlのアンカーだったがGitHubActionsはアンカーに対応していない...
すこし調べてみるとどうやらenv変数はステップの中で使えるらしい

```yaml
    # https://github.community/t5/GitHub-Actions/use-working-directory-for-entire-job/td-p/36759
    env:
      WORKING_DIRECTORY: "subapp"
    steps:
    - name: dir
      run: ls -R
      # ちなみにですがworking-directory keyは`uses`の場合使えない..
      working-directory: ${{env.WORKING_DIRECTORY}}
```

これをそのまま使ってみる

```yaml
        # ダメだったやつ
        key: ${{ runner.os }}-cargo-registry-${{hashFiles(env.WORKING_DIRECTORY/'Cargo.lock')}}
        # ダメだったやつ
        key: ${{ runner.os }}-cargo-registry-${{hashFiles({{env.WORKING_DIRECTORY}}/'Cargo.lock')}}
```

結果Unexpected symbolに遭遇
なんかないかなーとGitHubActionsのドキュメント読んでると，[format関数](https://help.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#format)があることを知る

> `format( string, replaceValue0, replaceValue1, ..., replaceValueN)`
> Replaces values in the string, with the variable replaceValueN. Variables in the string are specified using the {N} syntax, where N is an integer. You must specify at least one replaceValue and string. There is no maximum for the number of variables (replaceValueN) you can use. Escape curly braces using double braces.

ドキュメント上にはenvを使った例はなかったですが，envの値を試してみる

```yaml
key: ${{ runner.os }}-cargo-registry-${{hashFiles(format('{0}/Cargo.lock', env.WORKING_DIRECTORY))}}
```

結果エラーもなく，無事通過！やりたかったことを実現できた
最終的には下記のような感じになります
`WORKING_DIRECTORY` の値を変更するだけで各ステップの値を変更することができ満足

```yaml
    env:
      WORKING_DIRECTORY: "subapp"
    steps:
    - uses: actions/checkout@v2
    - uses: actions/cache@v1
      with:
        path: ~/.cargo/registry
        key: ${{ runner.os }}-cargo-registry-${{hashFiles(format('{0}/Cargo.lock', env.WORKING_DIRECTORY))}}
    - uses: actions/cache@v1
      with:
        path: ~/.cargo/git
        key: ${{ runner.os }}-cargo-index-${{hashFiles(format('{0}/Cargo.lock', env.WORKING_DIRECTORY))}}
```
僕のHTML

自分用のメモ

##基本の形

```html
<!DOCTYPE html><!--html5であることを規定-->
<html lang="ja"><!--日本語を使用-->
<head>
    <meta charset="utf-8">
    <title>TITLE</title>
</head>
<body>
</body>
</html>
```

##headタグ
####スマホに対応させる

`<meta name="viewport" content="width=device-width,user-scalable=yes,initial-scale=1.0">
`
・幅をデバイスのサイズに合わる。
・`user-scalable`:ユーザーが画面サイズを調整できる機能。
・`initial-scale`:初期サイズ。

####ショートカットアイコン
```html

<link rel="shortcut icon" href='path'>
```

####iPhone用タッチアイコン
```html

<link rel="apple-touch-icon" href='path'>
```

####CSSファイルの読み込み
```html

<link rel="stylesheet" href='path'>
```

##bodyタグ
####bodyタグに書くタグ
`<header></header>`
`<main></main>`
`<footer></footer>`
`<h1></h1>`
`<h2></h2>`
`<h3></h3>`
`<h4></h4>`
`<h5></h5>`
`<a href='url'></a>`:リンク
`<section></section>`:一文
`<div></div>`:cssとかのための区切り
`<span></span>`:cssとかのための区切り
`<br>`:改行
`<ul></ul>`:
`<li></li>`:リストの項目
`<nav></nav>`:ナビゲーション
`<p></p>`:段落
`<small></small>`:細目・注釈を現す
'&copy;`:©

####リンク
`<a href='url'></a>`リンクへのURL
`<a href='img'></a>`このhtmlファイルのあるフォルダからのパス

####画像の表示
`<img src='画像のパス' alt='alt'>`
altには画像が表示されなかった時の代替メッセージ

####リスト
```html

<ul>
    <li>リストの項目1</li>
    <li>リストの項目2</li>
</ul>
```

####表
```html

 <table border="1">
    <tr>            <!--trタブは1行を定義する-->
      <th>名前</th> <!--thは項目名-->
      <th>性別</th>
    </tr>
    <tr>
      <td>鈴木</td> <!--tdは内容-->
      <td>男</td>
    </tr>
    <tr>
      <td>川崎</td>
      <td>女</td>
    </tr>
  </table>
```


####入力項目
```html
<!--テキストボックス-->
<input type="text" name="text">

<!--password-->
<input type="password" name="password">

<!--ラジオボタン-->
<input type="radio" name="radio" value="radio1">
<input type="radio" name="radio" value="radio2">
<input type="radio" name="radio" value="radio3">

<!--チェックボックス-->
<input type="checkbox" name="checkbox" value="check1">
<input type="checkbox" name="checkbox" value="check2">
<input type="checkbox" name="checkbox" value="check3">

<!--ファイル-->
<input type="file" name="file">

<!--テキストエリア-->
<textarea name="textarea" rows="4" cols="40">
    <!--row:行数-->
    <!--cols:行幅-->

<!--セレクトボックス-->
<select name="select-box" size="3"><!--size属性は初期表示される選択肢の数を規定-->
    <option value="1">選択肢1</option>
    <option value="2">選択肢2</option>
    <option value="3">選択肢3</option>
</select>

```
Alfred Workflowsで入力文字列からリストを作るRubyスクリプトの雛形

Alfred Workflowsは便利なんだけど、いざ自分で作ろうとしたとき「動的にリストを作って表示したい」と思った最初の一歩だけでもちょっとめんどくさかったので雛形を作りました。

Alfred Workflowsって何？ という人はこちらの記事をどうぞ。
https://qiita.com/jackchuka/items/ccd3f66f6dd00481b98b#workflows

## 実現したいこと

ヘルパーライブラリとしてはPython製の https://www.deanishe.net/alfred-workflow/ とかが見つかります。が、そこまで大層なものは別に欲しくない。

とりあえず改造しやすい最小限のコードで、以下の画像のような感じの入力と出力が欲しい。
あとリスト項目を選択したら、なんかクリップボードに項目がコピーされると嬉しい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34405/00198fc7-717d-7f74-27e0-689677ecad8f.png)

## コード

```ruby
def item(q)
    {:title => q, :subtitle => "サブタイトル", :arg => "#{q}ですよ" }
end

queries = ARGV[0].split
items = queries.map do |q| item(q) end

puts "<items>"
items.each_with_index do |item, i| puts <<EOS
  <item uid="#{i}" arg="#{item[:arg]}">
    <title>#{item[:title]}</title>
    <subtitle>#{item[:subtitle]}</subtitle>
    <icon>icon.png</icon>
  </item>
EOS
end
puts "</items>"
```

## 使い方

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34405/aee1038c-2c97-3d09-672e-33cd3babec48.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34405/44f97385-0ea9-be9a-c09a-f08107266faf.png)

`Script Filter` の言語をRubyにしてベタ書きで書いてもいいし、あるいは `Script Filter` で bashとかを選んで `ruby hoge.rb "{query}"` とか書いてもいい。

以上です。
一家に一枚 FF の表

```
    2  3  4  5  6  7  8  9  a  b  c  d  e  f
 1  ----------------------------------------
2|  4  6  8  a  c  e 10 12 14 16 18 1a 1c 1e
3|  6  9  c  f 12 15 18 1b 1e 21 24 27 2a 2d
4|  8  c 10 14 18 1c 20 24 28 2c 30 34 38 3c
5|  a  f 14 19 1e 23 28 2d 32 37 3c 41 46 4b
6|  c 12 18 1e 24 2a 30 36 3c 42 48 4e 54 5a
7|  e 15 1c 23 2a 31 38 3f 46 4d 54 5b 62 69
8| 10 18 20 28 30 38 40 48 50 58 60 68 70 78
9| 12 1b 24 2d 36 3f 48 51 5a 63 6c 75 7e 87
a| 14 1e 28 32 3c 46 50 5a 64 6e 78 82 8c 96
b| 16 21 2c 37 42 4d 58 63 6e 79 84 8f 9a a5
c| 18 24 30 3c 48 54 60 6c 78 84 90 9c a8 b4
d| 1a 27 34 41 4e 5b 68 75 82 8f 9c a9 b6 c3
e| 1c 2a 38 46 54 62 70 7e 8c 9a a8 b6 c4 d2
f| 1e 2d 3c 4b 5a 69 78 87 96 a5 b4 c3 d2 e1
````

## 2 の段は覚えよう！

## f の段は1の位と10の位の数字の和が f になるから覚えやすい。
f × f = e1
e + 1 = f

## 8 の段も覚えられそう。

## 1 × 1 から f × f への並びは覚えておくと楽しいことがあるかも。
1の位
　149094101490941
10の位
　000112345679ace



## ちなみにプログラム

```ff.js
const psw = _ => process.stdout.write( _ )
psw( ' 1' )
for ( let r = 2; r < 16; r++ ) psw( '  ' + r.toString( 16 ) )
psw( '\n' )
psw( ' 1  ----------------------------------------\n' )

for ( let l = 2; l < 16; l++ ) {
	psw( l.toString( 16 ) + '|' )
	for ( let r = 2; r < 16; r++ ) {
		let _ = '  ' + ( l * r ).toString( 16 )
		psw( _.slice( _.length - 3 ) )
	}
	psw( '\n' )
}
```

```sh
$ node ff.js
```
matlab でCSSEGISandData/COVID-19のデータの取り出し方を自習してみた

# CSSEGISandData/COVID-19 データ
matlab でのデータの読み込みの練習がてら、GitHub にあったので、time_series を読み込んでみた。テーブルをアレイにしたり、数字についたシングルクォーテーションの取り扱いを少し学べたと思う。

```matlab:coviddata.m
clear
confirmed=readtable('csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Confirmed.csv');
deaths=readtable('csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Deaths.csv');
recovered=readtable('csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Recovered.csv');
c=table2array(confirmed);
d=table2array(deaths);
r=table2array(recovered);
countries = {'Japan','Cruise Ship','Italy','Iran','Hubei'}
n=size(c,2);
figure(1);clf
for a = 1:5
[i j]=find(string(c)==countries{a}); % this is also ok---%[i j]=find(strcmp(c,'Japan'));
cc=c(i,5:n);
dd=d(i,5:n);
rr=r(i,5:n);

for k = 1:n-4
    ccc(k)=str2num(cell2mat(cc(k)))
    ddd(k)=str2num(cell2mat(dd(k)))
    rrr(k)=str2num(cell2mat(rr(k)))
end
ptnum=ccc-ddd-rrr;
subplot(2,3,a)
plot(ccc,'b');
hold on
plot(ddd,'r')
plot(rrr,'g')
plot(ptnum,'c')
title(countries{a})
xticklabels(c(1,5:10:n))
end
legend('confirmed','deaths','recovered','current patients')
```
# 3月14日のグラフ
![corvit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237763/b5c69959-16c9-edb4-d112-baa782b47b21.png)
prefixのついたk8sのpodをまとめて削除する【小ネタ】

## 概要

k8sでprefixがついたpodをまとめて削除したい。そんなニーズ、ありませんか？
私はありました。kubernetesの仕様には、prefix指定で消す仕様はなかったと思います。（2020/03/14時点）


以下は、argo workflowをテストした結果作られたpodたちです。


```bash
$ kubectl get pod -n argo
NAME                                  READY   STATUS      RESTARTS   AGE
argo-ui-7996bddf44-sp8hf              1/1     Running     0          27h
dag-diamond-7wpjr-1361844291          0/2     Completed   0          26h
dag-diamond-7wpjr-1395399529          0/2     Completed   0          26h
dag-diamond-7wpjr-1428954767          0/2     Completed   0          26h
dag-diamond-7wpjr-258766428           0/2     Completed   0          26h
dag-diamond-7wpjr-309099285           0/2     Completed   0          26h
dag-diamond-7wpjr-510724903           0/2     Completed   0          26h
dag-diamond-7wpjr-527502522           0/2     Completed   0          26h
workflow-controller-646446bcf-jp6xq   1/1     Running     0          27h
```

argo workflowで作成されるpodは、生成の過程でprefixをつけることが出来ます。
`dag-diamond-`が今回付けたprefixです。

もちろん1つずつ削除するのも良いんですが正直今後もやるとなるとキリがないです。

探してもなかったので、既存のコマンドを組み合わせました。

## いざ、実食

```bash
$ kubectl get pod -n argo |awk '/dag-diamond-*/{print $1}' |xargs kubectl delete pod -n argo

pod "dag-diamond-7wpjr-1361844291" deleted
pod "dag-diamond-7wpjr-1395399529" deleted
pod "dag-diamond-7wpjr-1428954767" deleted
pod "dag-diamond-7wpjr-258766428" deleted
pod "dag-diamond-7wpjr-309099285" deleted
pod "dag-diamond-7wpjr-510724903" deleted
pod "dag-diamond-7wpjr-527502522" deleted
```

分解すると

```bash
# namespace名 argo内のpodの一覧取得
$ kubectl get pod -n argo

# dag-diamond- から始まるpodの一覧取得
$ awk '/dag-diamond-*/{print $1}'

# namespace名 argo内のpodを削除
$ xargs kubectl delete -n argo pod
```

結果を見てみましょう。

```
$ kubectl get pod -n argo
NAME                                  READY   STATUS      RESTARTS   AGE
argo-ui-7996bddf44-sp8hf              1/1     Running     0          27h
workflow-controller-646446bcf-jp6xq   1/1     Running     0          27h
```

yes！


## 最後に

ほとんど[この記事](https://medium.com/faun/delete-kubernetes-pods-with-a-regex-f396291bba0e)を参考にしました。
【初心者】railsでのエラーの読み取り方【今日のエラー】

#エラー画面の読み取り方

今日はNoMethodErrorでひたすら詰まってました...

<img width="1071" alt="ダウンロード.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593736/97d05fab-a805-0044-fd8a-6dad16e175c3.png">


`nil:Nilclass`の部分で、エラーが起きた場所より前でデータがセットされていないのは読み取れましたがどこが間違っているかわからない！！

と思ったら一行上の
`@message = Task.find(params[:id]の@messageを@task` という風にupdateメソッドの主語を共通にし忘れていました...
ここで２時間くらい詰まってたのでもっと良いデバッグ方法やググり方を身に付けたいと思います。

##メッセージボードのフラッシュメッセージの疑問

メッセージボードを作っているときにふと疑問に思いました。

```flash_message.rb
<% flash.each do |message_type, message| %>

  <div>
<%= message %>
</div>
<% end %>
```

なぜこの部分だけ、変数を変える必要がないのかと。

簡単にまとめると、ブロック変数を使っているから。
`配列.each  do |  ブロック変数 |
  この中で使える変数をブロック変数
end`
なるほど、わからんｗ　
メソッド呼び出しの際に引数と一緒に渡すことができる処理らしい笑
またあとで調べてみます。

###参考文献
[Rubyブロックについて学ぶ](https://qiita.com/naotospace/items/3bbef4015c4390182915)
[Ruby on Rails]trueだとvalidation通るのにfalseだとvalidation通らない

フロントエンジニアです
apiのつなぎこみしていて、ハマったので書きます。

### 結論

boolean型の存在確認に`presence: true`を使うと、
trueだとvalidation通り、falseはvalidionが通らない。

### 具体例

こんな感じのTaskテーブルがあって、

```
create_table "tasks", force: :cascade do |t|
  t.string "name", null: false
  t.boolean "is_finished", null: false
  t.datetime "created_at", precision: 6, null: false
  t.datetime "updated_at", precision: 6, null: false
end
```

こんな感じに`is_finished`カラムに`presence: true`をかけているとします。

```
class Task < ApplicationRecord
  validates :is_finished, presence: true
end
```

こんなサンプルデータがあって、`is_finished`をfalseにしてsaveしようとするとエラリます。
<img width="858" alt="スクリーンショット 2020-03-14 19.53.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151354/4620a773-88a3-6966-ad53-763cf696a130.png">

### 解説

どうやらpresenceは、内部的に`blank?`メソッドを呼び出しているぽいです。
[公式railsのここ](https://github.com/rails/rails/blob/9895d67d6d4d15d0aa1fb0620f4eab97c78b09b9/activemodel/lib/active_model/validations/presence.rb#L7)を見てます。間違ってたらごめんなさい。

で、`blank?`についてですが、[Railsガイド](https://railsguides.jp/active_support_core_extensions.html#%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%BD)によると、falseはblankと見なされると。

なので、falseだと`blank?`で引っかかって、エラっていたわけですね。

### 解決
`prsence: true`の代わりに`inclusion: { in: [true, false] }`を使えば期待通りの挙動になります

### まとめ
trueだと通って、falseだと通らない時、validationを確認する。
`presence`が使われていたら、`inclusion: { in: [true, false] }`を代わりに試してみる


以上です。
読んでいただき、ありがとうございます。
Nuxt.jsとvue2-smooth-scrollでスムーススクロールする

Nuxt.jsでスムーススクロールします。

# 前提条件
- Nuxt.jsとPugがインストールされていること

# インストール
```shell
$ npm i --save vue2-smooth-scroll
```

# 使い方
`touch`コマンドでプラグイン用ファイルを作成する

```shell
$ touch plugins/v-smooth-scroll.js
```

```javascript:plugins/v-smooth-scroll.js
import Vue from 'vue'
import vueSmoothScroll from 'vue2-smooth-scroll'

Vue.use(vueSmoothScroll, {
  duration: 500, // スクロールにかける時間
  offset: 0, // スクロール先のオフセット
  updateHistory: true // #ハッシュを適用するか
})
```

`nuxt.config.js`でプラグインを読み込む

```javascript:nuxt.config.js
module.exports = {
  plugins: [
    { src: '~/plugins/v-smooth-scroll', mode: 'client' }
  ]
}
```

`a`タグに`v-smooth-scroll`と書くと、`href`で指定した要素までスムーススクロールする

```html:pages/test.vue
<template lang="pug">
.test
  a(href="#test" v-smooth-scroll) anchor
  #test test
</template>
```

下のようにオブジェクトを渡すと、このタグ単一で設定を変更することが出来る

```html
a(href="#test" v-smooth-scroll="{ duration: 1000, offset: -50 }") anchor
```

# 参考文献
この記事は以下の情報を参考にして執筆しました。

- [Vue2 Smooth Scroll](https://www.npmjs.com/package/vue2-smooth-scroll)
Go言語と螺旋本で学ぶデータ構造とアルゴリズム（その0）

## はじめに

「プログラミングコンテスト攻略のためのアルゴリズムとデータ構造」（通称：螺旋本）をGo言語で解いていくシリーズです。個人の勉強が目的で、主な目標は以下のとおりです。

* Go言語に慣れる
* アルゴリズムとデータ構造の理解を深める
* 上記を理解した上で、競技プログラミング用のライブラリを作成する

なお、Go言語の基本文法については特に細かく書かないつもりです。

## 標準入出力

競技プログラミングをやる上で避けては通れないのが標準入出力だと思うので、今回はここについてまとめたいと思います。

簡単な問題であれば[前回の記事](https://qiita.com/mahiro4ds/items/c8c96b90c056b673cc52)でご紹介した`fmt.Scan()`及び`fmt.Println()`で十分なのですが、入出力の数が多くなると問題が発生するようなので、今回は別の方法を紹介します。

### 標準入力

`bufio.Scanner`を使います。
使い方としては、まず`Scan()`で1行を読み取ります。`Scan()`は標準入力があればtrue, なければfalseを返します。その後に`Text()`で文字列を返すことができます。

```go
package main

import (
	"bufio"
	"fmt"
	"os"
)

// Scannerを生成
var sc = bufio.NewScanner(os.Stdin)

func main() {
	var a string
	if sc.Scan() {
		a = sc.Text()
	}

	fmt.Println(a)
}
```

整数や小数で受け取る場合は`strconv.Atoi()`や`strconv.ParseFloat()`で変換する必要があります。

これらはよく使う処理なので、関数にしておきます。なお、競技プログラミング用なので、戻り値（エラー、真偽値）の確認は割愛しています。

```go
func next() string {
	sc.Scan()
	return sc.Text()
}

func nextInt() int {
	i, _ := strconv.Atoi(next())
	return i
}

func nextFloat() float64 {
	f, _ := strconv.ParseFloat(next(), 64)
	return f
}
```

複数行から受け取る場合の関数も作成しておきます。戻り値はスライスにしておきます。

```go
func nextInts(n int) []int {
	ret := make([]int, n)
	for i := 0; i < n; i++ {
		ret[i] = nextInt()
	}
	return ret
}

func nextFloats(n int) []float64 {
	ret := make([]float64, n)
	for i := 0; i < n; i++ {
		ret[i] = nextFloat()
	}
	return ret
}

func nextStrings(n int) []string {
	ret := make([]string, n)
	for i := 0; i < n; i++ {
		ret[i] = next()
	}
	return ret
}
```

今までは行区切りで受け取っていましたが、競技プログラミングではスペース区切りの入力が与えられることも多いです。`bufio.Scanner.Split(bufio.ScanWords)`を事前に実行しておくと、これに対応することができます（`Scan()`が改行までではなく、スペースまでを読み取るようになります）。また、`bufio.Scanner.Split(bufio.ScanLines)`を実行すると行区切りに戻すことができます。

いつでも切り替えができるように、これも関数にしておきます。

```go
func splitSpace() {
	sc.Split(bufio.ScanWords)
}

func splitLine() {
	sc.Split(bufio.ScanLines)
}
```

### 標準出力

`bufio.Writer`を使います。
これは`fmt.Fprintln`や`fmt.Fprintf`と併せて使います。`fmt.Println`や`fmt.Printf`と使い方はほとんど同じですが、ここでは第一引数に`bufio.Writer`を与えてから出力するデータやフォーマットを与えます。
また、最後に必ず`bufio.Writer.Flush()`を実行する必要があります。忘れないように`defer`で先に書いておくのがよいかもしれないです。

```go
package main

import (
	"bufio"
	"fmt"
	"os"
)

// Writerを生成
var wr = bufio.NewWriter(os.Stdout)

func main() {
	defer wr.Flush()
	fmt.Fprintln(wr, "Hello, World!")
}
```

## 参考

* [Go 言語で標準入力から読み込む競技プログラミングのアレ --- 改訂第二版](https://qiita.com/tnoda_/items/b503a72eac82862d30c6)

## まとめ

今回は競技プログラミングの問題を解く上で必須と思われる標準入出力についてまとめました。
次回からは実際に問題を解いていきたいと思います。
# Dartの関数

# Dartの関数

Dartでは関数の省略可能な引数の書き方がいくつかある。

引数名を指定して値を受け渡す関数の呼び出し方法が特徴的。

```dart
// 通常
int addIntNormal(int val1, int val2){
	return val1 + val2;
}

// 1行記法
int addIntOneLine(int val1, int val2) => val1 + val2;

// {}の付与で名前付き任意引数
int addIntOmit1({int val1, int val2}) {
	return val1 + ( val2 ?? 30 );
}
int addIntOmit2({int val1, int val2 = 30}) {
	return val1 + val2;
}

// 引数の一部のみを任意にする
int addIntOmit3(int val1, [int val2 ]) {
	return val1 + (val2 ?? 30);
}

main(){

	int x = 70;
	int y = 30;
	
	print(addIntNormal( x, y ));
	print(addIntOneLine( x, y ));
	print(addIntOmit1( val1 : x ));		// 引数名を指定
	print(addIntOmit2( val1 : x ));		// 引数名を指定
	print(addIntOmit3( x ));
}
```

```dart
// 実行結果
100
100
100
100
100
```
Conoha VPS (Ubuntu 18.04) + Nginx でIPv6に対応する

# 最初に
この記事はConoha VPSにかかわらず、
- Ubuntu 18.04LTS のネットワーク設定変更方法
- NginxのIPv6設定方法
- DNSの設定方法
が記載されています。


最近IPoE等でIPv6を利用する人が増えてきたように感じます。
その人たちはIPv6で接続した方が速度も速くなるためサーバー側も対応してあげる必要があります。

というか日本はIPv6への対応が出遅れているので、サービスを開発している方々には是非対応して欲しいです。



CentOSの方は[こちら](https://support.conoha.jp/v/setipv6/)をご覧ください。

また、この記事とお手元の環境で多少の差異があることと思います。自分の環境に合わせて作業してください。

# 注意しなければいけないこと
Conoha VPSでは、グローバルIPv4が1つ,IPv6が17個自由に使えます。
しかし、IPv6に関しては自由に使えるだけであらかじめVPSにはアドレスが設定されていません。
IPv4のアドレスのみが最初から設定されています。
これはシェルで
`$ ip a `
と打つことにより確認できます。
このコマンドを打った時にIPv4のグローバルアドレスと、IPv6のローカルアドレス（fe80から始まっているアドレス）しか表示されない場合はUbuntuにIPv6が設定されていません。
また、Ubuntu 18.04からネットワーク周りの設定方法が変わっているため、インターネット上にある情報の大半が利用できなくなっています。

# Ubuntu18.04 LTSの設定
Ubuntu 18.04からyamlファイルで設定するようになりました。

1. `$cd /etc/netplan` でディレクトリを移動します。
2. `ls` でそのディレクトリにあるyamlファイルを表示します。僕の環境（Conoha）の場合は `10-gmovps.yaml` がありました。
3. yamlファイルを覗きます。僕の場合は `$vim 10-gmovps.yaml` です。環境によってファイル名が違うので注意。
デフォルトではこのような設定になっていると思います。
IPv4に関してはDHCPから取得する設定なのですね。

```yaml:10-gmovps.yaml
 network:
     ethernets:
         eth0:
             addresses: []
             dhcp4: true
             dhcp6: false
             accept-ra: false
             optional: true
     version: 2
```
ここにIPv6に関しての設定を追記していきます。

4.　Conohaのコントロールパネルから、対象のサーバーのIPv6アドレスとIPv6のゲートウェイアドレスを確認してください。
（わからない方は[こちら](https://support.conoha.jp/v/setipv6/?btn_id=v-setipv4-sidebar_v-setipv6)のページの「利用可能なIPv6を確認する」を参考にしてください。）
17個のIPv6アドレスから好きなものを選んでください。（一番上に表示されるアドレスの末尾がIPv4アドレスと同じになっているので一番上に表示されるIPv6アドレスがわかりやすいかも）

5.　設定を書き換える

```yaml:10-gmovps.yaml
 network:
     ethernets:
         eth0:
             addresses:
             - 「IPv6のアドレスをここに記述」/64
             dhcp4: true
             dhcp6: false
             accept-ra: false
             optional: true
             gateway6: 「ゲートウェイのアドレスをここに記述」
     version: 2
```
IPv6のアドレスを記入した後ろに `/64`を必ずつけてください（Conohaの場合。環境によって異なります。）

6.　`$ sudo netplan apply` で設定を適用する。 
7.　`$ ip a `で指定したIPv6のアドレスが表示されることを確認してください。（エラーが出た場合は指定された場所を確認してください。yamlなのでよくあるミスがインデントのミス）

# DNSの設定
自分が利用しているDNSにAAAAレコードを登録します。
この記事を見ている人はわかると思うのですが、
Aレコード→IPv4
AAAAレコード→IPv6
のアドレスを対応させます。
よって、先ほどUbuntuに設定したIPv6アドレスをAAAAレコードで任意のドメインに設定してください。
またIPv4からのアクセスも受け付ける場合は、同じドメインでAレコードにてIPv4アドレスを従来通り設定してください。


# Nginxの設定
普通の環境ならば
`/etc/nginx/sites-available/default` の設定ファイルを書き換えます。

`$vim /etc/nginx/sites-available/default`にて編集していきます。


```conf:default
server{
         server_name 「先ほどのドメイン」;
         root 「表示するディレクトリ」;
         index index.html;
         listen [::]:80; #IPv6の設定
         listen 80; #IPv4の設定
 }
```

変更を上書き保存した後、 `$nginx -t`で設定内容が問題ないことを確認し、`$systemctl restart nginx`で設定を適用します。

# 最後に

最低限の構成でIPv6への対応方法を簡単に書いていきました。
お手元の環境に合わせて作業してもらえればと思います。
また、IPv6にしっかり対応できたかは
[こちら](https://ipv6-test.com/validate.php)のサイトで確認するとわかりやすいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510882/52766ee2-7a83-c060-5de1-ef07b8c4fa2b.png)
このようにIPv6 web serverでチェックが入った場合は設定が正しく完了しています。


間違えている部分等ございましたら、コメントで指摘のほどよろしくお願いします。
[ゲームプログラミング in c++]SOIL(Simple OpenGL Image Library)導入でリンクエラーが発生する問題について

殴り書き雑多ですが悪しからず。

# SOILを利用しようとすると外部リンクエラーが発生する
書籍の[ゲームプログラミング in c++](https://www.amazon.co.jp/%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0C-Sanjay-Madhav/dp/4798157619)を読み進めていくと第5章でTextureクラスを作成する際に画像を扱う必要が出てくるんですけど、ここではSOIL(Simple OpenGL Image Library)(stb_imageの拡張版らしい)が使われてます。Visual Studio 2017環境で書かれているはずなのにSOILの最終更新が2008年と古く、このままでは使い物になりません(でした)。
[SOIL作者webページ](http://www.lonesock.net/soil.html)からソースコードをダウンロードし、再度ビルドすることでlibファイルを再構築する必要がありそうです。

# 誰向けの情報か
当[書籍](https://www.amazon.co.jp/%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0C-Sanjay-Madhav/dp/4798157619)を読んでいると分かるのですが、突然外部ライブラリの導入をさせられることが度々あり、導入方法についてもぐぐれかすなスタンスなので、ここで挫折したりイライラしてる人いるかもしれないと思ったんで、そういった方たちに少しでもヒントになればと思います。)

# 解決策
１．[SOILのダウンロードページ](http://www.lonesock.net/soil.html)にアクセスする。
　　hereをクリックしてSOIL.zipをダウンロードし適当な位置に解凍する。
　　例えば自分はC:/Program Files/SOIL/などに解凍した。

２．SOIL/Simple OpenGL Image Library/projects/VC9/まで移動し、SOIL.slnをVisual Studio 2017で起動する。起動すると自動的にx64用に変換してくれるのでOKを押す。

３．VS2017画面上部にあるDebugをReleaseモードに、Win32をx64に切り替える。
４．３のままではソースファイルがないためビルドしてもソースがないとエラーが出る。
　　ソースはsoil/Simple OpenGL Image Library/srcの中に入っているので、すべてSOIL.slnと同じ階層フォルダにコピペする。
５．VS2017に戻り、ビルドする。(Ctrl+Shift+Bかビルド->ソリューションのビルドを押す)
６．SOI/Simple OpenGL Image Library/projects/VC9/x64/Releaseフォルダ内にSOIL.libが作成されるのでこれを自分が作ってるゲームプロジェクトのライブラリに設定する。

これでリンクエラーを解決することが出来ると思います。
一般的な外部ライブラリの導入方法に関しては知ってる前提で書いてるので割愛しますが、分からない場合は簡単に以下に方針を示しておきます。~~(書くのが面倒)~~

１．自分のゲームプロジェクトをVS2017で開く
２．画面上プロジェクト->(プロジェクト名)のプロパティを開く
３．[構成プロパティ]->[VC++ディレクトリ]->[インクルードディレクトリ]に外部ライブラリのヘッダーやソースが入ったフォルダパスを入力する。
４．[構成プロパティ]->[VC++ディレクトリ]->[ライブラリディレクトリ]にSOIL.libが入ったフォルダパスを指定する
５．[構成プロパティ]->[リンカー]->[入力]->[追加の依存ファイル]にsoil.lib(自分でlibファイルの名前を変えてたらそれに合わせて入力してください)

以上です。質問や指摘事項ありましたらコメントまでお願いします。
時間があれば分かる範囲で回答します。
Azure Stack Hub の仮想マシン Disk Quota は Compute Quota で設定する


「Storage」の Quota ではない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64309/e3fd1680-0015-bb61-2458-8ebf3891091c.png)

散々 Storage Quota を変更した挙句、「反映されない・・・」と打ちひしがれていた（アホや）。


### 参考

- [Azure Stack Hub のクォータの種類 - Microsoft Docs](https://docs.microsoft.com/ja-jp/azure-stack/operator/azure-stack-quota-types)
JavaScript初学者の私がFizzBuzzアプリを自作して学んだこと

# はじめに
私はフロントエンドエンジニアへの就職を目指して、現在4ヶ月程独学でプログラミングを学習している初学者です。
学習内容のアウトプットを行うために、自由に数値を入力することが可能なFizzBuzzアプリを作成しました。

このアプリを作成するに当たって参考にした記事はこちらになります
[【実体験】未経験からフロントエンド開発を目指す！効率良く就活フェーズへ入る為のロードマップ【課題３種付き】
](https://note.com/kouki_iwahara/n/n9ab103fb7e87)
こちらの記事では未経験者がフロントエンドエンジニアに転職するまでのロードマップが課題と共にわかりやすく解説されていますので、ぜひ参考してみて下さい。

学んだことのアウトプット・私と同じようなJS初学者の参考になればと思いこの記事を作成しています。

**この記事で分かること**

- アプリ作成の流れ
- 私が行き詰まった点

# アプリ作成の流れ
1、追加したい機能を書き出す
2、その機能がどのようなコードで実装できるか大まかに予測する
3、実際にコードを書く

まず初めに自分が作りたいアプリに必要な機能の洗い出しを行いました。
具体的に今回のアプリを例にとって書き出すと

 - FizzBuzzの計算式
 - 入力された整数値を読み取る
 - 計算結果を表示する

などです。

この時最初から全ての機能を洗い出せる必要はなく、後から足りないと分かれば足していけばいいと思います。

次に行うのは、洗い出した機能をどうすれば作ることができるのか文章で書くことです。
具体的に言うと、

- FizzBuzzの計算式→if文を使ってFizz・Buzz・FizzBuzzの条件を分ける
- 入力された整数値を読み取る→inputに入力された値を変数に保存する
- 計算結果を表示する→documentにtextcontentなどを使って表示する

この時点で自分が見当がつく処理の仕方を少しだけ具体的に書いておきます。

なぜこのような一見手間なことをするのかと言うと、

1.個別の機能を一つずつ作成していくことができる
2.自分の中でどのような手順で作っていけばいいのか考えやすくなる

以上の理由からこのような工程を行なっていきます。

※完了した作業は✔︎を入れるとどこまで作業が完了しているのか分かるのでおすすめです！！！！


# 私が行き詰まった点

**1、入力欄の値を取得する**
結論から言うと、valueを使えばいいという簡単な話なのですが、この結論に行き着くまでにかなりの時間がかかりました。
というのも定数や変数にinputに入力した値を保存するという概念がなかったのでvalueをどこに記述すればいいのかが分からず、ググりつつあれこれ自分でコードをいじりながら一つずつ試していきました。
valueの使い方を念のため記載しておきます。

```JavaScript
let form1 = document.getElementById('fizznumber');
let fizz =  form1.value;
```

**2、追加した要素を削除する**
追加した要素というのは、documentに表示した計算結果のことです。
innerhtmlでdocumentに計算結果を追加する機能は簡単に実装することができましたが、再度入力した時に前回の計算結果が表示されたまま次の計算結果を表示してしまう問題にぶつかりました。

この問題点も個人的に大きく時間がかかりました。
innerhtmlを空にするという方法が簡単にググれば出てくるのですが、具体的に自分で書いたコードのどの箇所にそれを記述するのかが分からず、この問題は自分では解決できないと判断したためテラテイルで質問して解決しました。

#まとめ
実際に自分で一からコードを書いて何か成果物を作るのはとても大変で時間がかかりましたが、大きな自信になりました。
また、コードを書いていてエラーにぶつかることはとてもストレスになりますが、今の自分にはないスキルを身につける大きなチャンスにもなりこれからもどんどんコードを書いていきたいと思いました。
と技術的な点には全く触れずブログのような記事になってしまいましたが、これにて終わりにしたいと思います。
本日の精進：動的計画法(DP)その2～ナップザックDP～

ナップザックDPという関門。
[Educational DP Contest](https://atcoder.jp/contests/dp/)
C問題 Vacation

"幸福度"を得る行動を毎日行うことで、N日間の幸福度の総和を最大化する問題。行動は3つのカテゴリに分けられ、同じカテゴリの行動は2日連続では行えない、という制約付き。
1次元のdp配列では、この制約条件を情報として持つことができない。よって、dpを拡張して2次元配列にする必要がある。つまり、

dp[i+1][j]:i日目に行動カテゴリjを実行したという条件下で得られる最大幸福度

とする。こうすると、(前日の行動カテゴリ)×(選択可能な行動カテゴリ)=3*2=6通りをi=0,...,N-1で計算すればよいため、高々O(N)で収まる。

なお、「前日だけでなく、前々日、前々々日、...の情報も必要なのでは？」と一瞬思うのだが、実際は高々前日の情報があれば十分ということに気を付ける。

この問題を解くにあたって、以下の記事をめっちゃ参考にしました。↓
[動的計画法超入門！ Educational DP Contest の A ～ E 問題の解説と類題集 (by drken氏)](https://qiita.com/drken/items/dc53c683d6de8aeacf5a)
chmax(a,b):aとbを比較して、大きい方をaに代入する　という関数を使うとdpが非常に簡潔に書ける、というテクニックは目からうろこでした。素晴らしい。

```AC.cpp
#include <bits/stdc++.h> //library
#define rep(i, n) for(int i = 0; i < (int)(n); i++) //for-loop (from 0)

using namespace std;
using ll = long long; //long long
const ll INF = 1LL << 60;
ll M = 1000000000 + 7;

template<class T>bool chmax(T &a, const T &b) { if (a<b) { a = b; return 1; } return 0; } //compare a,b and replace by greater
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a = b; return 1; } return 0; } //compare a,b and replace by smaller

int main(void) {
  int n; cin >> n;
  int action[101000][3];
  rep(i,n) cin >> action[i][0] >> action[i][1] >> action[i][2];
  ll dp[101000][3];
  rep(j,3){
    dp[1][j] = action[0][j];
  }
  
  for (int i = 1; i < n; i++){
    dp[i+1][0]=-1*INF; dp[i+1][1]=-1*INF; dp[i+1][2]=-1*INF;
    rep(j,3){
      rep(k,3){
        if (j != k){
          chmax(dp[i+1][k],dp[i][j]+action[i][k]);
        }
      }
    }
  }
  ll res=0;
  rep(j,3) chmax(res,dp[n][j]);
  cout << res << "\n";
  return 0;
}

```
Ubuntu Server 18.04 （CUI環境）でも簡単に L2TP over IPsec がしたい

# 背景
L2TP over IPsecをするとき、ipsec.confやxl2tpd.confを書くのは大変です。
Ubuntu Desktopには、NetworkManagerでVPN設定ができるパッケージがあります。

```
apt install network-manager-l2tp-gnome
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13722/8a16c979-bf72-8632-22a1-1fe3880b1955.png)

Ubuntu ServerのCLI環境でもでもこれを使いたかった。

# 設定方法
```bash
# ネットワーク管理をNetworkManagerに任せる
# UbuntuDesktopはデフォルトでNetworkManagerが使われる。UbuntuServerはデフォルトでnetworkdが使われる。
vim /etc/netplan/50-cloud-init.yaml
```
```:50-cloud-init.yaml
network:
    version: 2
    renderer: NetworkManager
#   ethernets:
#       ens33:
#           dhcp4: true
```
```bash
# 念のためサーバを再起動
reboot
```

```bash
# NetworkManager側でサーバのIPアドレス設定などをする
nmtui
```

```bash
# パッケージをインストールする
apt install network-manager-l2tp
systemctl restart NetworkManager

# L2TP over IPsecの設定をする
nmcli connection add connection.id <VPNName> con-name <ConnName> type VPN vpn-type l2tp ifname -- connection.autoconnect no ipv4.method auto vpn.data "gateway = <VPN_SERVER_IP>, ipsec-enabled = yes, ipsec-psk = <PSK>, ipsec-ike=<ProposalIKE>, ipsec-esp=aes256-sha1-modp2048, mru = 1400, mtu = 1400, password-flags = 0, refuse-chap = yes, refuse-mschap = yes, refuse-pap = yes, require-mppe = yes, user = <USER>" vpn.secrets password=<PASS>

<VPNName>: VPN接続ID.なんでもよい。
<ConnName>: コネクション名。後で使う。vpnなどにすると管理しやすい。
<VPN_SERVER_IP>：VPNサーバのIPアドレス OR FQDN
<PSK>：PreSharedKey。平文で入力
<ProposalIKE>：IKEのProposal。aes256-sha1-modp2048 などと入力
<ProposalESP>：ESPのProposal。aes256-sha1-modp2048 などと入力
<USER>：（多分PPPの）ユーザー名
<PASS>：（多分pppの）パスワード。平文で入力
```
ProposalIKE、ProposalESPの書き方は、次のURLを参照。
https://github.com/nm-l2tp/NetworkManager-l2tp#user-content-ipsec-ikev1-weak-legacy-algorithms-and-backwards-compatibility

```bash
# 生成されたファイルを確認
ls /etc/NetworkManager/system-connections/vpn

# なにか修正したい場合は直接編集して、リロードする
vim /etc/NetworkManager/system-connections/vpn
nmcli conn reload
```

接続します

```bash
nmcli conn up <ConnName>
 #=> Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/7)
 #=> などと表示されたら成功

nmcli conn down <ConnName>
  #=> Connection 'vpn' successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/7)
  #=> などと表示されたら成功
```



ポイントは次。

- NetworkManager-L2TPをインストールする
- ネットワークの管理は、networkdをやめてNetworkManagerにする
- 設定ファイルを頑張って生成する
    - ウィザードやtuiインタフェースは存在しない
- nmcliコマンドを使う
- ipsec.confやxl2tpd.confに相当するものは、次の場所に出力される

```
ls -l /run/nm-*
-rw------- 1 root root 230 Mar 14 10:13 nm-l2tp-ipsec-6c4228fa-a3b0-438c-b787-a6b6c7363ffa.conf
-rw-r--r-- 1 root root 268 Mar 14 10:13 nm-l2tp-ppp-options-6c4228fa-a3b0-438c-b787-a6b6c7363ffa
-rw-r--r-- 1 root root 288 Mar 14 10:13 nm-l2tp-xl2tpd-6c4228fa-a3b0-438c-b787-a6b6c7363ffa.conf
```

# デバッグ方法

```
sudo killall -TERM nm-l2tp-service
sudo /usr/lib/NetworkManager/nm-l2tp-service --debug
```
参考：https://github.com/nm-l2tp/NetworkManager-l2tp
WordPressとHTMLファイルの共存

<h2>はじめに</h2>
WordPressのブログサイトにべた書きのHTMLファイルをアップロードできないかなと思ったので試してみました。

ドメインをいくつも買うのがもったいないので。。。

結論から先に申し上げますと<span style="color: #ff0000;"><strong>簡単にできました。</strong></span>(現状、特に問題は起きておりません。)
<h2>方法</h2>
やり方は簡単、WordPressの入ったドメインのpublic_html内に自身の作ったサイトのフォルダ(cssやらjsなど諸々含めたフォルダ)を丸丸アップロードしてあげるだけです。そのあとはアップロードしたフォルダをURLにしたい名前に変えてあげればOK。

僕の場合はFTP(FileZilla)でファイル転送をしました。

フォルダ階層はこんな感じです。

chobimusic.com(WordPressのドメイン)/public_html/portfolio(URLになる部分)/index.html

<img class="alignnone size-full wp-image-371" src="https://chobimusic.com/wp-content/uploads/2020/03/コメント-2020-03-14-190032.jpg" alt="" width="521" height="297" />

ポイントとしては読み込んでほしいファイルの名前をindex.htmlにしてあげることです。そうすると自動で指定のディレクトリにアクセスされた際にHTMLを読み込んでくれます。(今回の場合は/portfolioディレクトリ)
<h2>最後に</h2>
ってことで、このWordPressサイトにHTMLべた書きの自己紹介ページを追加することができました◎

<img class="alignnone size-large wp-image-372" src="https://chobimusic.com/wp-content/uploads/2020/03/a-1024x548.jpg" alt="" width="728" height="390" />

ほんと、もっと早くやっておけばよかった。。。苦笑

よければ覗いていってください&#x270c;

<a href="https://chobimusic.com/portfolio/">https://chobimusic.com/portfolio/</a>
Nuxt.jsでスクロールでふわっと出現する要素を作る

Nuxt.jsでスクロールでふわっと出現する要素を作ります。

# 前提条件
- Nuxt.jsとPugとStylusがインストールされていること

# 使い方
`touch`コマンドでプラグイン用ファイルを作成する

```shell
$ touch plugins/v-scroll.js
```

カスタムスクロールディレクティブを設定

```javascript:plugins/v-scroll.js
import Vue from 'vue'

Vue.directive('scroll', {
  inserted: function (el, binding) {
    let f = function (evt) {
      if (binding.value(evt, el)) {
        window.removeEventListener('scroll', f)
      }
    }
    window.addEventListener('scroll', f)
  }
})
```

`nuxt.config.js`でプラグインを読み込む

```javascript:nuxt.config.js
module.exports = {
  plugins: [
    '~/plugins/v-scroll'
  ]
}
```

出現させる要素に`v-scroll`と書いて、引数に連動して動くメソッド名を入れる

```html:components/test.vue
<template lang="pug">
.test(:class="[{'is-active': flg}]" v-scroll="handleScroll") test
</template>

<script>
export default {
  data: () => ({
    flg: false
  }),
  methods: {
    handleScroll(evt, el) {
      const top = el.getBoundingClientRect().top
      const wh = window.innerHeight
      if (top < wh / 2) this.flg = true
    }
  }
}
</script>

<style lang="stylus">
.test
  opacity 0
  transition all 1s

  &.is-active
    opacity 1
</style>
```

対象の要素が画面の半分に来た時に`is-active`クラスが付き要素が出現する

# 参考文献
この記事は以下の情報を参考にして執筆しました。

- [カスタムスクロールディレクティブの作成](https://jp.vuejs.org/v2/cookbook/creating-custom-scroll-directives.html)
AtomのインストールとPythonを実行できるようにするまでの過程

#Atomとは
Atomとは、エディタの名前です。エディタとは名前のまま編集するためのソフトウェアをいうのですが、Windowsでも利用できるため、使用しています。
ubuntu入れたPCは今手元に無いため、もう一つのPCで作業をしています(小声)
2015年からの新しいエディタですが、作業が効率化できる優れものです。拡張機能も数多くありますし、使用者が多く、Web上にも情報が多いので初心者にもおすすめです。

#今回やること
今回は以下の順で進めていきます。
・Atomのインストール
・Pythonを実行する。

##想定する環境
Windows10
Internet

##Atomのインストール
まずは以下のリンクからホームページにいき、Downloadをします。
https://atom.io/

次にDownloadしたファイルを実行します。おそらく以下の名前のファイルになっていると思います。
AtomSetup-x64.exe
![2020-03-14 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403932/29d95470-a72c-b3dd-82fb-0ad2f368b7aa.png)

これでインストールは完了です。あとは自動でAtomが開かれるか、ショートカットからAtomを開いてください。

##Pythonを実行する
まずは、Fileタブの中からNew Fileを選択し、新しいファイルを作成します。次にSave As…でファイル名を決めます。フィル名はsample.pyなどファイルの拡張子をpyにしてPythonファイルにしてくだい。

次に、Fileタブの中からSettingsを選択し、設定画面を開いてください。
Fileタブの中身は以下の画像に示した通りです。赤枠に今回使用したものを示します。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403932/73e837e4-070a-6125-4e77-317c94de2751.png)

次に実行するためのpackageをインストールします。
設定画面から左下にある+Installボタンをクリックします。
検索窓の中にatom-runnerと打ち込み、検索します。
検索して出てきたatom-runnerをInstallします。
これで実行することができます。
以下の画像のなかの赤枠で囲ったものが今回使用したものです。インストールした後の画面なのでこのような画面が出たらインストールできています。
![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403932/d04a01f6-6d31-e064-2c56-003afc2510eb.png)

今回は以下のPythonファイルを使用します。

```Python:sample.py
print('Hello World!!')
```
実行は、Alt+Rです。以下のような画面が出たら成功です。
![2020-03-14 (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403932/bfd50522-2a3e-b3cc-c83f-3e79403cb7d8.png)
【Ruby】配列とは？


配列とは？

・配列とは複数の値をまとめて管理したいときに使用
・配列は「箱が順番に並んだグループ」


配列の作成方法

Rubyにおいて配列を作成する場合は括弧（ [] ）を使用。
また変数を、複数用意する際は、括弧の中に値をカンマ区切りで記述していく。


■使用例
array = [“犬”, “ネコ”, “ハリネズミ”]
理論神経科学のまとめ（メモ）

理論神経科学に関する個人的なまとめです。
書籍は東京大学出版会の「脳の計算論」が参考になると思います。

#理論
神経の活動を数式で表す。
神経といっても動物種や組織によって細胞は多様であるため、簡単に一括りにはできない。
そのため、完全なモデルを作成することは難しい。(そのためには細胞内の動態を表す詳細なモデルが必要になる？)
最終的には実験で得られた見地も取り入れて、モデルを確かめることが大切になると思われる。

以下は具体的なトピック。

###活動電位のモデル
ホジキンハックスレーの方程式は非線形の微分方程式で活動電位を表現することに成功した。さらにイオンチャネルの存在も予言するようなモデルであった。
しかし、変数が多くて計算が大変であること、ヤリイカのモデルである、カルシウムチャンネルが無いことに注意
その後も様々なモデルが提案された。(式がより抽象的なものになっていく)
Morris-Lecar ニューロンモデル
フィッツフュー-南雲モデル
Izhikevichモデル

###位相振動子と力学系
活動電位を微分方程式で表すことが出来たため、力学系として考えることが出来る。
位相縮約理論によって、可視化し、性質を把握する。
安定点や不安定点の存在、非線形力学系のためカオスが現れる。
また膜電位のダイナミクスだけでなく、神経集団のネットワークのダイナミクスも結合を条件づけることで位相で記述することができる。
(そもそも生物自体が力学系として考えられる。いわゆる定常開放系(散逸構造))

###単一ニューロンのモデル
細胞には空間的な広がりがあるので、
厳密に考えようとすると偏微分方程式となる。
解決策として、コンパートメントモデルで考えるという方法がある。
または、空間的な広がりを考えなければ、以下の単純なモデルを作れる。
McCulloh-Pittsモデル。これは今のDeep Learningの元になっている。
積分発火型モデル(IFモデル、LIFモデル)。これはSpiking Neural Networkの元になっている。

###シナプスのモデル
動的シナプス(LTPやLTDとは違う短期的変化)、STDPなどの結合強度変化のモデル

###ネットワークのモデル
上記の全てを合わせればネットワークを再現できる。
本当はグリア細胞の関与も考慮するべき？


###確率過程を導入したマクロ的な挙動
上記までは決定論的な話であった。
単一ニューロンのモデルには、スパイク時系列だけを確率過程で考えるISIモデルもある。ポアソン過程やガンマ過程などがスパイク生成に近いとされる。
神経活動は多ニューロンと多ニューロンの伝播が一般的。
細胞の１つ１つの挙動はランダム性があると考えて、熱力学のようなマクロな性質を考える。
単一ニューロンへの入力ではランジュバン方程式で記述できる。
ネットワークの挙動はフォッカー・プランク方程式という偏微分方程式で記述できる。

#応用事例
解析解を導く、シミュレーション、ベイズ推論などを用いて当てはめる。
物理学の解析のように深層学習の活用も考えられる。

###観測される現象のモデリング
fMRIやNIRS、脳磁図、脳波などでの脳活動を観測する方法はいくつか存在する。
脳波の同期現象などは昔から知られていて、これらを数理モデルで説明できるようにする。
BMIの開発などへの応用も期待される。
また、動物実験では電気生理やカルシウムイメージングもある。
活動の同期やバースト発火現象など。

###意識や行動との関連付け
前項より内的な現象の解明
予測符号化やFree energy principle
大脳皮質の認知機能や海馬の記憶機能
大脳基底核や小脳などでの運動制御の機能
精神疾患との関連は書籍「計算論的精神医学」が参考になる

###新しい学習則(AI)の発明
ニューロコンピューティングへの応用。
パーセプトロンはマカロフのモデルから誕生した。
Spiking Neural Networkでは、ニューロモルフィックハードウェアの活用も期待できる。
リザーバーコンピューティングでも特有のハードウェア実装が利用出来る。
また、カテコラミン神経細胞のモデルは強化学習などにも応用できる。