OmniAICreator/Qiita-1.07M huggingface dataset:
rsync コピー元のスラッシュの有無で挙動が変わる

#基本的な構文

rsync [オプション] [コピー元] [コピー先]

# 留意点

- コピー元の末尾スラッシュの有無で挙動が違う
- コピー先の末尾スラッシュの有無はどちらでも可

#ディレクトリ本体を同期したい場合

```
$ rsync -av /src/a /bkup
$ rsync -av /src/a /bkup/
# 上記は同じ意味
```

- ディレクトリa本体が/bkupの直下にコピーされる
- もしコピー元末尾に/を入れると、/bkup直下にディレクトリaの中身が入るため、コピー先にaフォルダが無い状態となってしまう。

#ディレクトリの中身を同期したい場合

```
$ rsync -av /src/a/ /bkup/a
$ rsync -av /src/a/ /bkup/a/
# 上記は同じ意味
```

- ディレクトリaの中身が/bkup/aの直下にコピーされる。
- もしコピー元末尾の/を消すと、/bkup/aの直下にディレクトリa本体が入るため、/bkup/a/aとなってしまう

#参考記事
https://qiita.com/QUANON/items/2953c52df7f65f2ecee5
http://code.lioon.net/shell/how-to-set-paths-for-rsync.html
https://www.itmedia.co.jp/enterprise/articles/0804/21/news013.html
2.3 IPアドレスの動的な移動（HA構成のIP付替え）

（2016年時点での内容をアーカイブとして掲載しているため、一部の掲載内容が最新情報とは異なる場合がありますので、ご了承ください。最新のIBM Cloudの情報は [IBM Cloud Docs](https://cloud.ibm.com/docs) や [IBM Cloud アップデート情報](https://www.ibm.com/cloud-computing/jp/ja/cloud-update/) 、[柔らか層本](https://ibm.ent.box.com/v/ibmcloud-yawaraka)をご参照ください。）

解決したい課題

クラウドでは、サーバーのIPアドレスを指定や変更ができない課題があり、SoftLayer でもサーバー毎にパブリックとプライベートのIPアドレスが各一個付与され、そのIPアドレスは変更できない。 ところが、サーバーのアップグレードのために、旧と新のサーバーを平行運用しておき、切り替え時にIPアドレスを変更して対応したいケースがある。 一方、DNSサーバーを利用してIPアドレスを解決する場合、キャッシュのTTL時間の分だけ切り替え時間が遅れてしまう。 このようなことから、外部からアクセスするIPアドレスは常に同じにしたいケースがある。
 
ソリューション・パターン

サーバーのプロビジョニング時に固有に付与されるIPアドレス以外に、付け替え可能なIPアドレスを追加で割り当てることができる。 これにより、サーバーの変更に関わらず、クライアントからアクセスするIPアドレスを一定にすることができる。
 
インプリメンテーション

カスタマーポータルからポータブルIPをオーダーする。 ポータブルIPは、既存のVLANに2番目のサブネットを割り当てるもので、プライベートとパブリックのアドレスをオーダーできる。
サービスを提供するサーバーに、ポータブルIPのアドレス、サブネットマスク、ゲートウェイ・アドレスを設定する。 必要に応じて、スタティック・ルーティングを追加する。
切り替え時は、旧サーバーからポータブルIP関連の設定を削除して、新サーバーへこれらの設定を追加する。
 
 
効果

IPアドレスを付け替えることで、旧から新のサーバーへアクセス先を変更することができる。
DNSでは、TTL時間や伝播するまでのタイムラグが発生するが、IPアドレスを付け替える方法では、タイムラグが発生しない。
プライベート・アドレスをNATで変換する方法ではないため、これに起因する問題を回避できる。
プライベート・アドレスでも利用できるため、サーバー間の連携にも適用可能である。
 
懸念事項・注意点

サービスの開始前に、ポータブルIPアドレスをサーバーへ設定する必要がある。 DNSでアドレス解決したい場合は、このポータブルIPアドレスを登録する。
ポータブルIPアドレスは、NATとして提供されるものではなく、IPネットワークのサブネットとして付与される。 サーバーの管理スタッフは、取得したサブネットのIPアドレス範囲から割当てる。 そして、サーバーにセカンダリーIPアドレス、ゲートウェイ・アドレス、サブネットマスクを設定する。
パブリックのポータブルIPは、利用料金が発生する。
 
参考資料

3.1 サーバーの可用性を高めるには？
3.2 サーバーのクローンを作るには？
3.4 アクティブ・スタンバイのクラスタを構成するには？
3.4.1 ハートビートを用いたNFSのHA構成
3.4.2 キープアライブを用いたLVSのHA構成
4.2 サーバーを替えても同じIPアドレスを継続するには？
4.3 SoftLayerのDNSを利用するには？
bq load でパーティションテーブルを扱う

`bq load` でパーティションテーブル使う時のメモ。

特に伝えたいことはパーティション日付の前の **バックスペースを忘れない！**
**バックスペースを忘れない！!**
**バックスペースを忘れない！!** 

# 1. 新規のパーティションを指定してloadする

```bash

bq load --source_format=CSV dataset.table\$20200401 sample.csv
```

# 2. 既存のパーティションに追加(append)する
```bash

bq load --source_format=CSV dataset.table\$20200401 sample.csv
```
オプションつけないで既存パーティション指定するとappendされる。

# 3. 既存のパーティションを上書き(write_truncate)する
```bash

bq load --replace --source_format=CSV dataset.table\$20200401 sample.csv
```
バックスペースなしで `--replace` つけると、他のパーティションも全部吹っ飛ぶ大事故に繋がるので気をつけましょう。

# 参考
[BigQuery | bq load コマンドでpartitioned table を作成する](https://qiita.com/YumaInaura/items/7180b0c919dfe584bed2)
2.2 データセンターレベルの冗長化

（2016年時点での内容をアーカイブとして掲載しているため、一部の掲載内容が最新情報とは異なる場合がありますので、ご了承ください。最新のIBM Cloudの情報は [IBM Cloud Docs](https://cloud.ibm.com/docs) や [IBM Cloud アップデート情報](https://www.ibm.com/cloud-computing/jp/ja/cloud-update/) 、[柔らか層本](https://ibm.ent.box.com/v/ibmcloud-yawaraka)をご参照ください。）

解決したい課題

一般にデータセンターの設備は、受電設備や配電設備レベルでの冗長化、停電に備えた自家発電設備、ダーク・ファイバーの2系統化など、大切な情報システム機器を保護し可用性を高めるための対策が施されている。 このため、データセンターや回線に起因する障害の可能性は極めて低く、もし発生したとしても、短時間で回復できると見込める。 しかし、地震、津波、火山噴火など、地域のインフラに甚大な被害をもたらす自然災害に対しては、ひとたび被災すると、復旧までには、数ヶ月から数年を要する場合がある。 
たとえば、製造業などでは、主力製品の工場は複数の地域に分散することで、この様なリスクに対応している。 これと同様に、情報システム基盤においても、このような考え方で、複数のデータセンターへ分散配置することで、リスクを分散することは重要な施策である。
 
ソリューション・パターン

Citrix NetScalerの広域負荷分散機能(GSLB; Global Server Load Balancing)を利用して、利用者から近い地域のデータセンターにリクエストを振り分けながら、複数のデータセンターで平行稼働することができる。
 
インプリメンテーション

カスタマーポータルから、それぞれのデータセンターに、NetScalerを注文する。 NetScalerのモデルによってGSLBが利用できないものがあるので注意が必要である。
GSLBを適用したいドメインのDNSサーバーへ、そのサブ・ドメインのネームサーバーとして、NetScalerのIPアドレスを登録する。
NetScalerをGSLBのDNSサーバーとして設定する。 また、GSLBの設定も行う。
これにより、一般のクライアントが、GSLBを利用した団体のドメインをアクセスした場合、最適なIPアドレスが、NetScalerのDNSサーバーから応答されることになる。
一つのデータセンターと通信できない場合、DNSは活動中のデータセンターのIPアドレスを応答することになる。
 
 
効果

広域災害が発生した場合に対しても、サービスを継続できる。
平常時から平行運用しているため、切り替えの失敗などのリスクが無く、失敗防止のための訓練なども必要ない。
平常時は、2箇所のデータセンターで負荷を分散しておき、災害時には、生き残ったデータセンターのサーバーを増強することができるため、無駄なコストが発生しない。
 
懸念事項・注意点

サブ・ドメインを設定する必要があるため、DNSの管理者との調整が必要である。
データセンターごとにNetScalerを2重化するとコストがかかる。
負荷分散対象のサービスは、必ずDNS名をもったURLを指定する必要がある。
 
参考資料

Citrix NetScaler Global Server Load Balancing Primer https://support.citrix.com/servlet/KbServlet/download/22506-102-671576/gslb-primer_FINAL_1019.pdf
3.3.2 専用ロードバランサー(Citrix NetScaler)を使うには？
2.1 ロードバランサーによるサーバーの冗長化

（2016年時点での内容をアーカイブとして掲載しているため、一部の掲載内容が最新情報とは異なる場合がありますので、ご了承ください。最新のIBM Cloudの情報は [IBM Cloud Docs](https://cloud.ibm.com/docs) や [IBM Cloud アップデート情報](https://www.ibm.com/cloud-computing/jp/ja/cloud-update/) 、[柔らか層本](https://ibm.ent.box.com/v/ibmcloud-yawaraka)をご参照ください。）

解決したい課題

ロードバランサーは、ウェブ・サーバーの可用性を高める上で重要な機器であるが、専用のアプライアンス機器を購入すると、たいへん高額であるという課題がある。 ウェブ・サーバーを複数並べるだけで可用性が向上するわけではない。 このため代表となるIPアドレスを保持し外部からのリクエストを振り分けるロードバランサーが無くてはならない。 しかし、このロードバランサーは、たいへん高価であるだけでなく保守費用も必要である。 さらに、ロードバランサー自体の故障に対して、影響を軽減するための2重化を考慮すると、周辺のネットワーク機器まで含めてのコスト増となる。
 
ソリューション・パターン

月額数千円のローカル・ロードバランサーから、高性能な NetScaler ロードバランサーまで、ビジネスの段階や成長にあわせて、適切なものを相応の料金で選択できる。
 
インプリメンテーション

1台以上のウェブ・サーバーを構築する。 これらのサーバーは、仮想サーバーと物理サーバーの両方を含む構成であっても良い。
カスタマーポータルから、ロードバランサーを注文する。
ロードバランサーの代表IPアドレスが付与されて起動する。 この代表IPアドレスをDNSへ登録する。
ウェブ・サーバーの各IPアドレスに対して、ロードバランサーの振り分ける設定をおこなう。
ローカル・ロードバランサーの場合、同時接続数をアップグレードできる。 SSL機能も追加してウェブ・サーバーの負荷をオフロードできる。
性能が必要な場合は、専用ロードバランサーを適用することができる。
ロードバランサーのハードウェアが故障して修復の時間で、大きな金銭的な損失が見込まれる場合には、2重化構成を組むこともできる。
 
 
効果

高額の設備投資無しに、ロードバランサーを使ったウェブ・サーバーの冗長構成を利用できる。
ウェブ・サーバーの一つに不具合が発生しても、サービスを継続することができる。
オートスケールと併用することで、アクセス数が増大した場合、プライベート・イメージ・テンプレートからサーバーを起動して、自動的に対応できる。
 
懸念事項・注意点

ローカル・ロードバランサーの設定は、SoftLayerの提供するパブリック・IPアドレス範囲に対して可能である。
エントリーレベルのローカル・ロードバランサーの場合、仮想サーバーの能力を十分使い切るまえに、ローカル・ロードバランサーの同時接続数の制限に到達することがある。 このため、カスタマーポータルからロードバランサーの同時接続状況の確認する必要がある。
N+1構成を考慮する必要がある。 処理に必要なサーバー数がN台であった場合、その内の1台が故障しても処理が継続できる様に、N+1台の構成を考慮する。
1台構成よりも余分にコストが必要となる。 1台で実行するよりも、ロードバランサーや2台目のサーバーのコストが追加となり、コストは2倍以上になる。
 
参考資料

3.3 ロードバランサーを利用するには？
3.3.1 ローカル・ロードバランサーを使うには？
3.3.2 専用ロードバランサー(NetScaler)を使うには？
6.8 NetScalerを2重化するには？
H61MU-S01(B3)のGPU交換について

# この記事はなにを書いているのか
ここではマザーボードがH61MU-S01(B3)のパソコンにおけるGPU交換についてのあれこれについて記載します．
なお，以下の情報は**全て経験・調べた結果に基づくもの**であり，当方はパソコンパーツの買い替え・交換等で動作不良が出ても一切の責任を負いかねます．

# 要約
1. マザーボードのBIOSの更新をどんなに頑張っても**UEFIに対応できない**ので，**BIOS未対応GPUは危険**  

2. H61MU-S01(B3)は**経験上**使えるGPUは**GTX7○○シリーズ**まで   

3. **Ivy bridge 世代のマザーボード(Intel 7シリーズチップセット)**ならばUEFIに対応しているものがある．つまり新しいGPUでも動く可能性がある

## 事の経緯
2011年頃のPCの延命を考えて *ZOTAC GeForce GTX 750 Ti 2GB* から *MSI GeForce GTX 1650 AERO ITX 4G OC* に交換したが．PCの画面が付かない・BIOSにも入れない・B2という表示のみ右下に出るという状況になってしまい，そこからの原因究明と解決を図った備忘録

### 上記の状況になってから行ったこと 
- BIOS更新(MouseComputer公式)
  パソコンに付いているシールのシリアルコードを使って，MouseComputerの公式サイトのサポートからダウンロード・実行

- CMOSクリア
  完全に電源を切った後，マザーボードにあるボタン電池を抜いてCMOSクリアのピンを金属で接触させる

- GPU付きの最小構成にして起動
　メモリ4GB(1枚)・GPU(1650)のみで起動

- BIOS更新(MSI H61MU-E35のものを無理やり) 
 「MSI H61MU-E35 BIOS」で検索して出てくるBIOSをリネームしてUSBメモリに保存．その後BIOS画面からUSBメモリを用 いて更新．対応していないという警告を無視してインストール

**全て行っても効果がなく，状況が変化しなかった**
### 考えられる原因
ネットの情報や状況より状態の原因は**GPUの初期化ができていない**ことだと考えた
つまり，**マザーボード本体を交換しなければGPUは動作しない**可能性が非常に高い

しかし，CPUを変えたくなかったためLGA1155のソケット対応のマザーボードからUEFI対応かつGTX1650が動作すると考えられるマザーボードを調べた結果，以下の知恵袋がヒット
> [グラフィックボード、GTX1650をマザボASUS B75M-PLUSに増設しようと考えています](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10216100365)

この情報を元にASUS B75M-PLUSをAmazonで購入し，パーツの交換を行った結果，**GTX1650の動作を確認**


## 気がついた・分かったこと
#### 古いマザーボードのBIOS・UEFI問題
詳しくは『UEFI』で調べて欲しいが，詰まるところcoreシリーズの第2・3世代はマザーボードの仕様が大きく変革があった時期らしく，BIOSをいくら更新しようが新しめのGPUは動作しない危険性がある

#### 古いマザーボードのGPUの初期化問題
上記の問題以前の話で，マザーボードがGPUの初期化に失敗し画面出力自体ができないことがある．
これはネットで調べても『相性』や『古い』という理由になっており，**具体的な線引はない**模様
普通であればBIOSの更新で解決することが多いが，OEM品などはBIOSの更新が多くないため結果として解決不可能になってしまう

筆者はBIOS・UEFI問題は購入前に分かっていたため，下記のブログを参考にBIOS情報を調べ，Hybrid Bios対応だと考えられる*MSI GeForce GTX 1650 AERO ITX 4G OC*を選択したものの
> [GTX900シリーズは古いマザーボードにつけても大丈夫なのか！？](https://ameblo.jp/quark-nederlands/entry-12071043436.html)

肝心の**Hybrid Biosも初期化に失敗しては機能しない**らしく，効果はなかった．


<!-- 
###スペック
【CPU】i7-2600
【メモリ】A-Data 8GB ⇒ A-Data 8GB + Timetec Hynix 8GB
【マザーボード】H61MU-S01(B3) ⇒ ASUS B75M-PLUS
【電源】玄人志向 500W
【SSD】80GB ⇒ 80Gb + 256GB 
【HDD】1TB
【グラフィックボード】ZOTAC GeForce GTX 750 Ti 2GB ⇒ MSI GeForce GTX 1650 AERO ITX 4G OC
【ケース】MouseComputer製
【OS】Windows 10 home (Windows 7 home 無償アップグレード)
-->
2. 可用性向上

（2016年時点での内容をアーカイブとして掲載しているため、一部の掲載内容が最新情報とは異なる場合がありますので、ご了承ください。最新のIBM Cloudの情報は [IBM Cloud Docs](https://cloud.ibm.com/docs) や [IBM Cloud アップデート情報](https://www.ibm.com/cloud-computing/jp/ja/cloud-update/) 、[柔らか層本](https://ibm.ent.box.com/v/ibmcloud-yawaraka)をご参照ください。）

2.1 ロードバランサーによるサーバーの冗長化
2.2 データセンターレベルの冗長化
2.3 IPアドレスの動的な移動（HA構成のIP付替え）
2.4 アプリのヘルスチェック
1.4 ディスク容量の増減

（2016年時点での内容をアーカイブとして掲載しているため、一部の掲載内容が最新情報とは異なる場合がありますので、ご了承ください。最新のIBM Cloudの情報は [IBM Cloud Docs](https://cloud.ibm.com/docs) や [IBM Cloud アップデート情報](https://www.ibm.com/cloud-computing/jp/ja/cloud-update/) 、[柔らか層本](https://ibm.ent.box.com/v/ibmcloud-yawaraka)をご参照ください。）

解決したい課題

システムの構築時点で、将来のストレージの必要量を見積もることが難しいという課題がある。 将来の見込みに対する見積もりは難しく、安全係数をかけて、利用されない無駄な設備投資を発生することも少なくはない。
 
ソリューション・パターン

仮想サーバーと物理サーバーのディスクは、カスタマーポータルから、ディスクの増設、削除、容量変更を注文できる。
 
インプリメンテーション

OSディスクにデータも共存する最小構成の場合、データが増加してOSディスクの残り領域が少なくなり、モジュールのアップデートやログの保管に支障が発生する前に、ディスクを増設してデータを再配置する。
さらにデータが増加してディスクの容量が不足した場合、ディスクを増設する。 仮想サーバーのディスク容量を変更した場合、保存されているデータは消去されるため、ディスク増設で対応しなければならない。
物理サーバーは、ドライブベイに空きがあれば、カスタマー・ポータルからディスクの追加を注文できる。
 
 
効果

ディスクは、必要な時点で増設できるため、最初から数年先を見越した容量を持つ必要がなく、無駄な費用の発生を抑えることができる。
 
懸念事項・注意点

ディスクの追加変更に伴うデータの移行は、クラウドのユーザーが実施する必要がある。
仮想サーバーのディスク容量変更、SANディスクのアタッチ、デタッチには、再起動を伴うため、計画的な対応が必要である。
容量を変更するディスク上のデータは維持されないため、事前にデータを退避する必要がある。
仮想サーバーの第一ディスク(OSディスク）は変更できない。
物理サーバーのディスク追加作業は、メンテナンス時間枠での作業となるため、緊急的な増設には利用できない。 このケースでは、エンデュランス・ストレージのiSCSIやNFSの利用が適する。
物理サーバーのディスク増設作業は、サーバーをシャットダウンして作業を実施するため、停止調整など事前準備が必要である。
オブジェクト・ストレージをブロック・ストレージとしてマウント利用すれば、容量不足でストレージを増設する必要がなくなる。 ただし、静的なファイルの保管に限定される。
 
参考資料

1.5.6 データのバックアップを取得するには？
1.6 ストレージの種類と選択
3.6 サーバーのストレージ容量を変更するには？
4.5 EVaultでバックアップするには？
4.6 EVaultからリストアするには？
5.8 Windowsのドライブとして利用するには？
5.9 Linuxにマウントするには？
Macの「最近の項目」を乱用しないで！！

## はじめに
みなさん、初めまして。私はMacを使うようになって数年経ち、自分の身の回りの人もMacを使用している環境を1年過ごしました。そんな中で、Macの中がごちゃごちゃの人たちの共通点があったのでここに共有したいと思います。

# 最近の項目
タイトルからわかるとは思いますが、共通点は「最近の項目」です。これは名前の通り最近使ったファイルを一覧で表示してくれる機能で、普段からファイリングをしっかり行っている人にとってはこの機能とても便利だとは思いますが、何も考えずに「最近の項目」ばかり使っているとびっくりするくらいFinderの中がごちゃごちゃになり自分でさえもどこになんのファイルがあるのか分からなくなります。その状態でヘルプをもと求められてもね...（笑）どこに何があるのかわからないので助けたいのに難しい。

# じゃあどうしたら？
そんなこと急に言われても使うのやめられないよ。って人は多いと思います。無理して使うのをやめる必要はないと思います。きちんとファイリングをして自分がわかるように整理をしたり、適当にファイル名を付けて保存せずにパターンを作ってわかりやすい名前にすればいいんです！！

<img width="1140" alt="スクリーンショット 2020-04-07 18.02.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563637/7e3a5e7d-a7bb-7951-e6a9-d3e98db3dd69.png">

MacのFinderには上の画像のサイドバー（左側）ようにデスクトップ・ダウンロード・書類などのようにタブに表示させることができます。これをうまく利用して整理してみてください。最初は面倒だと思うかもしれませんが使いやすくなるのはもちろん作業効率も上がります。是非実践してみてください！

サイドバーに表示する項目の選び方は...
1. デスクトップ画面かFinderのウィンドウをクリック
2. 画面左上のりんごマーク（）の右にあるFinderをクリック
<img width="456" alt="スクリーンショット 2020-04-07 18.15.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563637/6a12c55a-5e58-7a7d-1bee-2d37de1becc0.png">
3. 上から2番目の環境設定...をクリック
<img width="251" alt="スクリーンショット 2020-04-07 18.16.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563637/afb61761-a231-4549-a444-01a837dea514.png">
4. 左から3番目のサイドバーをクリック
<img width="483" alt="スクリーンショット 2020-04-07 18.16.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563637/f31fdd15-eca7-9d7b-c5b0-a8a77b0dfe2c.png">
5. 表示させたい項目にチェックを入れる

<strong>以上の手順で表示させることができます。</strong>

## 最後に
いかがだったでしょうか。簡単にですがまとめさせてもらいました。スクショを見て思った人もいるかもしれませんが私は「最近の項目」を使っていません（笑）ファイルごとに場所を分けていればすぐ見つかりますし、ファイル名にパターンを作ると覚えやすいので検索しちゃうんですよね。<strong>ご覧いただきありがとうございました!
</strong>
1.3 サーバーのスペックアップ／ダウン

（2016年時点での内容をアーカイブとして掲載しているため、一部の掲載内容が最新情報とは異なる場合がありますので、ご了承ください。最新のIBM Cloudの情報は [IBM Cloud Docs](https://cloud.ibm.com/docs) や [IBM Cloud アップデート情報](https://www.ibm.com/cloud-computing/jp/ja/cloud-update/) 、[柔らか層本](https://ibm.ent.box.com/v/ibmcloud-yawaraka)をご参照ください。）

解決したい課題

<注意> フレックス・イメージのサービスは、2017年8月7日にサービス提供終了となりました。

サーバーの必要能力の見積もりを開発段階で行うことは、たいへん難しいという課題がある。 企業内システムのサーバーの能力見積もりでは、端末数、データ量、トランザクションの内容、過去の実績を基礎に、サーバーの必要能力を計算して、安全係数をかけた値で、所用能力を推定してきた。 このためプログラムの処理効率、繁忙期などのスパイク負荷などの不確定要素があるため、安全係数を大きく取る傾向があり、不可欠な無駄が発生してきた。 さらに、スマートフォン向けソーシャル・アプリでは、さらに見積もりが難しい。 例えば、過大な設備投資は事業の利益を圧迫する。 逆にヒットに対して設備増強が追いつかなければ、応答時間に対するユーザーの不満が高まりユーザーの離脱を招くなど、ビジネスチャンスを失ってしまうことになる。
 
ソリューション・パターン

SoftLayerの仮想サーバーでは、CPU、メモリを必要に応じて追加できる。 さらに、仮想サーバーの処理能力が足りない場合、または、CPUを有効に使うためのチューニングにかける時間が無い場合には、物理サーバーへ移行することで、簡単に飛躍的に性能を向上させることもできる。
 
SoftLayerの物理サーバーでは、フレックス・イメージを活用して、スペックの高い物理サーバーへ乗り換えることができる。 物理サーバーのCPUのソケット数やコア数は、モデルによって決まっているため、カスタマーポータルからコア数の増設はできない。 またメモリ容量は、空きスロットが無い場合には、当然増設できない。 そこで物理サーバーの能力アップには、CPU搭載数の多い、メモリがより多く搭載できる、高いスペックの物理サーバーへ乗り換える必要がある。 この時、フレックス・イメージが利用できる。
 
インプリメンテーション

仮想サーバーの場合は、カスタマーポータルを操作して、CPUコア数、メモリ容量を変更する。 変更に際して、OSの再起動が発生するので、アプリケーションやミドルウェアを停止するなどの事前準備のうえ開始する。
物理サーバーへの移行による能力アップは、カスタマーポータルを操作して、仮想サーバーのフレックス・イメージを取得する。 次に、このイメージから物理サーバーを起動する。 フレックス・イメージを取得する際、OSの再起動が発生するので、事前準備のうえ作業を開始する。
仮想サーバーからクローンされた物理サーバーは、異なるIPアドレスが割当られているので、ポータブルIPやDNSなどを変更して、クライアントのアクセス先を変更する。
物理サーバーのスペックを上げる場合も、仮想サーバーから物理サーバーのクローンを作るのと同様の進め方でおこなう。

 
効果

仮想サーバーは、必要な時に、必要な分だけの増強ができる。
仮想サーバーでは能力が足りなくなった場合、物理サーバーへ移行して能力アップできる。
物理サーバーは、最大で一ヶ月単位の請求となっているため、能力の高い物理サーバーへ乗り換えても、オンプレミスのように固定資産を廃棄する様な損失は発生しない。
ユーザー数が減少して、収益を確保するために縮小する場合でも、同様の操作で対応できる。
キャンペーン期間中だけ、一時的に増強しておき、終了時にキャンセルできる。
 
懸念事項・注意点

仮想サーバーにおいて、CPUのコア数やメモリ容量を変更する場合、必ずOSの再起動が入るため、サービスの停止案内、事前にミドルウェアを停止するなど、事前準備が必要である。
フレックス・イメージを取得する場合も、再起動が発生するため、同様の対応が必要である。
新聞広告、イベント開催の日付、月末、連休期間などから、事前にピークが予測される場合は、できるだけ前もって増強の段取り決めておくことがお勧めである。
処理が滞留する事態になってからのスペック・アップの対応は、非常に難しい判断を要求される場合がある。 例えば、利用者の再試行操作、端末セッションの離脱と再ログインなどにより、通常は想定できない待ち行列の負荷が発生する。 このような状態に陥ると再起動を実施して、滞留した処理を一掃するなどの強行手段を取らなければ解決できない場合もある。 このような事態を回避するために、処理能力に余裕を残した状態で、能力アップを計画的に実施することが必要である。
 
参考資料

1.5.5 仮想サーバーから物理サーバーへ移行するには？
3.2 サーバーのクローンを作るには？
3.5 サーバーの RAM や CPU のスペックを変更するには？
4.2 サーバーを替えても同じIPアドレスを継続するには？
4.3 SoftLayerのDNSを利用するには？
4.4 古くなったサーバーを更改するには？
4.7 EValutで異なるサーバーに戻す方法は？
cdkでip制限をやってみた

# はじめに

[クラメソさんの記事](https://dev.classmethod.jp/articles/how-to-use-aws-waf-v2-to-filter-incoming-traffic-based-ip-address/)のWAF実装をCDKでやってみようと思います。[前の記事](https://qiita.com/ufoo68/items/5861f31456a128e92b77)で**CloudFront**を使って**S3**のウェブ公開とかやった分が残っていてのでそこに今回はIP制限を加えたいと思います。
ベースとなるコードは[こちらです](https://github.com/ufoo68/aws-cdk-deploy-react)。

# 準備

今回はv2がうまく動かせなかったので、[aws-waf](https://docs.aws.amazon.com/cdk/api/latest/docs/aws-waf-readme.html)を使います。

```bash
yarn add @aws-cdk/aws-waf
```

これで面倒なのは他のCDKのライブラリも同じバージョンにしないといけないことなんですよね。。。

# IPアドレスのホワイトリストを作成

`CfnIPSet`を使ってホワイトリストを作成します。今回は適当に`0.0.0.0/32`としておきます。

```typescript
const ipSet = new waf.CfnIPSet(this, 'IpSet', {
  name: 'whiteList',
  ipSetDescriptors: [
    {
      type: 'IPV4',
      value: '0.0.0.0/32'
    }
  ]  
})
```

# ルールを作成

`CfnRule`を使ってホワイトリストのルールを作成します。

```typescript
const rule = new waf.CfnRule(this, 'rule', {
  metricName: 'whiteListRule',
  name: 'whiteList',
  predicates: [
    {
      dataId: ipSet.ref,
      negated: false,
      type: 'IPMatch',
    }
  ]
})
```

# WebAclの作成

最後に`CfnRule`を使って、ホワイトリストに当てはまらないIPからのアクセスはすべてブロックするようなルールを記述します。

```typescript
const webAcl = new waf.CfnWebACL(this, 'webAcl', {
  defaultAction: {
    type: 'BLOCK',
  },
  metricName: 'webAcl',
  name: 'webAcl',
  rules: [
    {
      action: {
        type: 'ALLOW',
      },
      priority: 1,
      ruleId: rule.ref,
    }
  ]
})
```

# CloudFrontにあてる

前回用意したCloudFrontにwebAclをあてます。

```typescript
const websiteDistribution = new cloudfront.CloudFrontWebDistribution(
  this,
  'WebsiteDistribution',
  {
    originConfigs: [
      {
        s3OriginSource: {
          s3BucketSource: websiteBucket,
          originAccessIdentity: websiteIdentity,
        },
        behaviors: [
          {
            isDefaultBehavior: true,
          },
        ],
      },
    ],
    webACLId: webAcl.ref,
  },
)
```

単純に`webACLId: webAcl.ref`が加わっただけですね。

# さいごに

なんか個人的にはv2でない方が使いやすいなという印象なのですが（そもそも動かせなかったし）、どうなんでしょう。。。v2が使えないのは調べたところ、リージョン問題なのかなと思うのですが`us-east-1`でも失敗しました。他にも原因しらべてみたら成功するかもしれませんが、使い勝手があまり個人的に良くない気がするのでモチベーションが湧きませんでした。。cdkの方でなにかいいライブラリ作ってくれないですかね～（他力本願）。
PlatformIOでコンソール出力が上手くいかなかった

# はじめに
電子工作でわちゃわちゃしてたらコンソール出力で少しハマったので，メモ程度に残しておきます．


# 環境

- OS: `Windows10`
- VSCode: `1.43`
- PlatformIO: `Core 4.3.2a1`
- ST STM32: `6.0.0`
- 使用したマイコン: `F303K8`

※2020/4/7での状態


# 状況
上手くいかなかった最小構成は以下のソースコード．

```cpp:input
#include "mbed.h"

Serial pc(SERIAL_TX, SERIAL_RX); // tx, rx

int main() {

    int int_val = 1;
    float float_val = 1.0;
    double double_val = 1.0;

    while(1) {

        pc.printf("---\n");
        pc.printf("int value: %d \n", int_val);
        pc.printf("float value: %f \n", float_val);
        pc.printf("double value: %f \n", double_val);
        wait_ms(500);
    }
}
```

上記のソースコードをマイコンに書き込み実行すると，以下のような出力が得られた．

```:output
---
int value: 1
float value:
double value:
```

浮動小数点型が出力されなかった．


# 対策と結果

いろいろと調べた結果，質問掲示板のページでも似たようなことが質問されていた[[1]](https://community.platformio.org/t/pio-doesnt-build-teensy-floating-point-support/3296/2)．
同記事を参考にして，ソースに`asm(".global _printf_float");`を挿入してみた．

```cpp:input
#include "mbed.h"

Serial pc(SERIAL_TX, SERIAL_RX); // tx, rx

asm(".global _printf_float");

int main() {

    int int_val = 1;
    float float_val = 1.0;
    double double_val = 1.0;

    while(1) {

        pc.printf("---\n");
        pc.printf("int value: %d \n", int_val);
        pc.printf("float value: %f \n", float_val);
        pc.printf("double value: %f \n", double_val);
        wait_ms(500);
    }
}
```

以下はビルドしてマイコンに書き込み，実行した結果．

```:output
---
int value: 1
float value: 1.000000
double value: 1.000000
```

期待通り出力された．

# 参考
1. https://community.platformio.org/t/pio-doesnt-build-teensy-floating-point-support/3296/2
Ansible: vars_files を使用した loop処理


Ansible でのループ処理を変数ファイルから読みこむ方法を確認しました。
(ループ処理(loopモジュール) と変数読み込み(vars_files)両方の内容がなかなか見つけられなかったので...)

ループ処理は以前は with_items をよく使用していたと思いますが、 loop を使うように記載がありました。(2020/4/7時点)

Ansibleマニュアル: loop
https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html#with-items
抜粋：　"with_items is replaced by loop and the flatten filter."


----------------------
#### 環境
Ansible サーバー
- CentOS 7.6.1810 (Core)
  -- Ansible 2.8.2
  -- Python 2.7.5


----------------------
・Ansible のクライアントサーバー
- AIX 7.2TL3SP3
  -- Python 2.7.15

<font color="MediumSeaGreen">＊＊＊AIX でもAnsibleのクライアントになれます! ＊＊＊</font>

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

### playbooks
test.yml  (処理実行のplaybook)

```
---
- hosts: all
  become: true
  vars_files:
    - variables.yml        #<- 指定の変数ファイル
    
  tasks:
  - name: variable1 test
    shell: |-
       set -x
       echo {{ item }}
    loop: "{{ variable1|flatten(levels=1) }}"

  - name: variable2 test
    shell: |-
       set -x
       echo {{ item }}
    loop: "{{ variable2|flatten(levels=1) }}"

```


・variables.yml (読み込み用変数ファイル)

```
# variables
variable1:
    - A
    - B
variable2:
    - C
    - D

```

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

### 実行ログ

test.yml 実行ログ

```
$ sudo ansible-playbook -i tmp/ip -u root --private-key=id_rsa '--ssh-common-args=-o StrictHostKeyChecking=no' -e ansible_python_interpreter=auto_silent test.yml

PLAY [all] ***********************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************
Tuesday 07 April 2020  03:56:53 -0500 (0:00:00.051)       0:00:00.051 *********
ok: [192.168.0.xxx]

TASK [variable1 test] ************************************************************************************************************
Tuesday 07 April 2020  03:59:30 -0500 (0:02:36.992)       0:02:37.043 *********
changed: [192.168.0.xxx] => (item=A)
changed: [192.168.0.xxx] => (item=B)

TASK [variable2 test] ************************************************************************************************************
Tuesday 07 April 2020  03:59:31 -0500 (0:00:01.385)       0:02:38.429 *********
changed: [192.168.0.xxx] => (item=C)
changed: [192.168.0.xxx] => (item=D)

PLAY RECAP ***********************************************************************************************************************
192.168.0.xxx              : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Tuesday 07 April 2020  03:59:32 -0500 (0:00:01.217)       0:02:39.647 *********
===============================================================================
Gathering Facts --------------------------------------------------------------------------------------------------------- 156.99s
variable1 test ------------------------------------------------------------------------------------------------------------ 1.39s
variable2 test ------------------------------------------------------------------------------------------------------------ 1.22s
```


以上です。
MySQL に UUID のデータを 16 byte で保存する

似たような話は各所にあるのですが、自分の理解向け、備忘録向けに書きます。

# UUID について
https://ja.wikipedia.org/wiki/UUID

もとの起こりはWikipediaなどを見るとして、実運用的には開発時にデータに一意なIDを割り振る際によく用いられる。

UUIDには複数のバージョンがあり、最も開発で用いられていると思われるのは **UUIDバージョン4(ランダム生成)** 、その他に **バージョン１(MacアドレスやTimestamp情報を用いて生成)** などがある。

ビット幅は **128ビット(16バイト)** で、文字列表現では16進法で以下のような形で表現する。
（32バイト+バウンダリ4バイト=36バイト。 "-" がバウンダリ文字列）
> 550e8400-e29b-41d4-a716-446655440000

# SQL を用いて 16バイトで MySQL に保存する (8.0 以前 )
MySQL に16バイトで保存する場合には、16進数の文字列表現のUUIDからバウンダリ文字列を取り除いたものを、Binary に変換して保存する、という流れになります。
それを SQL で表現すると以下のような形になります。

```
CREATE TABLE `sada ` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `UUID VARBINARY(16) NOT NULL,
  `name` VARCHAR(1024) NOT NULL,
  PRIMARY KEY (`id`)
)
  ENGINE = InnoDB,
  CHARACTER SET = `utf8mb4`, COLLATE = `utf8mb4_bin`;
```

```
INSERT INTO sada (
    uuid,
    name
)
VALUES(
    UNHEX(REPLACE('550e8400-e29b-41d4-a716-446655440000', '-', '')),
    'masashi'
);
```

# SQL を用いて 16バイトで MySQL に保存する (8.0 以後 )
MySQL 8 以降から、UUID を操作するための関数が追加されています。
8 以降を使用している場合はこれを使うとオレオレ感を感じる独自処理から脱却することができます。

https://mysqlserverteam.com/mysql-8-0-uuid-support/

- UUID_TO_BIN  (UUID文字列をBinaryに変換)
- BIN_TO_UUID  (BinaryをUUID文字列に変換)

例は上記公式ブログを引用します。

```
CREATE TABLE t (id binary(16) PRIMARY KEY);

INSERT INTO t VALUES(UUID_TO_BIN(UUID()));
Query OK, 1 row affected (0,00 sec)

#a few inserts later..

SELECT BIN_TO_UUID(id) FROM t;
+--------------------------------------+
| BIN_TO_UUID(id); |
+--------------------------------------+
| 586bcc2d-9a96-11e6-852c-4439c456d444 |
| 5942e49a-9a96-11e6-852c-4439c456d444 |
| 841ae775-9a96-11e6-852c-4439c456d444 |
| 84393c8e-9a96-11e6-852c-4439c456d444 |
| af0f27e2-9aad-11e6-852c-4439c456d444 |
+--------------------------------------+
5 rows in set (0,00 sec)
```

# Java / Kotlin を用いて 16バイトで MySQL に保存する 
プログラムからも、各言語で生成した UUID 情報を Binary することで 16 バイトにおさめて保存することが出来ます。

ここでは Kotlin の例のみを記載します。
Java / Kotlin には UUID クラスが存在するので、以下のように UUID型 -> Byte 配列、ならびに Byte 配列 -> UUID型 の変換ロジックを作成し、使用する環境（ORM等）にあわせて組み込めば OK です。

```
    fun uuidToBytes(uuid: UUID): ByteArray {
        val buffer = ByteBuffer.allocate(16)
        buffer.putLong(uuid.mostSignificantBits)
        buffer.putLong(uuid.leastSignificantBits)
        return buffer.array()
    }

    fun bytesToUuid(bytes: ByteArray?): UUID? {
        if (bytes == null) {
            return null
        }
        val buffer = ByteBuffer.wrap(bytes)
        return UUID(buffer.long, buffer.long)
    }
```

# Appendix. より省サイズの ID 表現
UUID は 16 バイトもあるかなり大きめな ID 表現となるので、 UUID の保存で省サイズ化を頑張るより、より省サイズの ID を採用するという手もあると思います。
以下は参考文献程度に。

[軽量なTime-based ID生成器”shakeflake(仮称)”について](https://developer.smartnews.com/blog/2013/07/31/shakeflake-is-a-tool-for-generating-unique-id-numbers/)
Lambda@Edgeを使用してカスタムゲームコンテンツをプレーヤーに配信する方法

#はじめに
AWS の「 Amazon Game Tech 」公式ブログで、ゲームコンテンツをいかにすればネット遅延なく、配信できるのか？という記事をご紹介します！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/91048a64-7f5c-8a21-11ca-ffe97539a461.png)

AWS を利用して構築されている某モバイルゲームなどをよくプレイしていると、画質は綺麗だし動きもまるでコンシューマーゲームと変わらないようなクオリティでプレイできます。
誰かがゲームをプレイするたびに、データがチェックされてダウンロードされています。
プレーヤーの場所に関係なく、どのようにして超高速配信を確実にしているのか、という疑問を説明していきます。

#超高速配信の為に何をすべきか？
この問題には、 AWS のさまざまな解決策があります！
ほとんどは着信要求を調べ、プレイヤーのリクエストをみて、提供するどのファイルをレスポンスで返すかを決めるコードを実行する web 機能を実装します。

ただし、「電光石火の速さ」を必要とすることは少し問題があります。
プレイヤーが世界中にいる場合、ファイルが海中を走っているネット回線を介してダウンロードされているため、ゲームが読み込まれるのを待つ必要がないようにするにはどうすればよいか？
そのデータは CDN（コンテンツ配信ネットワーク）上にある必要があります。

#コンテンツ配信システム
####CDN 
- 世界中の複数のサーバーがコンテンツを配信するシステム
- 「マスター」サーバーにチェックインすることで、常に最新のファイルを保持
- 世界中にサーバーがあるので、サーバーがプレイヤーの近くにある可能性が高く、ダウンロードがはるかに高速になる

しかし、CDN だけでは問題は解決しません。
1つのURLがヒットしているため、実際に送信するファイルを決定するコードが必要です。 
CDN でコードを実行することはできません。

#Amazon CloudFront について
AWSは、**Amazon CloudFront** と呼ばれる、高速で安全性の高いコンテンツ配信ネットワーク（CDN）を提供しています。
 **CloudFront** には、この問題の解決に役立つ 「Lambda@Edge」 と呼ばれる機能があります。
![2020-04-07_15h35_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543340/92363988-8abe-23f8-12e1-1114cdfc6843.png)


####AWS Lambda 
サーバーをプロビジョニングまたは管理せずにコードを実行できるサービスです。
Lambda@Edge は、このサーバーレスなテクノロジーを  **CloudFront** にもたらします。

####Lambda@Edge 関数
- プレーヤーにコンテンツを提供している近くの同じサーバーで実行される
- データを取得するときに **CloudFront** がプレーヤーに送信するものを決定でき、コンテンツを送信する前に、追加の待機時間が起きるのを防ぐ
- Lambda@Edge にはトリガーのタイプに関する制限があり（すべてCloudFrontを中心）、許可される実行時間が短いが、静的な CDN にはないレベルの実用性が **CloudFront** に追加される

#オリジンとエッジの関係
まず「オリジンサーバー」と「エッジサーバー」とは何なんだと。

###「オリジンサーバー」
- ファイルの作成元であり、ファイルの最新バージョンが存在する場所
- **CloudFront** にデータを取得するために、すべてのサーバーにデータをプッシュする必要がなく、代わりにオリジンサーバーにデータを配置する

###「エッジサーバー」
- プレーヤーにデータを提供する、複数のリージョン（地域）のすべてのサーバー
- プレーヤーに送信する前に、常に元のサーバー（オリジン）に新しいデータがあるかどうかを確認し、そのデータもキャッシュする
- データはプレーヤーのために常に準備されており、再びオリジンからそれを取得する必要がない

これが高速な理由です。

遠くから投げられたボールをキャッチするよりも、近くのボールをキャッチするほうが断然早いですよね。
デフォルトでは、キャッシュは24時間残りますが、必要に応じてキャッシュを長くしたり短くしたりできます。

#所感
よく海外のWEBページの観覧や、ゲームをやっているとなかなか通信が重かったりします。
それは直接遠くにあるオリジンサーバーにアクセスして、大量の負荷がかかり、キャッシュより重いデータメモリにアクセスしているからなんだなと知ることができました。
 **CloudFront** があるだけで、アクセス遅延によるユーザー離れも免れます。

#公式サイトリンク
[Amazon Game Techブログ](https://aws.amazon.com/jp/blogs/gametech/how-to-deliver-custom-game-content-to-players-using-lambdaedge/)
[Lambda@Edge](https://aws.amazon.com/jp/lambda/edge/)
【株式投資】SQLを利用して銘柄スクリーニングを行う

# 概要
株式投資で取引銘柄を探す際に、株価指標を参考にする場合があります。

以前は株価指標を基に銘柄を探す際にWebサイトの指標スクリーニングを使用していましたが、
UIやレスポンスがいまいちだったり、検索条件が自分のやりたいようにできない場合が多いです。

SQLで検索条件を柔軟に変更しながらスピーディーに銘柄スクリーニングができないかと探していた所、
できる方法がありましたので参考までに記事にしてみました。

# 主な株価指標について
## PER
株価収益率のこと。
株価÷1株利益
PERが低い程、収益面から見て株価が割安となる。

## PBR
株価純資産倍率のこと。
株価÷1株純資産で求められる。
PBRが低い程、資産面から見て株価が割安となる。

## 配当利回り
株価に対する年間配当金の利回り。
株価が1000円で1株配当が50円なら、配当利回り5%となる。

# 手順
## 会社四季報プロ500を購入
東洋経済さんから出ている、会社四季報プロ500を購入します。
私の体感では、ある程度の規模の書店ならどこに行っても置いてあります。
※分厚い辞書のような会社四季報とは別の商品です。
https://str.toyokeizai.net/magazine/shikiho_pro500/

## 株価指標csvデータをダウンロードする
購入者特典として、株価指標データがCSVでダウンロードできます。
ダウンロード方法は、四季報プロ500内に記載されております。

## 株価指標csvデータをデータベースに取り込む
CSVデータを自分のクライアントPCのデータベースに取り込みます。

## SQLでスクリーニング
テーブルにデータ取り込み後、SQLで好きな条件を指定してスクリーニングを行います。

# スクリーニング可能な項目
- 証券コード
- 会社名
- 業種
- 予想PER
- PBR
- 予想配当利回り
- 業績進捗率
- 理論株価
など

# 終わりに
株式投資においては様々な投資スタイルがありますが、
「割安な銘柄群を購入し、割安感が解消されるまで待つ」戦略はバリュー投資と呼ばれています。
上記の指標スクリーニングについては、主にバリュー投資の際の銘柄選びに活用しています。


# 参考文献
- 『会社四季報プロ500 2020年 春号』東洋経済新報社
- 『賢明なる投資家』ベンジャミン・グレアム
 - バリュー投資のバイブル的な一冊です。
会社のメールアドレス（xserver）をiphoneのGmailアプリで使う方法

### 会社のメアドをiphoneのGmailアプリに登録する際に詰まったので、備忘録を残します。

## 手順

`Gmailアプリを開く→右上の自分のアイコンをタップ→別のアカウントを追加→その他（IMAPをタップ）→メールアドレスを入力→受信サーバーの設定（下記参照）→次へをタップ→送信サーバーの設定（下記参照）→次へをタップ→名前の設定（送信の際に表示される）
`

### 受信サーバーの設定
ユーザー名: メアド（@以降も全部）
パスワード: xserverで設定したパスワードを入力
IMAPサーバー: sv***.xserver.jp　
ポート: 993
セキュリティの種類: SSL/TLS

### 送信サーバーの設定
ユーザー名: メアド（@以降も全部）
パスワード: xserverで設定したパスワードを入力
IMAPサーバー: sv***.xserver.jp　
ポート: 465
セキュリティの種類: SSL/TLS
Vue CLI ノート（2）：プロジェクトの構成とロードの仕組み

###1.プロジェクトの構成

<img width="250" alt="スクリーンショット 2020-04-07 16.56.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117741/f27a90d4-9942-5c1e-e27d-c23ac9b8c6d0.png">

**node_modules:**
Vueのを構築するために必要なライブラリのすべてが保存されている場所のディレクトリ。

**public:**
プロジェクトをビルドする際のWebPACKを介して実行させたくない任意の静的な資産を配置

**asset:**
Webpackで最適化できるように、イメージやフォントなどのアセットの大部分をassetディレクトリに配置。

**component:**
Vueのアプリのコンポーネント、または構築ブロックを保管

**views:**
ビュー用のファイル、またはページを保存する場所

**app.vue:**
他のすべての構成要素が内にネストされていることをルートコンポーネント

**main.js:**
app.vueをレンダーリングし、それをDOMにマウント

###2.ロードの流れ
**main.js**の中で、まずVue,ルートコンポーネントApp.vue,routerとstoreをインポートします。
それからvueインスタンスを作り、routerとstoreを利用することを指定し、ルートコンポーネントApp.vueをレンダーリングし、それをDOMにマウントします("#app")

```javascript
import Vue from "vue";
import App from "./App.vue";
import router from "./router";
import store from "./store";

Vue.config.productionTip = false;

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount("#app");
```


index.htmlファイル内を覗くと、IDがのdivがあることがわかります。"app"つまり、これAppがマウントされる場所です。


```html
 <div id="app"></div>
    <!-- built files will be auto injected -->
```
SlackAPIのconversation.inviteで、"ura_max_channels"と出てきた

この"ura_max_channels"というメッセージ。

uraってなんだ？

ドキュメントを見たら「URAはすでにチャネルの最大数に達しています。」
https://api.slack.com/methods/conversations.invite

URAってなんだ？？

Slackへ問い合わせした返答。

```
こちらはシングルチャンネルゲストのこと ( ultra restricted access ) となっています
```

なるほど...
【React】ルーティング画面を作ってみた【react-router-dom】

[React Router: Declarative Routing for React.js](https://reacttraining.com/react-router/web/example/auth-workflow)
このサイトを参考に自分なりにアレンジ

```jsx
import React from 'react';
import { useSelector } from "react-redux";
import { HashRouter as Router, Switch, Route, Redirect } from 'react-router-dom';
import Top from './components/Top';
import Nav from './components/Nav';
import SignIn from './components/SignIn';
import SignUp from './components/SignUp';

export default () => {
  return (
    <Router>
      <Switch>
        <Route path="/signin" component={SignIn} />
        <Route path="/signup" component={SignUp} />
        <PrivateRoute path="/" token={token}>
          {/* ↓↓↓ ここに書かれているものが children に渡される ↓↓↓ */}
          <Top />
          <Nav />
          {/* ↑↑↑ ここに書かれているものが children に渡される ↑↑↑ */}
        </PrivateRoute>
      </Switch>
    </Router>
  );
}

const PrivateRoute = ({ children, ...rest }) => {
  const token = useSelector(state => state.token);

  return (
    <Route
      {...rest}
      render={({ location }) => {
        if (isAuthenticated(token)) {
          // 認証済みの場合は、トップページを表示する
          return children;
        }
        if (location.pathname === "/") {
          // URL が "/" の場合はサインインページを表示する
          return <SignIn />;
        }
        // 未認証で、URL が "/" 以外の場合は "/" にリダイレクトする
        // URL が "/" となるので、結果的にサインインページが表示される
        return <Redirect to={{ pathname: "/" }} />;
      }}
    />
  );
}

// 認証判定用のダミー関数
const isAuthenticated = token => token !== null;
```
スタイルファイルの導入～LyXでのレイアウト設定まで[Win10+texlive+LyX]

#はじめに
##概要
必要ができたので外部からLaTeXのスタイルファイルを導入しました。
私はLyXユーザーなのでそれに伴ったレイアウト設定も必要になります。

そういったわけで、一連の作業を備忘録的にここに公開します。
なんとなくクラス名は`foobar`に差し替えてあります。

##環境
記事執筆時点で

- Windows 10
- TeXLive 2019
- LyX 2.3.3

別途テキストエディタを使用（VSC）

#記録
##TeXLiveへの導入
然るべき場所からダウンロードしたzipファイルを展開、ファイルを適当な場所に設置します。
参考：[TeX のディレクトリ構成 - TeX Wiki](https://texwiki.texjp.org/?TeX%20%E3%81%AE%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E6%A7%8B%E6%88%90 "TeX Wiki")

zipの内容物は↓のような感じでした：

- クラスファイル本体(.cls)・付属.styファイル
- BibTeXスタイルファイル(.bst)
- サンプルファイル (.tex,.bib)

サンプルファイルはpdf出力ができてから移動させることにして、残りを`texmf-local/`以下のしかるべき場所に移動。

特段ls-Rの設定も弄ってないので`mktexlsr`を動かして(texlive的には)導入完了。

```
> mktexlsr
```


##LyXレイアウトファイルの作成
ここからはLyXのヘルプファイルとにらめっこしながらレイアウトファイルを作ります。

まず、.clsファイルの中身から`\LoadClass`文を発掘します。

```
\LoadClass[letterpaper,11pt,twoside]{article}
```

つまりこのクラスはarticleクラスの設定を援用しているということです。
なのでarticle用のレイアウトファイル`article.layout`をコピーして別の名前で保存します。

ユーザーディレクトリ（`ヘルプ>LyXについて`に記載されている場所、私の場合は`~\AppData\Roaming\LyX2.3\`。）に放り込んだlayoutファイルは、環境構成時にLyXがクラス一覧のリストに追加してくれるので、編集したレイアウトファイルを置いて`ツール>環境構成`を走らせ、ログに以下の行が表示されれば第一段階は達成です。

```
+checking for document class foobar [foobar]... yes
```



##最低限の変更箇所

###文書クラス宣言

```article.layout
#% Do not delete the line below; configure depends on this
#  \DeclareLaTeXClass{Article (Standard Class)}
#  \DeclareCategory{Articles}
```

LyXの文書設定画面で表示される文字列および選択メニュー内のカテゴリ配置を決定する大事な行。変えておかないと元のarticleと区別できなくなるので確実に設定しておきます。
4行目以降のコメントアウト行はたぶんコンソール実行時に出力されるテキストなので、適当に差し替え。

###hyperrefの設定

クラスファイル中に`\RequirePackage{hyperref}`の記述があったので、LyXにhyperrefの定義が既にされていることを教える必要が発生します。
**これをサボるとハイパーリンク使用時の出力でOption clashエラーが発生します。**
今回の場合だとサンプルファイルのpdf出力ができなくなりました。


そういったわけで、以下の一行を.layoutファイルのどこかに追加します：

```
Provides hyperref 1
```

これでサンプルファイルのpdf出力が通るようになりました。ハイパーリンク中のコマンドがエスケープ済みのテキストに変換されてしまっていますが誤差でしょう。

##追加の設定
###クラスオプション

クラスオプションのデフォルトを適当に設定しておきます。

```
ClassOptions
	Other "<default-options>"
End
```

###プリアンブル設定
レイアウトファイルでプリアンブルを設定すると後々いじるのが面倒なので、プリアンブルだけ専用のものに差し替えた白紙のLyXファイルを作成し、テンプレートとして使うことにしました。

###追加コマンド
所属機関の表示を行うコマンド`\institute`が新規に定義されているのでLyXでの表示に反映させます。差し当たって設定したパラメータは以下のようになります。

```
InsetLayout Flex:Institute
	LyXType    	custom
	MultiPar   	0
	LatexName  	institute
	LatexType  	Command
	LabelString	"Institute"
End
```

- `InsetLayout` ……Beamerなんかでは段落（`Style`）として設定されていますが、今回は差込枠として設定します。
- `LyxType` ……ヘルプによると`charstyle`、`custom`、`element`、`end`の4つの値が取れるらしいです。`charstyle`と`element`を選択すると、右クリックメニューの`文字様式`内にコマンドが出現します。`custom`の場合は`挿入>拡張差込枠`に登録されます。
- `MultiPar` ……枠内での複数段落の可否を選択します。`LyxType`を`charstyle`にすると連動して0に設定されます。また、この項目の設定に対して`CustomPars`（段落設定ダイアログの使用可否）と`ForcePlain`（様式を「標準」に固定）が連動して設定されます。
- `LatexName` ……LaTeXに変換したときのコマンド名 or 環境名です。
- `LatexType` ……LaTeXに変換するときの挙動を指定します。`Command`の場合は\\*LatexName*コマンドに変換されます。オプションは必要な場合別途指定します。
- `LabelString` ……LyXで差込枠を挿入したときのラベル表示です。URL挿入時の「URL」表示部分です。


#論文のテキストを流し込む
ちゃんとLyXに認識されているか等のチェックも終わったらひとまず作業は完了です。
あとは手元の論文をスタイルに合わせて流し込むだけですね！（ここからも長い（湧き出るLaTeXエラー（突然の定義競合
Rustのコンパイルと実行をコマンドひとつで

以下の記事の一部抜粋と + αとなっております。

[Rustを0から学んでみた 〜Part.0 準備/概要 編〜 - Yuto Hongo Portfolio](https://hongo.dev/blog/learn-rust-part0-introduction-and-setup)

---

Macでの利用で、Rustのコンパイラのインストールとpath設定ができている前提となっております。

## 1. シェルスクリプトの関数として準備

### 処理内容

1. .rsファイルと同じ場所にコンパイル後の実行ファイルを保存
2. コンパイル後のファイルを実行

### スクリプト

```bash:.bashrcや.bash_profileなど
#!/bin/sh
rust(){
  rustc $1 --out-dir `dirname $1` | `echo $1 | sed 's/\.[^\.]*$//'`
}
```

### 実行

```shell-session
% rust path/sample.rs
```

なんかダサイ気もしますが、いったんこんなもんで。。。


## 2. CodeRunnerでの設定

[CodeRunner – Programming Editor for macOS](https://coderunnerapp.com/)

こちらのツールでの設定をご紹介します。

### 設定方法

1. CodeRunner起動
2. メニューバーの 「CodeRunner」 > 「Preferences」 > 「Languages」 > 「Rust」 を選択
3. 「Run Command:」 に、以下記述をする

```bash:RunCommand
rustc $filename | ./$compiler
```

![スクリーンショット 2020-04-08 13.36.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57200/17b0e5fd-659b-9734-b755-3e2564029b09.png)


### 実行

実行ボタンをポチる
[漏洞通告]Nexus Repository Manager 3.X多个高危漏洞通告

### 漏洞描述
近日,`sonatype`官网披露了旗下产品——`Nexus Repository Manager`3.X版本存在多个安全漏洞,包含`CVE-2020-11444`——越权修改密码、`CVE-2020-10204`——JavaEL表达式注入远程执行代码执行、`CVE-2020-10199`——JavaEL表达式注入远程执行代码执行.这一系列漏洞只需要一个低权限有效账户即可利用.

`Nexus Repository`是一个开源的仓库管理系统,可搭建npm、maven等私服.

### 漏洞编号
CVE-2020-11444
CVE-2020-10204
CVE-2020-10199

### 漏洞威胁等级
高危

### 影响范围
Nexus Repository Manager OSS/Pro <= 3.21.1

### 漏洞验证
`CVE-2020-11444`——越权修改密码
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/75674798-9d1e-2f79-d1cc-9cf876f88cec.png)
`CVE-2020-10204`——JavaEL表达式注入远程执行代码执行(已实现回显)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/43fc5317-a41b-96cd-9259-796c5fcbb74e.png)
`CVE-2020-10199`——JavaEL表达式注入远程执行代码执行(已实现回显)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/bf77e0e7-8c7e-416d-5d42-0b203a18fad8.png)

### 修复建议
升级到最新版本

### 时间轴
[0] 2020/03/31 `sonatype`官网披露安全漏洞`CVE-2020-10199`、`CVE-2020-10204`
[1] 2020/04/02 `sonatype`官网披露安全漏洞`CVE-2020-11444`
[2] 2020/04/07 亚信安全网络攻防实验室分析&复现该漏洞并发布漏洞通告

### 鸣谢
感谢一起研究的以下小伙伴
`lufei`
`l1nk3r`
`r00t4dm`
`Ntears、`
`pyn3rd`

### Reference
https://support.sonatype.com/hc/en-us/articles/360046133553-CVE-2020-11444-Nexus-Repository-Manager-3-Improper-Access-Controls-2020-04-02
https://support.sonatype.com/hc/en-us/articles/360044356194-CVE-2020-10204-Nexus-Repository-Manager-3-Remote-Code-Execution-2020-03-31
https://support.sonatype.com/hc/en-us/articles/360044882533-CVE-2020-10199-Nexus-Repository-Manager-3-Remote-Code-Execution-2020-03-31
https://www.cnblogs.com/magic-zero/p/12641068.html
Rails 質問です

# したいこと
ホーム画面で投稿一覧を表示したいです。
具体的には
qiitaみたいにログインしていない方にも投稿を一覧を見れるようにしたいのです。

## 現状
home画面の作成済み
非ログインユーザーのページ

user
devaiseでのユーザーの登録機能

code
投稿機能の作成済みです
***
## 思っていること

homeはコントローラのみでmodelはありません
モデルがない為アソシエーションが出来ないのですが
homeのmodelを作成して
codeとuserをアソシエーションした方がいいのかな〜とは思っています。
妄想USキーボード配列（英語配列＋変換と無変換）

## 目的

USキーボードを元にした、新しい日本語配列を妄想する。
大きさはHHKBを想定。
Fnを押した後の形は、今度、考える。


## 背景

2020年春のWindows10で、変換でIME ON、無変換でIME OFFの機能がつくらしい。
半角・英数キーがいらなくなる。
ついでにカナキーとアプリケーションキーもいらない。

## 欲しいキーボードの形状

上の4列は、HHKB USと同じ。
5列目は左Fn、左win、左Alt、無変換、スペース、変換、右Alt、矢印キー（vimのhjkl並び）を追加

+ 妄想キーボード（HHKBの大きさ）

![mousou_hhkb_scale.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285482/1156b47d-85c5-dde7-caec-bc43b2182729.png)

+ HHKB_US（参考）
![hhkb_us_scale.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285482/51ec46e7-8751-2fea-5b2c-e1e73afe7076.png)

+ Realforce_old_US（参考）

![Realforce_old_US_scale.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285482/430fb64a-5298-a7d9-cd33-63f759c6f5b1.png)

+ Realforce_R2_US（参考）

![Realforce_R2_US_scale.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285482/c46ae22f-7620-3f3b-dd89-6635ad2fab60.png)

+ HHKB_JP（参考、スペースキーの長さに自信なし）

![hhkb_jp_scale.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285482/3ed61917-3e08-b2f4-50bc-cd3e4edebb57.png)

+ Realforce_old_JP（参考）

![Realforce_old_JP_scale.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285482/6cd9d74f-70dd-1298-a8d8-02dcbc833862.png)

+ Realforce_R2_JP（参考）

![Realforce_R2_JP_scale.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285482/ec3a9c98-3edb-e56b-efbd-13493deab336.png)





## 参考データ

+ JWWで図面を作成
+ キーの幅（一部推測あり）
    + 119.0 mm スペースキー（Realforce R2 US）
    + 114.0 mm スペースキー（HHKB US, Realforce old US）
    + 81.0 mm スペースキー（Realforce R2 US）
    + 52.0 mm 右Shift（Realforce US）
    + 47.5 mm スペースキー（HHKB JP, Realforce old JP）
    + 43.0 mm 左Shift、Return
    + 38.0 mm 左shift（HHKB JP）
    + 33.0 mm Ctrl、右Shift（HHKB US, Realforce JP）
    + 28.5 mm Tab、Del、左Fn、左Alt、無変換、変換、右Alt（妄想）、Enter（JP）
    + 24.0 mm 変換、左右Ctrl（Realforce R2 JP）
    + 23.5 mm 左右Alt、無変換、右Win（Realforce R2 JP）、
    + 19.0 mm その他

## 感じたこと
+ キーボードのレイアウトを考えるのはパズルのようで楽しい
+ 昔のRealforceのレイアウトはよく考えられている
+ 今のRealforce R2は、無理矢理感が感じられる。なぜ24mm幅のキーを使うのかな？
TableViewのセルを選択解除する方法

# はじめに
今回はTableViewのセルを押下すると自動的に解除する機能を紹介します。
# 実装

```swift:test.swift
    // Cell が選択された場合
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    {
        // セルの選択を解除
        tableView.deselectRow(at: indexPath, animated: true)
        
    }
```
コロプレス・マップで東京23区への来訪者を可視化する

新型コロナが全世界に蔓延しはじめ、日本でも外出自粛が続いています。

そんななか、ヤフーさんが東京への来訪者の推計を行っている[レポート](https://ds.yahoo.co.jp/report/covid-19.html)が公開しており、同時に「東京23区滞在人口推計値の日別遷移（全体・来訪者・住人）」という[推計データ](https://ds.yahoo.co.jp/report/)も公開しています。Excelデータなので、すぐに見ることができます。

ヤフーさんのように積極的に情報公開する企業の姿勢は素晴らしいですね！
今回は、このデータをコロプレス・マップ（階級区分図）で可視化してみましょう〜

# コロプレス・マップとは

wikipediaによれば、「階級区分図（かいきゅうくぶんず、英: choropleth map）は、主題図の一種であり、国民所得や人口密度など統計数値に合わせて色調を塗り分けた地図」のことだそうです。

**階級区分図のイメージ**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/8689ca5e-ab6f-e243-f9ba-f0e7c06bb067.png" width="600" alt="アメリカ合衆国の階級区分図のイメージ">


# データ加工

Excelの表形式のデータなので、JSON形式にしたいですね。jupyter notebookで前処理します。詳細はここでは省略しますが、およそこんな感じ。

1. データをpandasで読み込む。
2. セルの結合とかでデータの欠損があるところを埋めておく。
3. 23区名称で自治体コードを突合する。
4. Excelの日付のシリアル値をUnixtimestampに変換する。
5. 推計データをRGBに変換する。
6. JSONで書き出す。

データのイメージは以下の通りです。

```
{
    "Category" : "全体",
    "DistrictName" : "新宿区",
    "Districtcode" : "13104",
    "RGB" : [ 245, 171, 0 ],
    "Value" : 917000,
    "ts" : 1583334000000
  }
```

# データの準備

## firebaseへのデータインポート
firebaseにjson形式のデータを直接インポートします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/098ea96c-8608-6f80-f51a-75aef9207df0.png" width="400">

## enebularのデータソースを設定する

設定の詳細は、[こちらのドキュメント](https://docs.enebular.com/ja/InfoMotion/DataSource/Firebase/CreateDataSource.html)を参照してください。

# infomotionを準備する

## infotypeのインポート

enebularのinfotypeにコロプレス・マップがあります。今回は[東京都のinfotype](https://enebular.com/discover/infotype/f7888ff3-ae63-4054-bb3e-a6724e57043f)を自分のプロジェクトにインポートします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/d172bc63-e0d3-b4c6-bb84-d138080a6628.png" width="400">


## infomotionの作成

enebularのinfotypeとデータソースをinfomotion上で紐付けます。
Manage Graphsから設定を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/ef5421ab-4a78-5781-5edb-334d512c3146.png)

「来訪者」でフィルタをします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/fd89aa9f-55e7-feef-a576-2e880b7ebc68.png" width="400">



# 完成

完成したinfomotionはこちらです。
赤ければ赤いほど人口が多いことを示しています。来訪者は千代田区が一番多いようですね。

![tokyo-population-20200201.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/040b4647-7ac3-8ccf-47a2-7ca4f91a0ebc.gif)



# まとめ
enebularのdiscoverにある東京都のinfotypeを使って、yahoo提供データを可視化をしました。infomotionの機能でコロプレス・マップ（階級区分図）のアニメーションを簡単に作成できました。enebularのdiscoverには、日本の都道府県のコロプレス・マップが一通りそろっていますので、ぜひ可視化にチャレンジしてみてください。

出典：[ヤフー・データソリューション](https://ds.yahoo.co.jp/report/)
Vue CLI ノート（１）：プロジェクトの作成

#Vue CLI 3-プロジェクトの作成

###1.Node.jsバージョン8以降をインストールする

###2.CLIをインストールする

```
$ npm i -g @vue/cli
```

###3.Vueプロジェクトの作成

```
$ vue create myapp
```

###4.次に、デフォルトのプリセットを選択するか、機能を手動で選択するオプションが表示されます。
下矢印キーを使用して、[機能を手動で選択する]を強調表示し、Enter キーを押します。

```
Manually select features
```

###5.機能オプションのリストを次を選択。

[space]選択、[i]で選択を取り消しする

```
Router
Vuex
Linter/Formatter
```


###6.次に、リンター/フォーマッターを選択します:

```
ESlint +Prettier
```

###7.Lint on saveの追加機能を追加します:

```
Lint on save
```
###8.専用の設定ファイルを用意することにします。

```
In dedicated config files
```

###9.これらの設定をすべてプリセットとして保存するオプション(y/n)
   使用しないことを選択しますN。

###10.Enterキーを押すと、プロジェクトが自動的に作成されます。

###11.ブラウザでライブ表示するには、次のコマンドを実行します。

```
$ npm run serve
```
Chrome拡張のページアクションを作ってみた

書籍『Chrome拡張の作り方』の４章ブラウザアクション と ページ アクションを参考に作成してみた

ポイントは４つです

(1)マニフェストにtabsを指定する
(2)マニフェストにpage_actionを設定する
(3)backgroundのスクリプトで対象のタブIDを取得する。今回は更新されたタブのIDを取得
(4)backgroundのスクリプトでタブIDを指定し対象のタブを有効にする


- manifest.json

```
{ 
　　・・・省略
    
    "permissions": ["tabs"],    //　(1)

    "page_action": {         /*  (2)  */
　　・・・省略
    }
}
```
- backgroundのスクリプト

```
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab){ /* (3)　*/
　　・・・省略
            chrome.pageAction.show(tabId);    // (4)
　　・・・省略
});
```

※chrome.tabs.onUpdated.addListenerのコールバック関数の引数調査は下記に記事を書いています
[【第5回】chrome拡張 chrome.tabs.onUpdated.addListenerのコールバック関数の引数調査](https://stchan-web.blogspot.com/2020/04/5chrome-chrometabsonupdatedaddlistener.html)
久々にMinicondaを操作するときの道案内

# 対象
物覚えの悪い人(自己紹介乙)

# 事の発端
久々にMinicondaを操作したが、色んなことを忘れていたので、自分用にメモを残します。

### 動作環境
Windows 10
Anaconda3インストール済
Minicondaインストール済
PyCharmインストール済

## まず、プロンプトを立ち上げる
Anaconda Prompt(Anaconda3)というのがあるがこれではない。Miniconda Promptというのは無いので、普通のコマンドプロンプトを立ちあげます。
Windowsボタンを押して、cmdと入力してEnterを入力します。

## Minicondaの環境を立ち上げる
プロンプトに、以下のように入力する。

```
C:\Users\[ユーザー名]\Miniconda3\Scripts\activate.bat
```
以下のように表示が変わる

```
(base) C:\Users\[ユーザー名]>
```
デフォルトでbaseという仮想環境がアクティベートな状態になっている。

## 過去に作った環境一覧を表示するコマンド
```
conda info -e
```
一覧の中にMinicondaで作った環境があることを確認する。

## 仮想環境をアクティベートする
```
conda activate [仮想環境名]
```

## ここから、こっちのルートを参照してもよい
[自分のMinicondaの環境構築の備忘メモ - Qiita](https://qiita.com/hatorijobs/items/4db0ce7f90188fa224e2)

## 新しく仮想環境を作成する
```
conda create -n [新しい仮想環境名] python=3.6
```
確認してから、新しい環境に入る

```
conda info -e
conda activate [新しい仮想環境名]
```

## パッケージをインストールする
```
conda install numpyとか
```

## PyCharmで新しいプロジェクトを作る

#### プロジェクトのインタープリタに今作った仮想環境を設定する 

#### PyCharmでコーディングする
AWS InvalidClientTokenId を解決したメモ

configureを設定してもInvalidAccessKeyIdでエラーが出てしまう・・・・

```bash
$ aws configure
AWS Access Key ID [None]: XXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXX
Default region name [None]: XXXXXXXXX
Default output format [None]: XXXXXXXXX

$ aws s3 ls
An error occurred (InvalidAccessKeyId) when calling the ListBuckets operation: The AWS Access Key Id you provided does not exist in our records.

$ aws sts get-caller-identity
An error occurred (InvalidClientTokenId) when calling the GetCallerIdentity operation: The security token included in the request is invalid.
```

## 原因
aws_session_tokenが設定できていなかったことが原因でした。


```bash
$ cd ~/.aws
$ vim credentials

[default]
aws_access_key_id = XXXXXXXXX
aws_secret_access_key = XXXXXXXXX
aws_session_token=XXXXXXXXX
```

これで解決。
Swift５で戻るのボタンを非表示にする

# はじめに
今回は「Navigation Contoller」で実装した時にたまに機能的にいらない画面の「戻る」ボタンを消したいと思います。
# 実装
```swift:test.swift
self.navigationItem.hidesBackButton = true
```
上記コードを「viewDidLoad」なりに入れることでボタンを非表示にできます。

# 終わりに
ログインページから遷移などした際、戻りたくないなーとかあると思います。その際このコードが役に立つと思います。
Swift5でTableViewを使う方法


# はじめに
今回はTableViewを使います。※端折って書いちゃいます。
「Xib」を使ってカスタムなセルを作成することもできますが、まずは簡単なストーリーボードの「Table View cell」でてっとり早く実装したいと思います。
# 環境
Xocde10.2
swift5
# 実装
## コード
まずはコードを書きます。


```swift:test.swift
import UIKit

class TestPage: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!
    //cellに表示するデータ
    let testList = ["Test１", "Test２", "Test3"]
    override func viewDidLoad() {
        super.viewDidLoad()

    }
    //セルの数を指定
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return testList.count
    }
    
    //セルに値を設定
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // セルを取得する
        let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        // セルに表示する値を設定する
        cell.textLabel!.text = testList[indexPath.row]
        return cell
    }
}

```

##ストーリーボードをいじる

「ライブラリ」から「Table View」,「Table View cell」を自分の配置したい画面に挿入します。
<img width="700" alt="スクリーンショット 2020-04-07 16.12.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397376/75eabe6f-7bfb-835f-dd50-28b7a1875c84.png">

下記のようになります。
<img width="328" alt="スクリーンショット 2020-04-07 16.10.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397376/35a1d1ac-6aee-440a-1129-aa26202a4353.png">

「show the Attributes inspector」から「Identifier」に「cell」を入力します。
<img width="773" alt="スクリーンショット 2020-04-07 16.15.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397376/f2e1cc9a-9b08-bd28-b3b7-823b9e24e4e3.png">

#終わりに
今回はTable Viewの簡単な使い方をお話しました。
よく見る一般的なTableViewはこれで大丈夫ですが、UI/UXを気にしたレイアウトなどではやはり「Xib」を使ったカスタムセルがお勧めです。まずは基本からこういったもので簡単に実装できるということを知りステップアップでカスタムセルを自作するのもいいと思います。