OmniAICreator/Qiita-1.07M huggingface dataset:
ディレクトリを暗号化する(eCryptfs)

# 暗号化ディレクトリを作成する

```bash
# ecryptfs-utilsパッケージをインストールする
sudo apt install ecryptfs-utils
[sudo] **** のパスワード: ******

パッケージリストを読み込んでいます... 0%

パッケージリストを読み込んでいます... 100%

(略）

# 暗号化ディレクトリの作成
ecryptfs-setup-private
# ****はユーザー名　Privateディレクトリが作成される(.Privateも)
ls /home/****
Private ダウンロード テンプレート デスクトップ ドキュメント ビデオ ピクチャ ミュージック 公開
# 作成時はまだマウントされていない
df
Filesystem     1K-blocks    Used Available Use% Mounted on
udev             1762436       0   1762436   0% /dev
tmpfs             357264    1556    355708   1% /run
/dev/sda1       10253588 7288988   2424032  76% /
(略）
# マウントする
ecryptfs-mount-private
Enter your login passphrase:*****
# /home/****/.Privateディレクトリが/home/****/Privateにマウントされる
df | less
Filesystem           1K-blocks    Used Available Use% Mounted on
udev                   1762436       0   1762436   0% /dev
tmpfs                   357264    1552    355712   1% /run
/dev/sda1             10253588 7288992   2424028  76% /
(略）
/home/****/.Private  10253588 7288992   2424028  76% /home/****/Private

```


####再起動時には自動マウントされる為には２つの条件を満たす必要

1. auto-mount, auto-umountが存在する(ディレクトリ作成時に ~/.ecryptfsディレクトリに作成されている))
2. /etc/pam.dディレクトリにある設定ファイルにpam_ecryptfs.soモジュールが指定されている

(ただし、この２つの条件は暗号化ディレクトリ作成時にデフォルトで満たされている)


```bash
# 1の条件を確認
ls /home/****/.ecryptfs
Private.mnt  Private.sig  auto-mount  auto-umount  wrapped-passphrase
# 2の条件を確認
ls /etc/pam.d
chfn             common-session-noninteractive  login     runuser-l
chpasswd         cron                           newusers  samba
chsh             cups                           other     sshd
common-account   gdm-autologin                  passwd    su
common-auth      gdm-fingerprint                polkit-1  sudo
common-password  gdm-launch-environment         ppp       systemd-user
common-session   gdm-password                   runuser

cat /etc/pam.d/common-auth
#
# /etc/pam.d/common-auth - authentication settings common to all services

(略）

# here are the per-package modules (the "Primary" block)
auth	[success=1 default=ignore]	pam_unix.so nullok_secure
# here's the fallback if no module succeeds
auth	requisite			pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
auth	required			pam_permit.so
# and here are more per-package modules (the "Additional" block)
auth	optional	pam_ecryptfs.so unwrap
auth	optional			pam_cap.so 
# end of pam-auth-update config

```
ServerlessFramework+TypeScript+serverless-offlineでLambda関数を作る

## 目標
ServerlessFrameworkのローカル開発で重宝するserverless-offline。
非常に便利なのでこれをTypeScriptでも使用したかったのですが、色々躓いてました。
今回どうにか動いたので備忘録的にその流れを記録しておきます。

## ServerlessFrameworkにてテンプレートをインストール

```bash
npx sls create -t aws-nodejs-typescript -n lambda-typescript
cd lambda-typescript
yarn
```

eslintをインストールしますが、自分はグローバルインストールしたeslint-cliから実行します。
(そうした方が楽なので)

```bash
# まだインストールしていなければ
npm i -g eslint

eslint --init
? How would you like to use ESLint? To check syntax and find problems
? What type of modules does your project use? JavaScript modules (import/export)
? Which framework does your project use? None of these
? Does your project use TypeScript? Yes
? Where does your code run? Browser, Node
? What format do you want your config file to be in? JavaScript
? Would you like to install them now with npm? Yes
```

Prettierもインストール(お好みで)

```bash
yarn add -D prettier eslint-config-prettier eslint-plugin-prettier
```


以下.eslintrc.js

```JavaScript:.eslintrc.js
module.exports = {
  env: {
    browser: true,
    es2020: true,
    node: true,
  },
  extends: [
    'eslint:recommended',
    'plugin:@typescript-eslint/eslint-recommended',
    'plugin:@typescript-eslint/recommended',
    'plugin:prettier/recommended',
    'prettier/@typescript-eslint',
  ],
  globals: {
    Atomics: 'readonly',
    SharedArrayBuffer: 'readonly',
  },
  parser: '@typescript-eslint/parser',
  parserOptions: {
    ecmaVersion: 12,
    sourceType: 'module',
  },
  plugins: ['@typescript-eslint'],
  rules: {
    // お好みで
    'prettier/prettier': [
      2,
      {
        singleQuote: true,
        semi: false,
        arrowParens: 'always',
        parser: 'typescript',
      },
    ],

    '@typescript-eslint/explicit-module-boundary-types': 'off',
  },
}

```


## プラグインをインストール

serverless.ymlに以下を追加

```yaml:serverless.yml
plugins:
  - serverless-webpack
  - serverless-dynamodb-local # DynamoDBを使う場合
  - serverless-offline
```

コマンドを実行

```
# serverless-offlineをインストール
yarn add -D serverless-offline

# (オプション)DynamoDBを使う場合は下記も
yarn add -D serverless-dynamodb-local
npx sls dynamodb install
npx sls dynamodb start
```


※プラグインを読み込む順番には意味があるので、以上のような順番は必須です。

### スタート

```bash
npx sls offline start
```

これで動くと思いますが、ただしバグのためホットリロードがうまく機能しない可能性があります。
その場合は[Serverless Framwork +serverless-offline + Webpackでホットリロードが効かないバグ](https://qiita.com/JDM/items/5fba933477f00478425a)を御覧ください。

一部だけ抜き出すとserverless.ymlを以下を追記します。

```yaml:serverless.yml
custom:
  serverless-offline:
    useChildProcesses: true
```

これで後はJavaScriptで作るのと同じ感覚でTypeScriptによるLambda実装が可能になります！
Deep Double Descent: Where Bigger Models and More Data Hurt 【3 RELATED WORK】【論文 DeepL 翻訳】

この記事は自分用のメモみたいなものです.
ほぼ [DeepL](https://www.deepl.com/home) 翻訳でお送りします.
間違いがあれば指摘していだだけると嬉しいです.

翻訳元
[Deep Double Descent: Where Bigger Models and More Data Hurt ]
(https://arxiv.org/abs/1912.02292)

前: [【2 OUR RESULTS】](https://qiita.com/tomato_/items/c02a91dadd73183b2591)
次: [【4 EXPERIMENTAL SETUP】](https://qiita.com/tomato_/items/aac0febf63eab7cf610a)

# 3 RELATED WORK

### 訳文

Model-wise double descent は, Belkin et al. (2018) によって一般的な現象として最初に提案された. 同様の挙動は, Opper (1995; 2001), Advani & Saxe (2017), Spigler et al. (2018), and Geiger et al. (2019b). その後, double descent 現象の研究が大量に行われてきた. 線形最小二乗回帰の扱いやすい設定で理論的に分析する論文のリストは, Belkin et al. (2019); Hastie et al. (2019); Bartlett et al. (2019); Muthukumar et al. (2019); Bibas et al. (2019); Mitra (2019); Mei & Montanari (2019) を含む. さらに, Geiger et al. (2019a) は, CIFAR-10 上で訓練された畳み込みネットワークにおけるモデルごとの二重降下の予備的な結果を提供する. 我々の研究は, 2 つの重要な点で上記の論文とは異なる. 第一に, 我々は二重降下の概念をパラメータ数を超えて拡張し, “Effective Model Complexity” という統一的な概念の下で訓練手順を組み込むことで, epoch-wise double descent や sample non-monotonicity のような新規な洞察を導く. 訓練時間の増加が複雑さの増加に対応するという考え方は, Nakkiran et al. (2019) でも提示されている. 第二に, 我々は, 様々なアーキテクチャ, データセット最適化手順にまたがる現代のプラクティスのための double-descent の広範かつ厳密なデモンストレーションを提供する. 関連研究の拡張された議論は, 付録 C で提供する。


### 原文

Model-wise double descent was first proposed as a general phenomenon by Belkin et al. (2018). Similar behavior had been observed in Opper (1995; 2001), Advani & Saxe (2017), Spigler et al. (2018), and Geiger et al. (2019b). Subsequently, there has been a large body of work studying the double descent phenomenon. A growing list of papers that theoretically analyze it in the tractable setting of linear least squares regression includes Belkin et al. (2019); Hastie et al. (2019); Bartlett et al. (2019); Muthukumar et al. (2019); Bibas et al. (2019); Mitra (2019); Mei & Montanari (2019). Moreover, Geiger et al. (2019a) provide preliminary results for model-wise double descent in convolutional networks trained on CIFAR-10. Our work differs from the above papers in two crucial aspects: First, we extend the idea of double-descent beyond the number of parameters to incorporate the training procedure under a unified notion of “Effective Model Complexity”, leading to novel insights like epoch-wise double descent and sample non-monotonicity. The notion that increasing train time corresponds to increasing complexity was also presented in Nakkiran et al. (2019). Second, we provide an extensive and rigorous demonstration of double-descent for modern practices spanning a variety of architectures, datasets optimization procedures. An extended discussion of the related work is provided in Appendix C.
Sassの基本的な操作と使い方

# プログラミングの勉強日記
2020年6月14日　Progate Lv.95
JavaScript編が終了したのでSaasを勉強した。次はSQLについて勉強しようと思う。

##Sassとは
　CSSをより便利かつ効率的に書くことができる。SassにはSASS記法とSCSS記法の2種類の書き方があるが、SCSS記法について説明する。拡張子は「.scss」となる。SassのメリットはCSSより記述量を減らすことができ、コードを再利用することができるところだ。

##入れ子構造
　CSSを書き換えることができる。Sassでは1つのセレクタの中に別のセレクタを入れ子にして指定することができる。そのため、同じセレクタを何度も書かなくていい。
　メリット：大規模なサイトになるほど効果が大きくなる。クラス名の変更が楽になる。

```html:html
<div class="header">
  <ul> 
    ...
  </ul>
</div>
```

```css:css
.header{
  width:100%;
}
.header ul{
  padding:10px;
}
```

```sass:sass
.header{
  width:100%;
  ul{ 
    padding:10px;
  }
}
```
 CSSでは.headerを2回書かないといけないが、Sassでは1回書けばいい。Sassの中の.headerの中にるulタグに対するCSSは、「.header ul」と同じ扱いになる。

###入れ子構造の中でhover機能やactive機能を使う
　「セレクタ:hover」を「&:hover」と書きかえることで、hover機能やactive機能を使うことができる。


```css:css
li{
  font-size:15px;
}
li:hover{
  background-color:red;
}
```

```sass:sass
li{
  font-size:15px;
  &:hover{
    background-color:red;
  }
}
```

##特定要素の参照
　ある特定の要素のみの指定はCSSで「要素.クラス名」としていた。Sassの場合は`&`を使うことで簡単に指定することができる。

```html:html
<ul>
  <li>1</li>
  <li class="second">2</li>
  <li class="third">3</li>
</ul>
```

```css:css
li{
  font-size:15px;
}
li.second{
  color:red;
}
```

```sass:sass
li{
  font-size:15px;
  &.second{
    color:red;
  }
}
```

##変数の定義
　`$変数名:値;`で定義することができる。
　メリット：同じ値を繰り返し使えるようになるので、変更が楽になる。
<font color=blue>関数の定義は変数を利用する前に行う。</font>また、変数の利用できる範囲のことを<font color=orange>スコープ</font>という。例えば、`h1{}`内で定義した変数はh1の中でしか使えない。基本は入れ子構造の一番外で定義する。

```sass:sass
$program-page:red;
h1{
  color:program-page;
}
p{
  color:program-page;
}
```

##mixin
　いくつかのコードを1つにまとめて複数個所で簡単に呼び出すことができる機能のこと。同じコードを何度も書く必要がなくなる。mixinは`@mixin mixin名 {コード}`とすることで定義できる。使用するためには、使用したいSassファイルの中で`@include mixin名`とすることで使える。

```css:css
.lesson-1{
  width:300px;
  margin:20px;
  background-color:red;
}
.lesson-2{
  width:300px;
  margin:20px;
  background-color:red;
}
```

```sass:sass
@mixin lesson-card{
  width:300px;
  margin:20px;
  background-color:red;
}
.lesson-1{
  @include lesson-card;
}
.lesson-2{
  @include lesson-card;
}
```

　mixinには様々な情報を引数として渡すことができる。

```sass:引数を使わない場合
@mixin font-data{
  font-size:15px;
  color:red;
}
.card{
  @include font-data;
  color:blue;
}
```
　この例のようにfontを青くしたいときは、includeの下で指定しなければいけない。そこで、引数を使うと便利である。

```sass:引数を使う場合
@mixin font-data($color){
  font-size:15px;
  color:$color;
}
.card{
  @include font-data(blue);
}
```

##色における便利な関数
　darken：色を暗くする関数
　lighten：色を明るくする関数
　rgba：色の不透明を指定する関数

```sass:使い方
color:darken(blue,50%);
color:lighten(blue,50%);
color:rgba(blue,50%);
```

##外部ファイルを読み込む
　importを使う。読み込み先のファイル名の先頭には`_`(アンダーバー)を付ける必要がある。ファイルを読み込むためには`@import "ファイル名"`とする。ファイル名は`_`と拡張子は省略可能である。importは変数をまとめたファイルを作成して、使いたいファイル内で読み込むようにして使う。

```sass:_colors.sass
  $program-color:blue;
```

```sass:stylesheet.sass
@import "colors";
p{
  color:$program-color;
  font-size:15px;
}
```
RaspberryPi 3B+ で SHT31-D の値を読み込む時のエラー

## 今回使用したもの
- メイン：Raspberry Pi 3 Model B+
- 言語　：Python
- センサ：SHT31-D

![CENTER_0002_BURST20200614012610275.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637498/7caa4239-d8c7-8dcc-ec6e-f70dbb03546f.jpeg)


## 参考にしたページ
今回こちらのページを参考にさせていただきました。

[ラズパイを使って温湿度をセンサから取得しよう！](https://qiita.com/nishiwakki/items/877b10517c26a8a4b583)





## 今回の問題点
大変わかりやすかったのですが、そのままコードを書いたところエラーが。

```
Traceback (most recent call last)：
　File "SHT31D.py", line 16, in <module>
　　i2c.write_byte_data(i2c_addr, 0x21, 0x30)
OSError： [Errno 121] Remote I/O error
```

調べてみると、スレーブアドレスが間違っているがためにI2Cが使えていない様子。
※こちらを参考にさせていただきました。
[赤外線アレイセンサAMG8833(Grid-EYE)をRaspberry Piに繋げてデータを取得する．](https://qiita.com/nobuyukioishi/items/499cb694b2d9286afdc3)

```
$ sudo i2cdetect -y 1
```

これをターミナルで打ち込んだところ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637498/1c6199b5-825b-9fe4-1a51-f1ab08b3d99f.png)

表の読み方は今はよくわからないものの、
I2C接続されているデバイスで、そのアドレス44らしいと判明。
14行目を

```
i2c_addr = 0x45
```
から


```
i2c_addr = 0x44
```

に変更したところ動きました。
…エラー、16行目じゃないじゃん…

その後、スペルミスなどありつつも修正したところ動きました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637498/f13d5d6b-336f-939b-53d1-6b814731d5f0.png)

なぜアドレスが違ったのかはまではよくわからなかったので、
今後の課題はその判明ですね。
Neo4j Desktop でデータベースが起動できなくなった時の対応

Neo4j Desktop を使っていると、データベースが起動できなくなる現象を確認した。
特定のバージョンのアップデートの時にそういった問題が起きるという情報も得た。

具体的には、データベースの起動時に以下のようなエラーメッセージがでる。

```
Database failed to start: DB [database-7fe95a79-ffc0-465e-9286-0b194cd6a394] 'v4.0.0' exited with status 'KILLED'. Check the logs
```

ログを見ると

```
エラー: メイン・クラスcom.neo4j.server.enterprise.EnterpriseEntryPointを検出およびロードできませんでした
原因: java.lang.ClassNotFoundException: com.neo4j.server.enterprise.EnterpriseEntryPoint
```

などと出ている。

# 対策

## データベースを複製してみる

Neo4j Desktop では簡単にDBの複製ができるため、起動しないDBを複製して起動してみる。

## データベースのバージョンをあげて見る

複製してみても起動できない場合、データベースのバージョンをあげて見る

## 新しいデータベースを作成する

それでもダメな場合、新しいデータベースを作成して必要なデータ復元して見る。

- データベースの停止
- 新しいデータベースの作成
- データファイルをコピペ

データファイルは以下

```
~/Library/Application Support/Neo4j Desktop/Application/neo4jDatabases/database-xxx/installation-x.x.x/data
```

にあるディレクトリ

- databases
- dbms
- transactions

がそれなので、コピーしたいDBの `database-xxx` 以下のdata フォルダをコピー先の新しいDBの `database-xxx` 以下のdataにコピーする。

## Neo4j Desktop を初期化する

私の場合は、バージョンをあげようとしたら、バージョンアップ自体にも失敗してしまった。

新しいデータベースを作成しようとすると、パスワード設定時に「パスワードを変更できない」というエラーになり作成もできなかった。

おそらく、フォルダの権限的な部分でファイル書き込みに失敗しているように見えた。

最終手段として Neo4j Desktop の初期化をして復活した。

以下手順

1. 全てのデータベースを停止
1. Neo4j Desktop を停止
1. `~/Library/Application Support/Neo4j Desktop` を移動してバックアップ
1. Neo4j Desktop を再度起動。これにより新たに `~/Library/Application Support/Neo4j Desktop` が作成される
1. Neo4j Desktopから新しいDBを作成
1. バックアップした data フォルダを新しいDBのdataフォルダに移植

これでなんとか事なきを得ました。
Hyper-Vでホスト・ゲスト接続する方法

ゲストからホストへの接続、インターネットへの接続をしたい時(固定IPで)、いっつも忘れるので備忘録で。

# Hyper-V設定
  1. 仮想スイッチマネージャーから下記のネットワークスイッチを作成。

    |内容|状態|
    |----|----|
    |接続の種類|外部ネットワーク|
    |ネットワークアダプタ|ホストで利用しているアダプタを選択|
    |管理オペレーティングシステムにこのネットワークアダプターの共有を許可する|チェックする|

  2. 仮想マシンのネットワークアダプターに上記で作成した仮想スイッチを選択。 

# ホスト側
  - ネットワーク接続の一覧に『vEthernet(仮想スイッチ名)』に対して、IPv4のIPアドレスやサブネットマスクを設定する。
  - 実体の利用しているネットワークアダプターである『イーサネット』などでは、IPv4のチェックが外れていること。

# ゲスト側
  - ネットワーク接続の一覧の『イーサネット』に対して、IPv4のIPアドレスやサブネットマスクを設定する。
  - PC - リモートの設定 からリモートデスクトップを許可する。（ファイアウォールの設定）
  - テキトーなフォルダを作ってネットワーク共有する。した後にフォルダを削除。（ファイアウォールの設定）
  - なぜかパブリックネットワークだった時は、設定 - ネットワークとインターネット - 状態 - プロパティ からネットワークプロファイルを『プライベート』に設定。
新規に作成したNuxt.js(TypeScript)でビルド時にエラーが出たので対応

# 状況
Nuxt.js 2.12.2

`yarn create nuxt-app xxx` でNuxt.jsをインストール
※TypeScriptを選択


# 起きたこと

インストールしたてのNuxt.jsプロジェクトで`yarn dev`を実行すると以下のエラーが発生。

```
 ERROR  ERROR in <~~~略~~~>/node_modules/@nuxt/types/config/router.d.ts(14,27):                                                                                                                                                                                                                      nuxt:typescript 01:30:32
14:27 Property 'component' does not exist on type 'RouteConfig'.
    12 |   chunkName?: string
    13 |   chunkNames?: Record<string, string>
  > 14 |   component?: RouteConfig['component'] | string
       |                           ^
    15 | }
    16 | 
    17 | export interface NuxtConfigurationRouter extends RouterOptions {

```

# 対応

package.jsonにて、以下を修正して `yarn install`

```diff:package.json
- "@nuxt/typescript-build": "^0.6.0",
+ "@nuxt/typescript-build": "^1.0.0",
```

現時点(6/14）時点での最新は v1.0.3

`@nuxt/types`のバージョンが原因と推測

`v0.6.6`の`@nuxt/types`は`v0.7.5`
`v1.0.3`の`@nuxt/types`は`v0.7.9`

https://github.com/nuxt/typescript/compare/@nuxt/types@0.7.5...@nuxt/types@0.7.9

# 追記
`create-nuxt-app`の方でアップデート対応は進めている模様。
https://github.com/nuxt/create-nuxt-app/commit/8c218b173e6516d36387e4643af1a9b3e34833a2

# 追記(2020/6/21)
`create-nuxt-app`の`v.3.0.0`が2日前にリリースされていた。
https://github.com/nuxt/create-nuxt-app/releases/tag/v3.0.0

`@nuxt/typescript-build`のバージョンも上がっていました。
https://github.com/nuxt/create-nuxt-app/compare/v2.15.0...v3.0.0#diff-5212c900202683c83d4e8b8d31ccf957R27
【エラー修正】Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.

## 今回の記事の内容
nuxt.jsでの開発中に発生したエラーの対応

## エラーの内容

該当のエラー

```
Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.
```

翻訳すると

```
コンポーネントテンプレートには、ルートエレメントを1つだけ含める必要があります。
```

### エラーの該当コード

``` pages/index.vue
<template>
  <h2>TOP PAGE</h2>
  <img src="/img/sample.jpg" />
</template>
```

あ、これ凡ミスや…

### 修正したコード

つまり`<template>`タグの中のルートエレメントは1つだけにする必要があるのでコードを修正しました。
`div`タグを追加しその中に元々のタグを追加しました。

``` pages/index.vue
<template>
  <div>
    <h2>TOP PAGE</h2>
    <img src="/img/sample.jpg" />
  </div>
</template>
```

## まとめ
ゼロからnuxt.jsを環境構築をして開発してるとたまにタグを忘れがちなので注意せねばと自分への戒めを含めて記事にしました。

完
【Golang】サードパーティー config(go-ini)

#【Golang】サードパーティー config(go-ini)
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

```
package main

/*
iniでConfigの設定ファイルを読み込む。
設定ファイルを作成する。

インストール　済
コンフィグのファイルを読み込む為のパッケージ
https://godoc.org/gopkg.in/go-ini/ini.v1
go get "gopkg.in/go-ini/ini.v1"

congig.iniを作成する
下記、よくある設定
[web]
port = 8080

[db]
name = test.sql
driver = sqlite3

これをGoで読み込む。osopenなんかも使えるが、iniの方が便利
*/

import (
	"fmt"
	//config
	"gopkg.in/go-ini/ini.v1"
	//"gopkg.in/ini.v1"
)

type ConfigList struct {
	Port      int
	DbName    string
	SQLDriver string
}

var Config ConfigList

func init() {
	cfg, _ := ini.Load("config.ini")

	Config = ConfigList{
		Port:      cfg.Section("web").Key("port").MustInt(),
		DbName:    cfg.Section("db").Key("name").MustString("example.sql"),
		SQLDriver: cfg.Section("db").Key("driver").String(),
	}
}

func main() {
	fmt.Printf("%T %v\n", Config.Port, Config.Port)
	fmt.Printf("%T %v\n", Config.DbName, Config.DbName)
	fmt.Printf("%T %v\n", Config.SQLDriver, Config.SQLDriver)
	/*
			int 8000
		    string example.sql
		    string
	*/
}

```
「a duplicate default server for 0.0.0.0:80」という nginx問題の解決方法


同じNGINX サーバーで、二つのサイトを立ち上がりたいところでした。

```
sugoi.website.net
website.net
```
上記の二つドメインです。

/etc/nginx/sites-available/ 

上記のフォルダーにコンフィグファイルも設置しました。nginx サーバー再起動したら、以下エラー出ました；

```
: a duplicate default server for 0.0.0.0:80 in /etc/nginx/sites-enabled/default:2
```

各ドメインのコンフィグファイルです

どうやら、ipv6only=on と default_server は二つ記載されているのはダメでした。

片方で削除してみたら問題なく動けます

```
server {
	server_name sugoi.website.net
        #listen 80 default_server; <----問題1
        listen 80;
        #listen [::]:80 default_server ipv6only=on; <----問題2
        root  /var/www/html/sugoi.website/public;
        passenger_enabled on;
        passenger_ruby /home/ubuntu/.rvm/gems/ruby-2.6.6/wrappers/ruby;
        rails_env production;
	client_max_body_size 100m;

    	location ^~ /assets/ {
        	access_log off;
        	gzip_static on;
        	expires 0;
        	add_header Cache-Control public;
        	add_header ETag "";
        	add_header Access-Control-Allow-Origin *;
        	add_header Access-Control-Request-Method *;
    	}
	

	# Add index.php to the list if you are using PHP
	index index.html index.htm index.nginx-debian.html;
	
}
```

```
server {
        server_name www.website.com;
        listen 80 default_server;
        #listen [::]:80 default_server ipv6only=on; <--問題
        root  /var/www/html/website/public;
        passenger_enabled on;
        passenger_ruby /home/ubuntu/.rvm/gems/ruby-2.6.6/wrappers/ruby;
        rails_env production;
	
	client_max_body_size 100m;

    	location ^~ /assets/ {
        	access_log off;
        	gzip_static on;
        	expires 0;
        	add_header Cache-Control public;
        	add_header ETag "";
        	add_header Access-Control-Allow-Origin *;
        	add_header Access-Control-Request-Method *;
    	}
	

	# Add index.php to the list if you are using PHP
	index index.html index.htm index.nginx-debian.html;
}
```


問題のところがコメントアウトしてみたら、動いてくれました。

忘れなく

```
service nginx restart
```
or

```
service nginx reload
```

しましょう

以上
データのプロット｜Pythonでグラフ描画

# ２本の折れ線グラフ
Pythonで折れ線を描画しました。
点などを描画することをプロット（plot）と言い、データをプロットした図がグラフです。
MatplotlibはPythonのためのオープンソースライブラリになります。
そのMatplotlibをimportして作図してみました。
最後に必ずplt.show()メソッドを忘れないようにします。
### １）同一枠に２本の折れ線

<img width="631" alt="スクリーンショット 2020-06-14 0.28.40.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409451/a9f58107-00ae-71dd-e10a-4aa42464d76f.jpeg">

- サンプルコード1：Python

```Python:matPlt.py
import matplotlib.pyplot as plt

x = [100, 200, 300, 400, 500, 600]
y1 = [10, 20, 35, 50, 80, 130]
y2 = [10, 12, 18, 30, 45, 80]

# プロット箇所を●, 色を赤, 線を '--' に設定
plt.plot(x, y1, marker="o", color ="red", linestyle="--")
# プロット箇所を▼, 色を青, 線を '：' に設定
plt.plot(x, y2, marker="v", color ="blue", linestyle=":")
# 忘れずに
plt.show()

```
### ２）別の枠にそれぞれ折れ線
それぞれのY軸表記に違いが表れていることに注目できますね。
<img width="608" alt="スクリーンショット 2020-06-14 0.47.41.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409451/ea917665-5677-e31b-bde7-cd268775e160.jpeg">

- サンプルコード2：同様にPython

```Python:matPltAx1Ax2.py
import matplotlib.pyplot as plt2

x = [100, 200, 300, 400, 500, 600]
y1 = [10, 20, 35, 50, 80, 130]
y2 = [10, 12, 18, 30, 45, 80]

fig = plt2.figure()

# 1行2列に分割した中の左側
ax1 = fig.add_subplot(1, 2, 1)
# プロット箇所を●, 色を赤, 線を '--' にする
ax1.plot(x, y1, marker="o", color ="red", linestyle="--")

# 1行2列に分割した中の右側
ax2 = fig.add_subplot(1, 2, 2)
# プロット箇所を▼, 色を青, 線を '：' にする
ax2.plot(x, y2, marker="v", color ="blue", linestyle=":")

# 大事です
plt2.show()

```
### ３）がんばったら正弦波も！
プロットすることを応用すればSIN波も描画できます。
<img width="605" alt="スクリーンショット 2020-06-14 1.24.34.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409451/8c702c24-3a3c-9970-acd4-1d018bdf36ce.jpeg">

- サンプルコード３：またもPython

```Python:matPltSinWav.py
import wave
import numpy as np
from matplotlib import pylab as plt
import struct

a = 1  # 振幅
fs = 500  # サンプリング周波数
f0 = 5  # 周波数
sec = 5  # 秒

swav = []

for n in np.arange(fs * sec):
    # サイン波を生成
    s = a * np.sin(2.0 * np.pi * f0 * n / fs)
    swav.append(s)

# サイン波を表示
plt.plot(swav[0:100])
# 大事なとこ
plt.show()

```
もちろんCOS波だって可能です。
<img width="593" alt="スクリーンショット 2020-06-14 1.29.42.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409451/150de5bc-281e-3b05-9cdd-7fa29c11cc26.jpeg">

#まとめ
NumpyとMatplotlibの計算結果を、例えばwavファイルとして書き出せば音源を作成することもできるんじゃないでしょうか。
可能性はいくらでも広がりますね。
GoogleAppsScript でメッセージボックスを出す方法

#はじめに
ネットでぐぐったら100個くらい記事が出てきそうだけど、
出だしで苦戦したので、メモ用に作成。

#GoogleAppsScript でメッセージボックスを出すまでのうんちく

スクリプトエディタはgoogleドライブから右クリックしてその他から開けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655217/dc3632c6-6464-9373-f300-a38e5b785d2b.png)

そんでもってメッセージボックスを出すスクリプトを書いて実行してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655217/f5e9fa0d-521e-4409-9eb7-00f41af52cf1.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655217/a489c609-9fca-63ec-b0ec-cb68395b2b78.png)


動かへんがな！？！？！？

Logger.log() を試してみろってエラーメッセージに出てますので、もしかして今は Browser.msgBoxtって使えないの？
と思いましたが、調べてみるとドライブ直下に作成したスクリプトからは実行できないらしいです。

スプレットシートなどに組み込んだら使えるとのこと。

試しに、スプレットシートからスクリプトエディタを開いてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655217/14bf9c67-abc7-8457-b286-56df4f553f23.png)

さっきと同じスクリプトを書いて実行してみたらエラーにならないけど、何も起きないですね？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655217/906d8c9e-2fda-1832-5963-a5d65e8dd9ee.png)

あ、なるほどこっちに出るんですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655217/ceabaed7-2c0b-9e4f-2aba-18c7237593df.png)

スプレットシート等のgoogle Appsを操作するスクリプトだから、エディタ上ではなく他のApp上でポップアップ等が出せるのですね。
考えてみれば当たり前でした（）

とりあえずGoogleAppsScriptの勉強のスタートラインに立てた気がします。
Swiftのライブラリ「Expression」をインストールしようとしたら「No such file or directory - getcwd (Errno::ENOENT)」が出た

これをやってた時の話。
[Swift実践入門 〜 今からはじめるiOSアプリ開発！ 基本文法を押さえて、簡単な電卓を作ってみよう](https://employment.en-japan.com/engineerhub/entry/2017/05/25/110000#2-Expression%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)


# 表示されたエラー文
```
Traceback (most recent call last):
	6: from <internal:gem_prelude>:2:in `<internal:gem_prelude>'
	5: from <internal:gem_prelude>:2:in `require'
	4: from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems.rb:9:in `<top (required)>'
	3: from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems.rb:9:in `require'
	2: from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/universal-darwin19/rbconfig.rb:11:in `<top (required)>'
	1: from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/universal-darwin19/rbconfig.rb:229:in `<module:RbConfig>'
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/universal-darwin19/rbconfig.rb:229:in ``': No such file or directory - getcwd (Errno::ENOENT)
```

# 調査した内容

[Railsチュートリアルで出会ったエラーとその対処法まとめ](https://qiita.com/m1kw/items/0163c3720bf5b3b89877)
[Rails generate error: No such file or directory - getcwd
](https://stackoverflow.com/questions/28390149/rails-generate-error-no-such-file-or-directory-getcwd)

バックグラウンドでRails Springプロセスが起動しているのが問題のようなので何度かkillしてみるもうまくいかない。。。

# 解決策

1つのターミナルで複数タブ開いて作業していたので、それを消してこの作業用のものだけにしたらインストールできました。
プロセス関連に原因がありそうだけども詳細はよくわかりませんでした。
Neo4j Desktop for Macを使う

# Neo4j Desktop とは
Neo4j を簡単にインストールして便利に使うためのデスクトップアプリ。 

([Neo4j Desktop でデータベースが起動できなくなった時の対応](/euonymus/items/deab2c36af5d974b5f4a) はこちら)

# Neo4j Desktop の機能
- Neo4j Database
- Neo4j Browser
- Bloom
- Neo4j ETL tool
- Terminal
- Neo4jバージョン管理
- プロジェクト管理ツール
- データベース管理ツール（作成、削除、起動、停止、コピー）

# Links

- [Official Download Page](https://neo4j.com/download/)

# インストールとグラフデータベースの準備
自分の情報を入力する必要はあるが基本的に全て無料で利用する事ができる。

<img width="518" alt="Get Neo4j Desktop - Neo4j Graph Database Platform 2020-06-14 01-01-02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1576/2d37c4f4-65fc-1d9a-dfe5-d59308353095.png">

ダウンロードしたらよくある感じで、Applications に入れる

<img width="539" alt="Neo4j Desktop 1.2.9 2020-06-14 01-02-39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1576/c2b5c7b6-d80a-bd1a-7e26-25fd67b437b8.png">

## アプリをダブルクリックして起動する

<img width="867" alt="Neo4j Desktop - 1.2.9 2020-06-14 01-08-04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1576/64b6550a-ecdc-da73-e673-8cd1bb47f33d.png">

- プロジェクトの作成
    - 左上のNewボタンをクリック
- 作成したプロジェクトを選択する
- 新しいデータベースを作成
    - Databases の Add Database をクリック
    - Create a Local Graph をクリック
    - Graph Name, Password を入力する。
    - バージョンを選ぶ
    - Create をクリッック

これで Neo4j のデータベースが作成されます。

ファイルは以下のパスに作成されます。

```bash
~/Library/Application Support/Neo4j Desktop/Application/neo4jDatabases/database-xxx/installation-x.x.x
```

※ database-xxx:  xxx 部分は何かの乱数？
※ installation-x.x.x:  x.x.x の部分は Neo4j のバージョン

## データベースの起動

<img width="784" alt="Neo4j Desktop - 1.2.9 2020-06-14 01-23-20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1576/b23fdf86-2e0a-0e20-c33a-1009dcd989b3.png">

作成したデータベースの `start` ボタンをクリックすると起動する。しばらくは読み込み中マークが表示されるが完全に立ち上がると `start` ボタンが `stop` ボタンになってスタンバイする。

`open` ボタンを押すと Neo4j Browzer が起動する。

# Neo4j の操作

## Neo4j Browzer からの操作

Neo4j Browzer では実際にデータを作成したり、 読み込んだり、グラフで見たり、最短パスを調べたり、チュートリアルを見たり、データをインポートしたり様々な事ができる。

## Managerからの操作

使いたいデータベースの項目欄の右上の「・・・」から `Manage` を選択

<img width="538" alt="Neo4j Desktop - 1.2.9 2020-06-14 01-29-01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1576/79d873c5-9b35-162c-82c3-072cd38d2b3c.png">


Neo4j のバージョンを見たり、状態を見たり、ログを閲覧したり、設定を変更したり、プラグインのインストールをしたり、バージョンを変更したり様々な操作をここから行う事ができる。
テンプレート文字列（アウトプット）

#テンプレート文字列
文字列連結で使用します。

#使い方
例 時を連結したい

```
<script>
  const today = new Date();
  let hour = today.getHours();
  document.write(`${hour}時`);
</script>
```

  document.write(`${hour}時`);
` = バッククォンテーション
Siriに水やりさせてみた 〜ラズパイで遊ぶ〜

# はじめに
暇つぶしに、部屋の片隅で埃かぶってるラズパイに用途を与えることにしました。

観葉植物に適量の水を供給させる。
定期実行もできるけど、Siriに働かせることにした。面白いから。
![スクリーンショット 2020-05-06 5.17.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111797/da660e0f-2f36-acfb-c4ba-3216bb8bfab5.png)

# 準備
- ラズパイ （https://amzn.to/37qCftj）
- リレーモジュール （https://amzn.to/2MTFqQX）
- 電動ポンプ （https://amzn.to/3fmbCZo）
- シリコンチューブ （https://amzn.to/2BWe0r8）
- ACアダプタ （https://amzn.to/3d0b1ei）
- ピグテール （https://amzn.to/30E9oAs）
- ジャンパーワイヤ （https://amzn.to/2YADtOu）
- ワンタッチコネクタ （https://amzn.to/3e0EUw6）

# 配線
概要は上の画像をみてください。

- ポンプを動かすには12Vの電源が必要なため、ACアダプタから電源をとる
→ ラズパイは5Vまでしか供給できない

- ACアダプタからの電線をリレーモジュールにかます。リレーモジュールに繋がったラズパイによりON/OFFをスイッチする

- ラズパイとリレーモジュールの配線
 - GND：GND(PIN6)
 - IN1：GPIO4(PIN7)
 - IN2：GPIO17(PIN11)
 - VCC：5V(PIN2)

- 電線の接続はワンタッチコネクタを使ったが、勿論ブレッドボードを使っても良い

# Siriからポンプを動かす
- ラズパイをhubotサーバにする
→ 参考：https://qiita.com/s_harada/items/c10b1322daec5521b261
　Slackでbotに「ping」と呼ぶと、「PONG」と返してくれるよう設定する

- hubotに水やりスクリプトを仕込む

```javascript
var gpio = require('rpi-gpio');
const PIN_NO = 7;
const DELAY_MS = "800"; // ポンプを動かすミリ秒。ポンプの性能、植物の種類、ホースの長さから計算する

module.exports = (robot) => {
  robot.respond(/水やって/i, async (msg) => {
    msg.reply(`水やりを開始します...`);

    gpio.setup(PIN_NO, gpio.DIR_OUT, () => {
      gpio.write(PIN_NO, false);
      setTimeout(
        function () {
          gpio.write(PIN_NO, true);
          msg.reply(`水やりを終了しました!`);
        },
        DELAY_MS
      );
    });
  });
}
```
これはただただ0.8秒ポンプを動かすだけだが、インタラクティブに供給する水量を調整しても良いし、要調整

- Slackに「水やって」とつぶやくwebAPIを作る
→ 参考：https://qiita.com/ykhirao/items/3b19ee6a1458cfb4ba21

- SiriにwebAPIを叩かせる
→ iPhoneの「ショートカット」アプリからwebAPIを叩くショートカットを作るだけ。
　参考：http://blog.thetheorier.com/entry/apple-shortcuts

以上です
BlenderのMeta-Rigで作成したfbxモデルをUnityにインポートしたがRigのAnimationTypeをHumanoidに適用できないときの対処法

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501431/63e59e5b-f71e-23fc-ed17-c3e75445f95b.png)

## 対処法：
**いつ：**BlenderでのMeta-Rig作成後（可能であればウェイト付け、アニメーション作成前）
**内容：**頭に対応するBone（spine.006）の名前を『Head』（たぶん小文字でも可）に変更する
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501431/0a89567a-faf2-9864-92d9-205a990dc629.png)

そのままGenerate RigでRigを作成し、ウェイト付けやアニメーションを追加するなりしてUnityにインポート後、RigのAnimationTypeをHumanoidに変更し、Applyすると適用される。
※Explorer（ローカルファイル）上でのファイル差し替えではApply時にエラーになってしまっていたので差し替えではなく削除して新規作成などにする必要あり
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501431/d8c456cc-ed78-40e1-acaa-93ce2e56d706.png)
MaixCubeのサウンドデバイスを使う

# はじめに

MaixCubeはM5Stack/M5StickVライクなMaixシリーズのマイコンです。基本的にはMaixPyで使用することが想定されているようですが、現時点ではMaixPyでサウンドデバイスがサポートされていません。

# サウンドデバイス

蘇州にある[Everest Semiconductor社](http://www.everest-semi.com/)の[ES8374](http://www.everest-semi.com/pdf/ES8374%20PB.pdf)というチップが使われているようですが、ネット上の情報が少ないです。

ネットでは、Espressif社のESP32用ドライバーなどの他に、Sipeed社のMF1用のドライバーが見つかりましたので、これを参考にMaixCubeで使えるようにしてみました。

ソースは[こちら](https://github.com/fukuen/MaixCube_ES8374)

サンプル

- [FFTサンプル](https://github.com/fukuen/maixcube-fft-demo)
- [SD録音/再生サンプル](https://github.com/fukuen/maixcube-rec-play-demo)

# まとめ

参考にしたドライバーでは、ネットで見つけたデータシートに記載のないレジスターが設定されていたりして、トライ＆エラーで調整したので、実際のところES8374がどのようなモードで動作しているのかよくわかっていないところがあります。

例えば、PLL2のクロックを262.144MHzに設定して、SYSCTL_THRESHOLD_I2S0_Mに31を設定するといったいI2Sのマスタークロックは何MHzになるの？（１つの仮説は、262.144MHz÷64＝4.096MHz。64＝(31＋1)×2）とか、これは65.536÷16じゃなめなの？とか

Maixシリーズの他のボードで使われているMEMSマイクとDACの組み合わせに比べて若干音質はいいかもしれません。次は音声認識に挑戦したいです。
青空文庫の闇堕ちブックマークレット

[青空文庫](https://www.aozora.gr.jp/) をダークテーマよろしく目に優しい暗めの色調にするブックマークレットです。

```javascript
javascript: (() => { var s = document.body.style; s['background-color'] = '#001020'; s['color'] = '#f0f0e0'; s['font-family'] = '"游明朝","Yu Mincho",YuMincho,"Hiragino Mincho Pro",serif'; s['font-size'] = '1.5rem'; s['-moz-osx-font-smoothing'] = 'grayscale'; s['-webkit-font-smoothing'] = 'antialiased'; document.querySelectorAll('.main_text').forEach((e) => { e.style['line-height'] = '200%'; }); document.querySelectorAll('.sesame_dot').forEach((e) => { e.style['background'] = 'none'; }); })(); void 0;
```

![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248832/f2886d56-cc23-9ea6-4cfc-60f29cd7d187.png)
他にもフォントを明朝体にしたり、大きめにしたり、滑らかにしたり…まぁ小賢しいことを色々やっています。とりあえず [こちら](https://www.aozora.gr.jp/cards/000082/files/49682_51215.html) の作品で試してみてください。
もうひとつ、せっかくなので縦書きにするブックマークレットも作りました。

```javascript
javascript: (() => { var s = document.body.style; s['background-color'] = '#001020'; s['color'] = '#f0f0e0'; s['font-family'] = '"游明朝","Yu Mincho",YuMincho,"Hiragino Mincho Pro",serif'; s['font-size'] = '1.5rem'; s['-moz-osx-font-smoothing'] = 'grayscale'; s['-webkit-font-smoothing'] = 'antialiased'; s['writing-mode'] = 'vertical-rl'; document.querySelectorAll('.main_text').forEach((e) => { e.style['line-height'] = '200%'; }); document.querySelectorAll('.sesame_dot').forEach((e) => { e.style['background'] = 'none'; }); })(); void 0;
```

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248832/1a7907df-c678-a01a-57f9-192d7a9d84c0.png)
カーソルキーでスクロールすると楽です。
ただ、すべての作品で正常に表示されるかと聞かれたら、そんなことはない、と答えるしかありませんね。

【その他の青空文庫用ブックマークレット】
* [青空一行文庫ブックマークレット](https://qiita.com/mimonelu/items/26288a6347e958f500af)
* [青空文庫スピーカー](https://qiita.com/mimonelu/items/b239a82f67a55bbb5c45)
go修行2日目 変数定数



# 変数
 - `var`を使った変数宣言は関数の外でも使える
 - `xi`などの短縮版の変数宣言は関数の中でしか使えない 

```golang
package main

import "fmt"

var (
	i    int     = 1
	f64  float64 = 1.2
	s    string  = "test"
	t, f bool    = true, false
)

func main() {
	fmt.Println(i, f64, s, t, f)

	xi := 666
	xf64 := 66.6
	xs := "aaa"
	xt, xf := false, true
	fmt.Println(xi, xf64, xs, xt, xf)
	fmt.Printf("")
}
```

出力

```
yuta@DESKTOP-V36210S:/mnt/c/gostudy$ ./test
1 1.2 test true false
666 66.6 aaa false true
yuta@DESKTOP-V36210S:/mnt/c/gostudy$ 
```


# 定数

- `const`で定数を指定する
- ユーザー、パスワードなどは定数がいいのだと思yyk

```golang

package main

import "fmt"

const Pi = 3.14

const (
	username = "user"
	password = "pass"
)

func main() {
	fmt.Println(Pi, username, password)
}
```

出力

```
yuta@DESKTOP-V36210S:/mnt/c/gostudy$ ./test
3.14 user pass
```

# 数値型の演算
```golang

package main

import "fmt"

func main() {
	fmt.Println("---数値型---")
	var (
		u8  uint8     = 255 //32bitか64bit環境かでの環境依存
		i8  int8      = 127 //
		f32 float64   = 0.2
		c64 complex64 = -5 + 12i
	)
	fmt.Println(u8, i8, f32, c64)
	fmt.Printf("type=%T value=%v", u8, u8)
	fmt.Println()

	fmt.Println("---演算---")
	fmt.Println("1 + 1 =", 1+1)
	fmt.Println("10.0 / 3 =", 10.0/3)
	fmt.Println("10 % 3 =", 10%3)
	fmt.Println()

	fmt.Println("---シフト演算---")
	fmt.Println(1 << 0) //0001 → 0001
	fmt.Println(1 << 1) //0001 → 0010
	fmt.Println(1 << 2) //0001 → 0100
	fmt.Println(1 << 3) //0001 → 1000
	fmt.Println()
}
```


出力

```
---数値型---
255 127 0.2 (-5+12i)
type=uint8 value=255
---演算---
1 + 1 = 2
10.0 / 3 = 3.3333333333333335
10 % 3 = 1

---シフト演算---
1
2
4
8

```
Node.jsでrequestモジュールを使ってHTTPリクエストを実行する

# Node.jsでHTTPリクエストを使う


前回の[記事](https://qiita.com/takashi53/items/69d4395c70d76ddbb0ab)のとおり、Raspberry piでNode.js環境を整えました。


## requestモジュールを準備する

このページを参考にしました。

https://garafu.blogspot.com/2017/05/node-http-httpss-request.html#postreq


requestモジュールをインストールする。

```shell-session
pi@raspberrypi:~ $ npm install request
```

バージョンを確認します。

```shell-session
pi@raspberrypi:~ $ npm view request version
2.88.2
```


## requestモジュールを利用してPOSTメソッドを実行する

HTTPリクエストのPOSTメソッドを試してみます。

コードは、この[記事](https://garafu.blogspot.com/2017/05/node-http-httpss-request.html#postreq)を参考にしました。


上記記事のソースを利用して、URLは[このサーバ](https://httpbin.org/#/HTTP_Methods/post_post)を利用しています。

post.jsというファイル名で下記ソースコードを用意しました。

```js
var webclient = require("request");

webclient.post({
  url: "https://httpbin.org/post",
  headers: {
    "content-type": "application/json"
  },
  body: JSON.stringify({foo: "bar"})
}, function (error, response, body){
  console.log(body);
});
```

さて、実行してみます。

正常に結果が返ってきました。
originのところはIPアドレスをマスクしています。

```shell-session
pi@raspberrypi:~/myapp $ node post.js
{
  "args": {},
  "data": "{\"foo\":\"bar\"}",
  "files": {},
  "form": {},
  "headers": {
    "Content-Length": "13",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "X-Amzn-Trace-Id": "Root=1-5ee4dfca-46fbf47877b927fa5750c822"
  },
  "json": {
    "foo": "bar"
  },
  "origin": "**.**.**.**",
  "url": "https://httpbin.org/post"
}
```


## まとめ

今回は、requestモジュールをインストールして、
HTTPリクエストのPOSTメソッドを試してみました。

次は、IFTTTのWebhookを試してみようと思います。

→
Elasticsearch index メモ

やりたいこと。


次のドキュメントを効率的に収納・検索したい
===

```
DocumentID: PedID

{
    owner:[
      {key: "Mother", age: 30},
      {key: "Father", age: 29},
      {key: "Xxx", age: 3},
    ]
}

```

検討した手段
===

Nested Datetype
----
> The nested type is a specialised version of the object datatype that allows arrays of objects to be indexed in a way that they can be queried independently of each other.

内部的に別のドキュメントができるとのことで、今回は条件に合わない


[Flattened Datetype](https://www.elastic.co/guide/en/elasticsearch/reference/current/flattened.html#flattened)
----
最高です。ただし X-Pack でした。。。

[Sparse vector datatypeed](https://www.elastic.co/guide/en/elasticsearch/reference/current/sparse-vector.html#sparse-vector)
----
最高です。ただし X-Pack


いけそうな手段
====
今回のケースだと、 name は known かつバリエーションも int 程度だと見積もって良かった。

そのため

```
DocumentID: UserID

{
    family:[
      0x00000000_0000001c,
      0x00000001_0000001b,
      0x00000000_00000003
    ]
}

```

と Encoding しておいて、検索する際に range query で検索すればよさそうだ。
（Structured Log 方式）


本当は 後ろ 4 byte を term position に encoding できるとよさそうだが、
for文の中でリストを変更する

## 目的
* リストをfor文で回しながら特定条件で前記リストを変更する場合に、バグってしまったため原因を調べる。
* 上記対策のベストプラクティスを記述する。

## 結論
* 公式嫁！

>注釈 ループ中でのシーケンスの変更には微妙な問題があります (これはミュータブルなシーケンスのみ、例えばリストで起こり得ます)。 どの要素が次に使われるかを追跡するために、内部的なカウンタが使われており、このカウンタは反復のたびに加算されます。 このカウンタがシーケンスの長さに達すると、ループは終了します。 このことから、スイートの中でシーケンスから現在の (または以前の) 要素を除去すると、(次の要素の位置が、既に処理済みの現在の要素のインデックスになるために) 次の要素が飛ばされることになります。 同様に、スイートの中でシーケンス中の現在の要素以前に要素を挿入すると、現在の要素がループの次の週で再度扱われることになります。 こうした仕様は、厄介なバグにつながります。 これは、シーケンス全体のスライスを使って一時的なコピーを作ることで避けられます。

```python:公式.py
for x in a[:]:
    if x < 0: a.remove(x)
```
 
## 経緯
* AtCoderで[ARC006C-積み重ね](https://atcoder.jp/contests/arc006/tasks/arc006_3)を解いている際にfor文でバグってしまった。
* for文で与えられたリストを回しながら、リストを弄ろうとしてみたがうまくいかない。
* 対処を考えたもののスマートな方法が思いつかなかったため調べてみたら、公式にしっかりと書いてあった。
* [公式8.3 for文](https://docs.python.org/ja/3/reference/compound_stmts.html)を参照した。
  

### どう書くとバグる？どうすればよい？

#### これはバグる

for文で回している`foo_list`の要素をシーケンス中に削除してしまっている。
これにより、リストが最後まで回されない場合がある。

```python:bug.py
for i in foo_list:
  if thres >= i:
      foo_list.remove(i)
```

#### バグを回避しようと思うとこう書きたくなる

まず、for文全部回す。消したい要素をメモする。メモした内容をforで回して削除する。

**めんどくさい**


```python:no_good.py
memo = []
for i in range(len(foo_list)):
    if thres >= foo_list[i]:
      memo.append(foo_list[i])

for item in memo:
    foo_list.remove(item)
```


#### 公式を参照して書くとすっきり書ける

for文で指定するリストを全範囲スライスすることで、新規にリストオブジェクトを作る
copyしたいときに`a = foo_list[:]`ってするのと同じですね

```python:beautiful.py
for i in foo_list[:]:
  if thres >= i:
      foo_list.remove(i)
```

ちなみに、上記の様に単にフィルタするたけなら、下記@shiracamusさんのご指摘のように内包表記のほうが良いです。
じゃあいつ使うねんって話は改めて加筆しようと思います。

>
@shiracamus 
リストからremoveするよりも、内包表記で新しいリストを作った方が短時間で処理が終わりませんか？

```python
foo_list = [i for i in foo_list if thres >= i]
```
Angular+angular-google-chartsでサクッとグラフを描画してみる

初投稿です。
不備・マナー違反等あればコメントいただけると幸いです。

# 背景
個人開発でチャート描画できるようにしたいなとチャートライブラリを調べていたところ、@Stathamさんの[JavaScriptのチャートライブラリのデモまとめ](https://qiita.com/Statham/items/ce1a9237fc0b6cbc79e8)という記事に出会い、[Google Charts](https://developers.google.com/chart/interactive/docs/gallery)に興味を持ちました。

またGoogle Chartsには、（普段仕事で使いなれている）angular用にカスタマイズされたangular-google-chartsというライブラリがあるようなので、今回はこれを使ってサクッとグラフ描画しちゃいたいと思います。

# 環境
Angular Cli、Node.jsが導入されている前提で進めます。
versionは以下のとおりです。

```
> ng version

     _                      _                 ____ _     ___
    / \   _ __   __ _ _   _| | __ _ _ __     / ___| |   |_ _|
   / △ \ | '_ \ / _` | | | | |/ _` | '__|   | |   | |    | |
  / ___ \| | | | (_| | |_| | | (_| | |      | |___| |___ | |
 /_/   \_\_| |_|\__, |\__,_|_|\__,_|_|       \____|_____|___|
                |___/
    

Angular CLI: 8.3.26
Node: 10.16.1
OS: win32 x64
Angular: 8.2.14
...(省略
```

# プロジェクトの作成
```
> ng new google-charts-sample
```
初期設定を色々と聞かれますが、今回はすべてdefaultで進めていきます。(Enter連打
完了したら作成したプロジェクトに移動してローカルで起動します。

```
> cd google-charts-sample
> npm start

(省略)
** Angular Live Development Server is listening on localhost:4200, open your browser on http://localhost:4200/ **
```

[ローカルを開き](http://localhost:4200/)Angularのデフォルトの画面表示ができれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241229/03cd83bd-0dc4-2bf6-0ce4-36b39acc048d.png)

# angular-google-chartsのinstall
```
> npm install angular-google-charts
```

```app.module.ts
import { GoogleChartsModule } from 'angular-google-charts'; //追加
(中略)
  imports: [
    ...,
    GoogleChartsModule // 追加
  ],
(中略)

```

# チャート描画用コンポーネントの作成
今回はpie-chartを作成していきます。

```
>  ng generate component pie-chart
```

pie-chartを表示するため、app.componentのhtmlを以下のように書き換えます。

```app.component.html
<h1>{{ title }}</h1>

<app-pie-chart></app-pie-chart>
```

続いて、pie-chartのhtml、tsを編集していきます。

```pie-chart.component.html
 <google-chart [title]="title" [type]="type" [data]="data" [columns]="columnNames" [options]="options"></google-chart>
```

```pie-chart.component.ts
import { Component } from '@angular/core';

@Component({
  selector: 'app-pie-chart',
  templateUrl: './pie-chart.component.html',
  styleUrls: ['./pie-chart.component.css']
})
export class PieChartComponent {

  title = 'How Much Pizza I Ate Last Night';
  type = 'PieChart';
  data = [
    ['Mushrooms', 3],
    ['Onions', 1],
    ['Olives', 1],
    ['Zucchini', 1],
    ['Pepperoni', 2],
    ['Green Pepper', 2]
  ];
  columnNames = ['Topping', 'Slices'];
  options = {
    'width': 400,
    'height': 300
  };

  constructor() { }

}
```
以下のような画面表示になってれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241229/a2592b13-cdbc-eb2f-6bbd-fb20717da8a8.png)

# まとめ
angular-google-chartsのおかげで所要時間1時間もかからずグラフが作成できました。
サードパーティ製のライブラリなので製品用には向かないかもしれませんが、
個人開発用としては十分だと感じました。

最後までお読みいただきありがとうございました！

# 参考
[angular-google-charts](https://www.tutorialspoint.com/angular_googlecharts/index.htm)
[Google Charts](https://developers.google.com/chart/interactive/docs/gallery)
@Statham　[JavaScriptのチャートライブラリのデモまとめ](https://qiita.com/Statham/items/ce1a9237fc0b6cbc79e8)
RailsでMySQL8を使うときに出てくる認証方式エラーのスマートな回避方法

RailsでMySQL８を使おうとするとこのようなエラーが発生します。

```
Plugin caching_sha2_password could not be loaded: /usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory
```

ググると原因と対処方法はたくさん出てきますが、どれも大体my.cnfを設定するという内容のものです。

もっとシンプルに対応できないのか？調べたところcommandとして設定を渡せば良いということが分かりました。
docker-composeだとこんな感じです。
[MySQLのDockerHub](https://hub.docker.com/_/mysql)にちゃんと書いてありました。

```
services:
  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
```
Android EmulatorがFold設定に対応したので早速試してみた

# はじめに
- Android11ではフォルダブル端末の折り曲げている角度を取得できるヒンジ角度センサをサポートします。
- これまでのエミュレータでは実験的機能として折り曲げの調整ができる機能が追加されましたが、30.0.14(たしか)あたりで密かに一旦消えた状態となりました。
- 6/12にリリースされた、Emulatorの30.0.17で対応したようなので、少し試してみました。

# 参考
- https://androidstudio.googleblog.com/2020/06/emulator-30017-canary.html

# エミュレータにFold機能を対応させる
- 環境
    - Android Emulator 30.0.17 (SDKManagerで取得)
    - Android Studio 4.2 Canary1
    - その他、Android11のイメージのEmulatorなど
- エミュレータの設定
    - エミュレータのセンサ関連の挙動は、`~/.android/avd/avdName.avd/config.ini`で設定できます。
    - リリースノートにのっとって、下記を追加したいエミュレータに追加します。
        - 注：ここで、１行目のhw.sensor.hingeについてはリリースノートの記載に載っていないので追加しました。これがないと、fold機能が使えません。
        - **注(7/13 追記)：公式のリリースノートをみたらいつのまにか追加されていたので、そちらの通りでも多分大丈夫です。**

```
hw.sensor.hinge = yes
hw.sensor.hinge.count = 2
hw.sensor.hinge.ranges = 0-360,0-360
hw.sensor.hinge.defaults = 180,180
hw.sensor.hinge.areas = 0-987-1440-0, 0-1974-1440-0
hw.sensor.posture_list=1, 2, 3, 4
hw.sensor.hinge_angles_posture_definitions=0-30 & 0-30, 30-150 & 30-150, 150-210 & 150-210, 210-360 & 210-360
```
- 上記の設定だと、三つ折り可能な端末となります。なかなか想像つきませんが。
    - リリースノートによると、3まで対応している様です。
- posture_listが折りたたみの状態を表す番号のリスト
    - 多分、[getPosture](https://developer.android.com/reference/androidx/window/DeviceState#getPosture())で取れるもののはずです。
- hinge_angles_posture_definitionsが折りたたみの状態とヒンジ角度の対応を表すリストという感じだと思います。
    - 例えば、上記の例なら、二つのヒンジ角度がそれぞれ0-30°なら、[POSTURE_CLOSED](https://developer.android.com/reference/androidx/window/DeviceState#POSTURE_CLOSED)という感じだと思います。

# 実際に動かしてみた
まあ、公式の画面イメージそのままですが、大体こうなります。
<img width="507" alt="スクリーンショット 2020-06-13 23.49.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151249/bf756eb3-8060-cfdb-973c-58f7107c6985.png">

# センサ情報とれるかなと思って試してみた
- ヒンジ角が取れるなら、その数値も取れるかな？と思って、とりあえずサンプルアプリを作ってみました。
- と言っても、FABをタップすると利用可能なセンサの一覧をログ出力するだけです。

```kotlin

        findViewById<FloatingActionButton>(R.id.fab).setOnClickListener { view ->
            val sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
            val sensors = sensorManager.getSensorList(Sensor.TYPE_ALL)
            Log.d("SENSOR_TEST", sensors.toString())
        }
```

→結果として、ヒンジ角度センサは載ってこず。まだシステムイメージの方が対応していないのか（？）、それとも何か抜けている設定があるのか。さらに追跡してみようと思います。
→ 2020/7/9追記 [beta2で動くようになりました](https://qiita.com/etctaro/items/058aa8495f3457aae34e)

# おわりに
- ということで、エミュレータに追加されたFold設定を有効にするところまでを試してみました。
- `hw.sensor.hinge`の設定も必要となりますので、利用の際にはご注意ください。
PyCharmでmatplotlibのグラフ出力

#PyCharmで散布図の描画
PythonのIDE（統合開発環境）である
PyCharmを使ってmatplotlibのグラフを出力します。
そのために最後にplt.show()メソッドを実行します。
これがなければ出力はされませんのでお気をつけください。

(PyCharmのインストール等の情報はページ下へございます)
<img width="632" alt="スクリーンショット 2020-06-13 23.33.06.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409451/f5b92209-7a00-0f15-c393-524fe90bf222.jpeg">

#####Python サンプルコード

```Python:plotShow.py
import numpy as np
import matplotlib.pyplot as plt

# 乱数を発生させる
x = np.random.rand(100)
y = np.random.rand(100)

# 散布図を描画
plt.scatter(x,y)
plt.show()
```
- PyCharmのダウンロード
[PyCharmのダウンロードページ](https://www.jetbrains.com/pycharm/download/#section=windows)
- PyCharmの日本語化
[PyCharmの日本語化設定-Qiita(Hirotaka Suetakeさん)](https://qiita.com/suecharo/items/4d8774b43b0213527f9f)
[AWS] Aurora Serverless とは何か

#Auroraとは
AWSの提供するRDBサービス。
簡単なことは過去の記事にまとめています。[[AWS] Amazon Auroraについて](https://qiita.com/oudon722/items/db43a9e5a1a5bcc02f23)

#Aurora Serverlessとは
Aurora用のAutoScaling設定のこと。アプリケーションのニーズに応じてコンピューティング性能を変更してくれる。

例：期間限定セールでDBへのクエリが一時的に増加する場合、わざわざDBサーバーを新しく作らなくてもアクセスが多くなると自動で作ってくれる。

#仕組み
DBインスタンスクラスを**指定せず**にデータベースエンドポイントを作成できる。そしてそのエンドポイントは**プロキシフリート※**に接続される。このプロキシフリートでオートスケーリングが行われる。

※直訳すると「代理グループ」って感じなので代わりにエンドポイントに接続するんだなと言うことはわかるのですが、実態が何なのかがよく分かりません。詳しい方はコメント欄で教えていただければ幸いです。
#メリット
**・簡素化**
どれくらいのアクセスがあって、そのためにはこれだけサーバーを増やして、、ということを考えなくても自動でやってくれる。

**・スケーラブル**
必要に応じてDBサーバのコンピューティング性能とメモリ容量をスケールしてくれる。

**・コスト効率がいい**
消費したデータベースリソース分のみの料金を支払うので効率がいい。

**・可用性の高いストレージ**
Auroraと同じ6ウェイレプリケーション。

#ユースケース
**・不定期使用のアプリケーション**
１日に数分しか使用しないアプリケーションの場合、消費したデータベースリソース分のみの料金を払えば良いためお得。

**・新規アプリケーション**
必要なインスタンスサイズが分からないので、オートスケーリングで様子をみることができる。

**・予測不能なワークロード**
アクティビティのピークが予想しづらい時に自動でスケールングしてくれるため便利。

**・開発およびテスト用のデータベース**
開発中はデータベースを使用するが、夜間や休日は使用しないため不使用時にDBサーバを自動シャットダウンしてくれて便利。

#参考
AWS ドキュメント
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/aurora-serverless.html
【Cloud Front】へのアップロード方法

## はじめに
転職生活2日目は、１日目に依頼を受けていたHPの[CloudFront](https://aws.amazon.com/jp/cloudfront/)への移行作業の準備を行いました。

## つまずいた事
- CloudFrontの利用方法
- CloudFrontを利用するにあたり、S3へアップロードをする際のコマンドがわからなかった
- S3のディストリビューションの設定がうまく行かなかった


[CloudFront](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/Introduction.html)自体初耳だったので、教えてもらった事を端的に書いていくと以下です。

## CloudFront
- スピードと安全性の高さが魅力の「高速コンテンツ配信ネットワーク機能」である
- 静的ホームページを配置する事で、今まで払っていたサーバー代等のコストダウンに繋がる
- 静的ホームページの場合、index.htmlを配置しておくことで、フレームワークを利用しなくても簡単にWeb上に反映する事ができる

他にも配信に関する遅延は少なかったり、利用料金は使った分だけ支払う従量課金制で、無料利用枠として毎月50GBのデータ送信等が1年間無料は魅力的だなと感じました。

利用方法は、[こちら](https://www.wakuwakubank.com/posts/669-aws-cloudfront/)の記事を参考に勉強させていただきました。

## S3へアップロードをする際のコマンド
手順
①AWS CLI のインストール
②追加ファイルを作成
③パスを通す
④S3へアップロードする

以上でアップロードができました。

### ①[AWS CLI バージョン2](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-install.html)をインストール
[こちら](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-install.html)を参考にインストールします。

### ②追加ファイルを作成
格納予定のディレクトリに以下を追加

```ruby:.sample.sh
#!/bin/bash
set -e
AWS_ACCESS_KEY_ID=[Access key ID] AWS_SECRET_ACCESS_KEY=[Secret access key] aws s3 sync --exclude "*.DS_Store" public/ s3://[該当のドメイン]
AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= aws cloudfront create-invalidation --distribution-id [distributionのid] --paths /index.html /index.css
#distributionのidは、CloudFront Distributionsから確認できるIDを入力
```

※Git Hub上にAccess keyとSecret access keyをpushしないように、gitignoreで除外処理は必須

```ruby:.gitignore
/.sample.sh
```

### ③パスを通す
```ruby:ターミナル
ls -la
#該当ファイルのパス状況を確認
-rw-r--r--   1 ******  staff   360  7  3 16:46 .sample.sh
#パスが通っていない
```

```ruby:ターミナル
chmod +x .sample.sh
#パスを通すコマンド
```

```ruby:ターミナル
ls -la
#該当ファイルのパス状況を確認
-rwxr-xr-x   1 ******  staff   360  7  3 16:46 .sample.sh
#xが追加された事がわかります
```
```ruby:ターミナル
source ~/.bash_profile
#これでパスが通りました
```

```ruby:ターミナル
./.sample.sh
```
上記コマンド入力後、uploadすることができました。

## さいごに
自分が学んだ事以外の知識が必要になるため、調べる事は大切だと感じました。
また、パスを通す際にsourceコマンドを利用のは勉強していましたが、いざ実際に仕事として考えると抜けてしまう事が多いので、忘れないよう注意していこうと思います。