OmniAICreator/Qiita-1.07M huggingface dataset:
13. col1.txtとcol2.txtをマージ

## 13. col1.txtとcol2.txtをマージ
12で作ったcol1.txtとcol2.txtを結合し，元のファイルの1列目と2列目をタブ区切りで並べたテキストファイルを作成せよ．確認にはpasteコマンドを用いよ．

###Go
```go
package main

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

func main() {
	//	読み込みファイルを指定
	wname := "col.txt"
	r1name := "col1.txt"
	r2name := "col2.txt"

	//	読み込むファイルを開く
	w, err := os.Create(wname)
	if err != nil {
		fmt.Printf("os.Open: %#v\n",err)
		return
	}
	defer w.Close() //	終了時にクリーズ

	//	1列目の保存ファイルを作成
	r1, err := os.Open(r1name)
	if err != nil {
		fmt.Printf("os.Open: %#v\n",err)
		return
	}
	defer r1.Close() //	終了時にクリーズ

	//	2列目の保存ファイルを作成
	r2, err := os.Open(r2name)
	if err != nil {
		fmt.Printf("os.Open: %#v\n",err)
		return
	}
	defer r2.Close() //	終了時にクリーズ

	//	スキャナライブラリを作成
	scanner1 := bufio.NewScanner(r1)
	scanner2 := bufio.NewScanner(r2)

	//	データを１行読み込み
	for scanner1.Scan() {
		scanner2.Scan()
		w.WriteString(scanner1.Text() + "\t" + scanner2.Text() + "\n")
	}

	//	エラーが有ったかチェック
	if err = scanner1.Err(); err != nil {
		fmt.Printf("scanner1.Err: %#v\n",err)
		return
	}

	//	エラーが有ったかチェック
	if err = scanner2.Err(); err != nil {
		fmt.Printf("scanner2.Err: %#v\n",err)
		return
	}
}
```


###python
```python
# 出力ファイルを開く
with open("col.txt", "w") as w:
    # 1つめの読み込みファイルを開く
    with open("col1.txt", "r") as r1:
        # 2つめの読み込みファイルを開く
        with open("col2.txt", "r") as r2:
            # 一行ずつ読み込む
            for data1 in r1:
                # 2つめのファイルを読み込む
                data2 = r2.readline()

                # col1.txt のデータと col2.txt のデータ を TAB 区切りで col.txt へ出力
                w.writelines(data1.strip() + "\t" + data2.strip() + "\n")
```


###Javascript
```Javascript
// モジュールの読み込み
var fs = require("fs");
var col = [];

//  col1.txt,col2.txt のテキストファイルを読み込み
var col1Text = fs.readFileSync("col1.txt", 'utf-8');
var col2Text = fs.readFileSync("col2.txt", 'utf-8');

//  改行で文字列を分割
var col1 = col1Text.split('\n');
var col2 = col2Text.split('\n');

//  項目数ループ
for (i=0;i<col1.length;i++) {
    //  項目をTAB区切りで結合
    col.push(col1[i] + "\t" + col2[i]);
}

//  col.txt へ改行で連結したテキストを出力
fs.writeFileSync("col.txt",col.join('\n'));
```

## まとめ

Javascirptこれだけバッファ処理へで書いてる。
3ファイルを処理となんかソースがスッキリしない・・・が出力2と更にモヤモヤ感が増加。

[トップ](https://qiita.com/naoshin1984/items/3d7814e2f8eb01eea8dd)
12. 1列目をcol1.txtに，2列目をcol2.txtに保存

## 12. 1列目をcol1.txtに，2列目をcol2.txtに保存
各行の1列目だけを抜き出したものをcol1.txtに，2列目だけを抜き出したものをcol2.txtとしてファイルに保存せよ．確認にはcutコマンドを用いよ．


###Go
```go
package main

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

func main() {
	//	読み込みファイルを指定
	name := "../hightemp.txt"
	w1name := "col1.txt"
	w2name := "col2.txt"

	//	読み込むファイルを開く
	f, err := os.Open(name)
	if err != nil {
		fmt.Printf("os.Open: %#v\n",err)
		return
	}
	defer f.Close() //	終了時にクリーズ

	//	1列目の保存ファイルを作成
	w1, err := os.Create(w1name)
	if err != nil {
		fmt.Printf("os.Open: %#v\n",err)
		return
	}
	defer w1.Close() //	終了時にクリーズ

	//	2列目の保存ファイルを作成
	w2, err := os.Create(w2name)
	if err != nil {
		fmt.Printf("os.Open: %#v\n",err)
		return
	}
	defer w2.Close() //	終了時にクリーズ

	//	スキャナライブラリを作成
	scanner := bufio.NewScanner(f)

	//	データを１行読み込み
	for scanner.Scan() {
		//	TAB で分割
		clm := strings.Split(scanner.Text(),"\t")
		w1.WriteString(clm[0] + "\n")
		w2.WriteString(clm[1] + "\n")
	}

	//	エラーが有ったかチェック
	if err = scanner.Err(); err != nil {
		fmt.Printf("scanner.Err: %#v\n",err)
		return
	}
}
```


###python
```python
# 読み込むファイルを開く
with open("../hightemp.txt", "r") as r:
    # 1つ目の書き出すファイルを開く
    with open("col1.txt", "w") as w1:
        # 2つ目の書き出すファイルを開く
        with open("col2.txt", "w") as w2:
            # 一行ずつ読み込む
            for data in r:
                # TAB を区切り文字で配列化
                col = data.strip().split("\t")

                # 1項目を col1.txt へ書き出し
                w1.writelines(col[0] + "\n")

                # 2項目を col2.txt へ書き出し
                w2.writelines(col[1] + "\n")
```


###Javascript
```Javascript
// モジュールの読み込み
var fs = require("fs");
var col1 = [];
var col2 = [];

//  テキストファイルを読み込み
var col = fs.readFileSync("../hightemp.txt", 'utf-8');

//  改行で文字列を分割
var data = col.split('\n');

//  行数ループ
data.forEach(function( value ) {
    //  項目を TAB で分割
    val = value.split('\t')

    //  各配列へデータを Push
    col1.push(val[0]);
    col2.push(val[1]);
});

//  col1.txt , col2.txt へ改行で連結したテキストを出力
fs.writeFileSync("col1.txt",col1.join('\n'));
fs.writeFileSync("col2.txt",col2.join('\n'));
```

## まとめ

Go,Python の Close 処理がスッキリで良い。
Python のインデントが深くなる。

Javascirpt は同期処理へ変更。非同期はどこかで待つのか？。
これだけバッファ処理へで書いてる。

3ファイルを処理となんかソースがスッキリしない。

[トップ](https://qiita.com/naoshin1984/items/3d7814e2f8eb01eea8dd)
【Rails】レコード削除時に関連するテーブルのレコードも一緒に削除する方法

# はじめに

Railsでとあるレコードを削除すると、それに紐づいた他のモデルが外部キーで参照できなくなってエラーがでてしまった。
レコードを削除した時に関連するモデルのレコードを一緒に削除する方法を調べたので記載。
結論、dependent: :destroyを使えば解決した。
その他、周辺情報も調べて整理したのでまとめる。
間違っていたら教えていただけると幸いです。

#環境
- Ruby 2.5.1
- Rails 5.2.4

# 状況

モデルの相関関係を簡略化すると以下のような感じ。
ユーザーがカードを保有していて、そのカードとクーポンが多:多の関係でアソシエーションされている。

<img width="625" alt="スクリーンショット 2019-12-25 11.09.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543133/d6de2648-19f6-403d-938e-3c7a635e196f.png">


モデルのアソシエーションはこんな感じ。

```ruby
# models/card.rb
has_many :cards_coupons
has_many :coupons, through: :cards_coupons

# models/cards_coupon.rb
belongs_to :card
belongs_to :coupon

# models/coupon.rb
has_many :cards_coupons
has_many :cards, through: :cards_coupons

```

# dependent: :destroyを使う

上の状況でcardsのレコードを削除すると、cards_couponsテーブルに記載してあるcardカラムに外部キーが設定してあるため、エラーが起こる。

*基本的に外部キーに設定してあるカラムはnullではエラーがでる。nullでも大丈夫なようにするにはoptional: trueを追加すればいいのだが、DBに意味のないレコードが残るのが好ましくないため削除したい
(参考記事: https://blog.ryskit.com/entry/2018/01/27/195442)

レコードを削除するときに外部キーが設定されているcards_couponsのレコード削除
→cardsのレコード削除、couponsのレコード削除
とすればいいのかもしれないがやってらんない

**そこであった便利な方法がdependent: :destroy**
使い方は簡単。アソシエーションのオプションにこれを記載するだけ。
以下のようになる。

```ruby
# models/card.rb
has_many :cards_coupons, dependent: :destroy  #追加
has_many :coupons, through: :cards_coupons

# models/cards_coupon.rb
belongs_to :card
belongs_to :coupon, dependent: :destroy  #追加

# models/coupon.rb
has_many :cards_coupons
has_many :cards, through: :cards_coupons

```

- 最初に追加したdependent: :destroyによって、cardsテーブルにあるレコードを削除した時にcards_couponsテーブルにあるレコードも一緒に削除してくれる
- 2番目に追加したdependent: :destroyによってcouponsテーブルのレコードも一緒に削除してくれる

めちゃ便利！！

こんな感じでdependent: :destroyはチェーンメソッドみたいに何個もつなげることが可能。

# :delete_allなど関連する他のオプションとの違い

色々調べてると似たようなメソッドがいくつかあったので整理しておく。
主に以下の3つ

①destroy
②delete
③nullify

最後に表でまとめるのでそっちの方が見やすいかも

#### ①destroy
destroyは上記記載の通りdestroyメソッドを行うので、チェーン的につなげられるのが特徴

####②delete
指定したDBに対して直接DELETEクエリが実行される。
そのため、destroyのようにチェーン的につなげられない。

deleteを使うメリットは処理速度の速さ
destroyは検索をかけた後に一つずつ削除するので処理が多くなるが、deleteは検索をかけて一致するデータをまとめて削除する
そのため、レコードの数が多く、チェーンさせる必要がない時などはdeleteの方が有効

ちなみにhas_manyに対してはdependent: :delete_all
belongs_to, has_oneに対してはdependent: :delete

####③nullify
指定したDBのレコードの外部キー部分にnulを与える。

関連するモデルのレコードは残しておきたいという時に便利
また、処理はnulによるupdateなので、deleteよりも軽いらしい

<br>
以上、3つの特徴を表でまとめるとこんな感じになる

|                                   |チェーン的| 処理速度|レコードが残るか|
|:----------------------------------|:-----:|:------:|:----------:|
| :destroy                          |   ○   |  △     |  ×         |
| :delete<br>(has_manyは:delete_all)|  ×     |    ○   |  ×        |
| :nullify                          |   ×   |    ◎   |   ○        |

<br>

# 参考URL
- http://blog.aqutras.com/entry/2016/04/20/210000
- https://www.stacky-health.work/2018/08/17/ruby_on_rails_dependent/
画像揺らし機(黒いフィルター式)を作った

[クソアプリ2 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/kuso-app2)の25日目の記事です。
アドベントカレンダーのトリを努めさせてもらいます！

どうも、こんにちは。 @scrpgil です

突然ですが、みなさんは、下のフィルターをみたことがありますか？

<img width=200 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165335/49668358-0457-cb6d-0fe5-6f1245ec44fb.png"/>

今年の9月ごろ、Twitter界隈で流行っていたので、見たことある人もいると思います。

なんと、このフィルター、**重ねれば、どんなものでも揺らせる凄いフィルターなんです!**
![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165335/fe8de7b4-272b-8bac-8ce4-a8f1fc3ca055.gif)


というわけで、9月ごろ、誰でもこのフィルターを合成できるサービスを作りました。
<img width=200 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165335/2ae8c13d-2263-dc3a-04d5-3dd6c23b197b.png" />
[画像揺らし機](https://hobby.senju.dev/)

しかし、ここで一つ問題が・・・。

フィルターの合成画像は簡単に作れても、揺らすのに少しコツがいるんですよね。

どうも、揺れる仕組みは、「**踊るハート錯視**」という現象を応用しているそうなんですが、認識に個人差があるようなんです。

上のサイトでも、プログラムで自然に揺れるよう試してみたんですが、どうも微妙です・・・。
![output3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165335/f63bfaf8-e571-38cd-c0a6-736528296b42.gif)


**というわけで、今回は、揺らし方を、パラメータで設定できるようにしました！**

これなら、多少の個人差も自分で設定できるようになります。きっと、個人の認識さを吸収する設定を見つけられるはずです！

これが完成すれば、すべての人が、自分の揺らしたい画像を、好きなだけ揺らせるようになるはずです。

早速やってみましょう！

## 機能
・・・というわけで、作成したのが、こちらです。
<img width="285" alt="Screen Shot 2019-12-24 at 4.48.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165335/39182956-f458-1404-4187-66c1bd7f70e6.png">


ご覧の通り、揺らすことに関して、詳細な設定が行えるようになりました。

各項目は、次の通りになっています。
X：横方向の揺れ
Y：縦方向の揺れ
Scale：画像の大きさ
Delay：揺れのスピード

Xをスライダーを調整すれば、横方向だけ揺らすこともできますし・・・。
![output1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165335/ef147bdb-b1a2-d0eb-2c59-e74c575ea3ca.gif)

Yなら縦方向のみ揺らすこともできます！
![output2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165335/7f15c663-d2c3-6646-7feb-1dd8a32a21f6.gif)

これで、揺れを思い通り設定できるようになりました！

ちなみに、私のおすすめは、X:0、Y:47、Delay:16です。
![output4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165335/3e3d57cf-ad53-88aa-9824-5d68105fce24.gif)


## ソースコード
GitHubに上げてあります。
[ソースコード](https://github.com/scrpgil/shaker-image)

ちなみに、このサービスは、Ionic Framework(+Stencil)を使っています。
綺麗なUIコンポーネントが揃っており、余計なことを考えなくても、お手軽に高品質のアプリを作成できるのでおすすめですよ！

![download.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165335/d5ceeac8-03e4-b5fc-624f-1459a299c1e0.jpeg)
[https://ionicframework.com/](https://ionicframework.com/)

## まとめ
いかがでしたか？
これで、思いのまま、画像を揺らせるようになりました。

「**手で揺らした方が早いよ！**」と言えば、それまでですが、細かい設定ができるようになったので、より定量的に揺らし方を見ることができます。

お気に入りの揺れ具合を、数値で交換したりもできるでしょう！

ちなみに、この機能の実装は、**試行錯誤の結果、3時間ほどかかりました。悔いはありません。**
それでは、
Rails6 のちょい足しな新機能を試す114（database_exists?編）

# はじめに

Rails 6 に追加された新機能を試す第114段。 今回は、`database_exists?` 編です。
Rails 6 では、データベースが存在するかどうかを確認する database_exists? メソッドが追加されました。

Ruby 2.6.5, Rails 6.0.2.1 で確認しました。 (Rails 6.0.0 でこの修正が入っています。)

```shell
$ rails --version
Rails 6.0.2.1
```

今回は、データベースが存在するかどうかを確認するスクリプトを作って確認してみます。

# Rails プロジェクトを作成する

```shell
$ rails new rails_sandbox
$ cd rails_sandbox
```

# スクリプトを作成する

`database.yml` から `development:` の設定を読み取ります。
`database.yml` の `adapter:` の情報から対応するデータベースの Adapter を決定し、 `database_exists?` メソッドを呼び出します。

`Hash` を使わずに動的に adapter の情報を取得する方法~~がわかりません~~を手抜きで調べませんでした。

```ruby:scripts/database_exists.rb
ADAPTERS = {
  'postgresql' => :PostgreSQLAdapter,
  'mysql2' => :Mysql2Adapter,
  'sqlite3' => :SQLite3Adapter
}

config = ActiveRecord::Base.configurations[:development]
adapter = ADAPTERS[config['adapter']]
puts ActiveRecord::ConnectionAdapters.const_get(adapter).database_exists?(config)
```

# データベースが存在しない状態にする

念のため、データベースを削除しておきます。

```shell
$ bin/rails db:drop
```

# スクリプトを実行する

スクリプトを実行すると、 `false` と表示されます。

```shell
$ bin/rails runner scripts/database_exists.rb
Running via Spring preloader in process 936
false
```

# データベースを作成してからスクリプトを実行する

データベースを作成してから、スクリプトを実行してみると、最後に `true` と表示されます。

データベースを作成します。

```
$ bin/rails db:create
Created database 'app_development'
Created database 'app_test'
```

スクリプトを実行します。

```
$ bin/rails runner scripts/database_exists.rb
Running via Spring preloader in process 974
true
```

# その他

`database_exists?` メソッドは、 SQLite3 と他のデータベースとで、 `bin/rails db:prepare` の挙動などが異ならないようにするために追加されたメソッドです。

# 試したソース

https://github.com/suketa/rails_sandbox/tree/try114_database_exists

# 参考情報

* [Add database_exists? method to connection adapters](https://github.com/rails/rails/commit/ee9036ea11d3657e68d187379c92e35b23c6261b)
ImageJの基本的な機能まとめ


ImageJはNIHで開発されたJavaベースの画像処理ソフトウェアです。
生物学研究では標準的に使われています。

ImageJはオープンソースのため多数のディストリビューションが存在しますが、特にFijiがよく使われます。（そのため「Fiji is just ImageJ」と言われる。）
画像解析で「こういう処理がしたい」と思ったとき、Fijiにはその機能が大体は入っています。（ただし高度なものは除く。高度なことはMATLABかPythonで実装しましょう。）

以下ImageJを使っていくうえで基本的な機能をまとめます。

###Stack(スタック)
例えば動画を撮った場合には、ImageJには複数の画像の集まりとして読み込まれます。保存の場合もtif形式であれば、複数の画像を一つの集まり(スタック)として1つのファイルに保存することができます。
スタックとしては動画のような時間軸方向のつながりもありますが、他にも深さ（ｚ方向）を変化させた場合のスタック(つまり3次元データをスライスしてできたスタック)や、RGBのような波長の違いによるつながり（チャンネル）があります。
ImageJではこれらの3つのつながりを別々として、スタックとすることができて、最大で5次元情報となるハイパースタックを扱うことができます。
ハイパースタックもtifファイルとして保存することができます。しかし、これをMATLAB等で読み込みと、5次元のスタックも3次元として読み込まれます。順番としては、チャンネル、ｚスタック、タイムスタックの順になっています。

###LookUp
よくやる作業は、[Image]タブの[Ajust]の[Brightness/Contrast]で、輝度を線形変換することです。またLookUp tablesで色を変えることもできます。
LookUpは見え方を変えるだけなので、**画像の輝度値は全く変えていない**のがポイントです。
表示の方法を変えているだけです。保存したものを他のソフトで見ると全く変わってないことがあります。
ただし、[Apply]ボタンを押すと見え方が採用され、輝度値が変化します。


###ROI(region of interest)
画像の領域を指定してマークを付けたり、そのピクセルを関心領域として設定する機能です。
スタック画像の場合は、スライスも指定してマークできます。
四角や丸のボタンがROIの取り方の設定です。
[crtlキー + t]コマンドで囲んだROIをROI manegerに登録できます。
[Measure]で領域に対する情報が表示されます。
ROIは画像にOverlayとして付属させることができますし、また画像とは別のroiファイルとして保存することができます。


###メタ情報
1 pixel当たりの長さ（つまり解像度）などのメタ情報も設定することができて、tifファイル形式なら保存できます。情報は[Properties...]などで見ることができます。
この長さ情報を基に[Scale bar...]でスケールバーをつけることもできます。

###macro(マクロ)
マクロは一連の処理を記録して自動化する機能です。
[Plugin]の[Macros]の[Record...]で記録が開始し、その後自分がした処理が記録されていきます。Excelのマクロと似た感じで、非常に便利です。マクロはijmファイルとして保存できます。

###plugin
マクロと似てますが、ImageJの機能を拡張することができる機能です。pluginはImageJのホームページ等で多数紹介されています。jarファイル（コンパイルされたjavaの実行ファイル）をpluginフォルダに入れるとインストールされます。
自分でオリジナルのpluginを開発することもできて、Javaで書くことができます。
大草原ガチャ

## インストール

```shell-session
$ gem install daisougen
```

```shell-session
$ daisougen
Commands:
  daisougen gacha           # 大草原ガチャ
  daisougen help [COMMAND]  # Describe available commands or one specific command
```

## 基本的な使い方

```shell-session
$ daisougen gacha
草草草
```

## 応用的な使い方

```shell-session
$ daisougen gacha --emoji
:dai::sou::sou:
```

## 技術

### ソースコード

https://github.com/mktakuya/daisougen

### RubyによるCLIツール作成

- [erikhuda/thor](https://github.com/erikhuda/thor)

### 組み合わせ（重複を許す組み合わせ）

- [Array#repeated_combination](https://docs.ruby-lang.org/ja/latest/method/Array/i/repeated_combination.html)
CSSの複数のセレクター選択の話

#CSSで複数クラスを指定してスタイルを適用する

HTMLで例えば "class1" と "class2" というクラスがあって、そのどちらにも同じスタイルを適用したい場合ってありますよね。（まぁ同じクラスにまとめちゃえばいいんじゃんって時もあるんですけど、それは置いといて笑）

そんな時は、CSSで複数のクラスを指定しましょう。

##CSSで複数のクラスを選択

例えば、h1とpに同じスタイルを適用したい時。

2つのクラスの間にあるのは、、、**"カンマ"**です！！

```CSS:stylesheet.css

h1, p{
   color: red;
}

```


##CSSで親要素の中の子クラスを選択

例えば、上で既にh1には "color: red;" が適用されていますよね。
でも、class = "bottom-container" のdivの中のh1だけは、h1を白にしたい！そんな時はどうするか。

2つのクラスの間にあるのは、、、**"スペース"**です！！
（※親要素と子要素の関係でのみ成立するため注意。）


```CSS:stylesheet.css

h1, p{
   color: red;
}

.bottom-container h1{
   color: white;
}


```


##ある１つのHTMLタグで複数CSSクラスを持つ要素を選択

これは複数のクラスを持つタグのみに特定のスタイルを適用する時。

例えば、class1で文字色RED、class2で文字色BLUEになっているけど、<p class="class1 class2">のように両クラスを持つタグだけは違うスタイルを適用したい。って時はこれを使います。

2つのクラスの間にあるのは、、、**"無"**です！！
何もなく、そのまま2つ目のクラスを指定します。

```CSS:stylesheet.css

.class1.class2{
   color: green;
}


```

Codeplyでやってみると、こんな感じ。

<img width="1272" alt="スクリーンショット 2019-12-25 11.54.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161691/7d656ee5-f3e7-3276-3bf9-3161b434f2d1.png">
Windows Server プロセッサー要件

#概要

俺のxeonが、はじかれる。
要件、調べてみた。


#Windows Server 2012 R2

 - 以下の第 7 世代までの Intel プロセッサ 
(Intel Core i3-7xxx/Celeron/Pentium、Xeon E3 v6)、
Xeon SP 32xx、42xx、52xx、62xx および 82xx、Xeon D 15xx、および Atom C33xx
 - 以下の第 7 世代までの AMD プロセッサ
 (AMD A シリーズ Ax 9xxx & E シリーズ Ex 9xxx & FX 9xxx)、
AMD Ryzen ファミリ、AMD EPYC 7xx1、AMD EPYC 7xx2

#Windows Server 2016

 - 以下の第 9 世代までの Intel プロセッサ 
(Core i3-9xxx、Pentium G5xxx、Celeron G49xx)、
Xeon E22xx、Xeon SP 32xx、42xx、52xx、62xx および 82xx、Xeon D 21xx、Atom C33xx
 - 以下の第 7 世代までの AMD プロセッサ 
(AMD A シリーズ Ax 9xxx & E シリーズ Ex 9xxx & FX 9xxx)、
AMD Ryzen ファミリ、AMD EPYC 7xx1、AMD EPYC 7xx2

#Windows Server 2019

 - 以下の第 9 世代までの Intel プロセッサ 
(Core i3-9xxx、Pentium G5xxx、Celeron G49xx)、
Xeon E22xx、Xeon SP 32xx、42xx、52xx、62xx、82xx、Xeon D 21xx、Atom C33xx
 - 以下の第 7 世代までの AMD プロセッサ 
(AMD A シリーズ Ax 9xxx & E シリーズ Ex 9xxx & FX 9xxx)、
AMD Ryzen ファミリ、AMD EPYC 7xx1、AMD EPYC 7xx2

以上。
[firebase] firebaseのデプロイでコケた話

手軽にWebサイトがアップロードできるサービスとして
Googleが提供するfirebaseが便利で使いやすくはありますが、
デプロイするのにハマったことがありますので共有記事を書きます。

結論から言うと
「firebase init」した際に本来ならデプロイするためのファイル一式が生成されるはずなのにコマンドが完了しても一向にファイルが生成されませんでした。


解決方法の前にfirebaseのデプロイ方法について
まとめておきますので、結論だけを知りたい方は一番最後までスクロールしてください。


# firebaseデプロイ方法
firebaseのアカウント登録（無料）
https://firebase.google.com/

1.firebaseインストール＆ログイン&プロジェクト作成

```
npm install -g firebase-tools
firebase login
```
紐づけたいアカウントを選択

firebaseのコンソール（ページ右上にボタンがある）からプロジェクト新規作成
<img width="461" alt="スクリーンショット 2019-12-25 11.05.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393193/e82db708-d2c0-e75a-88ce-5b157df5282e.png">
<img width="752" alt="スクリーンショット 2019-12-25 11.05.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393193/ef50d6c1-eea7-6bdf-a0ad-85006176403e.png">

・アナリティクスを入れるか入れないかは任意選択可

2.firebaseファイルの生成＆初期設定

```
mkdir myApp（名前は適当に）
cd myApp
firebase init
```

```
「Hosting: Configure and deploy Firebase Hosting sites」を選択

 ◯ Database: Deploy Firebase Realtime Database Rules
 ◯ Firestore: Deploy rules and create indexes for Firestore
 ◯ Functions: Configure and deploy Cloud Functions
❯◉ Hosting: Configure and deploy Firebase Hosting sites
 ◯ Storage: Deploy Cloud Storage security rules
 ◯ Emulators: Set up local emulators for Firebase features


■firebaseでプロジェクト作成済の場合
「Use an existing project」を選択 -> プロジェクト選択
■firebaseでプロジェクト未作成の場合は
「Create a new project」を選択

ここではすでにつくっているので
「Use an existing project」を選択

? Please select an option: (Use arrow keys)
❯ Use an existing project 
  Create a new project 
  Add Firebase to an existing Google Cloud Platform project 
  Don't set up a default project 


? What do you want to use as your public directory? 
firebaseと紐づけるフォルダ名
※入力せずにエンターを押すと自動的にpublicフォルダになる(任意で変更可)

? Configure as a single-page app (rewrite all urls to /index.html)? (y/N) 
firebaseにデプロイするファイル生成
もしすでにファイルがある場合はNに
なければ「y」にする

今回はファイルは何もないので「y」にする
```

生成ファイル一式
myApp
　|- public
　　　|- index.html(ここを編集する)
　|- firebaserc
　|- .gitignore
　|- firebase.json

3.index.htmlを編集する

```html:public/index.html
<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>初めてのFirebase</title>
</head>
<body>
  Hello! Firebase!
</body>
</html>
```

4.デプロイ

```
firebase deploy
```
URLが生成されるのでこちらでアクセするとページが表示がされる
Hosting URL: https://xxxxxxxxxx.firebaseapp.com
<img width="552" alt="スクリーンショット 2019-12-25 11.22.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393193/be4db44d-4df6-ef8c-eb3d-f084d07c3a1c.png">


ローカルで動かしたい場合

```
firebase serve
```

こちらで表示
http://localhost:5000


# ハマったことと解決策
Macのホームディレクトリにfirebase.jsonが存在しているとfirebase initしても
ファイルが生成されなかった。
そのfirebase.jsonを削除したら無事ファイルが生成されてデプロイすることができました。
わかってみると簡単なことだったのに何時間もそれに費やしてしまいまじで辛かった。
WSL（CentOS7）でsystemctlを実行するとFailed to get D-Bus connection: Operation not permittedになる

## はじめに
WSLにCentOS7を入れてsystemctlを実行したところ、「Failed to get D-Bus connection: Operation not permitted」が発生して実行できず、調べてもDocker関係の記事しか出てこなかったため、悪戦苦闘してしまいました。
※WSLにCentOS7を入れる方法は https://github.com/yuk7/CentWSL/releases/tag/7.0.1907.1 を参考にしてもらえればと思います。

## 手順
今のsystemctlを『.old』などを付けてリネームし、Dockerで回避したときと同じように「 https://raw.githubusercontent.com/gdraheim/docker-systemctl-replacement/ 」にあるsystemctl.pyを利用させてもらって回避しました。

```bash
$ sudo su -
$ mv /usr/bin/systemctl /usr/bin/systemctl.old
$ curl https://raw.githubusercontent.com/gdraheim/docker-systemctl-replacement/master/files/docker/systemctl.py > /usr/bin/systemctl
$ chmod +x /usr/bin/systemctl
```
Swift5 スクロールビューをコードで実装してみた

# 始めに
今回はスクロールビューをコードで実装したいと思います。
ストリートボードで作成するやり方もありますが、色々手間が多いのでやりたくない方は必見です。
※自分用メモです。
# 実装

```swift:Test.swift
//スクリーンの幅
let screenWidth = Int( UIScreen.main.bounds.size.width)
//スクリーンの高さ
let screenHeight = Int(UIScreen.main.bounds.size.height)
//UIScrollViewのインスタンス作成
let scrollView = UIScrollView()
//scrollViewの大きさを設定
scrollView.frame = self.view.frame
//スクロール領域の設定
scrollView.contentSize = CGSize(width:screenWidth, height:screenHeight)
//scrollViewをviewのSubViewとして追加
self.view.addSubview(scrollView)
//表示ラベル
let sideMenuLabel = UILabel(frame: CGRect(x:0, y:0, width:screenWidth, height:320))
//表示可能最大行数を指定
sideMenuLabel.numberOfLines = 0
sideMenuLabel.font = sideMenuLabel.font.withSize(9)
sideMenuLabel.text = "テストで表示"
scrollView.addSubview(sideMenuLabel)
```
「プロ」と言えるエンジニアになるために

あるきっかけで再認識をするようになり、
自分の経験や読書の知識やネットを参考にしてまとめてみることにした。
自分が今後振り返るためにもいいと思った。

## 前置き
`プロ` とはなんだと考えてみる。
検索してみると(wikiより)

```
・（元々の意味）「professionに関連する」あるいは「professionに属する」という意味である。
なおprofessionとは、賃金を支払われるなりわい（＝職業）のことであるが、その中でもとくにトレーニングを要し何らかの資格を要するようななりわいを指す。つまりprofessionとは、一般に「専門的な仕事」と表現されるもののことである。）
・「職業的な人にふさわしい」という意味で、能力が高く、技に優れ、（その仕事に）確かさがある、ということ。
・（アマチュアとは異なって）「主たる収入を得るために特定の分野に従事している（人)」
```
意味は複数あるみたいだが、
スポーツ、営業、料理、エンジニア、プログラマーどれでもいいが、その道で稼げる、人生を過ごしていけるならそれは一般的には `プロ` なんだろうと思った。

現職で要件定義・設計・プログラムを書いて給料をもらって、働いている自分も一般的にはプロなのですが、
`他のエンジニア` から見て `プロ` なのかどうかってことを考えていきたい。
どの業界でも一般的に見られる `プロ` と業界内から見られる `プロ` は違うものだとおもっている。

## 同じ業界からみるエンジニアのプロとは?

エンジニアのプロになるために必要だと思う能力と優先順位をつけるならこうだと思う。

1. 責任力
2. コミュニケーション力
3. 技術力

正直いうと自分は `技術力` が１番大事だと、経験が浅い頃は思っていたし、
このことを改めて考えるきかっけをくれた人もこの考えだった。
なぜ、技術力以外の要素が優先度高いのかについて考えてみる。

## 責任力
書籍(Clean Coder)を参考にしています。
エンジニアは技術やシステムに対して知見があって当然で、それは他人との優位性を示すのではなく責任の差と考えられ、「知っている=責任がある」自分はこの考え方にすごく賛同した。

状況を分析でき、改善ができる。
必要があれば責任を取れることが大事。

技術力より優先度が高い例として、
高い技術を持っていたとして、自分がいないと仕事が回らないや
他の人が後任できないような状態を生んでしまうのは責任ある立場として問題である。
退職や転職するときに困るし、
事故に遭って入院などでしばらく会社に来れなくなる可能性だって十分あること意識する。

常に責任を考え、いざというときには取れる状態ができていることが大切。

## コミュニケーション力
仕事をこなせるだけのコミュニケーション力だけではなく、
チームや組織、システムを利用するユーザへのコミュニケーション力。

参考になった書籍は「Team Geek!」です。
* 謙虚 Humility
* 尊敬 Respect
* 信頼 Trust
H・R・Tは常に意識するようにして、無意識でもできるようになることが大切。

周りに対して強く当たったり、人の話を聞かないって人と誰も一緒に仕事はしたくないと思います。
マネジメントに関しても、過度な監視や管理は、大きくチームや、部下のパフォーマンスを落とすことが多いです。

良い製品をつくりあげるには、コミュニケーション力は必要になってくると思います。

## 技術力
あるのが当然です。 これが優先度が上記2つより低い理由です。
技術がないとエンジニアとしては成り立たないし、業界をいきていく上では
常に追い求めていくものであるから。

大事だと思うのは、現状に満足せずどこまでも追求できるところなのかなと思います。
これからも、様々な技術が溢れてくると思いますが、どこまで限界を感じず追求して、
色々なシステムをつくれるかってことかなと思います。

## プロになるために意識していきたいことやしていること
### 責任力
* 常にアフターを意識する。
* 問題を想定し起きる前に対処できるとよい。
* 不覚にも発生してさせしまったときに、素直に認めて対策に務める。
* 責任の取り方をある程度想定しておく。(エンジニアのための損害保険に加入するなど)
* 採用については、必ず自分が責任を負えると覚悟で採用する。
* チームや組織での問題を他人事にせず、自ら考え解決に務めるようにする。

### コミュニケーション力
・ H(謙虚)・R(尊敬)・T(信頼)を忘れない。
・ システムなどを利用するユーザとのコミュニケーションを怠らない。
・ チームや組織のメンバーと立場を意識せず言い合える環境づくりやなければ文化を作るようにする。
・ 決めつけるのはよくなく、必ず相手の話を聞いた上ので判断を心がける。
・ 関わりにくい人がいたとしても、恐れず(気合い)

### 技術力
* アウトプットを常に取り入れ、自分からもなるべく発信をするようにする (課題)
* セミナーや勉強会に積極的に参加して、色々な人の考え方や意見をしる。
* 単純に制作するための技術だけでなくより良いものをつくれるようにするためという点を考える。
* 知っている・学んだ技術も時代の流れとともに変化することを忘れない。
* 技術書だけでなく、エンジニアリング・組織論や色々な書籍を読む。
* 学ぶだけでなく、実践することを忘れない。

## まとめ
他にも色々な考え方をされている人は多いと思いますが、
この記事をみて、自分みたいに改めて意識して振り返ってもらえたり、また興味を
もっていただくことができたならとても嬉しいと思います。

他にもこういう考え方もあるんだよって方がいればぜひ教えてください！
今後も、こういった記事や学んだ技術を共有できるような記事を書いていければ良いなと思っています。

## この記事の参考になった書籍 (ぜひおすすめ！)
* [Clean Coder](https://www.amazon.co.jp/Clean-Coder-%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%B8%E3%81%AE%E9%81%93-Robert-Martin/dp/4048860690)
* [Team Geek](https://www.oreilly.co.jp/books/9784873116303/)
WebとReact NativeのCSSの違いについて

この記事は CSS Advent Calendar 2019 [24日目](https://qiita.com/advent-calendar/2019/css)の記事です。

8月からアプリエンジニアとしてReact Nativeを触っているのですが、WebのCSSと比べて違う部分があったので記事にしようと思いました。

### fixedが存在しない

個人的に、初めてReact Nativeをいじっていて衝撃的でした。
Webではある要素を固定したい場合、`position: fixed`を使うのが普通ですが、React Nativeではpositionで用意されているプロパティ値は`relative`と`absolute`しかありません。

https://facebook.github.io/react-native/docs/layout-props#position

ではどうすれば要素を固定できるのかというと、
ScrollViewというものを使います。

コードは以下のような感じです。

```js
<>
  <View style={{
    position: 'absolute',
    top: 300,
    width: 100,
    height: 100,
    backgroundColor: '#FF0000'}}>
    <Text>fixed</Text>
  </View>
  <ScrollView>
    <View style={[styles.container, {justifyContent: 'center'}]}>
      <Text>hoge</Text>
      <Text>hoge</Text>
      <Text>hoge</Text>
      <Text>hoge</Text>
      <Text>hoge</Text>
            ・
            ・
            ・
            ・
    </View>
  </ScrollView>
</>

const styles = StyleSheet.create ({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
  }
})
```

固定したい要素はScrollViewに含ませないようにしてあげます。
そうすることで、Fixedの要素はスクロールの対象外となるので固定されるようになります。

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271450/1d08bc9a-b5c7-a027-7eff-2bca1bd38ae7.gif)

このような感じになります。

### margin/padding

例えばWebだと上下左右にmarginを20pxずつ開けたい場合は

```css
.hoge: {
  margin: 20px;
  padding: 20px;
}
```

と書いてあげれば上下左右にそれぞれ20pxずつmarginが指定されます。

React Nativeだと

```css
.hoge: {
  marginTop: 20px,
  marginRight: 20px,
  marginBottom: 20px,
  marginLeft: 20px,
  paddingTop: 20px,
  paddingRight: 20px,
  paddingBottom: 20px,
  paddingLeft: 20px,
}
```

という書き方になり、それぞれの方向にmarginを指定してあげないといけません。
ちょっと冗長ですがReact Nativeだとこのような書き方になります。

### boxShadow

例えば
- 水平方向の影のオフセット距離 `10px`
- 垂直方向の影のオフセット距離 `10px`
- ぼかし距離 `10px`
- 広がり距離 `10px`
- 影の色 `#000`
- opacity `0.4`
という指定のbox shadowを指定したい場合はWebだと

```css
.hoge: {
  box-shadow: 10px 10px 10px 10px rgba(0,0,0,0.4);
}
```

のような書き方になるかと思います。

React Nativeだと

```css
.hoge: {
  shadowColor: '#000',
  shadowRadius: 10, 
  shadowOpacity: 0.6,
  shadowOffset: {
    width: 10,
    height: 10
  }
  width: 100,
  height: 100,
  backgroundColor: '#00ffff',
}
```

となります。

`shadowColor`はWebのbox shadowでいう影の指定になります。
`shadowOffset`はWebのbox shadowでいう水平方向の影のオフセット距離と垂直方向の影のオフセット距離の指定になります。
`shadowRadius`はWebのbox shadowでいうぼかし距離になります。

広がり距離に関してはshadowのドキュメントみても見当たらなかったのでないのかも？

https://facebook.github.io/react-native/docs/shadow-props#__docusaurus

上記で書いたコードの出力は以下のような感じです。

<img width="358" alt="スクリーンショット 2019-12-25 11.24.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271450/1aa7883e-a3cb-6fac-e84e-0d21d4b9470a.png">

ちゃんと影がついてますね。

### プロパティはコンマ区切り

cssの場合はプロパティの末尾にセミコロンをつけてプロパティを区切るのが一般的ですが、React Nativeですと基本コンマで区切ります。

### 基本の記述方法はキャメルケース
Webだと例えば、背景の色を変えたい場合は`background-color`を使いますが、React Nativeだとケバブケースは使えません。
React Nativeだと`backgroundColor`と記述します。
基本的にはキャメルケースでの記述になってます。

### まとめ
普段Webに慣れていた分、React Nativeでcssを初めて書いたときはすごい違和感がありました。
とくに要素の固定に関しては最初ちょっと使いづらかったですw

React Nativeはまだまだ発展途上のモバイルアプリケーションフレームワークですが、普段Webに慣れている方なら敷居はかなり低いと思いますので、興味ある方は是非触ってみてください。
2019年12月版 Cloud9 + Vue でとりあえず動くまでの手順

# 目的

  1. Cloud9上での vue app の開発環境の構築

# 前提

  1. 利用するリージョンは ap-northeast-1
  1. アプリ名は myapp

# 構築手順

<ol>

<li>Cloud9の開発環境作成  

  aws consoleで作成

</li><li>nodeのインストール

  最新、または、好みのバージョンを確認


```console
$ nvm ls-remote
```
  指定したバージョンでインストールを実行

```console
$ nvm install 指定のバージョン
```

今回は v13.5.0 をインストール

```console
$ nvm install v13.5.0
```

</li><li>vue cli のインストール

```console
$ npm install @vue/cli
```

</li><li>vue project の作成

```console
$ vue create myapp 
$ cd myapp
```

</li><li>vue app を起動して確認（失敗）

```console
$ npm run serve 
```

  メニューの Preview -> Preview Running Application を実行  
  <font color="red">Invalid Host header と表示されアクセスできない</font>

</li><li>vue config の作成

vue.config.js を以下の内容で myapp のルートに作成する

```vue.config.js
module.exports = {
  devServer: {
    disableHostCheck: true
  }
}
```

</li><li>vue app を起動して確認

```console
$ npm run serve 
```

  メニューの Preview -> Preview Running Application を実行  
  Vueアプリが表示される

</li>
Swift5で非同期処理を用いたHTTP処理

# はじめに
自分用のメモとして残します。

## マエフリ
アプリケーションを実行する上でサーバ通信は欠かせない存在です。
そんな中、クライアントとサーバ間で通信する上で**HTTP通信**というものがあります。
今回はそのHTTPと非同期処理を組み合わせた記述を紹介します。
※HTTPの仕組みや非同期処理の説明などは知見がある前提です。
#コード紹介



```swift:Main.swift
//実際に送るJson型のオブジェクト
let params:[String:Any] = [
    "id": "Test",
    "pass": "1234567890"
]
//トリガー
ApiRequest(params: params,url: "URL", { str in
    
    do{
        // パースする
        let items = try JSONSerialization.jsonObject(with: str) as! Dictionary<String, Any>
        //エラーを吐いているかいないか確認
        if items["error_code"] as! Int == 0 {
            //成功処理
           print("成功！！！")
           
        }
        else{
            //失敗時エラー処理
            print("失敗！！！")
            return
        }

    }
    catch{
    }
    
})

//API処理
func ApiRequest(params: [String:Any],url: String, _ after:@escaping (Data) -> ()){
    //受け取りデータ
    var acceptanceTextData: Data!
    
    //WebAPi 指定
    var request = URLRequest(url: URL(string: url)!)

    //ヘッダー設定
    request.httpMethod = "POST"
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    
    //非同期処理を行う
    let dispatchQueue = DispatchQueue(label: "Dispatch Queue", attributes: [], target: nil)
    
    do{
        request.httpBody = try JSONSerialization.data(withJSONObject: params, options: .prettyPrinted)
        let task:URLSessionDataTask = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: {(data,response,error) -> Void in
            let resultData = String(data: data!, encoding: .utf8)!
            //Jsonデータをディシリアライズ
            var personalData: Data =  resultData.data(using: String.Encoding.utf8)!
            
            dispatchQueue.async {
                //Dataに格納
                acceptanceTextData = personalData
                //実際に格納処理している
                after(acceptanceTextData)

            }
        })
        task.resume()
        
        
    }catch{
        //ネットワークエラー
        return
    }
}


```

#コード説明
まずAPIサーバと通信する際だいたい、URLの末尾が処理によって変わる為、毎回毎回HTTP処理のメソッドを記述するのは可読性が悪くなってしまいます。
その為、HTTP処理専用のメソッドを作りAPIサーバと通信をしたいときにJSONを使ったPOST処理の場合は上記に記述した構文を使うことができます。
Catapultホワイトペーパー(ドラフト)の目次の和訳

# はじめに

NEM2(Catapult)のコア開発者のJaguarさんがCatapultのホワイトペーパーのドラフトを作成したとのことで、目次だけ訳してみました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ホワイトペーパーの最初のドラフトが終了しました。まだ編集と改善が必要です。<br>🎁 <a href="https://twitter.com/hashtag/nemAdventCalendar2019?src=hash&amp;ref_src=twsrc%5Etfw">#nemAdventCalendar2019</a> <a href="https://twitter.com/hashtag/catapult?src=hash&amp;ref_src=twsrc%5Etfw">#catapult</a><a href="https://t.co/3Dhf3ee0KY">https://t.co/3Dhf3ee0KY</a></p>&mdash; Jaguar0625 (@Jaguar0625) <a href="https://twitter.com/Jaguar0625/status/1209607358009237504?ref_src=twsrc%5Etfw">December 24, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 原文

こちらからどうぞ

- https://nemtech.github.io/catapult-whitepaper/main.pdf

# 目次

## 1. イントロダクション
  - 1.1 バリエーション
  
## 2. システム

  - 2.1 トランザクションプラグイン
  - 2.2 Catapult拡張機能
  - 2.3 サーバー
    - 2.3.1 キャッシュデータベース
  - 2.4 ブローカー
  - 2.5 リカバリー
  - 2.6 共通トポロジー
  
## 3. 暗号法
  - 3.1 公開鍵/秘密鍵ペア
  - 3.2 署名と検証
  - 3.3 バッチ検証

## 4. 木
  - 4.1 マークル木
  - 4.2 パトリシア木
  - 4.3 マークルパトリシア木
  - 4.4 マークルパトリシア木の証明

## 5. アカウントとアドレス
  - 5.1 アドレス
  - 5.2 アドレスの導出
  - 5.3 アドレスエイリアス
  - 5.4 意図的なアドレスの衝突

## 6. トランザクション
  - 6.1 基本的なトランザクション
  - 6.2 アグリゲートトランザクション
    - 6.2.1 組み込みトランザクション
    - 6.2.2 署名
    - 6.2.3 拡張されたレイアウト

## 7. ブロック
  - 7.1 ブロックフィールド
  - 7.2 レシート
    - 7.2.1 レシートソース
    - 7.2.2 トランザクション明細
    - 7.2.3 明細の解決
    - 7.2.4 レシートハッシュ
  - 7.3 状態ハッシュ
  - 7.4 拡張されたレイアウト

## 8. ブロックチェーン
  - 8.1 ブロック難易度
  - 8.2 ブロックスコア
  - 8.3 ブロック生成
  - 8.4 委任ハーベスターの自動検知
  - 8.5 ブロックチェーンの同期
  - 8.6 ブロックチェーンの処理

## 9. 破壊者
  - 9.1 コンシューマー
    - 9.1.1 共通のコンシューマー
    - 9.1.2 追加のブロックコンシューマー
    - 9.1.3 追加のトランザクションコンシューマー

## 10. 未承認トランザクション 
  - 10.1 未承認トランザクションのキャッシュ
  - 10.2 スパムスロットル

## 11. 部分トランザクション
  - 11.1 部分トランザクションの処理

## 12. ネットワーク
  - 12.1 ビーコンノード
  - 12.2 コネクションハンドシェイク
  - 12.3 パケット
  - 12.4 コネクションタイプ
  - 12.5 ピアの起源
  - 12.6 ノードの発見

## 13. 評判
  - 13.1 接続の管理
  - 13.2 重み付けベースのノード選択
  - 13.3 ノードの追放

## 14. コンセンサス
  - 14.1 重み付けアルゴリズム
  - 14.2 シビル攻撃
  - 14.3 ナッシングステーク攻撃
  - 14.4 手数料攻撃

## 15. 時間の同期
  - 15.1 サンプルの収集
  - 15.2 フィルターを適用して不良データを削除する
  - 15.3 有効オフセットの計算
  - 15.4 カップリングとしきい値

## 16. メッセージング
  - 16.1 メッセージチャネルとトピック
  - 16.2 接続と購読
  - 16.3 ブロックメッセージ
  - 16.4 トランザクションメッセージ
    - 16.4.1 署名メッセージ

# 注意点

- Jaguarさんのツイートにも書いてありますが、まだ加筆修正が必要とのことで、また書き換わる可能性があります。

# まとめ

- Catapultを深く知りたいなら、必読の書であるのは間違いない
- ページ数は [現行NEM(NIS1)](https://nem.io/wp-content/themes/nem/files/NEM_techRef.pdf) の時の約1.6倍
- 本文も訳しながら読みたいけど、果てしなさそう...
ArchLinuxで最新のLinuxカーネルのバージョンを取得する

# これだけ

```bash
pacman -Ss | grep 'core/linux' | grep -v "linux-" | awk '{print $2}'
```

# もっと良い方法
コメントで教えてもらいました。

```bash
pacman -Sp --print-format '%v' linux
```
New Relicを使ってフロントエンドからの分散トレーシングをしてみる

New Relicでソリューションを提供している佐々木です。
本日がNew Relic Advent Calendar 2019の最終日となりました。
最後の記事として、New Relicが今月リリースしたてほやほやの新機能をご紹介したいと思います。

#New Relic における分散トレーシング
分散トレーシングはマイクロサービスアーキテクチャの普及に伴って一般的になった概念です。
ユーザーからアプリケーションへのリクエストが発生した際に、複数のサービスにまたがって実行される一連の処理を追跡するプロセスのことを分散トレーシングと呼びます。
分散トレーシングによって、一般的に難しいとされている以下のような監視を行うことができます。

- 複雑なシステム上を行き来するリクエストのパスを追跡
- そのパス沿いのコンポーネントごとの応答時間を可視化
- パス上のどのコンポーネントがボトルネックとなっているかを把握

New Relic では、トレースの対象となるサービス内の処理の1つ1つを"スパン(Span)"という単位で記録し、スパンの関係性をツリー構造で表現しています。
<img width="1402" alt="new-relic-distributed-trace-structure-diagram.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538642/23bb55df-6c9b-28c8-4438-47ba7766bf11.png">
分散トレーシングについてもっと詳細を知りたい方は、[こちら](https://docs.newrelic.co.jp/docs/understand-dependencies/distributed-tracing/get-started/introduction-distributed-tracing)のドキュメントを参照してください。

# 新機能: フロントエンドからの分散トレーシング
これまでNew Relicでは、Trace rootと呼ばれるトレースの開始地点に関して、サーバーサイド側からしか開始できなかったのですが、この度ユーザーがブラウザからページ読み込みをリクエストしたタイミングをTrace rootにすることができるようになりました！
この新機能によって、真のエンドツーエンドのトレースが可能になり、実際のユーザーの体感を把握しながらアプリケーションのパフォーマンスを詳細に分析することができるようになります。

それでは実際に設定をしてみます。

##1. サーバーサイド側の分散トレーシングを有効化

分散トレーシングはNew RelicのAPMエージェントが提供する機能なので、APMエージェントの導入が前提となります。
(他にZipkinやOpenTelemetryと互換性を持つTrace APIも提供していますが、今回は割愛します)
その後追加の設定として、エージェントが導入されたサーバーのNew Relic の設定ファイルに分散トレーシングを有効化するパラメータを記載するだけです。
パラメータは[言語ごとに異なります](https://docs.newrelic.co.jp/docs/understand-dependencies/distributed-tracing/enable-configure/enable-distributed-tracing)が、例としてJavaであれば、newrelic.yml内に

```
distributed_tracing:
   enabled: true
```
と追記します。

##2. フロントエンド(Browser)側の分散トレーシングを有効化

New Relic BrowserのSaaS GUI上で操作をするので、アプリケーションがNew Relic Browserに監視対象として登録されていることが前提となります。
New Relic Browserの画面で対象のアプリケーションを選択し、"Application settings"メニューを開きます。
その中で、

- Agentの種類で"Pro+SPA"を選択
- Distributed TracingをOnにする

の2点を設定すれば完了です。
![frontend_dt1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538642/f189c938-2f42-d9f9-4a7d-82c611234c04.png)


# 実際にこんな感じでトレースが見える

こちらがフロントエンドからの分散トレーシングの見え方例です。

![frontend_dt2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538642/753aaee5-4c25-8e2e-c84c-a85ebe89e4c8.png)

一番上がブラウザから見たパフォーマンス、その下の"oops.jsp"と"v1/Coupons/IsValid"がそれぞれ、ブラウザにコンテンツを表示させるために実行されたサービスになります。
フロントエンドでのパフォーマンスは607ms、サーバーサイドが335msと、実際にユーザーが体感しているパフォーマンスも含めてトレースが取れています。
また、このトレースはエラーが含まれており、ブラウザ上で500エラーが発生してしまっていることが、画面右側のERROR DETAILSという箇所でわかります。分散トレーシングの利点の一つとしてトラブルシューティングが簡単にできるという点があります。実際にやってみましょう。
エラーが発生しているサービスは赤字で表示されるのですが、この例ではエラーの最下層はサービス"v1/Coupons/IsValid"だということがわかります。そのエラー詳細を見ると

![frontend_dt3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538642/b0d53e97-d01e-60a1-58f7-a0da158d6b9d.png)

と、該当のクーポンが存在しないよ、というエラーメッセージを確認でき、原因をすぐに突き止めることができます。

このように、フロントエンドのユーザー体験を意識しながらアプリケーションの振る舞いの詳細を知ることができるのがNew Relicの分散トレーシングです。簡単な初期設定だけですぐにデータを見ることができますので、ぜひお試しください！
深層学習／誤差逆伝播法

#1.はじめに
　深層学習の勉強を始めました。今回は、誤差逆伝播法について、簡単にまとめてみます。

　ニューラルネットワークの出力と正解の誤差から個々の重みをアップデートするには、どうしたら良いでしょうか。

　単純に考えれば、1つ１つ重みをちょっと動かし誤差がどう変化するかを見て重みをアップデートする方法がありそうです。

　しかし、深層学習では、重みは莫大(平気に1億とか)にあるので、これは現実的ではありません。そうした背景から生まれた、効率的に重みをアップデートする画期的な方法が誤差逆伝播法なのです。

　今回は、出力層から順に遡って、どう重みをアップデートして行くかを見てみます。

#2.出力層の重みのアップデート

![スクリーンショット 2019-12-23 14.29.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/bb49181e-e4a4-bd3f-3c66-f4f0af5100a9.png)
　出力層(k層)の重み$w_{jk}$をアップデートするために、$\frac{\partial E}{\partial w_{jk}}$を求めます。

```math
\frac{\partial E}{\partial w_{jk}}=\frac{\partial E}{\partial y_k}*\frac{\partial y_k}{\partial w_{jk}}\\
=\frac{\partial E}{\partial y_k}*\frac{\partial y_k}{\partial v_k}*\frac{\partial v_k}{\partial w_{jk}}\\
```
　2項目は、$y_k=\phi(v_k)$なので、単純に$\phi'(v_k)$です。3項目は、$v_k=w_{0k}+w_{1k}*y_1+w_{2k}*y_2+...+w_{jk}*y_j$なので、$w_{jk}$の係数のみが残り$y_j$です。1項目は、例えばEを二乗誤差 $E=\frac{1}{2}\sum(y_k - t_k)^2$ とすると、$(y_k-t_k)$です。従って、$\frac{\partial E}{\partial w_{jk}}$は下記の様に簡単に求められます。

```math
=(y_k-t_k)*\phi'(v_k)*y_j\\
```
ここで、この後の説明を分かり易くするために、$\delta_k$を定義します。

```math
\delta_k=\frac{\partial E}{\partial y_k}*\frac{\partial y_k}{\partial v_k}=\frac{\partial E}{\partial v_k}\\
```
つまり、

```math
\frac{\partial E}{\partial w_{jk}}=\delta_k*y_i
```


#3.出力層ー１の重みのアップデート
　
![スクリーンショット 2019-12-23 14.56.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/f6d30ee0-6540-c9de-5177-7408297e7a7e.png)
　今度は、出力層−１(j層)の重み$w_{ij}$をアップデートするために、$\frac{\partial E}{\partial w_{ij}}$を求めます。

```math
\frac{\partial E}{\partial w_{ij}}=\frac{\partial E}{\partial y_j}*\frac{\partial y_j}{\partial w_{ij}}\\

```
$\frac{\partial E}{\partial y_i}$は入力が複数あるので多変数の連鎖律を使って展開します。

```math
=\sum_k(\frac{\partial E}{\partial v_k}*\frac{\partial v_k}{\partial y_j})*\frac{\partial y_j}{\partial v_j}*\frac{\partial v_j}{\partial w_{ij}}\\
```
先程、定義した$\delta_k$を適用すると

```math
=\sum_k(\delta_k*w_{jk})*\phi'(v_j)*y_i
```
つまり、**出力層-1(j層)の重みは出力層(k層)の計算結果を元に計算出来ます。**

さて、先程同様$\delta_j$を定義します。

```math
\delta_j = \sum_k(\delta_k*w_{jk})*\phi'_j(v_j)
```
つまり、

```math
\frac{\partial E}{\partial w_{ij}}=\delta_j*y_i
```


#4.出力層-2の重みのアップデート
![スクリーンショット 2019-12-24 14.21.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/f05828b5-c443-1905-a06d-381dc16c750c.png)

今度は、出力層−2(i層)の重み$w_{hi}$をアップデートするために、$\frac{\partial E}{\partial w_{hi}}$を求めます。

```math
\frac{\partial E}{\partial w_{hi}}=\frac{\partial E}{\partial y_i}*\frac{\partial y_i}{\partial w_{hi}}\\

=\sum_j(\sum_k(\frac{\partial E}{\partial v_k}*\frac{\partial v_k}{\partial y_j})*\frac{\partial y_j}{\partial v_j}*\frac{\partial v_j}{\partial y_i})*\frac{\partial y_i}{\partial v_i}*\frac{\partial v_i}{\partial w_{hi}}\\
```
$\delta_k=\frac{\partial E}{\partial v_k}$としたので、

```math
=\sum_j(\sum_k(\delta_k*w_{jk})*\phi'(v_j)*w_{ij})*\phi'(v_i)*y_h\\
```
$\delta_j =\sum_k (\delta_k*w_{jk})*\phi'(v_j)$としたので、

```math
=\sum_j(\delta_j*w_{ij})*\phi'(v_i)*y_h\\

```
つまり、**出力層−2(i層)の重みは出力層-1(j層)の計算結果を元に計算出来ます。**

この様に、誤差を出力層から逆方向に順番に伝搬させることによって、重みを簡単な計算で芋づる式にアップデートすることが出来るわけです。これが、誤差逆伝播法です。
Swift5でキーボードを閉じる方法(備忘録)


# はじめに
自分用のメモとして残します
## 実際のコード

```swift:Test.swift
//他の場所をタッチしてもキーボードを閉じる
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
    }
```

# 説明
基本的にキーボードイベントの呼び出したらそのままになってしまうので、
TextFirldタップ
　　　↓
キーボード表示
　　　↓
　　入力
　　　↓
画面のどこかをタップしてキーボード閉じる
の流れにしたのが今回の構文です。

以上。
[iOS/Swift] アプリ開発の実務的アプローチで学ぶデザインパターン ～Adapter～

この記事シリーズは、iOS/Swiftエンジニアである執筆者個人が、
**ごく普通のiOSアプリ開発でよくある状況**や
**Swiftのコアライブラリやフレームワークで使われているパターン**に
着目してデザインパターンを学び直してみた記録です。

**関連記事一覧**
[[iOS/Swift] アプリ開発の実務的アプローチで学ぶデザインパターン](https://qiita.com/y-some/items/96db5f24ded4a1fab48f)

# Adapterパターン概要

- 既存クラスのインターフェイスをそのまま使わずに**一皮被せて利用する**手法です。
- 既存クラスのインタフェースを使いやすく変更したりする場合に使います。
- 継承を利用した手法と委譲を利用した手法があります。
- Swiftはプロトコル指向と言われますし、また継承できないケースもあると思いますので、委譲パターンを使うケースが多いと思われます。
- Wrapperパターンと呼ばれることもあります。
- GoFのでデザインパターンでは**構造に関するパターン**に分類されます。

# 使い所

- 例えば、OSSライブラリや他社製SDKなどに関して、
    - アプリに使いやすい形式に変換することで負担を少なく／誤解なく使えるようにしたい、とか、
    - インターフェイス変更がアプリに与える影響を最小化したい、など

# サンプルコード（委譲パターン）

Swiftバージョンは 5.1 です。

```swift
struct OldDeathStarSuperlaserTarget {
    let angleHorizontal: Float
    let angleVertical: Float

    init(angleHorizontal: Float, angleVertical: Float) {
        self.angleHorizontal = angleHorizontal
        self.angleVertical = angleVertical
    }
}

protocol NewDeathStarSuperLaserAiming {
    var angleH: Double { get }
    var angleV: Double { get }
}

struct NewDeathStarSuperlaserTarget: NewDeathStarSuperLaserAiming {

    private let target: OldDeathStarSuperlaserTarget
    
    var angleH: Double {
        return Double(target.angleHorizontal)
    }

    var angleV: Double {
        return Double(target.angleVertical)
    }

    init(angleH: Double, angleV: Double) {
        self.target = OldDeathStarSuperlaserTarget(angleHorizontal: Float(angleH),
                                                   angleVertical: Float(angleV))
    }
}

let newFormat = NewDeathStarSuperlaserTarget(angleH: 14.0, angleV: 12.0)

newFormat.angleH
newFormat.angleV
```

引用元：
https://github.com/ochococo/Design-Patterns-In-Swift#-adapter
MacのFinderでVSCodeで開くメニューを作成する

調べると情報はあるもののUIや設定方法が変わっているため、自分でもメモしておく

# 環境
- macOS Catalina 10.15.2
- VSCode 1.41.1 インストール済み
  - パスはすでに通してある

# メニューを追加
「Automator」アプリを起動し、新規書類を作成し、クイックアクションを選択する
<img width="779" alt="01_クイックアクション.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125334/641cf205-e520-b848-e6a9-24ba9374e705.png">

アクションの検索バーに「シェル」等の文言を入力し、「シェルスクリプトを実行」を右側の領域にドラッグ＆ドロップする
<img width="992" alt="02_シェルを実行.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125334/10b5ef69-75a0-7f72-95fd-c3802a63dafb.png">

以下項目を設定する

- ワークフローが受け取る現在の項目：ファイルまたはフォルダ
- 検索対象：Finder.app
- 入力の引き渡し方法：引数として
- シェルの内容に以下を入力

```zsh
for f in "$@"
do
    open -a 'Visual Studio Code' "$f"
done
```

設定した画面が以下となる
<img width="992" alt="03_シェルの内容設定.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125334/9808226f-bf02-099a-93a4-419545a0c30b.png">

メニューの「ファイル」>「保存」を選択し、「Open with Code」などの名前をつける（これが**Finderに表示される名前**になる）
<img width="992" alt="04_クイックアクションを保存.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125334/c3359a39-d768-9784-958c-a706161cffbf.png">

Finderで任意のファイルまたはフォルダを選択して右クリックし、「Open with Code」（保存した際につけた名前）のメニューが表示されていることを確認する。これを選択するとVSCodeで開ける。
![05_クイックアクション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125334/8e4f762d-6e30-1c2d-6fee-446f916115b9.png)

表示されていない場合は、以下コマンドにてFinderを再起動したり、Macを再起動したりして再度確認する

```zsh
killall Finder
```

# メニューを削除
Finderで任意のファイルまたはフォルダを選択して右クリックし、「クイックアクション」>「カスタマイズ」を選択する
![06_クイックアクションを編集.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125334/71d1490c-3584-664c-8787-1eebad1bb4c5.png)

削除したい項目を右クリックし、「ゴミ箱に入れる」を選択する
![07_クイックアクションを削除.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125334/d0a33386-397c-cf2e-6d20-ea1bfd462841.png)
aタグの中にaタグをJSを使わずに配置したい

Qiita記事を見ていると「[なんとなくで書かないで！HTML5を書く時に気にしてみたいタグごとのお約束 \- Qiita](https://qiita.com/mikimhk/items/05b303d932093eb4c0d1?utm_source=Qiita%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9&utm_campaign=3726247960-Qiita_newsletter_393_12_25_2019&utm_medium=email&utm_term=0_e44feaa081-3726247960-33057705)」で、HTMLを書くときの注意点などが紹介されていました。

ただ「aタグの中にaタグ」の箇所で、JSを使う方法が紹介されていました。
これはJSは使わなくてもできます。
気になったので書いてみました。

## まず、aタグの中にaタグはどういう状況か？

例えば、カード全体がクリッカブルエリアになっており、子の要素にもリンクが必要な時です。
HTMLで表現するなら、下記の状態。

しかしHTMLの仕様上、aタグの中にaタグは含められません。
仕様を無視していれても、動作しません。

```html
<a href="" class="card">
  <div class="card-inner">
    <h1 class="card-title">Title Text</h1>
    <ul class="card-tags">
      <li>
        <a href="">tag name</a>
      </li>
      <li>
        <a href="">tag name</a>
      </li>
    </ul>
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nam, dolorum. Facilis assumenda, itaque tempore iste minus, delectus</p>
  </div>
</a>
```

画像でみてみましょう。

![custom – 1@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75375/f57525ec-080a-5066-01c5-572612264102.png)

右の赤いエリアの中に、緑のエリアを配置したいのです。
そう、やりたいことの本質は「aタグの中にaタグを配置する」ことではなく、
「クリッカブルエリアの中にクリッカブルエリアを配置したい」です。

## 対応方法

クリッカブルエリアの中にクリッカブルエリア配置したいのであれば、HTMLをaタグでカードを全体を囲むのをやめます。
見出しなどを囲むのがいいでしょう。

```html
<div class="card">
  <div class="card-inner">
    <!-- aタグをここに移動 -->
    <h1 class="card-title"><a href="">Title Text</a></h1>
    <ul class="card-tags">
      <li>
        <a href="">tag name</a>
      </li>
      <li>
        <a href="">tag name</a>
      </li>
    </ul>
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nam, dolorum. Facilis assumenda, itaque tempore iste minus, delectus</p>
  </div>
</div>
```

次は、CSSです。
クリッカブルエリアを広げたい領域の `.card` と子のクリッカブルエリアになる `.card-tags a` に `position: relative;` 宣言を指定します。

```css
.card,
.card-tags a {
  position: relative;
}
```

今度は `.card-title a` を親のクリッカブルエリアまで広げてみましょう。
これは擬似要素を使用します。

```css
.card-title a:before {
  content: '';
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
}
```

これで完成です。
[完成したコード - CodePen](https://codepen.io/kojika17/pen/MWYobpV)

このやり方を魔法のように感じる方もいらっしゃると思いますが、CSSの位置決めスキームを利用した方法です。
positionプロパティがわかれば、理解しやすくなるでしょう。

**追記: 2022/12/06**

今なら、これでいけます。

```css
.card-title a:before {
  content: '';
  position: absolute;
  inset: 0;
}
```
AngularのStateを確認できるChrome拡張機能「Angular state inspector」

## はじめに
AngularのStateを確認できるツール「Angular state inspector」の紹介をしていく。
Serviceクラスでのデータ管理の際、わざわざConsole.logとかしなくても値が確認できるようになる。データだけならDebugでも済むが、NgRx等の状態管理フレームワークを使っているなら楽に確認できる。

## インストール
[こちら](https://chrome.google.com/webstore/detail/angular-state-inspector/nelkodgfpddgpdbcjinaaalphkfffbem)から対象のChrome拡張機能をインストールする。

## Angularプロジェクトを起動

```bash
$ ng serve --open
```

## ChromeのDevToolsからデータを確認する
1. DevToolsを開いたら左上の「Select an element in the page to inspect it」を選択
2. 見たいデータが表示されている箇所を選択。
3. Consoleに

```console
Angular state inspector shortcuts:
    $scope/$context: Element debug info
    $getDetectChanges()/$tick()/$apply(): Trigger change detection cycle
```
が表示されたら、`$scope`を入力してEnterを押すとServiceクラスの状態がConsoleに表示され、データを確認できる。![angular-state-inspector-example.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316318/53105ebc-2f5e-f91e-cc69-90f8e95b3e6e.gif)
本物のプロジェクトマネージャはWBSを書かない

反面教師的なあれです
# 本物のプロジェクトマネージャはWBSを書かない

## 本物のプロジェクトマネージャはWBSを書かない
開発者から上がった見積もりから、タスクの一覧を作成し、工数が書ければそれでプロジェクトを始められるため本物のプロジェクトマネージャはWBSを必要としない

## 本物のプロジェクトマネージャはタスクの根拠を考えない
タスク一覧は開発者から上がったも見積から出ているため、本物のプロジェクトマネージャはタスクの根拠を考える必要がない
開発者から上がったものをスタートさせるときに本当に問題ないかを確認することは時間の無駄である。

## 本物のプロジェクトマネージャはスケジュールをデッドラインから考える
プロジェクトには完了しなければならない期限が存在する。これは絶対的なことなので、マスタースケジュールや個々のタスクは全てデッドラインから考える必要がある。
やるないようが終わらないのはメンバが使えないか、人が足りないだけである

## 本物のプロジェクトマネージャは人をコマとして考える
体制を考えるときに、本物のプロジェクトマネージャは人をコマとして考え、パズルのように組み合わせることにより、プロジェクトをスタートさせる
人が開けばそこに新しい仕事をさせるのが正解だ。もしそれが出来ないのであれば、それはメンバが役立たずなだけである。
メンタルケアなんてありえない

## 本物のプロジェクトマネージャは調整を必要としない
本物のプロジェクトマネージャが書いたすべてのものが正であり、他のPJやメンバに対して調整をする必要はない

## 本物のプロジェクトマネージャは成果物を考えない
成果物はメンバの担当者が考えるものであるため、本物のプロジェクトマネージャが成果物を考えることはない
見積、タスク、工数はすべて開発者が考えるものであるため、根拠となる成果物はもちろん開発者が知っていればよい

## 本物のプロジェクトマネージャはチャット（メール）やプロジェクト管理ツールを見ない
チャットやプロジェクト管理ツールなどは仕事の邪魔でしかないため、本物のプロジェクトマネージャはチャットやプロジェクト管理ツールを見ることはない
反応なんてもってのほかだ

## 本物のプロジェクトマネージャは目の前のことしか考えない
仕事は目の前のことをしていけば進んでいく、本物のプロジェクトマネージャは仕事を進めるため、目の前の作業を完了させていく必要がある

## 本物のプロジェクトマネージャは自分の管理をしない
プロジェクトマネージャとは、メンバを管理するものであるため、自分の管理はしない
メンバが出来ない場合には叱咤すればよい
遅れたことを追求し、叱ることもプロジェクトマネージャの仕事だ

## 本物のプロジェクトマネージャは偉くなくてはならない
プロジェクトマネージャは周りから偉いと思われてなければならない。
なぜなら管理する必要があるためだ

## 本物のプロジェクトマネージャは開発を始めないメンバや遅延を発生させたメンバを怒る必要がある
タスク一覧を作ったのにもかかわらず、動き出さないメンバやその通りに動けなかったメンバが居たらそのメンバを叱咤する必要がある。
プロジェクトを回すためには怒ることも必要なのだ

## 本物のプロジェクトマネージャは嘘も方便であること理解する必要がある
進捗報告などで、次回その進捗遅延が解消されるのであれば、遅延を連絡する必要はない。
なぜなら、解消可能な遅延を客先に通知することで無駄に心配、不安をあおることはよくないからだ

## 本物のプロジェクトマネージャは質問に対し問題ない様に見せる必要がある
嘘も方言と似たようなことかもしれないが、質問に対しては問題ない様に答えなければならない。
まずは「はい」という回答を覚える。
上からの質問は基本的に「大丈夫ですか？」という意味合いの質問なので「はい」と言っておけば問題ない

## 本物のプロジェクトマネージャは質問に対し、遠回しの答えを言えるようにならなければならない
答えが「はい」にならないような質問に対してはその場を濁す回答を出来るようになる必要がある
例えば「いつまでに出来るか？」という質問に対しては「調整中ですor検討中です」などである。
それでも、「いつまでに出来るかを答えられる日時は？」というようなしつこい質問については
その場をごまかす必要がある
期限を決めて、その日までに出来なければ問題になるため、期限は出来るだけ答えないようにしなければならない

## 本物のプロジェクトマネージャは請け負ったものに関して一人で完成させなければならない
プロジェクトマネージャは完全無二でなくてはならないため、プロジェクトマネージャがやらなくてはならないものはメンバの力を書いてはならない

## 本物のプロジェクトマネージャは責任をメンバに取らせら必要がある
メンバが遅延をした、メンバがリリースに失敗した、メンバがバグを見抜けなかった
すべてメンバがやったことで、メンバのせいであるため、これを怒り、責任を取らせなければプロジェクトは正常に回らない。

## 最後に
上記に示したように、プロジェクトマネージャは唯一無二で、完璧を求められ
メンバがやってしまった失敗について、怒る必要はあるし、メンバに責任を取ってもらわなくてはならない。
とても大変な職種であるためお金はたくさんもらえるのだ。

メンバはいつも技術力がバラバラで、大抵失敗する。
その責任を取らせるのに、プロジェクトマネージャはいつも動かなくてはならないのだ
UbuntuにNASを接続する簡単な方法

メモ記事

BUFFALOのLinkStationを使っているが、WindowsやMacと違って、Linuxへの接続方法はマニュアルにはなかった。
方法は様々あるが、コマンドを使うことなく簡単に接続する方法が分かったので以下に書く。

#接続方法
NASの設定で、SMBA接続設定をオンにしておく。
ファイルエクスプローラーで「サーバーへの接続」をクリックし、

```
smb://<NASのIPアドレス>
```
を入力して接続するだけ。
電源を切ると接続が解除されるが、お気に入りとしてタブに追加しておけば、毎回入力する手間もない。
これで、ファイルの受け渡しが非常に楽になった。

参考記事：https://www.atmarkit.co.jp/ait/articles/1502/13/news042.html