OmniAICreator/Qiita-1.07M huggingface dataset:
JUnit5でテストするために

# コード（備忘録）
プロジェクトの方のgradleファイルは初期状態のまま．

```gradle:build.gradle(ProjectName)
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    ext.kotlin_version = '1.3.71'
    repositories {
        google()
        jcenter()
        
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.6.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

```

モジュール（app）の方のgradleファイルに数行追加する．

```gradle:build.gradle(app)
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.2"

    defaultConfig {
        applicationId "com.example.testapplication"
        minSdkVersion 22
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    // for junit5
    testOptions {
        unitTests.all {
            useJUnitPlatform()
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.core:core-ktx:1.2.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    // for junit5
    testImplementation "org.junit.jupiter:junit-jupiter-api:5.6.2"
    testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.6.2"
}
```

追加したのは

```gradle
testOptions {
    unitTests.all {
        useJUnitPlatform()
    }
}
```

```gradle
testImplementation "org.junit.jupiter:junit-jupiter-api:5.6.2"
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.6.2"
```

これだけ．これでJUnit5が使える．
IBM Cloud CLI: Cloud Foundry CLIの追加方法 (v1.00以降)

# IBM Cloud CLI内からCloud Foundry CLIコマンド（ibmcloud cfコマンド）を実行するには？
IBM Cloud CLI は、IBM Cloud のリソースを管理するためのコマンド・ライン・インターフェースを提供します。

今まではIBM Cloud CLI の導入とともに一緒に導入されていたCloud Foundry CLIが、v1.00から導入されなくなりました。

今後IBM Cloud CLI内からCloud Foundry CLIコマンド（`ibmcloud cf`コマンド）を実行したい場合は、別途以下のコマンドで導入してから使用します：

```shell-session
ibmcloud cf install
```

尚、Cloud Foundry CLIが削除された代わりに、 v1.00からIBM Cloud Developer Tools (`ibmcloud dev`コマンド)がデフォルトで導入されるようになったとのことです。

以上です。



# 参考

- [リリースv1.0.0](https://github.com/IBM-Cloud/ibm-cloud-cli-release/releases/tag/v1.0.0)
- [スタンドアロン IBM Cloud CLI のインストール](https://cloud.ibm.com/docs/cli?topic=cloud-cli-install-ibmcloud-cli&cm_mc_uid=99911192173715659206015&cm_mc_sid_50200000=19363221565920601520&cm_mc_sid_52640000=15564161565920601531)
- [IBM Cloud CLI および Developer Tools (ibmcloud dev) コマンドの概説](https://cloud.ibm.com/docs/cli?topic=cloud-cli-getting-started&cm_mc_uid=99911192173715659206015&cm_mc_sid_50200000=19363221565920601520&cm_mc_sid_52640000=15564161565920601531#overview)
最初に一回だけ動くuseEffect（componentDidMount的な）

componentDidMountと同じことがしたい。

第二引数に空の配列を渡す。

```react
const [count, setCount] = useState(0);
useEffect(() => {
  console.log(count);
  setCount(count + 1);
}, []);
```

こうなる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188872/a471fba4-8a7b-df2e-a793-7aa64d30aded.png)

ハッピー。
スクロール位置でクラスを付与してくれるDelighters

<img width="962" alt="delighters.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150806/f65dce54-581e-778b-6a7b-d6fa0daf1c59.png">
[Delighters公式サイト](https://q42.github.io/delighters/)

スクロール位置によって、表示要素に動きを付けたい際利用できるライブラリです。
散々流行った今更のパララックスかもしれませんが、まだちょっと需要はありそうです。

この演出をGoogle先生に聞いてみたところ、jQueryを利用したライブラリばっかりがヒットしてしまいました:cry:
Delightersはピュアなjsで実装できる貴重なライブラリだと思います。

## Delighters Good Points :point_up:
◉ 軽量
◉ レスポンシブ対応 - タブレット、スマホもどんとこい！！
◉ スクロール位置で指定した要素にクラスが付与されるだけ。導入がシンプルで簡単。
◉ jsによる動きの定義がない。使い慣れたCSSを利用してこちらで細かな設定が自由に定義できて嬉しい。

## Delighters 使い方 :point_up:
ざっくりとした使い方です。
※慣れてる方は飛ばして下さい。[Delighters公式サイト](https://q42.github.io/delighters/)のUsageをみていただくのが一番です。


:one: scriptファイルを読み込む
[公式のGitHub](https://github.com/Q42/delighters)から落としてこれます。

```html
<script type="text/javascript" src="delighters.js">
```

:two: 動かしたい要素のhtmlに`data-delighter`という属性を追加する

```html
<div class="xxxクラス名は自由" data-delighter>
```

:three: 自分で自由にスタイルシートで動きをつける
センスが出る腕の見せどころw ダサくなりたくない…
アニメーションの設定をします。ここでは公式のクラスを引用してます。

```css
/* delighters.jsが読み込まれると、 [data-delighter] 属性を持っている要素それぞれに .delighter が付与されます。*/

.foo.delighter {
  transition: all .3s ease-out;
  transform: translateX(-100%);
  opacity: 0;
}

/* スクロールしてターゲットが画面上部（初期設定）から75%（初期設定）の位置にきた際 .started が設定されます。*/

.foo.delighter.started {
  transform: none;
  opacity: 1;
}

/* スクロールしてターゲットが画面下部（初期設定）から75%（初期設定）の位置にきた際 .ended が設定されます。 */

.foo.delighter.started.ended {
  border: solid red 10px;
}
```

## Delightersカスタマイズ :point_up:
属性名や、スクロール位置で設定されるクラス名、上部もしくは下部からどれくらいの位置にするかなど変更できるそうです。

```js
options = {
  attribute:  'data-delighter',
  classNames: ['delighter', 'started', 'ended'],
  start:      0.75, // default start threshold
  end:        0.75, // default end threshold
  autoInit:   true  // initialize when DOMContentLoaded
}
```
【GitHub】Deploy keys追加したのに、git cloneするとUsername聞かれる件

# 結論
clone URLの指定が間違っています。

:heavy_multiplication_x: https://github.com/account_name/repository_name.git (Clone with HTTPS)
:o: git@github.com:account_name/repository_name.git (Clone with SSH)

Clone with HTTPSではなく、Clone with SSHを使いましょう。

![github.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117180/58ac8155-6d72-f464-58f9-621f597d3d30.png)
Pythonの基本文法をJupyter Labで書いてみた

## Pythonの基本文法


```python
3+3
```




    6




```python
3-2
4*5
6/2
7%2 #最後に実行された行の返り値のみ
```




    1




```python
type(1)
```




    int




```python
type(1.0)
```




    float




```python
type(3.14)
```




    float




```python
type('string')
```




    str




```python
'hello'[2]
```




    'l'




```python
'hello'[1:3]
```




    'el'




```python
'hello{}'.format('world')
```




    'helloworld'




```python
print('{one}{two}'.format(one='hello', two='world'))
```

    helloworld


### List


```python
list_out = [1,2,'three']
list_out
```




    [1, 2, 'three']



list_in = ['one', 'two', 3]
list_out.append(list_in)
print(list_out)


```python
list_out[1]
```




    2




```python
list_out[3][1]
```




    'two'




```python
list_out = [1,2,'three']
```

Dictionary


```python
dict = {'key1':'value1', 'key2':2}
```


```python
dict['key1']
```




    'value1'




```python
dict = {'key1':[1,2,'value1']}
```


```python
dict['key1'][2]
```




    'value1'




```python
dict = {'key_out':{'key_in':'value_in'}}
```


```python
dict['key_out']
```




    {'key_in': 'value_in'}




```python
dict = {'key1':'value2', 'key2':2}
dict['key3'] = 'new_value'
```


```python
dict
```




    {'key1': 'value2', 'key2': 2, 'key3': 'new_value'}



### Tuples


```python
list1 = [1,2,3,4,5]
tuple1 = (1,2,3,4,5,6)
```


```python
list1
```




    [1, 2, 3, 4, 5]




```python
tuple1
```




    (1, 2, 3, 4, 5, 6)




```python
list1[1] = 10 #listは変更可
```


```python
list1
```




    [1, 10, 3, 4, 5]




```python
tuple1[1] = 10 #tupleは変更不可
```


    ---------------------------------------------------------------------------

    TypeError                                 Traceback (most recent call last)

    <ipython-input-38-df5023792f06> in <module>
    ----> 1 tuple1[1] = 10 #tupleは変更不可
    

    TypeError: 'tuple' object does not support item assignment


### 関数


```python
result_list=[] #頻出
for i in range(0,4):
    result_list.append(i*10)
```


```python
result_list
```




    [0, 10, 20, 30]




```python
[i*10 for i in range(0,4)]
```




    [0, 10, 20, 30]




```python
i=0
while i<5:
    print('{} is less than 10'.format(i))
    i+=1
```

    0 is less than 10
    1 is less than 10
    2 is less than 10
    3 is less than 10
    4 is less than 10


### lambda関数


```python
def function_name (param1, param2):
    print('Do something for {} and {}.format(param1, param2)')
    
    return 'param1' + 'and' + 'param2' 
```


```python
param1 = 'something1'
param2 = 'something2'
output = function_name(param1, param2)
```

    Do something for {} and {}.format(param1, param2)



```python
def get_filename (path):
    return path.split('/')[-1]
```


```python
get_filename('/home/school/pet/corona')
```




    'corona'




```python
lambda path: path.split('/')[-1]
```




    <function __main__.<lambda>(path)>




```python
x = lambda path: path.split('/')[-1]
```


```python
x('/home/school/pet/corona')
```




    'corona'
ジェネリックのクラスとメソッド


````
//この例ではClassSampleクラス名に続けて「<T>」を記述しています。
//この「<T>」を記述することで、データ型の指定がObject型からT型(型変数)に変更されます。

import java.util.*;

class ClassSample<a>{
    private a t;
 
    public ClassSample(a t){
        this.t = t;
    }
 
    public a getT(){
        return t;
    }
}



public class Main {
    
    //ジェネリックメソッド
    private static <T> T getT(T t){
        return t;
    }


    public static void main(String[] args) throws Exception {
        // Your code here!
        
         // String型として利用可能 ＜a型がストリング型に置き換わるイメージ＞
        ClassSample<String> cs1 = new ClassSample<String>("Hello");
        String str = cs1.getT();
        System.out.println(str);
 
        // Integer型として利用可能
        ClassSample<Integer> cs2 = new ClassSample<Integer>(1);
        Integer i = cs2.getT();
        System.out.println(i);
        
        
         // ワイルドカードを使用 Number型として利用可能
        ClassSample<? extends Number> cs3;
        cs3 = cs2;
        Number n = cs3.getT();
        System.out.println(n);
        
        // ワイルドカードを使用 Object型として利用可能上記の逆
        ClassSample<Number> cs4 = new ClassSample<Number>(1);
        ClassSample<? super Integer> cs5;
        cs5 = cs4;
        Object o = cs5.getT();
        System.out.println(o);
        
        // ジェネリックメソッドの実行　なんでも引数OK
        //ジェネリクスはメソッドに対しても使用することができます。
        //メソッドを定義する際に戻り値の型名であるTの前に「<T>」句を記述する必要があります。
        //こちらもサンプルコードでみていきましょう
        String str = getT("Hello");
        System.out.println(str);
 
        Integer i = getT(1);
        System.out.println(i);

        
        
    }
}
AD,DNS,DHCP構築(DNS編)

#はじめに
[前回](https://qiita.com/I_S-657/items/58e7c971d6da838226c4)の続きです
これからWindowsを使った何回に別けてサーバの構築について紹介していきたいと思います。
備忘録として用意しようとしまいすが、なるべく皆さんにわかりやすくしていきたいと思っております。

これから書く内容ですがAWS上にWindowsServerを構築してそこで「ActiveDirectory」「DNS」「DHCP」を構築していきます。
別々ではなく全て同居環境となります。

AWSという都合上全て英語になりますが、やっていることは変わらないのでその都度訳す等していただければとおもいます。また基本はGUIでの操作で行ます。

#環境
AWS
WindowsServer2019

#やりたい構築
ActiveDirectory
DNS
DHCP

#DNS
ToolをクリックしてDNSをクリック
<img width="1280" alt="スクリーンショット 2020-04-14 13.39.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608443/27fbeedc-d6e4-c4b4-fe2e-4693daab815f.png">

なまえを右クリックして「New Zone」をクリック
<img width="1280" alt="スクリーンショット 2020-04-14 14.02.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608443/fc3b955f-ffc5-ebb5-17fb-dcbcae821634.png">

「Next」をクリック
<img width="1280" alt="スクリーンショット 2020-04-14 14.03.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608443/485f2f83-cd00-9644-664a-b00818581823.png">

「Primary zone」
<img width="1280" alt="スクリーンショット 2020-04-14 14.03.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608443/b4180d03-d078-6c2c-0f22-7c45d78b7210.png">

変更が必要なら変更して「Next」
<img width="1280" alt="スクリーンショット 2020-04-14 14.05.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608443/65c641b7-b617-4a6b-4a7d-fa3061b18f8d.png">

選択して「Next」
<img width="1280" alt="スクリーンショット 2020-04-14 14.06.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608443/2245efb8-b97e-0651-243b-03f42e396447.png">

名前を決めて「Next」
<img width="1280" alt="スクリーンショット 2020-04-14 14.06.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608443/12193efe-b37e-2d6b-588c-4df43bb509a8.png">

目的にあえあせて選択して「Next」
<img width="1280" alt="スクリーンショット 2020-04-14 14.07.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608443/0a32259c-4132-ca54-82ab-739fbb53df3a.png">

「Finish」
<img width="1280" alt="スクリーンショット 2020-04-14 14.07.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608443/3c72e389-933f-415e-254c-23f9cf036302.png">

#まとめ

いかがだったでしょうか
こんどは細かい設定なども触れていきたいですね。
LaravelでDBのレコードを削除する4つの方法

どれもOKでした！

## whereで絞り込んで、delete()で削除
### new して削除

```php
$db_data = new Product;
$db_data->where('id', 1)->delete();
```
### new しないで削除

```php
Product::where('id', 1)->delete();
```


## idで一意に絞り込んで、destroy()で削除
### new して削除
```php
$db_data = new Product;
$db_data->destroy(1);
```

### new しないで削除

```php
Product::destroy(1);
```
【SQL】SQLコマンド入門

#はじめに
学習中の備忘録です。

#概要
* データベースの表示・選択
* データの登録・更新・削除

#前提
MYSQL

#データベースの表示・選択
mysqlに接続

```:ターミナル
% mysql -u root
```
ターミナル表示
<img width="624" alt="9f2a7f2e005c30dc50d3f50f2a84ff73.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568337/6352d770-a294-6824-9ae2-69da3a94f274.png">


###データベース一覧を表示

```
SHOW DATABASES;
```

```:ターミナル
mysql> SHOW DATABASES;
```
ターミナル表示
<img width="558" alt="61ee7bb56e6c9c19f86316276ab8ded2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568337/7acfdbf3-949d-775a-54c6-a6035c24767a.png">


###データベース選択

```
USE データベース名;
```

画像にはありませんがmy_hobby_app_developmentというデータベースを選択します。

```:ターミナル
mysql> USE my_hobby_app_development;
```

ターミナル表示
<img width="537" alt="4a099ecd284862d872bc925fa64cb25d.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568337/fd9abc6d-e7aa-1e2b-9446-f3eaae2419d7.png">


###テーブルを表示

```
SHOW TABLES;
```

```:ターミナル
mysql> SHOW TABLES;
```
ターミナル表示
<img width="525" alt="fe9bd1c78cc643c5036b45f34e24d095.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568337/3f3e5524-efec-2a71-5887-666d070d8d7e.png">

###カラムを表示

```
SHOW columns FROM テーブル名;
```

postsテーブルのカラムを表示します。

```:ターミナル
mysql> SHOW columns FROM posts;
```
ターミナル表示
<img width="685" alt="dcca8a02de58d5ea7edd834100de8c82.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568337/62a4c7f9-3446-4a20-0233-3c0dbd9dc1fd.png">

#データの登録・更新・削除
##ALTER TABLE文
カラムの追加・修正・削除はすべてテーブル構造の変更です。 そのためSQL文は共通して、ALTER命令を用いたALTER TABLE文を使用します。
実行時は以下のような文法で使用します。

```
ALTER TABLE テーブル名 操作
```
###データの登録

|型名|保存できる値|
|:--|:---------|
|INT|数字|
|VARCHAR(M)|最大M文字の文字列|

カラムを1つだけ追加する場合

```
ALTER TABLE テーブル名 ADD カラム名 カラムの型;
```
カラムを複数追加する場合

```
ALTER TABLE テーブル名 ADD (カラム名 カラムの型, ……);
```
postsテーブルにnumカラムをint型で追加

```:ターミナル
mysql> ALTER TABLE posts ADD num int;
```
ターミナル表示
<img width="532" alt="b35777ea94fee9776dc7183ad045715f.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568337/9d17a0f2-8f4e-de3c-155c-8ef5663595b2.png">


###データの更新

```
ALTER TABLE テーブル名 CHANGE 古いカラム名 新しいカラム名 新しいカラムの型;
```
numカラムをnumberカラムに更新

```:ターミナル
mysql> ALTER TABLE posts CHANGE num number int;
```
ターミナル表示
<img width="544" alt="c85117cc6d75f3083d7a9cf4d921dee9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568337/f0e9efab-cbc3-7ef1-b830-b481213eac6d.png">

###データの削除

```
ALTER TABLE テーブル名 DROP カラム名;
```

postsテーブルのnumberカラムを削除

```:ターミナル
mysql> ALTER TABLE posts DROP number;
```

ターミナル表示
<img width="613" alt="ee8ebf9710a93d4a3bd6a3d09c74ba48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568337/13112277-602f-443c-c90c-cf34ef547436.png">

#まとめ
Railsでアプリケーション作成してる段階ではあまり登場しませんが、適宜追記するかもです。
Shoulda::Matchers::ActiveRecord::ValidateUniquenessOfMatcher::ExistingRecordInvalid ( #rspec )

# Answer

Create some record before test case
```rb
require "rails_helper"

RSpec.describe User, type: :model do
  describe "validations" do
    # Some way create one record
    before do
      User.create(name: "Alice #{rand(99999999)}")
      # FactoryBot.create :user
    end

    it { should validate_uniqueness_of(:name) }
  end
end
```

# Error

```rb
     Shoulda::Matchers::ActiveRecord::ValidateUniquenessOfMatcher::ExistingRecordInvalid:
       validate_uniqueness_of works by matching a new record against an
       existing record. If there is no existing record, it will create one
       using the record you provide.

       While doing this, the following error was raised:

...

       The best way to fix this is to provide the matcher with a record where
       any required attributes are filled in with valid values beforehand.
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3071








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
同じURLにルーティングする際にngOnInitを呼び出すようにする

Angularで同じURLにルーティングするとngOnInitメソッドは呼び出されない

app-routing.module.ts

```
const routes: Routes = [
  { path: 'sample', component: SampleComponent }
};

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }
```

sample.component.ts

```
@Component({
 selector: 'app-sample',
  templateUrl: './sample.component.html',
  styleUrls: ['./sample.component.css']
})
export class SampleComponent implements OnInit {
  constructor(private router:Router) {}

  //2回目以降は呼び出されない
  ngOnInit(): void {
  }

  //自分自身へ遷移する
  click(event:any) :void {
　　//同じURLへ遷移
    this.router.navigate(['/sample']);
  }
}
```

これだと同じURLへ遷移して同一画面上の値を更新しようとしても更新されない。
この場合はapp-routing.module.tsとsample.component.tsを以下のように変更する

app-routing.module.ts

```
const routes: Routes = [
  { path: 'sample', component: SampleComponent }
};

@NgModule({
  //同じURLのときはreloadするように指定
  imports: [RouterModule.forRoot(routes, { onSameUrlNavigation: 'reload' })],
  exports: [RouterModule]
})
export class AppRoutingModule { }
```

sample.component.ts

```
@Component({
 selector: 'app-sample',
  templateUrl: './sample.component.html',
  styleUrls: ['./sample.component.css']
})
export class SampleComponent implements OnInit {
  constructor(private router:Router) {
    //shouldReuseRouteをfalseに設定
    this.router.routeReuseStrategy.shouldReuseRoute = function () {
      return false;
    };
  }

  //2回目も呼び出される
  ngOnInit(): void {
  }

  //自分自身へ遷移する
  click(event:any) :void {
　　//同じURLへ遷移
    this.router.navigate(['/sample']);
  }
}
```

※もしかしたらshouldReuseRouteの設定だけでうまくいくかもしれないが、自分は上記で動作できた。
EC2 EBS ボリューム拡張

手順メモ
# EC2に接続されてるボリュームをAWS管理画面上から拡張
管理画面で実行
今回は8GB -> 30GB に拡張

# 現状をdf
```bash
# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        992M   56K  992M   1% /dev
tmpfs          1001M     0 1001M   0% /dev/shm
/dev/xvda1      7.8G  7.5G  173M  98% /
```

# lsblk で確認

```bash
# lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  30G  0 disk
└─xvda1 202:1    0   8G  0 part /
```

# growpart実行
## growpart - extend a partition in a partition table to fill available space
[growpart manページ](https://www.systutorials.com/docs/linux/man/1-growpart/)

```bash

# growpart /dev/xvda 1
# growpart /dev/xvda 1
CHANGED: disk=/dev/xvda partition=1: start=4096 old: size=16773086,end=16777182 new: size=62910430,end=62914526
```

# resize2fs で拡張実行
```bash
# resize2fs /dev/xvda1
resize2fs 1.42.12 (29-Aug-2014)
Filesystem at /dev/xvda1 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 2
The filesystem on /dev/xvda1 is now 7863803 (4k) blocks long.
```

# dfで確認
```bash
# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        992M   56K  992M   1% /dev
tmpfs          1001M     0 1001M   0% /dev/shm
/dev/xvda1       30G  7.5G   22G  26% /
```
完了
複数のコミットを一括でcherry-pickする

# 複数の連続したコミットをcherry-pickしたい
## コマンド
```
git cherry-pick {始点となるコミットの１つ前のコミットハッシュ}..{終点となるコミットハッシュ}
```
コミットハッシュを`..`でつなぐことで、間のコミットがcherry-pickされる

# cherry-pickしたい1つ前のコミットを指定することに注意
始点のコミットハッシュは、cherry-pickの対象に含まれないことに注意。

- commitA
- commitB
- commitC
- commitD

のうちcommitBからcommitDをcherry-pickしたい場合

```
git cherry-pick {commitA}..{commitD}
```
となることに注意。

```
git cherry-pick {commitB}..{commitD}
```
としてしまうと、commitCとcommitDのみがcherry-pickされてしまう。
【Docker】docker-composeコマンドを実行するまで

# 概要
docker-composeを実行するまでにいろいろ困ったので備忘録的に残しておこうと思います。

# 1. docker-compose: Command not found
docker-composeコマンドがないよと言われました。
今回の旅の始まりです。

# 2. curl: option -s`-`uname: is unknown

`docker-compose` をインストールするために、下記コマンドを実行するのですが

```
$ curl -L https://github.com/docker/compose/releases/download/1.3.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
```

```
curl: option -s`-`uname: is unknown
curl: try 'curl --help' or 'curl --manual' for more information
```

などと言われます。
仕方ないので、個別で `uname -s` と `uname -m` を実行し、埋め込みました。

```
$ curl -L https://github.com/docker/compose/releases/download/1.3.1/docker-compose-Darwin-x86_64 > /usr/local/bin/docker-compose
```

無事成功。

```
chmod +x /usr/local/bin/docker-compose
```

続いて、こちらも成功します。

# 3. pip: Command not found
pipがないと言われました。
どうせ、brewでinstall出来るだろと叩いてみると

```
$ brew install pip
```

pipはpythonの中にあるでと言われました。
しかし、pythonは既にインストールしている！

versionを調べてみると

```
$ python --version
```

```
2.7.16
```

古い！

[pipは3.4以降](https://www.python.jp/install/ubuntu/pip.html)に付属されているので入っていなかったと言うわけです。

# 4. pipが古い！

pyenvをインストールします。

```
$ brew install pyenv
```

```
$ pyenv install 3.7.7
$ python global 3.7.7
$ eval "$(pyenv init -)"
```

無事、更新出来たのでpipが入っていました。

ここで

```
$ sudo pip install -U docker-compose
```

でインストールできるのですが、最後に

```
WARNING: You are using pip version 19.2.3, however version 20.0.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
```

と出たのでpipをupgradeしておしまい。
ちょい長かった。。。

# 参考にした記事
https://www.shibuya24.info/entry/docker_compose
https://qiita.com/Kohey222/items/19eb9b3cbcec9b176625

誰かのお役に立てば。
作業メモ："It's a Trap!!" centos6 samba環境構築においてsmb1を無効にする。

ここ最近の遠隔・在宅ワーク対応につき、以前稼働していた在宅ワーク者用のLinuxサーバーを、念のため再整備することにした。
とりあえず、sambaによるファイルサーバーとしての環境を軽く整えようとしたとき、**smb1プロトコルの取り扱いで大いに罠にはまった。**
作業メモとして、以下を書き留めることにする。

環境は
>サーバー：centos 6.10
>ローカル：windows10
## sambaをインストールする
以下ページに従って、sambaをインストールし、準備を整えた。
https://daichan.club/linux/573
しかし私の場合、**大体の場合これだけではうまくいったことがない。**
## ファイヤーウォールを設定する
必要なポートが解放されてない場合、sshとかpingは通ってもsambaはつながらない。
以下ページを参考を参考にiptablesを修正した。
https://futurismo.biz/archives/1390/#ファイアウォールの設定
## sambaにつながらない・ナンデェ
うーん。昔はここまでの設定でうまくいったのに。
なんでかsambaにアクセスできない。
いろいろ調べているうちに、以下ログがsambaから出力されていることに気が付いた。

`[2020/04/13 18:59:00.381236,  0] smbd/negprot.c:705(reply_negprot)
  No protocol supported !`
なに「No protocol supported !」だ？いったいどうした
いろいろ調べているうちに、**smb1プロトコルが原因**である事に気が付いた。

以下参考記事
「突然NASが使えなくなった原因はSMB1.0の無効化だった！」
https://www.nedia.ne.jp/blog/tech/2018/09/11/12587
## smb1を無効化したいんすよ…してくだちい…
では、ということで、以下記事を参考にsmb1を無効化することで対応しようと試みる。
「windows10にてsambaのファイルサーバーにアクセスできなくなった件について」
https://doruby.jp/users/honda/entries/windows10にてsambaのファイルサーバーにアクセスできなくなった件について

…でも、できない。
ログにはいまだに`No protocol supported !`の表示が。
**なんでやねん。**
## It's a trap!! Share設定だと強制的にsmb1になるんかい
絶望しかけていた時、以下の記事に助けられました。
「Samba 3.6.0のSMB2ではまる」
https://tech.virtualtech.jp/entry/tooyama/1041

記事によると…、
>SMBの認証モードの設定で「security = share」と設定すると、SMB2プロトコルで通信してくれないようです。

**…えっそうなの！？**
shareをuserに変更したら、何事もなかったかのようにローカルからsambaに接続ができました。

罠にはまった…。。
マークダウン記法って、いつ使うの？②

引き続き、第二弾！

前回までは、マークダウンの必要性の

#### 1.要点をつかみやすい

まで述べましたね。

では続きから。

#### 2.自分の思考が整理される

プログラミング学習されてる方なら共感できると思いますが、学習途中で壁にぶち当たったとき、頭でずーっと考え込むより、**紙に書くと**スッキリ考えられませんか？

脳内でフルに使ってるメモリを、紙に分け与えると、その分容量があいて新たに考えるスペースが生まれる感覚。

この現象とほぼ一緒でマークダウンを使って表現しようとすると、自分が伝えたいことの```優先順位```、```どうまとめるか```、などを先に考えちゃいます。
しかも太字にしたり段落を使ったりすることで、```自分の思考が可視化される```ので、より深い思考ができます。

とまあ、深い思考が求められる*エンジニア*を目指しているなら、使わない理由はないですね。

~~と言いつつこの記事ではほとんど使っていませんがw~~

私も使いたてホヤホヤなので、どんどん使っていきます！

使うならやはり、```Qiita```がおすすめです。投稿画面の右上の**？**マークをクリックすると優しくマークダウンを教えてくれますもん。

今後はもっと役立つ**技術的な記事**を書きますので、よろしくお願いします！
（編集中）API Gateway


- API Gatewayとは、Web API（HTTP／HTTPSベースで実現するAPI）の一種。
- リージョンレベルでデプロイされるサービス（S3と同じ）
- サーバレスアーキテクチャ（インフラ管理は不要）
- 呼び出し回数によって料金が発生


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/16a85610-432a-b000-5353-f481d78d74f1.png)



## そもそもRESTとは
　RESTとはRepresentational State Transferの略称で、下記のRESTの考え方に従って実装されたAPIをRESTful API（またはREST API）と呼ぶ。

- ***HTTPのメソッド（命令）***でデータ操作種別（CRUD）を表す
    - POSTメソッドであれば作成（Create）、GETメソッドであれば参照（Reference）、PUT／PATCHメソッドであれば更新（Update）、DELETEメソッドであれば削除（Delete）を表す
ステートレスにする
- 前回のAPIコール結果にかかわらず同じ値を戻す。例えば合計1000件のデータが存在し、1回目のAPIコールで100件まで取得したとしても、その状態は考慮せず、2回目のAPIコールでも同じ100件を戻すという挙動だ
- URIで操作対象のリソースを判別可能にする
  - RESTでは、APIを介して操作する対象を「リソース」と呼ぶ。例えば「ユーザー」というリソースを表すために「users」というリソース名を付与することがある。ユーザーIDが「1000」のユーザー情報を取得したい場合、下記のようなURIフォーマットでURIを生成し、操作可能とする
- レスポンスとしてXMLもしくはJSONで操作結果を戻す
  - 適切にデータ操作できた場合、データ記述言語のXMLもしくはJSONでデータ操作結果を記述し、HTTPのレスポンスボディーに含め、APIコール元に戻す


　Web APIが爆発的に広がるきっかけになったのがスマートフォンアプリではないかと思います。スマートフォンアプリはそれ単体で使われるものは多くなく、何らかの形でインターネット上のサーバとデータの送受信を行っています。そうした時にサーバ側はWeb APIを用意し、アプリからはWeb APIを呼び出します。一般的に外部の開発者に向けて公開されているものがWeb APIと思われますが、こういったそのアプリ向けだけの専用かつ非公開なWeb APIはとても数多く存在します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/cdb74baf-1572-62ae-4b1f-5ee319491ac7.png)






![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/a3aa95a7-d631-0cd5-9938-49a011837722.png)




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/084ed46d-461c-e231-6f36-4503fc94b746.png)




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/9aaa9ecc-d359-4644-7c7c-8c3e7ec3244f.png)




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/d300a36f-2951-c40d-54d4-83263d3beb57.png)


開発基盤と問わずに実行
リストのループ内で要素の書き換え（Python）

こんにちは。
Python で、リストのループ内で、下記のように ```a = [-1]``` では、元のリストを書き換えませんが、```a[0] = -1``` では書き換えます。

```python
alist = [[0], [0], [0]]
for a in alist:
  a = [-1]

print(alist)  # ==>  [[0], [0], [0]]

for a in alist:
  a[0] = -1

print(alist)  # ==>  [[-1], [-1], [-1]]
```

```console
$ python3 -V
Python 3.7.7
```
Homebrewのdoctorで引っかかった話

## 背景
MacBookProを使っているのですが、Homebrewのdoctorコマンドに引っかかる珍しい現象が出たのでメモ代わりに残しておきます。

## 引っかかった内容(ログ)
```
brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!

Warning: Some installed formulae are missing dependencies.
You should `brew install` the missing dependencies:
 brew install openssl@1.1

Run `brew missing` for more details.
```

## 対処
依存関係に文句を言われている様なのでopensslのインストールを実行(@1.1をつけ忘れているけど…)
詳しくみるなら brew missing を実行しろと言われてますが…

## 対処ログ
```
brew install openssl
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 4 taps (homebrew/cask-versions, homebrew/core, homebrew/cask and adoptopenjdk/openjdk).
==> New Formulae
bcoin                      gobo                       pass-git-helper
beancount                  hsd                        semtag
confd                      inxi                       vroom
emacs-dracula              llvm@9                     wolfmqtt
git-remote-codecommit      minipro
==> Updated Formulae

--- 長いので省略 ---

==> Downloading https://homebrew.bintray.com/bottles/openssl@1.1-1.1.1f.catalina
==> Downloading from https://akamai.bintray.com/72/724cd97c269952cdc28e24798e350
######################################################################## 100.0%
==> Pouring openssl@1.1-1.1.1f.catalina.bottle.tar.gz
==> Caveats
A CA file has been bootstrapped using certificates from the system
keychain. To add additional certificates, place .pem files in
  /usr/local/etc/openssl@1.1/certs

and run
  /usr/local/opt/openssl@1.1/bin/c_rehash

openssl@1.1 is keg-only, which means it was not symlinked into /usr/local,
because macOS provides LibreSSL.

If you need to have openssl@1.1 first in your PATH run:
  echo 'export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"' >> ~/.bash_profile

For compilers to find openssl@1.1 you may need to set:
  export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib"
  export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include"

==> Summary
🍺  /usr/local/Cellar/openssl@1.1/1.1.1f: 8,057 files, 18MB


```

## 結果
もう一回doctorを実行

brew doctor
Your system is ready to brew.

という事で修復できたみたいですね。
多分二度と起こらないと思うのでメモ代わりに残しておきます。
tailsモードのlogstashで取り込むファイルを減らしたら、データ欠落が減った話

# 概要
前回：[elasticsearchでlogstashのupdateで起きる、conflictによるデータの欠落と解消](https://qiita.com/henatyokotraveler/items/04a0d7b9bcd8403ee92f)
でconflictは消えたけど、時々、更新漏れのデータが起きる。

elastiseachにもlogstashにも変なログは出ていない。
とりあえず、logstashがelasticsearchに入れる行為ができてないことがあるのではないかと推測。

# logstashのfileモジュールについて
自分の環境では、こんな感じでFileモジュールで取り込んでいる。

```
input {
  file {
      path => "/hogepath/hogedata*.csv"
      start_position => "beginning"
      tags => ["hogetype"]
  }
}
```

[公式のlogstashのFileモジュールのリンク](https://www.elastic.co/guide/en/logstash/current/plugins-inputs-file.html#plugins-inputs-file)を見てみると、
Fileを同時に開いておけるのは、デフォルト４０９５とあり、また、tailモードとreadモードがあると書いてある。
自分の環境では、
[max_open_files](https://www.elastic.co/guide/en/logstash/current/plugins-inputs-file.html#plugins-inputs-file-max_open_files)でデフォルトから大きく値を上げてある。

モードについては、公式にデフォルトはtailであると書いてある。
[mode](https://www.elastic.co/guide/en/logstash/current/plugins-inputs-file.html#plugins-inputs-file-mode)

>Value can be either tail or read.
The default value is tail.

また、tailモードで対象のファイルが更新がない時にクローズする間隔は、デフォルト１時間
[close_older](https://www.elastic.co/guide/en/logstash/current/plugins-inputs-file.html#plugins-inputs-file-close_older)
>Default value is "1 hour"

# 取り込み対象のファイルを分ごとの作成から、１日ごとの追記に変えてみた
自分の環境は毎分、新しいファイルをどんどんlogstash用のフォルダに作成していく方式。
上記の設定だと特に問題はなさそうだが、
毎分ごとにファイルを作成していたのを、
日次のファイルに追記する方式に変えたところ、ちょこちょこ出ていたデータ欠落がなくなった。
abstractの使い方とサンプル

abstractの使用方法

インターフェスとの大きな違いは、インターフェースは
コンセントのような物でインターフェースを使用しているクラスに当てはめる
事が出来る。


````
import java.util.*;
import java.util.ArrayList;
import java.util.List;
import java.lang.reflect.Field;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;



//インターフェースの継承
//インターフェースどうしも継承可能、その際にはメソッド等の定義は要らない


interface SampleValue extends SampleValue2{
     int i=100;
     int value();
     
}

interface SampleValue2{
      int value();
      int value2(int i);
}

class InterfaceTest implements SampleValue{
    public int value(){return 100;}
    public int value2(int i){return 1;}
    
}

//直接インスタンス化できない。
//★抽象メソッドは全てオーバーライドしなくてはならない。
//サブクラスでコンストラクタを記述する必要がある　抽象クラスではインスタンス化出来ない為

//抽象クラスは開発者にabstractでメソッドの強制が出来たり、中身を実装することで共通化が出来る
//例でいえば、車の人数、重量、スピードは全部３００キロの場合には人数と重量はabstractで定義
//スピードは共通化して、クラスに継承をさせれればスピードは共通、人数は車毎に自由に等が出来るので
//インターフェースと違う実装ができる。

abstract class Abstract
{
    abstract public void ABtest(int i);

    public Abstract(int num, String str) {
        System.out.println("引数int num = " + num + " / 引数String str = "+ str);
    }

    void nonAbstractMethod() {
        System.out.println("非抽象メソッドより出力");
    }

}

class AbstractTest extends Abstract{
    
     // サブクラスからスーパークラスのコンストラクタを呼び出し
    public AbstractTest(int num, String str) {
        super(num, str);
    }
    @Override
    public void ABtest(int i){}
    
}

public class Main {
    public static void main(String[] args) throws Exception {
        
    }
}
アノテーションの使い方

アノテーションの作成方法

アノテーションとは、マーカーインターフェースの代わりになる
ものです、例えばエラーチェックやアノテーションに設定してある
値等を取得する事等が出来ます。


```
import java.util.*;
import java.util.ArrayList;
import java.util.List;
import java.lang.reflect.Field;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

//テストアノテーションを作る
@Retention(RetentionPolicy.RUNTIME)
@interface Test{
    String name2();
}

//エラーチェック用アノテーション
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface NotNull{
    String message();
}

//エラーチェックプロセッサー
class PersonValidator{
    public static List<String> validate(Person target) throws Exception,IllegalAccessException{
        
    List<String> errors = new ArrayList<String>();
    
    Class<Person> clazz = (Class<Person>)target.getClass();
    Field[] fields =clazz.getDeclaredFields();
    
    for(Field field : fields)
    {
        field.setAccessible(true);
        NotNull annotation=field.getAnnotation(NotNull.class);
        
        if(annotation==null) continue;
        
        if(field.get(target)!= null) continue;
        
        String message=annotation.message();
        
        errors.add(message);
        
    }
    
    
    return errors;
    }
}


//エラーチェック
class Person{
    @NotNull(message="name is note null")
    private String name;
    
    public Person(String name)
    {
        super();
        this.name=name;
    }
    
    public String getName()
    {
        return name;
    }
}


@interface SampleValue{
    int value();
}

@interface ArraySample{
    int[] data();
}

@ArraySample(data={1,2,3})
class UseArraySample{
    
}


@SampleValue(100)
class UseSampleValue{
    
}



//テストアノテーション
@Test(name2="sample")
class t {
    private String name;
    
    public t(String name)
    {
        super();
        this.name=name;
    }
    
    public String getName()
    {
        return name;
    }
        
}


class Snple{
    private java.util.List<Object> list= new java.util.ArrayList<Object>();
    public void add(Object obj){
        if(obj instanceof Test){
            this.list.add(obj);
            System.out.println("Test");
        }
    }
}
public class Main {
    public static void main(String[] args) throws Exception {
        // Your code here!
        Class<t> clazz = t.class; //クラスの定義情報を取れる　アノテーションを取れる
        Test test=clazz.getAnnotation(Test.class);//テストクラスのアノテーション名を指定すると このアノテーションのインスタンスくれる
        
        if(test==null) {System.out.println("err"); return;}
        
        t item=new t(test.name2());
        System.out.println(test.name2());
        System.out.println(item.getName());
        
        //エラーチェック　バリデーションテスト
        Person P = new Person("jjjj");
        
        List<String> erros = PersonValidator.validate(P);
        
        if(erros.isEmpty())
        {
            return;
        }
        
        for(String message : erros)
        {
            System.out.println(message);
        }
        
        
    }
}
インターフェースのサンプル

参考　URLhttps://qiita.com/yoshinori_hisakawa/items/cc094bef1caa011cb739

```
public class Cash {
    public void bill() {
        System.out.println("現金でお会計いたします。"); 
    }
}


public class Staff {
    public static void main(String[] arg) {
        cash cash1 = new Cash();

        credit.bill();
    }
}

結果　現金でお会計いたします。

Cashクラスのbillメソッドは１００箇所で使われてます。
メインの１か所だけクレジットカードでお願いしますと変更したいです、
他の９９箇所は現金会計でお願いしますのままで影響が出ないように修正してみてください。


public interface Cashier {
    public void bill();
}

public class CreditCard implements Cashier{
    @Override
    public void bill() {
        System.out.println("クレジットカードでお会計をいたします。");
    }
}


Cash.java
public class Cash implements Cashier{
    @Override
    public void bill() {
        System.out.println("現金でお会計いたします。"); 
    }
}
そして店員はレジの会計を実施します。
この時Cashier#billを呼び出しているので、これが現金会計なのかクレジット会計なのかは
意識せずに使う事ができます。

Staff.java
public class Staff {
    public static void main(String[] arg) {
　　　　　Cashier credit = new Cash ();
        System.out.println("***現金対応***");
        credit.bill();

        Cashier creditCard = new CreditCard();
        System.out.println("***クレジット対応***");
        creditCard.bill();
    }
}
Android Studio内のターミナルでfishがエラーになって使えない

## 概要

Android Studio 内のターミナルを使おうとしたらエラーが出ていてfishが使えなかったので、それを直す方法を調べました。


## エラー

```
<E> fish: Unable to open universal variable file 'なんか長いパス': Read-only file system
```

## 解決方法

`⌘ + ,`を押して設定画面を開き、`Tools > Terminal`内にある Shell integration のチェックを外してもう一度 Android Studio を開けば直りました。
React DnD が React hook で簡単に書けるようになっていた

React で好きなように Drop & Drag の実装を書ける [React DnD](https://github.com/react-dnd/react-dnd/) の API が解りにくかった (以前の API の把握は [react-dnd これだけ抑えておけばおｋ](https://qiita.com/mizchi/items/9a426af4fe919cd9d9d5) がわかり易い)のだけど、最近のバージョンアップにより useDrag / useDrop 等の React hook が提供されていて(以前の API も Legacy Decorator API として残っている)、それらを使って簡単に書けるようになっていた。

例えばよくある List を Drag して、Drop 先の要素と swap する、の最小限の実装はこんな感じ。わりと型もちゃんと書ける。

```typescript
import React, { useState, useCallback, useRef, FC } from "react"
import { useDrag, useDrop, DndProvider } from "react-dnd"
import Backend from "react-dnd-html5-backend"

const DND_GROUP = "list"

interface DragItem {
  type: string
  index: number
}

interface ListProps {
  index: number
  text: string
  swapList: (sourceIndex: number, targetIndex: number) => void
}

const List: FC<ListProps> = ({ index, text, swapList }) => {
  const ref = useRef<HTMLLIElement>(null)
  const [, drop] = useDrop({
    accept: DND_GROUP,
    drop(item: DragItem) {
      if (!ref.current || item.index === index) {
        return
      }
      swapList(item.index, index)
    }
  })
  const [, drag] = useDrag({
    item: { type: DND_GROUP, index }
  })
  drag(drop(ref))
  return <li ref={ref}>{text}</li>
}

const ListView = () => {
  const [list, setList] = useState(["foo", "bar", "baz", "hoge", "huga"])
  const swapList = useCallback(
    (sourceIndex: number, targetIndex: number) => {
      [list[targetIndex], list[sourceIndex]] = [list[sourceIndex], list[targetIndex]]
      setList(list.splice(0))
    },
    [list]
  )
  return (
    <ul>
      {list.map((text, index) => (
        <List key={index} text={text} index={index} swapList={swapList} />
      ))}
    </ul>
  )
}

const App: FC = () => {
  return (
    <DndProvider backend={Backend}>
      <ListView />
    </DndProvider>
  )
}
```

React DnD、チュートリアルで一通り学べるのだけど、題材がチェスの実装になっていて、どんな感じで Drag & Drop が実装できるのだろう、というところにたどり着くまでが長い…。
spring mvcバージョン４のトラブル集その１

spring mvcバージョン４のトラブル集

```
★トラブル１

説明	リソース	パス	ロケーション	型
スーパークラス "javax.servlet.ht
tp.HttpServlet" が Java ビルド・パスで見つかりませんでした	
index.jsp	/OfficeSystem/src/main/webapp	行 1	JSP 問題

解決方法として
下記を追加していな可能性がある。

<!-- Servlet Library --　>
<!-- http://mvnrepository.com/artifact/javax.servlet/javax.servlet-api%20-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>


上記を追加すると
MAVEN依存関係にJavax.Servlet-api-3.1.0が追加される。


★トラブル２
説明	リソース	パス	ロケーション	型
Java コンパイラー・レベルが、インストールされている Java プロジェクト・ファセットのバージョンと一致しません。	
OfficeSystem		不明	ファセット・プロジェクトの問題 (Java バージョンの不一致)


Javaのバージョン違いの可能性が高いので下記のページを参考に変更する
http://honeycomware.hatenablog.jp/entry/2016/11/24/232340


★トラブル３
説明	リソース	パス	ロケーション	型
必須ライブラリーのアーカイブ：プロジェクト 'OfficeSystem' の 'C:/Users/shimizu/.m2/repository/org/springframework/spring-expression/4.3.1.RELEASE/spring-expression-4.3.1.RELEASE.jar' を読み込めないか、有効な ZIP ファイルではありません	OfficeSystem		ビルド・パス	ビルド・パス問題


解決方法
ダウンロードしたクラスライブラリが失敗しているか、古いので再度ライブラリをダウンロードする必要ある
その際に、一度ダウンロードしたデータは削除する。

MAVEN依存関係のspring関連のDLファイル（USERファイルの中にある）を全部消して下記を再度張り付ける
<!-- Spring dependencies -->
<!-- http://mvnrepository.com/artifact/org.springframework/spring-core%20-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.1.RELEASE</version>
</dependency>

<!-- http://mvnrepository.com/artifact/org.springframework/spring-web%20-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.1.RELEASE</version>
</dependency>

<!-- http://mvnrepository.com/artifact/org.springframework/spring-webmvc%20-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.1.RELEASE</version>
</dependency>

<!-- JSTL -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
```
uGUIのTextMeshPro

#概要
Unityのバージョンは2018.4LTS版

uGUIのTextMeshProについてのメモです。一通りの機能についての解説します。
Text - TextMeshPro を追加すると画面上のCanvasの子に Text(TMP) が追加されます。
TextMesh Pro がダウンロードされてない場合はメッセージが表示されるのでダウンロードする。
ダウンロードするとAssetにTextMesh Proフォルダが作られます。（TMP Examples＆Extras の方はサンプル）
Text Mesh Pro UGUI のコンポーネントの内容は以下の通りです。

###Text Mesh Pro UGUIコンポーネント
- Text（テキストはリッチテキストタグをサポート）
- Enable RTL Editor（文字の左右反転）
- Font Asset（テキストのレンダリングに使用されるフォントアセット）
- Material Preset（テキストのマテリアル）
- Font Style（フォントのスタイル、大文字小文字設定もある）
- Font Size（フォントサイズ）
 - Auto Size（拡大縮小されたときの最大と最低サイズを設定できる）
- Vertex Color（ベースカラー）
- Color Gradient（テキストにグラデーションを設定）
 - Color Preset（カラーデータをセットできる。一括設定するのに向いてる）
 - Color Mode（グラデーションの方向を設定）
 - Colos（カラーを設定）
- Override Tags（使用用途不明）
- Spacing Options（文字の間、行間、などの設定）
- Alignment（文字の整列位置）
- Wrapping（自動で改行するか）
- Overflow（Wrapping=Disabled, Overflow=Ellipsis に設定するとはみ出した文字は...になる。他は使用方法が不明）
- Horizontal Mapping（使用用途不明）
- Vertical Mapping（使用用途不明）

###Shader
- Face
 - Color（文字色）
 - Texture（テクスチャの設定。Speedでアニメーションさせることができる）
 - Softness（輪郭をぼやかす）
 - Dilate（文字の太さ）
- Outline
 - Color（アウトラインの色）
 - Texture（アウトラインにテクスチャ設定）
 - Thickness（アウトラインの太さ）
- Underlay
 - Underlay Type（Innerの設定は効果不明）
 - Color
 - Offset X（影の基準位置）
 - Offset Y（影の基準位置）
 - Dilate（文字の太さ）
 - Softness（輪郭をぼやかす）
- Lighting
 - Bevel（面取り設定）
 - Local Lighting（照明設定）
 - Bump Map（法線マップ）
 - Environment Map（環境マップ）
- Glow（グロー効果）
- Debug Setting（使用用途不明）

マニュアルは Asset > TextMesh Pro > Documentation のフォルダにPDFがあります。（ただし英語）
Examples & Extras にサンプルが入っているのでこれである程度使い方がわかる

設定項目がTextよりだいぶ多いので最低限設定するといい項目をあげる
- Vertex Color → 基本白（ほかのところでカラーを設定する）
- Color Gradient → グラデーションをつける
- Spacing Options → 文字間などを調整
- Shader > Face → 文字にテクスチャを設定。文字の太さを調整
- Shader > Outline → アウトラインをつける
- Shader > Underlay → 影をつける

#Textとの比較

- メリット
 - Textと違い拡大しても文字がぼやけない
 - アウトラインや影が奇麗につけられる
 - 文字の太さや間隔を調整できグラデーションカラーやアニメーションがつけられる
- デメリット
 - フォントデータをそのまま使うわけではなく、フォントアセットを作成する必要がある
 - フォントアセットを使用するため使う文字をあらかじめ登録しないといけない（日本語入力に向いてない）

使い分けるとしたら
Text → どんな文字が入るかわからない場所（InputFeildの入力文字、お知らせ、利用規約など）
TextMeshPro → 定型文、ロゴ、スコア表示など

#フォントアセットの作り方
Window > TextMeshPro > Font Asset Creator を選択

- Font Settings
 - Source Font File（フォントファイル）
 - Sampling Point Size（テクスチャ生成のためのフォントサイズ）
 - Padding（文字間のパディング。512x512テクスチャーの場合、5のパディングで十分）
 - Packing Method（パッキング。高速 or 最適）
 - Atlas Resolution（アトラス解像度。解像度を高くするとグラデーションが細かくなる）
 - Character Set（フォントアセットに必要な文字を設定）
 - Render Mode（レンダリングのモード）
 - Get Kerning Pairs（特定文字の文字詰め情報を取得）

Generate Font Atlas を押すとフォントアセットの見本が表示される
Save を押してファイルに保存する

#TextMeshProのSprict制御
```.cs
  using TMPro;

  // テキスト文字の設定方法
  this.GetComponent<TextMeshProUGUI>().SetText("<size=50%>HP </size> {0}", 100);
```

#参考になりそうなサイトやAsset
- 導入方法
 - https://kan-kikuchi.hatenablog.com/entry/TextMeshPro
- Textとの比較
 - http://tsubakit1.hateblo.jp/entry/2017/09/20/220000
- 日本語のアセット作る方法
 - https://toshusai.net/archives/299
 - https://blog.naichilab.com/entry/text-mesh-pro-align
- プログラムでの制御
 - http://tsubakit1.hateblo.jp/entry/2019/02/04/024231

#今後の課題
使いこなすにはある程度グラフィックの知識もいる
全機能を詳しく調べたわけではないので使用用途がわからないものがある
パフォーマンスについては未調査
Qiita始めました

#よくあるQiita始めました記事
こんにちは、こんばんは、おはようございます。
始めましてIzumi.Tと言います。Izumiです。Tはオマケです。偽名です。
#何故、数あるからナレッジコミュニティからQiitaを選んだのか
一番の理由は学生時代にお世話になったナレッジコミュニティだからです。
多くの専門知を集積している中では、見やすさや質が高く、私もそのような記事が書けるようになりたいと考えてます。

次点は「はてなブログ」の記事をよく読んでいましたが様々な事柄に関しての記事が多く
私が日々学んだ事や実践した技術的な内容を記事に書くのにどちらが良いか考えた結果、
Qiitaの方がより技術者寄りのナレッジコミュニティだと思い、選びました。

#スキルの可視化と派遣技術者
Qiitaを選んだ理由は先に述べた通りですが、何故今更ブログなのか？
私の職業は技術者派遣会社のしがないサラリーマンです。
ですから日々業務をこなす中、自社の営業や偉い人と話す度に「Izumiは何かスキルアップしましたか？」と問われるのです。

どこの技術系派遣会社も同じで、人材の質が単価に関わる為、自社の擁する技術者には絶えずスキルアップを求めるのです。
そのため、スキルを可視化する事は重要で、IT系のエンジニアであれば多くの人が資格取得ロードマップがあるかと思います。
私も去年の夏過ぎくらいから「スキルの可視化、アウトプットをしなければ」と思い立っていました…

結局、行動出来ず半年以上経った折に、具体的な名前は伏せますが、毎日報道されている例の猛威が職場を襲いました。

結果として自宅待機命令と在宅勤務です。

派遣技術者にとってこれは一大事で、雇い止めされているうちは良いですが、いつクビになるかも分かりません。
そして客先でお仕事を頂く性質上、「家に居ては何をするんだ？」という話になります。

私は、ずっと出来ず終いだった「スキルの可視化」のチャンスだと思い、今は自宅から記事を書いています。
さらに前から温めていた事があるので、これを機会に挑戦したいなと思います。

最初のエントリーとしてこんなところでしょうか？
今後もお役に立てる情報を更新出来ればと思います。
Ruby on Rails チュートリアル 2日目

##2日目
1日目同様につまずきましたのでメモ感覚で書いておこうと思います。[1.3.2 rails server](https://railstutorial.jp/chapters/beginning?version=5.1#sec-rails_server)までチュートリアルの通りに進めてうまくいきました。
しかし、[1.3.4 Hello, world!](https://railstutorial.jp/chapters/beginning?version=5.1#sec-hello_world)にて、チュートリアルのとおりにapp/controllers/application_controller.rbを、

```
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  def hello
    render html: "hello, world!"
  end
end

```
config/routes.rbを

```
Rails.application.routes.draw do
  root 'application#hello'
end
```

と書いたのですが、「hello, world!」が表示されませんでした。
なぜなのかわからないのでどこをどのように書けば動くのかを、教えてほしいです。

###追記
単純に、プログラムをセーブしていなかったという簡単なミスでした。いままできちんとしたプログラミングの道具を使ってこなかったので、書くだけではなくセーブも必要ということすらわかっていませんでした。先が長すぎる、、
string配列をint配列に変換

string配列をint配列へできるだけスッキリと記述したかったので
ググった結果をメモメモ(~_~メ)

```cs
string[] strArray = { "1", "10", "100", "1000", "10000" };
int[] intArray = new int[strArray.Length];
for (int i = 0; i < intArray.Length; i++)
  intArray[i] = int.Parse(strArray[i]);
```

上記をスッキリと。。。

```cs:LINQ版
int[] intArray = strArray
  .Select(int.Parse)
  .ToArray();
```

```cs:Array.ConvertAll()版
int[] intArray = Array.ConvertAll(strArray, int.Parse);
```

```cs:List&lt;T&gt;とforeachを利用
var intList = new List<int>(strArray.Length);
foreach(var s in strArray)
    intList.Add(int.Parse(s));
var intArray = intList.ToArray();
```

もっといい書き方があればぜひコメントへお願いいたします（*^_^*）
VPC Peering


## 目的

VPC Peeringの概要と接続試験の結果をまとめる。


### １．VPC Peeringとは

***2 つの VPC 間***でプライベートなトラフィックのルーティングを可能にするネットワーキング接続です。どちらの VPC のインスタンスも、同じネットワーク内に存在しているかのように、相互に通信できます。VPC ピアリング接続は、***自分の VPC 間、別の AWS アカウントの VPC との間、または別の AWS リージョン***の VPC との間に作成できます。

### ２．VPC Peeringの作成手順

STEP１　VPC Peering Connectionを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/5d5b80be-4004-2766-dec6-9a972842d3da.png)

　
STEP２　VPC Peering Connectionの承認を行う（対抗側のVPCPeeringで）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/7010754f-700e-e23e-6e6c-45f19fe0c5dc.png)


STEP３　各VPCのルートテーブルにて、作成したVPC Peering Connectionへの接続設定を行う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/27d4e562-81b8-028c-99a2-d434626f7a5b.png)


### ３．VPC Peeringで試したこと

以下2パターン試したが問題なくEC２インスタンス通しでPING疎通できた。

◆　同一リージョン内の疎通　韓国VPC　⇔　韓国VPC
　→正常に疎通完了

◆　異リージョン間の疎通 　東京　⇔　韓国VPC
　→正常に疎通完了

### ４．設定の注意点

- セキュリティグループの設定も忘れないようにする
- CIDRブロックが重なるVPCはVPC Peeringの設定ができないので注意

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/ad311488-69d0-6f9e-b136-dfff57cb4cbb.png)

### 5．料金


Q:VPC ピアリング接続の料金はいくらですか?

VPC ピアリング接続の作成に費用はかかりませんが、ピアリング接続間のデータ転送には料金が発生。
Blender2.8でDyntopoを使用するとMirrorモディファイヤが使えない時の解決策

# 問題
色々忘れていたのでメモ．
Blenderでスカルプトを行った際，Dyntopoを使用するとMirrorモディファイヤが動作しなかった．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422520/5292bd4b-83f6-a50e-cf3a-c3eff440141d.png)

> Dyntopoでは未対応です

# 解決
**2.83からは，`対称`の項目に`方向`と`対称化`がある．**

オブジェクトの原点をグローバル座標の(0, 0, 0)に設置し，スカルプトモードで

- 正面から右側にあるオブジェクトを左側にミラーリングする場合
  - `Dyntopo > リメッシュ > 方向 +X→-X`
- 正面から左側にあるオブジェクトを右側にミラーリングする場合
  - `Dyntopo > リメッシュ > 方向 -X→+X`

のどちらかを設定する．
最後に`Dyntopo > リメッシュ > 対称化`をクリックすると反映される．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422520/788454d4-d958-f45e-831d-ae38a0270b9b.png)
【Laravel】Seederの実行時の「Class UsersTableSeeder does not exist」というエラー

###状況
既存のSeederの名前を変更してから実行した際にエラーがこんなエラーが...

```
 ReflectionException  : Class UsersTableSeeder does not exist
```

###解決策
下記を実行してからシーディングをするとうまくいきました。

```
$ composer dump-autoload
```

そもそもLaravelではクラスの参照はComposerを利用して行います。したがってクラスの変更があった場合は`composer dump-autoload`のコマンドで更新します。
[備忘録]vimをgitのエディタのdefault設定に

## やったこと

3回くらい調べちゃったので書いておく

```
$ git config --global core.editor vim
```

bash -> zsh乗り換え時にdefaultのエディタがnanoになるので、慣れたvimを使いたい時のおまじない。
設定値は~/.gitconfigファイルに設定されています。

```
[core]
	editor = vim
```

### 参考記事
[【Git】commitメッセージなど、デフォルトのテキストエディタを変更する](https://qiita.com/ma_me/items/f944101c97a4d0e4a842)
【Rspec】エラー文 undefined local variable or method `response' for RSpecの解決法

以下のようにテストを書いたところ、次のエラー。


```spec/features/gyms_spec.rb
require 'rails_helper'

describe "indexメソッドが動く" do

expect(response).to render_template :index

end
```

###エラー文

```
 undefined local variable or method `response' for RSpec::ExampleGroups::Gyms::Index:Class
```

##原因
そもそもfeature_specにはresponseオブジェクトがないからfeature_spec内ではresponseは使えない。


##解決法

controller_specでrenderオブジェクトを確認するテストをすればOK.
responseオブジェクトはcontroller_specのためだけにあります。