OmniAICreator/Qiita-1.07M huggingface dataset:
Teams WVD Media が有効にならないパターンをまとめてみた

# そもそも Teams WVD Media ってなに？

TeamsをVDI環境で実行するとき、Web会議時に映ってる映像は、RDPの画面遷移で配信される形になるため、非常に大きな帯域を使用してしまうし、何よりカクカク。
いやほんとに馬鹿にならないレベルの帯域使うから正直現実的じゃない。
あと、逆にこちら側のカメラ映像をTeamsに渡す時も、USBのデータをそのまま渡してたら、それはそれでかなりの帯域を使っちゃうもんだから、そもそも使用できないって感じになっている。

なので、そういったTeamsで使用する音声や映像データは、RDPとは異なるプロトコル、コーデック技術を使って、少ない帯域で高品質な映像音声をリアルタイムに送受信が可能となる機能が
「Teams WVD Media」です。

詳しい話はこちらをご参照あれ。
[Microsoft Teams on WVD を試す！](https://www.cloudou.net/windows-virtual-desktop/wvd017/)


# 実際に試してみたところ・・・

ちょうどうちもWVD環境を作ることになり、今絶賛検証中なんだけど、このTeams WVD Media、接続元の端末によって使えたり使えなかったりすることが分かった。

## 端末別実証 (2020年8月現在) 

|端末名|搭載OS|CPU|ブラウザ|専用クライアント|
|:--|:--|:--|:--:|:--:|
|ゲーミングマシン|Windows 10|Core i7|×|〇|
|VAIO|Windows 10|Core i5|×|〇|
|OneMix2S|Windows 10|Core m3|×|〇|
|Surface Go|Windows 10|Pentium|×|〇|
|Macbook 2017|MacOSX 10.15|Core m5|×|×|
|iPad 2019|iPad OS 14|A10|×|×|


基本的に、Windows 10の専用クライアントからじゃないと動作しない模様ですね。
引き続き検証を続けていきまーす！
VScode＋WSL+PythonのPathを通すやり方（Unable to import ~ "xxx"の解決方法)

#記事を書いた経緯
プログラミング初心者の投稿者が環境開発で詰ってた点について調べたことをまとめたものです。
間違いが含まれているかもしれません。その場合は、教えていただけると幸いです。

#この記事の対象
WSLでPython環境を作ったもののいざVScodeで実行しようとすると”Unable to import ~” というエラーが出て鬱陶しい！

#実行環境
Windows10
WSL実行可能

#原因
WSL上のPytho3がある場所をきちんとVscodeに教えられていないことが原因です。

#解決方法
1．WSLでpython3と入力。python3を対話モードで実行する

```
C:\programming>python
Python 3.8.2 (default, Jul 16 2020, 14:00:26)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
```

2．するとpython3の対話モードになるのでimport sysと入力。sys.pathとしてpythonがある場所を探す。

```
>>> import sys
>>> sys.path
['', '/usr/lib/python38.zip', '/usr/lib/python3.8', '/usr/lib/python3.8/lib-dynload', '/home/(ユーザ名)/.local/lib/python3.8/site-packages', '/usr/local/lib/python3.8/dist-packages', '/usr/lib/python3/dist-packages']
```

今回の場合は2つ目の'/usr/lib/python3.8'がPathの値となる。

3．VScodeで".py"ファイルがあるフォルダに移動。なければ新たに作る。

4．そのフォルダの中にある、".vscode"を開く。settings.jsonを開き、pythonPathに先程のPathをコピペ。

```
{
    "python.pythonPath": "/usr/lib/python3.8"
}
```

5．完成



#参考
https://qiita.com/dynamonda/items/5a8129cd6e9cc139d94a
https://qiita.com/ktgwaaa/items/6d1f54d5ff3c4559f96c

#あとがき
なぜかSelect Python Interpreterといわれるこれを直すには、Remote WSLを使わないといけないらしい。
roslaunch時にエラー（Could not load controller 'left_rear_wheel_velocity_controller' because controller type 'effort_controllers/JointVelocityController' does not exist.）

roslaunch時にエラー

```
$ roslaunch racecar_gazebo racecar_tunnel.launch
...
[ERROR] [1596984707.891940413, 0.498000000]: Could not load controller 'left_rear_wheel_velocity_controller' because controller type 'effort_controllers/JointVelocityController' does not exist.
[ERROR] [1596984707.891978374, 0.498000000]: Use 'rosservice call controller_manager/list_controller_types' to get the available types
[ERROR] [1596984708.893376, 1.498000]: Failed to load left_rear_wheel_velocity_controller
[ERROR] [1596984708.896498371, 1.501000000]: Could not load controller 'right_rear_wheel_velocity_controller' because controller type 'effort_controllers/JointVelocityController' does not exist.
[ERROR] [1596984708.896524297, 1.501000000]: Use 'rosservice call controller_manager/list_controller_types' to get the available types
```

[ros_control](http://wiki.ros.org/ros_control)をインストールして解決

```
$ sudo apt-get install -y ros-melodic-ros-control ros-melodic-ros-controllers
```

# 参考
[ros_control](http://wiki.ros.org/ros_control)
[controller type 'effort_controllers/JointPositionController' does not exist](https://answers.ros.org/question/144556/controller-type-effort_controllersjointpositioncontroller-does-not-exist/)
VS CodeでESlint、Prettierを使用したReact環境を構築する

Reactの環境構築はcreate-react-appでとても簡単になりました。ここにコードチェック、整形ツールであるESlint、Prettier を導入してみます。

ESlint、Prettierを使用した環境構築方法やルールはプロジェクトによって違うと思うので、基本的な設定だけしています。プロジェクトに合わせて編集してください。

完成品はGitHubにアップしています。create-react-appで生成されるReactのアイコンなどは削除しています。

https://github.com/nineharker/react-vscode-eslint-prettier

# 環境構築
それでは環境構築していきましょう！パッケージ管理にyarnを使っていきますが、npmを使用している人は便宜読み替えてください。
## VS CodeにESlintとPrettierの拡張機能を追加する
VS Codeの拡張機能としてESlintをインストールしましょう。
![eslint-800x358.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401408/935aeac8-0a61-9e7f-e33f-527e446c36f3.png)

Prettierもインストールします。
![prettier-800x358.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401408/c4498d8b-0bda-6911-1134-5f9045dd363f.png)
これで必要な拡張機能はインストールできました。

## create-react-appでプロジェクトを作成する
Reactプロジェクトを作成しましょう。

```bash
create-react-app sample
```
## 必要なパッケージをインストールする
create-react-appで作成された雛形では、すでにESLintに関するパッケージが導入されています。

create-react-appで作成したプロジェクトの場合、eslintとbabel-eslint、eslint-loaderをインストールしたらエラーが発生するのでインストールしないください。

```bash
yarn add --dev prettier eslint-config-prettier eslint-plugin-prettier eslint-plugin-react
```
## eslint、prettierの設定ファイルを生成する
プロジェクトルートに.eslintrc.jsと.prettierrc配置してルールを書いていきます。 基本的な設定だけを書いています。

```javascript:.eslintrc.js
module.exports = {
  "env": {
    "es6": true,
    "node": true
  },
  "parser": "babel-eslint",
  "plugins": [
    "react",
    "prettier"
  ],
  "parserOptions": {
    "version": 2018,
    "sourceType": "module",
    "ecmaFeatures": {
      "jsx": true
    }
  },
  "extends": [
    "eslint:recommended",
    "plugin:react/recommended",
    "plugin:prettier/recommended",
    "prettier/react"
  ],
  "rules": {
    "prettier/prettier": "error"
  }
}
```

```json:.prettierrc
{
  "printWidth": 120,
  "useTabs": false,
  "semi": true,
  "singleQuote": true,
  "trailingComma": "es5",
  "bracketSpacing": true,
  "jsxBracketSameLine": false
}
```
## VS Codeの設定でセーブ時に整形するようにする
セーブ時に整形するようにVS Codeの設定を変更しましょう。VS Codeのデフォルトのフォーマット機能をオフにしています。

```json
 {
   "javascript.format.enable": false,
   "eslint.autoFixOnSave": true
 }
```
# おわり
お疲れ様でした！これで設定が完了です。App.jsなどのコンポーネントの拡張子はjsxに変更しましょう。

ESlint、Prettierの設定は大変ですが、その後の開発が圧倒的に楽になるのでぜひお試しください。
PV(Planned Value)、EV(Earned Value)、AC(Actual Cost)、完成時総コスト見積り(EAC)、残作業に要するコスト(ETC:Estimate To Complete)

平成31年春期 午前問題52

ある組織では，プロジェクトのスケジュールとコストの管理にアーンドバリューマネジメントを用いている。期間10日間のプロジェクトの，5日目の終了時点の状況は表のとおりである。この時点でのコスト効率が今後も続くとしたとき，完成時総コスト見積り(EAC)は何万円か。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/7e756c8b-43cc-8401-e3a6-94dff3748b71.png)


アーンドバリューマネジメント(EVM:Earned Value Management)は、プロジェクトにおける作業を金銭の価値に置き換えて定量的に実績管理をする進捗管理手法で、PV、EV、ACという3つの指標を用いることが特徴です。

１、PV、EV、AC、CPI、SPI、EAC、BAC
・PV(Planned Value)
　プロジェクト開始当初、現時点までに計画されていた作業に対する予算
・EV(Earned Value)
　現時点までに完了した作業に割り当てられていた予算
・AC(Actual Cost)
　現時点までに完了した作業に対して実際に投入した総コスト


・EV－ACがマイナス値の場合、コスト超過、
・EV－PVがマイナス値の場合、進捗遅れ

・完成時総コスト見積り(EAC:Estimate At Completion)は、
　完了済作業に要した総コスト(AC)に残作業に要するコスト(ETC:Estimate To Complete)を足した、プロジェクト終了時の総コストの予測値です。

・コスト効率指数（CPI：Cost Performance Index）= EV/AC

・スケジュール効率指数（SPI：Schedule Performance Index）= EV/PV

・BACは、完成時総予算


２、計算：

　完成時総コスト見積り(EAC)＝AC＋ETC
　残作業のコスト見積り(ETC)＝(BAC－EV)÷CPI
　コスト効率指数(CPI)＝EV÷AC

設問では、BAC＝100万円、EV＝40万円、AC＝60万円なので、

　BAC＝100万円
　CPI＝EV÷AC＝40÷60＝2／3
　ETC＝(100－40)÷2／3＝90万円
　EAC＝60＋90＝150万円

また、この設問の事例のように現時点までのコスト効率がプロジェクト終了まで続くならば、

　EAC＝BAC÷CPI

で単純に求められるので、

　CPI＝40÷60＝2／3
　EAC＝100÷2／3＝150万円


参照：

https://qiita.com/lymansouka2017/items/1377a2aab513c78152c7

https://www.ap-siken.com/kakomon/31_haru/q52.html
PHPのOOPについて自習したことをまとめてみる②(クラス定数について)

・宣言した定数は変更できません。

```php:const1.php
<?php
class Goodbye {
  const LEAVING_MESSAGE = "Thank you for visiting W3Schools.com!";
}

echo Goodbye::LEAVING_MESSAGE;
?>
```
・クラス定数の使い方には、クラスの外部からアクセスする場合と、クラスの内部からアクセスする場合があります。

・クラス名、スコープ解決演算子（::）、定数名の順に使用することで、クラスの外部から定数にアクセスできます。


```php:const2.php
<?php
class Goodbye {
  const LEAVING_MESSAGE = "Thank you for visiting W3Schools.com!";
  public function byebye() {
    echo self::LEAVING_MESSAGE;
  }
}

$goodbye = new Goodbye();
$goodbye->byebye();
?>
```
. selfキーワードに続いてスコープ解決演算子（::）に続いて定数名を使用して、クラス内から定数にアクセスできます。
[Vim script] mkdirとcdを同時にやりたかった

久しぶりにVim script触れたら，cdの扱いをまたミスったのでメモしておきます．

# 失敗

```
function s:badmkdir(directory)
    call mkdir(a:directory)
    cd a:directory
endfunction
```

エラーは以下．

```
function <SNR>19_badmkdir の処理中にエラーが検出されました:
行     2:
E344: cdpathには "a:directory" というディレクトリがありません
E472: コマンドが失敗しました
```

`cd`のとこでは文字列として`a:directory`が見られてるって話ですね．`mkdir`だけ成功します．あぁそんなだったな，となった．

# 解決

```
function s:mkdir(directory)
    call mkdir(a:directory)
    execute "cd " . a:directory
endfunction
```

`execute`を使って`"cd "`と引数を文字列で結合して実行しましょう，って話です．
Mavenのゴールの種類

# はじめに
MavenはJava向けのビルドツール、pom.xmlを元にビルドを実行します。
コマンドについて記載します。


# eclipseへ変換

## eclipse関連のファイルを生成する
```sh
mvn eclipse:eclipse
```
## eclipse関連のファイルを消去する
```sh
mvn eclipse:clean
```
# IntelliJへ

## IntelliJ関連のファイルを生成する
```
mvn idea:idea
```

## intellij関連のファイルを消去する
```
mvn idea:clean
```

# Mavneプロジェクトの作成
## Mavneプロジェクトの作成
```
mvn archetype:generate
```

## archetypeの指定
```
mvn archetype:generate -DarchetypeGroupId=${groupId} -DarchetypeArtifactId=${ArtifactId}
```
`-D`でプロパティを指定する。そのほかにもプロパティを指定するときに使用できます。


# ビルド関連
実際のプロジェクトではこの辺を使用する。

## コンパイル
```
mvn compile
```

## ユニットテスト
```
mvn test
```
主にJunitでテストする。

## Jar or War の作成
```
mvn package
```
jar か　war はpom.xmlで指定する。

## ローカルリポジトリにプラグインやライブラリをインストール
```
mvn install
```
デフォルトだとmaven central repositoryからライブラリ（Jar）をローカルリポジトリにインストールします。
ローカルリポジトリは`~/.m2/repository`か`${Maven home}/conf/settings.xml`で設定したパスにあります。

# 成果物を消去

## targetディレクトリ以下を削除する。
```
mvn clean
```

# まとめ
JavaのCICD環境を整えることがあります。内部的にはMavenコマンドを叩いてるだけだったりするので、今回まとめました。

# 参考文献
https://qiita.com/KevinFQ/items/e8363ad6123713815e68
PHPのOOPについて自習したことをまとめてみる③(継承について)

```php:extends1.php
<?php
class Fruit {
  public $name;
  public $color;
  public function __construct($name, $color) {
    $this->name = $name;
    $this->color = $color;
  }
  public function intro() {
    echo "The fruit is {$this->name} and the color is {$this->color}.";
  }
}

// Strawberry is inherited from Fruit
class Strawberry extends Fruit {
  public function message() {
    echo "Am I a fruit or a berry? ";
  }
}
$strawberry = new Strawberry("Strawberry", "red");
$strawberry->message();
$strawberry->intro();
?>
```
```php:extends2.php
<?php
class Fruit {
  public $name;
  public $color;
  public function __construct($name, $color) {
    $this->name = $name;
    $this->color = $color;
  }
  protected function intro() {
    echo "The fruit is {$this->name} and the color is {$this->color}.";
  }
}

class Strawberry extends Fruit {
  public function message() {
    echo "Am I a fruit or a berry? ";
  }
}

// Try to call all three methods from outside class
$strawberry = new Strawberry("Strawberry", "red");  // OK. __construct() is public
$strawberry->message(); // OK. message() is public
$strawberry->intro(); // ERROR. intro() is protected
?>
```
```php:extends3.php
<?php
class Fruit {
  public $name;
  public $color;
  public function __construct($name, $color) {
    $this->name = $name;
    $this->color = $color;
  }
  protected function intro() {
    echo "The fruit is {$this->name} and the color is {$this->color}.";
  }
}

class Strawberry extends Fruit {
  public function message() {
    echo "Am I a fruit or a berry? ";
    // Call protected method from within derived class - OK
    $this -> intro();
  }
}

$strawberry = new Strawberry("Strawberry", "red"); // OK. __construct() is public
$strawberry->message(); // OK. message() is public and it calls intro() (which is protected) from within the derived class
?>'
```
Pytorchを使った線形回帰をGoogle Colaboratoryで実装してみる

初心者向けです！ディープラーニングの基礎的な知識があることを前提としています。
機械学習ライブラリのPytorchを用いて線形回帰を実装してみます。
簡単なので機械学習の入門として最適です。
##Pytorchとは？
Facebookの人工知能研究グループにより初期開発された 、Python向けのオープンソース機械学習ライブラリです。読み方はパイトーチです。

Deep Learningライブラリの中でも近年人気が出てきています。非常に簡単に記述できるのでおすすめです。
##Google Colaboratoryとは？
Googleが提供している、無料で使用できるpython実行環境です。

GPUも使用でき機械学習に必要なライブラリもあらかじめインストールされています。ローカルで機械学習の環境を構築するのは大変なので、今回はGoogle Colaboratoryを使用していこうと思います。


使い方は下記参照。1分程で使えるようになります。
https://qiita.com/shoji9x9/items/0ff0f6f603df18d631ab
##線形回帰を実装してみる
必要なライブラリをインストールします。

```python
import torch
from torch import nn
import matplotlib.pyplot as plt
import numpy as np
```

ランダムな分布モデルを作成してプロットしてみましょう。
この図に対して線形回帰します。

```python
x = torch.randn(100, 1) * 10
y = x + torch.randn(100, 1) * 3
plt.plot(x.numpy(), y.numpy(), "o")
plt.ylabel("y")
plt.xlabel("x")
```


実行してみたら下記の図が出力されたと思います。
![pytorch-liniear-regression01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401408/a62f0ec7-cb79-4688-2d35-2c5d18034983.png)

線形回帰のモデルを定義します。nn.Moduleを継承し、__init__内でインプットとアプトプットのサイズを指定したモデルを定義しています。

```python
class LR(nn.Module):
  def __init__(self, input_size, output_size):
    super().__init__()
    self.linear = nn.Linear(input_size, output_size)
  def forward(self, x):
    pred = self.linear(x)
    return pred
```

乱数のseedを固定します。線形回帰のモデルのインスタンスを作成します。

```python
torch.manual_seed(1)
model = LR(1, 1)
```

モデルのパラメーターを取り出す関数を定義。

```python
[w, b] = model.parameters()
def get_params():
  return (w[0][0].item(), b[0].item())
```

プロットする関数を定義。モデルからパラメータを取り出してy1を定義しています。

```python
def plot_fit(title):
  plt_title = title
  w1, b1 = get_params()
  x1 = np.array([-30, 30])
  y1 = w1*x1 + b1
  plt.plot(x1, y1, "r")
  plt.scatter(x, y)
  plt.show()
```

学習前の図をプロットしてみましょう。学習前なので赤い線がずれているのがわかります。

```python
plot_fit("initial Model")
```

![pytorch-liniear-regression02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401408/a4fd48e0-686d-44e4-5839-f59cc61b955a.png)

それでは学習する前準備です。
損失関数は二乗平均誤差、学習方法は確率的勾配降下法に定義します。learning rateは0.01にしてます。

```python
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr = 0.01)
```

それでは学習してみましょう！エポックは100にしてます。lossを記録しておきます。

```python
epochs = 100
losses = []
for i in range(epochs):
  y_pred = model.forward(x)
  loss = criterion(y_pred, y)
  print("epoch:", i, "loss:", loss.item())
  
  losses.append(loss)
  optimizer.zero_grad()
  loss.backward()
  optimizer.step()
```

学習経過を見てみましょう。

```python
plt.plot(range(epochs), losses)
plt.ylabel("Loss")
plt.xlabel("epoch")
```

![pytorch-liniear-regression03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401408/fa9ec56f-ab5a-1def-9eab-f5f70639d565.png)

学習できているのがわかると思います。
学習後の図をプロットしてみましょう。

```python
plot_fit("Trained Model")
```

![pytorch-liniear-regression04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401408/db7f20da-c599-277b-24b5-2ccbaf38c7e3.png)

ちゃんと学習できているのがわかると思います。

以上です。お疲れ様でした！

pytorchを使用して線形回帰を学習してみました。Pytorchと Google Colaboratory を使えばかなり簡単に機械学習を体験できるので、ぜひみなさんも試してみてください！！
PHPのOOPについて自習したことをまとめてみる③(アクセス修飾子について)

###public, protected, privateについて
・public-プロパティまたはメソッドはどこからでもアクセスできます。これがデフォルトです
・protected -プロパティまたはメソッドは、クラス内およびそのクラスから派生したクラスによってアクセスできます
・private -プロパティまたはメソッドはクラス内でのみアクセスできます

・アクセス修飾子は、プロパティとメソッドにつけることができる。

<プロパティにつけた場合>

```php:accessproperty.php
<?php
class Fruit {
  public $name;
  protected $color;
  private $weight;
}

$mango = new Fruit();
$mango->name = 'Mango'; // OK
$mango->color = 'Yellow'; // ERROR
$mango->weight = '300'; // ERROR
?>
```
<メソッドにつけた場合>

```php:accessmethod.php
<?php
class Fruit {
  public $name;
  public $color;
  public $weight;

  function set_name($n) {  // a public function (default)
    $this->name = $n;
  }
  protected function set_color($n) { // a protected function
    $this->color = $n;
  }
  private function set_weight($n) { // a private function
    $this->weight = $n;
  }
}

$mango = new Fruit();
$mango->set_name('Mango'); // OK
$mango->set_color('Yellow'); // ERROR
$mango->set_weight('300'); // ERROR
?>
```
PHPのOOPについて自習したことをまとめてみる②(__construct, __destruct について)

###__construct関数の使い方
```php:construct.php
<?php
class Fruit {
  public $name;
  public $color;

  function __construct($name, $color) {
    $this->name = $name;
    $this->color = $color;
  }
  function get_name() {
    return $this->name;
  }
  function get_color() {
    return $this->color;
  }
}

$apple = new Fruit("Apple", "red");
echo $apple->get_name();
echo "<br>";
echo $apple->get_color();
?>
```
・set_〇〇関数が必要なくなるので、コード量が減る。

###__destruct関数の使い方
```php:destruct.php
<?php
class Fruit {
  public $name;
  public $color;

  function __construct($name, $color) {
    $this->name = $name;
    $this->color = $color;
  }
  function __destruct() {
    echo "The fruit is {$this->name} and the color is {$this->color}.";
  }
}

$apple = new Fruit("Apple", "red");
?>
```
・デストラクタは、オブジェクトが破壊されるか、スクリプトが停止または終了すると呼び出されます。
【超初心者的】Rails 多言語化対応

ここはまだ経験が浅いので備忘録的な記事になっています。理解が深まるに伴って加筆していきます。

##設定

27行目あたり。タイムゾーン設定の下に追加

```ruby:config/application.rb
config.i18n.default_locale = :ja
```

##gem

末尾に追記

```ruby:config/Gemfile
gem 'rails-i18n', '~> 6'
```

##インストール

```terminal:ターミナル
% bundle install
```

##翻訳ファイルの作成

```ruby:config/locales/ja.yml
ja:
  activerecord:
    models:
      menu: メニュー
    attributes:
      menu:
        name: 商品名
        price: 値段
        description: 説明
```

Railsサーバ再起動で読み込まれる


##使用例

自動的に`ja.yml`に記載した日本語で表示される

formの場合

```rhtml:
<%= form.label :name %>
<%= form.label :price %>
<%= form.label :description %>
```

tableの場合

```rhtml:
<th><%= Menu.human_attribute_name(:name) %></th>
<th><%= Menu.human_attribute_name(:price) %></th>
<th><%= Menu.human_attribute_name(:description) %></th>
```
プロジェクトマネジメントのプロセス群

平成31年春期 午前問題51

JIS Q 21500:2018(プロジェクトマネジメントの手引)によれば，プロジェクトマネジメントの"実行のプロセス群"の説明はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/bbadbca5-f1ff-049a-5100-fd1baac20cc8.png)


プロジェクトマネジメントのプロセス群には、立ち上げ、計画、実行、管理、終結の5つがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/ead87eca-2996-36bc-b8a3-509afd1f9de2.png)


１、実行のプロセス群"は、
プロジェクトマネジメントの活動を遂行し，プロジェクトの全体計画に従ってプロジェクトの成果物の提示を支援するためのプロセスの集合です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/4326b431-d4a7-d480-24b2-a0194c488e4f.png)


２、管理のプロセス群
プロジェクトの計画に照らしてプロジェクトパフォーマンスを監視し，測定し，管理するために使用する。

３、終結のプロセス群
プロジェクトフェーズ又はプロジェクトが完了したことを正式に確定するために使用し，必要に応じて考慮し，実行するように得た教訓を提供するために使用する。

４、立ち上げのプロセス群
プロジェクトフェーズ又はプロジェクトを開始するために使用し，プロジェクトフェーズ又はプロジェクトの目標を定義し，プロジェクトマネージャがプロジェクト作業を進める許可を得るために使用する。



参照：

https://www.ap-siken.com/kakomon/31_haru/q51.html
GitLabで二段階認証設定後、pushしようとしたら”remote: HTTP Basic: Access denied”になった。

#単刀直入に
Personal Access Tokensの設定をしなければならない。
まずサイドバーのAccess Tokensを開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287651/2cf36715-d67c-f486-0213-bc27dc5952eb.png)

#以下の項目に入力し、トークンを生成する
- Name(任意の名前を入力)
- Scope(任意のものをチェック。自分はapiにチェックした)
- Create Personal accese tokenを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287651/b94e21f3-bd8e-3b04-93e3-0c4f44379ebf.png)

#生成されたトークンを使う
- 資格情報マネージャーを開く
- Windows資格情報の汎用資格情報を開き、gitlabの情報を選択
- 編集のリンクを押下し、パスワードを生成されたトークンに変更する

#もう一度pushすると正常にpushできる
- セキュリティ上画面を載せられませんが、ご自分の画面でご確認くださいm(_ _)m

#参考サイト
- https://hawksnowlog.blogspot.com/2018/02/gitlab-clone-with-token.html
- https://gitlab.com/gitlab-org/gitlab-foss/-/issues/21246
- https://www.it-swarm.dev/ja/git/gitlab-remote%EF%BC%9Ahttp-basic%EF%BC%9A%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%8C%E6%8B%92%E5%90%A6%E3%81%95%E3%82%8C%E8%87%B4%E5%91%BD%E7%9A%84%E3%81%AA%E8%AA%8D%E8%A8%BC/836697672/
Laravenの認証タイムアウト時のリダイレクト先（複数のログインページ対応版)

#ログインが切れてリダイレクトされるページの設定

基本的にはマニュアルにある、Laravel 6.x 認証 > 未認証ユーザーのリダイレクトのセクションに記載されている通り。
https://readouble.com/laravel/6.x/ja/authentication.html

このサンプルでは、認証が1つのケースではこれだけで十分ですが、複数のログインを使う時は、
これだと、どのユーザーでも同じログインURLに戻されてしまいます。

## URIで振り分ける ##
ログインページの条件によって、リダイレクト先を変更したいと思います。
やり方は、URIを使って、どのページを表示しようとしていたのか、把握して条件分岐します。
route('xxxx')は、routes/web.php で各自設定したものを使います。

```php:app/Http/Middleware/Authenticate.phpAuthenticate.php

<?php

namespace App\Http\Middleware;

use Illuminate\Auth\Middleware\Authenticate as Middleware;

class Authenticate extends Middleware
{
    /**
     * Get the path the user should be redirected to when they are not authenticated.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return string|null
     */
    protected function redirectTo($request)
    {
        if (! $request->expectsJson()) {
            $URI = explode("/", $request->getRequestUri());
            switch ($URI[1]){
                //管理画面が https/xxx.xxx/admin/xxxxxのケース
                case 'admin':
                return route('admin_login');

                //管理画面が https/xxx.xxx/shop_admin/xxxxxのケース
                case 'shop_admin':
                return route('shop_admin_login');

                //ユーザーマイページが https/xxx.xxx/mypage/xxxxxのケース
                case 'mypage':
                return route('login');
            }
        }
    }
}



```

このように、どこのページを開こうとしてセッションタイムアウトになったかで、ログインページの表示を振り分けることができます。
またログインページが複数ある場合は、設定しておくと便利かと思います。

ご参考ください。
CypressでComponentテスト

## Cypressでunit-testをやるメリット
vue-test-utilsはbrowser APIをスタブ化して実行するが、Cypress Vue Unit Testは本物のブラウザーで実行される

## インスト－ル
```
npm i -D cypress cypress-vue-unit-test cypress-nuxt
```
https://www.cypress.io/
https://github.com/bahmutov/cypress-vue-unit-test
https://github.com/NickBolles/cypress-nuxt

## 設定
```js:cypress.json
{
  "$schema": "https://raw.githubusercontent.com/cypress-io/cypress/develop/cli/schema/cypress.schema.json",
  "pluginsFile": "./test/component/plugins/index.js",
  "experimentalComponentTesting": true,
  "componentFolder": "test/component/integration",
  "testFiles": "**/*.js"
}
```

```js:text/component/plugins/index.js
const cypressNuxt = require("cypress-nuxt");
const path = require('path')

module.exports = async (on, config) => {
  return cypressNuxt
    .plugin({
      loadOptions: {
        rootDir: path.join(__dirname, '../../..')
      }
    })
    .then(function(webpackPreProcessor) {
      on('file:preprocessor', webpackPreProcessor)
      return config
    })
};
```
cypress-nuxt入れずに自前でやる人はこの辺りを参考に
https://github.com/bahmutov/cypress-vue-unit-test/issues/200

## テストファイルの作成

```js:index.spec.js
/// <reference types="Cypress" />

import { mountCallback } from 'cypress-vue-unit-test'
import Index from '../../../pages/index.vue'

import Vue from 'vue'
import Vuex from 'vuex'
import VueI18n from 'vue-i18n'

import en from '../../../locales/en.json'
import ja from '../../../locales/ja.json'

import { state, getters, mutations, actions } from '../../../store/todo'

import bootstrap from '../../../node_modules/bootstrap/dist/css/bootstrap.min.css'

Vue.use(Vuex)
Vue.use(VueI18n)

const i18n = new VueI18n({
  locale: 'en',
  messages: {
    en,
    ja
  }
})

const store = new Vuex.Store({
  modules: {
    todo: {
      namespaced: true,
      state,
      getters,
      actions,
      mutations
    }
  }
})
Vue.prototype.$store = store
const extensions = {
  filters: {},
  plugins: [],
  mixins: []
}

describe('Index', () => {
  const template = `
    <div v-if="flag">
      <Index />
    </div>
    `
  function data() {
    return { flag: false }
  }
  const components = { Index }
  beforeEach(
    mountCallback(
      { template, data, components },
      { extensions, i18n, cssFiles: [bootstrap] }
    )
  )

  describe('test', () => {
    beforeEach(() => {
      Cypress.vue.flag = true
    })
    afterEach(() => {
      Cypress.vue.flag = false
    })
    it('', () => {
      cy.log(Cypress.vue)
      cy.get('h1')
    })
  })
})

```

#### 直接mount
コンポーネントを直接mountもできるが、テスト後にdestroyされないので、次のテスト時も残る。
Cypress.vue.$destroy() でdestroy処理は動かせるがコンポーネントはしなない

```js
import { mount } from 'cypress-vue-unit-test'

describe('test', () => {
  beforeEach(mount(Index, { extensions, i18n, cssFiles: [bootstrap] }))
```

なのでmountは一回だけにしてCypress.vueでcomponentのdataになっているため直接代入してクリアもできるがdataが多いとめんどう
⇒ コンポーネントを自動的に削除してcreateからやり直してくれる何かやり方があるのでしょうか？

クリア例

```js
    afterEach(() => {
      Cypress.vue.text = ''
      Cypress.vue.users = []
    })
    it('mount', () => {
      mount(Index, { extensions, i18n, cssFiles: [bootstrap] })
    })
    it('2', () => {
      cy.get('h1')
    })
```
PHPのOOPについて自習したことをまとめてみる①(クラスの定義について)

###参考にしたサイト
https://www.w3schools.com/php/php_oop_what_is.asp

###クラスの定義
```php:makeClass.php
<?php
class Fruit {
  // Properties
  public $name;
  public $color;

  // Methods
  function set_name($name) {
    $this->name = $name;
  }
  function get_name() {
    return $this->name;
  }
}
?>
```
・クラスとは→プロパティ(変数)やメソッド(関数)を集めたまとまりのこと。
###クラスの定義2 
```php:makeClass.php
<?php
class Fruit {
  // Properties
  public $name;
  public $color;

  // Methods
  function set_name($name) {
    $this->name = $name;
  }
  function get_name() {
    return $this->name;
  }
  function set_color($color) {
    $this->color = $color;
  }
  function get_color() {
    return $this->color;
  }
}

$apple = new Fruit();
$apple->set_name('Apple');
$apple->set_color('Red');
echo "Name: " . $apple->get_name();
echo "<br>";
echo "Color: " . $apple->get_color();
?>
```
・メソッドを通じてプロパティにアクセスすると、こんな感じ。(getter, setterというんですかね)
【超初心者的】Rails テーブル操作

ここはまだ経験が浅いので備忘録的な記事になっています。理解が深まるに伴って加筆していきます。

##カラムの追加

```terminal:ターミナル
% bin/rails g migration AlterMenus
```

日付のついたファイルが自動的に作成されるので、ファイルを編集。
以下は「menus」というテーブルに「shop」というカラムを「string型」で登録する例。

```ruby:db/migrate/20200702105650_alter_menus
  def change
    add_column :menus, :shop, :string
  end
```

マイグレーション実行

```terminal:ターミナル
% bin/rails db:migrate
```


##ロールバック操作

1つ前に戻す

```terminal:ターミナル
% bin/rails db:rollback
```

3つ前に戻して再度migrationを実行

```terminal:ターミナル
% rake db:migrate:redo step=3
```

指定のバージョンに戻す

```terminal:ターミナル
% bin/rails db:migrate VERSION=20200711134004
```

データベースリセット

```terminal:ターミナル
% bin/rails db:migrate:reset
```

マイグレーション状況確認

```terminal:ターミナル
% rake db:migrate:status

database: XXXXX_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20200702112828  Create menus
   up     20200706110055  Create users
   up     20200706111024  Add admin to users
   up     20200711035746  Create shops
   up     20200711134004  Add shop id to menus
   up     20200718044031  Create reviews
```

upがマイグレーション済み
正規表現で任意の文字を取得したい ～先読みと後読み～


# はじめに

先日、正規表現を使用した面白い依頼をいただいたので備忘録として

題名の通り、**先読み**と**後読み**というものを使用して、間の文字を取得してみた

「そもそも正規表現ってなんぞや」「メタキャラクタとか忘れた！」
「メールアドレスとURLの正規表現も知りたいな」
　…という方は以前投稿した[こちら][1]を参考にしていただけたら光栄です！

今回のお品書きはこちら

* 今回の依頼内容
* 先読み、後読みとは
* 使用例

# 今回の依頼内容

今回、こんな依頼を受けた

「正規表現で文字列にある任意の文字を取得したい」

例えば、
```test_123```から```123```を取得したい
```get12sample```や```get150sample```から```12```や```150```を取得したい
```s0mplestr32@test```や```s1mpletrs43@123a```から```str32```や```trs43```を取得したい

一つ目は正規表現じゃなくてもできそうだけど、二つ目以降は正規表現でも難しそうだ…
ということで、いろいろ調べてみたところ、**先読み**と**後読み**というものに出会った

# 先読み、後読みとは

先読み ... 先読み表明(lookahead assertion)
後読み ... 後読み表明(lookbehind assertion)

### 先読み表明 (?=XXX)

名前からしてXXXから始まる文字列 ~~XXX123~~ と考えてしまうが、逆 **123XXX** である

要するに、「後にXXXがある文字列を取得」という正規表現である
**123XXX** の場合、正規表現を123(?=XXX)や.+(?=XXX)とすれば **123** を取得できる

否定「後にXXXがない文字列を取得」にしたい場合は```.+(?!XXX)```と記載する

### 後読み表明 (?<=YYY)

先読み表明の反対なので、「前にYYYがある文字列を取得」という正規表現である
**YYY123** の場合、正規表現を(?<=YYY)123や(?<=YYY).+とすれば **123** を取得する

否定「前にYYYがない文字列を取得」にしたい場合は```(?<!YYY).+```と記載する


# 使用例
**[今回の依頼内容](#今回の依頼内容)**で記載した例を使用します
### test_123 から 123 を取得

**test_123の特徴**

* 前にtest_がある文字列（123）をする（後読み表明）

上記の特徴を踏まえて、作成した結果がこちら

**(?<=test_)123**

上記のサンプルがあるため、説明は必要ないかと思います

### get12sample や get150sample から 12 や 150 を取得

**get12sample と get150sampleの特徴**

* 前にgetがある文字列を取得する（後読み表明）
* 後にsampleがある文字列を取得する（前読み表明）
* 間の数字が可変である

上記の特徴を踏まえて、作成した結果がこちら

**(?<=get)\d+(?=sample)**

部分ごとに見ていきましょう

> (?<=get)

後読み表明の記法

> \d+

数字を一回以上繰り返す記法

**\d{1,}** でも代用可能
数字が2,3桁固定なのであれば、**\d{2,3}** が良いかと

> (?=sample)

先読み表明の記法

以上より、所望の正規表現ができました！

### s0mplestr32@test や s1mpletrs43@123a から str32 や trs43 を取得したい

**s0mplestr32@1test と s1mpletrs43@testの特徴**

* 取得したい文字列の前にはs[一桁数字]mpleがある
* 前にs[一桁数字]mpleがある文字列を取得する（後読み表明）
* 後に@&#x200b;1testまたは@&#x200b;testがある文字列を取得する（前読み表明）
* 間には英字三文字、数字二文字かあり、可変である

上記の特徴を踏まえて、作成した結果がこちら

**(?<=s(\d)mple)[a-z]{3}\d{2}(?=@(1?)test)**

部分ごとに見ていきましょう

> s(\d)mple

**\d** は数値
()がなくても動くが、()がないと一目で分かりづらいため、つけてある
**\d{1}** としても問題ないが **\d** は数字一文字という意味なのでなくてよい

> (?<=s(\d)mple)

後読み表明の記法

> \[a-z]{3}\d{2}

**[a-z]{3}** で数字以外三文字
**\d{2}** で数字二文字

今回の文字は小文字英字しか対応していないため、条件によって**[A-Za-z]**や**\D**に変更してください

> @(1?)test

**1?** は1が0回または1回表示したものという意味
()がなくても動くが、()がないと一目で分かりづらいため、つけてある
1の部分が任意の数値や英数字の場合は **\d** や **\w** に変更してください

> (?=@(1?)test)

先読み表明の記法

以上より、所望の正規表現ができました！

# さいごに

前回の記事であらかた理解していたつもりでしたが、まだまだ正規表現は奥が深かった

今までリスト化して分解したりしていましたが、正規表現を使いこなせばそんなことしなくてもいいですね！

今回の先読みと後読みを調べていくうちに他にも面白そうな正規表現があったので余裕があれば再度記事作成していきたいと思います(^ω^ )

[1]:https://qiita.com/str32/items/a692073af32757618042
バーンダウンチャート、バスタブ曲線、信頼度成長曲線、リソースヒストグラム

平成31年春期 午前問題49

アジャイル開発におけるプラクティスの一つであるバーンダウンチャートはどれか。ここで，図中の破線は予定又は予想を，実線は実績を表す。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/6e96976b-650d-6c52-24cc-1a616b955f87.png)


１、バーンダウンチャート（Burn down）は、　
時間とともに残作業量がどの程度減少しているかを表すグラフである。Burn down は下火になるという意味がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/07834443-c0ba-103a-0d04-2b488f85a9b1.png)


２、バスタブ曲線（bath-tub curve）は、
機械故障率のように、最初は故障が多いが徐々に安定し、しかし、最終的には老朽化により再び故障が多くなることを表すカーブである。
バスタブ曲線（故障率曲線）とは、時間が経過することによって起こってくる機械や装置の故障の割合の変化をしめすグラフのうち、その形が**浴槽の形**に似ている曲線のことです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/e252426c-7669-fe91-df79-f25ba0c5e683.png)


３、信頼度成長曲線とは？　（＝ゴンペルツ曲線、ロジスティック曲線、バグ曲線）
プロジェクトの進捗状態の確認などに用いるグラフですが、横軸に日付、テスト時間、またはテストケース数、縦軸に累積バグ発見数をとったグラフです。S字の成長曲線を描くことが多いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/7f78787a-f993-ce73-e772-8a1727091249.png)


４、リソースヒストグラム（＝要員ヒストグラム、資源ヒストグラム）
人というリソースをどのようにプロジェクトに投入するかという計画を立てるのに用いられるのもの。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/54b45dc9-5e68-7d37-0812-a7f0aadda9c8.png)

※リソースヒストグラム　histogram　（地质）直方图，矩形图


参照：

バスタブ曲線（故障率曲線）
https://anzeninfo.mhlw.go.jp/yougo/yougo59_1.html#:~:text=%E3%83%90%E3%82%B9%E3%82%BF%E3%83%96%E6%9B%B2%E7%B7%9A%EF%BC%88%E6%95%85%E9%9A%9C%E7%8E%87%E6%9B%B2%E7%B7%9A%EF%BC%89%E3%81%A8%E3%81%AF%E3%80%81%E6%99%82%E9%96%93%E3%81%8C,%E6%95%85%E9%9A%9C%E3%81%AF%E5%8F%96%E3%82%8A%E9%99%A4%E3%81%8B%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82

https://persol-tech-s.co.jp/hatalabo/mono_engineer/341.html

信頼度成長曲線
https://itmanabi.com/reliability-growth-curve/

https://www.ap-siken.com/kakomon/29_aki/q50.html
[Webpack].pug ファイルをJavascript のHTMLテンプレートとして使用する方法




# 起こったこと

Webpack 上で`.pug` ファイルでpug記法のHTMLを管理したい。が

(Webpack でVue.jsの SFC(Single File Components) で pug記法を使用する方法はよくあったが)
直接`pug` ファイルでpug記法のHTMLを管理する方法がなかったのでメモ。


## 環境
Webpack 4(`Rails` の`Webpacker`)


# 問題

普通にpug の `renderFile` でファイル読み込みすれば?
と思ったが、
node.js のモジュールの`fs` に依存しているようで `fs.readfilesync is not function` で上手くいかなかったため、
別の方法でファイルを読み込み、
機能するrender メソッドのみ使うことにした。

https://github.com/pugjs/pug


pug関連にはいくつかloader があるが
想定する動作をしなかった。

>
As mentioned earlier, the purpose of using Pug templates is to generate static HTML pages. After Webpack v4, all loading will go to module.rules, so we need to add the appropriate loader.
>
Unfortunately, Pug has three loaders: pug-loader, pug-html-loader, pug-plain-loader, which one should we use?
>
Frankly speaking, this problem bothered me for about half a day. The specific process will not start, let's talk about the final plan:
>
`pug-plain-loader` is a minimalist loader developed by the author of Vue to use Pug templates in Vue. Its function is to convert pug into a pure HTML string. Does not meet our needs, rule out.
`pug-html-loader` is similar, but also excluded.
The `pug-loader` converts pug into a template function, and how to use it is handed over to the next level loader. So we can add external variables during the compilation process and change the compiled content. Obviously, this is exactly what we need.

https://meathill.com/gitbook-webpack-for-multi-pages/pug.html

# 解決法


webpack の`raw-loader` でpug ファイル内容をString で取得し
pug のrender メソッドで
処理する。

``` webpack-config.js
module.exports = {
  test: /\.pug$/,
  oneOf: [
    // this applies to pug imports inside JavaScript
    {
      exclude: /\.vue$/,
      use: ['raw-loader']
    },
    // this applies to <template lang="pug"> in Vue components
    {
      use: ['pug-plain-loader']
    }
  ]
}

```



``` :module.js
import pug from 'pug'
import tmpl from '../tmpl.pug'

const html = pug.render(tmpl, {data: 111})

```



もっとよい方法はあるだろうが
とりあえず動いた。


# 参考

https://meathill.com/gitbook-webpack-for-multi-pages/pug.html


https://webpack.js.org/loaders/raw-loader/

https://github.com/pugjs/pug
ステッピングモーターの配線

ステッピングモーター(Master2)とgrbl_ESP32ボードの配線

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664748/c4e5ba94-875d-84b3-98bc-f5e824799306.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664748/b59c297e-8aa8-6140-7fa6-fe7ece439d91.png)
【Objective-C】block内でのselfの使用

#Capturing self strongly in this block is likely to lead to a retain cycle
ブロック内で**self**を使用すると、上記のエラーが表示されました。
調べたところ、下記のようにblock外でweakselfを宣言してあげる必要があるみたいです。
そしてblock内ではselfの代わりにweakSelfを使用するとこの問題は解決します。

```objective_c
__unsafe_unretained typeof(self) weakSelf = self;
```
自動デプロイ後にCSSが反映されない時の対処法【初学者向け】

##ターミナルでpsコマンドを入力してUnicornのプロセスを確認
psコマンドは、現在動いているプロセスを確認するためのコマンド

```ryby:ターミナル
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ ps aux | grep unicorn
```
実行すると以下のように表示されます

```ryby:ターミナル
ec2-user 17877  0.4 18.1 588472 182840 ?       Sl   01:55   0:02 unicorn_rails master -c config/unicorn.rb -E production -D
ec2-user 17881  0.0 17.3 589088 175164 ?       Sl   01:55   0:00 unicorn_rails worker[0] -c config/unicorn.rb -E production -D
ec2-user 17911  0.0  0.2 110532  2180 pts/0    S+   02:05   0:00 grep --color=auto unicorn
```
##UnicornのプロセスをKill
```ryby:ターミナル
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ kill <確認したunicorn rails masterのPID（今回の場合は「17877」）>
```
再度、プロセスを表示させ終了できていることを確認しましょう。

```ryby:ターミナル
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ ps aux | grep unicorn
ec2-user 17911  0.0  0.2 110532  2180 pts/0    S+   02:05   0:00 grep --color=auto unicorn
```ryby:ターミナル
実行結果が上記のようになっていればUnicornを停止が完了です。ローカルで行なっていた、ctrl + cでサーバをストップするという作業と同じことをしたことになります。

##:warning:プロセスが終了できない場合
下記の２行が表示が消えていない場合はプロセスが終了できていないことになります。

```
ec2-user 17877  0.4 18.1 588472 182840 ?       Sl   01:55   0:02 unicorn_rails master -c config/unicorn.rb -E production -D
ec2-user 17881  0.0 17.3 589088 175164 ?       Sl   01:55   0:00 unicorn_rails worker[0] -c config/unicorn.rb -E production -D
```
オプション-9をkillコマンドにつけると強制終了を実行できます。通常のkillコマンドで削除できない場合はこちらを使用しましょう。

```ryby:ターミナル
$ kill -9 [プロセスID]
```
##先頭にRAILS_SERVE_STATIC_FILES=1をつけて、unicornを起動
続いて再びunicornを起動しましょう。このとき RAILS_SERVE_STATIC_FILES=1 という指定を先頭に追加してください。これは、コンパイルされたアセットをRailsが見つけられるような指定になります。以下のようにコマンドを実行してください。

```ryby:ターミナル
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ RAILS_SERVE_STATIC_FILES=1 unicorn_rails -c config/unicorn.rb -E production -D
```
で、再度自動デプロイ

```ryby:ターミナル
# アプリケーションのディレクトリで実行する
$ bundle exec cap production deploy
```

##まとめ
cssが反映されなかったらkillしてunicornを再起動！
完全化保守、是正保守、適応保守、予防保守

平成31年春期 午前問題48

オペレーティングシステムの更新によって，既存のアプリケーションソフトウェアが正常に動作しなくなることが判明したので，正常に動作するように修正した。この保守を何と呼ぶか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/4264281e-67ff-2ae1-29b3-b30698ba9c9d.png)


ソフトウェア保守のプロセスは「JIS規格（JIS X 0161）」で規定されており、以下の5つの工程に分類されている。
（1）是正保守：発見された問題を解決する
（2）適応保守：利用環境に合わせて修正する
（3）完全化保守：性能や保守性を検出する
（4）予防保守：潜在的な障害の原因を発見する
（5）緊急保守：計画外に行われる一時的な修正


もうちょっと詳しい説明すると、
１、是正保守
　　ソフトウェア製品の引渡し後に発見された問題を訂正するために行う受身の修正
２、予防保守
　　引渡し後のソフトウェア製品の潜在的な障害が運用障害になる前に発見し，是正を行うための修正
３、適応保守
　　引渡し後，変化した又は変化している環境において，ソフトウェア製品を使用できるように保ち続けるために実施するソフトウェア製品の修正
４、完全化保守
　　引渡し後のソフトウェア製品の潜在的な障害が，故障として現れる前に，検出し訂正するための修正



参照：

http://www.tamakiseoffice.jp/software_engineering/Chap_33.pdf

https://www.ap-siken.com/kakomon/31_haru/q48.html

ソフトウェア保守
https://www.otsuka-shokai.co.jp/words/software-maintenance.html
ATtiny1616 と ATtiny1617用の実験ボードを作ったよ

###概要
ATtiny85を使用したファンクションデコーダを作っていましたが、I/Oが足りないのと
メモリが足りない不満がありました。
なにか新しいCPUがないかなと色々探した結果、ATtiny1616とATtiny1617が目に付きまして
実験用の基板を作ってみました。（絶賛配布中！）

###各CPUの比較
いつもATtiny85を使っていましのでそれと比較するとほぼ性能が倍です。
![E382B9E382AFE383AAE383BCE383B3E382B7E383A7E38383E38388202020-07-242011.53.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/3654d887-24f4-f9d6-f2b5-5c00718a2259.png)
比較するとPKGがQFNというところを除けば、ピン数もそこそこな数で内蔵クロックも早いしメモリも多い。

###ATtiny1616用BOARD
回路図
電源は三端子で5Vに変換しています。入力は交流でも直流でも行けるようにしました。
![1616sc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/3a6e3a1b-3d54-fc7d-8256-8f1c9b9273ae.png)

部品面・半田面
![1616.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/630f38e9-bf46-1a73-b2a0-41f605c4bb6b.png)

###ATtiny1617用BOARD
回路図
![1617sc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/a42a3cf7-98d1-05a1-6ea8-e5db292ab15a.png)

部品面・半田面
![1617.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/5ad26365-5983-9426-4f97-077cee33c793.png)

DCC用デコーダー用として実験ができるように、DCC電源取り込み回路（全波整流＋三端子レギュレータ）と
DCC信号受信回路を付けました。

ATtiny1616とATtiny1617は書き込み方式が変わっておりまして、ISPでプログラムの書き込みが
できましたが、UPDIという3線で書き込む方式になっています。

###UPDI書き込み器を作る
youtubeに上がっている動画を参考にして、ArduinoNANOにjtag2updiのスケッチを書き込みます。
https://www.youtube.com/watch?v=AL9vK_xMt4E
１.ArduinoにmegaTinyCoreボードを追加
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/51908d73-d4ca-5718-fde4-4324408f3d62.png)

2.Lチカスケッチ
Board上のPA7にビルドインLEDを載せていますので、このLEDを使用してLチカを動かします。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/bd41f366-a0cf-af12-9df8-de47cca1b487.png)

3.Arduinoの設定
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/e216f2cb-da92-f5b1-6577-446ad0856245.png)

4.UPDI書き込み用配線
ArduinoNANOをjtag2updi書き込み器になっていますので、下図のように電源線とUPDI線を4.7kオームを
介して接続します。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/fa8506fd-3b0e-5f5d-a065-a9c284cb637f.png)

###Lチカが動いている様子
ATtiny1616のLチカ
https://twitter.com/masashi_214/status/1286485278958346240
ATtiny1617のLチカ
https://twitter.com/masashi_214/status/1286487264323751939

###QFPパッケージを半田付けしている様子
ATtiny1616とATtiny1617のQFPパッケージを半田付けしている所はツイッターにあげました。
https://twitter.com/masashi_214/status/1286080717907087360
https://twitter.com/masashi_214/status/1286084562481639424

###生板の配布
ATtiny1616 ピッチ変換基板
http://ayanos.cart.fc2.com/ca15/60/p-r15-s/

ATtiny1617 ピッチ変換基板
http://ayanos.cart.fc2.com/ca15/61/p-r15-s/

いずれも、3枚で５００円で登録してみました。
ちなみに、ATtiny1616と1617は送料が450円と安いRSコンポーネンツから取り寄せました。
https://jp.rs-online.com/web/
Flashが倍の3216や3217も良さそうです。
![スクリーンショット 2020-08-10 9.54.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/1109618a-239c-0f5a-f582-f845e6f54ae5.png)
【GCP】【Firebase】 「Could not load the default credentials.」と出た場合の対処


#概要
Google Cloud Functions(Node.js)を実行したときに、GoogleAuthで「Could not load the default credentials.」と出た場合の対処方法

#コード

こんな感じのコードで、

```js
  const { google } = require('googleapis');
  const auth = new google.auth.GoogleAuth({
    scopes: ['https://www.googleapis.com/auth/cloud-platform'],
  });
  const authClient = await auth.getClient();
  google.options({ auth: authClient });
```

こんな感じのエラーが出る場合、

```
Error: Could not load the default credentials. Browse to https://cloud.google.com/docs/authentication/getting-started for more information.
    at GoogleAuth.getApplicationDefaultAsync (/srv/node_modules/googleapis-common/node_modules/google-auth-library/build/src/auth/googleauth.js:155:19)
    at <anonymous>
    at process._tickDomainCallback (internal/process/next_tick.js:229:7) 
```

[環境変数](https://cloud.google.com/docs/authentication/getting-started)を設定する方法もあるが、
鍵ファイル(JSON)のパスをGoogleAuthインスタンス生成時に直接指定する方法でも解消可能
（鍵ファイルは適切なロールが付与されたサービスアカウントで生成したもの）

```js
  const { google } = require('googleapis');
  const auth = new google.auth.GoogleAuth({
    keyFilename: './key.json',
    scopes: ['https://www.googleapis.com/auth/cloud-platform'],
  });
  const authClient = await auth.getClient();
  google.options({ auth: authClient });
```

※鍵ファイルは、functionsディレクトリ直下に置いてcloud functionsにデプロイ
AtCoder Grand Contest初挑戦

8/9(日)、初のAtCoder Grand Contestを挑戦いたしました。

勉強中のgo言語を利用して、「[C - Product Modulo](https://atcoder.jp/contests/agc047/tasks/agc047_c)」だけを実施したが、どうしても、実行時間が2秒以内に抑えず(実績：2205 ms)、初挑戦が失敗した。

```golang

package main

import (
	"fmt"
)

func main() {
	var n int
	fmt.Scanf("%d", &n)
	slice := make([]int,n,n)
	for i := 0; i < n; i++ {
		fmt.Scanf("%d", &slice[i])
	}
	total:=0
	for i:=0;i<n-1;i++ {
		if slice[i] > 0 {
			for j:=1+i;j<n;j++ {
				if slice[j] >0 {
					total += slice[i]*slice[j]%200003
				}
			}
		}
	}
	fmt.Println(total)
}
```

処理時間がオーバーする原因はforループの利用が多かったかなと思いますが、解決策は分からないです。
SQLServerのViewをExcel表示する

# はじめに
SQLServerデータベース上のViewを、Excel上に表示する手順を説明する。

[利用シーン]
DB上のViewで出力する数字や算出・項目名を日本語変換し、Excelレポートとして出力するなど。
意外と簡単で便利！

# 前提
- 検証環境
  - SQLServer2016 Developer
  - Excel 2016
- SQLServer上にDB(当説明では、SANDBOX1）、およびデータのある任意テーブルを用意

# Viewの準備
SQLServer上に、以下のようなViewを作成（言わずもがな、元となるテーブルも必要）

```
CREATE VIEW [dbo].[月別部門別売上ビュー] AS (
	SELECT
		 t1.YearMonth AS 年月
		,t1.DeptCode AS 部門コード
		,t1.SalesAmount AS 売上金額
	FROM 
		T_SalesAmt t1
)
```
テストデータは以下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217757/e604790f-004c-8498-36c5-2d71756ac970.png)

# Excelからの接続手順
1. Excel起動

1. データ　＞　外部データの取り込み　＞　その他のデータソース　＞　SQL Serverから
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217757/470482fe-f67c-1d82-af1f-c92d2639050e.png)

1. 認証方法の設定
同一サーバー上なら、localhost。
認証方法は、Windows認証か、SQLServer認証かを選び、設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217757/0b00756e-d408-3d6a-4af2-7912d7596488.png)

1. 対象ビューの選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217757/83be1679-3e14-fc55-4ce1-57d9106cf85e.png)

1. 完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217757/e4b33165-13c0-5ed6-8d57-d29e15397aac.png)

1. 出力先セルの指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217757/85ba5301-562a-14df-e70e-bc35fce41f20.png)

**成功！**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217757/cb495c77-5a8b-a82f-d45b-c840d9b76336.png)
wrong argument  type nil

当方エンジニアを目指している身です
簡単ですがエラー共有として

railsでcrudアプリのような
質問ページなるものを作成している際にエラー

<img width="874" alt="質問画面.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637333/69443099-9cbb-dd3c-c904-524eae30cd5d.png">

質問を投稿し反映されたところまでよかったが、詳細ページを見ようとするとエラー
TypeError
wrong argument type error(expected String)

<img width="1031" alt="argument error.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637333/7d3bce62-b553-eb63-f79c-684cdd79a6ed.png">

期待される値が無いだと…
検索してもいまいちピンとくる記事が見つからなかったが
よくよく考えると

【質問】を記入
【詳細】コメント書かずに動作を確認
そしてその後以下のようにmodels/question.rbにvaridatesを設定していたため
空欄入力に対してエラーと表示されていた


```
class Question < ApplicationRecord
    validates :title, presence: true
    validates :detail, presence: true

    has_many :solutions
end
```

結論
varidatesは先に書いとこ
学習するDiscord Botを作る 1.


#The introduction 
		
&nbsp;&nbsp;会話を記録していくChatbotを作ります。個人的な使用ならば問題無いでしょうが会話内容がファイルに残るので一応プライバシー等に注意してください。
###今回やったこと
&nbsp;&nbsp;とりあえずdiscordのChatbotを何か作りたいと思い立って、会話の中で成長する比較的単純なbotを作りました。
###どうしてそれをするのか 
https://medium.com/@kirkouimet/my-conversation-with-an-artificial-intelligence-about-coronavirus-covid-19-742c0dd9abbe
この記事に感銘を受けて、私も最終的にこれに似たものを作りたいと思いました。今回これを作ったのには二つの目的があります。一つにはChatbotのAIを作るための第一歩、チャットでランダムに振る舞うbotを作ること、もう一つには自動的に人間が作った文章を記録しデータセットとして残すこと。実際にAIの学習に使うデータセットを作るためにはこのbotで集めたデータに目的に応じた教師ラベルをつけることや適宜データを加工するなどの工程を踏む必要がありますが、単純に人間が作った文章のデータを蓄積させることもデータセット作りの第一歩として、やってみなければ方向性もつかめないと思います。
###背後にある意味
&nbsp;&nbsp;訓練された人間のように振る舞うChatbotができれば、現在人間がしている特定の仕事はコンピュータが代わりにしてくれるようになります。この事実を見て、人が仕事を奪われると考えるのか、人が仕事から解放されもっと高尚なことに時間を使うことができるようになると考えるのかはそれぞれですが、ちょうど資本主義のように全体としての利益を考えるならば、仕事を一時的に失うことは非常につらく悲しいことではありますが、最終的に全てを自動化しその利益から捻出されるUniversal Basic incomeで人類全員が自分のしたくない労働をせずに暮らす社会が理想形でしょう。AIを搭載したChatbotを開発することは、潜在的には人の仕事を奪うことであり、同時に、人類の最終的な発展に少なくとも寄与する行為であることを念頭に責任と倫理観を持って開発しましょう。
###ここから将来的に何が可能か 
&nbsp;&nbsp;今回、会話の中で覚えた文章を記録し、何か発言を見ると、覚えた文章の中からランダムで文章を出力しDiscordで送るというbotを作りました。ここからこれをAIに発展させるために何ができるでしょうか。
&nbsp;&nbsp;&nbsp;&nbsp;1. Chatbotの返信の質を人間が評価し、AIに学習させる。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  人間が打った文章がChatbotの返信のトリガーになっているわけですが、このトリガーとなった人間の文章とAIが繰り出す文章をAIに理解させるために数値化し、この数値(に変換された文章)にこの数値(文章)を返してみたけれど人間の評価はどうか、という風に教え込みます。
&nbsp;&nbsp;&nbsp;&nbsp;2. 人間同士の会話を学習させる。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;人間が実際に行ったチャットでの会話を記録させ、後で学習させます。ただし人間の実際の会話はAならばB, CならばDというような完全なif 文で行われているとは思えません。従って時系列データとして処理する必要性が示唆されています。
#方法 
###使ったライブラリ 
```python
import discord #Discord APIのwrapper
import pickle #蓄積データを外部に保存
import random
import os
```


###実装した機能の説明 
- メッセージが来たら、それをリストに保存 (データ蓄積機能)
- そのメッセージをトリガーとしてリストの中の文章からランダムに発言(人間を楽しませてデータ収集を円滑にする機能)

###コード
``` Botchan.py
import discord
import random
import pickle
import os

TOKEN = "YOURTOKENHERE"
path = "Your project path here"

client = discord.Client()
@client.event
async def on_ready():
    print("Botchan Ready to serve")
text_path = os.path.join(path,"text.sav")
try:
    file = open(text_path,"rb")
    texten = pickle.load(file)
    file.close
except:
    texten = []
    texten.append("Hello")

@client.event
async def on_message(message):
    if message.author == client.user:
        return
    randomizer = random.randint(0,len(texten)-1)
    random2 = random.randint(1,1) #返信を行う頻度を変更可能 ex) ...randint(1,100) 1%の確立で返信
    if random2 == 1:
        await message.channel.send(texten[randomizer])
    if message.content.startswith("Save"):  #誰かがSaveと発言すると蓄積したデータが実際にファイルに保存される。
        file =open(text_path, "wb")
        pickle.dump(texten,file)
        file.close()
        print("textfile Saved!")
    else:
        texten.append(message.content)

client.run(TOKEN)

```

#終わりに
今回は初歩的なものになりましたが、最終的にはKerasや機械学習を使ってBotに知能を持たせたいと思います。
ありがとうございました。
Hashtable、Vector、HashMap、ConcurrentHashMapの違い、ConcurrentHashMapはkey,valueにnullを許容しない等

Javaにおける似たようなものたちの基礎知識メモ。
ConcurrentHashmapはHashMapをスレッドセーフにしたものだけどちょっと違うところもある。

## 基礎知識

- [Map](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Map.html)
- [なんとかMapの違い](https://qiita.com/Luecy1/items/4784418a52d3490b5269)
- 速度は以下

https://kappuccino-2.hatenadiary.org/entry/20080804/1217817951


## VectorやHashtableは古い

https://kappuccino-2.hatenadiary.org/entry/20080807/1218080263

「同期」のためにVectorは使わない（VectorとCollections.synchronizedList）
同様の理由で、もちろんHashtableも使うべきではない、という話。
Hashtableと同様の機能がほしければ以下。

```java
// スレッドセーフなHashMapを生成
Map map = Collections.synchronizedMap(new HashMap());
```

あるいはソート済みの特性がほしければTreeMapを用いて以下。

```java
// スレッドセーフなTreeMapを生成
Map map = Collections.synchronizedMap(new TreeMap());
```


## HashMap

- [nullを許容する](https://qiita.com/icelandnono/items/17b5141aaa53a73ce612)
- スレッドセーフではない → [ログからアタリを付ける、ハングの原因となるHashMapの使い方 - Qiita](https://qiita.com/e99h2121/items/88d5579a8ce670061468)

## ConcurrentHashMap

排他制御を達成するために [java1.5から追加された](https://qiita.com/YanHengGo/items/21ca9408fb59ddb7a566)。
が、nullを許容しない。

```ConcurrentHashMap.java
    /**
     * Maps the specified key to the specified value in this table.
     * Neither the key nor the value can be null.
     *
     * <p> The value can be retrieved by calling the <tt>get</tt> method
     * with a key that is equal to the original key.
     *
     * @param key key with which the specified value is to be associated
     * @param value value to be associated with the specified key
     * @return the previous value associated with <tt>key</tt>, or
     *         <tt>null</tt> if there was no mapping for <tt>key</tt>
     * @throws NullPointerException if the specified key or value is null
     */
    public V put(K key, V value) {
        if (value == null)
            throw new NullPointerException();
        int hash = hash(key.hashCode());
        return segmentFor(hash).put(key, hash, value, false);
    }
```


例:

```Sample1.java
        ConcurrentHashMap map = new ConcurrentHashMap();
        map.put("test", null);
```
```
Exception in thread "main" java.lang.NullPointerException
	at java.util.concurrent.ConcurrentHashMap.put(ConcurrentHashMap.java:881)
	at playground.Sample1.main(Sample1.java:9)
```

```Sample2.java

        ConcurrentHashMap map = new ConcurrentHashMap();
        map.put(null, "test");
```

```
Exception in thread "main" java.lang.NullPointerException
	at java.util.concurrent.ConcurrentHashMap.put(ConcurrentHashMap.java:882)
	at playground.Sample2.main(Sample2.java:12)
```

よって、HashMap→ConcurrentHashmap置換時は注意。

```Realcode.java
        if (inputvalue == null) {
            return;
        }
```

以上参考になればさいわいです。