OmniAICreator/Qiita-1.07M huggingface dataset:
ネットワーク分析における中心性について（メモ）

「社会科学のためのデータ分析入門（下）」（今井耕介 著）を読んで、ネットワーク分析における中心性について学習しています。
以下、学習メモです。誤り等がありましたらご指摘いただけますと幸いです。

#中心性を表す尺度について
ネットワークにおける中心性（ネットワークの中で、各ノードと他のノードとのつながりや、グラフの中心に位置していることの程度を数量化できる様々な尺度）を表す尺度として、次数・近接性・媒介性などがある。

- 次数
ノードがグラフ内の他のノードとどの程度よくつながっているかを表すいちばん大雑把な尺度。次数はあるノードから伸びたエッジの数を単純に数えたものに過ぎないので、すぐ隣よりも離れたグラフの構造は考慮しない。
    - Rの関数:degree()

- 近接性
離心性の逆数。なお、離心性とはあるノードがグラフ内の他の各ノードからどの程度離れているかを表す尺度。
    - Rの関数:closeness()

- 媒介性
あるノードが他のノード間の接続に関わっているときに中心的であると考える尺度。
（あるノードのペア間のコミュニケーションが最短の経路で行われると仮定すると、最短経路の途中にあるノードはネットワーク内で特別な影響力を持っているかもしれないと考えられる。）
    - Rの関数:betweenness()

- 他に、中心性については以下のHPが参考になりそうです。
    - https://www.logos.ic.i.u-tokyo.ac.jp/~chik/InfoTech12/08%20Masuda.pdf
    - http://bin.t.u-tokyo.ac.jp/startup17/file/2-1.pdf

#Rとigraphで表現してみる。
これまでの架空のプロジェクトを例に、中心性を表す指標について確認してみます。
まずは読み込みから。

```ruby:R
#project.csvの読み込み
project <- read.csv("project.csv", row.names = "PROJECT") 
#matrix()で行列に変換
project <- as.matrix(project)
#resultというオブジェクトを作成。元のprojectに対する転置行列をt()で作成し、%*% 演算子で元の行列に転置行列を掛けた内容を格納。
result <- project%*%t(project)
#igraphを読み込み
library("igraph")
#グラフオブジェクトを作成
result<-graph_from_adjacency_matrix(result, mode = "undirected",weighted=TRUE,diag = FALSE)
plot(result,edge.width = abs(E(result)$weight)*2)
```

この図ができます。
![スクリーンショット 2019-12-08 12.00.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149401/39eae83c-9a1c-1874-7ccd-2b1ed23b7245.png)

##次数について

まずは次数について調べてみます。

```ruby:R
degree(result)
a b c d e f 
5 4 4 5 2 4 
```
このとおり、aとdが他のノードといちばん多くつながっていることがわかります。

##近接性について

次に近接性について調べます。

```ruby:R
closeness(result)
        a         b         c         d         e         f 
0.1250000 0.1250000 0.1250000 0.1666667 0.1250000 0.1666667 
```
先ほどの次数とは異なり、近接性としてはdとfが高いことがわかります。
なお、別の方法として離心性を尺度に表現することもできます。
この方法では、あるノードから別のノードへのエッジの平均数を計算し、この数が少ないほどあるノードから他のノードへの距離が小さいと表現することができます。
具体的には、離心性をグラフ内の他のノード数で割ることで求めます。
この例では合計6のノードがあるので、離心性を5で割ります。

```ruby:R
1/(closeness(result)*5)
  a   b   c   d   e   f 
1.6 1.6 1.6 1.2 1.6 1.2 
```
結果、dとfは最小（つまり、dとfは他のノードへの距離が小さい）であることがわかります。

さらに、近接性を図で表現してみます。
近接性の値は比較的小さいので、グラフ上のノードを拡大するため200倍にしてみます。

```ruby:R
plot(result,edge.width = abs(E(result)$weight)*2,vertex.size=closeness(result)*200,main="closeness")
```
こんな感じで出力されます。
![スクリーンショット 2019-12-08 12.01.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149401/e986331c-19ce-3618-f0a3-fc4c927c1e99.png)

##媒介性について
最後に媒介性について調べます。

```ruby:R
betweenness(result)
        a         b         c         d         e         f 
0.5000000 0.0000000 0.0000000 2.8333333 0.3333333 1.6666667 
```
このとおり、媒介性はdが最も高く、次いでf,aと続くことがわかります。
同じく媒介性も図で表現してみます。
また、同じくグラフ上のノードを拡大するため30倍にしてみます。

```ruby:R
plot(result,edge.width = abs(E(result)$weight)*2,vertex.size=betweenness(result)*30,main="betweenness")
```
するとこんな感じで出力されます。
![スクリーンショット 2019-12-08 12.03.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149401/21a90356-d699-ba47-1d0e-76142c2f091b.png)
reactを使って横幅サイズ次第で別のHTMLを出す

#なぜやるのか
とあるプロジェクトで、結構厳密なデザインHTMLをBootstrapのレスポンシブで対応を試みた所、かなり期待通りの動きをしないので、Bootstrapを捨ててReactで画面サイズによって見せるHTMLをそもそも変えようと思った。

#用意したもの
react（本体）
react-responsive　（MediaQuery関係）
react-snap (react プリレンダリング）
ソースはこちら
https://github.com/UG/reactResponsiveTest


##PCサイトの見栄え　（例）
![pc1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269117/349717c1-ec19-ca30-52d3-22c7163b6623.png)

##スマホサイトの見栄え（例）
![sm1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269117/30e6511f-e905-08ae-7523-cd763bcd9205.png)




#実際のコード
###App.js

````javascript
import React from 'react';
import './App.css';
import pcsite from './pcsite.jsx'
import smartphone from './smartphon.jsx'

function App() {
  const [size, setSize] = React.useState({ 'width': window.innerWidth, 'height': window.innerHeight });
  window.addEventListener('resize', function () {
    setSize({ 'width': window.innerWidth, 'height': window.innerHeight });
  }, true);
  return (
    <div>
      {size.width > 375 * 2 ? pcsite() : smartphone()}
    </div>
  );
}

export default App;

````
 制御としてはwindow.innerWidthをリサイズ毎にステートセットし直す。 スマホは横幅375*2扱いが多いみたいなので、一旦そこをボーダーにしてみた。

###pcsite.jsx

````javascript
import React from 'react';

export default function pcsite() {
    const test = 'hoge';
    const html = `
    <br>
    <br>
    <br>
    <div class="center">
        <div class="yellowBackground">
            <div class="stepBox">
                <span class="circleStep">1</span>
                <p>test text</p>
            </div>
            <div class="stepBox">
                <span class="circleStep">2</span>
                <p>test text</p>
            </div>
            <div class="stepBox">
                <span class="circleStep">3</span>
                <p>${test}</p>
            </div>
        </div>
    </div>
    `;
    return (
        <div dangerouslySetInnerHTML={{ __html: html }} />
    );
}
````

reactのdomはHTMLぽいけど、HTMLじゃないので、この様にtemplate stringを使ってHTMLを挿入し、普通のDOMに突っ込むとタグごと出てくるので dangerouslySetInnerHTMLで出力しないとだめらしい。
物々しい名前なのは実際にx-site Scriptingの脆弱性があるから基本使うなという事らしい。
(const使ってれば大丈夫な気がするが、そういう事ではないのか？)

テンプレート文字列にも変数は打ち込めるので、サーバーサイドのテンプレート言語と遜色ないと思う。
スマホHTMLは割愛、ほぼpcsiteと同じ内容で、向いてるCSSが違うとか、全く違うHTMLを書いて構わない。

#ハマった点、まだハマり中

 -  react-responsiveを使うと、期待した通りの動きができると思ったけど初回しか識別しない模様。
 -  PCのブラウザを、DevToolでスマホに変えれば、スマホの方が出てくれる
 -  でもブラウザの方をいくら縮めても、スマホという認識をしない。おそらくuser-agentとか色々見てるせい
 -  テンプレート文字列にBootstrapを使うと、bootstrap.min.cssをlinkタグで利用すると、CSSがぶっ壊れて描画しなくなるので、共存できないかもしれない。
 -  react-bootstrapなるものが存在するが、htmlで div class="sm"とかできない＜sm＞というタグを使うことになるので、HTML-bootstrapで作った物をreact-bootstrapでそのまま使う事はできない気がする。
 -  prerender部分まだエラーが出てちゃんとできてないのでいつかやる。SEO上ゴミだとクライアントが許してくれないと思うので。

そのうち追記するかもです。
BitVisorとIOMMU (VT-d)

BitVisorはIOMMU (VT-d) を以下のように利用しています．

- VT-dの隠蔽
- IOMMUによるBitVisorの保護
- ファームウェアが有効化したVT-dの無効化

以下でこの機能について簡単に説明します．

なお，IOMMUはIntelとAMDで異なりますが，BitVisorが対応しているのはIntel(VT-d)のみです．

## ソース
以下あたりに関連する箇所があります．

- core/acpi.c
- core/acpi_dsdt.c
- drivers/iommu.c
- driver/dmar.c

## VT-d
Intel VT-d (Intel® Virtualization Technology for Directed I/O)[1] には以下のような機能が含まれます．

- DMA Remapping
    - PCIデバイスがDMAで利用するアドレスの変換．通常IOMMUといった場合この機能を指すことが多いかも．
- Interrupt Remapping
    - 割り込み番号の変換
- Posted Interrupts
    - VMX non-rootのゲストにVMEXIT無しで割り込みを挿入する機能

なお，VT-dは名前から察するにもともと仮想化を意識して導入された機能のようですが，VT-dの機能は必ずしも仮想化(VT-x)と合わせて利用する必要はありません．例えば，仮想化環境でない通常のOSでもDMA RemappingやInterrupt Remappingが利用できます．

BitVisorは設定次第でDMA Remapingを利用します．

## VT-d情報の取得
VT-dの情報はACPIのDMARテーブルに含まれています（ちなみに，AMDの場合はIVRSというテーブルがあります）．BitVisorのブートの初期段階で呼ばれる`acpi_init_global()`でACPIテーブルを解析しています．

## VT-dの隠蔽
`acpi_init_global()`では，ACPIテーブルのシグネチャをNULL埋めすることでDMARをゲストから隠蔽しています．（結果として，ゲストはVT-dを利用しなくなります）．これは例えばゲストがIOMMUを設定してしまうと，ゲストの設定したIOMMUについて知らないBitVisorのデバイスドライバが正しく動作しなくなるためです[^1]．

[^1]: 例えばゲストにPCIデバイスを隠蔽してBitVisorが利用する場合，ゲストOSからはそのデバイスが見えていないので，ゲストOSはそのデバイスに対するIOMMUマッピングを作成しません．結果としてそのデバイスはDMAできなくなります．

## DMA RemapingによるBitVisorの保護 (`VTD_TRANS`)
`VTD_TRANS`というコンフィグが有効の場合（デフォルトでオフ），DMA Remappingを利用してBitVisor自身を保護するようになります(`drivers/iommu.c:iommu_setup()`)[2]．

もともとBitVisor自身のメモリ領域はBIOSで利用不可能領域としてゲストに通知 & EPTで保護されていますが，原理的にはデバイスはDMAによりBitVisorのメモリ領域にアクセスすることが可能です．これをDMA Remappingで防ぐのがこのオプションです．具体的には以下のようなマッピングを設定します．

- ゲストにパススルーするデバイスは，BitVisorが使用するメモリ範囲はDMA不可
- BitVisorが使用するデバイスは，BitVisorが使用するメモリ範囲の一部のみDMAを許可 (`add_remap()`で設定)

## ファームウェアが有効化したVT-dの無効化 (`DISABLE_VTD`)
`DISABLE_VTD`というコンフィグが有効の場合（デフォルトでオン），BitVisor起動時にVT-dが有効であった場合に，それを無効化します（VT-dのstatus registerを0にする）．これは，macのファームウェアは起動時にVT-dを有効化する一方で，BitVisorがDMARを隠蔽したままmacOSが起動するとクラッシュすることの対策です．macでBitVisorを利用する場合にはこのオプションを有効にする必要があります[3]．

## AMD IOMMUについて
最初に書いた通り，現在BitVisorにはAMD IOMMUのサポートはありません（IOMMUを特に隠蔽せず，ゲストにそのまま見せています）．BitVisorのデバイスドライバが有効かつ，ゲストがAMD IOMMUを有効にするとおそらく何かしらの問題が生じると思います[^2]．

[^2]: 手元にAMDのマシンがないので試したことはありません．

## 参考文献
- 1. [Intel® Virtualization Technology for Directed I/O Architecture Specification](https://software.intel.com/en-us/download/intel-virtualization-technology-for-directed-io-architecture-specification)
- 2. deep\_tkkn, [IOMMUによるBitVisorの保護](https://qiita.com/deep_tkkn/items/30d93fb2cc0213875566), BitVisor Advent Calendar 2017, 2017.
- 3. 榮樂 英樹, [BitVisor 2017年の主な変更点](https://www.bitvisor.org/summit6/slides/bitvisor-summit-6-3-eiraku.pdf), BitVisor Summit 6, 2017.
     - "最新ファームウェアがVT-dを有効にするようになったため無効化機能を追加 (CONFIG_DISABLE_VTD)"
dataflowを使って簡単なstream処理を試す


本記事はFringe81アドベントカレンダー2019の8日目の投稿です。
今年はStream処理がどんなものなのか、Scioでdataflowのstream処理を実装して試してみました。
dataflow(GCP)のドキュメントでも触れられている有名なストリーム処理の記事がなかなかハードな内容だったので理解のため実際に動かして試してみることにしました。
https://www.oreilly.com/ideas/the-world-beyond-batch-streaming-102
Scioを使ったdataflow実装については以前の投稿も参照くださいm(--)m

## Stream処理とは？（batch処理との比較）
- 無限データ(継続した区切りのない連続データ)を扱う
- よりタイムリーで即時性あるデータ処理を実行

## 具体的に長所短所（batch処理との比較）
- 長)データ入ってくるタイミングで即座に処理できる。
- 短)常に処理を待ち受けるため、コストがかかる
- 短）即時処理のために色々考慮することがあって複雑性が増す。

## 処理単位の種類
連続データのStream処理を考えた場合以下のパターンが考えられる

- Fixed time windows
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26997/936aac75-ffa1-760a-9fa2-26701973c096.png)

- Sliding time windows
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26997/8ed3e21a-2c49-e307-1da6-64c4dafdfa72.png)

- Session windows
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26997/ca50c698-0c46-0ad3-09b5-8874902dc0ee.png)

cf.https://beam.apache.org/documentation/programming-guide/#windowing

## まずはシンプルに「Fixed time windows」の処理を実装する
- 固定window期間を2分に設定
こうすることで2分ごとに集計結果が更新される

```scala
def calculate1(infos: SCollection[GameActionInfo]): SCollection[(String, Int)] =
    infos.withFixedWindows(Duration.standardMinutes(2))
      .map(i => (i.team, i.score))
      .sumByKey
```

※ただし、集計間隔の2分より遅れて到達したデータは漏れてしまう。
![スクリーンショット 2019-12-08 12.55.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26997/02e020e7-cf50-d755-33e1-5c89efe3a191.png)
cf. https://www.oreilly.com/ideas/the-world-beyond-batch-streaming-102

## 「Stream処理を実装する=windowから外れた値をどう処理するか」を扱う概念

- Watermark
 どの値までデータ処理に渡されたかの目安(推測値)。

- Trigger
 windowに溜まったpane(中身)をどのタイミングで処理するか定義

- Accumulation
 同一windowの複数結果を算出する場合の関係性や動作を定めるもの

これらを取り入れて実装すると以下になります。
これにより、window間隔に対するある程度の遅れデータまで考慮した集計が可能となって信頼性が上がる処理ができました。

```scala
def calculate2(infos: SCollection[GameActionInfo]): SCollection[(String, Int)] =
    infos.withFixedWindows(Duration.standardMinutes(2),
      options = WindowOptions(
        trigger = AfterWatermark.pastEndOfWindow()
          .withEarlyFirings(AfterProcessingTime.pastFirstElementInPane()
            .plusDelayOf(Duration.standardMinutes(1)))
          .withLateFirings(AfterProcessingTime.pastFirstElementInPane()
            .plusDelayOf(Duration.standardMinutes(5))),
        accumulationMode = ACCUMULATING_FIRED_PANES,
        allowedLateness = Duration.standardMinutes(600)))
      .map(i => (i.team, i.score))
      .sumByKey
```

## やってみて
stream処理がどんなものか試してみるため、比較的シンプルなところを実装してみました。
stream処理は文章で読むよりも実装して試した方が理解しやすいと思ったので、興味ある方は先ず動かしてみるをオススメします！！

## ソースコード
https://github.com/kaz3284/4qiita/tree/master/dataflowstreaming

## 参照元
https://www.oreilly.com/ideas/the-world-beyond-batch-streaming-101
https://www.oreilly.com/ideas/the-world-beyond-batch-streaming-102
https://beam.apache.org/documentation/programming-guide/
NameError: undefined local variable or methodに詰まったので、しっかりエラー文を読んでみた

#NameErrorで詰まりました（業務未経験）

初めての投稿です。
udemyのフルスタックエンジニアが教える即戦力rails講座を受けていて、エラーが出たのでしっかり読みました。

今回でたErrorがこちらです

board_controller.rb内

```
NameError: undefined local variable or method `board_parms' for #<BoardsController:0x00007f2dea369c18>
from (pry):7:in `create'
```

デバッグツールのpry-byebugを使っていたらこんなのが出ました。

これを読んでみると、NameError・board_paramsがローカル変数またはメゾッドで未定義です。7行目のcreateのなかでと解釈しました。（自分は）

これのやることは簡単です。

createアクションないにboard_paramsを定義すれば良いんです。なので

```
def create
  Board.create(board_params)
end
```
と追記するとエラーが解消されました。

間違えていたらご指摘お願いします。
失礼します。
【Oracle Cloud Infrastructure】Always Free対象でVMインスタンス作成したはずなのに、課金対象となっているのはなぜか

# 
1. 以前、以下「VMインスタンスの作成」からインスタンスを作成した。<br>
<img width="1060" alt="Oracle_Cloud_Infrastructure.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141308/02885edd-563b-29ca-244f-8b6cae7306df.png">
2. １週間経過してログインしてみると、請求対象があるというので「コスト分析」をクリック<br><img width="294" alt="Oracle_Cloud_Infrastructure.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141308/415313be-8ac0-469c-0dd5-04b69c619712.png">
3. コスト分析<br><img width="1386" alt="Oracle_Cloud_Infrastructure.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141308/82655e86-b779-b342-1b46-026590f71fb1.png">
    - ブロック・ストレージ
    - コンピュート
4. コンピュート。。。ということでインスタンスを停止してみる<br><img width="1415" alt="Oracle_Cloud_Infrastructure_と_「【Oracle_Cloud_Infrastructure】Always_Free対象でVMインスタンス作成したはずなのに、課金対象となっているのはなぜか」を編集_-_Qiita.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141308/425e9c31-ab93-9e64-3c21-a313ddcb779e.png">
5. 停止して半日経過した、やっぱり増えてる<br><img width="1384" alt="Oracle_Cloud_Infrastructure.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141308/62262989-41fa-e1d8-b156-d15529a1e94f.png">
6. わかった。Always Freeのシェイプがシドニー・リージョンにはない！<br><img width="1308" alt="Oracle_Cloud_Infrastructure.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141308/71c10b30-12c5-5273-255b-8df90e5e9d98.png">
7. こっちが東京・リージョンのシェイプ、シドニー・リージョンで作成した時メモリの割り当て多いなって思ってたんだけど、そういうことか・・東京・リージョンはリソース不足で作れないんだよね。早く対応してくれないかな<br><img width="1320" alt="Oracle_Cloud_Infrastructure.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141308/20cdb025-92ff-9d27-0f4e-66563544b4b0.png">
awsのs3にコマンドでデータをアップして更新し、使い終わったデータは削除する（途中）

[AWS CLI バージョン 1 のインストール](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv1.html)

AWS CLI の最新バージョンのインストール
`pip3 install awscli --upgrade --user`

一応インストールはできたようだが、
`aws --version`
とすると、
`zsh: command not found: aws`
と出てきてしまう、、、
[AWS CLI バージョン 1 実行ファイルを macOS のコマンドラインパスに追加する](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-macos.html#awscli-install-osx-path)
上の記事を元に「オペレーティングシステムの PATH 環境変数への aws プログラムの追加」をする。
→でもやっぱり
`zsh: command not found: aws`
と出てしまう...？

`which python`
で`/Users/ユーザー名/anaconda3/bin/python`と出てくる。

[AWS CLI をインストールする](https://qiita.com/mokuo/items/0484feefbaddb70a9b06)
上の記事によると
最初のインストール時に--userとすると、.localにインストールされるらしい。
~/.local/binにPATHを通す必要があるのに、現在は

`export PATH="/Users/ユーザー名/anaconda3/bin:$PATH"`
となってしまっているのが原因かと、、、

anacondaを使った場合はやり方が違う？
[how to install AWSCLI on a Anaconda python distribution](https://stackoverflow.com/questions/37282994/how-to-install-awscli-on-a-anaconda-python-distribution)
[aws codecommit aws: command not found](https://qiita.com/sachiko-kame/items/126e0a41acf270d05a73)
###→結論
`conda install -c conda-forge awscli`
を実行してみたら、見事AWS コマンドを使えるようになりました。

##AWS CLIの設定
[参考サイト](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-configure.html)
`aws configure`
↓
`AWS Access Key ID [None]: 〜〜
AWS Secret Access Key [None]: 〜〜
Default region name [None]: ap-northeast-1
Default output format [None]: json`

[AWS CLIのコマンド一覧](https://qiita.com/uhooi/items/48ef6ef2b34162988295)
`aws s3 ls`でs3の中身を見ることができることを確認

##s3上にあるファイルをローカルにコピーする。
`aws s3 cp s3://{バケット名}/{パス} {ローカルのパス} `

s3上のファイルのパスは「ファイルをクリック→コピーパスをクリック」でコピーできます。（以下はダウンロードフォルダにダウンロードする場合）
`aws s3 cp s3://〜〜〜 /Users/ユーザー名/Downloads
`

## pythonでファイルを解凍し、余計なカラムを削除
[参考:pandas.read_csvで圧縮ファイルも読み込めちゃうの。とても便利！](https://qiita.com/shotakaha/items/c11c5d9c6e0788dc4bdf)

```python:
import pandas as pd
df = pd.read_csv('ファイル名.csv.gz')

#使わない列を削除
df=df.drop(columns=['A','B','C'],axis=1)

#列aに欠損値があればその行を削除
df=df.dropna(subset=['a'])

df.to_csv('./renamed_file/圧縮後のファイル名.csv.gz', index=False, compression='gzip')
```

## pythonからコマンドを実行する。
[【Python入門】subprocessを使ってコマンドを実行しよう！](https://www.sejuku.net/blog/51090)

###試しに、pythonからs3の中身を見てみる
```python:
import subprocess

subprocess.call(["aws","s3","ls"])
```

→成功

##ダウンロード/point_dataフォルダにS3からダウンロードし、解凍してから加工をくわえ、ダウンロード/renamed_fileフォルダに圧縮し直してから配置し、S3の指定の場所にアップロードする。

```python:
import subprocess
path_list=[ダウンロードしたいS3上のファイルのPATHのリスト]
for s in range(len(path_list)):
    cmd="aws s3 cp"+" "+path_list[s]+" "+"/Users/ユーザー名/Downloads/point_data"
    subprocess.call(cmd.split())
    df = pd.read_csv(filename_list[s])
    #使わない列を削除
    df=df.drop(columns=df.columns[[1,2,3,4,5]], axis=1)#数字は列の番号左は例
    
    #カラム名Aがない行を削除
    df=df.dropna(subset=['A'])
    #保存
    file_name='/Users/ユーザー名/Downloads/renamed_file/'+ファイル名
    df.to_csv(file_name, index=False, compression='gzip')
    cmd2="aws s3 cp"+" "+"/Users/ユーザー名/Downloads/renamed_file/"+ファイル名+" "+ 'アップロードしたいS3上の場所のPATH'
    subprocess.call(cmd2.split())
    
```
Animation icon

・Animation icon
https://loading.io/animation/icon
https://material.io/design/iconography/animated-icons.html
https://icons8.jp/c/animated-icons

・svg animation
https://jp.vuejs.org/v2/cookbook/editable-svg-icons.html
https://codepen.io/team/Vue/pen/dJRpgY

・material cdn
https://material.io/develop/web/docs/getting-started/

・material catalog
https://material-components.github.io/material-components-web-catalog/#/

・material svg
https://dev.materialdesignicons.com/icons
https://materialdesignicons.com/tag/community
dotfilesの世界をパクってみた

# dotfilesの世界をパクってみた
## はじめに
[ようこそdotfilesの世界へ](https://qiita.com/yutakatay/items/c6c7584d9795799ee164)を参考に、Windows上での環境整備を始めてみた。ツールとしては、gitとCMD Batch、robocopyを使用。ディレクトリ構造としてはいったんこのような構造で。

* Backgrounds
* Icons
* Scripts
* dot
* WindowsTerminal
* ConsoleZ

BackgroundsはWindowsTerminalの壁紙を格納、%USERPROFILE%のPictures\Backgroundsに展開。IconsはWindowsTerminalのアイコンを格納、%USERPROFILE%のPictures\Iconsに展開する。Scriptsは環境の展開用のCMD Batchを格納している。dotには%USERPROFILE%以下に展開される、ドットファイルを格納。ConsoleZとWindowsTerminalはそれぞれ、ConsoleZとWindows Terminalの設定ファイルを格納してる。

現在の、deploy.batはこのような内容。

```{cmd}
copy ..\WindowsTerminal\profiles.json %USERPROFILE%\AppData\Local\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\profiles.json
copy ..\ConsoleZ\console.xml %USERPROFILE%\AppData\Roaming\Console\console.xml
copy ..\dot\.nyagos %USERPROFILE%\.nyagos
robocopy ..\Backgrounds %USERPROFILE%\Pictures\Backgrounds /e
robocopy ..\Icons %USERPROFILE%\Pictures\Icons /e
```
UIログの意味と残し方

#自己紹介
初めまして、2019年4月からSierのエンジニアとしてデビューしたポンコツエンジニアです。
これまでQiitaにはお世話になってきましたが、忘れっぽい自分のためにメモ書きとして残していきます。
現在はC#を使ってシステムの改修作業を行っています。

#概要
今回の改修作業では、画面イメージ作成と画面制御を担当していました。
ソフトウェア詳細設計から行い、デバッグ作業に入って気づいた**ログ**の大切さ。
自分なりの解釈で残していきます。

注)ログの残し方は、業務によって決まっていると思うので、残すタイミングは要確認です。

#結論
ユーザインタフェースログ（以下※UIログ）はエラー発生時、担当エンジニア(作成者とは別のエンジニア)がUIログを見てトレース(追いかける)する為に必要です。
残す時に意識するのは
- **場所（エラー発生箇所）**
- **タイミング**
- **発生時に持っている値**
を残した方がいいです。

参考:[ログで分かる あなたの会社のIT活用度](https://www.itmedia.co.jp/im/articles/0409/30/news108.html)

#ログの重要性
結論で述べたように、何も知らないエンジニアが見ても分かるようにした方がいいです。
何かシステムバグが発生した場合に、あなたは仕事を辞めているかもしれない。
そんな中、保守作業を行うエンジニアがログを見て、ソースを調べたら原因が分かるような残し方がいいです。

ソースを見なくても分かるように残すとするとログを大量排出する事になる為、
ログのボリュームが増えてしまいます。

##発生した訳
1.テストを行う
2.何かしらのバグが見つかる
3.上司に報告する
4.「ログを見た？」と毎回聞かれる

残し方を知らなくてもログで大体のエラー発生箇所は書いてあるので、エラーの箇所はわかります。
自分が作成するログは「 **残すもの**」という浅い考えだった為、各関数の処理が始まる前に「画面名」「文言」「状態(値)」を残していました。

同画面で、動きがない場合もログを残していました。
(「状態」は何も参照していないのに残していました。)

##問題点
改修作業で追加の場合は、基本的に既存ソースを流用して作成しますが、
既存と新規追加の画面で処理内容が変わっているのに、合わせるのを意識しすぎて無駄に処理を増やしていました。

##気をつける点
次の処理が、ある値によって変わる場合などはログに出力を行う。
次の処理が決まっている場合はログへの出力は省いても問題はないと思います。

#最後に
こんな拙い文章を読んで頂きありがとうございます。
間違っている、わかりづらい点をコメント頂ければ私も勉強になりますのでお願いします。
プログラミングの細かい内容ではありませんが、ログの残し方がまだ分からない自分自身の為に残しておきました。
GitHub Pages で静的ページを公開するまで


CSSのお勉強がてら、HTMLとCSSだけで静的ページを作ってGitHub Pagesで公開してみた

備忘録として書くぞ〜

# やること

- GitHubで公開リポジトリを立てる
- ソース等をプッシュする
- リポジトリのSettingsからGitHub Pagesの項目へ移動し、Sourceを設定する

これだけ。

**これだけ。**

簡単すぎる。

# 詳細な手順

流石に内容がないようすぎるので、後からすぐにわかるように画像つきで。

まずは公開でリポジトリを作るぞ。
Repository nameがURLになるからそれっぽい名前をつけておこう。
<img width="600" alt="img2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418810/607ab6c7-d0dd-40a2-c1b0-8a568e6a4a10.png">

あとは作りながらプッシュしていく。
VisualStudio Codeならエディタ内だけでGitの操作が完結するのでめちゃ便利。

今回のディレクトリ構成。かなり簡素。
![img1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418810/9ebf8b08-64d7-de27-8de8-131a72848192.png)

では、実際にページを表示してみよう。
リポジトリのトップページのタブから[Settings]、下へ行き[GitHub Pages]へ。
<img width="600" alt="img３.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418810/e519112c-ddcf-5bef-9c2d-8200012c49ea.png">


[Source]のプルダウンから[master branch]を選択すると、URLを発行してくれるよ。
「おめえのサイトは『URL』で公開する準備できたぞ」的なこと言ってくれてるね。
<img width="600" alt="img4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418810/18f2c8db-0d85-61a1-75db-c6170e568098.png">

実際にアクセスしてみて404を吐かなければ、きちんと構成できてるのでOK。


[https://kachiku-kun.github.io/hp_kachiku/](https://kachiku-kun.github.io/hp_kachiku/)

よさそうだね。

後はスマホなどの他端末で検証してみつつCSSを調整して完成させる。
<br>

簡単すぎる。

# HTML & CSS 

頭悪いサブタイトル。
よく使った要素をちょこっと書いていく。

```position: fixed;```
static, relative, absolute, fixedがある。

staticに対しての配置を意味する。
相対的か、絶対的か、スクロールに対しても絶対的かという感じ。

static以外は、top, bottom, left, rightで位置を指定できるよ。

```overflow: hidden;```
ボックスからはみ出した要素をどうする？ってやつ。hiddenで消える。

他にも飛び出したり(デフォルト)、スクロールバー出たり、ボックスを消したりなど。

```z-index: 1;```
レイヤーみたいなもん。詳しく言うと、ボックスを重ねたときの優先度。

```:before{} :after{}```
要素セレクタにひっつける擬似要素。その要素の前後に何か挿入する時に使う。
要素セレクタとはh1とかだよ、念為。

```display: block;```
ボックスの設定。
blockはインライン要素をブロックへ変換し、前後に改行が入るようになる。
flexはフレックスコンテナ化する。
フレックスコンテナとは、コンテナ内にアイテムという子要素を整列し表示できる便利なヤツ。

```text-align: center;```
ボックス内でのテキストの配置。
centerは中央揃え、justifyは均等割り付けなど。

```letter-spacing: 2px;```
字間。

```border-radius: 60%;```
画像などを丸める。

```flex: 0 0 33.333333%;```
アイテムがフレックスコンテナ内で占めるサイズを指定できる。

```max-width: 33.333333%;```
要素の幅を制限できる。
もちろんheightもあるよ。

```object-fit: cover;```
画像なんかがボックスにどう当てはまるか決める。
coverはアス比を変えずトリミングする。

他にもアス比を変えて当てはめたり、全体が見えるように引きで当てはめたりなど

```100px  150%  1.5em```
pxは普通にピクセル。絶対値指定。

%は親要素のフォントサイズを100%としたときの割合を示す。

emは%と似ていて、親要素のフォントサイズを1emとしたときの割合。


以上。
# 〆

完全に現実逃避で始めたGitHub Pagesお試しだったけど、なんだかんだ楽しかったのでよし！

しかし、マジで簡単にページ作れるし、httpsだし、管理も楽だしで、ホントにプログラマはGitHubに頭上がらんなあ・・・。

スッキリしたしやるべきことやるぞ〜。
CentOS8 - Install - OpenJDK



### OpenJDKの検索
~~~
yum search java-1.8.0-openjdk
~~~

### JDKランタイムのインストール
~~~
yum install java-1.8.0-openjdk
~~~

### JDK開発環境のインストール
~~~
yum install java-1.8.0-openjdk-devel
~~~

### バージョン確認
~~~
java -version
~~~
- 環境変数の設定がどうなっているのかイマイチ不明
- ディレクトリの変更をしなくてもバージョン確認可能

### 環境変数の確認と設定
~~~
// 環境変数の確認
dirname $(readlink $(readlink $(which java)))

// 環境変数の設定
???
~~~

### HelloWorld.javaの作成と実行
~~~
// ドキュメントディレクトリへ移動
cd ~/ドキュメント

// 配下に java/src ディレクトリ作成
mkdir java/src
cd java/src

// HelloWorld.java 作成
vim HelloWorld.java
~~~

~~~HelloWorld.java
class HelloWorld{
        public static void main(String[] args){
                System.out.println("HelloWorld");
        }
}     
~~~

~~~
javac HelloWorld.java
java HelloWorld
~~~

### 参考文献
[CentOS7にJava OpenJDK8のインストール](https://qiita.com/Esfahan/items/60cf425514c66553bd42)
[PATHの設定方法](http://devb.hatenablog.com/entry/20101203/1291391256)
Linux標準教科書その5

## シェル
OSは大きく分けてカーネルとユーザランドの二つの領域に分かれます。カーネルはハードウェアを操作する機能を提供しています。シェルはカーネルが提供する機能を操作際の橋渡しをしてくれるものです。**カーネルを外側から貝殻(shell)の様に包み込んでいる**ためこのような名前が付いています。


## シェルスクリプト
シェルに実行してほしい操作をファイルにあらかじめまとめておくこと。シェル用の台本(スクリプト)と言えます。シェルスクリプトには使いたいオプション、コマンドの他に条件分岐、順次実行、繰り返し、サブルーチン(関数、または処理をまとめて、再利用できるプログラムのこと)のような制御構文を書いておく。
システム開発について

<h2>目的：システム開発全体に必要な知識をまとめる</h2>

<h3>問題</h3>
<p>次から次に新しい用語や技術が出てくるけど、最低でどれくらいの知識が必要なのか知りたい。</p>

<h3>解決策</h3>
<p>システム開発の流れに沿って、必要となるワード（知識）を洗い出す。</p>

<h3>システム要件定義</h3>
<p>機能、能力、業務、組織および利用者の要件、設計制約条件、適格性確認要件、システム要件の評価など。ユーザーが何を必要としているのか。どんな機能が必要で、どんな条件があるのかを明確にする。</p>

<h3>システム方式設計</h3>
<p>ハード・ソフト・手作業の機能分割、ハード・ソフト・システム処理・データベース方式設計、システム方式の評価。どれに何をさせるのか、そして、何を使うのか。</p>

<h3>ソフトウエア要件定義</h3>
<p>機能、能力、インターフェースなどの要件の決定、ソフトウエア要件の評価。UML,E-R図、DFD、、、どんな機能が必要で、どんな応答が欲しいのか。</p>

<h3>ソフトウエア方式設計・ソフトウエア詳細設計</h3>
<p>ソフトウエア構造とコンポーネント設計、インターフェース設計、ユニットテスト設計、結合テスト設計、設計評価、プロセス中心設計、データ中心設計、構造化設計、オブジェクト志向設計、モジュール設計、アーキテクチャパターン、デザインパターン</p>

<h3>ソフトウエア構築</h3>
<p>ユニット作成、コーディング基準、コードレビュー、メトリクス計測、デバッグ、テスト手法、テスト準備（テスト環境、テストデータ他）、テスト実施、エビデンス取得、テスト結果評価</p>

<h3>ソフトウエア結合テスト・適格性確認テスト</h3>
<p>テスト計画、テスト実施、テスト結果評価</p>

<h3>システム結合・適格性確認テスト</h3>
<p>テスト計画、テスト準備、実施、結果評価。チューニング、テスト種類（機能テスト、非機能要件テスト、性能テスト、負荷テスト、セキュリティテスト、リグレッションテスト）</p>

<h3>導入</h3>
<p>導入計画の作成、導入実施</p>

<h3>受け入れ支援</h3>
<p>受け入れレビュー・テスト、納入と受け入れ、利用者マニュアル、教育訓練</p>

<h3>保守・廃棄</h3>
<p>保守形態、保守手順、廃棄</p>
ラムダ式　streamAPIの使い方

なんとなくラムダ式の使い方がわかったのでまとめておく。

# StreamAPIの概要

　・大量データを逐次処理するストリーム処理を効率的に記述するため
　・コレクション操作を効率的に行うため

に考案された。

　HowではなくWhatで記述するのが特徴と言われている。

　「作成」→「中間操作」→「終端操作」の順で記述される。

　繰り返し分を書かず、ネストを減らせることや、分かっている人にはみやすいことが利点の模様。

# 配列のstream　

　arrays
　
# Listのストリーム作成の使用例


```
　int sum = List.stream()//リストをストリームに変換する。（作成）
　　　　　　.mapToInt(s -> Integer.ParseInt(s)) （中間操作）
　　　　　　.sum();(終端操作)
```

まずはストリーム化することからstreamAPIは始まる。
文字列型のListがint型に変換され、合計値が出てくる。

# Mapのstreamの使用例

```
int Score = Student.stream()
            .map(s->s.getScore)//Studentから点数の要素をgetする中間操作。
　　　　　　 .forEach(system.out::println)
```
Studentというgettersetterのオブジェクトを作っておいて、各生徒の点数を順に書き出す。


なんかもうちょっと良い例があれば、書き足したい。
Hadoopについて

<h2>目的：大きすぎるデータの処理</h2>
<h3>問題（具体例）</h3>
<p>amazonnとかgoogleとか楽天とか、大きなIT企業では１日に取得するデータ量（販売量、顧客情報、履歴等々）が１日に処理できるデータ量を超えてしまった。１００万件を超えるような電子商取引のデータから、「支払拒否」「在庫切れ」「無効な入力」などの例外が発生した件数を１週間分取得したいとか。</p>

<h3>解決策</h3>
<p>分散して処理させたらよくね？（分散処理）<br>
処理する機械の性能をあげるのにはコストかかるし、プログラムの記述方法を改善するのには限界がある。ここは人海戦術がもっともコスパがいいな。安っすいサーバーたくさん買ってきて、同時に処理させたらいいんだよ。</p>

<h3>具体的な方法</h3>
<p>HDFS（hadoop distributid file system）:hadoopのファイル管理システム。大きなファイルを分割して、複数の装置に分散して記憶、保管する。<br><br>
MapReduxe: HDFSにアクセスするためのプログラミングモデル。HDFSで分散された各サーバー上で、保存されたデータを処理し、処理できた奴らを統合して結果を返してくれるやつです。</p>
semantic_loggerの紹介

こちらは[Ateam Finergy Inc\. Advent Calendar 2019 \- Qiita](https://qiita.com/advent-calendar/2019/ateam-finergy) 16日目の記事になります。

## はじめに

Railsのログ出力に標準の形式以外のものを使いたいことがあると思います。

例えばエイチームフィナジーのサービスでは、ログ解析にCloudWatchLogsやElasticSearchやKibanaを使用しています。
これらのサービスと連携するために、JSON形式のほうが扱いやすいので、RailsのログをJSON形式で出力しています。

この記事では、JSON形式でログ出力をするためのsemantic_loggerというgemを紹介します。

## semantic_loggerとは

https://rocketjob.github.io/semantic_logger/

semantic_loggerとは、Ruby Railsのログ出力をカスタマイズすることができるgemです。
JSON形式でログ出力する設定をできます。

[Rocket Job](http://rocketjob.io/)というジョブスケジュールシステムを作っているところが作っています。

## 導入方法

今回はrailsのログをjsonで出力する方法を紹介しようと思います。

1. Gemfileに追加

    ```
    gem 'rails_semantic_logger'
    ```
1. bundle install
    
    ```
    bundle install
    ```
1.  rails server起動

    ```
    bundle exec rails s
    ```
1. 確認

    ```
    2019-12-08 11:49:38.614204 D [20892:puma threadpool 003] ActionView -- Rendering -- {:template=>"vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/templates/rails/welcome/index.html.erb"}
    2019-12-08 11:49:38.619906 D [20892:puma threadpool 003] (5.616ms) ActionView -- Rendered -- {:template=>"vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/templates/rails/welcome/index.html.erb"}
    2019-12-08 11:49:38.620177 I [20892:puma threadpool 003] (11.4ms) Rails::WelcomeController -- Completed #index -- {:controller=>"Rails::WelcomeController", :action=>"index", :format=>"HTML", :method=>"GET", :path=>"/", :status=>200, :view_runtime=>6.71, :db_runtime=>0.0, :status_message=>"OK"}
    ```

## ファイル出力しない設定

例えばAWS ECS Cloudwatch Logs連携をしていたりする場合、標準出力からCloudwatch Logsへログの内容が送られるため、ファイル出力が不要です。

なのでその場合の設定を追記します。

```bash
touch config/initializers/semantic_logger.rb
```

```ruby:config/initializers/semantic_logger.rb
config.rails_semantic_logger.add_file_appender = false
config.semantic_logger.add_appender(io: $stdout, level: config.log_level, formatter: :json)
```

## puma clustered modeを使用する場合

https://rocketjob.github.io/semantic_logger/forking.html

puma でclustered modeを使用している場合はpuma.rbの設定をする必要がありますので、追記します。

```ruby:config/puma.rb
on_worker_boot do
  # Re-open appenders after forking the process
  SemanticLogger.reopen
end
```

## まとめ

このようにsemantic_loggerを使用することによって、簡単にJSONのログ出力をすることができました。

Railsを使っているプロジェクトでログ出力をカスタマイズしたい場合に便利なので、使ってみてください。
LaravelでPOSTメソッド使うと419エラー

# 何回もやってしまう。。。

- ステータス200 OKのあとに419エラーが出る
- formからのPOSTの時とか、ajaxからのPOSTの時とか
- ルーティングも出来ているし、レスポンスもちゃんと書いてる。そもそも200 OKなのに？と一瞬固まる
- ググって即解決。原因は毎回CSRFトークンの不備（私の場合）


### ケース1
- formタグの中に `@csrf` を記述していない
- https://readouble.com/laravel/5.8/ja/csrf.html

### ケース2
- ページ上部のmetaタグでcsrfトークンを読み込んでいない
- これはLaravel標準で用意してくれているテンプレートレイアウトのapp.blade.phpを使うのをやめたり、書き換えたタイミングで起こりやすい。下記の1行を自分で書くのを忘れる。
- 下記のmetaタグを追記する

```html
<meta name="csrf-token" content="{{ csrf_token() }}">
```
VM環境に既存のLaravelプロジェクトをクローンする

## VMのHomesteadにあらたにLaravelプロジェクトをクローンする

以前の記事で使ったディレクトリ構成をそのまま使っている前提

### 既存プロジェクトのアップグレード用の環境を作りたい
既存のプロジェクトをLaravel6系にアップグレードするためのテスト用の環境づくりがしたかった。下準備のためのメモ。

### Homestead.yamlの編集
`Homestead/Homestead.yaml`の設定を追記してもう１つのプロジェクト用のディレクトリを作る

```Homestead.yaml
---
ip: "192.168.30.10"
memory: 2048
cpus: 2
provider: virtualbox

authorize: ~/.ssh/id_rsa_homestead.pub

keys:
    - ~/.ssh/id_rsa_homestead

folders:
    - map: ~/tests/VM-Laravel
      to: /home/vagrant/code

sites:
    - map: project01.test
      to: /home/vagrant/code/project01/public

    ## もうひとつtestプロジェクトを作成
    - map: ver6.test
      to: /home/vagrant/code/ver6/public

    - map: db.phpmyadmin
      to: /usr/share/phpmyadmin/

## DBも追加しておく
databases:
    - project01
    - ver6

features:
    - mariadb: false
    - ohmyzsh: false
    - webdriver: false
```

### hostsファイルの編集とプロジェクトのクローン
```bash
$ sudo vi /etc/hosts
## hostsファイルに下記を追記
192.168.30.10 ver6.test

$ cd ~tests/VM-Laravel
## ver6というプロジェクト名でクローンしてくる
$ git clone git clone git@github.com:mochi5o/webletter.git ver6
$ cd ver6
$ cp .env.example .env
```

### .envを開いてDBの設定を変更する
既存のプロジェクトからコピーしてきて、変更する。
※変更していないと同じDBを参照することになるので書き換える。

```bash
## 既存のプロジェクトの.envの設定をコピーしておく
## DBの設定の箇所をお好みで変更する
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=ver6
DB_USERNAME=ver6
DB_PASSWORD=secret
```

### vagrant環境に入ってアプリケーションキーの初期化

```bash
$ cd Homestead
$ vagrant up --provision
$ vagrant ssh

## 以下vagrant 環境
$ cd code/ver6
$ php artisan key:generate
$ php artisan cache:clear
$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.07 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.1 seconds)
・・・・
```

###
webpack入門: webpackってどう使うの？

この記事は「Atrae Advent Calender」の8日目の記事です。
今回は入社してすぐに任されたwebpackについて書こうと思います。

# webpackとは
jsやstylesheetなどをファイルを１つにまとめるもので、モジュールバンドラーと呼ばれています。言葉で説明してもいまいちピンとこないと思うので実際のコードを見てみましょう。

```javascript:index.js
import hello from "./hello"

hello();
```

```javascript:hello.js
export default function hello() {
  console.log('hello world');
}
```

例えば上記のような場合では、上の２つのファイルをwebpackがbundleして１つのファイルにまとめてくれることによって、他のファイルで定義した関数などを使うことができます。

今回の例ではあまり恩恵を感じられませんが、Reactなどでコンポーネントを再利用したり、役割ごとにコンポーネントを分けて作ったりすることを考えると必須になってきます。

# webpackの設定
webpackをうまく使うためにはwebpackの設定ファイルである`webpack.config.js`の設定について知る必要があります。実際の例を使って説明していきます。

``` javascript:webpack.config.js
module.exports = {
  mode: "development",
  entry: ["./src/index.js"],
  output: {
    filename: "bundle.js",
    path: __dirname + "/public"
  },
  module: {
    rules: [
      {
        test: /\.(js|jsx|ts|tsx)$/,
        use: "babel-loader",
        exclude: /node_modules/
      }
    ]
  }
};
```

## mode
2行目のmodeは環境ごとに設定を分けるときに使うものです。

| 設定          |　説明 |
|:------------------------|:------------------|
| development         | 開発環境用の設定 |
| production          | 本番環境用の設定 |
| none                | 特に指定しないときの設定で、デフォルトではこれになる。 |

の3つの設定があり、開発環境と本番環境で設定を分けたい場合にはファイルを`webpack.prod.config.js`のように分けることもできます。

## entry
webpackがbundleを始めるファイルを指定する。そのファイルからimportなどの依存関係を解決していきます。そのためindex.jsのような一番上位層にあるファイルを指定する必要があります。

## output
bundleしたファイルを出力するときの設定部分です。
`path`と`filename`を使って出力するファイルのパスと名前を決めます。htmlなどで読み込むjsファイルはここで指定したpathと同じものにする必要があります。
またここでは`[name]`や`[hash]`などの特定の文字列を使うことができます。それによって出力パスを設定したり、ハッシュ値をつけたりすることができます。

##module
### test
ここではどのファイルを対象とした設定なのかを記述します。拡張子を指定し、jsファイル、stylesheet、画像ファイルなどで設定を分けることができます。

### use
使うloaderを指定する部分です。
loaderには様々なものがあります。（参考: [webpack の Loader を試してみる]( https://qiita.com/murank/items/f0ff7508326b4e4dd291))
これはbundleするファイルの種類や使う用途によって使い分ける必要があります。
具体的にはstylesheetだったらcss-loaderやsass-loader、画像ファイルだったらfile-loaderを使うというような切り分け方です。

### exclude
対象としないファイルを設定します。今回の例ではnpmでインストールしたライブラリーはbundleには入れないのでnode-modules以下のファイルを除外しているという形になっています。

##まとめ
今回紹介したこと以外にもpluginを使った機能やaliasを設定するなどwebpackでできることは多くあります。僕ははじめ理解するのに苦労したので、同じように新しくwebpackを勉強し始める人の助けになれればと考えwebpackの基本的な部分の紹介をしました。少しでもそのような人の助けに少しでもなることができれば幸いです。
Rubyの文字列変換メソッドについてざっくり

##書かれていること



1. +(文字列の結合)
- split (分割して配列)
- capitalize(先頭の文字を大文字にその他は小文字に)
- reverse(順番を逆にする)
- upcase(小文字を大文字に変換)


- 参考ページ

- 終わりに


##1.+(文字列の結合)

```"she"``` ```"is"``` ```"Kaho"```

```ruby:例
"she"+"is"+"Kaho"
実行結果
"she is Kaho"
```

##2.Split (分割して配列)
```ruby:例
food = "banana　tomato　apple"
eat = food.split

実行結果
["banana","tomato","apple"]
```
他にも```.split(",")```で区切り文字を指定することができる

##3.capitalize(先頭の文字を大文字にその他は小文字に)
```ruby:例
rubys.capitalize

実行結果
Ruby
```
##4.reverse(順番を逆にする)
```ruby:例
"12345".reverse
実行結果
"54321"
```

##5.upcase(小文字を大文字に変換)
```ruby:例
"Hello, world".upcase
実行結果
"HELLO, WORLD"
```

##参考ページ
- [【Ruby入門】splitで文字列を分割しよう！](https://www.sejuku.net/blog/41681)
- [capitalize, capitalize! (String)](https://ref.xaio.jp/ruby/classes/string/capitalize)
- [Rubyのreverseメソッドの使い方を現役エンジニアが解説【初心者向け】](https://techacademy.jp/magazine/19843)
- [はじめてのRuby！文字列を大文字⇔小文字に変換する方法まとめ](https://www.sejuku.net/blog/60402)

##終わりに
Rubyの最初の頃に学んだものたち。（ほぼ忘れてるけど）
広く、浅くなので詳しくは参考ページをご覧になってください。
プログラミングはど素人なため、記述内容で誤りなどございましたら、ご指摘いただけると幸いです。
[GCP]Cloud Source Repositoriesの使い方

# はじめに
Cloud Shellで作成したコードをCloud Source Repositoriesに登録する方法を記載しています。

# 手順
## 1. 新しいリポジトリを作成
今回は`test-repo`という名前のリポジトリを作成しています。

```
gcloud source repos create test-repo
```

## 2. リポジトリのクローンを作成
```
gcloud source repos clone test-repo
```
上記のコマンドを実行するとホームディレクトリの下に`test-repo`というフォルダが作成されます。

## 3. ユーザ名とメールアドレスの設定
```
git config --global user.email "xxx@xxx.xxx"
git config --global user.name "xxx"

# リポジトリ単位で設定する場合は、フォルダに移動して以下のコマンドを実行。.git/configに反映される。
git config --local user.email "xxx@xxx.xxx"
git config --local user.name "xxx"
```

## 4. ファイル追加の準備
Cloud Shell上で作成したコードを、`test-repo`フォルダ以下に移動します。

```
mv <gitに追加するフォルダ名> ~/test-repo
cd ~/test-repo
```

## 5. ファイル追加
```
git add <gitに追加するフォルダ名>
```

## 6. ファイルcommit
```
git commit -m "Add xxx to Cloud Source Repositories"
```

## 7. ローカル Git リポジトリの内容を Cloud Source Repositories に追加
```
git push origin master
```

これでCloud Source Repositories のGUIから追加したものが確認できます。

# 参考URL
クイックスタート: 新しいリポジトリの作成
https://cloud.google.com/source-repositories/docs/quickstart?hl=ja
FILEベースCMS GRAVに記事を投稿（Admin編）

## はじめに

インストールが完了したので、いよいよGrav Admin画面を使って記事を投稿していきます。
基本的なページの構成について書いていきたいと思います。

## admin 画面を開く

まずは Admin URL を開きログインします。
`http://<GRAVのアドレス>/admin/`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141148/2a8f8e5a-f807-f168-1a84-fcc1cd485a7d.png)

ログイン後の画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141148/342d42c0-3fbb-6573-e05d-085ca0a1938e.png)


## 記事を書く

左の管理バーからファイルアイコンをクリックして `Manage Pages` を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141148/183a5cd5-f99d-ce4c-a671-ba1beec14908.png)

`+Add` ボタンでページを追加していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141148/6ad4c304-2476-8f16-3e9e-937e7de6ccce.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141148/0f695195-457f-00a8-6761-f436e4bba845.png)


プレビューしてみます。Leam2 というテーマを使っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141148/98092096-5c43-a8bb-f796-523afc59b8a3.png)

### 作成されたフォルダ・ファイル

user/pages フォルダを見ると下記のようになっています。勝手に採番されて`03.page3`というフォルダができました。

```
ls -al
合計 0
drwsrwsr-x 5 911 911 55 12月  8 11:04 .
drwsrwsr-x 8 911 911 84 12月  1 12:15 ..
drwsrwsr-x 2 911 911 23 12月  1 12:15 01.home
drwsrwsr-x 2 911 911 23 12月  1 12:15 02.typography
drwxrwsr-x 2 911 911 23 12月  8 11:04 03.page3
```
フォルダ内は下記のようになっています。

```
ls -al 03.page3/
合計 4
drwxrwsr-x 2 911 911  23 12月  8 11:08 .
drwsrwsr-x 5 911 911  55 12月  8 11:04 ..
-rw-rw-r-- 1 911 911 145 12月  8 11:08 default.md
```

[公式ドキュメント](https://learn.getgrav.org/16/content/content-pages)にも記載があるのですが、GRAVでは1記事＝1フォルダです。
記事は `default.md` という名前で作成することがデフォルトの動作です。


## 終わりに

マークダウンを知っていれば、Qiitaを扱うように自社の共有ページが作れます。Redmine などでもマークダウン記事を書けますが、よりクールなサイトが簡単に作れます。

## 参考リンク

https://learn.getgrav.org/16/content/content-pages
【powershell】コマンドレットを fzf でインタラクティブにフィルタする

# 更新
2020/01/09
[マルチバイト文字の文字化け回避方法](https://qiita.com/AWtnb/items/088ca9f10a4e8fabff57) がわかりました

# fzf with scoop
最近 [fzf](https://github.com/junegunn/fzf) を知ってその便利さに感動しています。

powershell の自作コマンドレットが100を超え、（規則づくりの怠慢ゆえに）どんなコマンドレットがあるか自分でもわからなくなってきたので PSReadLine と組み合わせて検索を効率化してみました。

fzf は `scoop` で入手できます。

```
> scoop install fzf
```

# PSReadLine
`$profile` に下記を加筆しておくとコンソール上で `Alt+F` を押したときにコマンドレット一覧に対して fzf が起動し、キー入力で動的にコマンドを絞り込むことができます。フィルタされたコマンドはその時点でのカーソル位置に挿入されます。

```powershell

Set-PSReadLineKeyHandler -Key "Alt+F" -BriefDescription "fzf" -LongDescription "cmdlet-search-by-fzf" -ScriptBlock {
    $command = (Get-Command).Name | fzf.exe
    [Microsoft.PowerShell.PSConsoleReadLine]::Insert($command)
}
```

# 日本語の文字化け問題
fzf をコマンド履歴の検索やディレクトリ移動に利用しようとしているのですが、マルチバイト文字が文字化けする問題がどうしても回避できなくて諦めてしまいました（日本語表示は `$OutputEncoding` の設定でできたのですが、変数に格納しようとすると文字化けでエラー）。

コマンドレット名を扱うなら問題ないのですが……。詳しいどなたか教えていただければ幸いです。
マンガでわかる Composite

![22A3B8D3-DDDF-42F6-AA22-A2802BF3D318.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11525/d405cfd2-3ad4-9bf5-698c-cdfe042facbe.png)

ちょうぜつマジックショーへようこそ。こちらは、無限に続く多重下請けのイリュージョンでございます。いかがですか。

...いけない、おこられてしまう。

こういう、部分と全体が同じ形をした再帰的ツリー構造はかっこいいし、実際に扱いもシンプルでいいよねって、よくやりますね。そんなふうにモデルを一般化したものには Composite パターンという名前が付いています。

OS のファイルシステムは、ルートにディレクトリがあり、ディレクトリにはファイルとディレクトリが任意数入る。で、そこから取り出した 1 つのディレクトリに着目すると、それもまた、ファイルとディレクトリを持てる。Composite パターンの説明によくある例です。

当時とは違って、今なら HTML の DOM 構造も Composite パターンのいい例になるかもしれません。ルートタグ `<html>` があり、他の要素を持てる `<div>` などの要素と、テキストのみを持てて終端する `<p>` などの要素による、典型的な再帰構造です。プログラム言語をパースした AST も Composite と呼べるかもしれません。

多重下請けマジックショーでも、最後はたぶん、フリーランスの個人で終端します。発注者がやろうと思えば、最初の一次請けとだけではなく、二次請け三次請けの特定の会社と取引するとしても、基本的に同じオペレーションが可能です。

ええ、もちろんこれは、ちょうぜつアジャイルなワークスタイルのめもりーちゃんにしてみれば、軽いブラックジョークですから。ご安心を
(結局Service Workerってなに...？)とならないための基礎知識

# さ、さーびすわーかー？

PWAについて勉強を始めたときに、まずはじめにいきなり知らない単語が出てきました。それが**Service Worker**でした。

PWAの構築方法、チュートリアルはたくさんあっても、それを支える基礎技術である**Service Worker**についての詳細な解説がWeb上に少ないので、ここにまとめます。一部技術開発の経緯や技術仕様、詳細について誤りがあるかもしれませんが、ご指摘いただけますと幸いです。


# よくある勘違い

というか、僕自身PWAの技術=Googleが開発しているもの、と思っていました...。

PWAで調べると、検索結果の一番上にGoogleの詳細な解説記事があるし、プッシュ通知だってGoogleフレンドリーだったし。

# (1)Service WorkerはW3Cから

PWAの基礎となるService Workerの開発元はW3Cです。Googleではありません。

W3Cとは、World Wide Webの始祖の一人であるティム・バーナーズ・リーが創設したWeb技術の標準化を推進する非営利団体です。

ただ、このService Workerを活用してPWAという技術を推進しているのは主にGoogleということだと思います。

# (2)JavaScript / Web Workerの一種

[この記事](https://developers.google.com/web/fundamentals/primers/service-workers?hl=ja)で

>Service Worker は JavaScript Worker のひとつ

という記述があります。

ただし、正確には Web Workerという名称のWorkerを発展させたものが、Service Workerであるというのが正しい言い方な気がします。まあ、結局はJavaScriptなのですが...。

# (3)Web Worker的なものはたくさんある

なにも、このWeb Worker的な技術、つまりService Workerに類似した技術はこれまでもたくさんありました。

例えば、[AppCache](https://www.html5rocks.com/en/tutorials/appcache/beginner/)やWebアプリケーションに特化したわけではありませんが、[Google Gears](https://tech.nikkeibp.co.jp/it/article/COLUMN/20070911/281630/)も似たような技術を使って開発されていました。2011年にGoogleが開発打ち切りをしていますが...。

これらの失敗を乗り越え、より改善し、Webの標準となりつつある技術こそが、Service Workerなのです！

# 詳細解説

ここで少し、Web Worker(またの名をJavascript Worker)とはどんなものなのか？を原典をもとに解説します。

### JavaScriptの問題点

まず、JavaScriptという言語はシングルスレッドで動きます。そのため、例えばメインスレッドでUIイベントを処理し、同時並行で大量のAPIを参照するということができません。` setTimeout()` `setInterval()` はあくまで、非同期であって、同時実行ではありません。

### 解決策としてのWeb Worker

ここで登場するのがWeb Workerです。Web Workerを使うことで、メインスレッドの処理とは別に、バックグラウンドで動くScriptを生成することができます。例えば何かしらの問題によって永遠に終わらないScriptがあったとして、それを検知してアラートを出す、ということができるようになります。


### コード例

Web Workerは別ファイル(ここでは `task.js`)に分ける必要があります。そして、それをWeb Workerとして登録します。ここまではService Workerとほとんど同じですね。

```js
var worker = new Worker('task.js');  
```

そして、その登録したWorkerを `worker.postMessage(); `で送信します。コード全体は以下のようになります。

```js
var worker = new Worker('doWork.js');

worker.addEventListener('message', function(e) {
  console.log('Worker said: ', e.data);
}, false);

worker.postMessage('Hello World');
```

このようなWeb Workerの技術を用いて作られているのがService Workerでした。

# 最後に

原典をあたり、知ろうとすることはとても大事です。PWAアプリケーションをちょっと作るだけ、だとしてもその技術経緯や仕様を理解することは、さらなる技術発展に役立ちます。そして、なによりその技術に対する理解が深まり、開発が楽しくなります！

今回はPWAの実践というより、座学的な内容でした。

# 参照元
Service Workers 1
W3C Candidate Recommendation, 19 November 2019
https://www.w3.org/TR/service-workers/

Github
https://github.com/w3c/ServiceWorker

Service Worker の紹介
https://developers.google.com/web/fundamentals/primers/service-workers?hl=ja

Web Workersの基本
https://www.html5rocks.com/en/tutorials/workers/basics/
Ruby on RailsでAbstractController::Helpers::MissingHelperError:Missing helper file が発生したときの対処法

# 環境
- macOS Version 10.13.4
- Rails 5.2.4
- ruby 2.4

# 状況
「Railsチュートリアル13.2.1 マイクロポストの描画」で
`$ rails generate controller Microposts`
によりMicropostコントローラを作成した後、
`bin/rspec`コマンドを叩くとエラーが発生しました。

# エラーメッセージ
```
$ bin/rspec
Running via Spring preloader in process 83327

An error occurred while loading ./spec/controllers/account_activations_controller_spec.rb.
Failure/Error: require 'rspec/rails'

AbstractController::Helpers::MissingHelperError:
  Missing helper file helpers/microposts_helper.rb
# ./spec/rails_helper.rb:9:in `<main>'
# ./spec/controllers/account_activations_controller_spec.rb:1:in `<main>'
# -e:1:in `<main>'
# ------------------
# --- Caused by: ---
# LoadError:
#   No such file to load -- microposts_helper.rb
#   ./spec/rails_helper.rb:9:in `<main>'

Finished in 0.00036 seconds (files took 0.31848 seconds to load)
0 examples, 0 failures, 1 error occurred outside of examples
```

# 対処法
`bundle update`を実行することで解決しました。

# 補足
エラーについて検索すると、どうやらパス名の関係で発生するバグらしい。
私の場合、`bundle update`で解決したが、それだけでは治らない場合もあるらしい。
その場合は下記ページを参考にしてみてください。
[Ruby on Railsで'require': No such file to load -- ***_helper.rb(LoadError)と言われるとき](https://qiita.com/KuroganeHey/items/962fc74669ef7f4221dd)

その他参考
[RSpecを実行するとMissing helper fileと表示される](https://qiita.com/kiyodori/items/f41408f3da626fbb0bbe)
PHP7技術者認定初級試験は実務に役立つのか？「おすすめ度・難易度・勉強時間」

## PHP7技術者認定初級試験を受けてみた
私は受託開発のベンチャー企業で約1年実務を経験しています。技術力と知識量を上げるため、PHP7技術者認定初級試験を受けてみました。なので、資格で合格することが目的ではなく、**資格を受ける上で勉強で得られる知識が目的**でした。試験に合格したので、そこで得られた情報を共有します。

**この記事はこんな方におすすめ**

- PHP7技術者認定初級試験が実務に役立つのか知りたい
- おすすめ度・難易度が知りたい
- 勉強時間やおすすめの学習教材が知りたい

## 実務で役立つのか？

結論、**役に立ちません！！！笑**

理由は選択問題なので、**コードが書けなくても過去問を繰り返し勉強すれば合格してしまう内容**だからです。ただし、公式でおすすめしている認定教材の[初めてのPHP（PHP7対応版）](https://www.amazon.co.jp/dp/4873117933/)がバランスよく学べるので、「試験は微妙だけど、認定教材は良い」という感じです。「じゃあ、試験受けずに認定教材だけやればいいんだね！」と言われそうですが、明確な目標がないと続かないのが人間なので、**「認定教材を読破し、理解するために試験を受ける」というのはアリ**です。

資格自体は実務に役立ちませんが、**資格勉強の過程で得られる知識は**役立ちます。具体的には、セキュリティ・オブジェクト志向の知識が役立ちました。

認定教材（初めてのPHP）の内容は下記の通りです。

- テキストと数の操作
- ロジック:判定と繰り返し
- データのグループ:配列の操作
- ロジックのグループ:関数とファイル
- データとロジックの結合:オブジェクトの操作
- ユーザとの情報交換:Webフォームの作成
- 情報の保存:データベース
- ファイルの操作
- ユーザの記憶:クッキーとセッション〔ほか〕

「初めて」とタイトルに書かれていますが、コードを書いたことがない人には難しい内容です。

## 試験概要

- PHP7のプログラミングの基本知識を問う試験
- 試験会場は全国
- 受験料金：12,000円
- 回答方法：コンピュータを使った選択式
- 試験時間：1時間
- 合格ライン：7割正解

## 試験項目

| 項目 | 出題問題数 |
|:--|--:|
| PHPの特徴 | 2 |
| テキストと数の操作 | 3 |
| ロジック：判定と繰り返し | 2 |
| データのグループ：配列の操作 | 3 |
| ロジックのグループ：関数とファイル | 3 |
| データとロジックの結合：オブジェクトの操作 | 2 |
| ユーザとの情報交換：Webフォームの作成 | 4 |
| 情報の保存：データベース | 4 |
| ファイルの操作 | 2 |
| ユーザの記憶：クッキーとセッション | 2 |
| 他のWebサイトやサービスとのやり取り | 2 |
| デバッグ | 2 |
| テスト：プログラムが正しく動作するようにする | 2 |
| ソフトウェア開発で心得ておきたいこと | 1 |
| 日付と時刻 | 1 |
| パッケージ管理 | 1 |
| メールの送信 | 1 |
| フレームワーク | 1 |
| コマンドラインPHP | 1 |
| 国際化とローカライゼーション | 1 |
| 　 | 40 |

## おすすめ度・難易度



| 項目       |評価（5段階）        |
|:-----------------|:------------------|
| おすすめ度        |2 |
| 難易度           |2 |

例えば基本情報処理試験を目安にすると、おすすめ度3、難易度3といった具合ですね。なので、基本情報処理試験に比べてPHP7技術者認定初級試験の方が、おすすめ度・難易度がやや低い印象です。

## 勉強時間、おすすめの学習教材

PHPで半年以上実際にコードを書いている方なら、[徹底攻略PHP7技術者認定[初級]試験問題集](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5PHP7%E6%8A%80%E8%A1%93%E8%80%85%E8%AA%8D%E5%AE%9A-%E5%88%9D%E7%B4%9A-%E8%A9%A6%E9%A8%93%E5%95%8F%E9%A1%8C%E9%9B%86-%E5%86%85%E5%B1%B1-%E7%A5%A5%E6%81%B5/dp/4295006645/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=php7&qid=1575771997&sr=8-2)を2~3周するだけで十分なので、5~10時間です。

コードを書いたことがない人なら、まずは[Progate](https://prog-8.com/)のPHPを2周（30時間）、[ドットインストール](https://dotinstall.com/lessons/basic_php_v2)を1周（10時間）、[初めてのPHP（PHP7対応版）](https://www.amazon.co.jp/dp/4873117933/)を1周（20時間）、[徹底攻略PHP7技術者認定[初級]試験問題集](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5PHP7%E6%8A%80%E8%A1%93%E8%80%85%E8%AA%8D%E5%AE%9A-%E5%88%9D%E7%B4%9A-%E8%A9%A6%E9%A8%93%E5%95%8F%E9%A1%8C%E9%9B%86-%E5%86%85%E5%B1%B1-%E7%A5%A5%E6%81%B5/dp/4295006645/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=php7&qid=1575771997&sr=8-2)を3周（20時間）で、合計80時間くらいは必要かなと思います。

## PHP7技術者認定初級試験についてのまとめ

資格自体は実務に役立ちませんが、資格勉強の過程で得られる知識は役立ちます。「体系的な知識のインプットをしたい」「明確な目標でモチベーションをアップしたい」方にとっては有用です。

## 参考サイト

- [PHP7初級試験](https://www.phpexam.jp/summary/novice7/)
Rの標準plotで描くグラフ2.散布図

Rのサンプルデータセットirisの、萼の長さ(Length)と幅(Width)の関係を種ごとに凡例の色と形を変えてプロットする。

```sanpuz.R
attach(iris)
plot(x=NULL, xlim=c(4,8), ylim=c(0,6), cex=1.2, cex.axis=1.5, las=1, xlab="Sepal Length", ylab="Sepal Width", cex.lab=1)
points(Sepal.Length[Species=="setosa"], Sepal.Width[Species=="setosa"], cex=1.3)
points(Sepal.Length[Species=="versicolor"], Sepal.Width[Species=="versicolor"], pch=2, cex=1.3, col=2)
points(Sepal.Length[Species=="virginica"], Sepal.Width[Species=="virginica"], pch=0, cex=1.3, col=3)
legend("topleft", legend=c("setosa", "versicolor", "virginica"), bty="n", pch=c(1,2,0), col=1:3, cex=1.4)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100982/ec8daedf-bb58-3c4b-0bd6-1f184ea459be.png)

これまで重描きをするときは
plot()
par(new=T)
plot()
...
と書いていたのですが、絶対にpoints()を使ったほうがいいですね。

回帰直線も描くなら、

```sanpuz.R
attach(iris)
plot(x=NULL, xlim=c(4,8), ylim=c(0,6), cex=1.2, cex.axis=1.5, las=1, xlab="Sepal Length", ylab="Sepal Width", cex.lab=1)
points(Sepal.Length[Species=="setosa"], Sepal.Width[Species=="setosa"], cex=1.3)
points(Sepal.Length[Species=="versicolor"], Sepal.Width[Species=="versicolor"], pch=2, cex=1.3, col=2)
points(Sepal.Length[Species=="virginica"], Sepal.Width[Species=="virginica"], pch=0, cex=1.3, col=3)
abline(lm(Sepal.Width[Species=="setosa"] ~ Sepal.Length[Species=="setosa"]))
abline(lm(Sepal.Width[Species=="versicolor"] ~ Sepal.Length[Species=="versicolor"]), col=2)
abline(lm(Sepal.Width[Species=="virginica"] ~ Sepal.Length[Species=="virginica"]),col=3)
legend("topleft", legend=c("setosa", "versicolor", "virginica"), bty="n", pch=c(1,2,0), col=1:3, cex=1.4)
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100982/4f39f21c-8e3f-134d-58a4-373845f6c703.png)