OmniAICreator/Qiita-1.07M huggingface dataset:
Rails Tutorial　第11章  いったん完了

##2020/8/8 1.0時間
途中休憩を入れ進めました。
##2020/8/9 1.5時間
11.2まで完了しました。
##2020/8/10 1.5時間
11.3.1　まで完了しました。
##2020/8/11 4時間
リスト11.34まで進め、その後で泥沼にはまりました。
この日が１週間の夏休みの最終日で時間をかけられました。
##2020/8/12 0.5時間
夏休みが終わって勤務日が始まり、朝の時間に少しだけ進めました。
##2020/8/13 0.5時間
リスト11.38まで進めました。
##2020/8/14 1.0時間
演習11.3.3.3でエラーになり時間がかかりました。
##2020/8/15 2.0時間
11.3まで終わりました。SendGridがどういうものか調べました。この時点で新しいサービスを始めて使うという点で、何となく嫌な予感がしました。
##2020/8/16 1.0時間
SendGridに登録を申請しました。
IDを有効化するのを待つことになりました。
早くても翌営業日だそうです。
まだログインできません。
##2020/8/17 0.5時間
SendGridよりメールが来て、登録に必要な情報が足りないとのこと、追記して返信しました。
##2020/8/18 0時間
SendGridの登録がまだと分かり、この日はお休みです。
##2020/8/19 1.0時間
SendGridより登録完了のメールが来ました。
進めようとしたところ、Addonの追加でエラーになり、ネットを調べたのですが解決しません。
##2020/8/20 1.0時間
SendGridのAddonの追加のエラーについて、継続してネットを調べました。
##2020/8/21 0.5時間
SendGridのAddonの追加のエラーについて、登録の問題なのかもしれないと思い、ネットの窓口へ問い合わせをしました。
##2020/8/22 0.5時間
SendGridの窓口である構造計画研究所よりメールがあり、Addonについてはサポート外なので、Herokuまたは米国Sendgridへ問い合わせるよう回答がありました。
Sendgridでの送信はあきらめ、いったん11章を完了としました。
米国Sendgridのサイトに問い合わせをしました。


8/5からの夏休みで進むかと思ったのですが、SendGridが動かず時間がかかりました。
所要時間は16.5時間です。

##SendGridのAddonの追加でエラー

```bash
ubuntu:~/environment/sample_app (master) $ heroku config:get SENDGRID_PASSWORD

ubuntu:~/environment/sample_app (master) $ heroku config:get SENDGRID_USERNAME

```


環境変数が表示されません。
おかしいと思い、addonが設定されているか調べました。

```bash
ubuntu:~/environment/sample_app (master) $ heroku addons

Add-on                                       Plan       Price  State  
───────────────────────────────────────────  ─────────  ─────  ───────
heroku-postgresql (postgresql-closed-92625)  hobby-dev  free   created
 └─ as DATABASE

The table above shows add-ons and the attachments to the current app (fathomless-mesa-17878) or other apps.
```
sendgridが表示されないので、もう一度addons:addしてみましたがエラーです。

```bash
ubuntu:~/environment/sample_app (master) $ heroku addons:add sendgrid:starter
Creating sendgrid:starter on ⬢ xxxx
 ▸    An error was encountered when contacting the add-on partner to create sendgrid:starter. Please try again later.
```

ネットで調べたところ、同じ現象の方がいました。
この方は12章をやったところ、解決したと書いてありました。私もいったん諦めて12章を進めることにしました。

>herokuにSendGridアドオンを追加したいです。rails tutorial 第11章
https://teratail.com/questions/285535
HerokuでRails credentialsを設定する

# 概要
Herokuでcredentialsを設定する際に困ったのでメモ

# 環境
ruby ruby 2.7.1p83
Rails 6.0.3.2

# 初期設定
まずcredentialsを利用するためにkey設定をオンにする

```ruby:config/credentials/production.rb
config.require_master_key = true
```

# Rails 5.2で設定
herokuにログインして、RAILS_MASTER_KEYを設定する

```
heroku config:set RAILS_MASTER_KEY=`cat config/master.key`
```

# Rails 6.0以降で設定
rails 6からcredentialsを環境ごとに分離することができるようになった。[Railsガイド 主な変更](https://railsguides.jp/6_0_release_notes.html#railties-%E4%B8%BB%E3%81%AA%E5%A4%89%E6%9B%B4)
もし、環境を分離した場合、参照する鍵のパスを変えなければいけない。

```
# productionの場合
heroku config:set RAILS_MASTER_KEY=`cat config/credentials/production.key`
```
send_keysが動作しないとき

#1　この記事は

スクレイピングライブラリーSeleniumにて、Webブラウザ上のテキストBOXに文字の入力を行うときに、サイトによっては所望の文字が入力できなかったり入力速度が遅くなったりします。その対応法です。


#2　解決法

アカウントログイン画面にてログインを行う場面です。アカウントを自動入力する場合
send_keysでは、下記のコードを使います。

![107.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/b0ba70ee-881a-9c36-4cda-93bf8c27df56.jpeg)

```python:test.py
ID="abcdefg"
elem_username = browser.find_element_by_name('loginid') 
elem_username.send_keys(ID) 
```


しかしながら、は所望の文字が入力できなかったり入力速度が遅くなる場合は、execute_scriptを使用すると解決します。

```python:test.py
ID="abcdefg"
browser.execute_script('document.getElementsByName("loginid")[0].value="%s";' % ID) 
```
Scapyのコードを少しみてみる。特殊メソッド__div__, __getitem__ とかのオーバロード。

#目的
少し用事があり、例えば、Scapyのコードはどんな感じが見てみた。
Scapyとは、
**Scapy is a powerful Python-based interactive packet manipulation program and library.**
（引用：https://pypi.org/project/scapy/）


Pythonの素人？（詳しくない意）の、ワタシには、かなり難しいコードでした。

まず、**特殊メソッドのオーバロードあたりで、コードが
理解できなくなった**ので、わかったことをこの記事のメモにする。

#わかったこと

引用コードは、すべて、
https://github.com/secdev/scapy
から。

## \_\_div\_\_ のオーバロード

使い方:

```python
    a = IP(dst=dest) / TCP(flags="S", seq=i, sport=65000, dport=55556)
    b = IP(dst=dest)/ICMP()
```

作用：
**オブジェクトを「/」で、くっつける。**

以下のような感じのコードでオーバロードされている。

```python
    def __div__(self, other):
        if isinstance(other, Packet):
            cloneA = self.copy()
            cloneB = other.copy()
            cloneA.add_payload(cloneB)
            return cloneA
        elif isinstance(other, (bytes, str)):
            return self / conf.raw_layer(load=other)
        else:
            return other.__rdiv__(self)

```

## \_\_getitem\_\_のオーバロード

使い方:

```python
        seq = pkt[TCP].seq
```

作用：
**[ ]で、一部を取り出す。**

以下のような感じのコードでオーバロードされている。

```python
    def __getitem__(self, cls):
        if isinstance(cls, slice):
            lname = cls.start
            if cls.stop:
                ret = self.getlayer(cls.start, nb=cls.stop, **(cls.step or {}))
            else:
                ret = self.getlayer(cls.start, **(cls.step or {}))
        else:
            lname = cls
            ret = self.getlayer(cls)
        if ret is None:
            if isinstance(lname, Packet_metaclass):
                lname = lname.__name__
            elif not isinstance(lname, bytes):
                lname = repr(lname)
            raise IndexError("Layer [%s] not found" % lname)
        return ret
```

#まとめ
上記のオーバーロードは、便利に見えるので、他のモジュールとかでも使われているかも。
役立つかもしれない情報は、以下。

* a[iii] のメソッド名は、 \_\_getitem\_\_ です。

コメントなどあれば、お願いします。:candy:
この程度の処理は、他の言語でも沢山あるのかも。。Cぐらいしかわかっていないワタシには、基本的な記号（オペレータ）がオーバロードされると、多少、戸惑う。
【Laravel】テストでセッションへ保存できないときの対応法

# 環境
Laravel5.5

#保存できなかったときの場面
ログイン認証が成功したときにデータをセッションへ保存していたが、この部分が上手くいかなかった。セッションへ保存する方法を２通り紹介したいと思います:smiley:

# 対応方法

+ withsessionメソッド
+ sessionメソッド

## withSessionメソッド
指定した配列をセッションに保存します。

```
$response = $this->withSession(['test' => 'unittest']);
```

## sessionメソッド
```
$response = $this->session(['test' => 'unittest']);
```

#参考
[Laravel 5.5 HTTPテスト](https://readouble.com/laravel/5.5/ja/http-tests.html)
UbuntuでGitHubのCMakeをインストールする方法

#CMake
今回紹介するCMakeはGitHub版のため不安定な部分もあるかもしれません。
なので安定した[Release版](https://cmake.org/download/)はこちらの方法ではインストールできません。
##必要なもの

```
sudo apt install git
sudo apt install libssl-dev
```
##GitHubリポジトリを複製(clone)

```
git clone https://github.com/Kitware/CMake
```

##インストール

```
cd CMake
./bootstrap
make
sudo make install
```
##確認
```
cmake --version
```
こんな風に出力されれば大丈夫です。

```
cmake version 3.18.20200823-g269d1a8

CMake suite maintained and supported by Kitware (kitware.com/cmake).
```
PC内のファイルをスマホからも編集したい。

## はじめに

PCのVSCodeで編集したファイルを、スマホのPWEditorでも編集できる環境を整えたので、共有します。

## 環境

- PC：Windows10
- スマホ：iOS13.6

## 参考記事と相違点

[おすすめのPCとスマホ間のメモ連携方法](https://qiita.com/IGMML/items/888d41e725d3a44f6512)

ほぼ↑の記事の通りですが、2020年8月現在、PWEditorにGoogleでログインできなくなっているため、Googleドライブの代わりにDropboxを利用したら上手くいきました。

## おわりに

メモ書きが捗ります。お試しあれ。
Chrome拡張機能「Markdown Viewer」でmarkdownをいい感じに表示する

## この記事はなにか

Chrome拡張機能の**Markdown Viewer**がローカルのマークダウンファイルを見るときに良さげだったけどあまりネット上に記事がなかったので書きました。

<font color="Red">ちなみに、**ファイルのURLへのアクセスを許可する**をオンにしないとローカルファイルはマークダウンで表示されないのでそれだけご注意を！（後述）</font>

## いいところ

・テーマがたくさんある
（でも使うのはGITHUBかGITHUB-DARKくらいかも）
・目次、絵文字、数式、オートリロードなどが使える
・設定が簡単
・日本語表示がナチュラル

※ 細かい説明はこちら（英語）
https://github.com/simov/markdown-viewer

※ 動画はこちら（音なし）
https://youtu.be/Wd-wHLm9MTI

## 設定方法

1.インストール
[Markdown Viewer｜chrome ウェブストア](https://chrome.google.com/webstore/detail/markdown-viewer/ckkdlimhmcjmikdlpkmbgfkaikojcbjk)

2.設定（ファイルのURLへのアクセスを許可する）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/9d1ba241-c82e-8dc1-614a-8a106f798f44.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/dab03083-8ff9-4d9b-780c-3e5fb3e6e672.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/c46ad7c6-13b7-ac5f-1f31-25179b3e2087.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/f9bf891c-bce6-031b-c772-542f853fc407.png)

## 使用方法

1.ファイル（もしくはディレクトリ）をChromeにドラッグアンドドロップ
２.必要に応じて再読み込み
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/26821179-12b1-f35b-3c51-4058a8dd07f4.png)

■ 表示イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/5651acd5-2455-3405-78fd-7310404882f4.png)
もちろん、画像も表示できます。

表示の設定は拡張機能のアイコンをクリックすれば可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/9a1b2ed8-36b2-02e4-6089-5af33aa1ebae.png)

## 所感

マークダウンのメモをPDFにして共有していましたが、ソース部分がはみ出して重要なとこが見えない！となるのが嫌だったので、Chromeの拡張機能であればと思い、これを見つけました。
正直、VSCodeで見れますが使っている人少なくて…

ちなみに、**chromeウェブストア**にて`Markdown`で検索すると、同じような拡張機能に[Markdown Preview Plus](https://chrome.google.com/webstore/detail/markdown-preview-plus/febilkbfcbhebfnokafefeacimjdckgl)がヒットします。

これと比べて**Markdown Viewer**がいいなと思ったのは以下の理由です。

**日本語に違和感がなく見やすいこと**
（**Markdown Preview Plus**はちょっと簡体字ぽかった）

完全に好みです笑
マークダウンファイルのリーダーとしてはどちらでもOKだと思います。
node.jsでnpm run devがエラーになった場合の対処法

nuxt.jsの開発環境でで以下を実行したらエラーが出ました。

```
$ npm run dev
:
This is probably not a problem with npm. There is likely additional logging output above.
npm WARN Local package.json exists, but node_modules missing, did you mean to install?
:
```

##結論
以下のコマンドを実行したら解決しました。一度消去後に再インストールしてます。

```
$ rm -rf node_modules
$ rm package-lock.json yarn.lock
$ npm cache clear --force
$ npm install
```

コマンド実行前もインストールされているはずでしたが、バージョンの違いでエラーが出る場合があるので一度消去して、再インストールしたらいけました！バージョンは変化していませんが、node？のバージョンが変化してのでしょうか。
詳しい方いたらご指摘いただけると幸いです。

```
$ npm -v
6.14.7
// 上記のコード実行後
$ npm -v
6.14.7
```
オレオレJavaScript/TypeScriptコードスニペット集

**随時更新**

「あれってJavaScript/TypeScriptでどうやるんだっけ？」をメモるとこ。

# オブジェクトのブランクチェック

サンプルはTS。

```ts
let checkTargetObject = {};

if (Object.keys(checkTargetObject).length === 0) {
    console.log('空のオブジェクト');
}
```
venvでjupyterを使うためのkernel追加と削除

jupyterでvenvの環境を認識させるにはkerelを追加する必要があります。
※ちなみにjupyterはvenvごとにインストールする必要はないです。

```xxx:追加
(my_venv) C:\> pip install ipykernel
(my_venv) C:\> ipython kernel install --user --name=my_venv
```
追加したらjupyternote bookの[Kernel]タブのChange kernelから選べばできる


```xxx:削除
 C:\> jupyter kernelspec uninstall my_venv
```
使わなくなった時に削除しないと永遠に残ります。
ovaからvhdxへコンバートするときの備忘録

授業で使う仮想マシンはVirtualBoxかVMwareの指定で、配布もovaやらだった。自分のパソコンにはHyper-Vが入っており、VirtualBoxとかと干渉する。アップデートで共存できるようになったらしいが自分の環境ではできない (なんでだろうね)
どうにかしてhyper-Vで動かしたかったので、やったことを備忘録として以下に残しておく。hyper-v ovaとかで検索したらいっぱい出てくるからそれ見てもいいと思う。

<!-- **このページにあることを行ってPCが不調等になっても責任は取れません。あくまで自己責任でお願いします** -->
というか他サイトをまとめただけなので、目新しい情報はない。

## 1. 7zで解凍

目的のovaを7zで解凍する。
すると``.mf .ovf .vmhd``が出てくる。
``.vmhd``を変換してhyper-vで使う。

## 2. 変換
 
まずは[microsoft virtual machine converter](https://www.microsoft.com/en-us/download/details.aspx?id=42497)をダウンロード&インストール
そしてpowershellを管理者で起動し次を実行

```powershell
PS C:\WINDOWS\system32> import-module "C:\Program Files\Microsoft Virtual Machine Converter\MvmcCmdlet.psd1"
PS C:\WINDOWS\system32> ConvertTo-MvmcVhd -SourceLiteralPath "{Fullpath to vmdk}" -DestinationLiteralPath "Fullpath to vhdx" -VhdFormat Vhdx
```
特に何もなければこれで成功するらしいが、素直に成功したためしがない。
だいたいエラーで``ConvertTo-MvmcVhd : The entry {適当な文字列} is not a supported disk database entry for the descriptor.``と言われる。

そうしたらdsfoとdsfiを探してダウンロードして以下のようにする。(dsfokとかで検索すると出てくるかも)
パスなどはよしなに

```powershell
PS C:\WINDOWS\system32> .\dsfo.exe {vmdkへのパス} 512 1024 .\temp.txt
OK, 1024 bytes, 0.000s, MD5 = {適当な文字列}
```

出力されたファイル(今回は``temp.txt``)をエディターで開く。
以下の結果は[kali-linuxのvirtualboxのイメージ](https://www.offensive-security.com/kali-linux-vm-vmware-virtualbox-image-download/)に対して行ったもの

```:temp.txt
# Disk DescriptorFile
version=1
CID=539957cc
parentCID=ffffffff
createType="streamOptimized"

# Extent description
RDONLY 167772160 SPARSE "Kali-Linux-2020.3-vbox-amd64-disk001.vmdk"

# The disk Data Base 
#DDB

ddb.virtualHWVersion = "4"
ddb.adapterType="ide"
ddb.geometry.cylinders="16383"
ddb.geometry.heads="16"
ddb.geometry.sectors="63"
ddb.geometry.biosCylinders="1024"
ddb.geometry.biosHeads="255"
ddb.geometry.biosSectors="63"
ddb.uuid.image="7e158528-0b2d-4734-8ad9-1362ce2e625d"
ddb.uuid.parent="00000000-0000-0000-0000-000000000000"
ddb.uuid.modification="00000000-0000-0000-0000-000000000000"
ddb.uuid.parentmodification="00000000-0000-0000-0000-000000000000"
ddb.comment=""
```
この中から``The entry {文字列} ...``の文字列部分を持つ行をさがしてコメントアウトする。
これで保存して次を実行。

```powershell
PS C:\WINDOWS\system32> .\dsfi.exe {vmdkへのパス} 512 1024 .\temp.txt
OK, written 1024 bytes at offset 512
```

そうしたらこの章の冒頭の``ConvertTo-MvmcVhd``を実行する。

最終的に次のようにしたら無事通った。

```:temp.txt
# Disk DescriptorFile
version=1
CID=539957cc
parentCID=ffffffff
createType="streamOptimized"

# Extent description
RDONLY 167772160 SPARSE "Kali-Linux-2020.3-vbox-amd64-disk001.vmdk"

# The disk Data Base 
#DDB

ddb.virtualHWVersion = "4"
ddb.adapterType="ide"
ddb.geometry.cylinders="16383"
ddb.geometry.heads="16"
ddb.geometry.sectors="63"
ddb.geometry.biosCylinders="1024"
ddb.geometry.biosHeads="255"
ddb.geometry.biosSectors="63"
#db.uuid.image="7e158528-0b2d-4734-8ad9-1362ce2e625d"
#db.uuid.parent="00000000-0000-0000-0000-000000000000"
#db.uuid.modification="00000000-0000-0000-0000-000000000000"
#db.uuid.parentmodification="00000000-0000-0000-0000-000000000000"
#db.comment=""
```


## 3. hyper-vで読み込み
やるきがあったら


## まとめ
めんどうだからあんまり頻繁にconvertしたくない。
でも授業ではhyper-vを使いたい。

もっと簡単な方法ありそう
FakerGemで作るポケモンGo

# 経緯
プログラミング学習を進める過程で様々なGemを使う。Gemの理解を深めるためにGitHub上の元データを眺めていると、面白いものが見つかった。

># Faker::Games::Pokemon
>Faker::Games::Pokemon.name #=> "Pikachu"
>Faker::Games::Pokemon.location #=> "Pallet Town"
>Faker::Games::Pokemon.move #=> "Thunder Shock"

なんとポケモンの名前をランダム表示する機能がある。FakerGemを理解するなら、使ってみるのが一番！ということで、ポケモンの遭遇と捕獲を行うアプリケーションを作成してみた。

# コード

```ruby:application.rb
# FakerGemの読み込みと日本語設定
require "Faker"
Faker::Config.locale = :ja

# ポケモンクラスとプレイヤークラスのファイル読み込み
require "./pokemon"
require "./player"

# ポケモンを生成
pokemon_name = Faker::Games::Pokemon.name
pokemon = Pokemon.new(pokemon_name) 

# プレイヤーを生成
player = Player.new()

# ポケモンが出現！
pokemon.appear

# プレイヤーの行動
player.command(pokemon_name)
```

```ruby:pokemon.rb
class Pokemon

  def initialize(name)
    @name = name
  end

  def appear
    puts "あっ！野生の#{@name}がとびだしてきた！"
  end

end
```

```ruby:player.rb
class Player

  def command(pokemon)
    puts "あなたはどうする？"
    puts "[0]モンスターボールを投げる\n[1]逃げる"
    input = gets.to_i
      if input == 0
        puts"やったー！#{pokemon}をつかまえたぞ！"
      elsif input == 1
        puts "うまくにげきれた！"
      else
        puts "番号が間違っています"
      end 
  end

end
```

[![terminal](https://i.gyazo.com/18cc254eec0290d5ae90aeb56bb0f83d.png)](https://gyazo.com/18cc254eec0290d5ae90aeb56bb0f83d)

# まとめ
出現するポケモンがランダムのため、「予測できない楽しさ」がある。
FakerGemはもちろんのこと、「オブジェクト指向」や「メソッドの考え方」など、少量のコードでも０から作ることは大いに学びになる。「捕獲率の変動」や「街の移動」など色々とオプションの余地もあるため、時間を見つけて遊んでいこう。
今までに作ってきた機能すべてを埋め込みメッセージデやって見ようと検証

まずは、占い

```
//占い
client.on('message', message => {
if(message.content === 'r.uranai'){
var array = ["凶　えぇ、、、", "小吉　まあ、がんば", "中吉　普通で草", "吉　おめでと。", "大吉　おめでと。"];
message.channel.send({
  embed: {
    description: array[Math.floor(Math.random() * array.length)],
    color: 16757683,
  }
})
console.log(array[Math.floor(Math.random() * array.length)]);
}
})
```
こんな感じ。
次にcoinゲーム

```
//コインゲーム
client.on('message', message => {
if(message.content === 'r.coin'){
var array = ["📀omote　君の勝ち！おめでとう🎉", "💿ura　君の負け...残念😭"];
message.channel.send({
  embed: {
    description: array[Math.floor(Math.random() * array.length)],
    color: 16757683,
  }
})
console.log(array[Math.floor(Math.random() * array.length)]);
}
})
```
注意点は,`:dvd:`とかやっても実行はできるけど、めっちゃラグイ。
だから普通に絵文字でやることをオススメ。


```
//不適切なメッセージのさくじょ
client.on('message',message=>{
 if (message.content.match(/しね|ころす|死ね|殺す|きっしょ|ゴミ|野獣先輩|糞|カス/)) {
   message.channel.send('不適切な表現が含まれていたため、削除しました。');
  message.delete(100)
}
})
client.on('message',message=>{
if (message.content.match(/不適切な表現が含まれていたため、削除しました。/)) {
        message.delete(3000)
   }
})
```
は、、、どうやろうかお悩み中。埋め込みメッセージのなかみ認識とかわかんない(自分は)
おまけのコーナー

```
client.on('message',message=>{
  if (message.content.match(/　　　　/)){
    message.channel.send(
      {embed:{
              color:16757683,
              description:'[]()'
        
      }}
      );
      }});
```
これの/と/の間に文字を発言すると、[]←のなかの言葉に()←で埋め込みリンクできる🎉
今回はこんなかんじでおわ(ry
Kaggleに登録してみた

## 登録
Googleアカウントを使って登録しました。
IDさえ決めれば数回のクリックで完結するので簡単です。
## Kaggle Progression System
[Kaggle Progression System](https://www.kaggle.com/progression)
いわゆるランキングで、Grandmasterやmasterといった称号？があります。

コンペ以外でも、Notebookの公開やdiscussionに参加することで、
Notebooks masterやdiscussion masterになることで、総合評価がmasterになることも可能です。
ただ、一般的にはmasterはCompetitions masterを指すと思われます。

## Competitions
[competitions](https://www.kaggle.com/competitions)
現在開催中のコンペが見られます。
上位は賞金が書かれていますが、後半のSwagやKudosがよくわからないので調べてみました。

[Swag](https://www.kaggle.com/general/68961)
Tシャツやペンなどのようです。

[Kudos](https://www.kaggle.com/questions-and-answers/130853)
賞状のようです。

[Titanic: Machine Learning from Disaster](https://www.kaggle.com/c/titanic)が初心者用に推奨されていますので、
暇なときにやってみたいですね。

## Data
[Datasets](https://www.kaggle.com/datasets)
ユーザがアップロードしたデータセットがたくさんあります。
試しに「supermarket」を検索してみたが、取引の記録ばかり、サイズが数百KB、ファイル形式がCSVがほとんどです。

## Notebooks
[Notebooks](https://www.kaggle.com/notebooks)
初心者がここにこもってひたすら勉強すべきと言われています。

「yolo」で検索してみたら、血球を検出するNotebookが出てきました。
血球はくっついているので難しそうです。
[Yolo-V5_Blood_Cell_Detection_and_Count](https://www.kaggle.com/balakrishcodes/yolo-v5-blood-cell-detection-and-count)

## Discuss
[Discuss](https://www.kaggle.com/discussion)
各コンペやNotebookでの議論が多いです。

## Courses
[Courses](https://www.kaggle.com/learn/overview)
pythonや機械学習だけでなく、SQLのような普段使わないものもあります。

Courseを修了したら、[証書](https://www.kaggle.com/learn-course-certificates)ももらえますね。
競プロ挑戦日記day2【ABC176】

#[A問題](https://atcoder.jp/contests/abc176/tasks/abc176_a)

+ 所要時間:8分
+ 一発AC


###解答

```c++:ABC176_A
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n, x, t;
    cin >> n >> x >> t;
    int ans = 0;
    int a = n / x;
    ans = a * t;
    if(n % x != 0){
        ans += t;
    }
    cout << ans << endl;
}
```

#[B問題](https://atcoder.jp/contests/abc176/tasks/abc176_b)

+ 所要時間:20分
+ 一発AC
+ string 型でデータを取得するのがミソ

###解答

```c++:ABC176_B
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int sum = 0;
    string s;
    cin >> s;
    for(char x : s){
        //i++;
        int a = x - '0';
        sum += a;
      //cout << i << " " << sum << " " << a << endl;
    }
    if(sum % 9 == 0){
        cout << "Yes" << endl;
    }
    else cout << "No" << endl;
}

```

#[C問題](https://atcoder.jp/contests/abc176/tasks/abc176_c)

+ 答えがint型だと収まらないのに気づかなかった
+ int型からlong long int型に変更するとACした（テスト後）

##問題文
###解答

```c++:ABC176_C
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n, sum = 0;
    cin >> n;
    vector<int> tall(n);
    for (int i = 0; i < n; i++)
    {
        cin >> tall.at(i);
    }
    for (int i = 0; i < n - 1; i++)
    {
        int b;
        b = tall.at(i + 1) - tall.at(i);
        if (b < 0){
            tall.at(i + 1) = tall.at(i);
            sum += -b;
        }
    }
    cout << sum << endl;
}
```

#Rate
10→20になりました！
今回もC問題が惜しかった！
残念！
入茶目指して頑張るぞ！
【C#】日時文字列をDateTime型へ変換する

# 概要
C#で文字列からDateTime型に変換するには「Parse」もしくは「TryParth」メソッドが使用できます。
# Parseメソッド

```C#:
// 日付・時刻あり
string strDateTime = "2020/10/22 15:01:11";
DateTime dateTime = DateTime.Parse(strDateTime);
Console.WriteLine(dateTime.ToString("yyyy/MM/dd HH:mm:ss"));

// 時刻省略
string strDate = "2020/10/22";
DateTime dateTimeFromDate = DateTime.Parse(strDate);
Console.WriteLine(dateTimeFromDate.ToString("yyyy/MM/dd HH:mm:ss"));

// 日付省略
string strTime = "15:01:11";
DateTime dateTimeFromTime = DateTime.Parse(strTime);
Console.WriteLine(dateTimeFromTime.ToString("yyyy/MM/dd HH:mm:ss"));
```
```text:実行結果
2020/10/22 15:01:11
2020/10/22 00:00:00
2020/08/22 15:01:11
```

日付・時刻は省略できます。
時刻未入力の場合は 00:00:00　が入ります。
日付未入力の場合は 現在日付が入ります。

###例外
渡す文字列がnullの場合は「ArgumentNullException」が発行されます。
渡す文字列が日時として判別不可能な場合は「FormatException」が発行されます。

# TryParseメソッド
第1引数に変換する文字列を指定し、第2引数に指定したDateTime型に変換後の日時が格納されます。また変換に成功したかどうかを示す値を返します。

```C#:
string strDateTime = "2020/10/22 15:01:11";
DateTime dateTime;

if (DateTime.TryParse(strDateTime, out dateTime))
{
Console.WriteLine("成功！");
Console.WriteLine(dateTime.ToString("yyyy/MM/dd HH:mm:ss"));
} else {
Console.WriteLine("失敗！");
Console.WriteLine(dateTime);
}
```

```text:実行結果
成功！
2020/10/22 15:01:11
```

# 参考
https://docs.microsoft.com/ja-jp/dotnet/api/system.datetime.parse?view=netcore-3.1
https://docs.microsoft.com/ja-jp/dotnet/api/system.datetime.tryparse?view=netcore-3.1
ダイクストラ法


## 動機
１年に一度くらい使う機会があって、その度に完全に忘れているのでメモ

## ダイクストラ法の内容
### ノードのパラメーター
- 始点からの距離
- 距離が確定したか？

### エッジのパラメーター
- ノード間の移動コスト

### Pseudo Code

```
- 全てのノードを未確定に
- 開始ノードの距離に０を設定、その他のノードの距離を無限大に設定

while(未確定ノードが存在) {
  - 未確定のノードの中から、最小の距離のノードを選択
  - 選択したノードを確定
  - 確定したノードにつながっている未確定ノードの距離を更新
}
```

### 速くするには
最小の距離を持つノードをPriority Queueで管理する。
エッジも数が多いなら使うエッジのみ検索するようにすればいいのか？（効率よくできるのか不明）

### 使えないケース
コストが負のエッジが存在する場合には、使えないのでベルマンフォード法を使う。

### サンプルコード
JavaScriptです。

```javascript
/*
    S     E
   (0)   (4)
  1/ \4  ^ ^
  v   v /5 |
 (1)  (3)  |1
  3\   ^ \3|
    v /2  v
    (2)   (5)
 */
const NUM_NODES = 6
let distances = Array(NUM_NODES).fill(Number.MAX_SAFE_INTEGER)

const edges = [
  { b: 0, e: 1, c: 1 }, // beg, end, cost
  { b: 1, e: 2, c: 3 },
  { b: 2, e: 3, c: 2 },
  { b: 0, e: 3, c: 4 },
  { b: 3, e: 5, c: 3 },
  { b: 5, e: 4, c: 1 },
  { b: 3, e: 4, c: 5 },
]

function showGraph(header) {
  console.log(`\n${header}\n`)
  for(let i=0; i<distances.length; ++i) {
    console.log(`distance[${i}] = ${distances[i]}`)
  }
}

distances[0] = 0    // start node is 0

let finalized = Array(distances.length).fill(false)
let numFinalized = 0

showGraph("Before")

while(numFinalized !== finalized.length) {
  // find node with shortest distance among non-finalized nodes
  let shortest
  for(let i=0; i<distances.length; ++i) {
    if (finalized[i]) continue
    if (shortest === undefined || distances[shortest] > distances[i]) {
      shortest = i
    }
  }

  // finalize shortest distance node
  finalized[shortest] = true
  numFinalized++

  // update distances of nodes that are conneded to the shortest distance node
  for(let i=0; i<edges.length; ++i) {
    let e = edges[i]
    if (e.b !== shortest) continue

    if (distances[e.e] > distances[shortest] + e.c) {
      distances[e.e] = distances[shortest] + e.c
    }
  }
}

showGraph("After")
```

## わかりやすい説明記事
https://nw.tsuda.ac.jp/lec/dijkstra/
完全ド素人が自分のサイトを作るまでの日記#1

#はじめに
この記事はプログラミングなどの知識が何もない私が、無料のバイク(中型)駐輪場を
探せるwebサイトをサーバーレベルから作るまでの日記です。
#持ってる知識・スキル
**0**
#何をすればいいかわからない


自分のwebサイトを作る大まかな流れを調べた結果

１　レンタルサーバーを借りる
２　独自ドメインの取得
３　サイトの中身を作る

ここからん何を勉強して何をするか考える

１のレンタルサーバーは使わず自分でサーバーを建てるためサーバー関連の勉強が必要
２は多分なにもしなくても良さそう
３はhtmlとcssを必要
あとは広くいろんな知識が必要そう

まだ何をすればいいか全然わからないけどとりあえず挑戦してみる
[Semantic MediaWikiの使い方③]プロパティのデータ型

# What is this?
* [Semantic MediaWiki](https://www.semantic-mediawiki.org/wiki/Semantic_MediaWiki)の導入にあたり必要な知識のまとめ記事第3回
* [前回](https://qiita.com/DaikichiDaze/items/4430fe298c76c4f31cf9)はアノテーションの付け方を紹介した
    * 「アノテーション」や「プロパティ」については[前回](https://qiita.com/DaikichiDaze/items/4430fe298c76c4f31cf9)を参照
* 今回はアノテーションを付けた後のデータ型設定について解説
* 基本的には公式チュートリアル[Help:Getting started/Part 1 (Working with annotations)](https://www.semantic-mediawiki.org/wiki/Help:Getting_started/Part_1_(Working_with_annotations))の後半部分まとめ

# プロパティのデータ型
## チュートリアル
### データ型が必要な理由
* [前回](https://qiita.com/DaikichiDaze/items/4430fe298c76c4f31cf9)の続きとしてBerlinページを作成することを考える
* Bellinページに「人口」プロパティのアノテーションを付ける
    * 前回学んだ方法でアノテーションを付けると以下のようになる[^1]

[^1]: 参考にしている公式チュートリアルの人口をそのまま例として使っているため、実際のベルリンの人口と合っているかは不明

```SemanticMediaWiki:SemanticMediaWiki
[[Has population::3,396,990]]
```

* こうすることでアノテーションを付けることができが、このように記述すると***3,396,990*ページ**へのリンクが作成されてしまう
    * 各都市で人口が異なるため、それぞれの数値で新しいページが作成されてしまう
    * 数値自体にわざわざページを作成するのはあまり意味はない[^2]
* このようなアノテーションを付ける際は、`Has population`プロパティを数値型に設定することで効果的なナレッジグラフを構築できる

[^2]: "3,396,990"という数を説明するページを作成することは、ナレッジグラフ構築の目的上意味が薄い

### データ型の設定方法
1.  まず上記例のようにリンク元ページにアノテーションを付ける
2.  その後、作成したプロパティのページへ移動（この場合は、`Has population`へ移動。アノテーションを付けると自動的にプロパティへのリンクが作成される）
3.  プロパティページにて以下のように**特別プロパティ**[^3]を付与する

[^3]: 特別プロパティは`Has type`以外にも様々な種類がある。詳細は[公式ヘルプ](https://www.semantic-mediawiki.org/wiki/Help:Special_properties)の一覧を参照。

```SemanticMediaWiki:SemanticMediaWiki
[[Has type::Number]]
```
このように設定して、しばらくすると`Has population`プロパティのページが以下のようなフォーマットに変化する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214822/a4a87835-182c-1213-627e-bc4a0b494645.png)

またリンク元のBerlinページへ戻ると"3,396,990"ページへののリンクはなくなり、普通のテキストになっているはず。[^4]

[^4]: より詳細な情報は[公式ヘルプの該当ページ](https://www.semantic-mediawiki.org/wiki/Help:Property_declaration)へ

# データ型の種類
設定できる型は[公式ヘルプ](https://www.semantic-mediawiki.org/wiki/Help:List_of_datatypes)に一覧化されている。概ねプログラミング言語でよく使うデータ型であるためわかりやすい。

ナレッジグラフ構築でよく使いそうな型は下記

|型名|内容（想定使用シーン）|
|---|----|
|Page|Wiki上の記事（ページ）。プロパティ作成時のデフォルトはPage型|
|Number|チュートリアルで紹介したとおり数値に設定|
|Boolean|True/Flaseで記述するプロパティ|
|Text|プロパティ固有のページが必要ない場合|
|Date|ライブラリ等のリリース日に使用する等|
|Code|Text型に似ているが、ソースコードコードであることを明示できる|
|Quantity|Number型に似ているが、数値だけでなく単位を設定可能|

# 次のステップ
ナレッジグラフ構築するための基礎知識はここまで。ページを作成し（ノード作成）、リンクをむすびアノテーションを付ける（エッジ作成）ことまでできるようになった。

次回以降では、標準テンプレートの活用方法・構築したナレッジグラフに対してクエリを投げる方法を説明する。
レーザーgrbl_ESP32 (NEJE MASTER2) 完成


ケーブル処理とケースに入れて完成。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664748/6e96f98b-fd71-6018-e612-58ab7bdeed2c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664748/d05e33e0-d2e8-255e-3bb5-86cd84e89c82.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664748/a5ef1c5a-2b9d-b6c7-ef06-cba50aafee48.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664748/a5d6ab5a-6655-b8ce-f3c3-aa5d3d081542.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664748/36baa73c-ecf6-28dd-289d-f25796a90b8d.png)
SpringBoot+gradleからwarファイルを作成して、Mac環境のTomcatにデプロイする

##やりたいこと
　SpringBoot+gradleの環境からwarファイルを作成して、Mac環境のTomcatをデプロイする

##ビルド
 gradleはインストール済みとする。
 プロジェクト名は「MyFirstApplication」

```
$ gradle

> Task :help

Welcome to Gradle 6.5.1.

To run a build, run gradle <task> ...

To see a list of available tasks, run gradle tasks

To see a list of command-line options, run gradle --help

To see more detail about a task, run gradle help --task <task>

For troubleshooting, visit https://help.gradle.org

BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed
```

###build.gradleの設定

```
plugins {
	id 'war'
}

dependencies {
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
}

```

###build実行
build.gradleと同じディレクトリに移動して

```
$ gradle build
```

自分の場合は以下のエラーが発生

```
> Task :compileJava FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':compileJava'.
> Could not target platform: 'Java SE 11' using tool chain: 'JDK 8 (1.8)'.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 14s
1 actionable task: 1 executed
```

どうやら自分のマシンに設定されているJavaバージョンとbuild.gradleのJavaバージョンが異なるために発生するらしい。
マシンに設定されているJavaバージョンは以下で確認。

```
$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0_261.jdk/Contents/Home
```

build.gradleは'11'だったので'8'に修正

```
plugins {
	id 'war'
}

sourceCompatibility = '8'

dependencies {
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
}

```

再度ビルド

```
$ gradle build

> Task :test
2020-08-23 16:20:46.841  INFO 34656 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'
2020-08-23 16:20:46.842  INFO 34656 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2020-08-23 16:20:46.848  INFO 34656 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.

BUILD SUCCESSFUL in 40s
5 actionable tasks: 5 executed

```

今度は成功。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696523/76101d31-1241-448f-92f6-ecd3ac34e138.png)


/MyFirstApplication/build/libs/MyFirstApplication-0.0.1-SNAPSHOT.war

にwarが無事に作成された。


##Tomcatへデプロイ
　Tomcatはインストール済みとする。

　/apache-tomcat-9.0.37/webapps

　にwarファイルを配置する。

　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696523/898e2e91-1b89-b06d-087f-8c6d26e31e9f.png)

　自動的にwarファイルが解凍される。

##webアプリにアクセスする
ブラウザに以下のように打ち込む。
http://localhost:8080/MyFirstApplication-0.0.1-SNAPSHOT/sample/test

今回は
・Tomcat起動マシンが「localhost:8080」
・作成したアプリ名が「MyFirstApplication-0.0.1-SNAPSHOT」
・リソースの置き場が「/sample/test」
の場合。


以上。
grbl_ESP32 (ESP3D) wifi IPアドレスの固定

#IPアドレスの固定

wificonfig.h
の以下の内容を書き換える

 #define DEFAULT_STA_IP "???.???.???.???" //ipアドレス適宜変更
 #define DEFAULT_STA_GW "???.???.???.???" //デフォルトゲートウェイ適宜変更
 #define DEFAULT_STA_MK "???.???.???.???" //サブネットマスク適宜変更
 #define DEFAULT_STA_IP_MODE STATIC_MODE  // 好きな方を選ぶ DHCP_MODE STATIC_MODE
GAS開発効率を上げるために、Clasp×TypeScript（ESLint＋Prettier）でローカル開発環境構築してみたメモ

## はじめに

gasを自分の趣味用程度で、数十行程度のスクリプトを記述する際には純正のWeb上のエディタでもよいのですが、保守や改修を前提とした数百行レベルのアプリを作成する際には、もう少しストレスレスにしたいと考え、環境構築をした時のメモを残す。

OSは、windows10で構築。

### そもそもClaspとは？

一言でいうと、Google謹製スクリプトgasを専用エディタではなく、
ローカル開発環境で開発できるように支援してくれるモジュール

https://developers.google.com/apps-script/guides/clasp


## 手順

### 事前準備：

node.jsがなければ、まずはインストール

#### インストール方法：

インストーラーで一発　⇒https://nodejs.org/en/download/
※インストールできたら、
CUIツール（コマンドプロンプトやGit bashなど）から
Node.jsとnpmが正しくインストールされたかを確認する。

#### 確認方法：

下記コマンドによりバージョンが正しく表示されればOK！
node

```
$ node -v
```

npm

```
$ npm -v
```

### 本題①：Claspの導入～ローカル環境のpushまで


#### Claspのインストール

```
$ npm i @google/clasp -g
```

#### ClaspのGoogleアカウントへのログイン（紐づけ）

```
$ clasp login
```

アカウントの選択をブラウザ上で求められるので、複数ある場合はデフォルトのアカウントを選択
※サブアカウントだとgasが使えないみたいです（ハマった。。）

以下のように表示され、ログイン情報がローカルに保存されます。

> Default credentials saved to: ~\.clasprc.json (C:\Users\-------\.clasprc.json).


#### Claspから新規スクリプト作成

```
$ clasp create sample
```

以下のようなメッセージがでるので紐づけたいものを選ぶ

> $ clasp create sample
> ? Create which script? (Use arrow keys)
> \> standalone
>   docs
>   sheets
>   slides
>   forms
>   webapp
>   api

#### Claspへ既存のプロジェクトを紐づける

紐づけたいスクリプトのIDが必要なので最初に取得する

* 該当のスクリプトエディタを開く
* スクリプトエディタメニューの「ファイル」
* 「プロジェクトのプロパティ」
* 「情報」タブ内に記載されているスクリプトIDをコピー

```
$ cd <任意の作業ディレクトリ>
$ clasp clone <コピーしたスクリプトID>
```
これで、作業ディレクトリにファイルがつくられたはず

> appssscript.json
> hogehoge.js

hogehoge.jsは、ローカル環境のJSなので、好きなエディタで改修できます！


#### Claspからpushする

```
$ clasp push
```

スクリプトエディタにローカルの編集が反映されていることがわかるハズ

### 本題②：Type script、TS Lint、Prettierの導入

.clasp.jsonファイルに、rootDirを記述（名前はなんでもよい）

```
{
    "scriptId":"<スクリプトID>",
    "rootDir":"./workspace"
}
```

続いて、Typescriptな環境構築に必要なパッケージを導入していきます

それぞれ、
package.json の作成
├claspのパッケージ追加
├eslintを追加
└gasの型定義パッケージを追加

```
$ npm init -y
$ npm i -D @google/clasp
$ npm i -D eslint @typescript-eslint/eslint-plugin @typescript-eslint/parser
$ npm i -S @types/google-apps-script
```
それぞれ、正しくインストールされていることを確認

```
$ clasp -v
```

```
$ npx eslint -v
```

ESLintとPrettierが競合しないように以下のパッケージを入れます。

* prettier: 本体
* eslint-config-prettier: 競合するルールをオフにします。
* eslint-plugin-prettier: ESLlintでPrettierのチェックを行うために入れます。

```
$ npm i -D  prettier eslint-config-prettier eslint-plugin-prettier
```

正しくインストールされていることを確認

```
$ npx prettier -v
```
ここまでで環境は整っているハズ
あとは、VScodenなりでチェックができるので、好みに合わせたセッティングをする

### 本題③：typescriptをコンパイルしてpushまで

実は特別に、することはありません！

```
$ clasp push
```

これだけで、自動でコンパイルしてくれます！素晴らしいｗｗｗ

個人的にハマったのは、
専用エディタで書いたgasをpullしてhogehoge.jsを先に作っちゃうとIDがうまく関連づけられず苦戦。（ちゃんとしたやり方あるのかもですが）
最初から、ローカルでtsファイルを作成し、.clasp.jsonへIDを記述する手順であればすんなり関連付けできました。

エンジニア職でもなく、あまり普段コードを書かないので、いろいろ悪戦苦闘しましたが、
こんなディレクトリ構成でひとまず期待通り動きました。

> workspace/gas
>  ├ .claspjson
>  ├ appsscript.json
>  └ hogehoge.ts
> node_modules
> .eslintrc.js
> package.json
> package-lock.json
> prettierrc.js
> tsconfig.js
[ReactNative] 画面に収まらない文字を切り捨てて表示する

# はじめに
ReactNativeで実装している際に長文のTextを改行なしで表示する際に、収まりきらない文字列を `...` で省略する方法を紹介します。

# How to
[numberOfLines](https://reactnative.dev/docs/text#numberoflines)と[ellipsizeMode](https://reactnative.dev/docs/text#ellipsizemode)を使います。
Textタブのプロパティに上記を設定してあげるだけで簡単に実装できます。

`numberOfLines` は長文を何行で表示するかを宣言するものです。
`ellipsizeMode` と組み合わせる際は`１`と設定する必要があります。


```sample.js
<Text
  numberOfLines={1} // １行で表示するように設定
  ellipsizeMode="tail"  // 末尾を切り捨てるように設定
>
  // 長文の文字列
</Text>
```


* `head` 端がコンテナに収まり、線の最初の欠落したテキストが省略記号で示されます。 
 
```
例： ... wxyz
```

* `middle` 最初と最後がコンテナに収まり、中央の欠落したテキストが省略記号で示されます。

```
例： ab ... yz
````

* `tail` 最初がコンテナに収まり、行の最後に欠落しているテキストが省略記号で示されます。

```
例： abcd ...
```

* `clip` コンテナの端を越えた文字列は描画されません。
P5.js 日本語リファレンス(unhex)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の unhex 関数を説明します。

## unhex() 


### 説明文

16進数の文字列表現を同等の整数値に変換します。 16進表記の文字列の配列が渡されると、同じ長さの整数の配列が返されます。

### 構文

unhex(n)

unhex(ns)

### パラメタ

- n
String：変換する値

- ns
Array：変換する値

### 戻り値

Number：16進値の整数表現



### 例1

```javascript
print(unhex('A')); // 10
print(unhex('FF')); // 255
print(unhex(['FF',  'AA',  '00'])); // [255, 170, 0]
```




### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
P5.js 日本語リファレンス(unchar)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の unchar 関数を説明します。

## unchar() 

### 説明文

単一文字の文字列を対応する整数表現に変換します。単一文字の文字列値の配列が渡されると、同じ長さの整数の配列が返されます。

### 構文

unchar(n)

unchar(ns)

### パラメタ

- n
String：変換する値

- ns
Array：変換する値

### 戻り値

数値：値の整数表現


### 例1

```javascript
print(unchar('A')); // 65
print(unchar(['A',  'B',  'C​​'])); // [65, 66, 67]
print(unchar(split('ABC',  ''))); // [65, 66, 67]
```




### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
P5.js 日本語リファレンス(str)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の str 関数を説明します。

## str() 

### 説明文

ブール、文字列、または数値をその文字列表現に変換します。値の配列が渡されると、同じ長さの文字列の配列が返されます。

### 構文

str(n)

### パラメタ

- n  
String | Boolean | Number | Array：変換する値

### 戻り値

String：値の文字列表現


### 例1

```javascript
print(str('10 ')); // '10'
print(str(10.31)); // '10.31'
print(str(-10)); // '-10'
print(str(true)); // 'true'
print(str(false)); // 'false'
print(str([true, '10 .3 ', 9.8])); // ['true',  '10.3',  '9.8']
```

### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
P5.js 日本語リファレンス(int)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の int 関数を説明します。

## int() 

### 説明文

ブール値、文字列、または浮動小数点数をその整数表現に変換します。値の配列が渡されると、同じ長さのint配列が返されます。

### 構文

int(n, [radix])

int(ns)

### パラメタ

- n
String | Boolean | Number：変換する値

- radix
Number：変換する基数(デフォルト：10)(オプション)

- ns
Array：変換する配列


### 戻り値

数値：値の整数表現



### 例1

```javascript
print(int('10 ')); // 10
print(int(10.31)); // 10
print(int(-10)); // -10
print(int(true)); // 1
print(int(false)); // 0
print(int([false, true, '10 .3 ', 9.8])); // [0, 1, 10, 9]
print(int(Infinity)); //Infinity
print(int('-Infinity')); //-Infinity
```



### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
P5.js 日本語リファレンス(hex)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の hex 関数を説明します。

## hex() 

### 説明文

数値を同等の16進表記の文字列に変換します。 2番目のパラメタ digits は、変換する16進表記の文字列の文字数を設定します。配列が渡されると、同じ長さの16進表記の文字列の配列が返されます。

### 構文

hex(n, [digits])

hex(ns, [digits])

### パラメタ

- n
Number：変換する値

- digits
Number：変換する16進表記の文字列の文字数(オプション)

- ns
Number[]：変換する値の配列


### 戻り値

String：値の16進数の文字列表現


### 例1

```javascript
print(hex(255)); // "000000FF"
print(hex(255, 6)); // "0000FF"
print(hex([0, 127, 255], 6)); // ["000000",  "00007F",  "0000FF"]
print(Infinity); // "FFFFFFFF"
print(-Infinity); // "00000000"
```


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
P5.js 日本語リファレンス(float)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の float 関数を説明します。

## float() 

### 説明文

文字列をその浮動小数点表現に変換します。文字列の内容は数値に似ている必要があります。そうでない場合、NaN(数値ではない)が返されます。たとえば float("1234.56")は 1234.56 と評価されますが, float("giraffe")は NaN を返します。

値の配列が渡されると、同じ長さの浮動小数点数の配列が返されます。

### 構文

float(str)

### パラメタ

- str  
String：変換する浮動文字列

### 戻り値

Number：文字列の浮動小数点表現


### 例1

```javascript
print(float('10 .31 ')); // 10.31
print(float('Infinity')); //Infinity
print(float('-Infinity')); //-Infinity
```


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
P5.js 日本語リファレンス(char)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の char 関数を説明します。


## char() 

### 説明文

数値または文字列を対応する単一文字の文字列表現に変換します。文字列パラメータが指定されている場合、最初に整数として変換され、次に1文字の文字列に変換されます。数値または文字列値の配列が渡されると、同じ長さの単一文字の文字列の配列が返されます。

### 構文

char(n)

char(ns)

### パラメタ

- n
String | Number：変換する値

- ns
Array：変換する配列

### 戻り値

String：値の文字列表現


### 例1
 
```javascript
print(char(65)); //「A」
print(char('65 ')); //「A」
print(char([65, 66, 67])); // ["A",  "B",  "C"]
print(join(char([65, 66, 67]),  '')); // 「ABC」
```

### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
P5.js 日本語リファレンス(byte)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の byte 関数を説明します。

## byte() 

### 説明文

数値、数値の文字列表現、またはブール値をそのバイト表現に変換します。 1バイトは -128 から 127 までの整数にしかできないため、この範囲外の値が変換されると対応するバイト表現に折り返されます。数値、文字列、またはブール値の配列が渡されると同じ長さのバイトの配列が返されます。

### 構文

byte(n)

byte(ns)

### パラメタ

- n
String | Boolean | Number：変換する値

- ns
Array：変換する配列

### 戻り値

Number：値のバイト表現


### 例1

```javascript
print(byte(127)); // 127
print(byte(128)); // -128
print(byte(23.4)); // 23
print(byte('23 .4 ')); // 23
print(byte('hello')); // NaN
print(byte(true)); // 1
print(byte([0, 255,  '100'])); // [0, -1, 100]
```


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
P5.js 日本語リファレンス(boolean)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の boolean を説明します。

## boolean


### 説明文

boolean は、JavaScript の[7つのプリミティブデータ型](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Primitive_values)の1つです。 ブール値は true(真) または false(偽) のみです。

[MDNエントリから](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type)：ブール論理エンティティを表し、2つの値を持つことができます：true(真) または false(偽)

### 構文

boolean



### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
WordPressのsearch regexプラグインで、REST APIが404エラー

WordPressのsearch regexプラグインは、複数記事の文字列を一括置換する際に便利でよく利用しています。しかし、最近のバージョンアップで以下のエラーが出るようになってしまいました。

>URL とリクエストメソッドに一致するルートがありません (rest_no_route)
>
>Your REST API is returning a 404 page. This is almost certainly a plugin or server configuration issue and not a problem with Redirection.

>* Can you access your REST API without it redirecting? You will need to fix any errors.
>* Check your Site Health and fix any issues.
>* Your server configuration is blocking access to the REST API. You will need to fix this.
>* A security plugin or firewall is blocking access. You will need to whitelist the REST API.

WordPressのREST APIを今まで特に使おうとしたことがなかったので、とりあえず動作確認をするため以下のURLを叩いてみたところ、404が帰ってきました。

https://example.com/wp-json/

で、なんで動作しないのかググってみると、パーマリンクを「基本」(デフォルト)にしている場合は、REST APIの叩き方が変わります。以下のURLを叩いたらレスポンスが返ってきました。

https://example.com/?rest_route=/

Can I use REST-API on plain permalink format?
https://wordpress.stackexchange.com/questions/273144/can-i-use-rest-api-on-plain-permalink-format

パーマリンクがデフォルトの場合のREST APIエンドポイントに、search regexプラグインが対応していないのが原因ぽいです。パーマリンク設定を「カスタム構造」にして以下の設定値にすればなんとかなるかと試してみましたが、カテゴリページのURLがおかしくなってしまったので断念。結局解決しませんでした。

`?p=%post_id%`
IAR RISC-V評価キット

##IAR
IARという会社をご存知でしょうか？
IARとはマイコン用の統合開発環境を提供する会社の一社です
ルネサスやSTマイクロのセミナーなどで使用されているので使ったことがある人も居るのではないでしょうか？
##IARがRisc-V
Risc-VはArmの対抗馬と目されるCPUであり、オープンソースライセンスなのも特徴です。
マイコン業界を含めて注目はされていますが、開発環境やサポートなど商用として移行するには難しい状況でした。
そんな中で、IAR社がRisc-VのCPUを製造するGigaDeviceと協業したのです。
##RISC-V評価キット
本キットはGigaDeviceのGD32VF103R8T6とスイッチ、LED、センサー類を搭載した評価ボードとI-jet Liteというデバッカーがセットになっています。
https://www.iar.com/jp/iar-embedded-workbench/tools-for-risc-v/evaluation-kit-for-risc-v/
今回は、こちらを触ってみる事にします
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/bcf7a634-e31d-0e10-6c7f-de93f89f1730.jpeg" width="500"  border="0" />
ブリスターパックに入っています
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/eae8cdaa-881c-3711-0742-901bf6d19e9f.jpeg" width="750"  border="0" />
基板、I-jet Lite、USBケーブル
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/5d6fbf48-ec27-cc84-ecf1-fda7682ea2af.jpeg" width="750"  border="0" />
GD32VF103R8T6に
・USB-シリアルチップ
・スイッチ
・LED
・フルカラーLED
・ADC用の可変抵抗
・温湿度センサ
・加速度
・ライトセンサー
・マイクロフォン
・SPIフラッシュ
などがついているようです。

##IAR Academy
今回のキットも、IARが提供し始めたIAR Academyと連携されています。
https://training.iar.com/
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/9d4d62a6-dda1-f1de-42af-b535ffb45759.png" width="500"  border="0" />
IAR Workbenchの使い方を一通り学べるようになっています。
今回、ちょっと良いなと思ったのは、Hello WorldでVersionを入れる所だったりします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/5ed24a03-76a8-8001-1c3c-ea24b7285492.png" width="750"  border="0" />
こんなところを・・・と思ったかもしれませんが、バージョン情報を反映せる機能は意外と便利な気がします。
##言いたいことは何だろう？
一通り、動画を見るとIAR Workbenchを触る事と共に、Risc-Vを動かす事が出来ます。
コンパイラの圧縮の話とか、興味深い所を知る事が出来ました。
ただ、彼らが言いたいのは、IAR Workbenchを使う事でArmもRisc-Vも同じようにコーディング可能だと言いたいのではないか
と思います。

統合開発環境によって、使うコードが変わったり、設定が変わる為に、様々なコンパイラ、開発環境を行き来すると頭が追いつきません。
IARユーザーにとって、IAR Workbenchを使えば、同じような環境でArmもRisc-Vも開発できるのは確かにメリットだと思います。
Pythonの環境構築をしないでプログラムを実行させる！！(Google Colaboratoryの始め方)

#始めに
僕は１年ぐらい前に人工知能についてよく分からないなら説明を聞くより作った方が早いだろと考え[Udemy](https://www.udemy.com/ja/)でPythonを使った人工知能の作り方についての動画を購入しましたが、**numpy**が上手くインストール出来なくて挫折してしまいました(笑)。でも今回の環境ではnumpyを使う事が出来ました！同じ悩みで困っていたらぜひ参考にして下さい。そうでなくても、pythonは何をして環境構築をしたら良いのか分からないと言う人や、タブレットでプログラミングをした人に、この記事を読んでくれると嬉しいです。

#google driveを使って
今の時代で知らない人は居ないと思いますが、googleではアカウントを作ると無料で15Gの容量をクラウド上に保存できる様になります。今回はそのgoogle driveの拡張機能？を使ってpythonで実行させて見ましょう。※今回はgoogleアカウントの作り方の作り方については解説しません、ゴメンなさい。YouTubeで分かりやすい解説動画がありましたので[こちら](https://www.youtube.com/watch?v=eb_Fbr7sdIo)からどうぞ！

#google Colaboratoryの下準備
まず始めにgoogleのアカウントにログインしてからドライブを開いて見て下さい。開くと下の画像のようになるはずです。
![スクリーンショット 2020-08-23 16.45.45 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/8cf792f8-2529-a8e2-83e6-b6637079d45e.png)
そうしたら、新規→その他→アプリを追加を押して下さい。そうすると下のようなウィンドウが表示されます。
![スクリーンショット 2020-08-23 16.49.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/9794997b-7f9a-c7cf-f061-d238560da659.png)
appの検索から"**Colaboratory**"と検索して下さい。そうした左下に青色のアプリを追加するボタンを押して下さい。それでもう一度driveを読み込み直したら新規→その他→Colaboratoryが開けるようになっています。
![スクリーンショット 2020-08-23 16.52.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/54826b8f-f75e-fca4-ffb4-3f9f1666b2e5.png)
これで準備は完了です。とても簡単ですね！
#google Colaboratoryを使って見よう！
Colaboratoryを開くと初めはこんな感じのウィンドウになっています。![スクリーンショット 2020-08-23 16.54.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/e4945840-045e-141d-ce8a-3b5b0e78fcef.png)
それではpythonが実際に使えるかやって見ましょう。
![スクリーンショット 2020-08-23 16.58.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/e670b71f-60c7-8f26-3b04-8c677aadb6a9.png)
しっかりとpythonが使える事がわかりました。
※ちなみにプログラムの実行はenter+shiftを同時に押せば解決です。

最後にnumpyが動かせるか試して見ます。numpyの基本的な機能のrangeが使えるか試して見ます。

```python
import numpy as np

number = np.array(range(1,10))
print(number)
```
※これがコードです
![スクリーンショット 2020-08-23 17.09.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/fc35525e-d741-8a82-3371-68d4c4161b9d.png)
成功しましたね。これでnumpyも使える事がわかったので人工知能についての学習をもう一度やり直して見たいと思います。(なんだかジュピタノート見たいですね！)
#最後に
今回はタマタマYouTubeを見ていたら見つけたのでその[リンク](https://www.youtube.com/watch?v=HaBhMpQ_5_I)を載せておきます。なかなか面白いので見て見て下さい。
順番は逆になってしまいましたが、最後まで記事を見てくてありがとうございました。まだまだプログラム経験は浅いのでも違っていたら押してくれると嬉しいです。
Blue/GreenデプロイメントではRoute53の加重ルーティングを使うといいらしい

Blue/Greenデプロイメントすらもわからなかったので
自分の知識として。

## Blue/Greenデプロイメントとは
従来のアプリと新バージョンのアプリ（テスト済み）を構築し、
ダウンタイムなしに従来のアプリから新アプリに切り替えていく方法。

参考：[「Blue-Green Deployment」とは何か、マーチン・ファウラー氏の解説](https://www.publickey1.jp/blog/14/blue-green_deployment.html)

## AWSで実現するBlue/Greenデプロイメント
Blue/Greenの構築方法は下記のawsのドキュメントがある。
[AWS のブルー/グリーンデプロイ](https://aws.amazon.com/jp/quickstart/architecture/blue-green-deployment/)

その環境をRoute53でルーティングし、加重ルーティングすることで新バージョンのテストもできるらしい。

(aws SSA-C02の勉強にて学んだこと）
機械学習まとめ 

<h1>機械学習の定義について</h1>

<p>
これといった定義はなく、そもそも定義などできないものではないかと感じている。
文献によって定義が違うこともしばしば。そのため複数の書籍を読む中で一番しっくりきたものを
自分なりの定義として記しておくことにする。
</p>

<p>
・入力データ(=説明変数)から基準を学習して判断モデルを構築し、<br>
それに基づいて未知の結果(=目的変数)を予測する技術<br>
この「判断モデル」は次の二つの側面を持つ。<br>
・入力データに対して出力データを返す関数のような働きを持っている。<br>
・判断モデルの振る舞いは、学習により規定される。<br>
</p>


<h1>機械学習の方法</h1>
<p>
<B>①教師あり学習</B><br>
学習データが、モデルに対する入力データとその時にあるべき出力である教師データのセットになっている学習法。
教師あり学習のおもな分析手法には「回帰」や「分類」がある。
「回帰」の目的は、連続値などの値の予測。例えば、気温の高さとアイスの売り上げ金額の関係予測等。
「分類」の目的は、データが属するクラスを予測すること。例えば、ECサイトで顧客のプロフィール情報に基づき「その製品を買うか買わないか」を予測する等。<br>

<B>②教師なし学習</B><br>
教師データなしに、学習データのみが与えられ、そこからなんらかの出力を得る学習法。例えば、商品の売り上げデータを基にある商品と一緒に購入される可能性が高い商品をコンピュータが計算によって判断する等(レコメンドシステムと呼ばれ、Amazon等のECサイトでよく使われている)。
分析手法としては「クラスタリング」と「次元削減」がある。「クラスタリング」とは異なる性質のものが混ざり合った集団から、似たような性質を持つもの同士の一定の規則・共通項に従って分類・グルーピングする手法のこと。「次元削減」とは、文字通り次元数を減らすことをサス。具体的には多次元からなる情報を、その意味を変えずに、より少ない次元の情報に落とし込む。主な目的はデータの圧縮やデータの可視化。<br>

<B>③強化学習</B><br>
教師あり学習と教師なし学習の中間の学習方法。報酬を最大化する行動を試行錯誤で学習する。例えば、将棋に関する強化学習では、敵の王将をとることに最大の報酬として設定し、コンピュータに報酬を高める指し方を繰り返し学習させる。
</p>

<h1>参考文献</h1>
<p>
1）赤石雅典『最短コースでわかるディープラーニングの数学』、日経BP社<br>
2）毛利拓也,北川廣野,澤田千代子,谷一徳『scikit-learnデータ分析実装ハンドブック』、株式会社 秀和システム<br>
</p>
MacにUbuntu環境を使ってROS1で遊ぶ

ROSを使ってみようと思ったが、どうやらROS1はMacOSXは未対応のよう。
ROS2はMacOSXに対応しているらしいが、ざっくり調べた感じだとROS1に対して情報が少ないみたい。
というわけで、Ubuntu環境を作ってROS1で遊ぶ。

###1. 環境
- macOS Catalina 10.15.6

###2. Ubuntuの導入
Parallels Desktop 16 for Mac(有料)をインストールする。
インストールアシスタントに従ってUbuntu 18.04をダウンロードする。
※Parallels Desktopからインストールすべし。
　App Storeからインストールするとネット接続でうまくいかなくて1日潰れた。

###3. ROSの導入
下記URLに沿ってインストール。
[Ubuntu install of ROS Melodic](http://wiki.ros.org/melodic/Installation/Ubuntu)

```shell
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
curl -sSL 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654' | sudo apt-key add -
```
もし、curlが入っていない場合は

```shell
sudo apt install curl
```

を実行。
こっからインストール作業(フルバージョン)。

```shell
sudo apt install ros-melodic-desktop-full
```

続いて環境設定。

```shell
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc
```

```shell
sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential
sudo rosdep init
rosdep update
```

ここまででROSの導入完了。
3つターミナルを用意して1つめのターミナルに

```shell
roscore
```

と打ち込み、2つめのターミナルに

```shell
rosrun turtlesim turtlesim_node
```

とし、3つめのターミナルに

```shell
rosrun turtlesim turtle_teleop_key
```
と書いて、十字キーを押すと亀が動く。

![スクリーンショット 2020-08-23 17.02.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690613/ecedb005-278f-90d5-4112-fb570b5a44a8.png)

これでROSで遊べるぞ

###参考資料
- [ROS wiki](http://wiki.ros.org/ja)
- [Mac（High Sierra）にUbuntu環境を作ってROSでカメさんを走らせてみる。](https://karia68.hatenablog.com/entry/2018/08/16/212145)