OmniAICreator/Qiita-1.07M huggingface dataset:
FacebookページとInstagramの連携が出来ないとき

FacebookページとInstagramを連携して、Instagramの投稿をFacebookページにも投稿したい場合があると思います。

Instagramのビジネスアカウントを作る手順を進めていくと、Facebookページ選択の画面が出ると思います。

この時に、既に別のビジネスの一部になっているという内容のエラーが出て、連携したいページが設定できないという場合があります。

どうやらFacebookページの所有者しかInstagramのビジネスアカウントに連携出来ないようです。

ただ単に、Facebookページの管理人を追加して、追加された人がInstagramのビジネスアカウントを連携しようとしてもできないようです。

今回、Facebookページの所有者を確認したら、私のビジネスアカウントの名前になっていました。

あまりFacebookのビジネスマネージャーを使っていなかったので、しっかり忘れていました。
今回、ビジネスマネージャーの設定で、問題のFacebookページの管理権限と所有者としての表示が消えるように削除しました。

Instagramのビジネスツールで、ショッピングを使い際は、所有権があるFacebookページが必要とありました。
だから、管理者ではなく、所有者としての権限があるFacebookページでないと、Instagramに連携出来ないと思いました。

##ビジネスマネージャーの設定がある場合
Facebookページの所有者の欄で、名称がビジネスマネージャーにある名前の場合、ビジネスマネージャーでも管理人に追加した人を追加しないと、Instagramに連携する際に、エラーになります。

ビジネスマネージャーを使っていると、新規にFacebookページを作ると、自動的にビジネスマネージャーにIDが割り当てられて所有者として設定されるようです。
そのため、Facebookページの設定の画面で管理者権限の追加をするだけでは、不十分です。
ビジネスマネージャーの方でも、ユーザーを追加して管理権限を付加しておかないと、Instagramに連携する際や、広告を掲載する際に支障が出るようです。

##参考リンク
Facebookビジネスマネージャーの設定方法などは、こちらの記事が参考になります。
https://blog.comnico.jp/we-love-social/facebook-business-manager
RSpecの `contain_exactly` 相当でハッシュを検証する方法に悩んでしまった話

ハッシュの `{ a: 1, b: 2 }` と `{ b: 2, a: 1 }` が、*順序を無視して*完全に一致するかテストしたかった。

## `contain_exactly`

RSpecには順序を無視してくれる `contain_exactly` があるが、これは配列に対して使うものらしい。
https://relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/contain-exactly-matcher

> The contain_exactly matcher provides a way to test arrays against each other in a way that disregards differences in the ordering between the actual and expected array.

ハッシュでやってみると実際おかしなことになって失敗する。

```
     Failure/Error: expect({ a: 1, b: 2 }).to contain_exactly({ b: 2, a: 1 })
     
       expected collection contained:  [{:a=>1, :b=>2}]
       actual collection contained:    [[:a, 1], [:b, 2]]
       the missing elements were:      [{:a=>1, :b=>2}]
       the extra elements were:        [[:a, 1], [:b, 2]]
```

エラーメッセージから考えると、一応 `contain_exactly` 側のハッシュを `*` で展開すればテストが通る。

```ruby
require 'rspec/core'

RSpec.describe 'Hash' do
	it 'contains exactly' do
		expect({ a: 1, b: 2 }).to contain_exactly(*{ b: 2, a: 1 })
	end
end
```

しかしもっと単純な方法があった。

## 結論
普通に `eq` で検証すればいい。

```ruby
require 'rspec/core'

RSpec.describe 'Hash' do
	it 'contains exactly' do
		expect({ a: 1, b: 2 }).to eq({ b: 2, a: 1 })
	end
end
```

内容が異なる場合も、エラーメッセージで差分を出してくれるのでわかりやすい。

```
     Failure/Error: expect({ a: 1, b: 2 }).to eq({ b: 2, a: 3 })
     
       expected: {:a=>3, :b=>2}
            got: {:a=>1, :b=>2}
     
       (compared using ==)
     
       Diff:
       @@ -1,3 +1,3 @@
       -:a => 3,
       +:a => 1,
        :b => 2,
```

## 理由
参考：https://docs.ruby-lang.org/ja/latest/class/Hash.html

リファレンスマニュアルに明記されてはいないが、ハッシュは `==` で比較するときに**要素の順序は考慮しない**。

> 自身と other が同じ数のキーを保持し、キーが eql? メソッドで比較して全て等しく、 値が == メソッドで比較して全て等しい場合に真を返します。

```ruby
{ a: 1, b: 2 } == { b: 2, a: 1 } #=> true
```

なので、 `==` で比較を行う `eq` を使えばいい。

---

ただし、ハッシュは要素の順序を保持しているので、配列に変換したりループを回したりすると違いが現れる。

> ハッシュに含まれる要素の順序が保持されるようになりました。ハッシュにキーが追加された順序で列挙します。

```ruby
{ a: 1, b: 2 }.to_a == { b: 2, a: 1 }.to_a #=> false
```
[Unity,VFX]SDF(符号付き距離場)を使ったVFXパーティクル芸


#SDF(Signed Distance Field)を使ったパーティクルによるメッシュ形成術
制作物は以下のようなものになります。SDFを使うことで、パーティクルが任意の地点をぐるぐると循環するようになります。
SDFが何たるかはここでは説明しませんのであしからず。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">SDFを使ったパーティクル芸、、、。<a href="https://twitter.com/hashtag/unity3d?src=hash&amp;ref_src=twsrc%5Etfw">#unity3d</a> <a href="https://twitter.com/hashtag/VFX?src=hash&amp;ref_src=twsrc%5Etfw">#VFX</a> <a href="https://twitter.com/hashtag/SignedDistanceField?src=hash&amp;ref_src=twsrc%5Etfw">#SignedDistanceField</a> <a href="https://t.co/DeQdPBhLKf">pic.twitter.com/DeQdPBhLKf</a></p>&mdash; YU@PrizmaCombo (@yarikomivr_com) <a href="https://twitter.com/yarikomivr_com/status/1166278883164880896?ref_src=twsrc%5Etfw">August 27, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

###制作環境
Unity2019.1.0f2
※PackageManagerよりBurst、Mathmatics、Visual Effect Graphをインポートしておいてください。 


#UnityにはまだSDFをベイクする機能はありません
残念ながらSDFをベイクする公式ツールは提供されていないようですので、[こちら](https://github.com/xraxra/SDFr)からSDFrというプラグインをお借りします。
**Package化されてないので、Assets/以下のフォルダを丸ごとプロジェクトに放り込んでください。**


#SDFrの使い方
![SDF1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383267/7af7035f-162b-42a0-a739-236ec732bf77.png)

ベイクしたいオブジェクトに**SDFbaker**をアタッチします。使用したボタンは赤線をつけておきました。

- Dimensions・・・ベイク後のTexture3Dのサイズになります。解像度はここを弄ってください。32^3で十分だと思います。
- Encapsulate・・・モデルがちょうど収まるバウンドを設定してくれます。
- Bake・・・ベイクします。書き込み先が設定されていなくてもファイルを作成してくれます。
- Preview・・・ベイク結果を元のモデル位置に表示してくれます。このプレビューがうまくいってないとパーティクルが荒れます。

###Tips
**モデルデータのRead/Write Enabledをオンにしておきます。**これをしておかないと以下のようにベイク結果が破綻します（二枚目はSDF Flipをオンにした状態）。この状態のSDFデータをVFXに流し込むと、パーティクルが特定の場所に滞留してしまい、うまくモデルを形成してくれません。
![SDF2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383267/08afb685-e638-58df-9382-00d83a653023.png)
![SDF3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383267/a4dc7d44-7ad5-8c5f-6d6c-b3347d2d7025.png)

#Visual Effect Graphのレシピ
![SDF4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383267/78c7f1da-c3a6-2117-a18b-1f03798fabe5.png)

#将来的には公式がベイク機能を提供するでしょう。
この記事と使用したプラグインは近い将来obsoleteされると思いますが、それまでの間はこの方法でSDFによるパーティクル芸を頑張りましょう！！！
###参考文献
SDFr by xraxra, https://github.com/xraxra/SDFr
Rails ターミナルコマンド

・rake db:create   新しくデータベースを作成する方法

・rails g controller　　コントローラの作成
　「rails g controller コントローラ名」　
  作成したいコントローラの名前を後ろに付けて実行する

・rails d controller 　 コントローラの削除
　「rails g controller コントローラ名」
  コントローラ名を間違えて作成してしまった場合

・rails g model  モデルの作成
　マイグレーションファイルはテーブルの設計図
　　カラム名を追加できる

・rake db:migrate
  未実行のマイグレーションファイルの実行をできる
  マイグレーションファイルを編集した時などに使う
Gradle でサブディレクトリを含むマルチプロジェクトを構成する 

# 概要
サブディレクトリによる階層構造がある場合で、Gradleのマルチプロジェクトを構築する方法になります。
下記、記事を参考にさせていただきました。
https://qiita.com/shiena/items/371fe817c8fb6be2bb1e

# 環境
- Java 8
- Gradle 5.6
- IntelliJ IDEA Ultimate 2019.2
- Windows10

# コードサンプル
サンプルコードを Github にアップしています。
https://github.com/tYoshiyuki/java-gradle-multiproject

# 構成例
以下のような構成を想定しています。

|プロジェクト名|説明|
|:--|:--|
|master|ルートプロジェクト|
|common/main-lib|共通ライブラリ その１|
|common/sub-lib|共通ライブラリ その２|
|app/api|個別のアプリケーションサンプル|
|app/web|個別のアプリケーションサンプル|
|app/batch|個別のアプリケーションサンプル|


# 設定方法
root フォルダにてプロジェクト全体の Gradle 設定を行います。
includeFlat にて同階層にある common, app フォルダを指定します。
その後、include にてサブディレクトリのプロジェクトを指定します。

```Groovy:settings.gradle
rootProject.name = 'root'
includeFlat 'common', 'app'
include 'common:main-lib', 'common:sub-lib'
include 'app:web', 'app:api', 'app:batch'
```

各アプリケーションのプロジェクトから、共通ライブラリを参照します。

```Groovy:build.gradle
project('app:web') {
    dependencies {
        implementation project(':common:main-lib')
        implementation project(':common:sub-lib')
    }
}
```

IntelliJ IDEAよりGradleプロジェクトとしてインポートすると、各プロジェクトが認識されていることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353069/65a034e2-87cc-68fc-d7fb-1c77d4cf07bf.png)
VTKサンプルのビルド(システムのVTKを使わない場合のcmake修正)

VTKオフィシャルサイトからは様々な[example](https://lorensen.github.io/VTKExamples/site/)が公開されているわけですが、システムのVTKが古い場合

> CMake Error at /usr/lib/cmake/vtk-6.3/vtkModuleAPI.cmake:120 (message):
  Requested modules not available:
  vtkRenderingOpenGL2

等のメッセージがでてコンパイルできません。これはDebian Strecthのvtk-6.3ではOpenGL2でのレンダリングをサポートしていないことによるエラーの例です。現行のvtkを独自でコンパイルすればこの問題は解決しますが、その場合VTKの場所などを指定する必要があります。具体的には

- VTKディレクトリの指定

をします。vtkのexample配布物の中で、CMakeLists.txt内で `find_package(VTK REQUIRED)` を実行する前に

```set(VTK_DIR  "/my/own/vtk/path/")```

で`VTKConfig.cmake`の含まれるディレクトリを指定します。あとは通常のcmakeビルドプロセスと同様です。
【コピペでOK！】PythonでCSVファイルへの読み込み、書き込み

## tl;dr

PythonでCSVファイルを読み書きする方法をまとめます。

## 用意するもの・環境

- macOS Mojave 10.14.6
- Python 3.7(ANACONDA3)
- PyCharm 2019.2

開発環境の構築は下記の記事を参考にしてください。

【これさえ読めばOK】MacでPythonを使って開発するための準備
https://qiita.com/ryoichiro001/items/35a232a430c41dd512fa

## 公式ドキュメント

CSV ファイルの読み書き
https://docs.python.org/ja/3/library/csv.html

パラメータの詳細はこちらを参照してください。

## CSVパッケージを使用する

``` python

import csv
```

## CSVファイルの読み込み

``` python

import csv
import os


def get_info_from_csv(dir_name, file_name, delimiter=','):
    p_file = os.path.join(dir_name, file_name)

    with open(p_file, 'r', encoding='utf-8') as f:
        reader = csv.reader(f, delimiter=delimiter)
        lists = [row for row in reader]
        return lists
```

この例ではencodingをutf-8にしているが、これは読み込む対象のファイルに合わせる必要がある。

```python

# 呼び出し例
url_list = get_info_from_csv('inputs_files', 'input.txt')
```

## CSVファイルの書き込み

``` python

import csv
import os


def put_info_to_csv(lists, dir_name, file_name, header=[], delimiter=','):
    """二次元配列をCSVファイルに出力
    :param lists:出力したい二次元配列
    :param dir_name:ディレクトリ名(１階層下を想定)
    :param file_name:ファイル名
    :param header:ファイルのヘッダ
    :param delimiter:CSVの区切り文字
    :return:なし
    """
    p_file = os.path.join(dir_name, file_name)

    with open(p_file, "w", encoding='utf-8') as f:
        writer = csv.writer(f, delimiter=delimiter, quoting=csv.QUOTE_MINIMAL)

        if header:
            writer.writerow(header)

        writer.writerows(lists)
```

```python

# 呼び出し例
out_info = [[]]
out_info.clear() # 2次元配列を初期化

count = 1

out_line = []
out_line.append(count)
out_line.append('A')
out_info.append(out_line)                        

count += 1

out_line = []
out_line.append(count)
out_line.append('B')
out_info.append(out_line)                        

count += 1

out_line = []
out_line.append(count)
out_line.append('C')
out_info.append(out_line)                        

put_info_to_csv(out_info, 'temporary_files', 'output.txt')
```

```output.txt
1,A
2,B
3,C
```

## 参考URL

PythonでCSVファイルを読み込み・書き込み（入力・出力）
https://note.nkmk.me/python-csv-reader-writer/

Pythonで2次元配列の静的確保と動的確保
http://sonickun.hatenablog.com/category/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0?page=1402667101

Pythonでリスト（配列）の要素を削除するclear, pop, remove, del
https://note.nkmk.me/python-list-clear-pop-remove-del/
kintone UI Componentにプルリクエストする

[kintone UI Component](https://github.com/kintone/kintone-ui-component)のJavaScript版を使っていたのですが最近React版に乗り換えました。
[QuickStart React](https://kintone.github.io/kintone-ui-component/latest/Getting-Started/QuickStart-React/)の手順で問題なくButtonは表示できましたが、Dropdownを表示すると以下のエラーが発生しました。


> Uncaught Invariant Violation: Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:
1. You might have mismatching versions of React and the renderer (such as React DOM)
2. You might be breaking the Rules of Hooks
3. You might have more than one copy of React in the same app
See https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.

kintone UI Componentは非常に便利なライブラリなので多くの方に使ってほしい！
そして多くの方にプルリクエストしてほしい！と思っているのでその手順をまとめます。

# エラーの内容確認
[エラーメッセージが表示してくれているページ](https://fb.me/react-invalid-hook-call)を確認すると何やら3つぐらい原因の候補がありそうです。

ググったり、試行錯誤した結果、同じアプリ内に2つ以上のReactが含まれていることが原因の可能性であることがわかりました

```shell
$ npm ls react react-dom
+-- @kintone/kintone-ui-component@0.3.5
| +-- react@16.8.6
| `-- react-dom@16.8.6  deduped
+-- react@16.8.6
`-- react-dom@16.8.6
```

# 修正できることの確認
プルリクエストは当てずっぽうではだせないので、事前に手元で修正されることを確認する必要があります。
ここではその流れを説明するので、詳細がわからない方はググって下さい。

## 1. GitHub
- kintone UI Componentをforkする

## 2. Git(kintone UI Component)
- forkしたリポジトリをcloneする(git clone https://github.com/xxxx)
- branchを作成(git checkout -b ブランチ名)
- 原因と思われる箇所を修正する
- git commit -a
- git push origin ブランチ名

ここまでの手順で修正版kintone UI Componentを自分のリポジトリに反映できました。
次は自分のプログラムに上記のリポジトリを読み込んでDropdownが表示されるようになるかを確認します。

## Git(自プログラム）
- npm uninstall @kintone/kintone-ui-component
- npm install ユーザー名/kintone-ui-component#ブランチ名
  - 例）npm install potaracom/kintone-ui-component#fix-dropdown

この手順で組み込めたのでReactが1つになっているかを確認します。

```shell
$ npm ls react react-dom
+-- react@16.8.6 
`-- react-dom@16.8.6 
```

ばっちりです。
あとはプログラムをビルドしてDropdownが表示できるか確認します。

という手順で、できあがったプルリクエストが[こちら](https://github.com/kintone/kintone-ui-component/pull/225)です。
果たしてマージされるでしょうか・・・

9/26追記：[マージされたバージョンがリリースされました！](https://github.com/kintone/kintone-ui-component/releases/tag/v0.4.0)
lint-staged で大量ファイルをlintしようとすると死ぬのを回避する (windows)

とあるプロジェクトで `lint-staged` を仕掛けて楽しようとしたら思わぬところでハマったので解決策を書いておく。

# やったこと

プロジェクトで使ってるlinterとformatterを手動でかけるのがめんどくさいので `git commit` 時に走るようにセットアップしていた。
使っていたツールは以下。

* `angular-cli@7.3.9` : angular のプロジェクトなので `ng lint` をlinterとして使っている。
* `husky@2.7.0` : pre-commit hook を仕掛けるのに使っている。
* `prettier@1.18.2` : formatter
* `pretty-quick@1.11.1` : `git add` されたファイルにだけ prettier を実行するのに使っている。
* `lint-staged@9.2.3` : `git add` されたファイルにだけ linter を実行するのに使っている。
* `ng-lint-staged@0.1.6` : `ng lint` を `lint-staged` と一緒に使うために必要。

## セットアップ

```js:package.json
{
  // (省略)
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged"
    }
  },
  "lint-staged": {
    "*": [
      "pretty-quick --staged",
      "ng-lint-staged lint --fix --",
      "git add"
    ]
  }
}
```

ふつうはこれでだいたい動く。

## ハマったこと

ある日突然チームメンバーの一人が「コミットしようとしたらよく分からないエラーが出る」とのこと。
よく分からないとはなんぞやと思ってエラーメッセージを見せてもらうと、文字化けしていて本当によく分からない。(最後まで文字化けは解読できなかった。)
その時の状況は下記のような感じ。

* 死んだコマンドは `ng-lint-staged lint --fix --` らしい
* そのメンバーが使用していた PC は Windows10 で、ターミナルには PowerShell を使用
* 僕が使用しているのは MacBook Pro で、ターミナルには fish を使用
* `git commit --no-verify` でとりあえずコミットしてもらい、僕のPCで再現させようとするも再現しない。
* 手元に Windows 機もあったのでそっちで試してみると再現。
* コミットしようとしていたファイルは **150ファイル超**

実行中のログをよくよく眺めてみると、途中で **「ステージングされているファイルが多すぎて、この環境ではコマンドが意図しない動作をすることがあるよ」** というようなメッセージがあることを発見。
調べてみると、 [Windows の cmd.exe ではコマンドとして渡せる文字列は 8192 文字が限界](https://support.microsoft.com/en-us/help/830473/command-prompt-cmd-exe-command-line-string-limitation) という記述を発見。
PowerShell でも似たような制限があるのではないかと推測した。

## 解決策

`lint-staged` では `lint-staged.config.js` という名前で設定ファイルが書け、こちらだと実行するコマンドを自由に書き換えることができるようです。
`package.json` から `lint-staged` に関する記述を削除し、 `lint-staged.config.js` に移行します。

```js:lint-staged.config.js
const path = require("path");

const isTooManyFiles = (filenames) => filenames.length > 20;
const toRelative = (absPaths) => absPaths.map((file) => path.relative(process.cwd(), file));

module.exports = {
  "{src,cypress}/**/*.ts": (filenames) => {
    const relativePaths = toRelative(filenames);
    console.log(`{src,cypress}/**/*.ts: targets are ${relativePaths.length} files.`);

    const lintCmd = isTooManyFiles(relativePaths) ? "ng lint --fix" : `ng lint --fix --files "${relativePaths.join(",")}"`;
    const gitCmd = isTooManyFiles(relativePaths) ? "git add src/ cypress/" : `git add ${relativePaths.join(" ")}`;

    return ["pretty-quick --staged", lintCmd, gitCmd];
  },
  "package.json": (filenames) => ["fixpack", `git add ${toRelative(filenames).join(" ")}`],
};

```

すごく見づらいスクリプトですが、やっていることはざっくり以下。

1. ステージングされているファイルが20以上あったら、個別にlint/formatするのを諦めて全体をlint/formatする。
2. ついでに `ng lint --files` オプションに合うように引数リストをパースする。これによって `ng-lint-staged` を使う必要がなくなる。
3. ついでのついでに `package.json` に変更があったら `fixpack` して整形しておく。

## まとめ

コミットはこまめにしようね…。
(squash したらこうなることもあるのかな？)
チャットツールとかコミュニティとかそんなんで思う事

なんだろ、自分自身の使い方がどうなのか、という点も含めて考えてみた。
ゲームと仕事との共通点もあるよねー、とか思ったりも。

##チャット
しますよね？

それ自体は良いけど

- 必要以上に絡んだりしてないか、公私混同していないか。
- 友連れで入り、公私混同してないか。私物化してないか。
- 自分(達)の都合だけで周りを巻き込んでないか。
- 答えれる内容なら即座に反応がもらえる場合が多い。貰えない時は、知らないか、面倒くさいと思われてるか、超多忙で余裕が無い状態。

##コミュニティ(チーム)
とりあえず、入ったり入れられたりしますよね？

それ自体は否定しないけど、

- 本当に必要な情報をコミュニティに発信出来てるか、受信出来ているか疑問。
- 初めから「チャットはやらない」と名言しているメンバーは、TLそのものをスルーしている場合が多く、重要事項のみ確認するタイプか、挨拶マクロ作ってる。
- インアウトの挨拶必須とか素行において、面倒な決まりがあるコミュニティでは、1番の標的になりやすいが、実力があればその限りではない。
- 特に興味無い&関係無い話題にそれた時(もしくは冗長化)ウザいと思われるとアウト。
- コミュニティの募集内容、方向性は合致しているか。ズレや募集詐欺は無いか。
— 募集内容に挨拶必須とか書いてたくせに、無言メンバー居るとたちまち不信感。(募集内容と違う)

これらは、いわゆるローカルルールにあたる部分が多いです。
**知らなかった** 、は論外、**逆に告知も一切せず、こっそりとルール変更を行う運営は良くない**と思います。
しっかりルールや運営方針、ひいては価値観の共有は、新規加入者やメンバーに対し行わなければなりません。冒頭で噛み合わないと後々「崩壊」に繋がります。

では、そういう人達ばかり集めりゃ問題ないじゃん？

と思われるかもしれません。

が、思い通りの人間に出会えるなんて、ものごっつい確率で、ほぼ無いと思ってます。そこに期待するのが間違い。最低限譲れない部分がクリアされていればいいと思います。

- 一緒に仕事をしたいと思えるか
- 価値観を共有できるか
- 改善の見込みはあるか
- 良い面が悪い面をかき消せるか。

のどれかで良いと思ってます。(技術者ならスキルセットあり前提ですが)

道具は使い様によって様々な結果をもたらします。
道具の使い方には気を付けましょう。
予約システム　pickadate.jsで実装　~ヘルスケアwebサービスを自分で作る医者の日記~

クリニックの予約サイトを作るために、勉強中

https://qiita.com/Yuta_Fujiwara/items/66af40dcc5ce206933eb
こちらの記事を参考にさせていただいた。

[datepicker](https://amsul.ca/pickadate.js/)

公式のドキュメントとにらめっこしていると、
なんとか、実装はできるようなった。

作りたいのは、予約システム

jsからwebサーバーに送る処理の理解が必要
上の記事はajax使っているのね、
なんとか、ググってajaxの基本を1日で習得
vagrantでphpウェブサーバーを立ち上げる方法で実装

```javascript

$(function() {

    // datepicker表示イベント
    $('#date').pickadate();

    // timepicker表示イベント
    $('#time').pickatime({
        format: 'HH:i', // 24時間表記
        interval: 30,   // 表示間隔
        min: [10,00],   // 予約開始時間
        max: [20,00]    // 予約終了時間
    });

    // 予約ボタン押下イベント
    $('#submit').click(onClickSubmit);

    //予約ボタン押下処理
    function onClickSubmit(){
        $('#submit_result').remove();
        var date = $('#date').val();
        var time = $('#time').val();

        if(date!='' && time !=''){

          $.ajax({
            async: true,
            url: 'http://192.168.33.10:8000/yoyaku_datepicker.php',
            type: "POST",
            dataType: 'json',
            data: {
              'hiduke': date,
              'jikan': time
            }
          }).done(function(data) {
            console.log(data.kekka + "を取得しました。");
          }).fail(function() {
            console.log("処理を失敗しました。");
          });

            //予約完了メッセージ
            $('#result').after('<div id="submit_result" class="section__block section__block--notification"><p><strong>'+date+time+'〜</strong><br>予約受け付けました。</p></div>');

        }else{
            //予約失敗メッセージ
            $('#result').after('<div id="submit_result" class="section__block section__block--notification-red"><p>予約日・予約時間を選択してください。</p></div>');
        }
    }

});
```
```php
<?php

$hiduke = $_POST['hiduke'];
$jikan = $_POST['jikan'];



if ($hiduke  && $jikan) {
  $datepick['kekka'] = "ご指定の日時";
} else {
  echo false;
}

echo json_encode($datepick);
```

最終的にはrailsでやりたいのだが、
データベースへの格納を理解できなきゃならない
railsのacctive recordか

ていうか、vagrant のwebサーバーでデータベースの取り扱いはできるのか？？

道は長い、、、
pythonで音声を並列で再生する方法

##やったこと
今回、Pythonにおいて、音声を並列で再生する(Aの音声を再生し、再生の終了を待つ前にBの音声を並列で再生する)方法を検討しました。

・環境：
　Python3.6.5
　Mac OS Mojave

##方法
様々検討したのですが、最終的にはsubprocessを使ってMacのターミナル上での音声再生コマンドであるmplayerを叩く方法で実現しました。

mplayerは

```
brew install mplayer
```
でインストールできます。Linuxを利用されている方ですとapt-get、wavならば aplay で良いと思います。

###実際のコード

```
import subprocess

A = '○○○.mp3'
B = '●●●.mp3'

subprocess.Popen(['mplayer', A])
subprocess.Popen(['mplayer', B])
```

実行すると、AとBの音声がほぼ同時に再生されます。

これを利用して、aの信号を受け取るとAの音声を流し、bの信号を受け取るとBの音声を流す。
などの処理を実行することができます。


簡潔ですが、以上です。
ご参考になれば幸いです。


##補足
pythonで音声を再生する際はpyAudioを使うのが一般的ですが、これをthreadingなどで並列処理化しても、うまく並列再生されず、しまいにはおそらくメモリーエラーでSegmentation Faultになりました(信号の取得等の処理を入れています)。
もしかしたら、他の方法もあるのかもしれませんが、とりあえず上記で実現できたため投稿します。
[AWS] VPC MEMO

##VPCの概要
Virtual Private Cloud
後で復習がてらにまとめろ

- 仮想ネットワークを構築するサービス
- クラウド内外のネットワーク間を接続も可能
- VPCは基本は一つのAZ内で構築されるが複数のAZにリソースを置くことができる。

##CIDR(Classless Inter-Domain Routing)
グローバル部とホスト部の範囲設定。ローカルIPの範囲設定サブネットマスクのこと。
１６〜２８を設定可能。VPC内のサブネットは200こまで。
196.32.100.???/16の
16 = 255.255.000.000のサブネット
ネットワーク部が196.32、ホスト部100.???。
CIDRはVPCとサブネットの２つに定義できる。こんな感じ。
![スクリーンショット 2019-08-14 12.51.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262302/ad65c338-1e21-e7de-0bfa-ccac82c26f67.png)

##サブネットの種類
・パブリックサブネット
インターネットゲートウェイとルーティングされている
・プライベートサブネット
インターネットゲートウェイとルートしてない
##NATゲートウェイ
プライベートサブネットへ接続する際はNATゲートウェイをパブリックサブネットへ設定し、経由してアクセスする必要がある。

##VPC外部接続
・エンドポイント
・パブリックAWSネットワーク(or プライベートの場合はNATゲートウェイ設置)

##ルートテーブルでネット経路作成
ルートテーブルとCIDRアドレスでルーティングを設定。

##VPCのトラフィック設定
###セキュリティグループの設定
- ステートフル：戻りトラフィック考慮せずOK
- サーバー単位
- 許可をIn/Out設定
- デフォでは同一セキュリティグループのみ通信可能
- 必要な通信は許可設定必要

###ネットワークACLｓ
- サブネット単位
- ステートレス：戻りトラフィックも許可設定可能。
- 許可拒否をIn/Out設定
- デフォでは全てのIPを許可
- 番号の順序通りに適用

###VPC設計ポイント
- 将来の拡張性を考慮したCIDR
- 既存のアドレス帯などとかぶらいないように注意
- VPCの組織的な構成を予め考えておく。
- サブネットはPLとPVを使い分けてセキュリティの可用性UP
- VPCFlowLogｓでモニタリングする

##VPCとのオンプレミス接続
###Direct Connect
個別のデータセンターや社内オフィスなどを専用線を介してAWSへプライベート接続する。
- 安いアウトバウンドトラフィック価格
- ネットワーク信頼性・帯域幅の向上
- 使用リージョン付近のDirect Connectロケーションに自社機器を物理的に設置して専用線を引く。設置などはどうすんのかは謎。どっかに頼むんだろうね。
- 専用線のため通常のネット障害は受けない。専用線の障害は受けるが。とにかく信頼性高し。
###VPN接続
- Direct Connectより安い
- リードタイムは短い。物理的な設置がないため
- 帯域幅はDirectConnectより制限がある
- インターネット経由のためネットワーク影響を受ける。
- インターネット接続のため障害の切り分けが難しい。

##VPCエンドポイント
VPCエンドポイントはグローパルIPをもつAWSサービスに対してVPC無いから直接アクセスするための出口。S３などはVPCに属さず、VPC内同士の接続にはならないため。
いかの2つの形式がある。**違いがよくわからねえ**
###Gateway型
- 基本無料
- サブネットに特殊なルーティングを設定し、VPC内部から直接通信する。

###PrivateLink型
- 有料

**余談**
Direct Connect Gateway
リージョン間をまたいだ接続を可能にする。

##VPC Peering
2つのVPC間でのトラフィックルーティングを可能にする
- 異なるAWSアカウント間のVPC間も接続可能
- 一部のリージョン間ならば異なるVPC間の接続可能
- マネージド・サービス。冗長性はAWSが対応してる。

##VPC Flow logs
ネットワークトラフィックを取得してCloudWatchでモニタリングできるようにする。
- 利用自体は無料


#VPCを分割するケース
- アプリーケーションごとの分割
- 監査のスコープによる分割
- リスクレベルの分割
- 本番検証開発フェーズの分割
- 部署による分割


#結構重要ーVPCの設定上限
**リージョンあたりのVPC数 = 5
VPCあたりのサブネット数 = 200
AWSアカウントあたりの1リージョンのElasticIP数 = 5
ルートテーブルあたりのルート上限数 = 100**
VPCあたりのセキュリティグループの上限 = 500
セキュリティグループあたりのルール上限 = 50
typescriptでaurora-serverlessからdata-apiでデータを取得する

AuroraServerlessを使うことで、https経由でデータアクセスが可能となる。

# 事前準備
- AuroraServerlessを構築する
- DataAPIをオンにする
- AWS Secrets Manager へ 認証情報を保存する

# データの取得

- 環境変数に接続情報をセット
export DB_SECRET_ARN="arn:aws:secretsmanager:ap-northeast-1:99999999:\secret:rds-db-credentials/cluster-XXXXXXXXXXXXXXX/xxxxxxxxxxx";
export DB_ARN="arn:aws:rds:ap-northeast-1:xxxxxxxxxxxxx:cluster:xxxxxxxxxxx";
export DB_NAME=xxxxxx


```find_by_sql.ts

// SQLから連想配列で取得する
const find_by_sql = async (sql: string, parameters?: SqlParameter[]) => {
  const params: ExecuteStatementRequest = {
    resourceArn: process.env.DB_ARN,
    secretArn: process.env.DB_SECRET_ARN,
    sql: sql,
    database: process.env.DB_NAME,
    includeResultMetadata: true,
    parameters: parameters
  };
  // データの取得
  let res = await new Promise<ExecuteStatementResponse>((resolve, reject) => {
    RDS.executeStatement(params, (err, data) => {
      if (err) reject(err);
      else resolve(data);
    });
  });

  // 詰め替える
  const results: any[] = [];
  res.records.forEach(record => {
    const result_row: any = {};
    res.columnMetadata.forEach((col, i) => {
      result_row[col.name] = Object.values(record[i]).filter(x => x)[0] || null;
    });
    results.push(result_row);
  });
  return results;
};

// example
const sql = 'select * from users where id = :user_id'
const datas = await find_by_sql(sql, [{ name: "user_id", value: { stringValue: 'hoge' } }]);

```
与えられた木が二分探索木か判定するアルゴリズム

## この記事は何か?

入力として木構造が渡されたとき、それが二分探索木かどうか調べるアルゴリズムについて紹介する。

## 二分探索木

二分探索木は[二分木](https://ja.wikipedia.org/wiki/%E4%BA%8C%E5%88%86%E6%9C%A8)であり、節の左側の子には節と同じか小さい要素しか含まず、右側の子には節と同じか大きい要素しか含まないものを指す。

次の木は二分探索木の例である。

![binary-search-tree.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488069/994e5eb2-24b9-2db8-a8a3-c9d7a34b3702.png)

すべての部分木で左側の子が節と同じかそれより小さく、右側の子が節と同じかそれより大きい要素を持っている。

## 二分探索木かどうか判定するアルゴリズム

二分探索木の子の節が取りうる値の幅は、親の節よりも狭くなる。上の二分探索木を例に考えよう。

根の要素が取りうる値の幅は `[-∞, ∞]` である。つまり、どのような値でも問題がない。根から左側の子である 7 の節が取りうる値は `[-∞, 19]` である。なぜなら、根の左側の子は根よりも大きい値であってはならないからである。次に 7 の節の右側の子について考えよう。この節の取りうる値は `[7, 19]` で、実際の値は 11 である。親が 7 なので、右側の子は 7 より大きい値でなければならず、親が 19 より小さいという制約を持っているため、この節も同じ制約を引き継ぐためである。

このように、根から葉に向かって取りうる値のレンジを更新しつつ、実際の値がそのレンジにおさまっているかどうかを調べることで、与えられた木が二分探索木かどうかを判定できる。

具体的な実装は次のようになる。

```python
# 木のノードは BstNode クラスで表現する
class BstNode:
    def __init__(self, data=None, left=None, right=None):
        self.data, self.left, self.right = data, left, right


def is_binary_tree_bst(tree: BstNode, low_range=float('-inf'), high_range=float('inf')) -> bool:
    if not tree:
        return True

    if not (low_range <= tree.data <= high_range):
        return False

    return \
        is_binary_tree_bst(tree=tree.left, low_range=low_range, high_range=tree.data) and \
        is_binary_tree_bst(tree=tree.right, low_range=tree.data, high_range=high_range)
```

根から再帰的に左右の子の部分木を探索し、すべての節の値がレンジの範囲内におさまっていれば `is_binary_tree_bst` は `True` を返す。
Vue.jsのvue.config.jsを使って環境変数を別けるやり方

developmentとproductionで分けたかったので自分用にメモです

STEP1
---
![スクリーンショット 2019-08-27 18.15.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206790/a5957d6f-9f22-7075-7760-8316ca4df662.png)
こんな感じででpackage.jsonのコマンドにmodeを追加する。
`npm run p` とやるとデフォルトで `--mode production` となります。

STEP2
---
![スクリーンショット 2019-08-27 18.09.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206790/30f5b680-21ab-5545-b91e-948b6fa3703e.png)
プロジェクトの直下に
`.env.development`
`.env.production`
といったファイルを作る。

STEP3
---
![スクリーンショット 2019-08-27 18.10.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206790/3184ce6c-53db-2c43-f136-9cb6514a4af7.png)
中身を書く。
この時命名のルールがあり
`VUE_APP_hogehogehoge` としなければならない。(でないとundefinedとなってしまいます。)

STEP4
---
![スクリーンショット 2019-08-27 18.10.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206790/240eb1e5-a7b7-8319-3108-e824ec116499.png)
適当なところで呼び出して確認する。
終わり。

####npm run xxxx でもう一度立ち上げなおす。

---



ちなみに話は全然変わるけどSourceマップの出し分けはこうする

```js
module.exports = {
    productionSourceMap: process.env.NODE_ENV === 'production'? false :true,
}
// この時の process.env.NODE_ENV は package.jsonのコマンドの --mode xxxxxx　を自動的に読み込んでくれる。
```
[Python]たった4行で英文間の類似度を出すモジュールを作る

#はじめに

コサイン類似度を使用します
コサイン類似度についての詳しい説明は以前書いたQiitaを見てください↓
[pythonで「君とはベクトルが合わない」を数値で出そう笑](https://qiita.com/hir-osechi/items/17592b099c4277ee0739)

今回は2文章間の類似度を4行の簡単なpythonで出してみようと思います！

#2文章間の類似度

例えばこんな２つの文があったとします

```
text1 = ”I like apple and lemon”
text2 = ”I like apple and banana”
```

この２つの文章を表でまとめると

|     |   I  |   like  |  apple  |  and  |  lemon  | banana |
|:----|-----:|-----:|-----:|-----:|-----:|-----:|
|text1|  1  |  1  |  1  |  1  |  1  |  0  |
|text2|  1  |  1  |  1  |  1  |  0  |  1  |

２つのテキストをベクトルで表すと
α = (1,1,1,1,1,0)
β = (1,1,1,1,0,1)
α・β = 4
|α| = √5
|β| = √5

これらからコサイン類似度をもとめる。

cosθ = (α・β)/|α||β|
であるから

cosθ = 4 / (√5 ✕ √5) = 0.8

#Pythonで書いてみる

####環境

ubuntu 18.04
python3

---

分かち書きに必要なモジュールのインストール　polyglot

```
$ sudo apt-get update
$ sudo apt-get install libicu-dev
$ sudo apt-get install python3-pip
$ sudo -H pip3 install --upgrade pip
$ sudo -H pip3 install numpy
$ sudo -H pip3 install polyglot
$ sudo -H pip3 install pyicu
$ sudo -H pip3 install pycld2
$ sudo -H pip3 install morfessor
```
>引用：[英文の自然言語処理におススメ！お手軽なPolyglotを使ってみた。](http://lab.astamuse.co.jp/entry/try-polyglot)

　　主な使い方はここを見てください↑

---

以下がコサイン類似度を求める４行のモジュールです

```python:cos_sentence.py
import math
from polyglot.text import Text
def calc_cos(text1,text2):
    return len([i for i in Text(text1).words if i in Text(text2).words])/(math.sqrt(len(Text(text1).words)*len(Text(text2).words)))

```
---
はい、無理やり４行にしたので見やすくしますｗ

---
```python:cos_sentence.py

import math
from polyglot.text import Text

def calc_cos(text1,text2):

    # テキストを分かち書きしてlistに格納
    list1 = Text(text1).words
    list2 = Text(text2).words

    # コサイン類似度の分母
    denominator = math.sqrt(len(list1)*len(list2))

    # コサイン類似度の分子
    numerator = len([i for i in list1 if i in list2])

    return numerator/denominator

```
---
このモジュールを呼んで上の2文の類似度を出す

```test.py

import cos_sentence
print(cos_sentence.calc_cos("I like apple and lemon","I like apple and banana"))

```
結果↓
0.8

#あとがき(text1,2が短文でないとき)

この分かち書きだと　"."とか"?"とか"!" も含んじゃうので、数文ある記事ならreplace("!","")とかするか、正確にやりたいなら形態素解析してリストに格納する必要があります

形態素解析もpolyglotでできます、"."とか"?"とか"!" の品詞名は'PUNCT'です

text内に複数文ある場合はこんな感じでしょうか

```python:cos_sentence.py

import math
from polyglot.text import Text


def calc_cos(text1,text2):

    # テキストを分かち書きしてlistに格納
    list1 = text_to_list(text1)
    list2 = text_to_list(text2)

    # コサイン類似度の分母
    denominator = math.sqrt(len(list1)*len(list2))

    # コサイン類似度の分子
    numerator = 0
    for word in list1:
        if word in list2:
            numerator += 1
            # 既出の単語を消去
            list2.remove(word)
    return numerator/denominator

def text_to_list(text): #textからlistに単語を格納する関数
    list = []
    for token in Text(text).pos_tags:
        if u'PUNCT' != token[1]:
            list.append(token[0])
    return list
```
【Rails】turbolinksやAjaxの影響でjQueryが正常に動作しないとき

## はじめに
Rails app内で、カルーセルスライダーやsubmitの自動送信といったjQueryで実装した機能が正常に動作しない現象に何度か遭遇しました。
本記事ではその対処法を紹介します。

### 注意
Rails学習中の初学者が備忘録を兼ねて書いています。
内容に誤りを含む可能性・さらに良い手法がある可能性が多分にありますので、参考にする際はその点ご留意ください。

### RubyとRailsのバージョン
下記のバージョンにて動作確認しています。
	- Ruby 2.5.1
	- Rails 5.2.1

## 現象と原因、解決策
僕が遭遇したエラーは下記の２点でした。

- 初回読み込み時にjQuery（スライダー）が動かない。リロードしたら動き出す。 →（原因）Turbolinksが発動し、ページ読み込みを起点としたjQueryが発火しない
- AjaxでHTMLの一部を差し替えた後、差し替え部に埋め込んだjQuery（submit送信）が動かない。 →（原因）Ajaxで差し替えられた部分ではページ読み込みを起点とするjQueryが発火しない

（解決策）
どちらの問題も、イベントの発火タイミングを設定し直すことで修正できました。

### 修正前のコード
`custom.js`に下記の記載をしていました。

```Js:custom.js
// carousel-slider(bxslider)
jQuery(document).ready(function() {
  $('.bxslider').bxSlider({
  });
});

// submit自動送信
jQuery(document).ready(function() {
  $('.select-box').change(function() {
  	  $(this).parent().submit();
    });
});
```

上記の `jQuery(document).ready`や、 `$(function()`の記述では、ページの読み込みを起点として発火します。
つまり、画面の一部が切り替わった場合はイベントが発生しないことになります。
そこで、Turbolinksを無効化させる、Ajax後にも発火するように設定する、ということで対処していきます。
Turbolinksについては [こちらの記事](https://ryoutaku-jo.hatenablog.com/entry/2019/01/15/213420) で詳しく解説されています。

### 修正後のコード
修正後のコードがこちらです。

```Js:custom.js
// carousel-slider(bxslider)
jQuery(document).on('turbolinks:load', function(){
  $('.bxslider').bxSlider({
  });
});

// submit自動送信
jQuery(document).bind('ready ajaxComplete', function() {
  $('.select-drop').change(function() {
  	  $(this).parent().submit();
    });
});
```

- `turbolinks: load’`とすることで、初回読み込み時、リロードどちらでも発火するようになります。
- `ajaxComplete`とすることでAjaxが完了したのちに発火するように設定できます。今回は`bind(‘ready ajaxComplete’)`とすることで初回読み込み時、Ajax後の両方で動作するようにしています。

## 完成
綺麗な解決法ではないかもしれませんが、なんとか無事に狙い通りの機能を実装できました。
jQueryについてはもっと勉強が必要そうです。。。

## 参考
-  [https://ryoutaku-jo.hatenablog.com/entry/2019/01/15/213420](https://ryoutaku-jo.hatenablog.com/entry/2019/01/15/213420) 
- [Rails5でjqueryを動かす方法 - Qiita](https://qiita.com/hiroyayamamo/items/b258acbaa089d9482c8a)
- [jQueryでajax完了後に実行開始したい処理があるときの対応 - ホームページ制作 株式会社KOP](https://www.kopjapan.com/blog/web/jquery%E3%81%A7ajax%E5%AE%8C%E4%BA%86%E5%BE%8C%E3%81%AB%E5%AE%9F%E8%A1%8C%E9%96%8B%E5%A7%8B%E3%81%97%E3%81%9F%E3%81%84%E5%87%A6%E7%90%86%E3%81%8C%E3%81%82%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AE%E5%AF%BE)
- [jQuery: both .ready() and .ajaxComplete - Stack Overflow](https://stackoverflow.com/questions/19267072/jquery-both-ready-and-ajaxcomplete)
	
#Qiita
Azure上でRed Hat構築する時の許可すべきIPアドレス

# はじめに
本ページは、Azure 上にRed Hatを構築する際に許可すべきIPアドレスを記載したものである。
内容としてはMS公式ページを一読していれば、知っている内容となる。

対象者：時間がない人向け

# 許可すべきIPアドレスの通信として
NSGで最低限の通信のみしか設定しない場合（インターネット拒否の設定をする場合）やExpressRouteの強制トンネリングを構成している場合は、
Azure GlobalのIPアドレスを許可する必要がある。

```ruby:AzureGlobal
13.91.47.76
40.85.190.91
52.187.75.218
52.174.163.213
52.237.203.198
```

[NSG設定の場合]
送信規則に、下記宛先IPアドレス・ポート：443で許可すること。

[ExpressRouteの強制トンネリング]
オンプレミスのプロキシーサーバー等を経由して通信する場合は、UDR（Azureリソースのルートテーブル）を設定しなくてもよい。
※個人的には、UDRに設定する方がAzureの権限しかない人にとっては運用が楽！

# その他！
Azure やAWS・GCPで、こういう情報をまとめて欲しい！というものがあれば、コメントいただけると幸いです！
ニーズのある記事をアップできればなと考えています笑！


ご一読いただき、ありがとうございました！


# 参考文献
[・RHUI コンテンツ配信サーバーの IP アドレス](https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/update-infrastructure-redhat#the-ips-for-the-rhui-content-delivery-servers)
Android StudioでEmulator使用時、Emulator: emulator: ERROR: detected a hanging thread 'QEMU2 CPU0 thread'. No response for 15011 msエラー発生

# Android StudioでEmulator起動時もしくは使用途中で以下のログを出してフリーズしてしまう場合の対応

```
17:31	Emulator: emulator: ERROR: detected a hanging thread 'QEMU2 CPU0 thread'. No response for 15011 ms

17:31	Emulator: emulator: ERROR: detected a hanging thread 'QEMU2 CPU1 thread'. No response for 15011 ms

17:31	Emulator: emulator: ERROR: detected a hanging thread 'QEMU2 CPU0 thread'. No response for 15011 ms

17:31	Emulator: emulator: ERROR: detected a hanging thread 'QEMU2 CPU0 thread'. No response for 15011 ms
```

- Tools → AVD Manager  
<img width="200" alt="a02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468840/81039d54-6622-4859-0571-d2996ef18ef1.png">
- 該当DeviceのEdit(鉛筆アイコン)を選択  
<img width="400" alt="a01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468840/22531fb6-901c-1965-d45c-cc41f829ff45.png">
- 「Show Advanced Setting」を選択  
<img width="400" alt="a03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468840/6edbfde5-a696-4046-04e4-c89c1e055476.png">
- Emulated Performance項目のBoot Optionを切り替える。
    - Cold Bootになっている場合にはQuick Bootに
    - Quick Bootになっている場合にはCold Bootに  
<img width="1002" alt="a04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468840/9ce27666-76f3-4057-2d23-5e9adde78fc0.png">
- Emulatorを起動
eclipseでCtrl + クリック（宣言元を開く）が効かなくなったとき

# 今まで使えてたのに、eclipseのCtrl + クリック（宣言元を開く）が効かなくなったとき

## 解決策
**プロジェクト -> クリーン**
これで解決しました。

以下の方法を試してダメだった時、これを実行したら直ったので、備忘のため記録
## まず試したこと
- eclipse再起動
- プロジェクトで右クリックして、構成から[PHPサポート追加]
- ビルドパスの設定
.rubocop.yml を無視して rubocop のルールを１個だけ適用する

rubocop のルールを１個だけ適用するには、コマンドラインオプションの only を使う。たとえば文字列リテラルからなる配列を %w で置き換えるルールを適用するには下記のようにする。

```.rb
rubocop --only Style/WordArray --autocorrect hoge.rb
```

これは、rubocop.yml に関係なく実行できるので、チーム内では %w に拘ってないのだが、自分だけはこのルールに従って変換したい、というときに使うことができる。
VSCodeでよく使うショートカットキー

# 目的
VSCodeでよく使うショートカットキーをメモ。

#Ctrl + L
行選択。

#Ctrl + Alt + 上下Arrow
上下にカーソルが伸びる。

#Ctrl + Shift + \
対応するカッコに飛ぶ。

#対象の文字列を選択しながらCtrl + D
選択している文字列と同じ文字列をマルチカーソル状態で選択していく。
選択された状態で文字を打つとマルチカーソルで置換する。

#Alt + Click
クリックすると、クリックした位置にカーソルが置かれる。

#Ctrl+\
エディターを分割する。
中が長いファイルを編集しているときに便利。

#Ctrl + /
コメントアウト。

# 最後に
まだまだ使いこなせていない。。
もっと便利に使いこなしたい。
RubyMine（Windows）のフォントサイズをマウス＋ホイールで変更させる

普段の開発のときにはフォントサイズを変えることはあまりないのですが、「コードレビュー」や「外部モニターに映して画面を見せる」ときなどにサッとフォントサイズを変更したいときがあります。

RubyMineは、KeyMapを細かくカスタマイズできることは知っていたのですが、**マウスショートカットまでつくれる**ことは知らなかったです :grin:

今回は、マウスショートカットを登録してフォントの拡大縮小をサッと実行する設定を説明します。

# 目的

- フォントサイズを上げる == **Ctrl+:mouse_three_button:↑** 
- フォントサイズを下げる == **Ctrl+:mouse_three_button:↓**


# マウスショートカットでフォントサイズを拡大縮小する設定

1. `File > Settings > Keymap`とすすみ、検索ボックスに`font`と入力します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883/01fe43f5-2ffa-7b8d-0d56-c53defec407d.png)

2. `Increase Font Size`（フォントの拡大）でダブルクリックします
3. `Add Mouse Shortcut`を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883/32c45ec1-4476-63e5-b0e1-3b6420481691.png)
4. ウィンドウのうえで、`Ctrl+マウスホイール上`を入力し、`OK`を押します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883/a8fa6776-4003-0c0f-b7cb-4fb461879cdc.png)

5. おなじ手順で、`Decrease Font Size`（フォントの縮小）を設定します
Composerをつかってlumenプロジェクトを作成する。

https://lumen.laravel.com/docs/5.1

ここ読んでもなんかうまく行かなかったので、ネット上の先人が残してくれた記事を読んでみた。


`composer create-project --prefer-dist laravel/lumen sample`を実行してもエラーで弾かれる。

どうやらPHPのみをインストールしているだけではパッケージが足りないらしい。

結果的に２つ追加しました。
1つめは`ext-dom`が足りないとか。

```bash

    - phpunit/phpunit 7.1.0 requires ext-dom * -> the requested PHP extension dom is missing from your system.
    - phpunit/phpunit 7.0.3 requires ext-dom * -> the requested PHP extension dom is missing from your system.
    - phpunit/phpunit 7.0.2 requires ext-dom * -> the requested PHP extension dom is missing from your system.
    - phpunit/phpunit 7.0.1 requires ext-dom * -> the requested PHP extension dom is missing from your system.
    - phpunit/phpunit 7.0.0 requires ext-dom * -> the requested PHP extension dom is missing from your system.
```

これは`php-xml`を入れると大丈夫らしい
`sudo apt install php-xml`


2つめは`ext-mbstring`が足りないと。

```bash

    - phpunit/phpunit 7.0.3 requires ext-mbstring * -> the requested PHP extension mbstring is missing from your system.
    - phpunit/phpunit 7.0.2 requires ext-mbstring * -> the requested PHP extension mbstring is missing from your system.
    - phpunit/phpunit 7.0.1 requires ext-mbstring * -> the requested PHP extension mbstring is missing from your system.
    - phpunit/phpunit 7.0.0 requires ext-mbstring * -> the requested PHP extension mbstring is missing from your system.
```


`sudo apt install php-mbstring`

これで回避できました。

やっつけですみません。
JavaScriptで実際に動くものを作ってみた_2

#はじめに
引き続きJavaScriptの勉強をしました。
今回はブラウザにデータを保持するものを作りたいと考え、会社の研修で使った紙の資料である「行動習慣チェックリスト」をデジタル化してみました。

#作ったもの
![スクリーンショット (130).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386463/14c6dd3c-15ec-f874-605d-3dc001ea0dbb.png)

日付のところに〇△×をセレクトボックスから選択し、1カ月の習慣を記録していきます。
localStrageを用いることで集計したデータはブラウザ上に保持されます。

コードはかなり冗長で汚くなってしまったので今回は省略します。

#今回の経験で学んだこと

##localStrage

ブラウザにデータを保持する際に使ったもの。
今回は日毎にチェックした値を保存している。
当初はCookieを使用する予定だったが、こちらの方が使いやすそうだったので変更。
localStrageはKeyとValueのセットで使用され、値は文字列で使用される。
以下に簡単な例を載せます。

```javascript

// Keyに値をセットする場合はsetItemを使用
localStorage.setItem("設定するKey", "Keyに設定するValue");

// Keyの値を取得する場合はgetItemを使用
let a = localStorage.getItem("取得するKey");

// Keyを削除する際はremoveItemを使用
localStorage.removeItem("削除するKey");  

// Sample
// javascriptというKeyに文字列"difficult"を設定する
localStorage.setItem("javascript", "difficult");

// 変数aには文字列"difficult"が設定される
let a = localStorage.getItem("javascript");
```

##insertAdjacentHTML
HTMLの追加時(集計ボタンを押す処理)に使用。
前回使ったinnerHTMLと同じ要領で使用する。
'beforebegin'や'afterbegin'などで挿入する位置を選択できる。

#おわりに
当初は日付の部分をカレンダーにしたり、月ごとの結果を別途保存する機能を追加しする予定でしたが、操作が複雑化しそうなため止めました。
毎日の行動チェックであるため極力シンプルな方がいいですよね。
#参考サイト

[WebStorage API(LocalStorage)を使ってみた](https://qiita.com/masamitsu-konya/items/c69515604570150d3ab9)
各種音声オープンデータセット(OpenSLR,kaggle-TIMIT）に関するメモ


音声データーセットに関するメモです。

#OpenSLRデーターセット
http://www.opens12lr.org//
以下の4つについて

```
dev-clean.tar.gz [337M]   (development set, "clean" speech )   Mirrors: [China]  
dev-other.tar.gz [314M]   (development set, "other", more challenging, speech )   Mirrors: [China]  
test-clean.tar.gz [346M]   (test set, "clean" speech )   Mirrors: [China]  
test-other.tar.gz [328M]   (test set, "other" speech )   Mirrors: [China]  
```
解凍したディレクトリ直下のBOOKS.TXTが音声データーの書き下しになっています。
また中で更に細かくデーターが小分けされてされておりtranscriptが記述されています。


##dev-clean

データー形式はflac
359mb

##dev-other
データー形式はflac
337MB

##test-clean
データー形式はflac
368MB

##test-other
音声形式はflacで入っている。
音声データーサイズは352.7MB



#kaggel-timitデーターセット

##Speak_Recog_Data
https://www.kaggle.com/akshay4/speakerrecognition#Speak_Recog_Data%20.tar.gz

これは特にtranscript等はなく音源のみのデーターセットです
.wavで入っています


##DARPA TIMIT

以下のようなデーターフォーマットになっています

```

test_data.csv
test_data.csv
31.7k x 12
train_data.csv
31.7k x 12
PHONCODE.DOC
PROMPTS.TXT
README.DOC
SPKRINFO.TXT
SPKRSENT.TXT
TESTSET.DOC
TIMITDIC.DOC
TIMITDIC.TXT
\data.zip
  --TEST
  --TRAIN
```

data.zip内にあるTEST内にDRディレクトリ内にtranscriptと一緒に各種.wav音声データーが入っています。
TRAINも同様にtranscriptと一緒に.wavが格納されています。
NVIDIA コントロールパネルがインストール出来ない

# 何が起きたか
ゲーミングPCで開発しているので、使わないけど定期的にNVIDIAさんが「更新あるよ」と言ってきます。
特に使わないので適当に更新をかけているのですが、「コントロールパネルが無いよ！」っていうポップアップを出すようになりました。
「インストールする時はここをクリックしてね！」と言われたので行った先は[MS Store](https://www.microsoft.com/ja-jp/p/nvidia-control-panel/9nf8h0h7wmlt)のページ
「ほほう」と思ってインストールボタンを押したら
[「この ms-windows-store を開くには新しいアプリが必要です」](https://answers.microsoft.com/ja-jp/windows/forum/windows_10-windows_store/windows-10-この-ms-windows-store/c779a371-9e54-45b2-9838-a5ca43095af8)のシステムポップアップが現れてポップアップが消せない状態になりました。

## 環境情報
- windows10
    - バージョン:1809
    - OSビルド：17763.678
- NVIDIA
    - 解決してから記事を書いているのでバージョンはよくわからん
    - 現在のGeForceのバージョンは3.20.0.105
    - ドライバのバージョンは436.02

## 解決策
根本原因はよくわかりませんが「根本原因はよくわからないけどGeForceの再インストールしたら一緒にインストールされるから！」という記事がたくさんあります。
公式見解もそういう感じらしいです。
以下の手順で復旧しました。

- ブラウザでMS Storeにサインインする
    - Storeページの右上からサインインをする
- GeForceをクリーンインストールする
    - ヘッダーメニューの「ドライバー」をクリック
    - 「GeGorce」の右側より「ドライバーを再インストール」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160396/775ccaea-6373-2331-ceb9-dd43accd1547.png)

    - 「カスタムインストール」を選択してインストール開始
    - 途中でインストールメニューを選択できる画面になるので「クリーンインストール」にチェックを入れて続行
- インストールが完了したらMS Storeからコントロールパネルをインストール

## まとめ
開発マシンが開発に関係ないところでわちゃわちゃするのは非常にストレスな上に
NVIDIAさんとかは機械学習で本気で使っている人の記事とか
Macだから関係ない人とかいてなかなかゴールにたどり着けなかったので忘備録として・・・
どこかの誰かの助けになれば幸いです。
UnityでVisual Studioのインテリセンス（自動補完/候補）が出ない場合の直し方

#[背景]

UnityをスクラッチからインストールしたはずなのにどういうわけだかVisual Studioがインストールされていなかった。
多分、いや間違いなく俺が悪い。

そこでUnity Hubから、左側のメニューのインストール　→　該当するUnityの右上の３点をクリック　→　モジュールを加える　→　Microsoft Visual Stuido Community 2017の左のマスをクリック　→　実行！

で、いそいそとUnityのメニューから　Assets　→　Open C# Project　でScriptを書き始めたがインテリセンス（自動補完/候補）が出ない(泣)　←　今ここ

#[直し方]

かいつまんで言えば、↓　これを行う。


[Visual Studio で使用するために Unity を構成する](
https://docs.microsoft.com/ja-jp/visualstudio/cross-platform/getting-started-with-visual-studio-tools-for-unity?view=vs-2019#configure-unity-for-use-with-visual-studio)


1. [Edit]\(編集) メニューから [Preferences]\(ユーザー設定\) を選びます。

2. [Preferences]\(ユーザー設定) ダイアログで、[External Tools]\(外部ツール)タブを選びます。

3. [External Script Editor]\(外部スクリプト エディター) ドロップダウン リストから、目的のバージョンの Visual Studio が一覧にある場合はそれを選び、ない場合は [Browse]\(参照) を選びます。

4. [Browse...]\(参照...) を選択した場合は、Visual Studio インストール ディレクトリの中の Common7/IDE ディレクトリに移動し、devenv.exe を選択します。 次に、[Open]\(開く) をクリックします。

5. [External Script Editor]\(外部スクリプト エディター) の一覧から Visual Studio を選択した後、[Editor Attaching]\(エディターのアタッチ) チェックボックスがオンになっていることを確認します。

6. [Preferences]\(ユーザー設定) ダイアログを閉じて、構成プロセスを完了します。

Enjoy!

以上
【HTML】お問い合わせフォームの作り方

<h2>はじめに</h2>

こんにちは。

<a href="https://www.miraidenshi-tech.jp/">未来電子テクノロジー</a>でインターンシップに参加している佐藤詩乃です。

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

今回は、お問い合わせフォームの作り方をご紹介します。

<h2>お問い合わせフォームとは</h2>

お問い合わせフォームとは、閲覧者がウェブサイトのオーナーにメッセージを送ることができる欄です。

![sukusyoo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472468/43ffb544-07f0-5ca6-ed80-9caf5f9d6232.png)

このようなものです。

このフォームを作るHTMLコードをご紹介します。

<h2>お問い合わせフォームのコード</h2>

まず、見出しには h2タグを使用します。



```Python:見出し
<h2>お問い合わせ</h2>
```


<pr>
<pr>
次に、1行入力用のフォームを作ります。
ここでは、お問い合わせフォーム全体のdivを"contact-form"というクラスに指定します。
各フォームの見出しはpタグで指定し、1行入力用のフォームにはinputタグを使用してください。

```Python:1行入力用フォーム


 <div class="contact-form">

        <p>お名前(必須)</p>
        <input>

        <p>メールアドレス(必須)</p>
        <input>

        <p>佐藤への応援メッセージ(必須)</p>
        <input>

```

<pr>
<pr>

複数行入力用フォームには、textareaタグを使用します。

```Python:複数行入力用フォーム

<p>お問い合わせ内容(必須)</p>
        <textarea></textarea>
```

<pr>
送信ボタンを作るためには、以下のコードを使います。
      
```Python:送信ボタン

        <div class="botton">
        <input class="contact-submit" type="submit" value="送信">
        </div>
```

これらをすべてまとめると、以下のコードになります。


```Python:まとめたコード
 <div class="contact-form">

        <p>お名前(必須)</p>
        <input>

        <p>メールアドレス(必須)</p>
        <input>

        <p>佐藤への応援メッセージ(必須)</p>
        <input>

        <p>お問い合わせ内容(必須)</p>
        <textarea></textarea>

        <div class="botton">
        <input class="contact-submit" type="submit" value="送信">
        </div>

        </div>
```
webarenaでubuntu その36

#概要

webarenaでubuntu18.04やってみた。
postfix3.3やってみた。
複数ドメインやってみた。

#main.cfの修正。

```
virtual_alias_domains = hoge1.com hoge2.com
virtual_alias_maps = hash:/etc/postfix/virtual
```

#virtual作成

```
hoge1.com anything
po@hoge1.com po

hoge2.com anything
pp@hoge2.com pp
```

#postmapする。

```
sudo postmap /etc/postfix/virtual
```

以上。
mysqlclientインストール


#１python3-develをインストールするが失敗するので

```
sudo yum install python3-devel mysql-devel
```

#２gccをインストールし

```
yum install gcc
```
#３python3.6のためpython36-develをインストールし
```
yum install python36-devel
```
#４mysqlclientをインストールします
```
sudo pip3 install mysqlclient
```
エンジニアをしながら目を良くした方法

#エンジニアしながら目が良くなった（3年間で0.2→0.8）ので、その方法を紹介します。

まず私のプロフィールから。

- 27歳
- 男
- Web系エンジニア
- 視力は中学生ぐらいから落ち始めた 1.0 → 0.3位まで　原因はPC画面の見過ぎとゲームのし過ぎと思われる

で、３年ほど前から目にいい環境を構築することに成功し、今絶賛視力回復中。（体感で毎日0.005位上がってるイメージ。ちょっとずつだけど確実に良くなっています。）

##早速その方法を紹介
４つあるので重要な順に説明します
### 1.裸眼で過ごす 
これが大前提です。眼鏡をかけちゃうと、自己回復能力が働かなくなるからです。あんまり前が見えなくても気合いで頑張りましょう。気合いです。自分は視力が0.2の時から眼鏡をかけていませんでした。もちろん生活に支障は出ます。車も運転できません。PC画面もろくに見えず、上司に怒られてました。でも自分は意地でも眼鏡をかけませんでした。なぜなら数年後に眼鏡の必要ない快適な世界が待っていると信じていたからです。結局仕事はろくにできず、辞めてしまうことになりましたがそれでも数年後の自分にかけて、眼鏡はしませんでした。

###2.PCモニタはAMVAパネル（VAパネルの改良版）でノングレア（低反射）のものにする
これも非常に大事です。自分の体感ですが、AMVAパネルは最も目に優しいパネルだと思っています。VAパネルの視野角の欠点を補いつつ、黒がしっかりと黒に見える。エンジニアはエディタ等で黒い画面を見ることが多いと思います。このときにIPSパネルやTNパネルの黒だといまいち黒くないというか、まあ要するに目が疲れてしまいやすいんです。IPSパネルの発色は確かにきれいですが、自分はこの職業は目が命だと思っているし、AMVAパネルのしっとりとした色合いが好みです。（ちなみに自分が買ったモニタはIIYAMAのProLite XB2481HSUです。ちょっと古いので今買うのはお勧めしません。）

### 3.スマホのディスプレイにも低反射フィルムを貼る
スマホをよく使う人にとっては上の2よりも重要です。自分は割と視力が変動しやすいタイプだったのですが、どういうときに視力が落ちやすいかと考えたとき、それはスマホを使っているときだったのです。フィルムを貼ってから、スマホを長時間見た後でもあまり目が疲れなくなったので、フィルムを貼らずして私の視力の回復はなかったと思います。

### 4.夜に散歩する
完全に僕個人の体感なのですが、「暗闇で目を凝らす」という行為は視力の回復にとてもいいな気がしています。視力が1.0超えるまではほぼ毎日夜に散歩することにしています。

##以上です。
多分数か月後には私の視力は1.0に届いていると思います。ちなみに1年前に運転免許証から「眼鏡等」の文字はなくなりました。雨の日に曇る眼鏡に煩わされることもないし、コンタクトをつけ外しする必要もありません。数年前の俺ナイス判断！です。20代という、比較的年齢が若いということも視力回復の要因の一つだったとは思いますが、皆様もぜひ試してみてはいかがでしょうか。

###目の解像度、大事。
[python]いい加減覚えろ　pythonで配列作るときの注意

#あれ…これでいいんだっけ…？

pythonで配列書くとき、何かの場合でミスると配列そのものがコピーされちゃって面倒なことになることだけは覚えてるんですけど、それがどういう場合か覚えてないのでまとめます

#基本は内包表記さえすればいい
この通りで、1次元にしても2次元にしてもとりあえず内包表記にしておけばいい。

**1次元の場合**
こちらはそこまで心配する必要はなく、初期化の際には

```python:
list1=[0]*10
list2=[0 for i in range(10)]
```

のどちらでも構わない。

**2次元の場合**
これが注意するべきポイントで、

```python:
list1=[[0]*5]*3
```
とすると終わりである。なぜならここでは、全く同じものを指している[0]*5が3つ生まれただけなので、どれかを変更すると全て変更されてしまうからである。

したがって、2次元の場合、内包表記が優先されるべきであり、

```python
list1=[[[0] for i in range(5)] for j in range(2)]
```

と書くべきっぽい。

###追記(2019/8/27)
コピーするときは

```python
b=a.copy()
```
でokだそうです。ありがとうございます。
Synchroid(BizRobo!)でSalesforceを使ってみた

SynchroidでSalesforce使えるか検証しようと思ったら躓いた、というお話。

これまでの私は、SynchroidでWebページを開くといえば、もっぱらDS。

今回も同じようにDSで検証すればいいだろう..


そう思っていた時期も私にはありました。


#まずはログイン



![ログイン画面.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/851eaf39-3948-0e57-b474-7e829066a367.jpeg)



あれ..?


なんか右側おかしくない...?

いやでも、ログインできれば問題ないでしょ！
と思って、ユーザー名とパスワードを入力し、ログインボタンを押す動作をロボットに覚えさせる。


よし、これでだいじょう..



![IDを検証、の画面に遷移してしまう.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/688b2ded-ad55-94a8-7669-2e57196451b3.jpeg)


あっ、なんかやばいのでてきた。。

(これに関しては、今回の問題とはまた別のSalesforce側での設定の問題でした
　https://developer.salesforce.com/docs/atlas.ja-jp.securityImplGuide.meta/securityImplGuide/security_networkaccess.htm)


いや、でも今回の目的はSalesforceが使えるかどうかだ。

そう思い、強引に認証コードを入れ　ログインをしようとすると..



![ロードしても何も表示されない.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/7cc94ff1-3c30-1dda-3d72-162804c6764a.jpeg)


真っ白だ...


驚きの白さがそこには広がっていました。


え、これ　治るの？

無理じゃね...?


と思ったそんなあなたに、この商品。


それが



**Chromium**

Chromiumとは、Google Chromeと同様のエンジン。
Chromiumはこれまでのエンジンとは異なり、DAでIEを操作するときと同様にロボット作成中にもブラウザ内の状態が変更されます。


#じゃあ、どうやって使うの？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/f2ac0600-ae16-b50e-58c8-a60a3c8ef893.png)

DAのステップを作ります。
デバイスとかは特に必要ありません。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/f472bcb4-6864-54db-69ad-d394d03c5a37.png)


右クリックでOpenステップを選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/c34ddd59-c81a-a3f7-ed2f-11d15856509b.png)


URIにSalesforceのログインページのURLをいれます。

すると、、


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/dd7f9179-ee99-90f4-92e5-dd057d1e1a9b.png)


なんということでしょう！
DS時には表示されていなかった右側の部分までくっきりと！！

あとは、先ほどと同じようにユーザ名とパスワードを入力してやれば解決。


そのまま、


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420678/99ee47b7-7d1b-1285-5b4e-d27185cc791e.png)



Salesforceが開けました！！




ただ結局これはDAなのか、それともDSなのかどっちなんだろう..?

謎は深まるばかりです。
Cloud9でデバッグ時の「A newer version of the AWS SAM CLI is available!」を解決する方法　＋「Unsupported lambda runtime nodejs14.x」も



# 🔷現象
Cloud9でLambda用のNode.jsのプログラムを書いていると、時々起こる現象です。

Cloud9でデバッグを行うと、「A newer version of the AWS SAM CLI is available!」という文言が表示されて、デバッグが実行できない。

<img width="584" alt="スクリーンショット 2019-08-27 15.46.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38099/421f3ed9-45f7-38c7-6aa7-7c842e81f4af.png">

もしくは、「Unsupported lambda runtime nodejs14.x」みたいな、ランタイムがサポートされていなくて、デバッグが実行できない。
<img width="584" alt="スクリーンショット 2022-01-27 10.12.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38099/45106f0b-ccd6-6081-2fe4-45d4607a831b.png">



# 🔷原因

ログに書いてある事が全てです。
Cloud9で使っているAWS SAM CLIのバージョンが古く、AWS SAMが持っているNode.jsのランタイムのバージョンが対応しておらず、エラーになっています。

```
A newer version of the AWS SAM CLI is available!
Your version:   0.2.11
Latest version: 0.19.0
See https://github.com/awslabs/aws-sam-local for upgrade instructions
2019/08/27 06:49:39 Successfully parsed template.yaml
2019/08/27 06:49:39 Connected to Docker 1.38
2019/08/27 06:49:39 Could not initiate nodejs10.x runtime: unsupported runtime
```

# 🔷解決方法

Cloud9の画面下に開かれているコンソールに、以下のコマンドを入力して、SAM CLIのバージョンアップを行う。

```
 pip install --user --upgrade aws-sam-cli
```

以下のコマンドで、SAM CLIが利用できるように、シンボリックリンクを変更する。

```
ln -sf $(which sam) ~/.c9/bin/sam
```

これで、最新のAWS SAM CLIが有効になり、デバッグができるようになります。