OmniAICreator/Qiita-1.07M huggingface dataset:
ASP.NET Core + IIS 10 でWebAPIのDELETEがNOT ALLOWで405の件

# IIS 10でDELETEやPUTが405
ある日突然、DELETEメソッドが405エラーを吐くようになっちまいました。method not allowed!
過去からの情報が出回っているとおり、DELETEとPUTのverbがASP.NET CoreのハンドラではなくWebDavのハンドラで処理される設定になってしまっていることに起因しているようでした。対策のアプローチも「WebDavなんか使わねえから無効化してしまえ」から変わりませんが、IIS 10(Windows Server 2016)においては設定箇所や設定の実装が違う？ようで、超ドはまりしたのでメモしておきます。

# エラー詳細
```
request: DELETE /api/hoge
response:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<title>405 - HTTP verb used to access this page is not allowed.</title>
<style type="text/css">
<!--
body{margin:0;font-size:.7em;font-family:Verdana, Arial, Helvetica, sans-serif;background:#EEEEEE;}
fieldset{padding:0 15px 10px 15px;} 
h1{font-size:2.4em;margin:0;color:#FFF;}
h2{font-size:1.7em;margin:0;color:#CC0000;} 
h3{font-size:1.2em;margin:10px 0 0 0;color:#000000;} 
#header{width:96%;margin:0 0 0 0;padding:6px 2% 6px 2%;font-family:"trebuchet MS", Verdana, sans-serif;color:#FFF;
background-color:#555555;}
#content{margin:0 0 0 2%;position:relative;}
.content-container{background:#FFF;width:96%;margin-top:8px;padding:10px;position:relative;}
-->
</style>
</head>
<body>
<div id="header"><h1>Server Error</h1></div>
<div id="content">
 <div class="content-container"><fieldset>
  <h2>405 - HTTP verb used to access this page is not allowed.</h2>
  <h3>The page you are looking for cannot be displayed because an invalid method (HTTP verb) was used to attempt access.</h3>
 </fieldset></div>
</div>
</body>
</html>

```
というかんじ。Response Headerには↓がAllowだよ、という返事が。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248679/e073ba3f-121b-4940-6e4a-1dfec0666d75.png)

# 解決策、失敗編
Web.configのsystem.webServerの中に`<remove name="WebDav" />`を追記！などの記事が散見されますが、そのとおりにやっても`DELETE`は405のままだったり、そもそもWeb.configの文法エラーになったり・・。とにかく、結果、うまくいきませんでした。
ちなみに ASP.NET Core 3.0 でデフォルト？のweb.configはこんな感じです。
system.webServerのディレクティブの中にどう書いたら正しいのか、、結局よくわからん。

```
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath="dotnet" arguments=".\hogehoge.dll" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
    </system.webServer>
  </location>
</configuration>
```

# 解決策、成功編
結果、configベースでなくIISの設定マネージャでWebDavハンドラを削除したらDELETEも使えるようになりました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248679/aa94babc-cbf6-34b9-d8a2-456d87e7e249.png)
「モジュール」を選択し、その中の`WebDAVModule`を削除。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248679/6ab37f8e-8d1e-3fb4-1eaa-299002987d5d.png)

なお削除の下に`親構成に戻す`で復活しますので、 **試しにやってみる** ことができます。

やってることはDELETEなどのverbにWebDAVModuleが反応しちゃうのを無効にするだけなので従来のweb.configやapplicationhost.configをいじる方法と変わらないんだとは思いますが、なにせconfigの正しい修正の在り方が変わりまくってる気がして、過去の情報が通用しません。こーゆーの増えてきたね。
何はともあれ、一件落着！
Unable to list target platforms.が出て困った


#環境
Unity5.6
Android2.3.2

#とっかかり
UnityAndoridプラグイン開発でUnity5.6に戻して確認したかったが「Unable to list target platforms」が出てこまった。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/802b708e-61a4-d0a8-b053-959807a45910.png)

検索結果⇓

【Unity、Android】最新のAndroidStudio入れたらUnable to list target platforms.が出て困った
https://blog.naichilab.com/entry/unable-to-list-target-platforms

⇓
Unity5.6でプロジェクトは出力&AndrodiStudio2.3.2でビルド及び実行できた。

#確認したこと
・Unity5.6のExportは単一project。
・unity2019のExportは複数projectであり、AppMainではなくNativeLib(***.so)はLIB側にある。
　→　<font color="DeepPink">AndroidStudio4でLIB側はC++でステップ実行できない。</font>

昔の方がよかったんじゃね？

#エラー対応

```

Error:org.gradle.api.internal.tasks.DefaultTaskInputs$TaskInputUnionFileCollection cannot be cast to org.gradle.api.internal.file.collections.DefaultConfigurableFileCollection
Possible causes for this unexpected error include:<ul><li>Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.)
<a href="syncProject">Re-download dependencies and sync project (requires network)</a></li><li>The state of a Gradle build process (daemon) may be corrupt. Stopping all Gradle daemons may solve this problem.
<a href="stopGradleDaemons">Stop Gradle build processes (requires restart)</a></li><li>Your project may be using a third-party plugin which is not compatible with the other plugins in the project or the version of Gradle requested by the project.</li></ul>In the case of corrupt Gradle processes, you can also try closing the IDE and then killing all Java processes.


```

⇓⇓　こうして、
buildscript { 
    ... 
    dependencies { 
    classpath 'com.android.tools.build:gradle:2.3.1' 
    } 
} 

⇓
18:08	Error running test1: Instant Run requires 'Tools | Android | Enable ADB integration' to be enabled.

[Tools]-[Android]-[Enable ADB integration]を実行する。
⇓
実行できた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/f54f7a0e-f81e-3afc-d8e2-6a2bf9ce5e30.png)
JavaScriptのオブジェクトとRubyのクラスの比較


**JavaScriptのオブジェクトとRubyのクラスについて比較を行います。**

```ruby
class Fruits

  def initialize(name, color)
    @name = name
    @color = color
  end

  def info
    puts "#{@name}は#{@color}です。"
  end

end

apple = Fruits.new("りんご", "赤色")
apple.info
#出力結果: りんごは赤色です。
```
上記のrubyの記述をJavaScriptの記述を私なりに変換してみます。
(より簡単な記述がある場合どうかご容赦願います。)
JavaScriptにおけるメソッドは、関数のことなので...

```JavaScript
const Fruits = function(name, color){ //仮引数
  this.name = name //this.が@の代替となっている見たいです。
  this.color = color
  this.getName = function(){ return this.name } //rubyでは省略可能でしたreturn、JavaScriptで省略した場合エラーが出てしまいます。
  this.getColor = function(){ return this.color }
} 

const apple = new Fruits('りんご', '赤色') //実引数 //インスタンスの生成
console.log(`${apple.getName()}は${apple.getColor()}です。`)  //console.logがputsの代替です。
             //インスタンス.関数式名で呼び出し。()が無いとエラーが出てしまいます。
//出力結果: りんごは赤色です。
```

しかし、JavaScriptにおいては以下の記述が可能です。

```JavaScript
const Fruits = function(name, color){
  this.name = name
  this.color = color
} 

const apple = new Fruits('りんご', '赤色')
console.log(`${apple.name}は${apple.color}です。`)
//出力結果: りんごは赤色です。
```

定義したrubyにおけるインスタンス変数の値をオブジェクト外で出力を可能にしています。
これをrubyの記述に置き換えるとゲッターを用いることになり、以下の記述になります。

```ruby
class Fruits

  def initialize(name, color)
    @name = name
    @color = color
  end

  def name
    @name
  end

  def color
    @color
  end

end

apple = Fruits.new("りんご", "赤色")
puts "#{apple.name}は#{apple.color}です。"
#出力結果: りんごは赤色です。
```

以上となります。

最後までご覧頂きありがとうございました。

誤っている点、知識が不足している部分について、ご指摘願えれば幸甚に尽きます。
vsCodeでPythonのUnresolved Import Warningを消したい

### vscodeで自作のPythonクラスモジュールにUnresolved Import Warningが出る
***
以下を参考にしたが、解決できなかった。
https://blog.mrym.tv/2019/08/vscode-python-unresolved-import/

念のため、
1. .envファイルを追加
2. .envの中身に、PYTHONPATH=codefolderを追加
3. settings.jsonの中にpathが通っていること
3. "python.pythonPath": "rootPath\\Python\\Python36\\python.exe"
4. "python.envFile": "${workspaceFolder}/.env"

英語のサイトで以下を修正したら、Warningが消えた。

vscodeのsettings.jsonの中に
python.jediEnabled=falseをtrueにする。 

https://medium.com/@syarif.secondchance/vs-code-python-unresolved-import-warning-ea9bba3fa9af

***
以上
Azure App ServiceにAzure Pipelinesを使って楽々デプロイ


#Azure　App Service ×　DevOpsならAzure Pipelinesで楽々デプロイ
Azure DevOpsで管理しているソースをAzure App Serviceにデプロイするなら、Azure Pipelinesでデプロイするのが超楽です。
AppServcieのデプロイセンターメニューからだと、1か所入力し他はマウスでポチポチするだけでほとんど完了。
一回セットすれば更新はgitでPushするだけで自動でデプロイしてくれます。
※2020/10月現在、Azure Pipelinesはプレビュー状態のようなので注意お願いします。

##環境
Azure App Service
.NET Core 3.1

##①デプロイセンター画面でAzureReposを選択
AzureにログインしてデプロイしたいApp Serviceを選択。
メニューのデプロイメントから「デプロイセンター」を選択し表示された画面から「Azure Repos」を選択
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494941/26300acc-1b15-ce4f-693b-a493702bdaa4.png)

##②Azure　Pipelinesを選択し「続行」を選択
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494941/c4e0be54-5a69-4fc8-0212-e19d472c286e.png)


##③デプロイ対象を選択
DevOpsのプロジェクトがリストにセットされているので選ぶだけです。
一番下のスタートアップコマンドだけ入力してください。
ex .NET Coreの場合
dotnet XXXXX.dll

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494941/d50cd3fb-8644-f660-b158-273448959403.png)

##④最終画面でチェックし、OKなら完了ボタンをクリック
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494941/18d2e072-277b-7723-11a2-a1d20d79e747.png)
【Vue.js】Vue.jsの仕組みについて、知っておくべきこと

#DOMとは

DOMとは、マークアップ言語(html, xml)を、プログラミング言語によって、操作することでWebページの見た目を変化させることができる仕組み。


![スクリーンショット 2021-03-05 18.31.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562793/83d2fa95-11cf-859f-5b78-843de4fdc7fc.png)



#仮想DOMとは

先ほどのDOMツリーを内容の更新時に全て読み込むのではなく、はじめに全て読み込んだ後は更新した差分のみを仮想のDOMツリーに追加する。
そうすることで、よりリアクティブにwebページに反映することができる。


![スクリーンショット 2021-03-05 18.32.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562793/b92921b2-6a6e-b55c-31fe-5a2543d2387d.png)




#Vue.jsとは

一方向での、JavaScriptオブジェクト(データ)とDOM要素のやりとりではなく、双方向にすることでよりリアルタイムでスピーディにデータのやり取りを実現できる、JavaScriptのライブラリ。
双方向でのデータのやり取りをするための仲立ちをするのが、Vueインスタンス(ビューモデル)。

![スクリーンショット 2021-03-05 18.33.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562793/1e478410-d0f8-8b92-97dc-4f19e55fc64a.png)



#Vue.jsのライフサイクル

Vue.jsの機能を反映させるためには、Vueインスタンスが生成された後に、データやDOM要素に接続される必要がある。
その順序こそが、ライフサイクルのなのである。


![IMG_2362.jpeg.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562793/1e2f7e5b-d136-a779-bd1b-2fdac3ab41dc.jpeg)





そして、データと、DOM要素にアクセスできるかで、ライフサイクルに因んだオプションの違いを比較できる。


```vuejs:
<template>
  <div class="sample">
    {{ count }}
  </div>
</template>

<script>
export default {
  data() {
    return {
      count: 0,
    };
  },
  beforeCreate() {
    console.log("beforeCreate");
    console.log(this.count);
    console.log(this.$el);
  },
  created() {
    console.log("created");
    console.log(this.count);
    console.log(this.$el);
  },
  beforeMount() {
    console.log("beforeMount");
    console.log(this.count);
    console.log(this.$el);
  },
  mounted() {
    console.log("mounted");
    console.log(this.count);
    console.log(this.$el);
  },
};
</script>
```


```console:
# データにもDOM要素にもアクセスできない
beforeCreate
undefined
undefined

# データにはアクセスできるが、DOM要素にはアクセスできない
created
0
undefined

# データにはアクセスできるが、DOM要素にはアクセスできない
beforeMount
0
undefined

# データにもDOM要素にもアクセスできる
mounted
0
<div class="sample">
  0
</div>
```
コンピュータの管理に「ローカルユーザーとグループ」がない場合のユーザー追加方法

##コンピュータの管理を開いてみると...
![WS000001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631523/659b11b9-fa06-592e-7c50-f9c774b3686e.jpeg)
###「ローカルユーザーとグループ」が項目にないんですが...？

これはどういうことだろうと調べてみました。
するとある質問サイトでこんな回答がありました。

>Windows10 Homeの場合は、コンピューターの管理に「ローカルユーザーとグループ」は表示されません。

これを見て私のPCを即確認しました。
![WS000003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631523/0714904c-7b69-4466-98f7-8ce38a664c96.jpeg)

Windows10 Homeでした。
どうやらHomeエディションでは「ローカルユーザーとグループ」は操作できないようです。


##ユーザー追加はコマンドプロンプトから実行する必要がある

こちらのサイトにユーザーアカウントの追加方法が丁寧に説明されています。詳しくはこちらをどうぞ。
 [Windows10 Home でのユーザーアカウント操作](http://it-support.cbit.co.jp/article/446720239.html)

##Windows10ではAdministratorアカウントがデフォルトで無効となっている
上記の問題はWindows 10 Pro もしくは Enterpriseがよく出てきますが、Homeエディションでも同様です。
先ほど紹介したサイトに有効にする方法も記載されていますのでぜひ読んでみてください。
JTAGではなくSDカードのBoot.binから実行したプログラムに対してブレークポイントを張る (Zynq UltraScale+)

# 概要
JTAGではなく、QSPI, SDカードから実行した場合もXSCTを使ってデバッグが可能
https://japan.xilinx.com/html_docs/xilinx2019_1/SDK_Doc/xsct/use_cases/xsdb_debug_program_running_on-target.html
と公式にあるので、実際に確認してみました。

# 環境
- Ultra96 V2
- Boot.binは生成して、SDカードに既に書き込まれている前提

# 確認
Ultra96 V2がSDカードに入ったBoot.binから起動した状態で、XSCT開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540259/ef09497d-ee0b-f3cf-c14c-c6d946ff5eca.png)

`connect`でターゲットと接続します。
`targets`でターゲットの状態を確認します。
今は、CortexR5の#0だけ動かしている状態です。

```console:XSCT
xsct% connect
attempting to launch hw_server
****** Xilinx hw_server v2019.1
  **** Build date : May 24 2019 at 15:13:31
    ** Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.

INFO: hw_server application started
INFO: Use Ctrl-C to exit hw_server application
****** Xilinx hw_server v2019.1
  **** Build date : May 24 2019 at 15:13:31
    ** Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.

INFO: hw_server application started
INFO: Use Ctrl-C to exit hw_server application
INFO: To connect to this hw_server instance use url: TCP:127.0.0.1:3121

tcfchan#1
xsct% targets
  1  PS TAP
     2  PMU
     3  PL
  4  PSU
     5  RPU
        6  Cortex-R5 #0 (Running)
        7  Cortex-R5 #1 (Reset)
     8  APU (L2 Cache Reset)
        9  Cortex-A53 #0 (APU Reset)
       10  Cortex-A53 #1 (APU Reset)
       11  Cortex-A53 #2 (APU Reset)
       12  Cortex-A53 #3 (APU Reset)

xsct% targets 6
xsct% memmap -file ./ultra96_only_app_cmake/build/main/app.elf
```

Boot.binに、FreeRTOS CLIを入れているので
ターミナルに `task-stats` と入力すると、起動する関数にブレークを設定します。

```c:ブレーク設定する関数
static BaseType_t prvTaskStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString )
{
    const char *const pcHeader = "     State   Priority  Stack    #\r\n************************************************\r\n";
    BaseType_t xSpacePadding;
...
```

ブレークは `bpadd` で設定します。
ドキュメント : https://www.xilinx.com/html_docs/xilinx2018_1/SDK_Doc/xsct/breakpoints/reference_breakpoints_bpadd.html

```console:XSCT
xsct% bpadd -target-id 6 &prvTaskStatsCommand
3
xsct% Info: Breakpoint 3 status:
   target 6: {Address: 0x1006c0 Type: Hardware}
```

ターミナルから `task-stats` と入力すると
以下が表示されてブレークされたことがわかります。

```
xsct% Info: Cortex-R5 #0 (target 6) Stopped at 0x1006c0 (Breakpoint)
195: {
```

ステップ実行するには `nxt` と入れます
ドキュメント : https://www.xilinx.com/html_docs/xilinx2018_1/SDK_Doc/xsct/running/reference_xsct_running.html

```
xsct% nxt
xsct% Info: Cortex-R5 #0 (target 6) Running
xsct% Info: Cortex-R5 #0 (target 6) Stopped at 0x1006d8 (Step)
196: const char *const pcHeader = "     State   Priority  Stack    #\r\n************************************************\r\n";
xsct% nxt
xsct% Info: Cortex-R5 #0 (target 6) Running
xsct% Info: Cortex-R5 #0 (target 6) Stopped at 0x1006e4 (Step)
204: 	configASSERT( pcWriteBuffer );
```
マニュアル作成方法

**背景**
201004 23:34:11
PJで環境構築等の手順書作りを任された。初めての作業で手間取った。
なんども作るが突っ返されかなり苦労した。
そこで得た知見を忘れないようにするための備忘録として残す。


###優れたマニュアルとは？


####【結論】

- 相手が気持ち悪く感じないこと


####【相手に不快感を感じさせないためのマニュアル作りのテクニック】

- 色分け(できたら3色までに抑える)
- 構成を整える
- 文章の書き方にルールを設ける
- 同じ言葉、単語を使うようにする



##参考にした記事（いつもありがとうございます。）

[ドキュメント作成スキル向上を目指す人向けおすすめ記事まとめ
](https://qiita.com/yasuoyasuo/items/1eb7298f91a44dce7abc)
JavaScriptの関数、まずは記述だけでも覚える


##JSでいう関数とは
　rubyの学習で、メソッド読んでいたもの。様々の処理をまとめて、呼び出すことができる。rubyでは、`def メソッド名　〜 end`と定義していたが、JSでは、`function 関数名 ( ){ 処理 }`で表す。
　また、定義の方法が様々あり、難しいので、基本的な記述に絞って説明をする。

###関数宣言(基本形)

```js
function 関数名 ( 引数 ){ 
 #処理
 }
```
特徴として、先に読み込まれるというのがある。

…関白宣言みたい（笑

###関数式

```js
変数 = function( 引数 ) {
 #処理 
}
```

関数を中に入れたもの
先に読み込まれない

###無名関数

```js
const test = function(  ) {
 #処理
}
console.log('test') #関数を呼び出す
```
無名関数とは、関数名なしで関数を定義することができる。より、記述が少なくなる。

###アロー関数

```js
const 変数名 = () => {
}
```

無名関数よりもさらに記述を少なくできる。

##ポイント
- [x] 　関数宣言と関数式では読み込まれるタイミングが違う。
- [x] 　記述が似ているので、注意が必要。

##最後に
　関数は今回取り上げたもの以外にもたくさんある。
HerokuとSequelの接続方法

#HerokuとSequelの接続とは

**デブロイ後に本番環境でより確実に動作確認をするものと
思ってもらえるといいです。**


**・今回行う作業に至るまでの簡単な流れを説明します。**
今回はHerokuとSequelの接続方法のため、その過程で使用する
コマンド等の説明は省かせて頂きます。

まずは、ローカルリポジトリをリモートリポジトリにpushした後に
Herokuにpushします。次は、Herokuにアプリケーションの情報を追加する
ことができたので本番環境で確認をします。
このままだと本番環境で動作確認はできますが、本番環境で
行った動作がちゃんとSequel Proに保存されているのか確認ができません。
ですが、ここでちゃんと確認ができるようにした方がいいでしょう。

では、実際に確認をするために接続をしましょう！
接続方法は、下記を参照して下さい。
# 接続方法

* やることリスト
     1. HerokuのCLEARDB_DATABASE_URLをターミナルで確認する
     2. Sequel Proにて標準接続モードで確認した情報を必要箇所入力し接続する
     
#1. HerokuのCLEARDB_DATABASE_URLをターミナルで確認する

**始めにターミナルにて下記のコマンドを入力してください。**

```rails:ターミナル
% heroku config
```

**入力後、実行すると下記のように情報が表示されます。**


```rails:ターミナル
test@testAir testtext % heroku config
=== testtext Config Vars
CLEARDB_DATABASE_URL:     mysql://ユーザー名:パスワード@ホスト/データベース?reconnect=true
DATABASE_URL:             mysql2://ユーザー名:パスワード@ホスト/データベース?reconnect=true
LANG:                     en_US.UTF-8
RACK_ENV:                 production
RAILS_ENV:                production
RAILS_LOG_TO_STDOUT:      enabled
RAILS_MASTER_KEY:         c5aef76eac83535f519216e8aaa4a254
RAILS_SERVE_STATIC_FILES: enabled
SECRET_KEY_BASE:          0026593c36ba4b8f040237f98b42e26008b4ae2fc0e9fcd3c092096aca685c579df7bfc6f331b834fbe0faac07ac726b3a759cfe86d7de2e64b3b89ddcbb0912
```

**これでCLEARDB_DATABASE_URLをターミナルで確認する
ことができました。**
確認ができたので次に行きます。

#2. Sequel Proにて標準接続モードで確認した情報を必要箇所入力し接続する

**始めに下記の画像のようにソケットではなく標準を選択してください。**

![4c7b9a6f41d7a901402764ac2f871a8a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762918/400cdaac-16b6-8573-e3e9-52713660535a.png)

**選択した後は、先ほどターミナルで確認した情報(下記の情報）を項目に当てはまるように入力していきます。**

<font color="Red">**⚠️　下記の情報に表示されてある前後の//,:,@,/?,は入力しなくて大丈夫です。
 //,　:,　等で囲われいている中身の情報を入力してください。**</font>

```rails:ターミナル
% CLEARDB_DATABASE_URL:     mysql://ユーザー名:パスワード@ホスト/データベース?reconnect=true
```

**入力後は、すぐに接続せずにその下にある項目の[お気に入りに追加]を
クリックして頂くと下記画像のように左のお気に入りの項目にHerokuが
追加されます。**
お気に入りしておくと今後いつでもHerokuを選択して接続すれば
HerokuのDBを確認することができます。


![0b7f47cfcce4aed1913a3658d025adcc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762918/00b77111-6ce4-02c1-9433-a8f5d6b1a922.png)

#まとめ

***HerokuとSequelの接続を行っておけば、本番環境の動作確認をしながら
DB情報の確認も同時に行えるため、より確実に本番環境での動作確認が
行えるのではないでしょうか。***
Pandasで機械学習のトレーニングデータを目的変数とそれ以外に分割する方法

## データの読み込み（CSVファイルを想定）

```
import numpy as np
import pandas as pd

train = pd.read_csv('train.csv')
```
## トレーニングデータを目的変数（target）とそれ以外に分割
```
# 目的変数を削除
train_x = train.drop("target",axis=1)
# 目的変数のみを取得
train_y = train["target"]
```
PHP　~個人的アウトプット用語集~

# foreach
[構文]
foreach (反復可能なデータ構造 as 要素)
[結果]
配列の中のデータが順番に出力されます。
![スクリーンショット 2020-10-03 18.29.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663122/f27d5a64-a28d-e2d8-5b3d-36f0607d2337.png)

### 別の記法
} の部分を：にして、最後にendforeach;やendif;とする事で見やすくなります。![スクリーンショット 2020-10-03 19.33.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663122/980f670c-caf5-704c-5c08-6428a38739e7.png)
↓
![スクリーンショット 2020-10-03 19.30.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663122/a3c9ec8f-1ba9-9f11-b84a-e04d77918f8d.png)

# for
[構文]
for([初期化処理];[条件式];[更新式])
[結果]
１行目
[初期化処理]
iを初期化しています。なのでiは０
[条件式]
i<=10はiが１０になるまで
[更新式]
i++はi=i+1をしていますので、ループされる度に+1されていきます。
[結果]
1
2
...
10
と表示されます。
![スクリーンショット 2020-10-03 19.46.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663122/a3161d69-8dfc-7810-fcde-a59c475abe9f.png)

# empty(変数)
変数の中が空の場合true
それ以外はfalse
を返します。

# ファイルの読み込み　[require include]
requireは、読み込みに失敗すると処理を止める。
includeは、処理を止めない。処理を止めなくても致命的でない時に使う。
サバイバルでの生き残り日数について① ―「ザ・ネイキッド」／How many days they can survive? -"The Naked and Afraid"①

サバイバルでの生き残り日数について ―「ザ・ネイキッド」／How many days they can survive? -"The Naked and Afraid"

## 背景／Background
最近、ディスカバリーチャンネルのザ・ネイキッドにはまっています。男女のペアが、事前に選んだ2つのアイテムのみ（服すら来ていない）を使って21日間生き延びるというものです。
見ていると、チームワークやメンタルの強さが成功をもたらしているように感じました。成功の要因は何かもっと知りたいと思い、分析してみることにしました。
「タイタニックの生き残り予測」ほどではありませんが、最終的には予測アルゴリズムを作れたら良いなと思っています。

I really like "The Naked and Afraid" in the "Discovery Channel".
In "The Naked", a man and women have to survive for 21 days in a jungle, beach, or mountain. They only have 2 items they chose and they even do not have clothes.

When I watch it, I feel like teamwork and mental fullness bring success.
I would like to know more about the factor of success, and I try to analyze it. In the future, I would like to make an algorithm that estimates how many days the players will survive.

## 開始時のPSR値と生き残り日数／PSR at the start and the days they survived
まず、開始時のPSR値と生き残り日数の関係を調べました。使用したデータはシリーズ1のみです。
Figure 1-1は自分自身でのPSR値と生き残り日数を比較したものです。グラフ内のラインは、最小二乗法による線形近似の結果を示します。

I considered the relation between their own PSR at the beginning and the number of survived days. I used the data only from season 1.
Figure 1-1 shows the relationship between their own PSR and the number of days they survived. The line in the figure is a linear regression line. 


#### Figure 1-1
![own_PSR_all.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253896/00812057-5429-1210-3e86-73319d935c38.png)

バラツキはあれど、おおよそ右肩上がりになっていることがわかります。
傾向として自分自身のPSR値が高いほうが生き残りやすいようです。この近似線を数式化してみると、おおよそ
```[生き残り日数] = 2.22 * [開始時のPSR] + 2.86```
となり、PSRが1あがるごとに、生き残る日が2.22日増えることがわかります。

Players tend to survive for more days when they have higher PSR. On average, the number of survived days increases by  2.22 days when their PSR increase by 1. By linear regression, we get;
```[# of survived days] = 2.22 * [PSR at the beginning] + 2.86```

___
Figure 1-2は、Figure 1-1を男女別に見たものです。
Figure 1-2 shows the men/women data in Figure 1-1. 
#### Figure 1-2
![own_PSR_mf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253896/3d6fa22e-33fd-c3f7-b000-ea710a6ae61f.png)


線形予測のラインを見ると、男性の方が傾きが大きいです。男性の方が、PSR値が高くなった時に生き残り日数が増えるようです。雑に考えると「比較的、女性においての方が、開始時のPSR値が、サバイバルの生き残り日数に影響を与えにくい」と言えます。さらに、生き残り日数の人ごとの分散は男性が24.62、女性が30.17でした。女性の方が、より「サバイバル生活を送る中での健康状態もしくはメンタル状態の変化が生き残り日数に重要な影響を与える」と言えるのかもしれません。

The two linear regression lines indicate that males tend to survive for more days when the PSR increase. If I think roughly, PSR at the beginning affects the number of the survived days less about women than about men. In another word, maybe women's physical or mental conditions tend to change more than men's during survival because the STD of the number of women's survived days is 30.17, bigger than men's.
多分動くから！　スクレイピングやってみよう！


# はじめに

スクレイピングをやってみたいなと思いながら中々手を付けずにいましたが、ようやく一念発起して触れ、その際に調べたことをまとめました。
Webスクレイピングを始めてみようという方に参考になれば幸いです。

# 環境

```shell
  $ python --version
  Python 3.7.4
  $ conda --version
  conda 4.7.12
  $ pip -V
  pip 19.2.3 from ■■■■■■■■■■■■■■■■■■■ (python 3.7)
```

# インストール

今回はanacondaを用いてスクレイピングを行います。
必要な方はインストールを行ってください。
[anaconda Windows版](https://www.python.jp/install/anaconda/windows/install.html)
[anaconda Mac版](https://www.python.jp/install/anaconda/macos/install.html)

anacondaをインストールしない場合は、下記のライブラリをpipからインストールしてください。（anacondaには標準搭載されています。）

- Requests
- Beautiful Soup 4
- lxml
    $ pip install requests
    $ pip install beautifulsoup4
    $ pip install lxml


# ライブラリについて
## Requests

WebサイトのHTML・XMLの情報や画像等の取得を簡単に行うことができるHTML通信ライブラリ。
Pythonの標準ライブラリにurllibというHTTP通信ライブラリが搭載されているが、APIがまともに**使えない**（Requests公式見解）**。**


## Beautiful Soup 4

取得したHTML・XMLから特定のテキストを抽出する、HTMLパーサーライブラリ。


## lxml

HTMLパーサー。
Pythonにはhtml.parserが標準ライブラリとしてありますが、lxmlの方が使い勝手が良い様です。


# Webスクレイピングを始めよう

某サイトのトップニュースを想定してコード例として記していきます。
記事の最後にサンプルコードをまとめて置いています。


1 pyファイルを作成し、以下の記述でrequestsとBeautifulSoup4をインポートします。

```python
  import requests
  from bs4 import BeautifulSoup
```


2  URLを設定し、RequestsでHTMLを取得します。

```python
  url = 'https://■■■■■■■■■■■■■■/'
  rq = requests.get(url)
```



3  HTMLパース用のオブジェクトを作成します。

```python
  bs = BeautifulSoup(rq.text, 'lxml')
```


4  Chromeの開発者ツールを使用し、必要な部分を探します。
　トピックニュースのタイトルに共通している部分はliタグで囲まれ、クラス名が「topicsListItem」となっていますね。

```html
  <ul class="topicList">
    <li class="topicsListItem">
      <a href="https://●●●●●">
        トップニュース１
      </a>
    </li>
    <li class="topicsListItem">
      <a href="https://▲▲▲▲▲">
        トップニュース２
      </a>
    </li>
    ・
    ・
    ・
  </ul>
```  


5  4で探した条件を元にHTMLから必要部分を切り出します。
```python
 newsList = bs.find_all("li", class_="topicsListItem")
```

この状態ではliタグごと取得している状態になります。

6  切り取ったリストからテキスト部分のみが欲しいのでget_text()してから出力しています。

```python
  for news in newsList:
    print(news.get_text())
```

**結果**

    トップニュース１
    トップニュース２
    ・
    ・
    ・

きちんと取得できましたね！


# サンプルコード

```python
  import requests
  from bs4 import BeautifulSoup
  
  url = 'https://■■■■■■■■■■■■■■/'
  rq = requests.get(url)
  
  bs = BeautifulSoup(rq.text, 'lxml')
  newsList = bs.find_all("li", class_="topicsListItem")
  
  for news in newsList:
    print(news.get_text())
```
Ansible初期設定 SSH接続

#0. はじめに
Ansibl実行時に管理サーバと管理対象サーバ間でSSH接続し、構成管理を行う。
この記事では、管理サーバ上の一般ユーザと管理対象サーバのroot間のSSH接続初期設定をplaybookで実行する方法を記載する。

#1. 準備
管理対象サーバにAnsibleをインストール。

```
ansible --version
ansible 2.9.11
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3.6/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.6.8 (default, Apr 16 2020, 01:36:27) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]
```

#2. 管理サーバに一般ユーザを作成
playbookに以下タスクを記載し、一般ユーザを作成する。この時、userモジュールでssh鍵も作成する。
※localでの実行のため、実行のためにSSHの接続準備等は不要。

```
- name: make group
  group:
    name: "{{ item }}"
  loop: "{{ test_ID }}"

- name: make user
  user:
    name: "{{ item }}"
    group: "{{ item }}"
    generate_ssh_key: yes
    ssh_key_bits: 2048
    ssh_key_file: ".ssh/id_XXXX_rsa"
  loop: "{{ test_ID }}"
```

#3. SSH接続用playbookを作成
初期接続設定のため、connectionをparamikoと設定し公開鍵登録のためのplaybookを作成。

```
- hosts: ap_server
  connection: paramiko
  tasks:
    - name: ssh
      authorized_key:
        user: root
        state: present
        key: "{{ lookup('file', '/home/{{ ID }}/.ssh/id_XXXX_rsa.pub') }}"
```

併せて、SSHの設定ファイルの配置も行う。

```
- name: config
  copy:
    src: /work/files/config
    dest: /home/{{ item }}/.ssh/config
    mode: '0600'
    owner: "{{ item }}"
    group: "{{ item }}"
  loop: "{{ test_ID }}"
```

configファイルでは秘密鍵のパスを設定。

```
Host (管理対象サーバのホスト名 or IP)
  IdentityFile ~/.ssh/id_XXXX_rsa(秘密鍵のパス)
```

#4. inventory 作成
Inventoryに管理対象サーバの情報を記載。

```
[ap_server]
test_server ansible_ssh_user=root ansible_ssh_pass=XXXXXXXX
```

#5. ansible.cfg修正
接続にparamikoを利用するため、接続時に自動でhost keyを書き込む設定を有効化。

```
# When using persistent connections with Paramiko, the connection runs in a
# background process.  If the host doesn't already have a valid SSH key, by
# default Ansible will prompt to add the host key.  This will cause connections
# running in background processes to fail.  Uncomment this line to have
# Paramiko automatically add host keys.
host_key_auto_add = True
```

#6. 実行結果
1.で作成したユーザに切り替え、playbookを実行。

```
ansible-playbook -i inventory playbook.yml
```

**検証**
検証用として、以下playbookを作成し実行。
inventoryファイルはパスワードの記載していないものに修正すること。

```
---
- hosts: ap_server
  tasks:
    - file:
        state: directory
        path: /tmp
```

上記playbookの実行に成功。SSH接続が適切に実施されたことが確認できた。

```
ansible-playbook -i inventory test.yml
～(省略)～
PLAY RECAP *********************************************************************
test_server              : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
```
RSpecのテストでActiveRecord::RecordInvalid:Validation failed: Email has already been taken エラー

RSpecですべてのテストが成功して一安心！とおもってpushしてCircleCIのテスト結果を見てみたら、、

**ぎゃーーー！！大量のテストに失敗している！！**

エラー文の一部がこちら

```ruby:Error!

ActiveRecord::RecordInvalid:Validation failed: Email has already been taken
```

これは最初のテストの実行が終了した際、テストデータが削除（ロールバック）されずに残ってしまっていたため、2回目のCircleCIのテストでバリデーションに失敗してエラーが発生したと考えられます。
つまり、メールアドレスはすでに登録されていたため、2回目のテストを実行したときにテストデータが生成できず失敗してしまったのです。

フィーチャースペックであればdatabase_cleanerというgemを入れるとこれを解決できます。
このgemを入れるとテスト終了時にDBをロールバックしてくれます。

しかし、私が行ったテストはシステムスペックです。システムスペックはRSpec3.7から導入されたもので、テストデータのDBをデフォルトでロールバックしてくれます。database_cleanerは不要です。

それなのに、なぜロールバックされていないんだ、、途方にくれました、、

## 解決策
これは一瞬で終わりました。

```ruby:rails_helper.rb
 RSpec.configure do |config|
  config.use_transactional_fixtures = true
  # ↑この一文がfalseになっていた
           〜 （省略） 〜
end
``` 
トランザクションのロールバック設定がfalseになっていました。
フィーチャースペックを使っていた時、database_cleanerのgemを導入する際にここをfalseにしたのでその設定のままシステムスペックを実行してしまってました。

この変更をtrueにしただけではdbのロールバックがされるようになっただけで、現状テストデータはまだ残ったままなのでテストは同じように失敗してしまいます。
この後、テスト環境におけるDBデータをリセットする必要があります。。

```shell

docker-compose run app rails db:migrate:reset RAILS_ENV=test
```

これをしたらテストに無事パスするようになりました。

## 最後まで読んでいただきありがとうございます！
日々の学習をアウトプットしています！！少しでもお役に立てれば幸いです！また、ご指摘や感想などあればコメントいただけると嬉しいです！
Javascriptでウィンドウのリサイズ終了後に処理

タイトルの通り
良く忘れるのでメモ

``` Javascript
// リサイズが止まった後、指定時間(ミリ秒)後処理を行う
const term = 300;
// タイマーの受取変数
var timer = 0; 

// ウィンドウがリサイズされたとき
window.addEventListener("resize", function(){
    // リサイズしているときは、タイマーをリセットする
    clearTimeout(timer);

    // 指定時間後、一度だけ処理を実行
    timer = setTimeout(function(){
        // 実際の処理を記載↓↓
        alert("処理実行");
    }, term);
});
```

ブラウザのウィンドウをリサイズしたときに画面の表示を変更するような処理では、resizeのfunction直下に書くと、描画処理が多すぎてえらいことになるので、こんな風にすると良い。
※記載しているコメントの解釈が若干間違っているかも、、、
※IEは画面読み込み時にも処理が走ってしまいます、、 ifでtimer>0とか入れると良いかと
pythonエンジニア認定試験に合格したので勉強法を公開

#概要
python3エンジニア認定試験とは一般社団法人Pythonエンジニア育成推進協会によって実施されてる試験です。
自分の情報としては普段はjavaで開発を行っており他の言語等では開発した経験はほとんどない状態です。
今回はpython3の基本知識を身に着けるために当試験を受験してみました。

以下公式ページの説明

>◆受験方法
受験日：通年
試験センター：全国のオデッセイコミュニケーションズCBTテストセンター
申込URL：http://cbt.odyssey-com.co.jp/pythonic-exam.html
受験料金：1万円（税別）　学割5千円（税別）
※申込み方法や受験方法に疑問がある場合は、オデッセイコミュニケーションズへ直接お問い合わせください。
※試験内容については公平を期すためにご質問へは一切回答致しません。

>◆試験概要
試験名：Python3 エンジニア認定基礎試験
（英名：Python 3 Certified Engineer Basic Examination）
資格名：Python3 エンジニア認定基礎試験合格者
（英名：Python 3 Basic Grammar Certification）
概要：文法基礎を問う試験
問題数：40問（すべて選択問題）
試験時間：60分
合格ライン：正答率70％
出題範囲：主教材であるオライリー・ジャパン「Pythonチュートリアル 第3版」の掲載内容を出題範囲として、以下の比率で出題いたします。また、一般的な知識からも出題されます。
認定教材：こちらをご覧ください。
認定スクール：こちらをご覧ください。

#出題範囲
>主教材であるオライリー・ジャパン「Pythonチュートリアル 第3版」の掲載内容を出題範囲として、以下の比率で出題いたします。また、一般的な知識からも出題されます。

と記載がありますが、チュートリアルはWEBで無料も見ることができます。
https://docs.python.org/ja/3/tutorial/

出題問題は下記の通りです。

|章立て|出題数|出題率|
|:-----------|------------:|:------------:|
|1章|食欲をそそってみようか|1|2.5%| 
|2章|Pythonインタープリタの使い方|1|2.5%|
|3章|気楽な入門編|6|15.0%|
|4章|制御構造ツール|9|22.5%|
|5章|データ構造|7|17.5%|
|6章|モジュール|2|5.0%|
|7章|入出力|1|2.5%|
|8章|エラーと例外|4|10.0%|
|9章|クラス|2|5.0%|
|10章|標準ライブラリめぐり|4|10.0%|
|11章|標準ライブラリめぐり─PartII|1|2.5%|
|12章|仮想環境とパッケージ|1|2.5%|
|13章|次はなに?|0|0.0%|
|14章|対話環境での入力行編集とヒストリ置換|1|2.5%|
|合計|40|100.0%|

これを見ると大体3～10章を勉強しておけば大丈夫そうです。
9章以降は出題数のわりに覚えるのが面倒な事項が多くてコスパ悪いです。

#勉強方法
チュートリアルを一通り流し読みします。（最初は内容をなんとなく把握するだけで問題ありません）

模擬試験を下記URLから受けることができますので後はひたすらこれを解くだけです。
https://exam.diveintocode.jp/exam

手順としては、

①模擬試験を解く
　　　↓
②模擬試験で間違えた問題をチュートリアルの該当箇所に行って確認する

①と②を繰り返して合格点が出るまで解くだけです。

実際の試験も模擬試験のような問題が出題されましたので模擬試験を行っていれば問題ないかと思います。

#感想とまとめ
今回試験を受けましたが多言語の実践経験があればそれほど苦戦することはありませんでした。
自分が勉強に賭けた期間は数週間程度です。
正直とって今後に生かせるかどうかは微妙ですが、基礎知識を身に着けるきっかけにはなるのではないでしょうか。
AIトレードシステム開発（続編）

#続編

　とりあえず、Ｂログの方はトレード終了宣言をした。
http://1969681.blog66.fc2.com/

　このところ仕事でIT講習会の参加のため、10月中は進展していない。
（11月ぐらいからＥ検定に向けた勉強ついでに実装を進める）

#AIトレードシステム開発

このところ、ＡＩのマーケット予測を色々調べてきているが、
時系列データをＡＩに食べさせるという、
やや無茶ぶりな予想屋が多いことに嘆いている。

勿論だがＡＩにデータをなんでも突っ込んで、
なんかそれらしい答えを得て、喜ぶ輩が多いのであるが
自分は少なくとも、テクニカルを使って
根拠のある予想を立てないと、
意味がないと考えている。

そんな中で、いまひらめいている案としては、
ＡＩに食わせるデータとしては、POINT&FIGUREが
一番しっくりくると考えている。

# ポイント＆フィギュア
![Fig94.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/0ce06dd4-2402-5584-616a-bef5b656cb22.gif)


このチャートの良い点としては、×と〇が交互に並んでいて
時間という概念が無いからである。

よく言うＡＩ学習においては

+ パラメータの特徴を際立たせる
+ 極限まで情報を圧縮する
+ 次元数を減らす

などが一般的に言われていることである。

よく価格の変動率など、微妙な数値の変化を
学習機に突っ込んでＡＩになんとかさせるとか
無理くりなことを一般的にやりがちであるが
これはハッキリ言って、AI無学者のなんの
知恵のかけらも感じない愚かな考えである。

ＡＩの研究者として、ＡＩの特性を理解することと、
ＦＸの研究者として、ＦＸの特性を理解すること

結局、この両方の知識の融合を無くして、
これを成すことは、まったくもってあり得ないのである。


# モデル化

さて、言っていても始まらないので、とりあえずは机上で
モデリングするところから始めてみる。

ＰＦの特徴をみると、以下のことがわかる。

+ ×と〇は常に繰り返されている
+ ×→〇の変化では、一段下から始まる
+ 〇→×の変化では、一段上から始まる


この特徴は、全くもって無視しても構わないことになる。

とりあえず下記のＰ＆Ｆチャートであれば、
×の数をプラス、〇の数をマイナスの数値におきかえると、

このチャートは、下記の数列に等しくなる。

12 , -7 , 7 , -5 , 5 , -3 , 12 , -5 , 5 , -5 , 6 , -6 , 3 , -6 , 2　　　　max = 12 , min = -7 , Range = 19

![Fig94.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/0ce06dd4-2402-5584-616a-bef5b656cb22.gif)


さらに前後の和を取って、

5 , 0 , 2 , 0 , 2 , 9 , 7 , 0 , 0 , 1 , 0 , -3 , -3 , -4    max = 9 , min = -4 , Range = 13

という風に、ダイナミックレンジを下げることができる。
ＡＩで言えば、学習機の感度が上がる方向になる。

ちなみに、もう一回やるのは、ダメな模様

5 , 2 , 2 , 2 , 11 , 16 , 7 , 0 , 1 , 1 , -3 , -6 , -7     max = 16 , min = -7 , Range = 23



そしてＡＩ的には、次の数字が予想できれば、
トレードのポジションの転換点を知ることができる。

Ｐ＆Ｆチャートの優れているところは、
このように数列の羅列の中に、ありとあらゆる値動きが
織り込まれている点だ。


というわけで、先ずはモデルの定義が終わったので、
為替データから上記の数列を出すところから、
コーディングすることとする。

つづく

http://1969681.blog66.fc2.com/
色々な機械学習処理をブラウザ上で試せるサイトを作った

# はじめに

機械学習やJavaScriptの勉強がてらに、ブラウザ上で機械学習の手法等をデモできるサイトを作成しています。
このまま埋もれさせるのもどうかと思い、せっかくなので公開しました。

https://ai-on-browser.github.io/

# これは何？

- 様々な機械学習をブラウザ上で簡単に試すことができるサイトです
- クライアントサイドのJavaScriptのみで動作します
- 機械学習部分は（行列演算含め）外部ライブラリを一切使用していません
- コードは[Github](https://github.com/ai-on-browser/ai-on-browser.github.io)に公開しています
- [npmパッケージ](https://www.npmjs.com/package/@ai-on-browser/data-analysis-models)としても公開しています。

# どうやって使う？

- https://ai-on-browser.github.io/ にアクセスする
- 手動でデータを作成したり、設定可能なデータセットを選択したりする
- Task（処理）を選択する
- Model（モデル）を選択する
- Modelに応じてボタンなどを操作し、学習を行う

# 何ができる？

- データ
    - 手動で作成する二次元データ
    - Iris

    など
- 処理
    - クラスタリング、分類、回帰、外れ値検出、次元削減、特徴量選択、密度推定、データ生成、補間
    - 強化学習
    - 平滑化、時系列予測、変化点検知
- モデル
    - 古典的機械学習手法
    - ニューラルネットワーク（GANやDQNを含む）

    など
    最新の一覧は[README.md](https://github.com/ai-on-browser/ai-on-browser.github.io/blob/master/README.md)にあります。

# その他

- 実装時に参考にさせていただいたサイトは、ソースコードに記載しています。
- Google Chromeの最新版を推奨します。（最新のSafariで動作することを確認しました）
- 行列演算もニューラルネットワーク関連処理も手作りですので、処理速度は遅いと考えてください。
- UIが貧弱です。
- バグがそこかしこに散らばっています。
- いくつか明確に動作していないと思われるモデルが存在します。（SDARなど）
- ソースコードにコメントがほぼ書いていないコードです。
- 趣味でやっていることなので、色々と許してください。

# おわりに

車輪の再発明ではありますが、誰かの役に立てば幸いです。
またそのうちに、それぞれの手法を説明していこうと考えています。
【venv】Ubuntuでpython仮想環境をつくる

# はじめに
Ubuntu上でvenvを用いて**python仮想環境を作成する方法**について説明します。
仮想環境の作成コマンドはいくつかありますが、今回は手早く作成できる**venv**について話します。

- venv
- pyenv
- virtualenv
- pyenv-virtualenv
- pipenv

**python仮想環境を初めて作成する方**、**とりあえず手早く作成したい方**、**作成の方法を忘れてしまった方**の参考になれば幸いです。

# 環境
- Ubuntu 20.04 LTS

# python3のインストール確認
Ubuntuのインストールは省略します。（インストールは参考サイトを参照ください）

`python3 -V`でインストールされているpython3系のバージョンを確認できます。
これを入力後、バージョンが表示されたらpython3はすでにインストールされています。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598279/8f6b2b61-f531-87ae-1d93-6fc82af10f32.png)
python3がインストールされていない場合は、次のWebページを参考にしてインストールしてください。
[Ubuntu環境のPython](https://www.python.jp/install/ubuntu/index.html)
このページによると**デフォルトのpython3はあまりいじらない方がよく、別途python3をインストールした方が良いらしい。**初耳でした。。。

# python仮想環境を作成する
`python3 -m venv yourvenv`で**yourvenv**という名前の仮想環境を作成できます。
環境名を変えたい場合は、yourvenvを任意の名前に変更してください。

# 仮想環境を起動する
作成するだけでは**仮想環境にはまだ入っていません**ので、ご注意下さい。
`source ./yourvenv/bin/activate`を入力して仮想環境に入ります。 
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598279/6cb7217a-d908-9954-1d4e-cd247bc2377a.png)
左側に（yourvenv）と表示されていれば、仮想環境に入っています。（図ではmyvenv）

# 仮想環境を終了する
`deactivate`で仮想環境を終了することができます。
`deactivate`は仮想環境を終了するだけで、**環境そのものを削除するものではありません。**  
そのため、再度仮想環境に入りたい場合は、`source ./yourvenv/bin/activate`で入りなおすことができます。

左側の（yourvenv）がなければ、もとの環境に戻っています。

# 補足
## 仮想環境のpythonパッケージを確認する
仮想環境内で`python3 -m pip freeze`を実行することでインストールされているパッケージを一覧で表示します。
ここ表示されるのは仮想環境のパッケージであり、元の環境のパッケージとは別物です。

## 仮想環境内でパッケージをインストールする
いつもと変わらず、`python3 -m pip install package-name`でインストールできます。

# 参考サイト

- [venv: Python 仮想環境管理](https://qiita.com/fiftystorm36/items/b2fd47cf32c7694adc2e)
- [pyenv、pyenv-virtualenv、venv、Anaconda、Pipenv。私はPipenvを使う。](https://qiita.com/KRiver1/items/c1788e616b77a9bad4dd)

## Ubuntuのインストールと実行

[【Windows10+Ubuntu20.04+VSCode】WSL2上のUbuntu20.04をWindows上のVSCodeで動かす](https://tkmt-hrkz.hatenablog.com/entry/2020/07/17/%E3%80%90Windows10%2BUbuntu20_04%2BVSCode%E3%80%91WSL2%E4%B8%8A%E3%81%AEUbuntu20_04%E3%82%92Windows%E4%B8%8A%E3%81%AEVSCode%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%99)
新しくインストールしたOSから、GitHubにアクセスできるようにするまでにすること

# はじめに

新しく導入した OS で GitHub を使うには、GitHub に SSH の登録が必要になります。

今回は SSH を使って GitHub 上のリポジトリにアクセスできるようにします。

# 手順

## 1. git が入っているか確認

Ubuntu に git が入っているか確認します。（デフォルトで入っていることが多い）

```bash
git --version
```

なければインストールします。

## 2. 公開鍵を生成

Ubuntu 側に下記コマンドを入力して公開鍵を生成します。

```bash
ssh-keygen -t rsa
```

以下のように出力されます。
鍵の保存先を設定することができます。事情がなければそのまま Enter を押下して先に進みます。

```bash
Generating public/private rsa key pair.
Enter file in which to save the key (/home/%USERNAME%/.ssh/id_rsa):
```

下記のように出力されます。
パスフレーズを設定できます。
設定しない場合はそのまま Enter を押下します。

```bash
Created directory '/home/%USERNAME%/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```

下記のように生成された鍵の情報が出力されます。

```bash
Your identification has been saved in /home/%USERNAME%/.ssh/id_rsa
Your public key has been saved in /home/%USERNAME%/.ssh/id_rsa.pub
The key fingerprint is:
SHA***:*** %PCNAME%
The key's randomart image is:
+---[RSA ***]----+
|******           |
|******           |
|******           |
|******           |
|******           |
|******           |
|******           |
|******           |
|******           |
+----[SHA***]-----+
```

## 3. 生成された公開鍵を確認

下記コマンドで生成した暗号が表示することができます。

```bash
cat ~/.ssh/id_rsa.pub
```

例：

```bash
ssh-rsa ************** = %PCNAME%
```

冒頭の `ssh-rsa` も含め、id_rsa.pub の内容全てをクリップボードに保存します。

## 4. GitHub 上での操作

1. 
    GitHub 上で `Settings` を開きます。
    
    ![githubimage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433437/85ca7031-ff16-6b00-5a0f-eb73150a4e5d.png)

2. 
    左のメニューバーから `SSH and GPG keys` を選択します。

3. 
    右上の緑色のボタン `New SSH key` をクリックします。

4. 
    `Title` に任意のタイトル（PC の名前等）を入力し、`Key` に先程クリップボードに保存した内容を貼り付けます。
 
5. 
    `Add SSH key` ボタンをクリックすると紐付けが完了します。

## 5. リモートリポジトリをローカルにクローン

1. 
    GitHub でクローンしたいリポジトリを開き、緑色のボタン `Clone` をクリック後、コピーボタンをクリックします。（下図参照）

    ![githubimage2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433437/31967c30-e757-fc6a-3754-84ad1615f2c8.png)


2. 
    ローカルの任意のディレクトリ上で下記コマンドを実行すると、クローンできます。

    ```bash
    git clone %ここに貼り付ける%
    ```
【SQL】DISTINCTで重複行をまとめる方法



#書き方

```sql

SELECT DISTINCT 列名 FROM テーブル名;
```


#サンプルデータの作成


```sql
CREATE TABLE sample_players (
    no int NOT NULL,            -- 背番号
    last_name varchar(100),     -- 名
    first_name varchar(100),    -- 姓
    PRIMARY KEY (no)            -- 主キー
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
 
-- テストデータ
INSERT INTO sample_players VALUES('1', '山田','太郎');
INSERT INTO sample_players VALUES('2', '山田','太郎');
INSERT INTO sample_players VALUES('3', '山田','太郎');
INSERT INTO sample_players VALUES('4', '山田','Q太郎');
```

#DISTINCTを使わない場合

```sql
mysql> SELECT last_name from sample_players;

+-----------+
| last_name |
+-----------+
| 山田       |
| 山田       |
| 山田       |
| 山田       |
+-----------+
```

#DISTINCTを使う場合



```sql


mysql> SELECT DISTINCT last_name from sample_players;
+-----------+
| last_name |
+-----------+
| 山田       |
+-----------+
```

#複数行でDISTINCTを使う場合

```sql


mysql> SELECT DISTINCT last_name, first_name from sample_players;
+-----------+------------+
| last_name | first_name |
+-----------+------------+
| 山田       | 太郎       |
| 山田       | Q太郎      |
+-----------+------------+
```
#参照
[【SQL入門】DISTINCTで重複行をまとめる方法をわかりやすく解説](https://www.sejuku.net/blog/54990)
EC2 などの Linux に git をインストールする方法


備忘のために Linux に git をインストールする方法をメモ

まずは各種パッケージをアップデート

```
$ sudo yum update -y
```

それから git をインストール（簡単）

```
$ sudo yum install git -y
```

インストールできていることを確認します。

```
$ git version
git version 2.23.3
```
rails g model実行時に反応しない場合　※ドットインストールのRails入門#5をAWS Cloud9から実行時

ドットインストールのRails入門#5は、ローカル環境でやる手順になっている。
https://dotinstall.com/lessons/basic_rails_v3/41805

しかし、ローカル環境構築に失敗したので、AWS cloud9で実行したところ、** rails g model **の段階でエラーが発生したので対処法を書きます。

# 環境

Windows10
AWS Cloud9

# 事象
ドットインストールの手順通りコマンドを打ったが数分待っても実行されず
　　

```ruby:teminallog
ec2-user:~/environment/myblog $ rails g model Post title:string body:text
```
　
Ctrl+Cでキャンセルするとこのようなログがでた
　　

```ruby:teminallog
ec2-user:~/environment/myblog $ rails g model Post title:string body:text
^CTraceback (most recent call last):
        15: from bin/rails:3:in `<main>'
        14: from bin/rails:3:in `load'
        13: from /home/ec2-user/environment/myblog/bin/spring:15:in `<top (required)>'
        12: from /home/ec2-user/environment/myblog/bin/spring:15:in `require'
        11: from /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/spring-2.1.1/lib/spring/binstub.rb:11:in `<top (required)>'
        10: from /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/spring-2.1.1/lib/spring/binstub.rb:11:in `load'
         9: from /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/spring-2.1.1/bin/spring:49:in `<top (required)>'
         8: from /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/spring-2.1.1/lib/spring/client.rb:30:in `run'
         7: from /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/spring-2.1.1/lib/spring/client/command.rb:7:in `call'
         6: from /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/spring-2.1.1/lib/spring/client/rails.rb:24:in `call'
         5: from /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/spring-2.1.1/lib/spring/client/command.rb:7:in `call'
         4: from /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/spring-2.1.1/lib/spring/client/run.rb:35:in `call'
         3: from /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/spring-2.1.1/lib/spring/client/run.rb:42:in `warm_run'
         2: from /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/spring-2.1.1/lib/spring/client/run.rb:62:in `run'
         1: from /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/spring-2.1.1/lib/spring/client/run.rb:117:in `verify_server_version'
/home/ec2-user/.rvm/gems/ruby-2.6.3/gems/spring-2.1.1/lib/spring/client/run.rb:117:in `gets': Interrupt

```
　
いろいろ調べると**spring**というGemfileの中に書いているパッケージが邪魔をすることがあるらしい。
そこで**spring stop**というコマンドでバックグランド処理している**spring**を止めてみました

```ruby:teminallog
ec2-user:~/environment/myblog $ spring stop
Spring stopped.
```

その後、** rails g model **を実行すると想定通りの結果が返ってきましたね！

```ruby:teminallog
ec2-user:~/environment/myblog $ rails g model Post title:string body:text
Running via Spring preloader in process 12505
      invoke  active_record
      create    db/migrate/20201004132353_create_posts.rb
      create    app/models/post.rb
      invoke    test_unit
      create      test/models/post_test.rb
      create      test/fixtures/posts.yml
```
GCPのすゝめ【Google App Engine編】

## 概要
Google App Engineを使う際の手順とまとめです。

**公式ドキュメント**
- [Google App Engine Node.js スタンダード環境のドキュメント](https://cloud.google.com/appengine/docs/standard/nodejs?hl=ja)

## 準備
[Google Cloud SDK](https://cloud.google.com/sdk/docs?hl=ja#install_the_latest_cloud_tools_version_cloudsdk_current_version)

### projectの作成

```bash
# 新しいプロジェクトを作成。
$ gcloud projects create [YOUR_PROJECT_ID] --set-as-default
# プロジェクトが作成されたことを確認。
$ gcloud projects describe [YOUR_PROJECT_ID]
# プロジェクトで App Engine アプリを初期化し、そのリージョンを選択。
$ gcloud app create --project=[YOUR_PROJECT_ID]
```

## ディレクトリー構成
```bash
.
├── app.yaml
├── index.js
├── package-lock.json
└── package.json
```

## アプリケーションの作成
```bash
$ mkdir <project name>
$ cd <project name>
$ npm init
$ npm install express
```

```js:index.js
const express = require("express");

const app = express();

app.get("/", (req, res) => {
  res.status(200).send("Hello, world!").end();
});

// Start the server
const PORT = process.env.PORT || 8080;
app.listen(PORT, () => {
  console.log(`App listening on port ${PORT}`);
  console.log("Press Ctrl+C to quit.");
});

module.exports = app;
```

以下を追加

```json:package.json
{
 ...
 "scripts": {
    "start": "node index.js",
    ...
  },
 ...
}
```
GAEの設定

```app.yaml
runtime: nodejs10
```

## ローカル環境での起動
**起動**

```bash
$ npm run start
```

http://localhost:8080/

**停止**
Ctrl+C

## デプロイ
```bash
# App Engine にデプロイします。
$ gcloud app deploy
# サービスをデプロイして表示
$ gcloud app browse
```
※プロジェクトの課金の有効化や使用するAPIが有効になっていなくてデプロイに失敗することがあります。
とっても簡単ですのでその際はログにしたがって設定をしていってください。

## 連携できるGoogle Cloud サービス

### ストレージ
- [Cloud Firestore](https://cloud.google.com/appengine/docs/standard/nodejs/using-cloud-datastore?hl=ja)
- [Cloud SQL](https://cloud.google.com/sql/docs/mysql/connect-app-engine?hl=ja)
- [Cloud Storage](https://cloud.google.com/appengine/docs/standard/nodejs/using-cloud-storage?hl=ja)

### キャッシュ
- [Memorystore](https://cloud.google.com/appengine/docs/standard/nodejs/using-memorystore?hl=ja)

### ユーザー認証
- [Firebase Authentication](https://cloud.google.com/appengine/docs/standard/nodejs/authenticating-users?hl=ja#firebase_authentication)  
**参考記事**：[コピペで使うFirebase【Authentication編】](https://qiita.com/ovama-koffee/items/38e650067c8920e116b9)

### アナリティクス
- [Google アナリティクス](https://cloud.google.com/appengine/docs/standard/nodejs/integrating-with-analytics?hl=ja)

## 感想
firebaseやCloudRun同様にとっても簡単にアプリケーションを公開できました。
今回使用したスタンダード環境では無料枠があるので、ちょっとしたアプリを公開する際にも料金が発生しづらいのが嬉しいポイントですね！
【HTML/CSS】フッターの固定方法

#Railsでフッターを固定する
###footerを固定する
```application.html
<body>
...
<footer>フッター</footer>  

</body>
```
```application.css
body{
min-height:100vh ;
position: relative;
}
footer{
  width: 80%;
  height:50px;
  position: absolute;/*←親要素に対して、絶対位置を決める*/
  bottom: 0; /*ページの下端からの距離が0の位置*/
}
```
<p>ここまでで、footerをページの下に固定することはできた。しかし、、、</p>
---

###スクロールダウンするとbodyの中身がfooterと被る

<p>このエラーに対しては</p>
```application.css
body{
min-height:100vh ;
position: relative;
padding-bottom:50px;
box-sizing:border-box;
}

```
<p>で解決しました。</p>

<p>親要素のpadding-bottomをfooterの高さよりも高くしてbodyとfooterを被らせない。そして、box-sizingにより親要素であるbodyに他の要素を追加しても親要素の高さが崩れないようにしている。</p>
2020/10/4　テックキャンプ14日目　アウトプット

#Rails 投稿アプリをつくる　ツイートの保存
- 第1段階ツイート投稿ページにアクセスする
- 
- newアクションのルーティングを設定、コントローラーに定義
- Tweetクラスのインスタンス変数を生成
- ツイート投稿画面のビューにヘルパーメソッドform_withとmodelオプションを使う
- 第2段階でツイート投稿ページで投稿作業を行う
- 
- form_withのリクエストに対応する、createアクションのルーティングを設定
- フォームからのデータの保存方法
- ストロングパラメーターとは、指定したキーを持つパラメーターのみを受け取るように制限する役割
- 使う理由は受け取るパラメーターを制限しなければ、仕様以外のパラメーターも使われてしまうため
- →他人に勝手にパスワードを変えられてしまうことを防止

続く
c言語で2次元文字列配列を関数から返すやり方のメモ

# はじめに
c言語をつかっていて、2次元文字列配列を関数からmain関数に返すやり方のメモを書き残します。
※ポインタ初心者なので、説明が間違っていたらご指摘お願いします。

# プログラム

```c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void test(char**,unsigned int,unsigned int);

const unsigned int sz_fld = 50 + 1;
const unsigned int sz_ffld = 10;

int main(void) {
    char fld[sz_ffld][sz_fld];
    // 配列fldの初期化
    for (unsigned char i=0;i<sz_ffld;++i) {
        strcpy(fld[i],"");
    }

    // mallocで領域確保
    char** pfld = malloc(sz_ffld*sizeof(char*));
    for (unsigned int i=0;i<sz_ffld;++i) {
    // fld配列の先頭のアドレスをplfd(ポインタ型変数)にいれる
        *(pfld+i) = &fld[i][0];
    }

    // ポインタ型変数pfldと２次元配列のそれぞれの要素数sz_ffld,sz_fldを関数に渡す
    test(pfld,sz_ffld,sz_fld);

    // 関数から返ってきた文字列を表示させる部分
    for(int i = 0; i<3; i++){
        printf("%s\n",fld[i]);
    }

    // malloc関数で確保されたメモリを解放
    free(pfld);

    return(0);
}

void test(char** fld,unsigned int m,unsigned int n) {
    // 入力するポインタを用意 
    char a[10][8] = {"1111","2222","3333"};

    for(int i = 0; i<3; i++){
    // a[i]に格納された文字列をstrcpyをつかってポインタが指し示す番地（fld+i）にコピーするイメージ
        strcpy(*(fld+i),a[i]);
    }
    return;
}

```

# 結果
paiza.ioで実行してみたら下記のような結果となった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212276/f5594be7-05d7-84bb-d06c-e6d7d2a2816e.png)



# 参考
- [Returning a 2D char array in C
](https://stackoverflow.com/questions/8144917/returning-a-2d-char-array-in-c)
- [char**型のポインタ変数を用いてmalloc関数を2段階用いることにより...](https://kakuyomu.jp/works/1177354054881541503/episodes/1177354054891818118#end)
ONNX Runtimeでプロファイルを取ってみる

[Rasperry Pi 4のCPUでDeep Learningを高速化](https://qiita.com/project_raizin/items/6d51173df31a08b7800d "前記事")の続きです。

Deep Learningを高速化するためには、どの処理がどれくらいの時間を消費しているかを調査して、実際の処理時間を削減していく必要があります。そのため、まずはONNX Runtimeのプロファイル機能を使用してプロファイリングを行います。

プロファイル機能を有効にする方法は[ONNX公式チュートリアル](https://microsoft.github.io/onnxruntime/python/auto_examples/plot_profiling.html "")に記載されています。

```sample.py
import onnxruntime

options = onnxruntime.SessionOptions()
options.enable_profiling = True          # <- プロファイル機能有効化
session = onnxruntime.InferenceSession(path_to_model, options)

[プロファイル対象]

prof_file = session.end_profiling()
print(prof_file)
```
プロファイル結果はJSON形式で保存されます。また、プロファイル結果はChromeに内蔵されているTracingツールで可視化できます。(ChromeのURLに**chrome://tracing/**と入力するとツールが起動します。)

今回、**MobileNetV1 depth 1.0 224x224**で画像分類を実行するケースでプロファイルを取ってみます。各モデルは[ONNX Runrimeのグラフ最適化](https://github.com/microsoft/onnxruntime/blob/master/docs/ONNX_Runtime_Graph_Optimizations.md "")を行ったモデルを使用します。

## プロファイル結果
![mobilenetv1_prof1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507949/0269d428-1a93-ff2f-2bf4-10a1fe77defc.png)
モデルのロード、セッション初期化、モデル実行の順に処理がされています。
![mobilenetv1_prof3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507949/2a874d48-8d0d-f0f1-8869-2c559035dd07.png)
モデル実行部分を拡大すると、BatchNormalization処理が融合されたConvolution処理が複数回実行されています。
(本来であればBatchNormalizationは独立して処理されるはずですが、[ONNX Runrimeのグラフ最適化](https://github.com/microsoft/onnxruntime/blob/master/docs/ONNX_Runtime_Graph_Optimizations.md "")の結果、Convolution処理に融合されています。)

プロファイル結果をまとめると以下の表のとおりです。

|項目| 処理時間(ms) |割合(%)|
|---:|--------:|---:|
|全処理|157.19| - |
|Convolution|148.017|94.2|
|gemm|6.053|3.9|
|その他|3.12|1.9|

全体の処理時間を短縮化するためには、Convolution処理をなんとかしないといけないということがわかりました。
どのようなアプローチが必要かを次回以降で検討していきたいと思います。