OmniAICreator/Qiita-1.07M huggingface dataset:
C# - ListViewのサンプル　コードべた書き（Visual Studio不使用）

目次： [C# - Windows Formsでよく使うコントロールたち （Visual Studioなし環境向け） - Qiita](https://qiita.com/kob58im/items/a6cff48ce6bfbcf41c39)

# 画面キャプチャ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/8a818542-53ec-3c04-022e-fcba99b43ea9.png)


# テンプレ

```csharp

using System;
using System.Drawing;
using System.Windows.Forms;

class ListViewSample : Form
{
    ListView lsv;

    ListViewSample()
    {
        ClientSize = new Size(500, 300);
        
        Controls.Add(lsv = new ListView() {
            Dock = DockStyle.Fill,
            View = View.Details,
            FullRowSelect = true,
            HideSelection = false,
            MultiSelect = false,
            GridLines = true,
        });

        // 列ヘッダを登録
        lsv.Columns.Add("angle", 70, HorizontalAlignment.Left);
        lsv.Columns.Add("cos(angle)", 70, HorizontalAlignment.Left);
        lsv.Columns.Add("sin(angle)", 70, HorizontalAlignment.Left);

        lsv.SelectedIndexChanged += Lsv_SelectedItemChanged;

        AddItemsToTheListView();
    }

    void Lsv_SelectedItemChanged(object sender, EventArgs e)
    {
        if ( lsv.SelectedItems.Count == 1 ) { // 無選択(0個)になる場合がありえるため、チェックしている。
            // Form のタイトルを変更
            Text = "angle="+lsv.SelectedItems[0].SubItems[0].Text + ", cos(angle)=" + lsv.SelectedItems[0].SubItems[1].Text;
        }
        else {
            Text = "No item is selected.";
        }
    }

    void AddItemsToTheListView()
    {
        lsv.Items.Clear(); // ※Itemsを忘れると列ヘッダごと消えます

        lsv.BeginUpdate();
        
        for ( int i=0; i<100; i++ ) {
            double degree = i*7.5;
            double x = degree*Math.PI/180.0;
            double cosX = Math.Cos(x);
            double sinX = Math.Sin(x);
            lsv.Items.Add(new ListViewItem(new string[]{degree.ToString("F1"),cosX.ToString("F3"),sinX.ToString("F3")}));
        }

        lsv.EndUpdate();
    }
    

    [STAThread]
    static void Main()
    {
        Application.Run(new ListViewSample());
    }
}
```

# 参考サイト

 - [ListViewコントロールへ項目を追加するには？：.NET TIPS - ＠IT](https://www.atmarkit.co.jp/ait/articles/0502/04/news121.html)
 - [コントロールの項目を高速に追加／変更／削除するには？［C#、VB］ - ＠IT](https://www.atmarkit.co.jp/fdotnet/dotnettips/648beginupdate/beginupdate.html)
 - [ListView Class (System.Windows.Forms) | Microsoft Docs](https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.listview?view=netframework-4.8)
 - [Double.ToString Method (System) | Microsoft Docs](https://docs.microsoft.com/en-us/dotnet/api/system.double.tostring?view=netcore-3.1#System_Double_ToString_System_String_)
Windows10, miniconda, VScode環境で pipでSSLエラーが出た時の対処

#背景
新Win10 PCにMiniconda(ver 4.9.0), VScode(ver 1.50.1)を入れて
pythonのコーディング環境を構築しようとしたら、以下のエラーが出てpipが通らなかったため、四苦八苦して解決させたのでその備忘録。
*正しいやり方かどうかわかりません。

#状態
VScodeでvenvを使って仮想環境構築後、pip install をしようとするとエラーで通らない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304339/c5d31eef-3abc-fe43-a8c3-564e0dc758ef.png)

#解決
1. OpenSSLインストール
Win10にOpenSSLをインストール。図のWin32 OpenSSL v1.1.1h Light
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304339/3c67856f-afee-34d5-6e80-946306b42ff8.png)

2. OpenSSLのpathを通す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304339/829c5214-7ddb-9028-a103-eff21dcbf396.png)

3. OpenSSLの中身を入れ替える
インストール先の`C:\Program Files (x86)\OpenSSL-Win32\bin`の中身を、
minicondaインストール先フォルダのopensslに入れ替える<br>
例）
`C:\Users\[ユーザー名]\miniconda3\pkgs\openssl-1.1.1g-he774522_1\Library\bin`の中身を上記OpenSSLインストール先へコピー

4. pipが通るか確認

書いてる途中、`\miniconda3\pkgs\openssl-1.1.1g-he774522_1\Library\bin`を単にpath通したら解決するんじゃ・・・？と思ってしまった。

以上です。
gatsby（react）でMaterial-UIのthemeにcustom colorを足す（色を追加する）

reactのMaterial-UIのthemeにカラーを追加する方法についてのメモです。

#`gatsby-browser.js`と`gatsby-ssr.js`
`gatsby-browser.js`と`gatsby-ssr.js`に

```react

import { CssBaseline } from '@material-ui/core'
import React from 'react'
import { RecoilRoot } from 'recoil'

//ここから3つをimport
//{ ThemeProvider }と{ MuiThemeProvider }が
//いい感じにMaterial UIでもthemeをいい感じにカスタムできるようにしてくれる
import { ThemeProvider } from 'styled-components'
import { MuiThemeProvider } from '@material-ui/core/styles'
import { theme } from './src/utility/theme'

export const wrapRootElement = ({ element }) => {
  return (
    <RecoilRoot>
      <MuiThemeProvider theme={theme}>
        <ThemeProvider theme={theme}>
          <CssBaseline />
          {element}
        </ThemeProvider>
      </MuiThemeProvider>
    </RecoilRoot>
  )
}
```

これでthemeに設定した色が使えるようになります。

#theme.js
下記のような形で、カスタムカラーを追加することが可能です。
ここでは`grayfill: '#fff000'`を追加しました。

```react
import { createMuiTheme } from '@material-ui/core/styles'

export const theme = createMuiTheme({
  palette: {
    primary: {
      main: '#EF2D29',
    },
    secondary: {
      main: '#00A7C1',
    },
    grayfill: '#fff000',
    background: {
      default: '#fff',
    },
  },
})
```

#利用
例えば、
Material Iconを `grayfill`で塗りたい時

```react
//色々必要なやつはimport（省略）
//使いたいアイコンをインポート
import PersonIcon from '@material-ui/icons/Person'

//propsでthemeに追加したカラーを渡す
const PersonGrayIcon = styled(PersonIcon)`
  color: ${props => props.theme.palette.grayfill};
`

const SearchPage = () => {
  return (
   <PersonGrayIcon />
  )
}

export default SearchPage
```
[Docker / mysql] Can't connect to local MySQL server through socket

Docker で mysql server 立てようとしたら `Can't connect to local MySQL server through socket` って言われました。

なんだかわからないまま、解決するのに結構時間かかってしまったので、残しておきます。

# 結論

`docker run` では、末尾に `[COMMAND]` という option を指定できるが、mysql サーバ (container) を立てる時には指定してはいけない、ということです。

```console
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
```

[Docker run reference🔗 より] (https://docs.docker.com/engine/reference/run/#docker-run-reference)


* OK な例

```sh
docker run -d --name mydb --rm -p 3306:3306 mysql:5.7

# してから
docker exec -it /bin/bash  # host
mysql -u root -p           # container
```

* **ダメな例**

```sh
docker run -d --name mydb --rm -p 3306:3306 mysql:5.7 /bin/bash
													  ^^^^^^^^^ これをしちゃダメ!!
```


### ﾁｮｯﾄ 詳細 (未完成)

まず、`docker run` するとき、`[COMMAND]` の部分は optional です。(つまり、あってもなくても良い)

次に、docker image の話を少しします。

docker image は `Dockerfile` を作って `docker build` を行うことにより作ることができます。
そしてこの build された image から container を起動できる、という流れになっています。

```console:イメージ図
[Dockerfile] === docker build ==> [image] === docker run ===> [container]
```

通常、起動直後に実行されるコマンドは、上記のような `Dockerfile` の最後あたりに `CMD ["command"]` という形で指定されます

> This command is optional because the person who created the IMAGE may have already provided a default COMMAND using the Dockerfile CMD instruction.


これはもちろん、 image の作者が、意図的に、CMD を用いて、実行するコマンドを指定している可能性があります。つまり、起動した container がきちんとサービスとしての振る舞いを行うために `CMD ["command"]` を書いている可能性がある、ということです。


しかし、docker run の時に、あなたが指定した `[COMMAND] option` は、この Dockerfile で**作者が指定した CMD をオーバーライドして**、新たなコマンドの実行を指定してしまうらしいです。

> As the operator (the person running a container from the image), you can override that CMD instruction just by specifying a new COMMAND.


[CMD (default command or options) 🔗](https://docs.docker.com/engine/reference/run/#cmd-default-command-or-options)



なので、mysql container が通常起動された時に実行される (はず) の、[このコマンド](https://github.com/docker-library/mysql/blob/1a25a09159a3d7b6b5b8ad0e6c7eb53504b3aab5/5.7/Dockerfile#L90)が実行されないため、mysql server に接続できない、というのが原因であると考えています。


---

先のリンクにある、CMD 部分をを見て、こう思った方がいるかもしれません。


```mysql/5.7/Dockerfile
CMD ["mysqld"]
```

「じゃあ、docker container が立ち上がった時に `mysqld` コマンドを実行すればいいんじゃね?」

```sh:つまりこうするわけです
# ダメな例
(host) $ docker run -d --name mydb --rm -p 3306:3306 mysql:5.7 /bin/bash

(container) # mysqld
```

実際私もそう思いました。試しました。ダメでした 😢

「タイムスタンプがどうのこうの」と言われてしまい、うまくいきません...

( 調査中です... ご存知の方、いらっしゃいましたらご教示ください... )
プログラミング技術を使って、自分ができることは

### 技術を何につかうか考えると、コード演習だけでは見えていませんでした。
現時点で、わかったことが２つあります。
１、ディクショナリ型のデータを使って、情報を管理する。
２、jsonは、Webアプリケーションからデータ取得に使われる。
３、Pythonで、jsonをインポートし、従業員情報の管理をする。例）idや名前など

```python
import json
j = {
    "employee":
        [
            {"id": 111,"name": "John"},
            {"id": 222,"name": "Elle"}
        ]
}

print(j)
a = json.dumps(j)
print(json.dumps(a))
with open('test.json','w') as f:
    json.dump(j,f)

with open('test.json','r') as f:
    print(json.load(f))　#ファイル内で、出力したファイルの読み書きを行う。

```
エイジャックスを使ったページの要素の取得です。

### 該当するソースコード
```javascript
 $.ajax({
    url: "./information.json",
    dataType: "json"
  })
  .done(function(json){

    var idx = 0; 
    var $info = $(".info__list .item");
    $info.find("time").text(json[idx].date);
    $info.find("p").text(json[idx].value);

    setInterval(function(){
      if(idx === json.length -1){
        idx = 0;
      } else {
        idx = idx + 1;
      }
      $info.css("opacity",0);

      setTimeout(function(){
        $info.find("time").text(json[idx].date);
        $info.find("p").text(json[idx].value);
        $info.css("opacity",1);
      },500);

    },5000)

  });

```
###最後にデータの取得について
Webページの情報の取得をrequestsというサードパーティーできるようです。
JavaScriptの情報の取得コードについても調べてみます。
クラウドの種類に関する簡易図

#クラウドの種類について
クラウドの種類について図解の方が個人的に分かりやすいと思い、個人用の簡易図を作成。
詳細までは未学習の為、間違い等はあるかもしれないが、個人の備忘録として記す

![クラウドの種類.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790462/6105c4c2-8f8a-cf61-7db7-fda684c54e21.jpeg)

。
Windows10のビット数の確認方法

## はじめに
ソフトウェアをインストールする際に、
32bit版と64bit版が存在し、
「あれ？自分はどっちだっけ？てかどうやって確認するの？？」
と思ったことがある方もいらっしゃると思います。
そこで、個人的に最も手っ取り早く確認する方法を書き残しておきます。

## Windowsのビット数を確認する
①画面左下にある検索バーに　` msinfo32 ` と入力し、Enterを押します。
![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/824754/73309efe-2ec2-8e60-ba8c-a2f32f5adc8e.png)

②システム情報アプリが立ち上がりますので、`システムの種類`　の行を確認します。
`x64`となっていれば`64bit版`　、`x86`となっていれば`32bit版`です。
![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/824754/417c603c-2732-3768-ac4e-159f483c0d70.png)

## おわりに
以上で簡単にbit数の確認が可能です。
bit数以外にもWindowsのバージョンや、CPUの型番なども確認可能で便利です。
よく使うLinuxコマンドの一覧

# よく使うコマンド

メモ書き

|用途  |コマンド  |例  |
|---|---|---|
|カレントディレクトリ取得  |pwd  |  |
|ファイル一覧取得  |ls  |  |
|現在日時取得  |date  |  |
|移動  |cd  |cd Desktop  |
|ファイル作成  |touch  |touch test.txt  |
|ディレクトリ作成  |mkdir  |mkdir test  |
|ファイル削除  |rm  |rm test.txt  |
|ディレクトリ削除  |rm -rf |rm -rf test  |
|ファイルの中身確認  |cat  |cat test.txt  |
|ファイルの中身確認  |tail  |tail test.txt  |
|ファイルの中に入る  |vi  |vi test.txt  |
|ファイル移動  |mv  |mv test.txt directory/test.txt  |
|ファイルコピー  |cp  |cp test.txt test.txt.copy  |

# ファイル操作

viコマンドでファイルの中に入った後に使う操作

|用途  |コマンド  |例  |
|---|---|---|
|入力モード  |i  |  |
|入力モード終了  |escキーを押す  |  |
|行番号を出す  |:set number  |  |
|特定の行番号に移動  |:78  |11行目に移動  |
|一番最後の行に移動  |:$  |  |
|一番最初の行に移動  |:1  |  |
|文字検索  |/test  |testという文字列を検索  |
|ファイルを保存して終了  |:wq! |  |
|ファイルを保存しないで終了  |:q!  |  |
国産SNS「@ meet」で認証済みバッジを付けて自分のローカル環境にだけ見られるようにする方法

今回は国産SNS「[＠ meet](https://at-meet.com/)」で認証済みバッジを付けて自分のローカル環境にだけ見られるようにする方法を紹介したいと思います。

## 環境
・Google Chrome（バージョン: 86.0.4240.111）

## 方法
### 1. Google Chrome拡張機能「My Style」をダウンロードする。
Google Chrome拡張機能「My Style」をダウンロードします。
https://chrome.google.com/webstore/detail/my-style/ljdhjpmbnkbengahefamnhmegbdifhlb

### 2. 以下のCSSをマウスで選択した後、「Ctrl+C」でコピーする。
以下のCSSをマウスで選択します。その後、ショートカット「Ctrl+C」でコピーします。

```
a.bx-tl-owner-name::after{
  content: '';
  display: inline-block;
  width: 17px;
  height: 17px;
  background-image: url(https://i.imgur.com/ZlfS0Z4.png);
  background-size: contain;
  vertical-align: middle;
}

```

### 3. 国産SNS「＠ meet」のページを開く。
国産SNS「[＠ meet](https://at-meet.com/)」のページを開きます。

### 4. ショートカットキー「Ctrl+M」を押す。
ショートカットキー「Ctrl+M」を押します。

### 5. 矢印カーソルを/* Enter your style here. */のところで左クリックする。
矢印カーソルを/* Enter your style here. */のところで左クリックをして、CSSを入力可能な状態にします。

### 6. ショートカットキー「Ctrl+V」で貼り付ける。
キーボードのショートカットキー「Ctrl+V」を押して貼り付けます。

### 7. 認証済みバッジが表示されたことを確認する。
アカウント名の右横に認証済みバッジがちゃんと表示されたことを確認します。

### 8. ショートカットキー「Ctrl+M」を押して終了する。
ショートカットキー「Ctrl+M」を押して終了します。
PHPのjson_encode/json_decodeはそのまま使わない方が良い

PHPで配列をJSON形式の文字列に変換する際に利用する[json_encode](https://www.php.net/manual/ja/function.json-encode.php)、またはJSON形式の文字列を配列に変換する[json_decode](https://www.php.net/manual/ja/function.json-decode.php)の標準関数はそのまま使わないほうが良いと、という投稿です。
PHP玄人の皆さんには常識かと思われますが、意外と知られていない気がしたので共有です。

## そのまま使うとどうなるのか

ドキュメントを参照すると次のように説明されています

### json_encode

> 成功した場合に、JSON エンコードされた文字列を返します。 失敗した場合に FALSE を返します。

### json_decode

> json でエンコードされたデータを、適切な PHP の型として返します。 true、false および null はそれぞれ TRUE、FALSE そして NULL として返されます。 json のデコードに失敗したり エンコードされたデータが再帰制限を超えているなどの場合、NULL を返します。

失敗しても例外にはならず、それぞれ`false`、`null`が返却されます。
これをちゃんとハンドリングして実装していれば問題ないですが、うっかり**失敗していたら例外になってくれるんじゃないか**と淡い期待をしていると意図しないコードになっている可能性があります。（ちゃんと静的解析してれば問題ないんじゃないですかね）

## エラーだった場合、原因が知りたい

エンコード、デコードでエラーがあった場合は[json_last_error](https://www.php.net/manual/ja/function.json-last-error.php)で直近のエラーを調べることができます。
また、[json_last_error_msg](https://www.php.net/manual/ja/function.json-last-error-msg.php)でエラーメッセージが確認できます。

## それ、Guzzleのヘルパー関数が使えるよ

[Guzzle](https://github.com/guzzle/guzzle)といえばPHPでHTTP APIをコールする際にはなくてはならないライブラリ（個人の感想）ですが、このライブラリに用意されているラッパー関数を使うとこの辺のハンドリングが施されています。

```php:\GuzzleHttp\json_encode@7.2.0
function json_encode($value, int $options = 0, int $depth = 512): string
{
    return Utils::jsonEncode($value, $options, $depth);
}

public static function jsonEncode($value, int $options = 0, int $depth = 512): string
{
    $json = \json_encode($value, $options, $depth);
    if (\JSON_ERROR_NONE !== \json_last_error()) {
        throw new InvalidArgumentException('json_encode error: ' . \json_last_error_msg());
    }

    /** @var string */
    return $json;
}
```

```php:\GuzzleHttp\json_decode@7.2.0
function json_decode(string $json, bool $assoc = false, int $depth = 512, int $options = 0)
{
    return Utils::jsonDecode($json, $assoc, $depth, $options);
}

public static function jsonDecode(string $json, bool $assoc = false, int $depth = 512, int $options = 0)
{
    $data = \json_decode($json, $assoc, $depth, $options);
    if (\JSON_ERROR_NONE !== \json_last_error()) {
        throw new InvalidArgumentException('json_decode error: ' . \json_last_error_msg());
    }

    return $data;
}
```

**失敗していたら例外になってくれるんじゃないか**
という淡い期待に答えてくれます。

## 追記
PHP玄人さんたちが色々教えてくれたので追記

### PHP 7.3以降の場合
json_encode/json_decodeのオプションに`JSON_THROW_ON_ERROR`を指定することで`JsonException`を発生させることが出来ます。
単純にこれをラップして使うだけでも良さそう。

### SafePHPを使う
[thecodingmachine/safe](https://github.com/thecodingmachine/safe)
そもそもGuzzleはHTTP APIをコールする際に利用するライブラリなので、こういう専用のライブラリを使うべきですね。こんなライブラリがあるのを知らなかったですｗ
WinSCPでAmazon S3にアクセス

Windowsで比較的広く使われているオープンソースのSCPクライアントに「WinSCP」がある。WinSCPはSCPのほかにもSFTP、FTPS等のプロトコルに対応していたが、AWSのオブジェクトストレージサービスであるAmazon S3にも2018年の[5.12.12 RC](https://winscp.net/eng/docs/history_old#5.12.12)で対応、[5.13](https://winscp.net/eng/docs/history_old#5.13)で安定版に組込まれた。

* [WinSCPとは :: WinSCP](https://winscp.net/eng/docs/lang:jp)
* [Amazon S3クライアント機能を搭載した、オープンソースのWindows対応FTPクライアント「WinSCP 5.13」リリース。FTPサーバのようにAmazon S3を操作 － Publickey](https://www.publickey1.jp/blog/18/amazon_s3_winscp_513.html)

管理コンソールからのS3アクセスはSSHやFTPポートを介さずHTTPSアクセスのみでできるので、境界型セキュリティ中心の企業環境でも比較的利用しやすいのだけど、大量の作業を行うときにはExplorerライクなGUIアプリが好まれることがある。WinSCPでのS3アクセスは両方のニーズを満たせるし、境界型セキュリティな会社には大抵あるプロキシ（しばしば認証プロキシ）経由でも使えたので、意外とこれが有用な場面もあるかと思う。

## S3アクセスの設定

Amazon S3への接続は、以下のような設定になる。転送プロトコルとして `SCP` などとの代わりに `Amazon S3` を選択する。ホスト名とポート番号は、通常は変更不要。アクセスキーIDとシークレットキーに、AWS CLI等で使用するアクセスキーとシークレットキーを入力。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55718/dcea7444-9e25-b623-dfd4-cbddd9981155.png)

HTTPプロキシを経由する場合、「設定」ボタンから設定画面に進む。左のメニューから「プロキシ」を選び、プロキシサーバーのホスト名とポート番号、認証が必要であればユーザー名とパスワードを指定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55718/ad14c5ae-203b-7c3c-cea4-25305ffcc4ed.png)

設定は保存しておく。その後「ログイン」を行うと、該当アカウントのS3の「ルート」として、バケット一覧が表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55718/3eb3fb59-ddc2-46bd-c81a-1c53a2157f1c.png)

あとはSFTPやFTP、FTPS接続時と同じように、エクスプローラー感覚で利用できる。バケット内に入ると、管理コンソールでしているようにディレクトリ感覚でパスを移動しファイル感覚でオブジェクトを操作できる。

## ロール切替には（おそらく）未対応

WinSCPは設定可能項目を見る限り、残念ながらロール切替（スイッチロール）してアクセスするといった機能はなさそうに思われる。Windows用のS3クライアントとしては、例えば[S3 browser](https://s3browser.com/)があるが、こちらも同様でロール切替の設定はない。他にもS3をWindowsにマウントできるようにする商用製品等があるが、ロール切替に対応したものは見つけることができなかった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55718/36b03f65-7d5c-b85d-77dd-e57bace88a6c.png)

ロール切替を前提とするならAWS CLIやAWS Tool for PowerShell等を使う、GUIが必須であればロールではなくIAMユーザーでS3にアクセスできるように権限設定をする、という割り切りが早道だと思われる。
AWSSAAに受かった時の嬉しさを書く

##はじめに
##### 今の自分のスキル感
+ 実務4ヶ月程度(メインはバックエンド)
+ AWSたまに触るぐらい(超主要なサービスは理解していた)

まだまだ**駆け出しひよっこエンジニア**になります。

10月末にAWSSAAの試験を受けてきました。**(2回目)**

前回(1度目)は9月末に受けましたが、見事に**撃沈**しました。
その時の勉強した事や自分のスキルレベルやスコアは[前回の記事](https://qiita.com/enomotoakira/items/31a2f9cccf6028e2b21b)をご覧ください。


##落ちて感じた事
下記が前回の試験結果になります
![スクリーンショット 2020-10-06 8.41.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689030/ccac255e-d1ad-ad93-3b75-e98af626ab09.png)
![スクリーンショット 2020-10-06 8.40.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689030/8cdcccc6-fff7-98f8-fe65-5cf40d09444f.png)

どうして自分は落ちたのか自分のスコアの結果を見て考えました。
前回の記事にも書きましたが、**問題で問われている部分をきちんと理解できなかったのも結構大きいポイント**でした。
どういうことかというと、**求められるアーキテクチャ設計によって選ぶ答えは変わります。**
求めているものが、可用性なのか、コストなのか、パフォーマンスなのかを意識しながら、問題を解くことが大事だと、この結果を見て思いました。
あとはサービス単体の知識不足もあったと思います。


##落ちてから勉強したこと
落ちてから勉強したことは以下の2点になります。

* [AWS WEB問題集](https://aws.koiwaclub.com/)

上記のゴールドプラン(記事を書いた時点では期間:60日、金額:3880円(税抜き))で契約し、#80〜#138の問題集を1.5週ぐらいやりました。
一問一答形式なので、空いた時間にやりやすかったです。
ちょこちょこ本番レベルの難易度の問題もあるので、いい訓練にはなるかなと思います。

* [【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問)](https://www.udemy.com/course/aws-knan/)

上記の問題集を念のため、再度もう一周程度やりました。(4週目)
試験問題も更新されていたりするので、見たことない問題もありました。
模擬試験1 4回目:80%
模擬試験2 4回目:89%
模擬試験3 4回目:81%
模擬試験4 4回目:81%
模擬試験5 4回目:70%
模擬試験6 4回目:76%

あとは間違えた部分を書籍を読んでサービスの内容を確認したり、記事を読んだりしてもう一度おさらいしました。





##試験当日
1回受けていたので、2回目は少しだけ簡単に感じました。
あとは**求められている事はなにか**(可用性、セキュリティ、パフォーマンス、コストなど)をずっと意識して問題を解きました。
意識しながら、サービスの内容がある程度頭に入っていると自ずと答えに辿りつけた感じでした。


試験を解き終わって、アンケートに答えて、緊張の瞬間でしたが、目の前には・・・**合格**の文字がありました。



以下のような結果が数時間経って送られてきました。(まあまあギリギリでしたが、良しとしよう)
![スクリーンショット 2020-10-25 20.57.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689030/33b66b87-82ba-bb93-7dca-c42f3c8d08b3.png)


![スクリーンショット 2020-10-25 20.57.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689030/a293360b-a9c0-efe8-a116-792665f0c262.png)



##最後に
資格取得までの勉強期間は約2ヶ月程度(一日2時間ぐらいで)でした！
AWSSAA資格が取れて本当によかったです!!!!
**1000倍返し**もできてかなりスッキリしました！！！

資格取っても意味ないという人もいますが、勉強することによってある程度のAWSの知識が身につくのも事実ですし、パブリッククラウドの知識が求められるのが当たり前の時代において、取っておいて損はないかなと思います。
資格があるだけで一定程度の知識があるという証明にもなります。


この記事がAWSSAAに資格取得したい人の参考になれば幸いです！
ここまで読んでいただいてありがとうございました！
Vivaldi on ubuntu 消去できない透明なウィンドウがDesktopに作られてしまう問題

# 現象
バージョンアップ版Vivaldiを起動すると、killしないと消せない透明なウィンドウが生成されてしまう。

# 環境
* Vivaldi：Debian 20.4.2066.76
* ubuntu 16.04LTS（18.04でも同様と思われる）

# 原因
GPUアクセラレーション機能の誤作動

# 回避策
以下の通りオプションを付けて起動する  
$ vivaldi --disable-gpu
ソフトウェアやパッケージとバージョン管理に関するセンテンス

#PATH
PATHとは、「環境変数」と呼ばれるOS用の変数のこと。PATHには、複数の絶対パスの情報が保存されています。
コマンドが入力されたときに、シェルはPATHに記述されたパスのディレクトリ内のファイルを検索します。つまり、PATHに絶対パスを保存してアプリケーションのありかを示せば、どこからコマンドを実行してもアプリケーションのコマンドを打つことができます。

```
# rbenvのパスを通す
% echo 'eval "$(rbenv init -)"' >> ~/.zshrc

# MySQLのパスを通す
% echo 'export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"' >> ~/.zshrc
```
echoコマンドは、>>に続けてファイル名を指定することで、ファイルに文字を追加できるLinuxコマンドです。.zshrcにrbenvの設定を反映するためのコマンドを記述することで、PATHを通しています。

#コマンドとアプリケーションの関係
コマンドが実行されると、シェルがそれを読み取ってOSに指示を出す。
OSに初めから入っていてすぐに動作できるアプリケーションとは別に、後からPCに追加する必要があり、よく利用されるアプリケーションは、コマンドラインツールとしてまとめられています。

##コマンドラインツール
コマンドで操作するアプリケーションのまとまりです。
コマンドラインツールを導入することで、OSが初めからコマンドで操作できるアプリケーション以外のアプリケーションをPCにインストールできます。

##Command Line Tools
macOS専用のコマンドラインツールのことです。
macOSでは、元々Linuxコマンドで操作できるアプリケーションや機能を標準搭載しています。Linuxコマンド以外で操作するアプリケーションの多くはCommand Line Toolsのインストールによって、まとめてPCに導入できます。

#パッケージとバージョンの管理

##パッケージ管理
パッケージとは、プログラムや処理をひとまとめにしたもののことです。ライブラリとも言えますが、パッケージは複数のライブラリをまとめていることもあります。
パッケージ管理とは、パッケージやパッケージが持つライブラリなどの依存関係を考慮してインストールやバージョンアップを行う管理のことです。
1つのパッケージを利用したい場合、そのパッケージと依存関係にあるパッケージも合わせてインストールしてくれます。

###パッケージ管理ツール
Homebrew(macOSのパッケージ管理ツール)
Yarn(JavaScriptのパッケージ管理ツール)

###パッケージ
Gem(Rubyのパッケージ)
Node.js(サーバーサイドで利用できるJavaScriptのパッケージ)

##バージョン管理
rbenv（Rubyのバージョン管理ツール）
vmfs-tools  を FreeBSD でコンパイルする

# vmfs-tools をコンパイルする手順

簡単に書いておこう。

## 動機

* Dell PowerEdge T610 で ESXi6.5 を動かしていたが、6.7にアップグレードするには機材が古すぎ　HCL に該当しなくなった。 

* そんなら FreeBSD12 あたりを素で入れた方が管理が楽になるだろう（ホストとゲストで管理手順が異なるものをいくつも管理したくはない）
* さくっと初期化。FreeBSD12.2が入る（10/25にRELEASEが流れて来た）
* ESXiのホストとゲストが別のディスクに入っていた。大きい側が初期化されないで残った。
* vmfsというのかふむふむ。FreeBSD 読む方法ないのか。
* fusefs-vmfs という手段があるぞ。エレガントではないが。
* えー、ports にないじゃん。 
* github にある模様。古いなこりゃ。

## 手順


* https://github.com/glandium/vmfs-tools 
ここから、git clone してくる。

* gmake <strike>と　gcc48 程度が必要。FreeBSD12の clang ではちょっと無理ではないか（型の指定がちょっと古臭い）</strike> clang でもコンパイルできた。GNUmakefile に gcc=clang と書く。
* e2fsprogs-libuuid 必要。←これ結構大事。　これがないと OSの uuid 定義を見に行ってわやになる。これに気がつくのに 半日かかったが、*** READMEに書いてあった ***（これもっと重要）

⇨ gmake/<strike>gcc48</strike>/esfsprogs-libuuid は pkg でも　ports でもなんでもいいので入れてください。

* そうそう。そもそもfusefs-vmfs を使うんでした。 sysutils/fusefs-libs も入れましょう。

## 結果

* e2fsprogs-libuuid がないと、原因を考えても無駄なレベルでエラーが出まくる。
<pre>
libvmfs/utils.c:44:4: error: incompatible type for argument 1 of 'read_le32'
    time_low = read_le32(uuid,0);
    ^
In file included from libvmfs/utils.c:36:0:
libvmfs/utils.h:58:24: note: expected 'const u_char *' but argument is of type 'uuid_t'
 static inline uint32_t read_le32(const u_char *p,int offset)
</pre>
* 入れてあるとコンパイルできてこんな感じである。
<pre>
server# gpart show
=>       40  585937424  da0  GPT  (279G)
         40       1024    1  freebsd-boot  (512K)
       1064        984       - free -  (492K)
       2048    4194304    2  freebsd-swap  (2.0G)
    4196352  581740544    3  freebsd-zfs  (277G)
  585936896        568       - free -  (284K)
=>        34  3905945533  da1  GPT  (1.8T)
          34          94       - free -  (47K)
         128  3905945433    1  vmware-vmfs  (1.8T)
  3905945561           6       - free -  (3.0K)
</pre>
<pre>
server# ./debugvmfs /dev/da1 ls
VMFS VolInfo: invalid magic number 0x00000000
VMFS: Unable to read volume information
Trying to find partitions
Unable to open device/file "/dev/da1".
Unable to open filesystem
msv8# ./debugvmfs /dev/da1p1 ls
.
..
.fbb.sf
.fdc.sf
.pbc.sf
.sbc.sf
.vh.sf
.pb2.sf
.sdd.sf
update
data
oem
opt

</pre>

* とりあえず動いたから共有しておこう。
## 追記

* fusefs-vmfs については以下のパッチについての記事を読みましょう。

https://github.com/glandium/vmfs-tools/issues/13

*「FreeBSD では全てのデバイスがキャラクタデバイスなんじゃね？」　というのはさておいて
とりあえずこの1行の修正で、コンパイルしても使えないという状況ではなくなります。
<pre>
-     } else if (S_ISREG(st.st_mode) || S_ISBLK(st.st_mode)) {
+     } else if (S_ISREG(st.st_mode) || S_ISBLK(st.st_mode) || S_ISCHR(st.st_mode)) {
</pre>

* ああそうそう。 kldload fuse してからでないと使えないので気をつけて
* 大容量ファイル 256GB以上もサポートしていない。ゲストのディスク使用枠予約して膨らませ切っているとダメ。
VSCodeでファイル保存時にPrettierを走らせる方法


# はじめに

macOSを新しく買ってVsCodeをインストールし直した時にファイル保存時にPrettierを走らせる設定方法を忘れてしまい半日以上溶かした。

ググってみたけど体系的にまとまった情報がなくてなかなか時間を溶かしたので

はじめての方でも、この記事を見れば「VSCodeユーザーなら誰でもファイル保存時にPrettierを走らせることができる」ようにいちから丁寧に記事を書いた。

# 対象読者

* VSCodeユーザー
* ファイル保存時にPrettierが走らない人

# 目次

1. PrettierをVSCodeにインストール
2. defaultFormatterの設定を変更する
3. Format On Saveにチェックを入れる
4. Settings及びPluginを反映させる為にいったん画面をReloadする

# 1. PrettierをVSCodeにインストール

VSCodeからインストールする方法とブラウザからインストールする方法がある。

VSCodeを立ち上げて、Prettier -Code formatter の拡張機能タブが表示されたら、［インストール］ボタンをクリックする。これでPrettierが有効になります。

VSCodeからではなく以下のリンクから「install」ボタンをクリックしてもいけます。
[Prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)

下の画像のように、VSCodeのインストール済みのところにあればOK。
![スクリーンショット 2020-10-26 16.04.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508390/59d8396b-89ee-fff9-5144-93a8a661d241.png)

# 2. defaultFormatterの設定を変更する

まず、VSCodeの設定画面を開く

開くには画面左下の:gear:アイコンから「Settings」を選択すればいい

ちなみにショートカットキーを使えば一発で開けるので参考まで
(macOSの場合 : 「 command + , 」 windowsの場合 : 「 ctrl + , 」）
![設定画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508390/a77dccbb-0b3e-a029-c0af-e8fa4d782966.png)


次に「defaultformatter」と検索する
![null.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508390/e3558f08-e34d-5587-032e-11de8f3b1020.png)


最後に「Default Formatter」を「null」から「esbenp.prettier-vscode」に変更する
![defaultformatter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508390/e5b1c9b8-3284-3aed-c026-8fe92228a19a.png)

# 3. Format On Saveにチェックを入れる

VSCodeの設定画面を開き「save」と検索する
![スクリーンショット 2020-10-26 16.28.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508390/bbf95352-dae0-1cef-ca07-7d73fe98720d.png)

次に「Format On Save」にチェックマークを入れる
![スクリーンショット 2020-10-26 16.28.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508390/f7e5919e-856e-c7f2-4641-238d2318c38f.png)

#4 Settings及びPluginを反映させる為にいったん画面をReloadする

これをやらないと設定が反映されないから注意！

「command + shift + P」でコマンドパレットを開き
「Reload Window」をクリックして画面をリロードさせる

（windowsの場合「ctrl + shift + P」でコマンドパレットを開ける）

# まとめ

これでファイル保存時にPrettierが走るはず。Just do it！

# 参考文献

[Vscode上でファイル保存時にPrettierを走らせる]
(https://qiita.com/Naturalclar/items/690be378984b3a24a138)
[デフォルト整形ツールにPrettierを使う](https://nju33.com/vscode/%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E6%95%B4%E5%BD%A2%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AB%20Prettier%20%E3%82%92%E4%BD%BF%E3%81%86)
[Prettier入門 ～ESLintとの違いを理解して併用する～](https://qiita.com/soarflat/items/06377f3b96964964a65d)
ADのユーザー情報にメールアドレス登録する作業をPowerShellで自動化した際の話

# 同僚からの相談内容
社内のActiveDirectoryを運用している同僚からこんな相談を受けました。

- 総務部門にメールで社員の情報（メールアドレスなど）を聞いて、ADのユーザー情報に付与している。
- しかし、必須でない項目ということもあり、ついつい登録を忘れてしまうことがある。
- 忘れなくても、入力ミスなどで誤った情報が入力されている場合がある。
- そもそも総務から提供されている情報が誤っている場合もあり、その場合は再登録が必要。
- こんな単純作業もうしたくない。スクリプト組んで自動化してくれ。

# どうやって自動化するか
現在は以下のような運用をしています。
AD担当者が__聞いて__、総務が__答えて__、AD担当者が__登録する__という
__人間が介在する作業が多くある状態です。__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242659/da559519-2852-a656-c93c-c43925a02fb6.png)

それを以下のフローにしたいと思います。
このフローなら__人間が介在する作業は総務担当者のメールアドレス入力だけ__になります。
人力を最小限に抑えることが出来るので、__登録ミスが発生するリスクは最小限__になりそうです。
また、PowerShellをタスクスケジューラで組み込めば忘れずに作業してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242659/4e0b4a40-1dc1-d15d-d0cd-41efcde78834.png)


# 実際の流れ
それでは、上記のフロー通りに自動化していこうと思います。

## CSVファイルにメールアドレスを記入する

まず、総務担当者に以下のような感じでCSVを作成してもらいます。
A列はADのユーザー名、B列はメールアドレスです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242659/2b0492df-5ad2-d5df-5543-49ad61dcefd3.png)

## CSVの内容をADサーバーに登録するPowerShellを作成する

PowerShellスクリプトのコードは以下の通りです。
CSVファイル名や保存パス、ドメイン名などは各自の環境のものを入れてください。
このスクリプトファイルをWindowsサーバー上で日次で定期起動させれば自動化の完成です。


```PowerShell
#ADユーザー名とUIDを読み込む
#CSV読み込んで、配列に保存。
$user_array = @()
$uid_array = @()

$file_name = '<CSVのファイル名>'
$folder_path = '<CSVが保存されているディレクトリ>'
$file_path = $folder_path + $file_name
#読み込むファイルがS-JISの場合は、DefaultでOK
$csv = Import-Csv -encoding Default -Path $file_path
#配列にぶち込む
foreach($line in $csv) {
  $user_array += $line.AD_User
  $uid_array += $line.mail
}

#メールを登録していく
for ($i=0; $i -lt $user_array.Length; $i++){

    #AD上で実行したいコマンドを文字列に纏める
    $cm1 = 'Set-ADUser -Identity '
    $cm2 = $user_array[$i]
    $cm3 = ' -Replace @{ mail = '
    $cm4 = '"' + $uid_array[$i] + '" }'
    $cm = $cm1 + $cm2 + $cm3 + $cm4 #AD上で実行したいコマンドの文字列


    #Invoke-Command <ドメイン名> -ScriptBlockでADを遠隔実行できる。
    #invoke-expressionで、文字列をコマンドとして実行する
    #args[0]には$cmが引数として渡される
    Invoke-Command <ドメイン名> -ScriptBlock {invoke-expression $args[0]} -ArgumentList $cm
}

```

今回はメールアドレスの入力にしていますが、
電話番号やWebページなど、色々な項目に対して変更することが可能です。
composer2.xでLaravelが動かなくなったら

# 第1の問題(Laravelのパッチバージョンが古い問題)

composer2.xがリリースされ、次第にcomposerの2系がビルドの際に落ちてくるようになりました。
その際、以下のようなエラーが出てきたかもしれません。

```php
> @php artisan package:discover --ansi

In PackageManifest.php line 122:

  Undefined index: name
```

## 解決するには

Laravelのパッチバージョンを上げれば解決します。

いくつかのpull requestが各バージョンに対して行われています
https://github.com/laravel/framework/pull/32310

## なぜこうなったのか

これは`composer2.x`で`vendor/composer/installed.json`の形式が少し変わったせいです。

今まではpackagesがjson配列で定義されているだけでした。

```json
[
    {
        "name": "asm89/stack-cors",
        "version": "v2.0.1",
        "version_normalized": "2.0.1.0",
        ...
    },
...
}
```

こちらが変更されpackagesというキーが上につくようになりました。

```json
{
    "packages": [
        {
            "name": "barryvdh/laravel-debugbar",
            "version": "v3.2.8",
            "version_normalized": "3.2.8.0",
            ...
        },
    ]
...
}
```

影響はこのせいで、先程のPRでは`$packages = $installed['packages'] ?? $installed;`とすることで、packagesというキーがあればそれを使うように修正がされているのです。

# 第2の問題(packagist.jp問題)

一部の人だけですが、updateを行おうとするとこんな感じでエラーが出てくるかもしれません。

```
$ composer update --no-plugins
Loading composer repositories with package information
Updating dependencies
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Root composer.json requires davejamesmiller/laravel-breadcrumbs 5.x, found davejamesmiller/laravel-breadcrumbs[5.3.1] in lock file but not in remote repositories, make sure you avoid updating this package to keep the one from lock file.
```

これは私の場合はですが、packagist.jpを設定していたからでした。

まずはこれを外します

```
composer config -g --unset repos.packagist
```

これで私はupdateをすることが出来ましたが、jpを使いたい人はいると思います。(現状ではpackagist.jpはv2に対応してないっぽい)
そんなときはcomposer.jsonのrepositoriesで設定をしましょう。


```composer.json
    "repositories": [
        {
            "type": "composer",
            "url": "https://packagist.jp",
            "cannonical": false
        }
    ]
```

`cannonical: false`は2.xからのオプションで公式のではないリポジトリを定義するためのものです。
packagist.jp自体は有志の方が作られたものであるため、`false`にします。
[ruby + excel] SaveAsでの注意点 

rubyではwin32oleを使えばエクセルを操作することができます。
SaveAsのところでエラーが出てしまったので、注意点をメモします。
method_missing: (in OLE method 'saveas')(WIN32OLERuntimeError)みたいなエラーでした。

## 結論
指定したディレクトリに保存する場合
- 絶対パスにする。
- パスの区切りは/ではなく\にする。

```rb
require 'win32ole'

app = WIN32OLE.new('Excel.Application')
book = app.workbooks.add
out_path = File.expand_path('test.xlsx').gsub('/', '\\')
book.saveas filename: out_path
book.close savechanges: false
app.quit
```

## SaveAsで指定するパスについて
1. 相対パスではエクセルが持っているローカルが基準になります。
2. パスの区切り文字は/ではなく\にしてあげます。
3. 名前付き引数はシンボルで指定してあげます。

### 1. エクセルが持っているカレント
rubyでは相対パスが利用できます。
エクセルでも相対パスが使えますが、「カレント」が指す場所はエクセルで設定されているローカルフォルダになります。
オプションの「規定のローカル ファイルの保存場所」に書かれている場所です。
なので、rubyが実行している場所をカレントとするために絶対パスにしてあげます。

```rb
out_path = File.expand_path('test.xlsx')
```

### 2. パスの区切りは/ではなく\で。
rubyのパスでは、階層の区切りに/(スラッシュ)が使われます。
どうやらこのままでは保存できなかったので区切り文字を\(バックスラッシュ)に置き換えます。

```rb
out_path = File.expand_path('test.xlsx').gsub('/', '\\')
```

### 3. 名前付き引数の指定
名前付き引数はシンボルで指定できます。
VBAでは「:=」を使いますが、下記のように書きます。

```ruby
workbook.saveas filename: path
```
なぜできるのかは未検証です。引数をハッシュで渡しているから？

## 余談
rubyの基本のようですが、

```rb
p out_path
```
では文字列が""で囲まれ、\が\\\\とエスケープされて表示されます。
(\\\\じゃなくて、一つにしたい！と、いろいろやって数時間。。)
あくまでもプロンプトの表示の問題で、実際には\はひとつです。

```rb
puts out_path
```
とすればよかったのでした。

ruby初心者のため、間違った記述があるかもしれません。
コメント等でご指摘いただければ幸いです。
インスタンスをインポートして別画面で使う

ちょっと躓いたのでメモ


超基本的な事と思うけど、PHPには無かった事

クラスのインスタンス化。

これは至る所で紹介されているので簡単に見つけれた。

```java
//顧客情報のインスタンス化
Customer customer = new Customer();
```

こんな感じでnew してやればインスタンス化できる。

しかし画面Aでインスタンス化したものを画面Bでnewせずに使うにはどうすればよいか？

迷ったけどやってみたら結構簡単にできました。

画面A（Java）でsetAttributeして

```java
request.setAttribute("customer", customer);
```

画面B（JSP)でインポートして受け取る

```jsp
<%@ page import="pizzaOrderForm.customer.*" %>
```

```java
Customer customer = (Customer)request.getAttribute("customer");
```

これでインスタンス化したcustomerを別画面でも使えるようになりました。

Java道は難しいな…
DockerでのFlaskサーバーの作成


Elasticsearchへデータを送るFlaskサーバーを作成する必要があったので、docker-composeを使用して構築

ディレクトリ構成

fl/
　├ Dockerfile
　├ docker-compose.yml
　└ src/
　　　├app.py
　　　└requirements.txt
 

最初にDockerfileの記載
pythonのバージョン、プロジェクトディレクトリ、必要なライブラリを記載したファイルの設定

```Dockerfile
FROM python:3.6
ARG project_dir=/projects/
ADD src/requirements.txt $project_dir
WORKDIR $project_dir
RUN pip install -r requirements.txt
```

次にdocker-compose.ymlを記載
portの設定とflask runのコマンドを記載
--with-thredsはマルチスレッドで動かすかどうかを設定するオプション


```docker-compose.yml
version: '3'

services:
  flask:
    build: .
    ports:
      - "6000:6000"
    volumes:
      - "./src:/projects"
    tty: true
    environment:
      TZ: Asia/Tokyo
    command: flask run --host 0.0.0.0 --port 6000 --with-threads

```

requirements.txtの記載
pipでインストールするライブラリを記載

```requirements.txt
flask
elasticsearch
```

実際のサーバーを記載

```app.py
from flask import Flask, jsonify, request
from elasticsearch import Elasticsearch
from datetime import datetime

app = Flask(__name__)
#Elasticsearchのホストとポートとインデックス名
host = "192.168.xx"
port = "9200"
index_name = "XXXXX"

@app.route('/', methods=['POST']) #URLのパスを記載、またPOSTのみ許可
def insert():
    data = json.loads(request.data) #flaskに投げられたデータを取得
        doc = {
            "location" : data["location"]
        }
    es = Elasticsearch(
        hosts = [{'host': host, 'port' : port}]
    )
    res = es.index(index=index_name, body=doc)

if __name__ == '__main__':
    app.run()

```

fl/ディレクトリに移動し、

```
$ docker-compose up -d --build
```
で起動

修正等で、一度落としたい場合は

```
$ docker-compose down --rmi all --volumes
```
でイメージ事削除可能
【Laravel】データベースの文字コードの設定

## 疑問
Laravelプロジェクトにおいて、データベースの新規作成をphpmyadminを使って実施したときに、文字コードについてはそこまで注意しておらずデフォルトのまま`utf8mb4_general_ci`を利用してきた。
しかし、あるとき疑問に思った。そのあとについてくるgeneral_ciは何だと。
![スクリーンショット 2020-10-26 152231.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540509/7553bd73-b702-3460-aa6c-b85bc6e0ee3c.png)

## 結論
### SQLにはcharsetとcollationがある。
- `utf8mb4_general_ci`の、`utf8mb4`はcharsetを、`general_ci`はcollation（照合順序）を表す。
- 日本語でWebページを作る場合は、`utf8mb4_general_ci`で良いことがわかった。
- `config/database.php`の文字コードの設定を見ると、デフォルトでは`utf8mb4_unicode_ci`となっている。これを以下のように変更しておくと、作成されるテーブルは`utf8mb4_general_ci`で作られる。
    ```php:config/database.php
    'mysql' => [
                //中略
                'charset' => 'utf8mb4',
                'collation' => 'utf8mb4_general_ci', //'utf8mb4_unicode_ci'から変更した
                //中略
            ],
    ```
- 個別にテーブル作成時のマイグレーションファイルに、
`$table->collation = 'utf8mb4_general_ci';`とすることでもcollationを指定できる。


## 参考記事
- [あたまのなかとっちらかーる - MariaDB(MySQL)の照合順序の話](https://blog.ver001.com/mariadb_collation/)
- [MySQLの文字コードについて（プログラミング★さがして！（個人ブログ））](http://program.sagasite.info/wiki/index.php?MySQL%E3%81%AEutf8_general_ci%E3%81%A8utf8_unicode_ci%E3%81%AE%E9%81%95%E3%81%84)
- [Laravelドキュメント（マイグレーション）]()
circleciでLaravelのプロジェクトのCIが落ちるようになった

# 今回の問題

10/23まで問題なかったciが10/26に急にこけるようになった。

```
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover

In PackageManifest.php line 122:
                         
  Undefined index: name  
                         

Script @php artisan package:discover handling the post-autoload-dump event returned with error code 1

Exited with code exit status 1
CircleCI received exit code 1
```

この問題は[Laracast](https://laracasts.com/discuss/channels/laravel/packagemanifestphp-undefined-index-name)でも報告されている。

原因としては10/24にcomposer2がリリースが影響している。

circleciから提供されるコンテナイメージはcomposerをインストールする際に以下のコマンドを実行している

```Dockerfile
# Install composer
RUN php -r "copy('https://raw.githubusercontent.com/composer/getcomposer.org/master/web/installer', 'composer-setup.php');" &&     php composer-setup.php &&     php -r "unlink('composer-setup.php');" &&     mv composer.phar /usr/local/bin/composer
```

# 解決策
`composer self-update --1`を実行すると1系に更新されるので `.circleci/config.yml` のステップに以下を追記。

```.circlci/config.yml
- run: sudo composer self-update --1
```

## 追記
circleciから提供されるDockerイメージには `circleci/` と `cimg/` の２種類があり、 `circleci/` の方はいわゆる旧世代のためなるべく `cimg/` を使うべきです。

こちらのイメージを使っている場合
https://github.com/CircleCI-Public/cimg-php/blob/master/7.4/Dockerfile#L26
に記述があるようにcomposerのバージョンを指定してインストールがされているため、こちらの場合は問題が起こらないようです。
[開発業務] それって追加依頼ですか？

プロジェクトを進める中で、それって追加対応？瑕疵対応？っていうときありますよね。

下記が私が使っている仕分けです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/4caf1637-53de-f604-a02f-1228552de526.png)

上の図にあるCまたDにならないよう、全力で設計し合意をいただく必要があります。そしてその設計の網羅性は限りなく100%である必要があります。設計の網羅性に関しても合意を事前にいただけていれば、CのケースからA1へとなるケースが多くなります。

#請負開発を進める際の注意点

請負開発をされている方は瑕疵対応という言葉に対して敏感であります。

## 瑕疵対応とは
瑕疵（かし）とは、通常、一般的には備わっているにもかかわらず本来あるべき機能・品質・性能・状態が備わっていないこと。法概念としても用いられます。

システムに「瑕疵」があるかどうかは，基本的には合意された仕様と実際のシステムの仕様とが一致するかどうかで判断されます。仕様に定められていない不具合であっても，一般常識に照らして著しく品質を欠くものについては，「瑕疵」と評価されることもありますので、注意が必要です。

上記にもあるように、合意という行為はものすごく重要なポイントとなります。

合意の取れていない仕様は上の図でいくとCまたはDとなりますので、トラブルの火種となりますので、クライアントから合意をいただけるように日々心掛けましょう（自分に言ってます）
[Java] 配列からランダムに値を取得する

# Collections.shuffleを使用

```java

import java.util.Arrays;
import java.util.Collections;
import java.util.List;


List<String> list = Arrays.asList("AA", "BB", "CC");
System.out.println(list); // =>  [AA, BB, CC]

Collections.shuffle(list);
System.out.println(list);  // => [CC, AA, BB]
```
【Rails】Rake taskでバッチ処理を実装してみた

## はじめに
### 環境
Rails: 5.2.3
Ruby: 2.6.3
MySQL: 5.6.40

### 内容
- `users`テーブルの`question_count`カラムが更新されていないバグがあり、
バッチを作成し、一括で正しい値に更新できるようにしました。
- 既存のメソッドを使用しているため分かりにくい箇所があるかもしれませんがご容赦ください。

```ruby:user.rb
has_many :questions, dependent: false
has_many :only_questions_visible_to_user, -> { where(question_id: nil).visible_to_user }, class_name: 'Question', dependent: false

scope :visible_to_user, -> { where(is_invalid: false).where(deleted: false) }

def update_question_count!
  update!(question_count: count_questions)
end

private

# question_count を更新する時の集計に利用するメソッド
#
# @return [Integer]
def count_questions
  only_questions_visible_to_user.size
end

```

```ruby:question.rb
belongs_to :user, optional: true
```


## 実装したコード
- ログを出力して途中経過、更新に失敗したもの認識しやすいようにしてみました。
- 一度のみの実行で、以降は必要なくなるため、`one_shot`ディレクトリ配下に置いて実行後に削除します。

```ruby:lib/tasks/one_shot/update_users_question_count.rake
# frozen_string_literal: true

namespace :user do
  desc 'Update users_question_count'
  task update_question_count: :environment do |_task|
    index = 0
    updated_question_counts = 0
    user_count = User.count
    logger = Logger.new($stdout)
    logger.info 'Start'

    User.find_each do |user|
      begin
        if user.question_count != user.only_questions_visible_to_user.size
          user.update_question_count!
          updated_question_counts += 1
        end
      rescue ActiveRecord::RecordInvalid => e
        logger.info "Failed to update user_id: #{user.id}"
        logger.info("#{e.class}: #{e.message}")
        next
      end

      index += 1
      case index
      when 4000, 8000, 12_000, 16_000
        logger.info "Progress: #{index}/#{user_count}"
      end
    end
    logger.info "Updated User Count: #{updated_user_counts}"
    logger.info 'Finished'
  end
end
```

## バッチ実行
`bundle exec rake user:update_question_count`

- 約19,000レコードの更新処理で45secほどかかりました。
- 更新に失敗したカラムが表示されるので別途対応が容易になりました。
![スクリーンショット 2020-10-26 午後2.36.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280744/ea784a16-13e8-3e8c-4d21-2e39bb076504.png)
Rustを実務で使うにあたってプライベートなクレートレジストリをお求めの方々へ🚚

## tl;dr

- [**Ktra**](https://github.com/moriturus/ktra)で簡単にプライベートクレートレジストリを構築できます

## 追記

### 2020/11/04

- `v0.4`で[Redis](https://redis.io/)をサポートしました

## Crate Registry

Rustのクレートレジストリとして[crates.io](https://crates.io/)が有名で、`cargo`コマンドの標準でもありますが、これはオープンソースなクレートのみホスティング可能です

一方で営利企業の実務においてコードをオープンソースとするのに様々な障壁がある場合も多いでしょう
そこでRustおよびCargoはバージョン`1.34`で[Alternative Registry](https://doc.rust-lang.org/cargo/reference/registries.html)を導入し、非公開のレジストリを利用できるようにしました

`Ktra`はこの**Alternative Registry**の最小でフリーな実装とすべく開発したアプリケーションです

## 今後の展望

`Ktra`は*v0.2.1*現在、**ほぼ**最小のプライベートレジストリとして動作します
今後はいくつかのデータベースサポートとオプションで`crates.io`と同等のブラウジング機能の追加を予定しています
みなさまのコントリビューションやご意見も随時歓迎しています

## その他

`Ktra`は当然「ケイトラ」「ケートラ」と発音します
軽トラは日本型の農業や短中距離輸送にぴったりの素晴らしい発明です
Composer本体のバージョンを1系に固定化する

2020年10月24日 Composerバージョン2がリリースされました🎉
https://blog.packagist.com/composer-2-0-is-now-available

しかし、最新版では今まで動いていたComposerプロジェクトが動作しなくなったりまだ安定化できていなさそうなので、一旦以前の1系のバージョンに戻します。

## 公式のインストーラ経由

https://getcomposer.org/download

```
$ curl -sS https://getcomposer.org/installer | php -- --version=1.10.15
$ mv composer.phar /usr/local/bin/composer
```

## 公式のDockerイメージ経由

https://hub.docker.com/_/composer

現在、 `latest` は `1.10.15` を指してるので`latest`を指定していた場合は1系の最新版がインストールされます。

いずれは2系がインストールされるようになると思うので、
今後も1系の最新版で固定化するには下記のように指定しておきます。

```Dockerfile
COPY --from=composer:1.10.15 /usr/bin/composer /usr/bin/composer
```

また、イメージタグの方はメジャーバージョンのみ固定など柔軟にバージョン指定が行えます。

```Dockerfile
COPY --from=composer:1 /usr/bin/composer /usr/bin/composer
```

## 関連する記事

- [circleciでLaravelのプロジェクトのCIが落ちるようになった](https://qiita.com/tabtt3/items/996e512e7002e9f26b0a)
- [composer2.xでLaravelが動かなくなったら](https://qiita.com/fagai/items/15232a3f1a5a640d84a7)
Gyazoのgifをブラウザで再生する

## 目的
データベースに動画を保存するとなると容量が大変そうなので、その解決策の一つとしてgyazoのgifのurlをDBに保存して表示するだけで再生できるようにできないかと思い調べた。

## 方法
https://qiita.com/Kobutorina_hato/items/d28d4cc90096e058566d
この記事の通り、マークダウン に

```
![demo](https://gyazo.com/xxxxxxxxxxxxx/raw)
```

と記述すると再生されることがわかった。
この時、URLの後に/rawを書くことを忘れない。

## Railsのアプリ内で実現したい
これをマークダウン ではなく、HTMLで記述する必要がある。
以下のサイトでマークダウンをHTMLファイルに変換した。
それをVScodeでhtmlファイルとして保存、chrome上に表示したところgifが再生された。
コードの詳細はこれから読んでいく。

https://memo.appri.me/tool/md2html


追記
以下の１行を書くだけで再生されました。

```:html
<img src="https://gyazo.com/hogehoge..../raw">
```


以上
Reactを使っていてGraphQLのApollo ClientでQuery/Mutation時のtimeout設定について

基本公式で完結するので、そこまで悩みポイントはないが、ちょっと注意点があったので参考程度にまとめておく。

# 環境
- React v16.13.x
- Apollo Client v3.2.x
- apollo-link-timeout https://github.com/drcallaway/apollo-link-timeout

# 実装
10秒でタイムアウトさせたい場合

```tsx
imoprt ApolloLinkTimout from 'apollo-link-timeout';

const timeoutValue = 10000; // 10秒

const timeoutLink = new ApolloLinkTimeout(10000);

const apolloClient = new ApolloClient({
  link: timoutLink.concat(
    createHttpLink({
      url: 'http://example.com'
    }),
  ),
});
```

# 注意点
## timeoutをconcat引数に渡すと効かない
また、clientインスタンスを生成する時の処理を以下のようにするとtimeoutが効かないので注意
ハマリポイントではないが、どちらも`concat`メソッドがあるので逆でやってみたら効かなかったのでメモに残しておくが、基本的には、ドキュメント通りにやれば問題ない。
https://github.com/drcallaway/apollo-link-timeout#usage

```tsx
const apolloClient = new ApolloClient({
  link: createHttpLink({
    url: 'http://example.com'
  }).concat(timoutLink),
});
```

## Subscriptionは効かない
ドキュメントに書かれている

```
An Apollo Link that aborts requests that aren't completed within a specified timeout period. Note that timeouts are enforced for query and mutation operations only (not subscriptions).
```

QueryとMutation処理にのみtimeoutが効く

この他、link周りで気になった点があれば、公式を読むと理解が深まる気がする。
https://www.apollographql.com/docs/link/
さくらのレンタルサーバーのメール設定で 550 5.7.1 Relaying denied. が発生

# 問題概要

さくらのレンタルサーバーをメールサーバーにして MX レコードを設定した後、メールをそのドメイン向けに送信すると `550 5.7.1 Relaying denied. Proper authentication required.` が発生した。 ドメインレコードを手動で設定したために何か問題が起こったのかとも考えたが、解決してみるとそれに依らない単なる設定の問題だったのでメモ。


# 調査と原因

今回は独自ドメイン `example.com` を追加して利用しているものとする。
ユーザー `test` がある場合、 `test@[さくらから割り当てられるホスト名]` へのメール送信は正常に届くが、`test@example.com` にメールを送信した場合のみ失敗する。 またエラーメッセージを返すのも MX で指定したさくらのレンサバだったので、レコードが間違えているというわけではなさそう。

すると、気になるのは個別に設定できるドメイン設定だったので、そこを見てみた。
そこにはドメイン毎に「メールを利用する」という設定があり、これが「利用しない」という状態で設定されていた。 この場合に `550 5.7.1 Relaying denied. Proper authentication required.` のメッセージが返ってしまうようだ。

実際、これを「全ユーザーで利用する」とした後は正常にメールを受信するようになった。
IBMCloud vSRX Traffic Loggingについて

##SRXのロギングモードは二種類ある
* Event Mode
    * Default 設定（最大1500 events/sec）
* Stream Mode
    * 高負荷なトラフィック環境で Security Log の取得が必要な場合には推奨されるモード
    * 別途Syslogサーバなどにログを飛ばす

##Event Modeはやめたほうがいい
Event Modeは機器毎に内部にTraffice Logを保持するので、<font color="red">**負荷が高くなる**</font>
実際にこれが影響し、実業務に影響がでている事もあるので、Streamモードにするべき。

Event Modeではリソースの使用量が多く、クラスタに関するクリティカルなコンポーネントに影響を与える。
* RE(Routing Engine): Controll Link
* PFE(Packet Forwarding Engine): Fabric Link

```
#リソース輻輳によりRE/PFEがリセットされた例(FPC 0)
LCC: .. power sequencer started ..
LCC: ch_fru_power_sequencer FPC 0 step 0
LCC: FPC 0 power is on
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/597e550a-b53d-81c3-553e-8d5ce4608180.png)



##Streamモード
Event ModeではSRXのリソースを大きく使用してしまい、業務影響を受ける可能性が高い
したがって、<font color="red">Streamモードを利用するべき。</font>

設定参考リンク:[Setting the System to Stream Security Logs](https://www.juniper.net/documentation/en_US/junos/topics/task/configuration/security-system-stream-security-log-revenue-port-setting.html)
関数を理解しよう！

今回は、関数について学習したので、アウトプットしていきます
※以下の内容は、学習内容のアウトプット用のため、誤りがある場合があります。予めご了承ください

#関数とは？
***関数とは、あらかじめ複数の箇所に定義されている命令文を１つにまとめる機能です。***

基本的な関数の宣言は以下の通りです。

```swift:qiita.rbvar 
func <関数名>(){ 
     <文>
 }
```
このように先頭に「func」と書きます。これは関数を意味する英語の「function」の略です。

次に簡単な例をみていきましょう！

```swift:qiita.rbvar 
func kuku5dan(){ 
     for x　in 1...9{
          print(5*x)
 }
 }

kuku5dan() //実行するためにこのように宣言する

実行結果
5
10
15
20
.
.
```

#引数を使った関数宣言

<h4>●引数とは</h4>
引数とは、関数の実行時に関数に渡す値のことです。
関数はその引数を使用し、実行できます。

引数をしようした関数の宣言は以下の通りです。

```swift:qiita.rbvar 
func <関数名>(<引数名>：<型>){ 
     <文>
 }
```

次に簡単な例をみていきましょう。

```swift:qiita.rbvar 
func kuku(num:Int) { 
     for x in 1...9{
          print(num*x)
 }
 }
kuku(num:5) //５の段実行
```

<h4>●複数の引数</h4>
関数は、複数の引数を受け付けることができます。

```swift:qiita.rbvar 
func <関数名>(<引数名1>：<型1>,<引数名2>：<型2>){ 
     <文>
 }
```
上記のように「,」で簡単に区切ることができます。

こちらも簡単な例をみていきましょう。

```swift:qiita.rbvar
func rectangleArea(height:Int,width:Int){
 print(height*width)

}

ectangleArea(height: 3, width:4) //関数の呼び出し

```
上記の例は、長方形の面積を求める式を関数で宣言して、複数の引数を指定しています。

#ラベルの指定

引数は、引数名の前にラベルを指定することができます。
ラベルを指定する理由は、なるべく自然な英語の文になるようにするためや、コードを書いていない人がパッと見て理解しやすいようにするためです。

基本的な構造を見ていきましょう。

```swift:qiita.rbvar 
func <関数名>(<ラベル１><引数名1>：<型1>,<ラベル２><引数名2>：<型2>){ 
     <文>
 }
```
このように、引数名の前に、ラベルを簡単に指定することができます。

#関数の戻り値の定義

上記で解説してきた関数は関数内で処理が完結してきました。しかし、処理の内容によっては、関数が行った処理を使って、別の処理を実行したい場合があります。この時に利用するのが***戻り値***です。

関数に戻り値を定義する場合は、次のように関数名の後に「->」を書き、戻り値の型を指定します。また、実際に戻す値をreturnキーワードの後ろに指定します。

基本的な構造を見ていきましょう！

```swift:qiita.rbvar 
func <関数名>() -> <戻り値の値の型>{ 
     <文>
     return<戻り値>
 }
```

次に簡単な例を見ていきましょう。

```swift:qiita.rbvar
func rectangleArea(height:Int,width:Int) -> Int{
 let result = height*width
 return result　//計算結果を戻す

}

var area = rectangleArea(height:5,width:6) //関数の実行結果が変数areaに代入されます
print(area)
```

#最後に
最後に、今回を学習をした内容をまとめます。
・関数を使うと、重複したコードを１つにまとめることができる
・関数を使うには、関数の宣言と関数の呼び出しの２つの手順が必要
・引数を使うと、似た関数を１つのまとめることができる
・引数には複数の値を指定することができる
・ラベルを指定することで読みやすいコードになる
・関数の処理結果を、他のコードで利用したい場合は、戻り値を設定する

関数は、アプリ開発おいて非常に重要な役割をになっているので、しっかり理解を深めていきます。
LaravelでPDFを出力する

## 概要

Laravelでpdfを扱うケースがあったので、Laravel-mpdfを導入した。
その時の手順を記載する。

dompdfとSnappyも検討したが、以下の理由により断念。

- dompdfは使えないcssが多すぎる。
- Snappyは必要なパッケージが多すぎてインストールが難しい。

docker環境のLaravelでSnappyを利用しようと考えましたが、パッケージが足りてなくて利用できなかった…。
本番環境でもパッケージのインストールが必要になると考えると、自分の知識では難しいと判断。

## laravel-mpdfのインストール

```
composer require carlos-meneses/laravel-mpdf
```

## プロバイダーとファサードの追加

`config/app.php`に以下のprovidersとaliasesに以下を追加する。

```
'providers' => [
	// ...
	Meneses\LaravelMpdf\LaravelMpdfServiceProvider::class
]
```

```
'aliases' => [
	// ...
	'PDF' => Meneses\LaravelMpdf\Facades\LaravelMpdf::class
]
```

## config

`config/pdf.php`を作成して以下を記載する。

```
return [
	'mode'                 => '',
	'format'               => 'A4',
	'default_font_size'    => '12',
	'default_font'         => 'sans-serif',
	'margin_left'          => 10,
	'margin_right'         => 10,
	'margin_top'           => 10,
	'margin_bottom'        => 10,
	'margin_header'        => 0,
	'margin_footer'        => 0,
	'orientation'          => 'P',
	'title'                => 'Laravel mPDF',
	'author'               => '',
	'watermark'            => '',
	'show_watermark'       => false,
	'watermark_font'       => 'sans-serif',
	'display_mode'         => 'fullpage',
	'watermark_text_alpha' => 0.1,
	'custom_font_dir'      => '',
	'custom_font_data' 	   => [],
	'auto_language_detection'  => false,
	'temp_dir'               => rtrim(sys_get_temp_dir(), DIRECTORY_SEPARATOR),
	'pdfa' 			=> false,
        'pdfaauto' 		=> false,
];
```

## フォント

今のままでは日本語を扱えないのでフォントを追加して、読み込むようにする。
以下のリンクからIPAフォントをダウンロードする。

https://moji.or.jp/ipafont/

ダウンロードしたフォントを`resources/fonts/ipag.ttf`に配置する。
`config.php`のreturn文に以下を追加する。

```
'custom_font_dir' => base_path('resources/fonts/'),
'custom_font_data' => [
  'ipafont' => [
    'R'  => 'ipag.ttf',
  ]
]
```

cssに以下を追加する。
※追加しなくても日本語表示できたので、自動判別されている？

```css
body {
	font-family: 'ipafont', sans-serif;
}
```

## サンプル

ビューは、`resources/views/pdfs/test.blade.php`が配置されているとする。

```php
<?php

namespace App\Http\Controllers;

use PDF;
use Illuminate\Http\Request;

class PdfsController extends Controller
{
  public function test (Request $req)
  {
    $data = [
      'name' => $req->name,
      'age' => $req->age,
    ];
    $pdf = PDF::loadView('pdfs.test', $data);

    // 表示させる場合
    // return $pdf->stream('document.pdf');

    // ダウンロードさせる場合
    return $pdf->download('test.pdf');
  }
}
```

## 参考サイト

https://github.com/mccarlosen/laravel-mpdf