OmniAICreator/Qiita-1.07M huggingface dataset:
桁の長い数を引き算するＣ言語のプログラムを作ってみた

[桁の長い数を足し算するＣ言語のプログラムを作ってみた](https://qiita.com/a_study/items/e559c2e701f725f0cdf3)に続いて桁の長い数を引き算するＣ言語のプログラムを作ってみました。もしかしたら間違ってるかもしれません。

```C
/*
 * BCD演算
 */
#include <stdio.h>
#include <string.h>

#define LEN 255      /* 最大桁数 */
int flag = 0;

void sub( char*  num1,  char*  num2, char*  ans)
{
    int i1 = strlen(num1);
    int i2 = strlen(num2);
    int ia = (i1 > i2 ? i1 : i2); 
    int carry = 0;
    
    /* 引き算をする時、num1よりnum2の数値が大きい時、答えがマイナスの値になる。
       例えば10-32の場合、答えは-22だが、計算手順として32-10=22を計算する。
       次に22にマイナスをつけるという順序で行う。だからnum1よりnum2の数値が
       大きい時はnum1とnum2を入れかえて計算を行い、答えにマイナスをつけるという
       方法をとる。
    */
    if (i1 < i2) { // num1よりnum2の方が大きい時
        flag = 1;
    }
    else if (i1 == i2) { // 値の長さが等しい時はfor文を使ってどちらが大きい値か確認する。

        for (int i = 0; i < i1; i++) {
            if (num1[i] < num2[i]) {
                flag = 1; // num2の方が大きい時は入れ替えるためにflagを1にする
                break;
            }
            else if (num1[i] > num2[i]) {
                break;
            }
        }
    }

    if (flag == 1) { // num2の方が大きい時はnum1とnum2を入れ換える
        char tmp[LEN];
        strcpy_s(tmp, LEN, num1);
        strcpy_s(num1,  LEN, num2);
        strcpy_s(num2, LEN, tmp);
        int i3 = i1;
        i1 = i2;
        i2 = i3;
    }

    ans[ia] = '\0';
    while (ia > 0) {  
        int n1 = i1 > 0 ? num1[--i1] - '0' : 0;
        int n2 = i2 > 0 ? num2[--i2] - '0' : 0;
        int sub = n1 - (n2 + carry);
        carry = 0;

        if (sub < 0) {
            sub = sub + 10;
            carry++;  // 例えば5-7のようにマイナスになるときは上位の桁から一つ値を借りるのでその目印にcarryにプラス１する
        }

        ans[--ia] = (char)(sub + '0');
    }

    if (flag == 1) { // 入れ替えた値を元に戻す
        char tmp[LEN];
        strcpy_s(tmp, LEN, num1);
        strcpy_s(num1, LEN, num2);
        strcpy_s(num2, LEN, tmp);
    }

}


int main(void)
{
    char num1[LEN], num2[LEN], ans[LEN + 1];
    printf("数値1を入力してください");
    scanf_s("%s", num1, LEN);

    int c;
    while ((c = getchar()) != '\n');

    printf("数値2を入力してください");
    scanf_s("%s", num2, LEN);

    sub(num1, num2, ans);

   
    int width = strlen(num1 > num2 ? num1 : num2 );

    printf(" %*s\n", width, num1);
    printf("-%*s\n", width, num2);
    printf("%s%*s\n", flag==1 ? "-": " ", width, ans);

    return 0;
}
```

```
数値1を入力してください4556456156415645644515645645641561564564564156
数値2を入力してください45564564564545645645645645645645444548296352
 4556456156415645644515645645641561564564564156
-  45564564564545645645645645645645444548296352
 4510891591851099998869999999995916120016267804
```
```
数値1を入力してください456456464
数値2を入力してください85458782112
 456456464
-85458782112
-85002325648
```
mac環境でrailsを起動する(mysql)

今回はrailsを用いたポートフォリオ作成の為に、
今までAWSのcloud9で開発していたのをローカル環境で行う。
その備忘です。


# 前提
　　rails ruby などなどはすでにインストールを以前済ませた為mysqlの起動から

## コマンド
 mysqlのターミナル上での起動
  ```
  mysql.server start
  ```

 mysqldのターミナル上での起動ステータスの確認
  ```
  mysql.server status
  ```

 mysqlが起動していなかった場合
   ```
   ERROR! MySQL is not running
   ```

 mysqlが起動していた場合
  ```
  Starting MySQL SUCCESS! 
  ```


となるmysqlが起動されステータスokであれば
```rails s```でrailsサーバーを起動するtと以下のログが発生するので


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645607/9fe39cff-3382-799d-60ba-235c1ea7721e.png)
https://gyazo.com/35a5d81be14535389ca6fce42a2b62e3

最終行の```://localhost:3000```をコピーしhttp://localhost:3000
ネットワークで検索をかける

![827992458a77dd1af90c00ee8da3ddc4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645607/8a508351-a376-0c42-88bc-7d0b847cffe9.jpeg)


見覚えのあるこちらの画面が出ればローカル環境でのrails起動が完了する。
【Unity】AddExplosionForceサンプル

#実装動画
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">AddExplosionForceで爆発<br><br>数値変えて色々検証してみよう <a href="https://t.co/IBud8AJ1ch">pic.twitter.com/IBud8AJ1ch</a></p>&mdash; TANUKEINA (@FH1b4mzzirXPoiM) <a href="https://twitter.com/FH1b4mzzirXPoiM/status/1301894023578152960?ref_src=twsrc%5Etfw">September 4, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

**AddExplosionForce (float explosionForce, Vector3 explosionPosition, float explosionRadius, float upwardsModifier= 0.0f, ForceMode mode= ForceMode.Force));**

とりあえず以下のパラメータで設定。

 * explosionForce = 100
 * explosionRadius = 20
 * upWardsModifier = 3.0f(球体的な爆発をシミュレートするため、見かけ上の位置を調整する。)
 * mode = Impulse
 
#実装
###cubeオブジェクト生成
爆発を受ける対象物をStart時に自動生成。
特殊なことはやらず、愚直にforで回して生成する。

```cs:CreateCube.cs
using UnityEngine;

public class CreateCube : MonoBehaviour
{
    public GameObject cube;
    public int interval = 2;

    private int startPosition = -30;
    private float startYPosition = 0.5f;
    private int finishPosition = 30;
    private float finishYPosition = 10.5f;

    void Start()
    {
        for (int z = startPosition; z <= finishPosition; z+=interval)
        {
            for (float y = startYPosition; y < finishYPosition; y+=interval)
            {
                for (int x = startPosition; x <= finishPosition; x += interval)
                {
                    Instantiate(cube, new Vector3(x, y, z), Quaternion.identity);
                }
            }
        }
    }
}
```

###AddExplosionForceの実装
[こちら](https://nopitech.com/2018/04/14/post-667/)ののっぴの備忘録さんの記事を参考に作成。

```cs:Blast.cs
using UnityEngine;

public class Blast : MonoBehaviour
{
    public float power = 100f;
    public float radius = 20.0f;
    public float upwardsModifier = 3.0f;

    Ray ray;
    RaycastHit hit;

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            //クリック点にRayを飛ばす
            ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray, out hit, 100f))
            {
                //クリックした所から半径20mの範囲のColliderを取得
                Collider[] collider = Physics.OverlapSphere(hit.point, radius);
                foreach (Collider cube in collider)
                {
                    //範囲内のオブジェクトのRigidbodyに爆破の力を作用させる
                    if (cube.GetComponent<Rigidbody>())
                    {
                        cube.GetComponent<Rigidbody>().
                            AddExplosionForce(power, hit.point, radius, upwardsModifier, ForceMode.Impulse);
                    }
                }
            }
        }
    }
}
```

#終わり

* 爆発をシミュレートすることが出来た。ただ爆発してモノを壊すだけのゲームを作成したい。
* 注意点として、被爆発対象の物体にはrigidbodyを付けないとシミュレートできない。
* 数値を変えた検証動画も作成したいなぁと思ってます。
[Flutter] Navigator.pop()したときに画面を再描画するシンプルな方法

# やりたいこと
Navigator.pop()で画面を戻って来たときに再描画したい。色々なやり方があるようだが、ある程度実装を進めたので今の設計を崩したくない。画面遷移部分だけの実装で、再描画を実現したい。

# やったこと
- 公式ドキュメントの[Return data from a screen](https://flutter.dev/docs/cookbook/navigation/returning-data)がほぼ全てだが、もとの画面に戻る際に値を受け取り、その値を見て再描画を実行する。
- 呼び出し元画面でNavigator.push()の実行をasyncメソッドで実装し、await実行することで、呼び出し先画面から戻った際に、そのメソッドに戻るようにする。
- あとはそのメソッド内で再描画をコールする。

# ソースコード
今回は関連する部分のみ記述する。

#### まずは呼び出し元画面
```FirstPage.dart
  @override
  Widget build(BuildContext context) {
    return Container(
    :
    child: RaisedButton( // [*1]
      onPressed: () {
        pushWithReloadByReturn(context);
      },
      child: Text("GoSecondPage"),
    );
  }

  void pushWithReloadByReturn(BuildContext context) async { // [*2]
    final result = await Navigator.push( // [*3]
      context,
      new MaterialPageRoute<bool>( // [*4]
        builder: (BuildContext context) => SecondPage(),
      ),
    );

    if (result) { // [*5]
      // setState(() {});
      // notifyListeners();
    }
  }
```
1. 画面遷移するボタン。押下時に下で定義したasyncメソッドを呼び出している。
2. asyncで画面遷移を実装したメソッド。次の画面からNavigator.pop()で戻った際に、このメソッドに返ってくる。
3. awaitでNavigator.push()を呼ぶことで、画面が戻ってくるまでここで待ち続ける。
4. 戻り値のクラスを&lt;bool&gt;に設定している。ここをStringや他のクラスにすることでいろいろな戻り値を受け取れる。今回はboolなので、当然[*3]のresultには、bool値が入る。
5. あとはresultの値を見て、StatefulWidgetならsetState()、ChangeNotifierProviderを使用しているならnotifyListeners()といったように、再描画の処理を呼び出せば良い。

#### 次に呼び出された画面
```SecondPage.dart
  @override
  Widget build(BuildContext context) {
    return Container(
    :
    child: RaisedButton(
      onPressed: () {
        Navigator.pop(context, true); // [*1]
      },
      child: Text("ReturnFirstPage"),
    );
  }
```
1. こちらはシンプルで、Navigator.pop()の第2引数（呼び出し元ページに返却する値）にbool値を渡すだけ。今回の例では、FirstPage側の実装で、この値を見て再描画するかどうかを判定させているので、ここでtrueを送れば戻った直後に画面が再描画され、falseを送れば再描画はされないことになる。

# やってみて
いろいろな記事を調べて試行錯誤しつつ、最終的にこの方法にたどり着いたが、きちんとやるならNavigatorObserverを使ってdidPopなどを実装するほうが汎用性が高そうだった。まとまった時間が取れたら、一度全体的なリファクタリングを行いたい。
navi 使って、cheatsheet をインターアクティブに操作する！

## 前書き

この週末、ターミナル、プロンプト、ショートカット周りに本腰を入れて調整した。

本来なら、kubernetes local で、nginx conf を弄りながら勉強してみた話を書きたかったが、連休に回すかな。
(kubernetes 使うのは大掛かりだが、最近よく触るし、cloud の配置を意識しながら作ることまで発展できればと思っている。)

## navi とは

[github(denisidoro/navi)](https://github.com/denisidoro/navi)

去年９月から作られたツールらしくて、もう beta 版ではなくなってる。作ってるのは個人っぽい。

言語は rust で、検索する動作は `fzf` を取り入れていて、速い！

## install 

`brew install navi`

元々、私は `fzf` を history検索に使っていたため、別途 install 不要になっている。

入れていない人は、brew install 画面に、必要な周辺ツールの install が提示されると思う。

それに従えば完了できるはず。

## 最低限の使い方

私もまだ使い出して、慣れていないので、とりあえず以下さえ分かれば、ある程度実用的に動かせる。

`navi repo browse`

このツールは中身にいっぱい cheatsheet 入っているのではなく、他の cheatsheet repo を好みで取り入れるようにしただけ。

なので、まずはブラウジングし、欲しいものを入れる。

似たようなツールに、[tldr](https://github.com/tldr-pages/tldr)がある。それとの連携も可能。

シンプルさは tldr の方が勝つかも、入れていないので分からないw

fzf 感覚で使えるから、navi に決めた。

## 自分の cheatsheet を書く

`$HOME/Library/Application Support/navi/cheats/xxxxx/xxx.cheat`

```
% tmux

# Kill session except current
tmux kill-session -a

# Kill session except current by num
tmux kill-session -t <number>

```

そこにファイルを納めておけば、navi と打って、コマンド名のキーワードを入力すれば、説明文とコマンドが出る！簡単でしょう〜

![navi01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86000/6399f3bf-2c50-b7ef-8b99-6900613abc3b.png)

## 実行

上記の図で、使いたいコマンドを打てば、引数を interactive に入力できるようになる。

![navi02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86000/518c2eeb-283c-e870-4b02-9b76eef80ed1.png)

入力すれば、実行してくれる。

引数がないコマンドはそのまま enter 押せば実行できる。

便利！
Goでテストカバレッジを測定する

# はじめに
Goは標準の機能としてテストカバレッジをだすことができます。
単純にテストのカバー率を算出するものから具体的にどこの部分のテストが足りないかを示してくれる機能もあるので今回はそれらを簡単にまとめたいと思います。


# シンプルにテストカバレッジを測定する

```shell
$ go test -cover ./...
?       app_name/api    [no test files]
?       app_name/api/config     [no test files]
ok      app_name/api/handlers   0.421s  coverage: 100.0% of statements
?       app_name/api/responses  [no test files]
```

シンプルにテストカバレッジを測定するときは`go test -cover`とすることでこのようにテストカバー率を出してくれます

# 具体的にどこがテストできてないかを表示する

```shell
# cover.outというファイルテストのカバー内容を吐き出す
$ go test -cover ./... -coverprofile=cover.out

# go toolを用いてcover.htmlを作成する
$ go tool cover -html=cover.out -o cover.html

# cover.htmlを開く
$ open cover.html
```

具体的にテストされていない場所を特定するときは上記のようにコマンドを打つことでテストできていないところを赤文字で表示させることができます。
![スクリーンショット 2020-09-06 22.46.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281558/de435a84-800d-1732-6e77-d01e9785cf09.png)

# 不要なファイルをカバレッジ計算から排除する

```shell
# cover.out.tmpというファイルテストのカバー内容を吐き出す
go test -cover ./... -coverprofile=cover.out.tmp

# 自動生成コードをカバレッジ対象から外し、カバレッジファイルを作成
cat cover.out.tmp | grep -v "**_mock.go" > cover.out

# 不必要なcover.out.tmpを削除
rm cover.out.tmp

# 以下先ほどと同じ
go tool cover -html=cover.out -o cover.html
open cover.html
```

テストカバー率を測定するときにmock用のコードなどが入ってしまうと適切なカバレッジを測定できないので、そのようなときは少しシェル芸します
上記の場合はコードをmockするときに`_mock.go`という接尾語をつけているのでその場合はカバレッジ測定のファイル（cover.out）から削除します。

# 最後に
goは標準でテストカバレッジツールがついているのはとてもいいですね！
真っ赤な状態からテストを書いてどんどん緑にしていく過程は結構楽しいです！！

以下個人的に使ってるmake fileコマンドです
独自のmockファイルと[wire](https://github.com/google/wire)の自動生成ファイルを外すようにしています

```makefile:Makefile
cover:
	go test -cover ./... -coverprofile=cover.out.tmp
	# 自動生成コードをカバレッジ対象から外し、カバレッジファイルを作成
	cat cover.out.tmp | grep -v "**_mock.go" | grep -v "wire_gen.go" > cover.out
	rm cover.out.tmp
	go tool cover -html=cover.out -o cover.html
	open cover.html
```

# 参考文献
- 公式ドキュメント（https://blog.golang.org/cover)
- Go でコードカバレッジを取得する(https://qiita.com/kkohtaka/items/965fe08821cda8c9da8a)
[ruby]標準入力からの値を受け取るには？

#概要
2つ以上の入力の取得方法が分からず、調べていると解決したので、記録しておきます。
今回は１行に複数の要素が入力されている場合です。

#本題
以下の入力結果を整数型に変換し、出力します。

```
標準入力
1999 2000
```

```
input_line = gets.split(' ').map(&:to_i)
puts input_line
```

```
出力結果
[1999, 2000]
```

「split」は要素を分解し、配列に格納します。

「map」はブロック内を評価し、配列に置き換えます。今回の場合、整数型に置き換えているということだと。

間違っていれば、ご指摘お願いいたします。
Railsチュートリアル　テストについて

##はじめに

Railsチュートリアルを学習すると、第３章にいかに「自動化テスト」が重要であるか書いてあります。テストの書き方については色々議論の余地があるそうですが、本記事ではテストについて自分なりに抑えていたほうが良いと思われることをまとめました。

##テストフレームワークについて

テストフレームワークにもいくつか種類があり、それぞれコード書き方等の特徴があります、ここでは主だった２種類のフレームワークを紹介します。

参考にしました →[Railsの人気テストフレームワーク6選！](https://www.atmarkit.co.jp/ait/articles/1108/18/news113.html)
　　　　　　　　 [RSpecとMinitest、使うならどっち？](https://speakerdeck.com/jnchito/number-kanrk06?slide=38)

###　Minitest
　・Railsのデフォルトのフレームワーク。
　・学習コストは比較的低い。
　・Railsチュートリアルでも使用されている。
　・処理速度は比較的早いといわれている。
　・デフォルトの機能は必要最小限。
　・コード量は少なく、シンプル

###　Rspec
　・自然言語で近い方たちで書かれている。
　・利用率が高い。
　・慣れるまでが時間がかかる。
　・Minitestに比べると処理速度は遅いといわれている。
　・デフォルトの機能は豊富。
　・コード量は多くて、複雑。

どちらも一長一短みたいですね。初心者はMinitestから入って、その後Rspecも学ぶのが一番ですかね。

##テストの種類について

参考する文献によって２種類だったり、それ以上だったりしますが今回は２種類のテストについて紹介します。

参考にしました →[Rails テスティングガイド](https://railsguides.jp/testing.html)
　　　　　　　　 [ソフトウェアテスト　-wilki](https://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%86%E3%82%B9%E3%83%88)

###　単体テスト
　関数やメソッドなど小さな単位で行うテスト。モデルやビューヘルパー単体の動作をチェックします。

例：

```Rails:test/helpers/application_helper_test
  test "full title helper" do
    assert_equal full_title,         "Ruby on Rails Tutorial Sample App"
  end
```

assertとはオブジェクトまたは式を評価して、期待された結果(true)が得られるかどうかをチェックするコードです。
上記はassert_equalがfull_titleが"Ruby on Rails Tutorial Sample App"と完全一致しているかどうか検証しています。


```Rails:test/models/user_test.rb
  test "name should not be too long" do
    @user.name = "a" * 51
    assert_not @user.valid?
  end
```

assert_notとは、assertとは逆にfalseが得られるかどうかをチェックするコードです。
上記はユーザーの名前が51文字の場合、ユーザーが有効でないことを検証しています。

###　統合テスト
　プログラムを組み合わせて行うテスト。個々の機能が正しく連動しているか、ユーザーの実際の操作を想定してチェックします。

例：

```Rails:test/integration/users_login_test
  test "login with valid email/invalid password" do
    get login_path
    assert_template 'sessions/new'
    post login_path,params: {session: { email: @user.email,
                          password: "invalid"}}
    assert_not is_logged_in?
    assert_template 'sessions/new'
    assert_not flash.empty?
    get root_path
    assert flash.empty?
  end
```

上記は、有効でないパスワードを入力したユーザーに対するテストを行っています。

１.　getメソッドでログインページ（login_path）を生成する。
　　→get login_path

２.　ログインページのテンプレートが選択されているか検証する。
　　→assert_template 'sessions/new'

３.　login_pathへ有効なメールアドレスと有効でないパスワードを投稿する。
　　→post login_path,params: {session: { email: @user.email,password: "invalid"}}

４.　ユーザーがログインしていないことを検証する。
　　→assert_not is_logged_in?

　is_logged_in?メソッドは下記により定義されています。

```Rails:test/test_helper.rb
  #テストユーザーがログイン中の場合にtrueを返す
  def is_logged_in?
    !session[:user_id].nil?
  end
```

５.　ログインページのテンプレートが選択されているか検証する。
　　→assert_template 'sessions/new'

６.　エラーメッセージが表示されていることを検証する。
　　→assert_not flash.empty?

７.　getメソッドでホームページ（root_path）を生成する。
　　→get root_path

８.　エラーメッセージが表示されていないことを検証する。
　　→assert flash.empty?

という流れになっています。

#まとめ

正直Railsチュートリアル終えても自力でテストをかけるか自信がないです。また、テストはどこまで厳密にやるかセンスが問われそうですね。数をこなしてなれていくのが大事だと思いました。
IISでCakePHP3を動かしたら真っ白なページが表示された場合の解決策

# 0.はじめに
色々なサイトを見ながらCakePHP3のチュートリアルを進めていた際に、
**localhost/cms**と入力したのに**真っ白なページが表示**されてしまった。
しかも、そもそも**localhost/phpinfo.php**すらも**真っ白**だった。

しかし、原因を調べようにもCakePHP3を使うにあたってIISを用いることが珍しいのか、
なかなか自分の現象を解決する方法が書いてあるサイトが見つからなかった。

結論から言うと**IISの設定不足**だったのだが、見つけるのに苦労したのでここに記しておく。
ただし、**IISでCakePHP3を動かす方法全体を書いているわけではないので注意**。
（後ほどリンクを貼っておくかも。もしくは自分でまとめるか）
# 1.ハンドラーマッピング
まず**phpinfo.php**に関しては**ハンドラーマッピングの設定**が漏れていた。
詳しくは調べていないが、**.phpのモジュールマッピング**を設定に組み込まないといけないらしい。
以下に簡単に設定方法を記載する。上の言葉だけで解決した人は作業に進んでもらって大丈夫だ。

### 1.IISからハンドラーマッピングを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610600/f47f0e5b-bf2c-f365-ff91-d960ed1dc917.png)

### 2.右のメニューから「モジュールマップの追加」を選択する
色々似たようなものがあるが、**モジュールマップの追加**を選択。
ちなみに左側の一覧で選択されているのが今回追加するモジュールマップというもの。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610600/02981f02-9f74-5c21-3728-3a58887180ed.png)

### 3.必要項目を入力してOKボタンを押す
画像はモジュールマップの編集のものになっているが、
モジュールマップの追加と同じ構成なので許してほしい。

**要求パス**と**モジュール**は**画像の通り**に入力。
**実行可能ファイル(オプション)**は**ご自身の環境のパスを参考**に入力。
**名前**は任意です。自分は適当にPHPなんて名前を付けました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610600/5e68a30e-f44a-1a27-31f3-700bf49d8d9e.png)


ハンドラーマッピングの設定については以上です。
これで[localhost/phpinfo.php](localhost/phpinfo.php)に飛んだらPHPの設定が表示されるかもしれません。
（phpinfo.phpを作成している前提の話ですが）

# 2.既定のドキュメント
こちらこそ本当に基礎の基礎なのか全然出てこなかった。
URL書き換えもあるし、web.configも問題ないのになぜ**localhost/cms**に飛ばない！ってなってた。
簡単に言うと、**既定のドキュメントにindex.phpを入れる**。これだけでした。
こちらも先ほどと同様に簡単に説明。

### 1.IISから既定のドキュメントを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610600/81af0487-8d29-b121-9a8e-f85c2c76d589.png)

### 2.右のメニューから「追加」を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610600/57abd17f-b97d-1c02-9aa2-d0e0c8f97f40.png)

### 3.「index.php」を入力してOKボタンを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610600/31bf6d03-e5df-fb36-fe62-9ae520f10fb4.png)

これでOK。無事URL書き換えが実行されて**localhost/cms**と入力しただけで**index.php**を開いてくれるはず。

# 9.最後に
最初にも書いたが、これはあくまで自分が見つけるのに時間のかかった部分だけをまとめたに過ぎない。
本当にIISでCakePHP3を動かすには他にも色々な設定が必要になる。
（それこそURL書き換えやDB接続にもちょっとした難所があったり……）

まあ、色々と書いたけど、少しでも自分と同じところで躓いている人の助けになれればとまとめてみました。
一人でもこの記事のおかげで開発が停滞する時間が短縮できる人がいれば幸いです。

初記事なので、文章として読みにくいところとか、色々と指摘があればどんどんお願いします。
数値解析　共立出版　森正武先生


```{r}
#QR法　p.94　　（森正武著　共立出版「数値解析」)
#固有値(A_matの対角成分)と固有ベクトル(Q:A_matが対角行列の場合)
A=matrix(sample(1:9,9,replace=T),ncol=3)
A=A+t(A)
A_mat=A
ite=1000
Q=diag(rep(1,nrow(A_mat)))
for(l in 1:ite){
q_mat=array(0,dim=c(nrow(A_mat),ncol(A_mat)))
r_mat=array(0,dim=c(nrow(A_mat),ncol(A_mat)))
q1=A_mat[,1]/sqrt(sum(A_mat[,1]^2))
q_mat[,1]=q1
r_mat[1,1]=sqrt(sum(A_mat[,1]^2))
for(j in 2:ncol(A_mat)){
u=A_mat[,j]-apply(t(t(q_mat[,1:(j-1)])*c(t(q_mat[,1:(j-1)])%*%A_mat[,j])),1,sum)
r_mat[j,j]=sqrt(sum(u^2))
q_mat[,j]=u/sqrt(sum(u^2))
}
r_mat2=t(A_mat)%*%q_mat
r_mat2[upper.tri(r_mat2)]=0
diag(r_mat2)=diag(r_mat)
r_mat=t(r_mat2)
A_mat=r_mat%*%q_mat
Q=Q%*%q_mat
}

#最小多項式による固有ベクトルの計算
lam=sort(unique(diag(A_mat)),decreasing = T)
lambda=diag(A_mat)
count=c()
for(j in 1:length(lam)){
count=c(count,sum(lambda==lam[j]))
}

v=array(0,dim=c(nrow(A),length(lam)))
for(j in 1:length(lam)){
countvec=count
countvec[j]=countvec[j]-1
mat=diag(rep(1,nrow(A)))
for(i in 1:length(countvec)){
if(countvec[i]>0){
for(k in 1:countvec[i]){
mat=mat%*%(A-lam[i]*diag(rep(1,nrow(A))))  
}}}  
v[,j]=mat[,1]
}

```
Kaggle備忘録 ~NLP with Disaster Tweets第一回~

# Kaggleに挑戦
しばらく手を付けていなかったKaggleに久々にトライしてみました。

挑戦するのはこちら↓
<b>Real or Not? NLP with Disaster Tweets</b>
https://www.kaggle.com/c/nlp-getting-started


まずはデータセットをDataFrameに落とし込む。

```python
import os
import pandas as pd

for dirname, _, filenames in os.walk('../input/nlp-getting-started'):
    for filename in filenames:
        path = os.path.join(dirname, filename)
        exec("{0}_df = pd.read_csv(path)".format(filename.replace(".csv","")))
```

特定の単語と災害発生Tweetに相関があるんじゃないかと考えて以下のコードを作成。

```python
# Tweet文を単語ごとに区切り、DataFrameに格納する
words_df = pd.DataFrame([], columns = ['words' , 'target_count'])
for index,item in train_df[['text','target']].iterrows():
    word_df = pd.DataFrame([], columns = ['words' , 'target_count'])
    word_df['words'] = item[0].split(' ')
    word_df['target_count'] = item[1]
    words_df = pd.concat([words_df,word_df])

# ストップワードを除外するために５文字以上の単語に絞る
long_words_df = words_df[words_df['words'].str.len() > 5]
# 同一の単語をGroupByしてその集計結果を表示する
long_words_df.groupby(['words']).sum().sort_values("target_count", ascending=False)
```

結果は以下の通り。
Hiroshimaって単語が上位に食い込んでいるのが気になりますね。

| words     |target_count| 
|:----------|-----------:|
| California| 86         |
| killed    | 86         |
| people    | 83         |
| suicide   | 71         |
| disaster  | 59         |
| Hiroshima | 58         |
gitで複数ファイルの拡張子を一括置換するシェルスクリプト

gitで、.jsを.tsに一括で置換したいときは以下のスクリプトでいけます。置換元ファイルを絞り込みたい場合は、適宜1行目のfindコマンドを書き換えます。

```
for i in $(find . -iname "*.js"); do
  git mv "$i" "$(echo $i | rev | cut -d '.' -f 2- | rev).ts";
done
```

以下を参照。

Git: Rename or move all files at once
https://stackoverflow.com/questions/9151920/git-rename-or-move-all-files-at-once/9151943#9151943
FE PCの情報単位

## Information Unit
#### Overview
- 0と1だけの世界
- 最小単位がbit、8ビットをbyte
- 桁が大きくなるほど、情報量は増える(1bit増えるたびに情報量2倍)


#### Example
- 2bit = 01
- 1byte = 01011010 = 1bit
- 1bitの情報量　0か1の2種類
- byteの情報量　256種類

#### Trivia
- 01011があったとき、左端の数字をMSB、右端の数字をLSBという

## Simplification
#### Overview
- 数字が大きくなると表現が大変→k、M、G、T、P
- 逆に小さい数字の表現もある→m、μ、n、p
- こいつらを補助単位という
VSCodeで拡張子jsファイルの'Type aliases can be used only in a .ts file' エラーを回避する

VSCodeで、拡張子jsのファイルにてTypeを使うと以下のエラーが起きます。

>'Type aliases can be used only in a .ts file' error

ググったら以下のページを発見。
'Type aliases can be used only in a .ts file' error popping up in Flow enabled files
https://github.com/Microsoft/vscode/issues/15171

VSCodeのsetting.jsonに以下を追加することでエラーをとりあえず回避できました。
> "javascript.validate.enable": false
Docker Swarm + Traefik(1.7) で構築したクラスタで、REMOTE_ADDRが取得できない問題に対処した話

Docker Swarmクラスタ上で、リバースプロキシとしてTraefikコンテナを立て、nodeコンテナでコンテンツを配信する構成で運用しようとしたところ、どうにもREMOTE_ADDRが取得できなくて困りました。

そのときの対処方法をメモしておきます。

Dockerのバージョン：19.03.12

当初のdocker-compose.ymlファイルは以下のとおりです。

```
version: '3.4'

services:

  socket-proxy:
    image: tecnativa/docker-socket-proxy
    networks:
      - internal
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - SERVICES=1
      - TASKS=1
      - NETWORKS=1
      - LOGSPOUT=ignore
    deploy:
      placement:
        constraints:
          - node.hostname == manager

  traefik:
    image: traefik:1.7-alpine
    command:
      - "--logLevel=error"
      - "--entryPoints=Name:http Address::80 Redirect.EntryPoint:https"
      - "--entryPoints=Name:https Address::443 TLS"
      - "--defaultentrypoints=http,https"
      - "--web"
      - "--web.address=:8080"
      - "--acme"
      - "--acme.storage=certs.json"
      - "--acme.entrypoint=https"
      - "--acme.httpchallenge.entrypoint=http"
      - "--acme.onHostRule=true"
      - "--acme.email=hashimoto@bagooon.com"
      - "--docker"
      - "--docker.endpoint=tcp://socket-proxy:2375"
      - "--docker.swarmMode"
      - "--docker.watch"
    ports:
      - 80:80
      - 443:443
    networks:
      - internal
      - overlay
    volumes:
      - ./certs/certs.json:/certs.json
    deploy:
      placement:
        constraints:
          - node.hostname == web
      restart_policy:
        condition: on-failure

  web:
    image: hoge/fuga:dev
    networks:
      - overlay
    deploy:
      replicas: 1
      placement:
        constraints:
          - node.hostname == web
      labels:
        - "traefik.enable=true"
        - "traefik.backend=web"
        - "traefik.frontend.rule=Host:sample.com"
        - "traefik.frontend.entryPoints=https"
        - "traefik.frontend.passHostHeader=true"
        - "traefik.docker.network=overlay"
        - "traefik.protocol=http"
        - "traefik.port=3000"

networks:
  overlay:
    external: true
  internal:
    internal: true
```

> 今回の本題ではありませんが、上記の設定では「docker-socket-proxy」を使って、Traefikのendpointを別のコンテナに割り振っています。一般的にTraefikはマネージャノードで実行し、endpointにdocker.sockを指定して使用するのですが、もしTraefikにセキュリティホールが見つかったりすると、クラスタ全体を乗っ取られてしまう危険性が指摘されています。docker-socket-proxyを使用することで、ワーカーノード上でTraefikを実行でき、さらにdocker-socket-proxyで権限を絞ることでセキュリティを高めた運用が可能になります。

以前あるサイトを運用していて、悪質なアクセスに悩まされた経験がありますので、是非ともREMOTE_ADDRはログとして残しておきたいのですが、どうにも取得できません。

Traefikは、各コンテナで「traefik.frontend.passHostHeader=true」を指定すれば、バックエンドにヘッダー情報等をそのまま送り届けてくれるはずです。User-Agent等は正しく取得できますので、どうやらこの設定は生きているようです。

## 原因

いろいろ調べていたところ、海外の掲示板で、Docker SwarmのオーバーレイネットワークがREMOTE_ADDRを運ばないらしいという情報を見つけました。そして、Nginxの事例ではありましたが、ポートをhostモードでマウントするといいよ、という解決策も示されていました。

## 解決策

そこで、Traefikのポートの設定を以下のように書き換えてみました。

```
    ports:
      - mode: host
        protocol: tcp
        published: 80
        target: 80
      - mode: host
        protocol: tcp
        published: 443
        target: 443
```

テストしたところ、無事にREMOTE_HOSTを取得できるようになりました。

Nginx等でも同じ対応で解決できるものと思います。
同じ問題でお困りの方がいらっしゃいましたら、是非お試しください。
pylintでワイルドカード指定が動かないとき

# 概要
カレントディレクトリ直下のpythonファイルを一括でpylintかけようとしてはまった話。
同じことで悩んでいそうな方に、一応の解決策を提供します。

# 結論
解決策は以下。
- 空の`__init__.py`をまず作る。
- コマンド実行時に`..`で一階層上がってからフォルダ指定する。（理由はわからないです）

# 環境
- OS ... Windows 10 64bit(Home)
- Python実行環境 ... Minicondaでconda仮想環境を作成
  - pylint 2.5.2
  - astroid 2.4.1
  - Python 3.7.9 (default, Aug 31 2020, 17:10:11) [MSC v.1916 64 bit (AMD64)]

# やったこと
最初フォルダ構成はこんな感じ。

```
C:\Users\{ユーザー名}\Desktop\project
  └aaa.py
```

コマンドプロンプトから以下を実行してみた。

```
(dev) C:\Users\{ユーザー名}\Desktop\project>pylint *.py
************* Module *.py
*.py:1:0: F0001: No module named *.py (fatal)
```

あれ。。。ワイルドカード使えない？

いろいろ調べて、`__init__.py`を同じ階層に作れば行けそうな雰囲気を感じた。
`__init__.py`は空のファイルで良い。

```
C:\Users\{ユーザー名}\Desktop\project
　├__init__.py
  └aaa.py
```

これなら以下で行けるか？

```
(dev) C:\Users\{ユーザー名}\Desktop\project>pylint .
(dev) C:\Users\{ユーザー名}\Desktop\project>
```

これもダメ。。。
念のため１階層上でも試してみる。

```
(dev) C:\Users\{ユーザー名}\Desktop\project>cd ..
(dev) C:\Users\{ユーザー名}\Desktop>pylint project
************* Module project.aaa.py
project\aaa.py:24:0: C0301: Line too long (109/100) (line-too-long)
（そのほか多数）
-----------------------------------
Your code has been rated at 2.20/10

(dev) C:\Users\snkmr\Desktop\repo>
```

お、できた！！！でも階層上がらないとできないの不便すぎる...
もしかしてワンチャンこれならいける？？

```
(dev) C:\Users\{ユーザー名}\Desktop>cd project
(dev) C:\Users\{ユーザー名}\Desktop\project>pylint ..\project
************* Module project.aaa.py
project\aaa.py:24:0: C0301: Line too long (109/100) (line-too-long)
（そのほか多数）
-----------------------------------
Your code has been rated at 2.20/10

(dev) C:\Users\snkmr\Desktop\repo>
```

行けた！！！これが正しい解決法かわからないけど、一応解決した。

# 結論(再掲)

解決策は以下。
- 空の`__init__.py`をまず作る。
- コマンド実行時に`..`で一階層上がってからフォルダ指定する。（理由はわからないです）
PowerAppsでPrinft（Notify）デバッグ

#環境
Office365 E3

#Notifyデバッグ
Notify関数を使ってPrinft風にデバッグします。
制限事項としては非動作プロパティ（テキストコントロールのDefaultプロパティなど）には設定できないことです。

#1. デバッグ箇所にNotify関数設定
変数や演算結果を見たい箇所でNofify関数を設定（セミコロンで複数文を設定可能）
![2020-09-06_21h12_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178603/37e086f7-8cf1-979b-4af1-d5a99fd6b339.png)
#2. 処理実行
下図は日付コントロールで日付を変更したときのイベント（OnChange）に変数gSubjectの値をNotify関数で表示させた結果です。
![2020-09-06_21h13_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178603/f1ca4beb-cbb0-df9d-fa6d-c44efd6437b5.png)
#3. デバッグ完了後コメント化
``テキストの書式設定``で整形したあと``ダブルスラッシュ``でコメント化できます。
![2020-09-06_21h19_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178603/b4dd9162-962f-81d6-6623-80a7ea0237e1.png)
Node.js + osm-static-maps で OpenStreetMap や地理院地図の画像を取得する

## 概要

- Node.js 用ライブラリの osm-static-maps を使って OpenStreetMap や地理院地図の画像を取得する

## 今回の環境

- macOS Catalina + Node.js v14.9.0

## osm-static-maps のインストール

osm-static-maps パッケージをインストールする。

```
$ npm install osm-static-maps
```

## OpenStreetMap の地図画像を取得する

ソースコード。

```js
'use strict'

const osmsm = require('osm-static-maps');
const fs = require('fs');

(async () => {

  try {

    // 地図画像の Buffer オブジェクトを取得
    const imageBinaryBuffer = await osmsm({
      width:  800, // 画像の横幅(ピクセル)
      height: 600, // 画像の縦幅(ピクセル)
      center: '136.882090,35.170560', // 経度,緯度
      zoom: 20, // ズームレベル
      type: 'png' // PNG 画像フォーマット
    })

    // 地図画像データをファイルに出力
    await fs.promises.writeFile('osm.png', imageBinaryBuffer)
    process.exit(0);

  } catch (err) {
    console.error(err);
    process.exit(1);
  }
})();
```

実行結果。

![osm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139365/3db66f96-5bcc-7dbc-8ea8-ee604e83d313.png)

## 地理院地図の地図画像を取得する

ソースコード。

```js
'use strict'

const osmsm = require('osm-static-maps');
const fs = require('fs');

(async () => {

  try {
    // 国土地理院の地理院タイルを使う
    const tileserverUrl = 'https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png'
    const attribution = 'osm-static-maps / 出典: 地理院タイル'

    // 地図画像の Buffer オブジェクトを取得
    const imageBinaryBuffer = await osmsm({
      tileserverUrl: tileserverUrl,
      attribution: attribution,
      width:  800, // 画像の横幅(ピクセル)
      height: 600, // 画像の縦幅(ピクセル)
      center: '136.882090,35.170560', // 経度,緯度
      zoom: 14, // ズームレベル
      type: 'png' // PNG 画像フォーマット
    })

    // 地図画像データをファイルに出力
    await fs.promises.writeFile('chiriin.png', imageBinaryBuffer)
    process.exit(0);

  } catch (err) {
    console.error(err);
    process.exit(1);
  }
})();
```

実行結果。

![chiriin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139365/2d8736ad-198f-8a0a-9e30-0487e8e4dc9b.png)

## 参考資料

- [GitHub \- jperelli/osm\-static\-maps: Openstreetmap static maps is a nodejs lib, CLI and server open source inspired on google static map service](https://github.com/jperelli/osm-static-maps)
- [Static map images \- OpenStreetMap Wiki](https://wiki.openstreetmap.org/wiki/Static_map_images)
- [Tile servers \- OpenStreetMap Wiki](https://wiki.openstreetmap.org/wiki/Tile_servers)
- [Zoom levels \- OpenStreetMap Wiki](https://wiki.openstreetmap.org/wiki/Zoom_levels)
- [Tile Usage Policy (OSMF Operations Working Group)](https://operations.osmfoundation.org/policies/tiles/)
- [地理院地図｜地理院タイルについて](https://maps.gsi.go.jp/development/siyou.html)
- [地理院地図｜地理院タイル一覧](https://maps.gsi.go.jp/development/ichiran.html)
- [File system \| Node\.js v14\.9\.0 Documentation](https://nodejs.org/dist/latest-v14.x/docs/api/fs.html)
勉強:話者認識

# 概要
paiza の話者認識について勉強。理解したことを記載する。
https://paiza.jp/works/ai_ml/primer/ml-challenge2
まだ完全には理解できていないので、間違いがあるかも？
判明次第修正予定。

# 前提として
## 音とは
Wikipediaから引用
> 物理学においては、音とは物体を通して縦波として伝わる力学的エネルギーの変動のことであり、波動としての特徴（周波数・波長・周期・振幅・速度など）を持つ音波として表せる。

## 音の高低
音の高さは周波数によって決まる。
音が低い場合は周波数が低く、高い場合は周波数が高い。

# 波の分解
周期性を持った波は、単純な波に分解できる。
ex. フーリエ変換

# 使用するライブラリ
## librosa
音楽、音の分析に使うライブラリ。
https://librosa.github.io/librosa/

## sklearn
SVMを使うため使用する。

Wikipediaから引用
> サポートベクターマシン（英: support vector machine, SVM）は、教師あり学習を用いるパターン認識モデルの一つである。


# 学習した内容
単純な音声データでの予測から、フーリエ変換を使った予測精度の改善、MFCCを使った予測を学習。
## 単純な音声データでの予測
正解数は4/12で、システムに組み込むには予測精度が低すぎる。

## フーリエ変換を使った予測精度の改善
パワースペクトルを特徴として使用。
SVMのパラメータを変更したところ、正解数が増えている。
正解数は8～10/12とそれなり。システムに組み込むには予測精度の低いと感じる。

## 複数の特徴量を使った予測
1つの音声から複数の特徴量を抽出する。
パワースペクトログラムを分割し、複数の特徴量として使う。
正解数はフーリエ変換を使った予測と変わらず。

キーワード: 短時間フーリエ変換、パワースペクトログラム

## MFCCを使った予測
正解数は12/12となった。
システムに組み込めそうだが、もう少しテスト数を増やして確認したい。

# 今度やってみたいこと
今後こんなことをやってみたい。

* 同一の音声データをwavとmp3に変換して比較
* 10分程度の音声データの比較
【Java】二つ以上の引数をsuperに渡す場合の書き方

###superって何？
これがそもそもわかっていないと何のこっちゃという感じです。

どうやらイメージ的には`メソッド`ですかね。

正しいのかどうかはわかりませんが、調べても`〜ときに使われます`とかそういう説明しか見当たらなかったです。

###メソッドだと思えば、引数の書き方がイメージしやすい。

superを使いと何がどうなるのかわからないので、こんな風に書いてエラーになります

```java
public class Oya {
  private String name;
  private int score;
  
// コンストラクタ
  public Oya(String name, int score) {
    this.name = name;
    this.score = score;
  }

  // 子クラスから変数の値を読み込めるようにするgetter
  public String getName() {
    return this.name;
  }
  
  // 子クラスから変数の値を読み込めるようにするgetter
  public int getScore() {
    return this.score;
  }
}

public class Ko extends Oya {
  // 子クラスのコンストラクタ
  public Ko() {
    // super(name); // ←ダメ
    // super(score); // ←ダメ
    super(name, score); // メソッドに引数を渡す時の要領で書く
  }

  public void sayHello() {
    // nameはOyaクラスでprivateになっているのでthis.nameなどではアクセスできない
   // Oyaクラスでgetterを書いとけば、メソッドを利用してnameの値を返してくれる
    System.out.println("hello! " + this.getName());  // ←最後のところでOyaクラスのgetNameメソッドを呼び出してnameの値を受け取る
  }
}

public static void main(String[] args) {
  Ko bob = new Ko("bob", 10);
  Ko.sayHello();
}
```

これでうまくいきました。
`super(name, score)`という書き方をすればコンパイルエラーがなくなり、ちゃんとコンストラクタが動いたもよう。


###super(引数1、引数2）という風に二つ以上の引数を渡す

単にこの書き方が思いつかなかったのと、superの使用例が引数が一つのものしか出てこなかったので、メモとして残しておきます。

自分はsuper(引数)という書き方で一つずつ変数をOyaクラスのコンストラクタに渡すものだと勘違いしていました。


素人記事ですので、間違いがあればご指摘ください。
ArcFaceによる画像分類の超（簡潔な）まとめ

# はじめに
本記事ではArcFaceを用いた画像分類の大枠について簡潔にまとめます。
理論的な背景やコードなどは適宜参考サイトを示しますので、ぜひご確認ください。


# 超まとめ

- 画像の分類では距離学習(metric learning)という学習手法がよくつかわれる。
 - 距離学習は空間に埋め込んだデータについて、同じクラス同士はまとまって、違うクラス同士は離れて配置されるように学習すること。
 - 単純な分類器では、新しいクラスが追加された際にモデルの再学習が必要だが、距離学習では既存のモデルをそのまま使える。
 - 新しいクラスは、既存のクラスと遠くに配置される（ことが理想的）ので、新しいクラスは新しいクラス同士で特異な場所に集まる。
 - 空間的に集まったデータに対して、未知のデータをプロットして最も近くにあるクラスを予測値として返すのが基本的な考え（後述）。
- ArcFaceはSOTAな距離学習アルゴリズムのひとつ。
 - 空間の点同士の距離を離すには各点の原点からの距離を伸ばすか、角度を大きくすればよい。
 - ArcFaceは角度に注目したアプローチ。
 - 特徴としては、点同士の距離が超平面の距離と同じになるので幾何的解釈が容易らしい。
 - その他には伝統的なcentre loss、contrastive loss、triplet lossや、最近登場したSphereFace、CosFaceなどがある
 - 詳しくは：[モダンな深層距離学習 (deep metric learning) 手法: SphereFace, CosFace, ArcFace](https://qiita.com/yu4u/items/078054dfb5592cbb80cc)
 - [角度を用いた深層距離学習（deep metric learning）を徹底解説 -PytorchによるAdaCos実践あり-](https://cpp-learning.com/adacos/)
- ArcFaceは分類器の後半にレイヤーとして追加することで動作する
 - 詳しくは：[[Keras]MobileNetV2+ArcFaceを使ってペットボトルを分類してみた!](https://qiita.com/noritsugu_yamada/items/2e049cd7a8fd77eee0f5#%E8%A9%95%E4%BE%A1)
 - [KerasによるArcFaceの実装(github)](https://github.com/4uiiurz1/keras-arcface)
- predictではArcFaceを取り除いた学習モデルを使用
 - 詳しくは：[[Keras]MobileNetV2+ArcFaceを使ってペットボトルを分類してみた!](https://qiita.com/noritsugu_yamada/items/2e049cd7a8fd77eee0f5#%E8%A9%95%E4%BE%A1)
- 出力は各データに対して１つのベクトル（一次元配列）
- testデータの出力ベクトルと、（あらかじめ計算してある）trainデータの出力ベクトルの距離を計算し、最も距離が近いtrainデータのラベルをpredict結果とする
区間DP(だるま落とし）の説明記事を個人的に咀嚼してみた

区間DPの解説記事で(<a href="http://kutimoti.hatenablog.com/entry/2018/03/10/220819">参考</a>)、個人的に理解できない箇所があったので、個人的に咀嚼して説明してみる。
（理解に誤りがあるかもしれないが。。。）

理解できなかった箇所は以下の２点

１．なぜ右側解放？
２．２ケースに分けているが、他のケースは無いのか？

####１．なぜ右側解放?
・ただ単にindexが0始まりだから
・0<=l,r<nの場合は以下の表現でも良さそう
　※AOJでTLEするけど、それっぽいソースを最下部に張り付けておく。

<dl><dd>dp[l][r] := 区間[l , r]で取り除くことのできるブロックの数</dd></dl>

・区間分割点（上記参考記事ではmid）をそのまま使って再帰表現をしたいから
　両側が閉じた表現にした場合（つまり区間[l , r]）、以下の分け方になる。

<dl><dd>[l,mid] , [mid+1 , r]に区間を分ける</dd></dl>

####２．２ケースに分けているが、他のケースは無いのか？

参考記事では以下の様にケース分けをしていた。

<dl><dd>1. lのブロックとr - 1のブロックが対になれる</dd></dl>
<dl><dd>2. [l,mid) , [mid , r)に区間を分ける</dd></dl>

1.のケースは、両端に挟まれている箇所がすべて消えて、さらに残った両端が消えるケース。ぷよぷよの連鎖みたいに。
2.のケースは、２分割してそれぞれのパート毎に最大の除去数を求めるケース

自分の疑問は、他にケースは無いのか？ということ。２ケースでMECEとなる理由が分からなかった。
たとえば、両端に挟まれている箇所が2個を残し消えて、さらに残った2個が両端とともに消えるケースはどうなのか？(ケースA)
両端に挟まれている箇所が1個を残し消えて、さらに残った1個が両端のいずれかとともに消えるケースはどうなのか？(ケースB)

図に書いてみると、2のケースに含まれることがわかった。
（２ケースに収まるという証明ができたわけではない）
<table><tr><td>ケースA
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694198/0c34b48b-23f9-5f91-7f4d-215ca4211f4a.png)</td><td>ケースB![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694198/db829c87-6eeb-b861-8584-ec076353dd6c.png)</td></tr></table>


```Python
import sys

sys.setrecursionlimit(250000)
input = sys.stdin.readline
dp = []
w =[]

def rec(l,r):
    #既に探索済の場合はその値を返す
    if dp[l][r] >= 0:
        return dp[l][r]

    #単一ケースは落とせないので0
    if l == r:
        dp[l][r] = 0
        return 0

    #連続している箇所の場合
    if l + 1 == r:
        if abs(w[l] - w[r]) <= 1:
            dp[l][r] = 2
            return 2
        else:
            dp[l][r] = 0
            return 0

    res = 0

    #Case1 両端に挟まれている箇所がすべて消えて、さらに残った両端が消える
    if abs(w[l] - w[r]) <= 1 and rec(l+1, r-1) == (r - 1) - (l + 1) + 1:
        res =  (r - 1) - (l + 1) + 1 + 2
    else: #Case2 両端に挟まれている箇所が消えない
        for mid in range(l,r):
            res = max(res, rec(l,mid)+rec(mid+1,r))

    dp[l][r]=res
    return res
def main():
    global w
    global dp
    n_list=[]
    w_list=[]

    while True:
        n = int(input())
        if n == 0 :
            break
        w_tmp = list(map(int, input().split()))
        n_list.append(n)
        w_list.append(w_tmp)

    for i in range(len(n_list)):
        dp = [[-1] * n_list[i] for j in range(n_list[i])]
        w = w_list[i]
        print(rec(0,n_list[i]-1))
main()



```
Node.js nを使い複数バージョンを共存させる

仕事でnode.jpを使用する機会があったのですが、
複数のシステムで様々なnodeのバージョンを使う機会があり、仮想環境(CentOs)でnodeのバージョン切り替えれるようにしました


## Node.js と npm インストール
とりあえず、nodeとnpmをインストールします (CentOs)

```
yum install gcc gcc-c++
yum install nodejs npm –enablerepo=epel
```

※ついでにMacの場合は以下のコマンドで

```
brew install node
```


## n のインストール

```
npm install -g n
```

## nのパスを通す

~/.bash_profileを使用しパスを指定する
※ない場合は、作成してください。~/.profile, ~/.bashrcでも自分の好みのもので構いません

```
cd
vi .bash_profile
```

.bash_profileに以下の文言を買い込みます

```
export N_PREFIX=$HOME/.n
export PATH=$N_PREFIX/bin:$PATH
```
調整を適用

```
source .bash_profile
```
これで準備できました！


## 特定バージョンのインストール
最新バージョン

```
$ n –stable
$ n –latest
$ n latest
```

※これでうまくいかないことがあるみたいです、、こちらを参考に[n lts]を使用するとうまくいきました
https://blog1.mammb.com/entry/2019/11/26/090000

```
n lts
n latest
```


特定バージョン

```
$ n 5.7.1
```

## バージョン切り替え
nコマンドを使用すると矢印キーとEnterキーで切り替えることができます

```
# n

ο   node/10.17.0
    node/12.18.3

Use up/down arrow keys to select a version, return key to install, d to delete, q to quit
```

これでnodeのバージョンを気楽に切り替えれるようになりました、本当に助かる


## 参考文献
https://qiita.com/jaxx2104/items/2277cec77850f2d83c7a
https://blog1.mammb.com/entry/2019/11/26/090000
https://qiita.com/bigplants/items/2d75bf552e0da4a7e822
[SwiftUI]NavigationViewのnavigationBarTitle位置に画像とテキストを両方入れる方法

#実装するもの
SwiftUIにおける[SwiftUI NavigationViewでListからNavigationLinkで遷移する方法](navigationBarTitleについてはhttps://qiita.com/yuujioka/items/54e0c83e533447a1137e)ではnavigationBarTitleの使い方についても触れましたが、ここでは以下の実装をする為に必要な方法をご紹介したいと思います。

![スクリーンショット 2020-09-06 22.08.11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517666/6bdc4c61-b29d-6910-27dd-1145051e902c.jpeg)



#Code
```swift:ContentView
struct ContentView: View {
    
    var body: some View {
    
            VStack {
                TitleView(image: Image("SwiftUI"),titleName: "SwiftUI")
                    .frame(width: UIScreen.main.bounds.width * 0.95, height: UIScreen.main.bounds.height * 0.1)                  
                List(1..<100) { num in
                    NavigationLink(destination: Text("Lesson\(num)")) {
                    Text("Lesson\(num)")
                    }
                }      
        }
    }
}
```

これに加えて
Cmd＋Nで新規TitleViewを作成し
![スクリーンショット 2020-09-06 22.10.39.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517666/b3a18b27-ec30-c476-f6a7-ad464239133d.jpeg)



![スクリーンショット 2020-09-06 22.10.59.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517666/eefe4125-8cc7-4ac4-ab08-afb7207cb258.jpeg)
以下のCodeを追加します。
#Code
```swift:TitleView
struct TitleView: View {
    let image: Image
    let titleName: String
    
    var body: some View {
        HStack {
            VStack(alignment: .leading) {
                image
                    .resizable()
                    .frame(width: 50, height: 50)
            
        }
            ZStack {
                Text("\(titleName)")
                    .fontWeight(.black)
                    .foregroundColor(Color.black)
                    .font(.largeTitle)
            }
            Spacer()
        }
        .padding()
        .background(Color.white)
        .clipShape(RoundedRectangle(cornerRadius: 10))
    }
}
```

#解説
現段階でnavigationBarTitleにImageとTextを入れる方法がない(と思う)為、TitleViewを作り、最上部にVstackで配置する事でそれらしく見せる事ができます。また.frame(width: UIScreen.main.bounds.width * 0.95, height: UIScreen.main.bounds.height * 0.1)では高さや幅をデバイスのサイズによって変更する為、綺麗な設計をする上では非常に有効ですので是非ご活用ください。
また使用するImageはassetにあらかじめご用意ください。

![スクリーンショット 2020-09-06 22.14.48.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517666/b6cc9b18-8693-f306-639d-093ed5b5ef27.jpeg)


#最後に
普段は個人でSwiftUIでアプリを作っています。ハードも作るの大好きです。
よければ下記もチェックして下さい♪
Twitter
https://twitter.com/oka_yuuji
note
https://note.com/oka_yuuji
今使っているElasticsearchのバージョンはJava11に対応しているのか?

というお話です。
いや、JDK11（OpenJDK）のリリースが2018年9月と2年も前やし、当たり前やろーっ！と思う人もいるかもしれませんが、、
製品によってはそうでない可能性もある（実際、AWSのElastic BeantalkがJava11に完全対応（GA）したのが2020年4月 - この記事を執筆した2020年9月時点の約5ヶ月前とわりと最近だった）ので、念のため調べてみました。

## 事の発端

事の発端となったのが公式サイトの以下のページ

- [Compatibility | elastic](https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-compatibility.html)

> The Java High Level REST Client requires Java 1.8 and depends on the Elasticsearch core project. ・・・

なぬ? Java1.8だと・・・?
今動かしている環境がJava11だったので、正直焦りました。
このページをさらに読み進めると、

> The 6.0 client is able to communicate with any 6.x Elasticsearch node, while the 6.1 client is for sure able to communicate with 6.1, 6.2 and any later 6.x version, ・・・

とあり、バージョン6.0～6.2付近の時点のものであることが読み取れました。
現状使っているElasticsearchのバージョンは7.4.2（AWSのElasticsearch Serviceの使用開始時の最新バージョン：2020/07/23～は7.7に対応）なので、Java11対応しているかも?というわけでいざ、調査。

## 調査

まずたどりついたのが以下の記事。

- [Support for Java 11 | elastic](https://discuss.elastic.co/t/support-for-java-11/149393)

現状、テスト中、的な。
2018年9月時点の内容ですからねぇ、さすがに大丈夫やろ、と思いたいところではありますが。

確証とれるまでは続けます。

さらに、調査を進めると、

- [Elastic Stack 6.5.0 リリース | elastic](https://www.elastic.co/jp/blog/elastic-stack-6-5-0-released)

より、2018年11月バージョン6.5.0よりJava11サポートとなっていることが確認できました。
（しかもありがたいことに日本語。）
けっこう早い段階で対応していたんですね。すごい！

「Oracleから」とあるのが若干気になりましたが、、使用しているElasticsearchの現バージョン（7.4.2）がJava11に対応していることは間違いない、とのことで一件落着～！

## 結論
Elasticsearch 6.5.0以降であればJava11に対応している、というのが結論です。
それ以前のバージョンをお使いの方でJava11環境使っている方、あるいは移行を考えている方は6.5.0以上へのアップグレードを検討したほうがよさそうですね。

## 参考
本文中では記載してませんが、参考にしたページたちです。

- [Corretto on Amazon Linux 2 platform(aws
/
elastic-beanstalk-roadmap) | GitHub](https://github.com/aws/elastic-beanstalk-roadmap/issues/1)
- [Java SE platform history | aws](https://docs.amazonaws.cn/en_us/elasticbeanstalk/latest/platforms/platform-history-javase.html)
- [Amazon Elasticsearch Service のドキュメント履歴 | aws](https://docs.aws.amazon.com/ja_jp/elasticsearch-service/latest/developerguide/release-notes.html)
AWS CognitoにLogin with Amazonアカウントを追加する

これまでの投稿で、Cognitoに、GoogleやLINE、Yahooのアカウントを追加しましたが、Amazonアカウントも追加しておきます。
備忘録として残しておきます。

これまでの投稿
　[AWS CognitoにGoogleとYahooとLINEアカウントを連携させる](https://qiita.com/poruruba/items/189945dc64edfe1f2464)

# Cognitoのドメイン名をメモっておく

とりあえず、Cognitoのユーザプールを開き

AWS管理コンソール：Cognito
　https://ap-northeast-1.console.aws.amazon.com/cognito/users/?region=ap-northeast-1

連携させたいUserPoolを選択し、左側のナビゲーションからアプリの統合のドメイン名を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/f2b5c386-b8fe-6d6d-6cb8-2c474c86556d.png)

そこで表示される、ドメインのプレフィックスのところのURLを覚えておきます。
こんな感じ
　https://XXXX.auth.ap-northeast-1.amazoncognito.com


# Login with Amazonコンソールからセキュリティプロファイルを作成

以下のサイトを開きます。

Login with Amazonコンソール
　https://developer.amazon.com/loginwithamazon/console/site/lwa/overview.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/5fc83815-1b2c-ab99-d2fc-4dbe016241e1.png)

「セキュリティプロファイルを新規作成」ボタンを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/88d46a6e-4f21-7acb-c8d7-e5bbc1ac8a0a.png)

適当に入力します。さすがにプライバシー規約同意書URLは存在するURLじゃないといけないようです。

次に、トップに戻って、右側の歯車ボタンにマウスを当て、「ウェブ設定」を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/5a0c084a-32ea-4ac2-94e8-8f8327482431.png)

編集ボタンを押して、許可された返信URLのところに、先ほどCognitoの画面からメモったドメイン名を入力します。以下のように入力します。

　https://XXXX.auth.ap-northeast-1.amazoncognito.com/oauth2/idpresponse

ついでに「シークレットを表示」ボタンを押下します。
表示された、クライアントIDとクライアントシークレットを覚えておきます。

# CognitoにLogin with Amazonの設定をする

Cognitoの画面で、フェデレーションのIDプロバイダを選択します。
そして、Login with Amazonを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/9c7b1ac4-d9fb-8aa4-50d5-ff4478bcb94a.png)

ここで、Amazon アプリIDのところに、先ほど覚えたクライアントID、アプリシークレットのところに先ほど覚えたクライアントシークレットを入力します。
承認スコープには、profileを入力します。
保存します。

次に、左側のナビゲーションから、フェデレーションの属性マッピングを選択します。Amazonを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/d02b8a06-9653-614a-e379-c0b1ed09c540.png)

emailを選択状態にし、ユーザープール属性をEmailにします。
ちなみに、この属性マッピングの設定は、ユーザプールの必須の属性としてemailを必須としていた場合に必要な設定です。

最後に、Login with Amazonでログインしようとしているアプリクライアントの有効なIDプロバイダとしてLoginWithAmazonを選択しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/766bbaba-cfb3-abb1-b260-506fc6d1c010.png)

これで、設定は完了です。

# Amazonアカウントでログインしてみる

これで、さきほどのCognitoのアプリクライアントでログインすると、選択肢にAmazonが増えています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/7abdaaa5-505d-148e-e0e8-3e169206af2f.png)

選択すると、Amazonのページに飛んでログインを促されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/d2ee3b6b-ae44-aa26-4ac9-11039a17192a.png)

ログインが完了すると、選択したresponse_typeによって、認可コードかアクセストークンが返ってきて認証完了となります。

Cognitoのユーザを見ていると、接頭辞でLoginWithAmazon_と付いたユーザが増えているのがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261826/c4f89d82-56cf-f7d0-4029-295e80cf7cfb.png)

以上
リモートワークでのチームビルディングのすすめ

# はじめに
コロナの影響で現状ほぼリモートワークで業務を行っています。
エンジニアという職業はリモートワークという環境にすんなり馴染める職業ではないでしょうか。
しかし、今年の新卒とはほぼ顔を合わせて業務することなくスタートし、
オフィスでの席は隣であるにも関わらず実際に会ったのは数回という状況です。
そんな中でもチームの良さを最大限に発揮し、成果を最大化する
チームビルディングのおすすめを紹介したいと思います。
![zaitaku_telework_woman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210436/c0410077-eac7-e3b6-6ce4-84d31e02fb48.png)

# 1. コミュニケーションの活性化
チームで仕事をしていくにあたり、コミュニケーションはとても大切。
チームメンバーは常にzoomなどのツールを利用して繋がってる状態にし、
いつでも話しかけられる状態を作る。
また、朝会など毎日同じ時間にミーティングを開き情報を共有することも
大切です。その際カメラはONにすることをおすすめします。
顔を合わす機会が少ないからこそお互いの状況を察知しやすい環境を意識して
作ることが必要です。表情を見て話すことでメンバーとの仲間意識を感じられます。
最初は躊躇することもありましたが、今では雑談もできるくらい
自然にやり取りできていると感じています。
![kaiwa_communication_business.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210436/4d407e02-4245-7de0-87e6-0ffeb491f599.png)

# 2. 情報の鮮度を意識する
気軽に声がかけられないからこそ、情報の鮮度が大切。
共有事項はできるだけ早くメンバーへ伝えるようにし、コミュニケーションの
活性化を図るようにする。また、できるだけ早く伝えることでメンバーの不安要素も
取り除けると思います。


# 3. 共有したい事項は明文化する
顔を突き合わせてのコミュニケーションが難しくなっているからこそ
チャットワークやメールなど文字でのやり取りが増えてきています。
その為、チームで共有したい認識や知識はできるだけ明文化しておくこと。
これにより属人化も防げるようになります。


# 4. チーム目標はみんなで考え、チーム内での役割を明確化する
リモートワークの状況下では、「見て覚えろ」的なOJTができなくなりつつあり、
成果としても作業の経過などが見えにくくなり、定性的な判断がしにくくなり定量的
に判断されることがより多くなってきているように思います。
その為同じ目標をしっかり共有し、役割を明確化することでメンバーが主体的に動くことができ、
当事者意識を持つことができます。
また、1on1を定期的に行うことで心理的安全性を確保しつつ効果的な育成やサポートを行うことができます。
こういった環境を作り出すことで成果を最大化することができると思います。
![mokuhyou_tassei_woman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210436/ff529c41-bd36-1945-3d21-5acc5e3db65a.png)



# まとめ
リモートワークにおけるチームビルディングとはコミュニケーション不足をどのように
解消していくかという取り組みだとも言えると思います。
コミュニケーション不足を解消し、互いの多様性を認めて協力し合う関係性を築くことが
大切になってくると思います。
Laravel で array 型のリクエストパラメータのバリデーション

![PHP-7.2](https://img.shields.io/badge/PHP-7.2-brightgreen) ![Laravel-6.x](https://img.shields.io/badge/Laravel-6.x-brightgreen)

Laravel で array 型として扱われるようなリクエストパラメータのバリデーションの記述に関するメモです。

## 実装

下記の例の **Request Parameter** にはリクエストパラメータを `$request->all()` で取得したときに得られる array を記述します。
**Validation** にはとバリデーションルールを表す array を記述します。

それぞれの変数 `$data` と `$rules` に対して `Validator::validate($data, $rules)` を Tinker 等で実行すればバリデーションが効いているか試すことができます。

### 例1. key を省略した array

- Request Parameter

```php
$data = [
    'article_ids' => [1, 23, 456],
]
```

- Validation

```php
$rules = [
    'article_ids' => 'required|array',
    'article_ids.*' => 'int',
];
```

### 例2. key と value の組で構成された array

- Request Parameter

```php
$data = [
    'ingredients' => [
        'egg' => true,
        'peanuts' => false,
        'others' => 'water'
    ],
];
```

- Validation

```php
$rules = [
    'ingredients' => 'required|array',
    'ingredients.egg' => 'required|boolean',
    'ingredients.peanuts' => 'required|boolean',
    'ingredients.others' => 'string',
];
```

### 例3. ネストした array

- Request Parameter

```php
$data = [
    'person' => [
        ['first_name' => 'Taro', 'last_name' => 'Tanaka'],
        ['first_name' => 'Hanako', 'last_name' => 'Yamada'],
    ],
];
```

- Validation

```php
$rules = [
    'person' => 'required|array',
    'person.*.first_name' => 'required_with:person.*.last_name|string',
    'person.*.last_name' => 'required_with:person.*.first_name|string',
];
```

## 参考

- [Validation \- Laravel \- The PHP Framework For Web Artisans](https://laravel.com/docs/7.x/validation)
- [php \- How to validate array in Laravel? \- Stack Overflow](https://stackoverflow.com/questions/42258185/how-to-validate-array-in-laravel)