OmniAICreator/Qiita-1.07M huggingface dataset:
TypeScriptでVuex,Vueをめちゃくちゃ楽に使う

#記事を書いた経緯
新卒で配属された入門プロジェクトとしてツールを作ることになり、
そこで初めてVueを使うことになりました。

VueのチュートリアルもそこそこにVuexとかTypeScriptとかつかって
色々過程をすっとばして作っていきました。

#Vuexとは
この記事を読んでくれている人は、もう知っている人が多いと思いますが、
Vueのための状態管理ができる便利なライブラリです。

Vueの特徴の一つに単一コンポーネントを用いた開発があります。
その際にコンポーネント間での値の受け渡しで結構苦戦しました。

これを解決してくれるのが、このVuexです。

アプリケーション全体の状態をこのVuexで管理することで値の共有を容易にします。

# Vuexを便利に使うためのライブラリ
今回の主題でもありますが、Vuexを簡単に使えたライブラリがありますそれが、

[vuex-class](https://github.com/ktsn/vuex-class)です。

このvuex-classは使用するコンポーネント内で@丸々のデコレーターをつけるだけで
それぞれの状態を呼び出すことができます。

よく使うstateの値とactionの実行をやってみるサンプルだけ置いておきます。

説明は省きますが、自分が使っているもう一つのライブラリは[こちら(vue-property-decorator)](https://www.npmjs.com/package/vue-property-decorator)

## サンプル

```store.ts
import Vuex from 'vuex';
import Vue from 'vue';

Vue.use(Vuex);

interface StateInterface {
  text: string | null;
}
export default new Vuex.Store({
  state: {
    text: "a"
  } as StateInterface,
  mutations: {
    setText(state, text) {
      state.text = text;
   }
  },
 actions: {
  changeText({ state, commit }) {
   commit('setText', "b");
  }
 }
})
```

```sample.vue
<template>
 <div>{{text}}</div>
 <button :click="changeText()">change</button>
</template>
<script lang="ts">
import { Component, Vue, Watch } from 'vue-property-decorator';
import { Action, Getter, State } from 'vuex-class';

@Component
export default class Sample extends Vue {
@State
private text!: string;

@Action
private changeText!: () => void;
}
</script>
```
Debian7.0をインストールした際にアーカイブミラーが使えず最小設定となった場合

##Debian7.0をいれたくなった．
とある事情でDebian7.0の環境が必要となったのでその時のインストールメモです．

debian7.0は[ここから](http://cdimage.debian.org/debian-cd/current/amd64/iso-cd/)とってこれます．
debian-10.1.0-amd64-netinst.isoをとってきました．
ダウンロードしたISOを指定してインストールします．私はVMware Workstationを使います．

#アーカイブミラーで躓く
http://linuxcom.info/install-debian7.html
を参考にインストールをすすめていきますが，アーカイブミラーのサポートが終了しており国内のどのミラーを参照してもエラーとなります．

ちょうど[こんな感じに](http://bluearth.cocolog-nifty.com/blog/2014/08/post-c929.html)なると思います．

しかたがありませんからここはミラーをあきらめて進めます．

こうしてインストールが終了すると真っ黒なコマンドラインが立ち上がります．

#パッケージのダウンロードすらできない

このままではパッケージのダウンロード先もサポートが終了している場所を指しているので何もダウンロードできません．
参照先を変更します．
/etc/apt/sources.listを編集します。

```
vi /etc/apt/sources.list
```

この中のdebから始まるものをコメントアウトして新たに

```
deb http://archive.debian.org/debian/ wheezy main
deb-src http://archive.debian.org/debian/ wheezy main
```
を書き加えます．

このようにすると

```
apt-get update
```

ができると思います．


#デスクトップ環境もほしい

```
tasksel
```

と打ち込んでください．
青い画面になるはずです．

文字化けしていましよくわからないと思いますが，その中の
一番上　

```
debian◇◇◇◇
```

にスペースでチェックを入れてください．
そしてエンターキーを押してしばらく待ってください．
いろいろインストールされます．

完了後

```
reboot
```

を打ち再起動してください．
デスクトップ環境が使えます．

#おまけ
sudo設定

```
su
apt-get update
apt-get install sudo
gpasswd -a [自分のユーザ名] sudo
su [自分のユーザ名]
```

フォルダが日本語な人向けに英語に再翻訳

```
 LANG=C xdg-user-dirs-gtk-update
```

vmwareの場合ゲストとホストでクリップボードが共有できないので
vmware-toolsを入れます．

画面上部にある「Player」という項目から、[管理] -「VMware Toolsのインストール」を選択。
すると、ダウンロードされたインストール用のCDがマウントされる。
VMwareToolsほげほげ.tar.gzを展開する。

```
sudo ./vmware-install.pl
```
を実行します．

ちなみに -d オプションを付けるとyesを打つ手間が省けます．
基本的にすべてyesです．

途中gccの場所どこ？とかきかれたりしますが，その場合素直に

```
apt-get install gcc
```

を実行して再度インストールを行いましょう．
webarenaでubuntu その52

#概要

webarenaでubuntu18.04やってみた。
練習問題やってみた。

#練習問題

mysqlで、データベース一覧表示、ユーザ一覧表示、特定のユーザーの権限表示、せよ。

#mysqlに入る。


```
sudo mysql -u root -p
```

#データベース一覧表示


```
show databases;
```

#ユーザ一覧表示


```
select user, host from mysql.user; 
```

#特定のユーザーの権限表示


```
show grants for 'hoge'@'localhost';
```

以上。
Facebookの仮想通貨LibraのハッカソンでHonorable mention (名誉ある言及)という賞を貰った

Facebookの仮想通貨Libraが来年発行されるという事で、世界中の中央銀行はじめトランプさんなどからも袋叩きの今日この頃ですが、

まぁ、そういう政治的？というか大人の方々のお話はともかくとして、Libra使って何ができるのかいじってみたいというのはQiita界隈に生息するものの本能だったりもします。

で、先月そのLibraのデベロッパーグループの主催で行われたハッカソン[HackLibra](https://medium.com/@hacklibra/hacklibra-winners-8da1a9124628)にLibra Authというプロジェクトで参加して、入賞は逃したけど「Honorable mention (名誉ある言及)」という賞的なものを頂いたので、その辺を少し書いてみようかなと思います。

最近Qiitaに全然書いてなかったし。

>HackLibra
https://medium.com/@hacklibra/hacklibra-winners-8da1a9124628

>自分のブログ「かも日記」 LibraのハッカソンHackLibraで3位入賞はできなかったけどなんか褒められた感？
https://jsgt.org/wp/?p=975

>Libra Auth
https://github.com/toshirot/libra-auth

残念ながら締め切り日の4日後にLibra testnet の更新があって、私のデモが依存していたライブラリが動かなくなってしまいました。

まぁ、発展途上のLibraなのでしょうがないのですが、その修正(修正しても良いかはちゃんと聞いたのだけど)が締め切り後ということで減点になってしまったので3位入賞を逃してしまいました。あれが無ければ入賞していたと自負はしてます。えへん。

さて、Libra Authという名前でわかる通り、これはLibraを利用したauthenticationについての話です。

Libraの公開鍵と秘密鍵を利用した認証方法で、EdDSAによる署名を使用します。 

Libraクライアントの鍵に基付く認証ですが、BobとAlice間の認証時の通信はLibraブロックチェーンを呼び出さなくても可能(呼び出せばより強固ですが)なので、Libraブロックチェーンに負荷を与えません。というわけで処理速度が速いです。

以下の図はこのDemoのものですが、ユーザー「ALICE」はLibraでチケットセンター「BOB」にチケット料金を支払い、署名チケットで認証されます。
　![68747470733a2f2f726569656e2e746f702f696d672f746f736869726f742f6c696272612d617574682e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7103/d1d2b8b5-6b76-9c60-ead7-9f7319c5426c.png)


詳細は Github の説明を観ていただくとして、ざっくりいうと、Libraを送受信した「Alice」と「Bob」本人であることをお互いに証明できるPrivate Key とトランザクション上で参照できるPublic Key を利用して相互に本人確認し、Signatureで作ったQRコードで認証をする方法についてのテスト実装です。

このデモは、例えば入場券の販売などを想定しています。

####手順
(1,2,3) AliceはBobのチケットセンターへ10Libra送金し、Bobへアドレスとメッセージを送ります。
(4,5) Bobは受け取ったメッセージと自分のPrivate Key でSignatureBを作りAliceへ送ります。
(6,7) Aliceは送ったメッセージと受け取ったSignatureBをBobのPublic Key でVerifyしてTrueならボブが、2のトランザクションでLibraを支払った相手であることが証明されます。
そこで、SignatureBとAliceのPrivate Key でSignatureAを作り、それとAliceのAddressでQRコードを作ります。
(8) Bobは入場ゲートでAliceのQRコードをスキャンし、送ったSignatureBと受け取ったSignatureAをAliceのPublic Key でVerifyしてTrueならAliceが、2のトランザクションでLibraをBobへ支払った人であることが証明されるので
(9) 証明された入場をOKにします。

上記の(1～4)以降はLibraネットワークを参照しなくても認証は可能なので、例えば入場門で数万人を連続処理してもLibraのネットワークに負荷をかけないということです。

もちろん、QRコードの盗難や転売対策として、(5～8)を繰り返すことも可能です。あるいは、転売を許可する代わりに、転売手数料がBobにも入る仕組みにすることもできると思います。

####デモ
https://libra-auth.com/

ALICE: Buy ticket:
http://libra-auth.com/buy-ticket.html
BOB: Authenticate ticket:
https://libra-auth.com/auth-ticket.html

コードはNode.jsで書いてますが、基本的にはどんな言語でもかけるかなと思います。その辺はこれから少しいじるつもりなので、後日続きを書きたいなと思ってます。現状のDemoコードはGithubでご覧ください。
react-native-storageで保存したデータのメソッドが使えなくなる件

# 概要
[react-native-storage](https://github.com/sunnylqm/react-native-storage)というAsyncStorageをラップしたライブラリがあります。
端末内にデータを保持させられるナイスなライブラリなのですが、使用中にちょっとハマったので備忘として。

# 事象
一度保存したデータを読み込んでみると、諸々のメソッドが使えなくなってしまう模様。
例えば下記の例はDate型で端末に保存されていたdateを読み込んだ時の処理

```javascript
import Storage from 'react-native-storage';
import {AsyncStorage} from 'react-native';

const storage = new Storage({
    storageBackend : AsyncStorage,
    defaultExpires: null,
});

let date = new Date();

storage.load({key: 'DATE'}).then((data) => {
    date = data;
}).catch((error) => {
    // 読み込みエラー処理
});

// Date型のメソッドが使用できない
date.getTime(); // --> date.getTime is not a function...
```

# 考察
同様の事象にあたった人がいないか調べてみるが、なかなか引っかかってこない。
でもなんとなく原因は推察できた。
react-native-storageはAsyncStorageをラップしているので、**保存されるデータは実際には文字列(というかJSON)で保持**されているのではないか？

というわけで先ほどのソースをちょろっと修正

```javascript
let date = new Date();

storage.load({key: 'DATE'}).then((data) => {
    // dataから新たにDateインスタンスを作成してみる
    date = new Date(data);
}).catch((error) => {
    // 読み込みエラー処理
});

date.getTime(); // --> OK!!
```

動いた！

# まとめ
新規にインスタンスを作成するという処理をワンクッション挟めば問題なく動作することが分かった。
react-native-storageはホントに使いやすくて便利なので、是非とも使ってみてください。
Laravelのアクセサの注意点について

みなさんこんにちは [tyamahori](https://twitter.com/tyamahori)です。
仕事でちょっとしたシステムをLaravelで作成する機会がありました。その中で注意しなければいけない点があったのでここに書き残したいともいます。

# アクセサを使う際のメソッド名の命名には注意

`getHogeHogeAttribute` をモデル内に記載しているかと思います

具体例はこちらです。
まずはカラム名そのままになんのひねりもなくアクセサを使ってみます。

```SampleEloquent.php

class SampleEloquent extends Model
{
    protected $table = 'sample_tables';

    /**
     * nameを取得するアクセサ
     *
     * @return string
     */
    public function getNameAttribute(): string
    {
        return $this->attributes['name'];
    }
}
```

次の例では注意が必要です

```SampleEloquent.php
class SampleEloquent extends Model
{
    protected $table = 'sample_tables';

    /**
     * idカラムをhex形式で取得するアクセサ
     *
     * @return string
     */
    public function getIdAttribute(): string
    {
        return bin2hex($this->attributes['id']);
    }
}
```

上記の場合ですと、場合によっては挙動がおかしくなります。自分が経験したポイントを以下にまとめます。

## ポイント
- 何かしらの処理をアクセサに噛ませる場合は、`getColumnNameAttribute()` ではなく、`getSomeActionColumnNameAttribute()` にしておく
- 特に、デーブルのリレーションで使われるカラムに何かしらの処理を絡ませるアクセサをつける場合は気をつける。`getColumnNameAttribute()`にするとバグる
- traitでModel間の共通処理を作って、アクセサを使う場合も`getColumnNameAttribute()`は避ける。`getSomeNameColumnNameAttribute()`みたいな命名にする。


# まとめ
アクセサのメソッド名の命名には気を使いましょう。思わぬところで変なバグを生みます。それでは良きLaravelライフを~
Laravelでレコード生成、更新時に自動更新されるタイムスタンプをミリ秒にする

## 概要

Laravelでレコード生成、更新時に自動更新されるタイムスタンプをミリ秒にする。

## 実装

```php:モデルクラス
class モデル名 extends Model
{
    // このメソッドをオーバーライドする
    public function getDateFormat()
    {
        return 'Y-m-d H:i:s.u';
    }
}
```

```php:マイグレートクラス
class マイグレート名 extends Migration
{
    public function up()
    {
        Schema::create('table_name', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->dateTime('created_at', 6); // 精度を6にする。
            $table->dateTime('updated_at', 6); // 精度を6にする。
        });
    }
}

```
【FuelPHP】クエリビルダでSQLを出力する

メモとして残します。


#■やり方

```php

$query_builder = \DB::select('col')->from(['table','tbl']); // table AS tbl
//上記のビルダオブジェクトのSQLを出力
echo $query_builder->compile();
// 出力内容 SELECT `col` FROM `table` AS tbl;
```
サブクエリをFROMで指定するときなどで活躍。
Git/Gerritで始めてrestoreをした話

# 目的

- Git/Gerritで始めてrestoreを実施した時の話をまとめる
- restoreはコマンドで実行したわけではなくGerritのGUI上からボタンクリックで行った。そのときの話をまとめる。

※Gerritでの操作を前提とした話なのであまり汎用性のない話かもしれません。

# 経緯

1. Gerritにてレビュー中のファイルの内容を更新したかった。
1. レビュー中の内容を消したかった。
1. 「コミットを取り消すなら`abandon`」とバカの一つ覚えしていた。
1. abandonを実行した。
1. ファイル内容を修正して修正後のファイルを、修正前ファイルをpushした環境からリモートにpushした。
1. 自動レビューシステム(社内構築)がエラーを返した。
1. 修正後ファイルの親コミットがabandonしたコミットになっていて、ファイルの構成がおかしかったためエラーになった。
1. abandonしたコミットの内容をrestoreボタンをクリックして元に戻した。
1. restore後、復帰させたコミットが指す親コミットが2個前のコミットを指していた。
1. 上司にレクチャーを受けながらGerritのRebaseボタンをクリックして親コミットを1個前のコミットに設定した。

# 経緯に対する私的や個人的メモ

- 一度pushしたファイルの修正は`$ git commit --amend`を使用するようにする。
- restoreはabandonされたコミットを復帰させるためのもの。
- 親コミットが一つ前のコミットを指してない時はrebaseを使使う。

# 自分の良くなかった行動・よかった行動

### 良くなかった行動

- `$ git commit amend`はコミットメッセージを修正するためのものと思い込んでいた。
- 何かあったらabandonすれば良いと思っていた。
- 自己判断でabandonした。

### よかった行動

- 基礎的なGitの知識がすこしあったため、解決が比較的スムーズだった。
- 一歩踏み込んだ内容を質問することができた
  - 上司が教えてくれた内容がスムーズに理解できた。
  - 疑問に思ったことをより具体的に上司に質問できた。

- 一度pushしたファイルを修正したい時の対処法が明確にわかった。
Go deferとpanicと俺

```go

package main

import (
	"fmt"
)

func main() {

	defer fmt.Println("①最初に書いたけど、これが最後")
	
	// 関数も指定できるよ
	defer deferFunc()
	
	
	// これは無名関数だよ
	defer func() {
		fmt.Println("③deferって複数指定するとスタックなんだね")
	}()

	// panicから復旧してみるよ
	defer func() {
		e := recover()
		fmt.Println("④recover関数で復旧するよ：" , e)
	}()
	
	panic("ぱにっぱにっ。 ぱにっぱにっ。 ぱにっぱにっぱにっく。")

}

func deferFunc() {
  defer fmt.Println("②2番目に書いたけど、これが①より先")
}

```
ICハンダづけ　動画(Ichigo Jamを想定して）　

仕事柄、ハンダづけをする用事はしばしばある。

Ichigojam
https://ichigojam.net

はんだづけキット
https://hello002.stores.jp/items/5b39e9815496ff4ec5000c13

多数購入。一人は完成させた。一人はIC以外が完了。

 <この項は書きかけです。順次追記します。>


ichigojamのICのはんだづけ、どうやったらいいかと聞かれて動画を探し中。

研修の講師をしていて、２０人くらい参加者がいると、プログラミングと同様、自分よりハンダづけが上手な人は２人はいる。自分が３０分かかる作業を、３分くらいで完成されてしまう。
(プログラミングだと、自分なら３年かかるプログラムを、受講者の方で３日で書いてしまう人とかもいる)

ああ、これがセミプロとプロの溝なんだと感じる。

毎日試作ではんだづけされている方の真似をしてうまくいく方法と、
そうでない場合があるかもしれない。


ピン間の狭いICハンダづけを習ったのは、岐阜羽島の土日プロジェクトの行事

CQ出版から発売された付録で部品付の雑誌の組み立て（はんだづけ）の実習では、
先生は以下の動画よりも手早く、さっとやってしまいました。

自分と小学生の子供は、それぞれ先生について、
手取り足取りやってもらい、倍以上の時間がかかりましたがはんだづけできました。

少し盛りすぎてしまいましたが、先生が、はんだごてを温めて、さっとすべらせるとあれ不思議。隣とつながった箇所は一個もなくなりました。

動画を撮っておけばよかったと反省しつつ検索中です。

要点は３つ

ICを固定する。
適量のハンダを適温のハンダごてで横にすべらせる。
万が一、量が多かったら、ハンダのついていないハンダごてでもう一度横にすべらせる。

そんな動画を探しています。

#関連動画

面実装部品(ピン間0.65[mm])のはんだ付け
https://www.youtube.com/watch?v=v9a0DA1o51E
[![面実装部品(ピン間0.65[mm])のはんだ付け]
(http://img.youtube.com/vi/v9a0DA1o51E/0.jpg)](https://www.youtube.com/watch?v=v9a0DA1o51E)


100ピンQFPの実装（0.5ｍｍピッチ）はんだ付け考察
https://www.youtube.com/watch?v=-8SRkSjkZ8A
[![100ピンQFPの実装（0.5ｍｍピッチ）はんだ付け考察]
(http://img.youtube.com/vi/-8SRkSjkZ8A/0.jpg)](https://www.youtube.com/watch?v=-8SRkSjkZ8A)



メモリやマイコンなどの狭ピッチICの半田付け
https://www.youtube.com/watch?v=2Y369xayCN4
[![メモリやマイコンなどの狭ピッチICの半田付け]
(http://img.youtube.com/vi/2Y369xayCN4/0.jpg)](https://www.youtube.com/watch?v=2Y369xayCN4)

手順は他にいくらでも資料はある。

大事なのは、小手先の大きさと、基盤とICのピンの間隔に対して、
どれくらいの量のハンダをはんだごてに乗せ、どれくらいの速さで横にすべらせるか。

動画を見て、量と速度を会得すればよい。

一つの資料で全部を理解する必要はない。

自分が実際やったときの、手間と時間はこんな感じ（次の動画）

表面実装部品のIC半田付け例
https://www.youtube.com/watch?v=Oi4QItTMMLI
[![表面実装部品のIC半田付け例]
(http://img.youtube.com/vi/Oi4QItTMMLI/0.jpg)](https://www.youtube.com/watch?v=Oi4QItTMMLI)

先生がやったときの手間と時間はこんな感じ（次の動画）

はんだ付け検定　実技試験対策（DVD）　VER.2
https://www.youtube.com/watch?v=LbL4odyMu0I
[![はんだ付け検定　実技試験対策（DVD）　VER.2]
(http://img.youtube.com/vi/LbL4odyMu0I/0.jpg)](https://www.youtube.com/watch?v=LbL4odyMu0I)

 

#参考資料
IchigoJamのはんだづけに関する資料 
LPC1114FDH28のはんだづけ

https://www9.big.or.jp/~mshinoda/IJ/Ichigokan/index8.html?fbclid=IwAR1YBVq7XvK7fi2--FHAdZuzfel_ohopuswZsqs_xPjMzguRImrG0p6hM70


仮説・検証（139）新人(学生)を指導するよりも新人(学生)に指導してもらった方が効率的

https://qiita.com/kaizen_nagoya/items/db993b1536055029f7c8


 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

#文書履歴(document history)
ver. 0.01 初稿 20190927午前
ver. 0.02 mshinoda 資料追記 20190927午後
ver. 0.03 誤植訂正、補足 20190928 午前
ver. 0.04 加筆 20211217
ネットワークスプリッターTAP、ネットワーク信号のリアルタイム監視

TAPは、光ファイバーネットワーク内の2つ以上のポイント間に主にインストールされ、リアルタイムのネットワーク信号監視レポートを提供します。 TAPには、アクティブTAPとパッシブTAPの2種類があります。パッシブTAPは、電源を必要としない純粋にパッシブなデバイスです。エンタープライズデータセンターでは、ネットワークの可視性を高め、ネットワークセキュリティを強化することが一般的です。パッシブTAPには、FBT（溶融テーパー）またはTFF（薄膜フィルター）の2つの主要な技術的方法があります。

HYCが提供する3ポートTAP（ネットワークスプリッター）デバイスは、TFF（薄膜フィルター）技術に基づく純粋なパッシブデバイスであり、電源を必要とせず、主にネットワーク信号伝送の分析と監視に使用されます。

![64.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/249aa7c0-f4c7-5084-5999-a983404b3e2a.jpeg)


事前に構築されたTAP状態では、ネットワークを切断せずにネットワーク伝送の信号をモニタリングポートにコピーできるため、通常の信号伝送を妨げることなく信号分析とモニタリングを実現でき、それにより正確なネットワークリアルタイムモニタリングを実現できます。 。まず第一に、それは通常のネットワーク信号伝送への干渉を引き起こさず、ネットワークに負担をもたらさず、パケットの損失を引き起こしません。第二に、データ分析のためにモニタリングポートへの信号の正確なコピーを作成し、ネットワークの可視性を高めます。

TAPは、異なるシーンのネットワークモニタリングに合わせて不均等なスプリット比（1％〜50％）をプリセットし、最高の信号モニタリング効果を実現することもできます。スプリット比の許容範囲は、≤±2％に制御できます。これにより、ネットワーク監視の精度が保証されます。分割比率の選択は、主にメインリンクとモニタリングリンクの通常の動作を満たすことができる分割の割合を考慮して、さまざまな設置環境の要件によって異なります。
![65.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/7b3b3aa1-a990-995a-bbe1-e0f10372a4db.jpeg)


TAPデバイスは、従来の融着テーパースプリッター（FBT）と比較して、幅広いアプリケーションでフルバンド（1260〜1650nm）伝送に対応しています。フルバンド、工業用グレード、高い安定性、その他の利点により、テスト機器の監視、PONシステム、光ネットワークのスイッチングおよび保護に広く使用されています。
![66.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/43ae4c3c-797e-4049-a409-957876836474.jpeg)


主な機能は何ですか？
1.追加の電力は必要ありません。デバイスの電源をオフにしても、ネットワークリンクの障害ポイントにはなりません。
2.これは、効率的で経済的なリアルタイムのネットワーク監視方法です。
3.すべてのリンクトラフィックを監視します。破損したデータも拒否されないため、ユーザーはすべてをリアルタイムで見ることができます。
4.ネットワーク伝送を中断したり、ネットワークの円滑な運用を中断したりすることなく、データを完全に送信します。

ネットワークがより大きく複雑になると、パフォーマンスとセキュリティを監視することが重要になります。 TAP Network Tapは、シンプルで費用対効果の高い効率的なネットワーク監視方法です。ネットワーク展開中にTAPをインストールすることにより、リアルタイムのトラブルシューティング、レポート、および分析が簡単になります。

HYC は、光通信パッシブ基本コンポーネントのR＆D、製造、販売、およびサービスを専門とする国立ハイテク企業です。同社の主な製品は、光ファイバーコネクター（データセンターの高密度光コネクター）、波長分割マルチプレクサー、光スプリッター、その他の3コアの光パッシブ基本コンポーネントで、ファイバーツーザホーム、4Gモバイル通信、インターネットデータセンター、防衛通信、その他の分野。 http://www.hyc-system.com
yarnでパッケージをアップデートするときに注意すること

# 手順
1. `yarn outdated`でversionを確認する
2. `yarn upgrade-interacitve --latest` でパッケージを更新する。

手順としては上記2点だけで更新できるが
きちんと理解していないと躓くので、それぞれをきちんと理解する。

## yarn outdated
古いパッケージの依存関係があるかをチェックします。
https://yarnpkg.com/lang/ja/docs/cli/outdated/


```
Package    Current Wanted Latest Package Type    URL
lodash     4.15.0  4.15.0 4.16.4 devDependencies https://github.com/lodash/lodash#readme
underscore 1.6.0   1.6.0  1.8.3  dependencies    https://github.com/jashkenas/underscore#readme
✨  Done in 0.72s.
```

Currentは現在のversionを、
Latestは最新のversionを表している。

そしてWantedに関しては以下の通り。

> The resulting field 'wanted' shows the latest version according to the version specified in the package.json, the field 'latest' the very latest version of the package.

つまり、現在のpackage.jsonの指定に従った最新のversionになるため
メジャーアップデートが入った場合などでpackage.josnも更新したいときはLatestを参照する。


## yarn upgrade-interactive --latest
npm-check の対話型の更新モードと同様に、古くなったパッケージを簡単に更新する手順を提供する。
https://yarnpkg.com/lang/ja/docs/cli/upgrade-interactive/

上記と同様に、latestオプションをつけないと現在のpackage.jsonの指定に従った最新のversionを表示するため、最新のversionにアップデートするのであればオプションをつける。

```
[1/? Choose which packages to update. (Press <space> to select, <a> to toggle all, <i> to inverse s
election)
 devDependencies
❯◯ autoprefixer      6.7.7  ❯  7.0.0          https://github.com/postcss/autoprefixer#readme
 ◯ webpack           2.4.1  ❯  2.5.1          https://github.com/webpack/webpack

 dependencies
 ◯ bull              2.2.6  ❯  3.0.0-alpha.3  https://github.com/OptimalBits/bull#readme
 ◯ fs-extra          3.0.0  ❯  3.0.1          https://github.com/jprichardson/node-fs-extra
 ◯ socket.io         1.7.3  ❯  1.7.4          https://github.com/socketio/socket.io#readme
 ◯ socket.io-client  1.7.3  ❯  1.7.4          https://github.com/Automattic/socket.io-client#readme
```

### latestオプションなしの場合
逆にlatestオプションなしで更新すると、package.jsonの指定に従って更新されるため
キャレットやチルダ記述の範囲内でyarn.lockファイルのみが更新されることになる。
package.jsonファイルは更新されないので、なぜ???とならないように注意。

### yarn.lockファイルの共有
更新されたyarn.lockファイルは共有することで、プロジェクト全体で
パッケージのマイナーバージョンの依存関係のズレがなくなるので
commit,pushを忘れないように。
Android10から出たダークテーマにアプリを対応させないようにするには

##はじめに
実機のAndroid10でダークテーマにしたらアプリの色が予期せぬ色になってしまったのでダークテーマを無視して
今まで通りのアプリの色を表示したい！

##環境
macOS Mojave 10.14.6
AndroidStudio3.5
compileSdkVersion 28
minSdkVersion 21

##アプリでダークテーマを無視する
Googleさんは非推奨かもだけど、暫定対応。

```元々のstyles.xml
<style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
```

```変更後のstyles.xml
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
```
windowsとubuntuをデュアルブートしてDockerを動かすまで

# WindowsからDockerを使いたい
  

先日、

__Windows搭載PCからDockerを使わなければならない__

という状況に直面した。
この記事は、その時の悪戦苦闘の様子の備忘録である。

## OS

Windows10 home 64bit  
  
調査したところ、windows proだとそこまで苦労せずにdockerが使えるらしいが、homeだと相当苦労するらしい（__実際苦労した__）。




## 結論：ubuntuをデュアルブートすることでDockerが使える

__「それwindowsでdocker使えてねーじゃん」__というツッコミが聞こえて来そうだが、これ以外の解決方法を見つけることができなかった（失敗した方法については記事の後ろの方参照）。  

今回は[この記事](https://qiita.com/yo_kanyukari/items/2a944a300db22482c696)を参考にして同一PCにwindows10とubuntu18.04を共存させた。

手順は、
***
1. UbuntuをPCに入れるためのUSBを準備する
    - USBにubuntuのイメージファイルをコピーする
    - そのUSBをブート可能にする

2. Ubuntuを入れるためのHDDパーティションを確保する

3. USBを起動し、PCにubuntuをインストール
4. Ubuntuの各種設定

***
という流れ。
詳細は[参照記事](https://qiita.com/yo_kanyukari/items/2a944a300db22482c696)が大変わかりやすい。

Ubuntu18.04が正常に使えるようになったら、あとは端末を開き

```terminal
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable test edge"
sudo apt-get update
sudo apt-get install docker-ce
```
とすればOK。
ついでにdocker-composeも入れる。

```terminal
sudo apt-get update
sudo apt install docker-compose
```
以上。ついでに、うまく行かなかった方法も掲載↓


##初めに試して失敗したこと

### Docker tool box を使う（失敗）
[この記事](https://qiita.com/idani/items/fb7681d79eeb48c05144)を参考にOracle Virtual Boxを使う方法を試した。  
Docker Quickstart Terminalを起動するところで  

```terminal
Looks like something went wrong in step ´Looking for vboxmanage.exe´... Press any key to continue...  
```
と出て失敗。コマンドプロンプトから仮想マシンを動かそうとしたり、biosから仮想化の設定を有効化したりしたが、仮想マシン起動できず。  
ただ、この方法で成功した人もいるらしいので、相性の問題（？）

### Windows上でubuntuを動かして、その上でdockerを動かす（失敗）
[この記事](https://qiita.com/hoshimado/items/78cccdaffd41dc47837e)を参考にWSL越しにDocker for Ubuntu+Re:VIEWを動かそうとした。この時点で「windowsを使ってDockerを使っている」といえる状態かは微妙なのだが、これも失敗した。

まず、[記事](https://qiita.com/hoshimado/items/78cccdaffd41dc47837e)を参考にubuntu16.04をインストールした。管理者としてdocker deamonを立ち上げ、

```terminal
docker run hello-world
```
すると失敗した。これは一旦pullでローカルにhello-worldをいれてから改めてトライすると成功するという謎の状態だった（Dockerから外部と通信するときに不具合が生じている？）。

とりあえず、通信系の不具合は見なかったことにして、先に進むも、後に

```terminal
docker-compose up 
```
を使ったときにエラー。
[これ](https://gdgd-shinoyu.hatenablog.com/entry/2018/07/10/032023)とか[これ](https://www.scriptlife.jp/contents/programming/2018/07/09/docker-on-wsl/)を参考にする感じでは、解決が無理そうなので、泣く泣く断念。

## 関連リンク
・[【断言】エンジニアを辞めたい人へ。後悔する前にすべきことを経験者が解説](https://qiita.com/ykimura517/items/dd4b741b368305d28446)
【Progate】HTML&CSS初級編やってみた

タイトルがYouTuberすぎる．

**[Progateくん](https://prog-8.com/languages)** のHTML&CSS初級編をやったのでチートシート兼アウトプットしておく．
ほんとに列挙するだけ．
#1.HTML編

##見出し
```HTML:
<h1>例</h1>
```

##段落
```HTML:
<p>例</p>
```

##リンク
```HTML:
<a href = "URL"> 例 </a>
```

##画像
```HTML:
<img src = "URL">
```
当然だけど相対パスでもいいからディレクトリ分けて投げとこうね

##リスト
```HTML:
<li>
    <ul> 点 </ul>
    <ol> 番号 </ol>
</li>
```

##divタグ
```HTML:
<div>例</div>
```
単体では意味がないがブロック要素としてグループ化することができる
\<span>も同じだがこっちはインラインでグループ化するので，前後に改行を含まない

##\<head>
```HTML:
<head>
    <meta charset = "文字コード">
    <title>ページタイトル</title>
    <link rel = "ファイルの種類" href = "ファイル名">
</head>
```
\<link>:ファイルの種類は、目次などの外部ファイルとの関連性を書く
cssと接続したいなら"stylesheet"など
他は<a href = "http://www.htmq.com/html/link.shtml">htmlタグリファレンス</a>に細かく載ってるよ

##フォーム
```HTML:
<input>テキストフィールド</input>
<textarea>テキストエリア</textarea>
<input type = "submit" value = "ボタン">
```

##クラスの利用
```HTML:div
<div class = "クラス名">
```

#2.CSS編
##セレクタ
```css:
h1{
    
}
```
この例ならh1を使った時の振る舞いを制御する

##クラス
```css:
.クラス名{

}
```

##色
```css:
color            : カラーコード;
background-color : カラーコード;
```

##文字
```css:
font-size   : __px;
font-family : フォント名;
```

##サイズ
```css:
width  : __px;
height : __px;
```

##リストスタイル
```css:
list-style : none;
```
この例をリストで使ったらリストの黒点を消せる

##枠
```css:
border : __px 種類 カラーコード;
```
-top(bottom, left, right)で方向を指定できる

##余白
```css:
padding : __px;
margin  : __px;
```
上下左右に余白を設置
-top(bottom, left, right)で方向を指定できる
paddingは枠線の内側
margin は枠線の外側の余白
ブラウザの検証で余白を可視化できるので見ながらいじろう

##入れ子のセレクタ
```css:
.クラス名 h1{

}
```
この例なら指定したクラスのh1を使った時の制御を指定する

##横向き
```css:
float : left;
```
左から横向き
rightなら右から横向き

#〆
初級編ではこのくらい．

環境も作らなくていいし，空き時間にサクッとできるしで手軽にやった感が出せるのはいいね．
まだ無料の中で基本をやってるだけなので教材として評価するには早いけど，言語のとっかかりとしては優秀な気がするので，短期間なら有料でやってみてもいいかも．技術書より安いしな！！

とりあえず無料でできる他の初級編もやってみよ・・・
15年ほど前にBorland C++ Builderで作成したプロジェクトをEmbarcadero® C++Builder 10.3で開けるのか？

15年ほど前にBorland C++ Builderで作成されたプロジェクトファイル一式があります。
このプロジェクトファイルをEmbarcadero® C++Builder 10.3で開くことは可能でしょうか？

フォルダ内のファイル一覧はこのようになっていました。
＊特定の呼称の付いた名前は伏せさせて頂きます。
![コメント 2019-09-27 144658.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190290/93446dd5-db2d-ebd4-56b4-35fb935cc901.png)

たぶん、Borland C++ Builderでは、”****_Server.bpr”という拡張子のファイルがプロジェクトファイルだったと思われます。

例えば、これらのファイル現在のEmbarcadero® C++Builder 10.3でそのまま活用するということは可能でしょうか？

どうぞ、ご教示の程、ご協力よろしくお願い致します。
【Kotlin】Javaの可変長引数にKotlinのArrayを渡す【Java】

# やること
以下のような関数にKotlinの`Array`を渡します。

```java
void hoge(HogeClass... hogeClasses) {
  /* 省略 */
}
```

# やり方
以下のように、`Array`の前に`*`を入れることでできます。

```kotlin
val hogeList: Array<HogeClass> = // 初期化は省略

// 呼び出し
hoge(*hogeList)
```

## やっていること
先頭に補っている`*`はSpread演算子で、`Array`の展開を行なって渡しています。

Kotlinでは`fuga(vararg hoge: HogeClass)`というように宣言することで可変長引数を利用できますが、ここに`Array`を渡すときも同様にする必要があります。

# 参考にさせて頂いたサイト
- [Kotlinの可変長引数とフォーマット \- メモ2ブログ](http://sakebook.hatenablog.com/entry/2017/11/23/173608)
- [可変長引数（可変引数, Varargs）](https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/functions.html#%E5%8F%AF%E5%A4%89%E9%95%B7%E5%BC%95%E6%95%B0%E5%8F%AF%E5%A4%89%E5%BC%95%E6%95%B0-varargs)
【jQuery】Slick導入しようとするとjQuery is not definedが表示されて困った話。

Slick導入しようとするとjQuery is not definedが表示されて困っている。
最初の記事に書いてあったscript入れても何も起こらなかった。
<br>
<br>
[こちら](https://stackoverflow.com/questions/25773424/jquery-plugin-slick-carousel-not-working）)を参考にして、

```html
<script type="text/javascript" src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
```
を書くとエラーは表示されなくなった。

<b>jQueryを読み込んでいなかった。</b>
<br>
<br>
ちなみにjQueryを読み込むときは、
<b>JavaScriptを読み込む前に、jQueryを読み込んでおかないといけない。</b>
VSCodeとGitHubの連携方法【Mac】

毎回忘れてしまうので、主に自身の備忘として。
※2023年10月26日更新

# 1. GitHubに新しいリポジトリを作成
リポジトリを作成したら、画面中央あたりに表示させる
「Quick setup -- if you've done this kind of thing before」欄に
表示されているURLをコピーする。
・Set up Desktop
・HTTPS
・SSH
と選択できますが、私の場合はHTTPSを選択しています。

![スクリーンショット 2023-10-26 18.43.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456861/bf7b4807-3174-6e8a-49c8-a6581a605728.png)


# 2. VSCodeでクローンフォルダを作成
VSCodeを起動し、アクティティバーから「ソース管理」を選択、続いて「リポジトリのクローン」と選択していきます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456861/e5958df8-4f8f-fbd8-6f53-cab162a16f72.png" width="30%" align="center">

リポジトリのクローンをクリックすると、上部の検索窓がリモートソース入力欄になるので、1.でコピーしたURLをペーストします。
![スクリーンショット 2023-10-26 18.57.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456861/a137da6d-10f9-a86e-f295-d5eae596987b.png)

URLを入力してエンターキーを押すと、ローカルリポジトリの書き出し先選択のウィンドウが表示されるので、任意の場所を設定します。
![スクリーンショット 2023-10-26 18.59.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456861/6a35a188-8603-7465-b053-f28b85e8c861.png)


以上で連携設定は完了です。
もしすでにリポジトリと同じ名前のフォルダがすでに存在する場合は「フォルダ名-1」と名前に数字がついた状態で作成されてしまうので、事前に同名フォルダがないか確認しておきましょう。
PrometheusでKubernetesの監視

prometheusでk8sの監視をしてみたくなったので、やり方をまとめる。結構調べるのに時間がかかった。次回はもっと短くささっと調べたい。

参考: https://github.com/giantswarm/prometheus


### KubernetesにDefaultで付与される権限を拡張

```yaml

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: fabric8-rbac
subjects:
  - kind: ServiceAccount
    name: default
    namespace: default
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
```

あくまで使うための変更。Productionでは間違っても設定していけない。正しいやり方はnamespaceとか色々やって隔離してから権限を付与するみたい。Kubernetes何もわからん。
参考: https://github.com/fabric8io/fabric8/issues/6840

### PrometheusをDeploy

Prometheusの本体。設定ファイルをconfigMapで作成したのちにPodに渡している。

```yaml

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus
  template:
    metadata:
      labels:
        app: prometheus
    spec:
      containers:
        - name: prometheus
          image: prom/prometheus
          args:
            - --config.file=/mnt/etc/prometheus.yml
          ports:
            - containerPort: 9090
          volumeMounts:
            - name: config-volume
              mountPath: /mnt/etc/
      volumes:
      - name: config-volume
        configMap:
          name: prometheus-config

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-config
  labels:
    name: prometheus-config
data:
  prometheus.yml: |-
    global:
      scrape_interval:     15s
      evaluation_interval: 15s
    scrape_configs:
      - job_name: "kube-setting"
        kubernetes_sd_configs:
          - role: node
        relabel_configs:
          - source_labels: [__address__]
            regex: '(.*):10250'
            replacement: '${1}:30080'
            target_label: __address__

```

接続する際には適当にPortForwardingしてやる。

```sh
kubectl get pods
kubectl port-forward [pod_name] 9090:9090
```

### 各NodeにNodeExporterを配置

Nodeの情報をPrometheusに流すためにNodeExporterを配置。ついでにNodePortを作成してPrometheusからデータが取得できるようにしておく。



```yaml

---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: prometheus-ne
spec:
  selector:
    matchLabels:
      name: prometheus-ne
  template:
    metadata:
      labels:
        name: prometheus-ne
    spec:
      containers:
        - image: prom/node-exporter:v0.14.0
          name: prometheus-node-exporter
          ports:
            - containerPort: 9100

---
apiVersion: v1
kind: Service
metadata:
  name: prometheus-np
spec:
  type: NodePort
  ports:
    - name: prometheus-ne
      port: 9100
      targetPort: 9100
      protocol: TCP
      nodePort: 30080
  selector:
    name: prometheus-ne
```

### 他のメトリクス取得手段
後で調べる
Nuxt.jsにESLintいれてVSCodeで自動fixを有効にする設定方法

# 前提

- Nuxt.js バージョン2.9.2

# 設定方法

## 1. Nuxtのプロジェクト作成時にeslintを指定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134221/2293402d-3b58-2fd7-9caa-aba70f4a7f84.png)

## 2. VSCodeの拡張機能にESLintを追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134221/e39a3791-49fe-da8f-e085-100aea01daa7.png)

## 3. settings.jsonに設定を追記

「Command(⌘) + Shift(⇧) + P 」 > settingsと入力し、
Preferences: Open Settings(JSON) を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134221/9a4341e5-1701-33e0-e2d8-e99d4e293253.png)

以下の内容を追記します。

```json:settings.json
"eslint.run": "onSave",
"eslint.autoFixOnSave": true,
"eslint.validate": [
    "javascript",
    "javascriptreact",
    { "autoFix": true, "language": "vue" }
],
"editor.formatOnSave": false
```

必要に応じて`.eslintrc.js`のrulesの値を編集してルールを調整します。
CppcheckをGUIで使う


## cppcheck

無料で利用できるC/C++用の静的解析ツールです。

## インストール

下記サイトから、任意のVersionを入手します。
※2023-03-28の時点で、「cppcheck-2.10-x64-Setup.msi」でした。

https://github.com/danmar/cppcheck


## 新規プロジェクトの作成

あらかじめ、解析対象のソースコードを準備しておき、以下の手順で作成します。

1. インストールしたらまず、cppcheckを起動します。
2. GUIから、メニュー -> ファイル -> 新規プロジェクトを選択して、ファイル作成ダイアログを表示させます。
3. 解析対象のソースコードのルートツリーを選択して、任意のファイル名のプロジェクトファイルを作成します。(拡張子は*.cppcheckです。)任意でDefineやincludeパスを記載します。
4. 作成完了すると、自動で解析が始まります。


## 解析の実行

GUIから、メニュー -> チェック -> 全ファイル再解析　で実行できます。

警告の内容はファイル欄に表示され、要約も表示してくれますが、言語を日本語にしていても要約は英語になります。


## 最初の設定

解析の精度を上げる設定をします。これは任意です。

### Cppcheckの設定

* 編集 -> 設定 -> 全般 -> すべての#ifdefをチェックする をチェック
* 編集 -> 設定 -> 全般 -> エラーIDを"Id"に表示する をチェック
* 編集 -> 設定 -> 全般 -> 結論の出ない指摘もチェックする をチェック

### プロジェクトの設定

#### 任意のエラーを除外

たとえばデフォルトでは、下記のような変数のスコープを縮小できる警告が有効になっています。
>「The scope of the variable "hoge" can be reduced」

これを抑制するには、ファイル -> プロジェクトの編集 -> 警告オプション -> 指摘の抑制 を追加します。
エラーIDにvariableScope、ファイル名に * を指定すると良いです。
どのメッセージがどのIDを意味するのかを確認するには、Cppcheckの設定でエラーIDを表示するオプションを有効にします。

こんな感じで追加します。

|Id  | File | Symbol |
| -- | --   | --     |
|unusedFunction |fileName=*main.c |symbolName=NMI_Handler|
|variableScope |fileName=*||
|constParameter |fileName=*||

## Addon追加

まず、アドオンのpyファイルを入手します。
それとアドオンはpythonのため、Windows用のPythonが必要です。

https://www.python.org/downloads/release/python-2714/

Windows x86-64 MSI installerあたりをダウンロードしてインストールします。
編集 -> 設定 -> アドオン -> Pythonインタプリタの場所にC:/Python27/python.exeを指定
C:\Program Files\Cppcheck\addonsに、アドオンのpyファイルを追加します。
cert.pyあたりを追加すれば、プロジェクトファイルの設定で、アドオンとツール画面のグレーアウトが有効になります。


## Windowsでコマンドラインで使いたい場合

C:\Program Files\Cppcheckにあるcppcheck.exeを実行します。

> $ cppcheck --doc
> $ cppcheck --errorlist


## 最後に

結構細かいところまで検出してくれるので、バグ修正に有効。
前までのバージョン、少なくとも2.7までは、グローバルな変数の未使用検出ができなかったのだが、
2.10では出来るようになっていた。
さらに細かい指摘まで検出するbughuntingという機能があったのだが、
これがクラッシュの連続で有用なのに使うことが出来なかったのだが、全くなくなってしまっている。
これは残念なことなので、ますますの進化に期待したい。
React + Typescript + VSCodeな環境が重くなる問題の解決

# 環境

項目|値
---|---
OS|MacOSX Mojave
VSCode|1.38.1

# 内容

タイトルの環境で大規模なReactプロジェクトの開発をしている際、なんだか開発環境がとても重くなってしまいました。
アクティビティモニタでCPU使用率を確認すると、VS CodeのCode Helperの使用率が爆発がりしていました。
VS CodeのビルトインextensionのTypescriptによって、型チェック等が走るのですが、どうやらそれが重いらしい。

# 解決法

`settings.json`を開いて、VS Codeの監視対象を適切に除外してやれば良いことがわかりました。

例えば、私の場合は以下のファイルが監視する必要の無いファイルでしたので、これらを監視対象から除外することで、かなりの速度改善ができました。

- `relay-compiler`の成果物(`__generated__`ディレクトリ)
- 手元でのリリースビルドの成果物(`build`ディレクトリ)
- テスト結果(`coverage`ディレクトリ)

`.vscode/settings.json`を編集することで監視対象から特定のディレクトリやファイルを除外できます。

```.vscode/settings.json
{
  ...
  "files.watcherExclude": {
    "**/__generated__/**": true,
    "**/build/**": true,
    "**/coverage/**": true
  },
}
```

ちなみに、以下のファイルはデフォルトで除外されています。

- `**/.git/objects/**`
- `**/.git/subtree-cache/**`
- `**/node_modules/**`

## ~~追記: eslintの自動整形が不安定な場合の対処~~

~~eslintによる自動コード整形はプロジェクトが大きくなると、処理に時間がかかり、セーブしても整形されない場合があります。
その際にゾンビプロセスが残ってしまうためか、一切コード整形されなくなってしまう場合もあります。~~

~~これを回避するには、以下のようにタイムアウトを設定してみてください。~~

```json
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true
  },
  "editor.codeActionsOnSaveTimeout": 1500,
  "editor.formatOnSave": false,
  ...
```

~~根本的な解決策ではありませんが、タイムアウトを設定しておけば、たとえ自動整形が走らない場合があっても、古いプロセスが残り続けることはありませんので、不安定さは軽減されると思います。~~

~~最適なタイムアウトの値に関しては、https://github.com/microsoft/vscode-eslint/issues/833 で議論されている通り、プロジェクトの大きさなどによって変わるようです。~~

~~いくつかの設定を試してみて、自分のプロジェクトとマシンにあった値を探してみてください。~~

## 再追記: eslintの自動整形が不安定な問題は解決されました。

VS Code側で根本的に対処されたため(https://github.com/microsoft/vscode/issues/89745)、タイムアウトの設定は必要なくなりました。

```json
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true
  },
  "editor.formatOnSave": false,
  ...
```
ワードプレスの記事一覧で記事の文字数を表示させるプラグイン

ワードプレスの記事一覧で記事の文字数を表示させるプラグイン

![show-posts-text-counts-on-list.zip.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504098/13ffabc9-f1bd-b814-afc0-0ba5b1a674f7.jpeg)
（訳読ノート）CF netCDF Convention の管理体制（governance）について

2019-09-19/20 の WMO Workshop on NetCDF CF conventions for WMO data exchange https://wiswiki.wmo.int/tiki-index.php?page=CF-workshop において、CF Governance Panel の Jonathan Gregory によって発表された資料 http://wiswiki.wmo.int/tiki-download_file.php?fileId=5746 の概要です。

とりあえず骨格だけ。誰か応援してくれたらもうちょっと書く優先度が上がるかもしれません。

# p2. CFの制定経緯と応用分野
# p3. CFの目的と原則
# p4. CFの構成要素
# p5. CFのコミュニティと議論
# p6. CFの管理体制
# p7. CF管理パネルとリソース
# p8. 変更の手続き
# p9. 変更に係るトラブル
# p10. WMOへの問いかけ
# p12. CFデータモデル
David Hassel の別のプレゼン参照といっている。 http://wiswiki.wmo.int/tiki-download_file.php?fileId=5710 のワードファイルは論文を引用しているだけで、PPT的なものがあったのだろうがよくわからない。
eng-practices (The CL author’s guide to getting through code review) 読む

[Google's Engineering Practices documentation](https://google.github.io/eng-practices/) は読んでいてためになったので気になった部分をメモ。

## Writing good CL descriptions
- 何故変えたのかと何を変えたのか

### First Line
- what & 命令文 (Delete xxx instead of Deleting xxx)

### Body is Informative
- why
- 欠点があるなら書く
- 背景 (bug number, benchmark, design doc, etc.)

### Bad CL Descriptions
:no_entry_sign: 

### Good CL Descriptions
:no_entry_sign: 

### Review the description before submitting the CL
:no_entry_sign: 

## Small CLs
### Why Write Small CLs?
- レビュースピードが早まる
- 細かく見れる
- バグになりにくい
- reject された時に無駄が少ない
- マージしやすい
- 巨大な変更よりはデザインしやすい（いまいちわかってない）
- 自己完結してる変更にしとけばそれがレビュー中でも別の変更をコーディングできるのでブロックされにくい
- ロールバックしやすい

### What is Small?
- 自己完結してる一つの変更
  - just one thing
  - 将来的な追加を考えずに CL だけ見れば分かる
  - 入れても動かせる
  - 理解するのが難しいほどに小さすぎない （API 追加するなら、それを使うものも)
- （決まりはないけど）100 行なら大抵は妥当、1 ファイル 200 行は分かるけど 50 ファイル 200 行はでかい
- 自分が書いたものに関しては背景など精通してるため、自分が思っている許容可能なサイズは実際の reviwer が許容可能なサイズよりも大きくなりがち （試しに小さく送っても文句言われることは稀だろう）

### When are Large CLs Okay?
- ファイル削除
- 機械的な処理

### Separate Out Refactorings
- リファクタリングを機能追加や bugfix に混ぜない

### Keep related test code in the same CL
- テストコードを変更と分けない

### Don’t Break the Build
- 動き続ける CL にする

### Can’t Make it Small Enough
- すごい稀なはず
- リファクタリングを先にすることを考える
- 極めて稀なはずだがある場合は出す方も見る方も気合い

## How to handle reviewer comments
### Don’t Take it Personally
- コードに対する批評を個人を攻撃していると捉えて怒らない

### Fix the Code
- コードが理解できないと言われたらコードを整理してコメントを入れる (たぶん reviwer が分からなかったら将来見る人もわからない、その時に review tool のコメントは見れない）

### Think for Yourself
:no_entry_sign: 

### Resolving Conflicts
:no_entry_sign:
JAVA（初めの一歩：GitBush編)

初学者だった僕にとってはかなりきっちりしてる言語だなーと感じてました。
つまずきばかりでしたが慣れてくれば理解度は深まったように思えます。

その前にコードやファイルのやり取りは[discord](https://discordapp.com/)がいいみたいでよく使用してます。

多人数で開発又は教育開発をする場合は便利だと思われます。
Slackでもいい気もしてます。

#まず初めに場所を確認する

```
pwd /*現在の場所表示を確認する*/
```
#文字化け防止に

```
vi ~/.bashrc 
```

#これを貼り付けとく

```
　　alias javac='javac -J-Dfile.encoding=UTF-8'
  　alias java='java -Duser.language=ja -Dfile.encoding=UTF-8'
  　sc(){
  　start chrome $1
   }

```
#抜けてセーブ

```

　ctrl + c から　:wq　
```

#任意の場所に移動する

```
cd フォルダ名　//cd test/test2と時短移動も可能
```

#フォルダを作成する

```
mkdir フォルダ名
```

#移動したフォルダにvimでファイルを作り開く

```
vi フォルダ名.java
```

#記述してみる

```java
public class Main{
  public static main(String[] arrgs){
     System.out.println("Hello World!");
  } 
}
```

#セーブ

```
ctrl + c でインサートモードを抜けて:wq
```

#コンパイル

```
$ javac Main.java
```

#コンパイル

```
$ java Main
Hello World!　//と出力されればok
```

以上かなっと
PostgreSQLを、WindowsPCにインストールして外部接続する方法


WindowsServer2002 と、Windows10 に PostgreSQL11.5 をそれぞれインストールしました。
忘れないために、どうやったか設定手順を残しておこうと思います。
これで、何台でもスムーズにインストールできるようになりそうです。
覚え書きレベルです。
<h2>

PostgreSQL はインストール直後、他端末からの接続を受け付けない仕様になっています。
そのため、他端末からの接続を許可するには、設定をしてやらなければなりません。


0. PostgreSQL内での設定
  C:\Program Files\PostgreSQL\11\data\pg_hba.conf 内	
(11のところはVersion11.5を入れたから。ここはバージョンによって変わります）

```pg_hba.conf
# TYPE  DATABASE        USER            ADDRESS                 METHOD
# IPv4 local connections:
host    all             all             127.0.0.1/32	md5
```

の直後に
```host    all             all             192.168.0.0/24	md5
```

を追加。これで、社内ネットワーク 192.168.0.1～192.168.0.254 までのIPアドレスのホスト(クライアント)が許可されます。


1. pg_hba.confを書き換えたら、必ずサービスを再起動すること。
 コントロール パネル\すべてのコントロール パネル項目\管理ツールの中に、「サービス」があるはず。Postgresと書いてあるサービスがそれです。


2. Windows ファイアウォールでも通信を許可する必要があります。
[ココから転記]
https://www.projectgroup.info/documents/PostgreSQL/POS_000007.html

  1. スタートメニューから[管理ツール] － [セキュリティが強化された Windows ファイアウオール] を起動
  2. 左ペインで「受信の規則」を選択し、右ペインで「新しい規則」をクリック
  3. 【規則の種類】「ポート」を選択して「次へ」をクリック
  4. 【プロトコルおよびポート】「TCP」、「特定のローカルポート」を選択し、ポート番号に「5432」を入力して「次へ」をクリック
  5. 【操作】「接続を許可する」を選択して「次へ」をクリックします。
  6. 【プロファイル】環境に応じて適用対象にチェックをして「次へ」をクリック
  7. 【名前】わかりやすい名前を設定して、「完了」をクリック。今回は「PostgreSQL」と設定。
  8. 一覧に先ほど「名前」で登録した名称の行ができていればOK


3. A5:SQL Mk-2 2.14.3　を起動。
　　サーバー名：（postgreSQLを置いたPC名）
　　データベース名：	postgres
　　ユーザーID：	postgres
　　パスワード：（設定したパスワード）
　で、デフォルトで作られているDBに接続できていれば、外部通信ができたことになります。


4. A5:SQL Mk-2 からはデータベースの箱が作れないので、サーバー内のプロンプトで、あらかじめ作っておかなければなりません。

  1. 起動してるかどうか確認　　psql -V 　でバージョン情報が出るかどうか。
  2. 起動してたらログイン	psql -U postgres -d postgres
	パスワードを打って、 postgres=# と出たら接続成功
  3. create database (名前) でデータベースが作成される(なぜか小文字でないと通りませんでした)。
  4. \l	で作成済みのデータベース一覧を表示
  5. \q	で切断 
  6. A5:SQL Mk-2 2.14.3　を起動。<br>
　サーバー名：（postgreSQLを置いたPC名）<br>
　データベース名：	(さっき作ったデータベース名)<br>
　ユーザーID：	postgres<br>
　パスワード：（設定したパスワード）<br>
で、接続できたら、完成。



5. ユーザを追加したいときは、
create role (ユーザー名) with login password 'password' ;
※パスワードを囲うシングルクォーテーションを忘れるとエラーになるので注意
[ココが詳しい]
https://eng-entrance.com/postgresql-role
【Qiita】プロフィール画像が勝手に設定されているのはなぜ？

新規会員登録したら、いつもブログで使っているプロフィール画像がそのまま設定されていた。


<b>Gravatarが原因のようだ</b>
会社で登録してあったGravatarが使われてしまったようだ。

にしても自動でGravatarに自動ログインするとは、すごい

[Gravatar公式サイト](https://ja.gravatar.com/)
【AWS】ECS によるコンテナ配布(Fargate版)

#概要
ECS によるコンテナ配布(Fargate版)を行った際のメモです。
2019/09/27時点の物です。

#手順

- マネジメントコンソールにおいて、ECSのリンクをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235774/2d0a8970-5294-824b-3a5b-fabf835e56b8.png)

- [今すぐ始める]をクリック
	- [今すぐ始める]からECSの構築を始めた場合、Fargateを使用した構築となります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235774/dc0166af-79e3-7dad-3aa3-beb1c1b802f2.png)

- コンテナイメージを選択する画面が開かれました。今回は、[sample-app]を選択してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235774/ca670423-d3c1-8d74-0ddd-f782ffab5062.png)

- ちなみに、右上の編集ボタンでコンテナイメージの詳細を変更できますが、デフォルトのままとします。
	- 下の入力画面が表示されます。

	![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235774/676117fe-33f5-d5e0-e3c0-290a6150260c.png)

- [コンテナの定義]の下に[タスク定義]の設定画面が有るので見てみます。
- タスク定義は、上部の[コンテナの定義]に紐づいた内容(タスクメモリ、タスク CPU)などが自動設定されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235774/9911a39d-bbee-5afc-cca0-6bf15ae8cf91.png)

- [タスク定義]も、右側にある[編集]ボタンクリックで詳細を変更できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235774/f412fff9-6b35-67a8-c782-dec652b306ea.png)

- [コンテナの定義]と[タスク定義]を設定、確認を終えたら、[次]ボタンをクリックします。
- [サービスを定義]画面が表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235774/25080424-6805-87b3-80d4-a008cbe0d35b.png)
- この画面も、同様に[編集]ボタンクリックで、サービスの設定を編集できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235774/0ee85ff1-252d-17ff-310b-38d9f6bba363.png)

- 今回は、何も変更せず、編集画面を閉じてから[次]ボタンをクリックします。
- [クラスタの設定]画面が表示されました。クラスター名だけ任意の名前に変更してから、[次]ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235774/6bb09091-79ce-61b3-b938-54969fd3ed2a.png)

- サマリーの画面が表示されましたので、[作成]ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235774/d267aa56-cd90-0856-586e-616514e1c76c.png)

- 2～3分ほどで、作成が完了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235774/c6fb092c-ffea-84c1-9b0e-c827ffe0d4da.png)

- [サービスの表示]ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235774/4a173bd9-5c9c-e55e-6da9-6e7b2a9f2a23.png)

- 無事にサービスも実行出来ているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235774/e9ead6db-24e6-3aa2-b63a-9452ee31b901.png)

- [タスク]タブを開いて、タスク一覧からタスクを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235774/b8f92496-9750-8335-f038-11e18e27871d.png)


- Public IPアドレスを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235774/6b3ce9a5-165f-ed07-6310-6d61f76ec3af.png)

- Public IPアドレスにアクセスすると、以下の画面が表示されます。
- 無事に、コンテナイメージが配布され、[sample-app]のでも画面が表示されていることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235774/0dca31ed-e8b6-18dc-b6ec-67e3274720b9.png)

- ログも確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235774/a0dcf238-bdfb-0c3d-534f-dde85fccc516.png)
Windows Terminal で WSL を開くときに開始されるディレクトリを $HOME にする

## やりたかったこと
Windows Terminal で、 WSL を開くと C:\Windows\system32 (/mnt/c/WINDOWS/System32) が開始ディレクトリになっている。これを $HOME に変更したい。

## やったこと
wsl.exe のパラメーターで指定した。

`"commandline" : "wsl.exe ~ -d Ubuntu-18.04",`

## 至るまでの過程
profile.json にて 各種 profile の項目がある。

```json

{
    "globals" : 
    {
    },
    "profile" :
    [
        {
        "commandline" : "powershell.exe",
        "startingDirectory" : "%USERPROFILE%"
        },
        {
        "commandline" : "cmd.exe",
        "startingDirectory" : "%USERPROFILE%"
        },
        {
        "commandline" : "wsl.exe -d Ubuntu-18.04"
        }
    ]
}
```

`powershell.exe` と `cmd.exe` の profile には `startingDirectory` と、指定する項目がある。しかし、これは Windows 側のフォルダ指定なので `wsl.exe` の profile で `startingDirectory` を指定しても、 Linux 側のディレクトリには移動できない。

`wsl.exe` は linux 側の実行コマンドなので、そこで指定することにした。

## ほかの方法
`commandline` の項目を `wsl.exe` から、 `ubuntu1804.exe` とかの、ディストリビューションのコマンドにする。 なお、 `bash.exe` はダメでした。

## ダメだった方法
`startingDirectory` に `//WSL$/[distributionName][directory]` を入れるという方法があるみたいだが、私にはできなかった。

## 参考URL
[startingDirectory setting issue for wsl profile #592](https://github.com/microsoft/terminal/issues/592)

## 検索キーワード
以下のキーワードを Google Search で探した。

`windows terminal wsl start default directory`

## 感想
最近の Microsoft は GitHub で活動しているので、GitHub Issues で探した方が、早く見つかる気がする。
Windows Terminal とか Windows Subsystem for Linux とか Visual Studio Code とか。
VRChat APIで二段階認証する


VRChat APIを利用する際にAPI経由でVRChatにログインしてトークンを取得することが多いのですが、二段階認証を利用している場合については記事が無かったのでメモします

ざっくり概要を書くと、
まず通常ログインでトークンを取得。ただし二段階認証が有効になっている場合、トークンは使えない
トークン取得後に二段階認証する（Google Authenticatorから取得した番号をPOSTする）とトークンが有効化される
といった流れになります。

##注意
この記事で使用しているVRChat APIの仕様は[非公式なドキュメント](https://vrchatapi.github.io/)に基づくものです。
公式からは[悪意のないAPI利用はいいけど他人にPW入力させたらダメ](https://twitter.com/onion_vrchat/status/1020094529297190912)と言及されていますので、その点ご注意ください。

## 1. VRChatから認証トークンを取得
まずはVRChatからトークンを取得します。手順は以下の通りです。
1. https://api.vrchat.cloud/api/1/config をGETしてapiKeyを取得
2. https://api.vrchat.cloud/api/1/auth/user をGETしてauthTokenを取得 (VRChatのユーザ名・パスワードでBasic認証を行う)
※Basic認証時、トークンはCookieに返ってくるので注意！

rubyで書くとこんな感じです。GETするあたりは最低限必要な分だけ書いてます。

```rb:VRChatBasicAuth
def login_vrc
    username = "VRCのユーザー名"
    password = "VRCのパスワード"
    api_base = "https://api.vrchat.cloud/api/1"
    
    # 後々二段階認証で使うのでapiKeyとauthTokenはセッションに保管しています
    # apiKey取得
    apikey = get_apiKey(api_base)
    session[:apiKey] = apiKey
    
    # authToken取得
    session[:authToken] = get_authToken(api_base, apikey, username, password)
end

def get_apikey(api_base)
    endpoint = "/config"
    url = api_base + endpoint
    uri = URI.parse(url)
    req = Net::HTTP::Get.new(uri)
    Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https'){ |http| 
      response = http.request(req)
      @json = response.body
    }
    apikey_json = JSON.parse(@json)
    return apikey_json["clientApiKey"]
end

def get_authToken(api_base, apikey, username, password)
    endpoint = "/auth/user"
    url = api_base + endpoint
    uri = URI.parse(url)
    uri.query = URI.encode_www_form(apiKey: apikey)
    req = Net::HTTP::Get.new(uri)
    req.basic_auth(username, password)
    Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') { |http| 
      response = http.request(req)
      @cookie = response.get_fields('Set-Cookie')
    }

    #取得したCookieからauthTokenを抽出する（かなり強引なので正直直したい）
    cookie = @cookie.select { |x|
      x.include?("auth")
    }
    unless cookie[0].nil?
      return cookie[0]
    end
end

```

## 2. トークンを有効化
先ほど取得したapiKeyとauthToken、それとGoogle Authenticatorから取得した番号をhttps://api.vrchat.cloud/api/1/auth/twofactorauth/totp/verify にPOSTします。

認証が成功するとverified = tureが返ってきて、authTokenが各種APIで利用できるようになります。

```rb:VRChat2FA
def twofa_vrc
    num = "Google Authenticatorから取得した番号"
    api_base = "https://api.vrchat.cloud/api/1"
    endpoint = "/auth/twofactorauth/totp/verify"
    url = api_base + endpoint
    uri = URI.parse(url)
    uri.query = URI.encode_www_form(apiKey: session[:apikey])
    req = Net::HTTP::Post.new(uri)
    req["Cookie"] = session[:auth_token]
    req.set_form_data('code' => num)
    Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') { |http| 
      response = http.request(req)
      @json = response.body
    }

    #認証成功するとtwofa_result = trueになります
    twofa_result = JSON.parse(@json)["verified"]
end
```
##参考
 - [VRChatのオンラインなフレンドをPythonで取得する](https://qiita.com/y23586/items/484c8465b7a966d237c0)
 - [VRChat API Documentation](https://github.com/VRChatAPI/vrchatapi.github.io)
rails webアプリケーション管理者権限でユーザーを削除する(delete)方法,deviseなしバージョン（初心者）

#(delete)ユーザー削除機能を実装

ネット情報ではログイン機能 gem deviseをを前提としたのが多く当方初心者な為、まぁまぁ時間を食った。
後々の私の様な初心者の為にRailsチュートリアルを中心に改めて自分なりにまとめて見た。
 

 

#⒈管理者権限用カラムを作成
一般ユーザーと分ける為に管理者専用カラム作成。

`$ rails generate migration add_admin_to_users admin:boolean`

```ruby:migrate
class AddAdminToUsers < ActiveRecord::Migration[5.0]
  def change
    add_column :users, :admin, :boolean, default: false
  end
end
```




`$ rails db:migrate`

##⒉管理者権限を１人に与える
 
admin を true に。

 


```ruby:db/seeds.rb
User.create!(name: "Exaple User",
             email: "example@railstutorial.org",
             password:                 "foobar",
             password_confirmation:    "foobar",
             admin: true )
```



`  $ rails db:migrate:reset`

` $ rails db:seed`

 

##③ログインユーザーが管理者ならパーシャルの横にdelete ボタンを表示


この!current_user?(user)は自分自身の２つ目のアカウントでは管理者権限は無効に。

```ruby:db/app/views/users/_user.html.erb

<div>
  <%= gravatar_for user, size: 50 %>
  <%= link_to user.name, user %>
  <% if current_user.admin? && !current_user?(user) %>
    | <% link_to "delete" user, method: :delete,
                          data: {confirm: "You sure?"} %>
  <% end %>     
</div>
```
 
current_user? が使えるように定義

```ruby:db/sessions/helper.rb

def current_user?(user)
  user == current_user
end
```
⒈ログインが前提なので、require_user_logged_inにdestroyを追加。
⒉管理者だけが削除できるように、admin_user, only: :destroyをbefore_actionに新たに作成。
⒊動作用destroyアクションを追加

 
```ruby:db/user_controller.rb
before_action :require_user_logged_in, only: [:index, :show, :edit, :update, :destroy, :followings, :followers]
before_action :admin_user, only: :destroy　＃アクション前に事前確認用。


def destroy
  User.find(params[:id]).destroy
  flash[:success] = "ユーザー削除完了"
  redirect_to users_path
end

private

#管理者か確認。
def admin_user
  redirect_to(root_path) unless current_user.admin?
end
```

あとは実際に動作確認するだけ。

もしエラーが出たら、こちらも参照。

ユーザー削除するってことは、関連するデータの処理もどうするのか？
https://qiita.com/shutyan/items/05977055b2ce32c2e322
PythonでAmazon S3からバケット名とファイル名（オブジェクト名）を取得する。

# バケット名を取得する
```python
import boto3
s3 = boto3.client('s3')
# jsonになっている
response = s3.list_buckets()
for bucket in response['Buckets']:
    print(bucket['Name'])
```
# ファイル名(オブジェクト名)を取得する

```python
import boto3
s3 = boto3.client('s3')

response = s3.list_objects_v2(Bucket="バケット名を書く")
for object in response['Contents']: 
    print(object['Key'])
```

# ファイルの内容を取得する
```python
import boto3
s3 = boto3.client('s3')

body = s3.get_object(Bucket="バケット名を書く",Key="Objectの階層を書く")['Body'].read()
# バケット名がfruitsでバケットの直下にapple.jsonを置いている場合
# body = s3.get_object(Bucket="fruits",Key="apple.json")['Body'].read()
print(body.decode('utf-8'))
```