OmniAICreator/Qiita-1.07M huggingface dataset:
【Lighthouse】Variablesを使ってスキーマを送る際に空文字がnullになる問題の対処法【Laravel + GraphQL】


# 発生したこと

GraphQLのString!型に空文字を送ったところ、スキーマに直接値を書き込む形では空文字のまま渡されるが、Variablesを使用して代入すると空文字がnullに変換される。

* スキーマ定義

```php:schema.graphql
type Mutation {
    updateUser(id: ID! name: String!): User! @update
}

type User {
    id: ID!
    name: String!
}
```

* 単体のスキーマの場合。
* 正常に動作し、`name`は空文字のものが返される。

```graphql:mutation
mutation { 
  updateUser(
    id: 1
    name: ""
  ) {
    id
    name
  }
}
```

* Variablesを使用してスキーマを使用した場合。
* こちらでは`updateUser`で`name`にnullのリクエストを投げているというエラーが出る。

```graphql:mutation
mutation UpdateUser(
  $id: ID!
  $name: String!
) { 
  updateUser(
    id: $id
    name: $name
  ) {
    id
    name
  }
}
```

```json:variables
{
  "id": 1,
  "name": ""
}
```

# 環境
PHP: 7.2
Laravel: 6.2
Lighthouse: 4.11


# 原因

Lighthouseではリクエストの`query`や`mutation`といったスキーマの集合を一旦Laravelのリクエストとして受け取ってから引数の代入や個別のスキーマ毎に分解して処理を行っている。

その際にVariableを使用していると、それぞれのスキーマの引数に入れる際にLaravelのリクエストとして処理されてしまうため、グローバルミドルウェアの`ConvertEmptyStringsToNull`が反応してしまい空文字がnullへと変換されていた。

# 解決方法

`Kernel`の`ConvertEmptyStringsToNull`をコメントアウトなり削除なりする。

```php:Kernel
class Kernel extends HttpKernel
{
    protected $middleware = [
//         コメントアウトする
//        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    ];
```

# 最後に

原因がわかればなんてことはないエラーなのですが、面倒だからと直接クエリを書き換えて動作確認してたりするとなかなか気がつかない問題です。

エラーメッセージでもLighthouseで「String!にnullが送られてきている」みたいなものしか出なくて調査するのに結構手間取りました。
RaspberryPiにSambaをイントールしてファイルサーバを作成

RaspberryPiをファイルサーバにするためにsambaの導入方法を解説します。 
今回は最低限の設定だけをします。
最初に直接RasberryPiに接続してターミナルを開くかSSHでRaspberryPiに接続してください

## 環境

hostname: raspberrypi
username: pi

## sambaのインストール

ターミナルで以下のコマンドを入力してインストール

```
sudo apt install samba -y
```

途中でDHCPサーバについて聞かれるが今回はNo選択

## sambaユーザーの追加

以下のコマンドでsambaユーザーを追加してください。

```
sudo smbpasswd -a pi
```

sambaユーザー用の新しいパスワードを尋ねられるので入力してください。
確認のためにもう一度パスワードの入力を求められます。

## smb.confの設定

### バックアップ

sambaの設定ファイルを念の為バックアップ

```
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf~
```

### 共有ディレクトリの設定

以下のコマンドでsmb.confを開き最後の行に追加してください。

```
sudo nano /etc/samba/smb.conf
```

今回はホーム上のPublicディレクトリを共有します。
設定は最低限です
最終行までカーソルを移動させて(`Ctrl + W` → `Ctrl + V`で最終行にジャンプします)
以下を追加

```
[share]
  path = /home/pi/Public
  writable = yes
  public = no
```

一行目の`[share]`は公開ディレクトリ名になりますので適当に分かり易い名前をつけてください。
`path`は公開するディレクトリを指定します。USBメモリのディレクトリを公開する場合は予め書き込み権限を更かしておいてください。

```:usbメモリを/mnt/usbにマウントしている場合
sudo -R 777 /mnt/usb
```

### smb.confの確認
以下のコマンドを実行して`Loaded services file OK.`が表示されば大丈夫です。
表示されない場合はsmb.confに間違えている箇所があるので修正してください。

```
testparm
```

## samba再起動

以下のコマンドでsambaを再起動して設定を有効化します。

```
sudo systemctl restart smbd
```

## 共有ディレクトリに接続

### Windowsの場合

エクスプローラーのアドレスバーに`\\raspberrypi\share`と入力して表示された画面でユーザー名に`pi`パスワードに先程設定したsambaユーザーのパスワードを入力してください。
ドライブとして固定したい場合はエクスプローラーの左側のナビゲーションウインドウから`PC`を右クリックして`ネットワークドライブの割当`を選択し表示された画面で開いてるドライブを選びフォルダーに`\\raspberrypi\share`と入力して上記と同じくユーザー名とパスワードを入力してください。

### Linux(デスクトップ)の場合

ファイラーを開いてアドレスバーに`smb://raspberrypi/share`と入力して表示された画面で登録ユーザーを選択してユーザー名に`pi`パスワードに設定したsambaユーザーのパスワードを入力してください。
__＊ディストリビューションによって違うかもしれません__

### linux(コンソール)の場合

fstabを設定してマウントしてください。(今回は割愛します。)

## 関連記事

- [Raspberry Piに64bit版OS(bate)をインストール](https://qiita.com/loach/items/7d50f4220f54a7d2acb0?utm_source=Qiita&utm_medium=referral&utm_campaign=analytics)
- [Windowsからファイルサーバでサイズの大きなファイルを扱うときのタイムアウト対策](https://qiita.com/loach/items/918e098caae945ff9728?utm_source=Qiita&utm_medium=referral&utm_campaign=analytics)

## My Accounts
<a href="https://github.com/mao2009"><img src="https://mao2009.github.io/qiita_template/GitHub-Mark-64px.png" width="50px"></a><a href="https://twitter.com/loach_mao"> <img src="https://mao2009.github.io/qiita_template/Twitter_Social_Icon_Circle_Color.png" width="50px"></a>
論文読み｜Tonemap methods

有名なトンマッパ手法から基礎を勉強します。
#Photographic Tone Reproduction for Digital Images
Reinhard 2002
##Introduction
撮影の人工処理をまねします。
1．広いdynamic rangeをディスプレイが表示できる範囲にマップする時、経験でmiddle grayの値を選んで、中間値として使います。グローバルの手法に対応します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650544/ca85bd05-a777-6928-4aff-6efb42dd89eb.png)
2．画像の暗い部分を明るくするあるいは明るいところを暗くする。ローカルの手法に対応します。

##Global
1．画像全体のlog average輝度を計算します。$L_{w}$は各ピクセルの輝度です。
$$\hat L_{w} = \frac{1}{N}e^{\sum \left ( log(\delta + L_{w}) \right )} \tag{1}$$
2．aでマップします。a∈(0,1)。全体的に輝度がノーマルの時、a = 0.18。
$$L = \frac{a}{\hat L_{w}}L_w \tag{2}$$
0.18にした原因： Renowned photographer Ansel Adams claimed that the globalaverage　perceived　luminance　of　mid-grey　for　photography is 18% of visible light [8], which has been the anchor for many TMOs.
3．画像に数少ないがとても明るいピクセル（空とか）があるため、明るい範囲を圧縮します。一番簡単な方法は
$$L_{d} = \frac {L}{1+L} \tag{3}$$
上方凸の関数です。
##Local　
全体のlog average輝度ではなく、ピクセルの近傍から平均値を計算し、Lとして使います。近傍になる条件は範囲内で大きな明暗差がないことです。一番大きいな近傍を探したいです。
1．各ピクセルに半径が違う二つのガウシアンフィルタをかけて、値の差を求めます。もし範囲内で激しい明暗変化がなければ、差は小さいはずです。
2．半径をかえつつ、差の一番大きい時の小さいほうのフィルタサイズを近傍にします。
3．log average輝度を計算し、（3）に代入します。これで、暗い近傍にある明るいピクセルはより明るくなって、明るい近傍にある暗いピクセルはより暗くなります。
実際使ってみましたが、コントラストが強くなった一方で、ノイズにも見えます。

#A Tone Mapping Algorithm for High Contrast Images
Drago
MacでQEMUを動かしてみる

# 目的
MacでQEMUを動かしてみる

# QEMUとは

> QEMU is a generic and open source machine emulator and virtualizer.
> [https://www.qemu.org](https://www.qemu.org)

# QEMUインストール

Macの場合は以下

```
brew install qemu
```

参考
> [Download QEMU](https://www.qemu.org/download)

# OS build

core

> [Running CoreOS Container Linux on QEMU](https://coreos.com/os/docs/latest/booting-with-qemu.html)


```
mkdir coreos; cd coreos
curl -O https://stable.release.core-os.net/amd64-usr/current/coreos_production_qemu.sh
curl -O https://stable.release.core-os.net/amd64-usr/current/coreos_production_qemu.sh.sig
curl -O https://stable.release.core-os.net/amd64-usr/current/coreos_production_qemu_image.img.bz2
curl -O https://stable.release.core-os.net/amd64-usr/current/coreos_production_qemu_image.img.bz2.sig
gpg --verify coreos_production_qemu.sh.sig
gpg --verify coreos_production_qemu_image.img.bz2.sig
bzip2 -d coreos_production_qemu_image.img.bz2
chmod +x coreos_production_qemu.sh
```

起動するコマンドがそのままではMacで実行できないため、
以下の記事を参考に修正させて頂きます（困っていたところ記事を見つけました。ありがとうございます）

> [MacでQEMUを使ってCoreOS環境を構築する](https://blog.lufia.org/entry/2016/03/23/205200)

```
https://blog.lufia.org/entry/2016/03/23/205200
を参考に、coreos_production_qemu.sh を修正
```

修正後、coreos_production_qemu.shを実行してQEMU上でcoreosが起動すればOK

```
$ ./coreos_production_qemu.sh
```

<img width="720" alt="スクリーンショット 2020-06-02 19.51.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/a5bc5b40-b9be-37b3-6e15-c04d71d1e742.png">

# mouse pointerのコントロールを奪う

Macの場合は、SHIFT+F12 でmouse pointerのコントロールを奪うことができた


# 参考
[https://www.qemu.org/](https://www.qemu.org)
[MacでQEMUのビルドをしてみた。](https://yamaimo.hatenablog.jp/entry/2017/04/17/200000)
[LinuxカーネルをARM向けにビルドしてQEMUで起動する](http://blog.hirokikana.com/dev/runnning-linux-kernel-for-arm-on-qemu/)
[QEMU](https://ja.wikipedia.org/wiki/QEMU)
[Download QEMU](https://www.qemu.org/download)
[Automotive Grade Linuxことはじめ](https://qiita.com/mbamba/items/6b302595e29d83e86ceb)
[QEMUを使って最新のLinuxカーネル(v4.0-rc7)を起動する](https://qiita.com/kairi199088/items/a2cd962f375cf875fe52)
[Linux Kernel をBuildしてqemuで動かす](https://shuntavista.jimdofree.com/2019/12/05/linux-kernel-をbuildしてqemuで動かす/)
[Raspberry pi（Raspbian Jessie）を OS X の QEMU で動かす](https://qiita.com/knyrc/items/1e652c349fa8939235f9)
[Raspbian Stretch 2018/3/13版をQEMUで動かす](https://qiita.com/Nebutan/items/1cffada81e61a9f2ed58)
[juokelis/qemu-rpi-kernel](https://github.com/juokelis/qemu-rpi-kernel)
[QEMU4.0.0 + Raspbian Buster による RaspberryPi のエミュレーション環境構築(超シンプル手順バージョン)](https://qiita.com/PINTO/items/1cd90f8acca7b5b03685)
[MacでQEMUを使ってCoreOS環境を構築する](https://blog.lufia.org/entry/2016/03/23/205200)
[Running CoreOS Container Linux on QEMU](https://coreos.com/os/docs/latest/booting-with-qemu.html)
[VMware playerからQEMU-KVMへ: Ubuntu 16.04 MATEにて](https://whoraibo.hatenablog.com/entry/2017/09/18/020000)
VSCode Shift-JISのテキストを文字化けせずに開く。

前提：VSCode バージョン1.45.1

1. Vscodeの「ファイル」→「ユーザー設定」→「設定」
1. 画面上部の「設定の検索」欄に「Auto Guess Encoding」と入れてチェックを入れる
1. ファイルを開きなおすと文字化けせずに開ける。

参考：https://www.atmarkit.co.jp/ait/articles/1806/01/news051.html
Defcon DFIR CTF 2018 HR Server - Application Q 2 2

#問題

https://defcon2018.ctfd.io/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/94b859bd-1ceb-5aac-7445-ee52d1b587c7.png)

人事システムのポータルのパブリックURLは何でしたか？

#解いてみた

httpd.confを確認すればわかりそうです。

```
\[root]\Program Files\OrangeHRM\4.1\apache\conf\httpd.conf
```

の中身を確認するとServerNameがありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/41a81186-e9d3-1cc7-32f5-8aaa23803130.png)

```
http://74.118.139.108/
```

が答えだと思いましたが、違いました。
アクセスログから類推しようと思います。

アクセスログを見てみると/から遷移されているログがいくつかあったのでおそらくこれがポータルページと思われます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/f25ddec5-d67a-b9ab-0558-cea409d5e234.png)

ということでこれが答えでした。
【Debian9.3】キーボード配列をUSキーボードに変更するまで

こちらのサイトを参考に自分用のメモとして残していきます。
[Debian9のキーボード配列を変える](http://bigbuddha.hatenablog.jp/entry/change-keyboardlyout-debian9)


#仮想マシンのバージョン確認
以下のコマンドでバージョン確認

```
$ cat /etc/debian_version
```

というわけでDebian9のキーボード配列の変更をやっていきます。

#変更手順



1. `$ sudo dpkg-reconfigure keyboard-configuration`と入力
2. `Generic 102-key(Int1) PC`を選択
<img width="721" alt="スクリーンショット 2020-06-06 14.59.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136271/63144a3d-e430-0642-b1c4-4e69da553b97.png">
3. `Japanese(Machintosh)`を選択
<img width="720" alt="スクリーンショット 2020-06-06 15.03.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136271/e1825e11-cbe4-9a57-7d0f-e8cc0f956160.png">
4. `No toggling`を選択
<img width="718" alt="スクリーンショット 2020-06-06 15.13.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136271/e671927f-8f7d-46bb-001a-067abd1c3742.png">

`you will need away to toggle the keyboard between the national layout and the Latin layout.Right Alt or Caps Lock keys are often chosen for ergonomic reasons.Alt+Shift is also popular combination; it will however lose its usual behavior in Emacs and other programs that use it for spwcific needs.Not all listed key are present on all keyboards.Method for toggling between national and Latin mode`

>キーボードを国別レイアウトとラテンレイアウトの間で切り替える必要はありません。人間工学的な理由から、右AltキーまたはCaps Lockキーがよく選択されます。Alt+ Shiftも一般的な組み合わせです。ただし、Emacsおよびそれを使用する他のプログラムでは、通常の動作が失われます。リストされているすべてのキーがすべてのキーボードに存在するわけではありません。ナショナルモードとラテンモードを切り替える方法

何言ってるのか、わからないのでとりあえず`No toggling`
5. `Notemporary switch`を選択
<img width="709" alt="スクリーンショット 2020-06-06 15.18.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136271/5e80090c-bed4-bf33-4e7d-0ce3c2b185b8.png">
 
ラテン語に切り替えることないと思うので
6. `The default for the keyboard layout`を選択
<img width="718" alt="スクリーンショット 2020-06-06 15.20.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136271/22eecd46-ffda-0a5a-5238-ede5d08091b0.png">
7. `No compose key`を選択



<img width="705" alt="スクリーンショット 2020-06-06 15.21.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136271/634bcc71-82f1-a7ad-56a9-4db06450eea4.png">
TypeScriptのPropsでProperty '...' does not exist on type 'Vue'エラー

Nuxt×TSの環境で、Vue.extend()を使っていますが、いつもどおりPropsの型定義をしていたらProperty `'...' does not exist on type 'Vue'`のエラーが出ました。
初見のパターンだったのでメモ。

ドロップダウンのコンポーネントですが、propsで`dropdownStyles`オブジェクトを受け取っている部分だけ見てもらえばOKです。



# エラーが出る書き方
```vue

<template>
  <div class="dropdown">
    <div @click="openModal"></div>
    <modal
      :name="dropdownStyles.name"
      class="modal"
    >
    </modal>
  </div>
</template>

<script lang="ts">
import Vue from 'vue';

//Propsの型定義
type DropdownStyles = {
  name: string;
};

export default Vue.extend({
  name: 'AppDropdown',
  props: {
    dropdownStyles: {
      //propsの型を指定できてると思ったら...
      type: Object as Vue.PropType<DropdownStyles>,
        defalt: () => ({
          name: 'dropdown'
        }),
      required: true
    }
  },
  methods: {
    openModal(): void {
      this.$modal.show(this.dropdownStyles.name);
    }
  }
});
</script>
```
propsのtypeで型定義をしているから大丈夫だろう...と思っていたらここでビルドエラーが出ました。

## エラー内容

```bash

46:29 Property 'dropdownStyles' does not exist on type 'Vue'.
 
    44 |   methods: {
    45 |     openModal() { 
  > 46 |       this.$modal.show(this.dropdownStyles.name);
       |                             ^
    47 |     }
    48 |   }
    49 | });
 
```
ええ...型定義したじゃん...😭


と思いましたが、Vueの[options](https://012-jp.vuejs.org/api/options.html)の型定義も必要だったようです。

参考: [TypeScript の Vue.extend(options) で options の型を明示せず data などの同時指定時に props の default がアロー関数でないと型の解釈ができなくなる](https://qiita.com/ysKuga/items/e3a2a7c39ff1bd9f47b2)

defaultをアロー関数で指定していたので、上記の記事のパターンとは微妙に違うのですが参考になりました。


# エラーが出ない書き方
```vue

<template>
  <div class="dropdown">
    <div @click="openModal"></div>
    <modal
      :name="dropdownStyles.name"
      class="modal"
    >
    </modal>
  </div>
</template>

<script lang="ts">
import Vue from 'vue';

type DropdownStyles = {
  name: string;
};

//ここでPropsとMethodsの型を定義
//computedとdataは無いので書いてません
type Props = {
  dropdownStyles: DropdownStyles;
};

type Methods = {
  openModal: () => void;
};

//ここでVue.extendに渡されるoptionsの型を指定
//コンポーネントに存在しないオプションの部分は空のオブジェクトを指定
export default Vue.extend<{}, Methods, {}, Props>({
  name: 'AppDropdown',
  props: {
    dropdownStyles: {
      type: Object as Vue.PropType<DropdownStyles>,
        defalt: () => ({
          name: 'dropdown'
        }),
      required: true
    }
  },
  methods: {
    openModal(): void {
      this.$modal.show(this.dropdownStyles.name);
    }
  }
});
</script>
```
Windows10 でIMEが更新されて、入力モード切替設定が変わった話

**この記事は2020/06/07 時点のものです**


今までWindowIMEで入力モードを切り替えるために `IME-オン/オフ` を `Ctrl+SPACE` に割り当ててた。
そんな折、WSL2を使うためにWindowsを `Windows10 Ver.2004 (OSビルド 19041.264)` にアップデートしたところ、IMEも大規模アップデートされてその設定が使えなくなってしまった。

私はフルサイズキーボードを使っていないので、そうするとモード切替が `` Alt+` `` に固定されてしまいとても使いずらい。

# どうしたか
* 方法1: IMEを旧バージョンに戻す
* 方法2: 新IMEの設定を変更する

## 前のVersionのIMEを使う
設定 > 時刻と言語 > 言語 > 日本語 > オプション > キーボード:Microsoft IME > オプション > 全般 > 互換性 > 以前のバージョンのMicrosoft IMEを使う > ON

## 新IMEの設定を変更する
設定 > 時刻と言語 > 言語 > 日本語 > オプション > キーボード:Microsoft IME > オプション > キーとタッチのカスタマイズ > キーの割り当て
Ubuntu 18.04から20.04にアップグレードする時の注意点（リモートからのアップグレードは避けるべき）

Ubuntu 18.04から、20.04にアップグレードした時、デバイス周りがおかしくなって往生したときのことを話します。
<a href="https://qiita.com/hitobb/items/2ee9b1c2c49760976e0f"> Qiita:Ubuntu 18.04(LTS)→20.04(LTS)アップグレード方法</a>を参考にして、アップグレードしたのですが、この方法だと、直接ローカルマシンからアップグレードせずに、ssh経由でリモート端末からアップグレードをするために、xorgや、キーボード、サウンドなどの、デバイス周りがおかしくなって、CPU使用率も100％になってフリーズしていたので、設定し直すのに苦労をしました。
~~いろいろweb検索をして、試行錯誤をしてみても、pulseaudioがsnd-hda-intelのデバイスを拾わなくなったので、pulseaudioは/etc/pulse/default.paを書き換えて、何とか音を出しています。~~
2020年6月15日現在、pulseaudio周りのアップデートがあり、音は出ています。

CPU使用率が100％になって、フリーズしていたのは、`localectl set-keymap jp106`とすると直りました。やっぱり、直接ローカルマシンからアップグレードをするのが一番のようです。

ローカルマシンからアップグレードするのは以下の方法で。

#①パッケージを最新のものにしておく

```
sudo apt update
sudo apt upgrade
sudo apt autoremove
```

#②アップデートマネージャをインストールする

```
sudo apt-get install update-manager
```

#③アップグレード対象をLTSに書き換える

```
sudo vi /etc/update-manager/release-upgrades
```

で、

```
[DEFAULT]
    :
Prompt=lts
```

とする。

#④アップグレードを実行する。

```
sudo do-release-upgrade -d
```
Defcon DFIR CTF 2018 HR Server - Application Q 1 2

#問題

https://defcon2018.ctfd.io/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/cc949dbb-e2a1-3d60-307d-5ffd1925527b.png)

Webサーバーをホストするhr管理アプリケーションの名前は何ですか？

#解いてみた

とりあえずイメージをマウントしてドライブの中身を見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/fddcfdd3-bf2a-f66d-7308-2cd05ef42f5a.png)

xamppがあったのでこれかなと思ったんですが、違いました。
ログを見てみると確かに何も記録されてないのでインストールだけして使用はしてないようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/81693f12-c586-810d-e35b-c2615406f1ba.png)

Program Filesフォルダを見てみると一つ聞いたことないソフトが入ってました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/c8aad608-c120-a159-cdd7-32b4f3006c8f.png)

このソフトについて検索してみるとHRソフトウェアでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/c5b60607-11c2-6eb6-9348-2fc93100f0a8.png)

ログを見てみるとちゃんと記録されているので使用されているようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/87f49d3d-5b4b-5051-4db1-02fcb7b57913.png)

ということでこれが答え。
vscode vim で素早く shift + v → j と押したときに、 shift + j で行結合されてしまうのを防ぐ

keybindings.jsonに以下を追加。

    {
        "key": "shift+j",
        "command": "type",
        "args": {"text": "j"},
        "when": "textInputFocus && !editorReadonly && vim.active && vim.mode != 'Normal' && vim.mode != 'Insert'"
    }

- NormalモードとInsertモード以外でshift+jを押してしまってもjだけを押したことにしている。
- commandだけでjを押すってできないのかな？
- vim.mode == 'Visual'はなぜか効かなかった。
Flutterでresource fork, Finder information...が出た時の対処

##はじめに
Flutterでios/Android開発をしている者です。
`Flutter run`実行するとこんなエラーが出ました
>
esource fork,Finder information, or similar detritus not allowed
    Command CodeSign failed with a nonzero exit code

今回はこれの対処法についてお話します

##開発環境
MacOS Catalina -v10.15.5


##エラー
`Flutter run`実行すると
なんかでた



```
Running Xcode build...                                                  
                                                   
Xcode build done.                                           69.1s
Failed to build iOS app
Error output from Xcode build:
↳
    ** BUILD FAILED **
Xcode's output:
↳
    app/build/ios/Debug-iphonesimulator/gRPC-C++/gRPCCertificates-Cpp.bundle: replacing existing
    signature
    app/build/ios/Debug-iphonesimulator/gRPC-C++/gRPCCertificates-Cpp.bundle: resource fork,Finder information, or similar detritus not allowed
    Command CodeSign failed with a nonzero exit code
    note: Using new build system
    note: Building targets in parallel
    note: Planning build
    note: Constructing build description
    warning: Mapping architecture armv7 to i386. Ensure that this target's Architectures and Valid Architectures build settings
    are configured correctly for the iOS Simulator platform. (in target 'image_picker' from project 'Pods')
    warning: Mapping architecture arm64 to x86_64. Ensure that this target's Architectures and Valid Architectures build settings
    are configured correctly for the iOS Simulator platform. (in target 'image_picker' from project 'Pods')
Could not build the application for the simulator.
Error launching application on iPhone 8.
```
Xcodeに関するエラーで、iosに関係しているみたい
初めて見るエラーだったので`resource fork,Finder information, or similar detritus not allowed`をググってみる

##解決策
[ここ](https://stackoverflow.com/questions/39652867/code-sign-error-in-macos-high-sierra-xcode-resource-fork-finder-information)を参考にして
`$ xattr -cr /Users/hoge/app/`
`$ xattr -lr ios/Runner`
を順に実行すると直った
##深掘る
解決したのはいいだけど今後のためにコマンドの意味を考える。
まず、xattrとはなんなのか？
これは拡張ファイル属性(extended file attribute：xattr)といいメタデータをユーザがファイルに結びつけることができる機能のこと。
今回の原因はiosのシュミレータファイルの付加情報が壊れている状況だったため、このエラーが表示された模様。

このエラーを解消するために上記のコマンドでディレクトリをクリーンする必要がある。
appの環境構築の際に,ios/Runner/GoogleService-Info.plistを変更したのが原因か？
詳しくは[wiki](https://ja.wikipedia.org/wiki/%E6%8B%A1%E5%BC%B5%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%B1%9E%E6%80%A7)を参照してください
【python】条件を満たすチョコレートのセグメントの数を求めるプログラム

#【python】条件を満たすチョコレートのセグメントの数を求めるプログラム

自分用のメモです。


▼設問

- 正の整数が入ったlistが与えられる。(s)
- 各インデックスは板チョコのブロックを表す。
- Ronくんの誕生日をd、誕生月をmとする。
- ブロック数mで、ブロック数の合計値がdを満たす、チョコの割り方のパターン数を求める。
- ブロックは連続していること。


[URL](https://www.hackerrank.com/challenges/the-birthday-bar/problem)


▼sample input

```python:
s=[1,2,1,1,3,2]
d,m=3,2
```

▼sample output

```python:
2
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/64bd33fd-dfcb-1d83-a86c-23249ffa744d.png)


▼my answer

```python:
def birthday(s, d, m): 
    ans = 0
    
    #指定ブロック数毎の組み合わせを作る。
    blocks = [s[i:i+m] for i in range(len(s)-0)]

    for block in blocks:
        if len(block)==m and sum(block)==d:
            ans += 1
    return ans  

if __name__ == '__main__':
    fptr = open(os.environ['OUTPUT_PATH'], 'w')
    n = int(input().strip())
    s = list(map(int, input().rstrip().split()))
    dm = input().rstrip().split()
    d = int(dm[0])
    m = int(dm[1])
    result = birthday(s, d, m)
    fptr.write(str(result) + '\n')
    fptr.close()
```


<br>
**・内包表記**
for文のシンプルな書き方。
`式 for 変数 in イテラブル`
　*イテラブル：listやset,rengeなどの連続した値を含むオブジェクト。

**・スライス**
`イテラブル[初期値:終わり値:ステップ]`

```python:
s=[1,2,1,1,3,2]
print(s[0:2])
print(s[1:4])

#
[1, 2]
[2, 1, 1]
```

[スライスの詳細はこちら](https://qiita.com/yuta-38/items/0d5c55b748d10f83af53#5-abc%E9%96%8B%E5%A7%8B%E7%B5%82%E4%BA%86%E5%A4%89%E5%8C%96%E9%87%8F%E3%82%92%E6%8C%87%E5%AE%9A)


<br>
##if文の一文書きを使ってもっとシンプルにしてみる。

▼my answer(simpler)

```python:
def birthday(s, d, m): 
    blocks = [s[i:i+m] for i in range(len(s)-0)]
    return sum([(1 if len(block)==m and sum(block)==d else 0) for block in blocks])
```


`式(True) if 条件式 else 式(False)`
↓
「1 if 条件式 else 0」
真なら１を、偽なら0を返す。

※式の部分に代入は使えない
☓ ans += 1
☓ ans = ans+1
ARC 097 D Equals

##問題
https://atcoder.jp/contests/arc097/tasks/arc097_b
##見た感じ
スワップできる数字の組が例えば(1,2)(2,3)だとしたら、このスワップを組み合わせて、p[1],p[2],p[3]を好きな順番にならべ変えることができて、おそらく要素数が増えたとしても同じように、好きな順番に挿入していけそう。
だから、重要なのはこの数字の組でどれだけの数字がグループになっているかで並び方は関係ない。
例えば{(1,3),(3,6)}がスワップできる数字の組だとすると
最初に与えられたpの{p[1],p[3],p[6]}に1が含まれていれば、スワップによって好きな順番に並べられるので、p[1]=1とすることができるし、もし含まれなければ絶対に無理。
だから、スワップできる数字のグループを持っていて、数字同士が同じグループにいるかが早く判定できればよいので、union-find treeを使って実装した。
##解法
union-find tree 上でスワップ可能な数字の組をmergeしていって、最後に各iについて、iとp[i]が同じグループに入っているかどうかを調べ、入っていれば、ansを1増やしていった。
##ソースコード
```c++
struct uftree{
    int n;
    int cou;
    vector<int> parent;
    vector<int> rank;
    vector<int> _size;
    uftree(int n):n(n){
        parent=vector<int>(n);
        rank=vector<int>(n,0);
        _size=vector<int>(n,1);
        cou=n;
        rep(i,n){
            parent[i]=i;
        }
    }
    int root(int i){
        return parent[i]==i?i:parent[i]=root(parent[i]);
    } 
    bool same(int i,int j){
        return root(i)==root(j);
    }
    void merge(int i,int j){
        i=root(i);j=root(j);
        if(i==j)return;
        cou--;
        if(rank[i]>=rank[j]){
            parent[j]=i;
            _size[i]+=_size[j];
        }else{
            parent[i]=j;
            _size[j]+=_size[i];
        }
        if(rank[i]==rank[j])rank[i]++;
        return;
    }
    int count(){
        return cou;
    }
    int unitsize(int i){
        return _size[root(i)];
    }
};
const int N_MAX=100005;
int n,m,p[N_MAX];

int main(){
    int x,y;
    //入力
    cin>>n>>m;
    rep(i,n)cin>>p[i];
    uftree tree(n);
    rep(i,m){
        cin>>x>>y;
        tree.merge(x-1,y-1);
    }
    //処理
    int ans=0;
    rep(i,n){
        if(tree.same(p[i]-1,i))ans++;
    }
    //出力
    cout << ans <<endl;
}
```
##振り返り
unionfind tree が生き生きしてるのは初めてだった
Kotlin @JvmStaticと@JvmFieldのアノテーション

### kotlinの@JvmStaticと@JvmFieldのアノテーション

- まずjavaのサンプルコード

```java
public class TestStatic {
    private int otherField = 0;

    public static final BigInteger BIG_INTEGER = BigInteger.ONE;

    public static void method() {
        System.out.println("call method");
    }
}
```

- これはkotlinに変換すると

```kotlin
class TestStatic {
    private val otherField = 0
    companion object {
        val BIG_INTEGER = BigInteger.ONE
        
        fun method() {
            println("call method")
        }
    }
}

```

- 静的なメソッドはcompanion objectにあるため、javaのコードから呼ぶときにCompanionを付けなければならない。

```java
public static void main (String[] args) {
    TestStatic.Companion.method()
}
```

- もし@JvmStaticを付ければjavaのコードでもstaticを呼ぶようになります。

```kotlin
        @JvmStatic
        fun method() {
            println("call method")
        }
```

```java
public static void main (String[] args) {
    TestStatic.method()
}
```
【PowerShell】動的に候補を生成してファイル選択を楽にする


下記内容を読み込むと使えるようになる `Get-FileByExtension` コマンドレットでは、 <kbd>Tab</kbd> や <kbd>Ctrl+Space</kbd> での補完に現在のディレクトリにあるファイルの拡張子が候補として挙がるようになります。 `.pdf` ファイルだけ対象に処理したい、というようなときに少し楽になります。

```PowerShell
using namespace System.Management.Automation
class PsCurrentDirExtension : IValidateSetValuesGenerator {
    [string[]] GetValidValues() {
        return (Get-ChildItem -File).Extension
    }
}

function Get-FileByExtension {
    param (
        [ValidateSet([PsCurrentDirExtension])][string]$extension
    )
    return (Get-ChildItem -File | Where-Object Extension -eq $extension)
}
```


### 環境

```
Name                           Value
----                           -----
PSVersion                      7.0.1
PSEdition                      Core
GitCommitId                    7.0.1
OS                             Microsoft Windows 10.0.18362
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0
```
RepoコマンドでGitHubのリポジトリ指定する方法

## 環境

repo version v2.8

## サンプルコード

```xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <remote
    name="origin"
    fetch="git://github.com/ksilverwall"
    pushurl="git@github.com:ksilverwall"
  />
  <default revision="master" remote="origin" />

  <project name="thankshell-react" path="thankshell-react"/>
</manifest>
```


## 解説

fetchとpushurlを別々に指定しています。
気持ち悪いんですが、統一すると上手く動きません。

githubはfetch時は `git://` と `git@` の両方のURLを受け付けるのですが、Push時には `git@` しか受け付けません。
（2020-06-06時点）

それを踏まえると `git@` に統一すると通りそうな気もしますが、sync時に以下のようなエラーが出ます。

```
% repo sync                     
fatal: remote error: 
   is not a valid repository name
  Email support@github.com for help
thankshell-api:
fatal: remote error: 
   is not a valid repository name
  Email support@github.com for help
```

ソース読んでないのでrepoコマンドの不具合なのか何なのかわからないのですが、今の所使えないので、苦肉の策としてfetchとpushのURLを分けたら通りました。

将来的に修正されるかもしれないし、もっとうまいやり方があるかもしれませんので見つけられたからは記事 or 修正リクエスト or コメントお願いします。
Numpyで文字列をくっつける

#　普通にやる

```python
import numpy as np

a = np.array(["a", "b", "c"])
b = np.array(["A", "B", "C"])
a+b

>>TypeError: ufunc 'add' did not contain a loop with signature matching types dtype('<U1') dtype('<U1') dtype('<U1')
```
こうなる

# np.objectを使う

```python
import numpy as np

c = np.array(["a", "b", "c"], dtype=np.object)
d = np.array(["A", "B", "C"], dtype=np.object)
c+d

>>array(['aA', 'bB', 'cC'], dtype=object)
```
いけた

# 他の方法は？
mapを使おう

```python
import numpy as np

a = np.array(["a", "b", "c"])
b = np.array(["A", "B", "C"])
np.array(list(map("".join, zip(a, b))))

>>array(['aA', 'bB', 'cC'], dtype='<U2')
```

# 結論
object型は便利です！

# 参考サイト
他の手法も紹介されている
https://stackoverrun.com/ja/q/2619737

Numpyのデータ型について
https://note.nkmk.me/python-numpy-dtype-astype/
【Vue.js × Firebase】Firebase Hostingにデプロイまで

## この内容について
この内容は、Vue.jsを使ったプロジェクトを作成して、
Firebaseにデプロイするまでをまとめた記事になります。

## Vue.jsとは
Vue.jsはUI構築のためのJavaScriptプログレッシブフレームワークのこと
[Vue.js公式サイト](https://jp.vuejs.org/)

## Firebaseとは
Googleが提供しているモバイルおよびWebアプリケーションのバックエンドサービスのこと
[Firebase](https://firebase.google.com/)

## 手順
### Node.jsのインストール
Node.jsの公式サイトにアクセスし、推奨版をインストールします。
(Node.js公式)[https://nodejs.org/ja/]
<img width="1792" alt="nodejs.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/8b75bd85-dd9a-9399-108e-b262e3d70bc3.png">

### VueCLIのインストール
ターミナルを開き、VueCLIをグローバルインストールします。

```terminal:ターミナル
npm install -g @vue/cli
```

### パスを通す
.bash_profileを開き、node_moduleにパスを通します。
なお、Users/usernameのusernameを自分のユーザ名に変更してください。

```terminal:ターミナル
open ~/.bash_profile
```

```text:.bash_profile
export PATH="$PATH:/Users/username/.npm-global/bin"
```

```terminal:ターミナル
source ~/.bash_profile
```

### Vue.jsプロジェクトの作成
vue createコマンドでVue.jsプロジェクトを作成します。

```terminal:ターミナル
vue create vueapps
```

下記のような表示が出るので、defaultを選択してEnterを押下。

```terminal:ターミナル
Vue CLI v4.4.1
? Please pick a preset: (Use arrow keys)
❯ default (babel, eslint) 
  Manually select features 
```

### Vue.jsプロジェクトをローカルで確認
npm run serveでVue.jsプロジェクトをローカルで起動します。

```terminal:ターミナル
npm run serve
```

ローカル環境でアプリが起動されます。[http://localhost:8080/](http://localhost:8080/)
今後の開発もこちらのコマンドを使用しながらやっていきます。

このコマンドは常に実行されているので、開発を中断する時は、
「control」+「C」で実行をキャンセルしておきましょう。

<img width="1792" alt="vueapp.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/0eb22e58-b723-6bf0-204f-667c2f4e08a8.png">

### Firebaseプロジェクトの作成

#### 1. Googleのアカウントを作成し、Firebaseのサイトへアクセスします。
[Firebase](https://firebase.google.com/)
#### 2. コンソールへ移動
#### 3. コンソール画面で新規プロジェクトを作成
#### 4. プロジェクト名を入力
#### 5. アナリティクスの有効有無を選択する
#### 6. プロジェクトの作成が完了

<font color="#CC011B">**詳しいやり方は、[こちら](https://korenarawakaru.com/firebase/firebase-start) を参考にしてください。**</font>

### FirebaseCLIのインストール
ターミナルを開き、FirebaseCLIをグローバルインストールします。

```terminal:ターミナル
npm install -g firebase-tools
```

### Firebaseにデプロイ

#### 1. コマンドでFirebaseにログインする

```terminal:ターミナル
firebase login
```

#### 2. Allow Firebase ~ と表示されるので、Yを入力し、Enter
#### 3. ブラウザが開かれるので、使用するアカウントを選択する
#### 4. FirebaseへのGoogleアカウントのアクセスを許可する
#### 5. Firebaseへのログインが完了する
#### 6. 作成したプログラムのフォルダ配下でプログラムを初期化

```terminal:ターミナル
firebase init
```

#### 7. サービスの選択 Hostingを選択する
#### 8. デプロイ先のプロジェクトを選択する
#### 9. 使用するパプリックディレクトリの指定
What do you want to use as your public directory?と聞かれるので、「dist」と入力し、Enter。
その後の質問は全てEnter。
#### 10. Vue.jsプロジェクトをビルドする
npm runコマンドでVue.jsプロジェクトをビルドします。

```terminal:ターミナル
npm run build
```

#### 11. Firebaseにデプロイ
firebase deployコマンドでFirebaseにデプロイする。

```terminal:ターミナル
firebase deploy
```

<font color="#CC011B">**詳しいやり方は、[こちら](https://korenarawakaru.com/firebase/firebase-deploy) を参考にしてください。**</font>

## まとめ
Vue.jsとFirebaseを駆使すれば、比較的簡単にシステムを
構築していけるのでこの技術スタックはオススメです(^^)

Vue.jsの需要はかなり高まっている印象もありますので、
この記事を見ながら一度触ってみると良いでしょう。

この記事が良いと思った方は、LGTMをしていただければ嬉しいです！
フォローも是非お願い致します(^^)
Python3 エンジニア認定基礎試験 取得についての備忘録

本日（6/6）にPython 3 エンジニア認定基礎試験を取得したので 記録させていただきます。

# 結果
　以下はスコアーボードになります。
　<img width="672" alt="スクリーンショット 2020-06-06 15.20.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/ade0a9c9-e218-c9d4-9cdf-18324540c2b4.png">

　正解率　70% 　Python3の試験は70％合格なので、ジャストでした、、、、

　模擬問題と同じ問題も３問くらいありましたが、基本的に値も出題方法も
　模擬試験と本番は全然違いました。
　本番の方が難しいです。余裕で。
　以下と同様の結果となる物を選べ的なのが多いです。

# 自身のスキルについて
　・Python経験なし。
　・.NET経験が約7年。（うち、実装経験は4年くらい?)

# 勉強アーカイブ
　ブラック企業に出向しているため、コロナ禍でもテレワークならず
　普通に忙しい、日々を過ごしています。
　週末だけ暇なので、Pythonを身につけたく思い、まず資格から勉強しようと決意。

　勉強期間：2020年4月 - 2020年5月 総勉強時間：20時間ほど
　　１. 【2020年4月上旬〜5月上旬】
　　　①　「スッキリわかるPython入門 (スッキリシリーズ) 」 　
　　　　→　通勤中に週１か２で読む。
　　　　→　ダラダラ読みすぎて、内容が頭に入らず。
　　　　→　RangeとTupleを初めて知る。使い方もあんまり理解できず。

　　２. 【2020年5月上旬〜5月中旬(GW中） 】
　　　　Visual Studio CodeでPython環境を作り、
　　　　Git Hubにてソースを管理。
　　　　【①の本にあった各単元のコーディングを見ながら、コーディング練習と
　　　　理解を深める。（後半めんどくさくなり、やめる）】

　　３. 【2020年5月中旬〜6月上旬】
　　　　試験の申し込みを決意。
　　　　公式サイトでベンダーチケットを買うと、以下の本が特典でついてきました。
　　　　（6/20までのキャンペーンのようです。）

　　　②　「Pythonチュートリアル 第3版 (日本語) 単行本（ソフトカバー）」
　　　　→ ここからテスト問題がでると聞いていたので、とりあえず一読。
　　　　→ 読み辛く、適当に１周だけ、3日ほどで読む。
　
　　　③ 模擬試験サイト　「Python3エンジニア認定基礎模擬試験 β版」
　　　　　（https://exam.diveintocode.jp/exam#exam-list）
　　　　→ 空き時間を見つけて、死ぬほど解く。
　　　　→ 丸暗記レベルで1000点を目指す。

## 以下が模擬試験サイトの履歴
　　点、合格/不合格、	解いた日付
　　375点、不合格、　2020年05月23日 20時05分
　　625点、不合格、　2020年05月23日 21時10分
　　725点、合格、	2020年05月24日 13時09分
　　700点、合格、	2020年05月24日 17時53分
　　700点、合格、	2020年05月24日 18時18分
　　775点、合格、	2020年05月25日 22時18分
　　800点、合格、	2020年05月25日 22時32分
　　875点、合格、	2020年05月27日 09時11分
　　775点、合格、	2020年05月27日 09時20分
　　900点、合格、	2020年05月27日 20時50分
　　850点、合格、	2020年05月27日 21時01分
　　875点、合格、	2020年05月27日 21時07分
　　825点、合格、	2020年05月27日 21時14分
　　825点、合格、	2020年05月27日 23時13分
　　900点、合格、	2020年05月27日 23時30分
　　900点、合格、	2020年05月28日 21時42分
　　925点、合格、	2020年05月28日 21時52分
　　950点、合格、	2020年05月28日 21時57分
　　850点、合格、	2020年05月30日 01時14分
　　900点、合格、	2020年05月30日 01時24分
　　950点、合格、	2020年05月30日 17時18分
　　900点、合格、	2020年05月30日 17時28分
　　950点、合格、	2020年05月30日 17時36分
　　875点、合格、	2020年05月31日 15時32分
　　950点、合格、	2020年05月31日 15時52分
　　975点、合格、	2020年05月31日 16時01分
　　975点、合格、	2020年05月31日 16時06分
　　975点、合格、	2020年05月31日 16時11分
　　950点、合格、	2020年05月31日 16時16分
　　1000点、合格、	2020年05月31日 16時20分
　　975点、合格、	2020年05月31日 16時23分
　　975点、合格、	2020年05月31日 23時36分
　　975点、合格、	2020年05月31日 23時43分
　　1000点、合格、	2020年06月01日 09時38分
　　975点、合格、	2020年06月02日 00時22分
　　925点、合格、	2020年06月02日 00時26分
　　1000点、合格、	2020年06月04日 09時07分
　　950点、合格、	2020年06月06日 05時54分
　　950点、合格、	2020年06月06日 12時15分
　　975点、合格、	2020年06月06日 12時20分

　→ 後半はもう惰性でひたすらやってました。

最後に
　この試験は初心者向けと謳っていますが、意外と舐めてかかると落ちます。
　チュートリアルの本はちゃんと読んで、模擬問題も１０００点取れるまで何回もやるべきです！
　でないと落ちてしまします。
　Pythonは引き続き、たまにコーディングは練習します。
　次はAWSの試験の勉強をします。
　ありがとうございました！
【python】最高・最低記録の更新回数を求めるプログラム

#

自分用のメモです。


▼設問

- listに試合順ごとの得点（正の整数）が格納されている。
- 初回の得点を基準値として、最高得点を更新した回数と、最低得点を更新した回数をそれぞれ求める。


[URL](https://www.hackerrank.com/challenges/breaking-best-and-worst-records/problem)


▼sample input

```python:
scores =[3,4,21,36,10,28,35,5,24,42]
```

▼sample output

```python:
4 0
```

▼my answer

```python:
def breakingRecords(scores):
    high=low=scores[0]
    xhigh=xlow=0
    
    for i in scores:
        if i>high:
            xhigh+=1
            high=i
        elif i<low:
            xlow+=1
            low=i
    ans = [xhigh, xlow]
    return ans

if __name__ == '__main__':
    fptr = open(os.environ['OUTPUT_PATH'], 'w')
    n = int(input())
    scores = list(map(int, input().rstrip().split()))
    result = breakingRecords(scores)
    fptr.write(' '.join(map(str, result)))
    fptr.write('\n')
    fptr.close()
```


<br>
**・tabulate**
表にする。
She tabulates the number of times she breaks her season record.
FlutterでGoogleDataTransportにエラーが出た時の対処

##はじめに

Flutterで開発をios/Android開発している者です。
先日、```Flutter run```で
ビルド時にこんなエラーが出ました。
>
error: umbrella header for module 'GoogleDataTransport' does not include header 'GDTCORDataFuture.h' 


今回はこのエラーの対処法についてお話します。


##開発環境
MacOS Catalina -v10.15.5

##エラー
```Flutter run```
実行時のエラーログ



```
Launching lib/main.dart on iPhone 8 in debug mode...
Running Xcode build...
Xcode build done.                                           24.3s
Failed to build iOS app
Error output from Xcode build:
↳
    ** BUILD FAILED **
Xcode's output:
↳
    <module-includes>:1:1: error: umbrella header for module 'GoogleDataTransport' does not include header 'GDTCORDataFuture.h' [-Werror,-Wincomplete-umbrella]
    #import "Headers/GoogleDataTransport-umbrella.h"
    ^
    <module-includes>:1:1: error: umbrella header for module 'GoogleDataTransport' does not include header 'GDTCORStoredEvent.h' [-Werror,-Wincomplete-umbrella]
    2 errors generated.
    In file included from app/ios/Pods/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport/GDTCCTLibrary/GDTCOREvent+NetworkConnectionInfo.m:17:
    app/ios/Pods/GoogleDataTransportCCTSupport/GoogleDataTransportCCTSupport/GDTCCTLibrary/Private/GDTCOREvent+NetworkConnectionInfo.h:17:9: fatal error: c<img width="1440" alt="スクリーンショット 2020-06-06 13.42.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387365/81158a4b-2a3a-d0ea-7a13-f30019f0eff1.png">
ould not build module 'GoogleDataTransport'
    #import <GoogleDataTransport/GDTCOREvent.h>
     ~~~~~~~^
    3 errors generated.
    note: Using new build system
    note: Building targets in parallel
    note: Planning build
    note: Constructing build description
    warning: Mapping architecture armv7 to i386. Ensure that this target's Architectures and Valid Architectures build settings are configured correctly for the iOS Simulator platform. (in target 'image_picker' from project 'Pods')
    warning: Mapping architecture arm64 to x86_64. Ensure that this target's Architectures and Valid Architectures build settipod update Firebase/Firestore
ngs are configured correctly for the iOS Simulator platform. (in target 'image_picker' from project 'Pods')
Could not build the application for the simulator.
Error launching application on iPhone 8.
```

GoogleDataTransportが関連していたので調べてみると
[Githubのissue](https://github.com/flutter/flutter/issues/41383)が参考になった
どうやら Firebase's SDK/podが影響しているみたい。

<img width="601" alt="A5B4F8D0-8C71-4B30-B1D9-A09FFBA65F97_1_105_c.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387365/2b897f1c-e98b-93eb-7b8a-12d58c1ab493.jpeg">

エラ-ログと比べてみると ```#import <GoogleDataTransport/GDTCOREvent.h>```の部分が追記されているのがわかる。(2019/9/27)

つまり、古いモジュールが更新されていないためビルドに失敗した模様

##解決策
まずはFlutterのiosディレクトリに移動しPodsを削除する
(Pods はインストールしたパッケージが入っているだけ。)
```$ rm -rf Pods```

次に、溜まっていたビルドキャッシュを削除する。
これをしないとせっかく消去したのに同じやつを参照しかねない
```$ flutter clean```

そして再び実行
```$ flutter run```

この時、`pod install`が実行されPodsが再構成される。
そして無事に生還
##まとめ
Pod関連のエラーでした。
アプリ自体は```git clone```でローカルに持ってきたんですが、おそらくリモートのファイルにPodfileの更新をしていなかったのが原因だと思います。
```$ rm -rf Pods```こういうパワー系のコマンドはできれば打ちたくない(怖い)
Ruby on Rails のテストフレームワーク Rspec の導入

## テストとは
アプリケーションの様々な挙動を全て手動でチェックすることは困難です。
このため、テストを書くことによってデータの受け渡しが正しくされるか、想定した挙動で動いているかなど、効率的にチェックすることができます。

## Ruby でのテストフレームワークと Rspec について
Rubyのテストフレームワークで有名なものは
 - Rspec
 - Test::Unit
 - Cucumber
 などがあります。この中で Rspec は一番使われているBDDテストフレームワークです。

## テストの種類

Rails チュートリアルではいくつかの種類のテスト使われています。

モデルやビューヘルパー単体の動作をチェックする単体テスト、コントローラー/ビューの呼び出し結果をチェックする機能テスト、ユーザーの実際の操作を想定し、複数のコントローラーにまたがるアプリの挙動をチェックする統合テストがあり、システム開発では以上のテストを行うことが多いです。

## 導入
Gemfile に rspec に関する gem を入れます

```ruby

group :development, :test do
  gem 'rspec-rails'
end
```
のあと、

```bash
$ bundle install
```
をしましょう。

必要に応じて、[FactoryBot](https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md) (旧FactoryGirl)なども入れましょう。
参考文献:https://qiita.com/at-946/items/aaff42e4a9c2e4dd58ed

## 文法

### テストの要件の記述
#### describe , it , expect
これらを使うことによってテスト要件の記述ができます。

例えば単体テスト（modelのテスト）では、


```spec/company_spec.rb

RSpec.describe Account, type: :model do
  describe 'company model' do
    it '作成' do
      expect { create(:company) }.to change { Company.count }.by(1)
    end
  end
end
```

Rspec でエラーが出た時には、context, it に記述した文章が出力されます。
これにより、どの部分でエラーが起きたのかを理解することができます。

#### context
context を使って条件を分岐しても良いです。it をそれぞれ作成してもよい
例えば controller のテストにおいては、

```spec/company_spec.rb
RSpec.describe CompaniesController, type: :controller do
  describe '一覧の取得' do
    context 'ログインしている場合' do
      it '200 を返す' do
        // テスト処理
      end
    end
    context 'ログインしていない場合' do
      it '400 エラーを返す' do
        // テスト処理
      end
    end
  end
end

```

### 使い分け

|  区分 |  記述すること  |
| ---- | ---- |
|  describe  |  テストの対象  |
|  context  |  特定の条件の場合分けを記述  |
|  it  |  アウトプットが何かを記述  |

以上のように振る舞いを記述してから、テストを書いていきます。


### let , let!

テストにおいて、テストデータを使う場合にはこのような処理を記述します。
例えば、

```spec/company_spec.rb
RSpec.describe CompaniesController, type: :controller do
  describe '一覧の取得' do
    context 'ログインしている場合' do
      it '200 を返す' do
        let(:company) { Company.create(name: '株式会社ヤマダ', email: 'yamada@exapmle.com') }
        # テスト処理
      end
    end
    context 'ログインしていない場合' do
      it '400 エラーを返す' do
        # テスト処理
      end
    end
  end
end

```

以上のように処理を書く部分でデータを作成します。

let let! はそれぞれ

|  区分 |  評価タイミング  |
| ---- | ---- |
|  let  | 最初にメソッドが呼ばれた時に処理される  |
| let!  |  ブロック実行前に処理される |


つまり、上の例だと

```        
let(:company) { Company.new(name: '株式会社ヤマダ', email: 'yamada@exapmle.com') }
```
この時点では、:company が作られておらず、
例えば、

```
process :show, method: :get, params: { company_id: company.id }
```
のようにcompany が呼ばれた時点で、作成されるという違いがあります。

呼ばれるタイミングの違いでエラーが出ることがあるので、この違いは意識したいところです。



### before / after
テストの前後に行いたい処理がある際にはこちらに処理を記述します。


Rspec で作成されたデータは基本的にテストが終わると、テスト用のデータベースから削除される。

## 終わりに
Rspec で個人的にごちゃっとするところをまとめてみたつもりです。
間違っている点があれば、ご指摘いただけるとありがたいです！


## 参考文献
https://qiita.com/jnchito/items/42193d066bd61c740612#context-%E3%81%A7%E6%9D%A1%E4%BB%B6%E5%88%A5%E3%81%AB%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E5%8C%96%E3%81%99%E3%82%8B
https://qiita.com/uchiko/items/d34c5d1298934252f58f
パスワード変更メモ

パスワード変更メモ

```login_confirm.sh
SERVER='proxy01'
F_USER='login00'

PASS='Vfr4bgt5!'
P_USER='login01'

echo "### change ####"
ssh ${SERVER} "echo ${PASS} | passwd --stdin ${P_USER}"
echo

echo "### confirm ###"
ssh ${SERVER} "su - ${F_USER} -c \"echo ${PASS} | su - ${P_USER} -c id\"" > /dev/null 2>&1
echo ${SERVER} ${P_USER} $?

exit
```
WSL2+GO+VSCODEで開発

# 前置き
事前にWSL2のインストールとその環境下でDocker-composeが動くようにしてください。


# フォルダ構成
テストするうえで、以下のフォルダ構成を行います。

```
./
├── Dockerfile
├── docker-compose.yml
└── golang
       └── main.go
```

各ファイルの中身について

```dockerfile:Dockerfile
FROM golang
RUN go get github.com/derekparker/delve/cmd/dlv

WORKDIR /go/src/app
```

```yaml:docker-compose.yml
version: '3'
services: 
  app:
    build: .
    ports:
    - "5050:5050" #delve用のポート
    volumes:
    - "./golang:/go/src/app"
    privileged: true
    command: dlv debug --headless --listen=:5050 --log --api-version=2
```

```go:main.go
package main
import "fmt"

func main() {
	i := 0
	fmt.Println("hello world")
	fmt.Println("hello world")
	fmt.Println("hello world", i)
}

```

# VScode設定

launch.jsonファイルを以下のように修正します。 

```jason:launch.json
{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [   
        {
            "name": "Launch",       //ローカル使用
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${fileDirname}",
            "env": {},
            "args": []
        },
         {
            "name": "Remote",       //リモート使用
            "type": "go",
            "request": "launch",
            "mode": "remote",
            "remotePath": "/go/src/app", //コンテナ内のパス
            "port": 5050, // dlv debugのポートを指定変更可能
            "host": "karosu-main", //wslを立ち上げたときに表示されるhost名を指定
            "program": "${fileDirname}",
            "env": {},
            "args": [],
            "showLog": true
        }
    ]
}
```

今回、wsl2のホスト名がkarosu-mainのためそのようにしていますが、人によって違うかもしれませんので、 
実際にWslを起動して、`hostname`コマンドで調べてみてください。 
あと通信が確立しているかの確認は*コマンドプロント*や*powershell*を起動して、`ping karosu-main`が通るか確認してください。

# 作業実行

以下の作業手順に沿って作業を行えば、確認できます。
1. wslを起動
2. docker-composeを起動
3. 実行の構成で`Remote`を選択
4. main.goでブレイクポイント指定
5. デバッグの開始

デバックのPrint文の出力は、ターミナル上に出力されます。
【JavaScript】find()とfilter()の使い分けまとめ

#はじめに

配列の中から特定の要素を取り出す時、
ひとつ→find()
複数→filter()
を使うけど、返す値が異なることを覚えておきたい。

#ソースコード
配列の中から10以上の値を取り出す。
###findメソッド

```js
const array = [5, 120, 10, 10, 4];

const result = array.find(element => element >= 10);

console.log(result);
//120
```
120という値だけが返される。

###filterメソッド

```js
const array = [5, 120, 10, 10, 4];

const result = array.filter(element => element >= 10);

console.log(result);
//[120, 10, 10]
```

10以上の値だけが入った新しい配列が返される。
filterメソッドを使ってこの配列から120を取り出したい場合は、

```js
result[0]
```
で値を取り出す。

#まとめ

find()は配列の要素の値を返して
filter()は関数内で条件が一致する値だけを格納した新しい配列を返す。
機械学習の入門の入門

<h1>機械学習ってなあに</h1>
こんにちは！某都内の大学文系科目を専攻している大学生です。
AIって言葉は聞いたことがあったけど、実際にどんなことができるのって思う方いませんか？
実はAIって言葉を漠然と考えてる人が多いと思うんですよね！
今回はAIの領域の一つである、機械学習についてまとめてみたいと思います！
間違ってる部分、理解が追いついていない部分もあると思うので、その際はご指導をいただけたらと思います！
それでは Let's Start!

<h2>想定している読者</h2>
・AIについて興味あるけど始め方がわからない方
・機械学習という言葉は知ってるけど実際何ができるのと疑問を持っている方

<h2>機械学習とは</h2>
定義から入ります。
機械学習とは、"データの意味を理解するアルゴリズムの応用と科学"です。
つまり、僕たちが生きていく中で接する様々なデータ（バンコクのコンドミニアムの広さと家賃やミドリムシの細胞の長さまで様々なもの）の"意味"を理解し、それを使って様々な"応用"（コンドミニアムの広さを使って家賃を予測したり、ミドリムシの細胞の長さを使って、オスなのかメスなのかを判別したり）をすることなんですね。
*例は適当に考えました。

<h2>機械学習の種類</h2>
機械学習は大きく分けて教師あり学習・教師なし学習・強化学習の3つに分かれています。

<h2>教師あり学習とは</h2>
教師あり学習とは、予測したいものの答え（正解）がわかっている状態のトレーニングデータ（訓練データ）からモデルを学習し、未知のデータやこれから現れるデータを予測できるようにする方法のことです！

そして正解のデータの質によって2つに分けることができます。
・正解ラベル（答え）が雨か晴れか、0か1か、オスかメスか、など離散値の性質を持つ教師あり学習のことを"分類"(Classification)と呼びます。
・正解ラベルがバンコクの家賃や気温など連続値の性質をもつ教師あり学習のことを”回帰”(Regression)と呼びます。

過去の正解が事前に用意できるデータに関してはこの方法はとても強力に作用すること間違いなし（そんなことない時もあるよ)

<h2>強化学習とは</h2>
強化学習とは環境(environment)とのやり取りに基づいて性能を改善するエージェントを開発する方法のことです。
環境の現在の状態に関する情報には報酬(reward)というものも含まれています。

つまり、エージェントが行なった行動に対して環境が報酬を与えることによって、もっと報酬をもらいたいエージェントが性能を強化していく仕組みということです！

頑張っちゃうエージェント可愛いですね。

<h2>教師なし学習</h2>
教師あり学習では、モデルをトレーニングする際に正解データが事前に用意されていましたよね。
強化学習では、エージェントの行動に対して報酬の度合いが用意されていましたよね。

しかし、実際の社会はそこまで甘くないです。答えなんてわからないものをなんとかして、答えを作り出したい時もありますよね。

教師なし学習では、ラベルづけされていないデータや構造が不明のデータを扱います。

教師なし学習を用いることで、答えがわからなかったり、報酬がなかったりしても、データの構造を調べることで意味のあるデータを取り出すことができます。

たとえば、クラスタリング(Clustering)という教師なし学習では、距離が近いデータをまとめ上げることによって、
近いもの同士でいくつかのグループを作ることができます。

<h2>3つの学習を知ってみて</h2>
AIという漠然なものから機械学習という少し現実味のあるものを知ることができ、これまでの認識が変わった方も多いかなと期待しております。
機械学習は、使いこなせばとても強力なツールでもあり、その反面、利用者の知識が及ばないと性能の悪い子ができちゃうというというのが僕の所感でした。

また記事を書いていこうと思います。
あと、もっと写真を使いたい！
以上ここまで読んでくださり、ありがとうございました。

<h2>参考文献</h2>
Python機械学習プログラミング　達人データサイエンティストによる理論と実践　株式会社インプレス
[python] 配列スライス操作

#pythonでよく使う配列のスライス操作の確認
pythonを勉強し始めてからすごくスライス操作を使うので、ここで一度自分の確認のためにもまとめたいと思います。

###配列の操作
まずは配列から、pythonでは作った配列に自動的に番号がつくようになっていて(indexと呼びます)0からスタートして作った中身の数分番号が振り当てられます。

```python
l = [5,3,1,2]
print(l.index(5))
print(l.index(3))
print(l.index(1))
print(l.index(2))
```

```
$ python atcoder.py
0
1
2
3
```
こんな感じに配列の中の5,3,1,2には0123が順番に振られていることがわかりました。
ちなみにl.index()の.index()は配列などindexがふられているものに使える関数で、指定したところのindex番号が取れます。

次はそのインデックスを使って配列の値を取り出します。

```python
l = [5,3,2,1]

print(l[0])
print(l[2])
```

```
$ python atcoder.py
5
2
```
こんな感じに配列に[]をつけてその中に取り出したいインデックスを指定します。
l[0]とすると0番目の5が取れます。

次は一つではなく複数の配列の中身をとります。

```python 
l = [5,3,2,1]
print(l[0:2])
```

```
$ python atcoder.py
[5, 3]
```
複数の値を取りたい時はみてわかるように[インデックス:インデックス]として、
はじめに指定した番号のところから後に指定した番号の範囲までを取得できます。
注意して欲しいのがfor文などと一緒で[0:2]とした場合２の一つ前つまりこの場合は0から1までの値を取得するようになっています。

次は最初からあるところまでや、あるところから最後までの方法

```python 
l = [5,3,2,1]
print(l[1:])
```

```
$ python atcoder.py
[3, 2, 1]
```

```python
l = [5,3,2,1]
print(l[:3])
```

```
$ python atcoder.py
[5, 3, 2]
```

最初の方は[インデックス:]で指定したインデックスから最後までの値を取り出します
後の方は[:インデックス]で最初から指定したインデックスまで、後の方は先ほど説明したように一個手前までです。

###応用
こんなことは日常にないかもしれませんが適当に数字が横に並んでいてどこで分けると一番左と右の大きさの差が少なくなるのか？みたいな時にはスライス操作が便利です。

```python
l = [3,14,6,40,2,6,17,4,6,7,38,5,44,22,1,6,6,7]

for i in range(1,len(l)):
    l_l = l[:i]
    print(f"l_l{l_l}")
    l_r = l[i:]
    print(f"l_r{l_r}")
```
ある番号までと、ある番号からっていうある番号の値をひとつずつ増やしていくことで、右と左に全ての位置で分けられます。
rangeが1からなのは0からにすると一番初めのループでのl_lがl[:0]となり空の配列が出来上がり空とそのほかというのは比べる必要がにないのでそうしました。

```
l_l[3]
l_r[14, 6, 40, 2, 6, 17, 4, 6, 7, 38, 5, 44, 22, 1, 6, 6, 7]
l_l[3, 14]
l_r[6, 40, 2, 6, 17, 4, 6, 7, 38, 5, 44, 22, 1, 6, 6, 7]
l_l[3, 14, 6]
l_r[40, 2, 6, 17, 4, 6, 7, 38, 5, 44, 22, 1, 6, 6, 7]
l_l[3, 14, 6, 40]
l_r[2, 6, 17, 4, 6, 7, 38, 5, 44, 22, 1, 6, 6, 7]
l_l[3, 14, 6, 40, 2]
l_r[6, 17, 4, 6, 7, 38, 5, 44, 22, 1, 6, 6, 7]
l_l[3, 14, 6, 40, 2, 6]
l_r[17, 4, 6, 7, 38, 5, 44, 22, 1, 6, 6, 7]
l_l[3, 14, 6, 40, 2, 6, 17]
l_r[4, 6, 7, 38, 5, 44, 22, 1, 6, 6, 7]
l_l[3, 14, 6, 40, 2, 6, 17, 4]
l_r[6, 7, 38, 5, 44, 22, 1, 6, 6, 7]
l_l[3, 14, 6, 40, 2, 6, 17, 4, 6]
l_r[7, 38, 5, 44, 22, 1, 6, 6, 7]
l_l[3, 14, 6, 40, 2, 6, 17, 4, 6, 7]
l_r[38, 5, 44, 22, 1, 6, 6, 7]
l_l[3, 14, 6, 40, 2, 6, 17, 4, 6, 7, 38]
l_r[5, 44, 22, 1, 6, 6, 7]
l_l[3, 14, 6, 40, 2, 6, 17, 4, 6, 7, 38, 5]
l_r[44, 22, 1, 6, 6, 7]
l_l[3, 14, 6, 40, 2, 6, 17, 4, 6, 7, 38, 5, 44]
l_r[22, 1, 6, 6, 7]
l_l[3, 14, 6, 40, 2, 6, 17, 4, 6, 7, 38, 5, 44, 22]
l_r[1, 6, 6, 7]
l_l[3, 14, 6, 40, 2, 6, 17, 4, 6, 7, 38, 5, 44, 22, 1]
l_r[6, 6, 7]
l_l[3, 14, 6, 40, 2, 6, 17, 4, 6, 7, 38, 5, 44, 22, 1, 6]
l_r[6, 7]
l_l[3, 14, 6, 40, 2, 6, 17, 4, 6, 7, 38, 5, 44, 22, 1, 6, 6]
l_r[7]
```
でここから全ての差を取ればいいですね、今回の記事には関係ないですが一応書きます

```python
l = [3,14,6,40,2,6,17,4,6,7,38,5,44,22,1,6,6,7]

min_g = 10000000
ans = 0
for i in range(len(l)):
    l_l = l[:i]
    l_r = l[i:]

    if min_g > abs(sum(l_l)-sum(l_r)):
        min_g = abs(sum(l_l)-sum(l_r))
        ans = i

print(ans)
```

```
$ python atcoder.py
10
```
インデックス番号が10番目までと10番目からで分ける方法が一番差がないらしいです。

###まとめ
まだまだスライスにはたくさんあって全部書くのは大変なので基本ですごく使うものを書きました。
vistaでquartus

#概要

vistaでquartusやってみた。
Lチカの手順。

#intelに登録する。

#download

quartus ii v13.0

#usb blasterのドライバーを入れる。

#プロジェクトを作る。

デバイスは、ep2c5t144c8を選ぶ。

#verilogを書く。

```
module ledblink(input clk, input key, output led5, led4, led2);
	reg [26:0] cnt;
	assign led5 = ~cnt[24];
	assign led4 = ~cnt[25];
	assign led2 = ~cnt[26];
	always @(posedge clk, negedge key)
	begin
		if (~key)
			cnt <= 'b0;
		else
			cnt <= cnt + 1;
	end
endmodule



```

#pin planner

clk pin_17
key pin_144
led5 pin_9
led4 pin_7
led2 pin_3

#timing cloks

10ns

#timing set input delay

10ns

#timing set output delay

10ns
 
#netlist

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c4ce6d0d-89c0-8d74-bca4-b0b9038193ce.png)


#写真

![CIMG2955.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/9febaaed-70fc-c2b0-16b7-143827174167.jpeg)


以上。