OmniAICreator/Qiita-1.07M huggingface dataset:
heroku 『GithubからHerokuへのデプロイ 』

#はじめに

[Github](https://github.co.jp/)と[Heroku](https://jp.heroku.com/)に登録しましょう。

下記の記事を参考に登録しましょう。
・[GitHubアカウント作成とリポジトリの作成手順](
https://qiita.com/kooohei/items/361da3c9dbb6e0c7946b)
・[[初心者向け]herokuをデプロイしよう](https://qiita.com/DogK0625/items/12178fdc3dd607088ff0)

#Herokuでアプリケーション作成
1. Herokuにログイン
2. 右上の『NEW』をクリックし、『create new app』を選択
<img width="1437" alt="hero1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595315/0fce9a2a-19c5-f59b-d2dd-482061f120e0.png">

3. 『app-name』を決める
  ・Herokuアプリケーションへアクセスする際の URL『https://（App name）.herokuapp.com 』になります。
　・世界唯一のアプリケーション名でなければなりません。
  ・リージョンは特に理由がなければ『United States』のままで問題ありません。
4. 『create app』をクリック
<img width="1440" alt="hero2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595315/08b972d9-68bf-3f1b-7f7d-215b3bf6c121.png">

#GitHubと連携
1. 『deploy』タグへ移動
2. 『Deployment method』にて『Heroku Git』を『GitHub』に変更
<img width="1217" alt="hero3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595315/6ef9c6d0-3968-9594-e4ff-a88ed2f55eb9.png">

3. 『Connect to GitHub』が表示、『Connect to GitHub』をクリックし、認証
4. 『repo-name』に自身がデプロイしたい『GitHub』配下にあるリポジトリを検索、選択

<img width="1267" alt="hero5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595315/0ffbb0c9-3a1e-e264-775b-cde33fefdd02.png">



５. 『Automatic deploys』と『Manual deploy』が確認できましたら連携完了
<img width="1308" alt="hero6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595315/1800732a-7663-d505-4962-1d5659aaaafb.png">


#デプロイを執行
1.　『Manual deploy』にて『master』ブランチになっていることを確認し『Deploy Branch』クリックし、デプロイ開始
2.　Heroku の自動ビルドシステム開始...
3.　『Your app was successfully deployed.』と表示されれば完了です。
4.　『View』をクリックし確認しましょう。
<img width="919" alt="hero7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595315/ab44f14e-5df2-2507-fe2e-4e0b32970248.png">

#終わりに
Herokuは、『サーバー』、『OS』、『データベース』、『プログラミング言語の実行に必要な環境』、Webサービスを公開するために必要なものを全て、予め用意してくれるというサービスです。

Herokuを使えば、開発したWEBアプリケーションを10分程度で全世界に公開することができます。
自動デプロイもできますので興味のある方は調べて見てください。
functools.lru_cacheとmemoize

#memoize
計算結果を保存しておくことができ、次回呼び出す時にその結果を利用することができますので早くなります。

```memoize.py
def memoize(f):
    memo = {}
    def _wrapper(n):
        if n not in memo:
            memo[n] = f(n)
            print('hit')
            print(memo)
        return memo[n]
    return _wrapper


@memoize
def long_func(n):
    r = 0
    for i in range(10000000000):
        r += n * i
        return r


for i in range(10):
    print(long_func(i))
    #long_func(i)


print('next run')
for i in range(10):
    print(long_func(i))
    #long_func(i)
```
#functools.lru_cache
上と同じことができます

```lru_cache.py
import functools


@functools.lru_cache()
def long_func(n):
    r = 0
    for i in range(10000000000):
        r += n * i
        return r


for i in range(10):
    print(long_func(i))

print(long_func.cache_info())
# long_func.cache_clear()  キャッシュをクリア
print('next run')
for i in range(10):
    print(long_func(i))

print(long_func.cache_info())
```
Rider が無限にうまくなる Plugin "Key Promoter X"

Rider のショートカットを活用していますか？
よく使っているのものあると思いますが、中々新しいショートカットを覚える機会ってないですよね。

そこで Plugin "Key Promoter X" です。
この Plugin はマウス操作した内容のショートカットを、IDE右下にトーストを出して教えてくれます。

# 手順
1. `command` + `,` を押して、設定画面を開きます。
2. Plugin に移動します。
3. マーケットプレイスに `Key Promoter X` と入力します。
4. 検索結果に表示された Key Promoter X を install します。
5. IDE の再起動をしたら、その後からは常にショートカットを提示し続けてくれます！  
この下の例はマウスで定義に移動した時に出るものです  
![スクリーンショット 2020-06-24 0.53.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/8336c049-54ca-2d6e-fd1f-6bbf1414d54a.png)

# 戯言
個人的にはショートカット覚える一番の機会が、誰かとペアプロした時だと思っています。
人によって使うショートカットが違ったりするので、教わることが多いなと思っていました。
ですがこの Plugin があれば、常に提示し続けてくれるし、よく使うものは自ずと覚えるなと思いました。

# 参考
* 全然別の話で調べていた時に見つけた記事が[こちら](https://lukaszlawicki.pl/most-useful-keyboard-shortcuts-in-rider/)で、それを参考にインストールしました。
* 有用そうな Plugin をまとめられている肩もいました。それは[こちら](https://qiita.com/momosetkn/items/0461fcf22a597985b2e6)。
NPocoの紹介 -機能編- インターセプター

# NPocoの紹介 -機能編- インターセプター
最初の記事は[こちら](https://qiita.com/epsilon_87_myo/items/1c0f75064b9b6bcc9e1e)

今回はインターセプターについて紹介します。

ソースは[こちら](https://github.com/schotime/NPoco/blob/d707af2bf59f5c70c1d147bc6974d3cdd52bb05b/src/NPoco/IInterceptor.cs)


## インターセプターについて
各処理の前や後に処理を組み込むためのものです。

基底のインターフェースとして`IInterceptor` が用意されており、組み込みポイント毎にさらに継承したインターフェースが用意されています。

### 登録するには？
インターセプターを登録するには`Database.Interceptors` プロパティに実装クラスのインスタンスを追加します。

```cs
using Database database = new Database(con);
database.Interceptors.Add(new LoggingInterceptor());
```

次に各インターセプターの紹介をします。

### IExecutingInterceptor
クエリの実行前、実行後に呼び出されます

私はクエリのロギングのために使っています。

```cs
public class LoggingInterceptor : IExecutingInterceptor
{
    public void OnExecutedCommand(IDatabase database, DbCommand cmd)
    {
        var fmtCmd = ((Database)database).FormatCommand(cmd);
        //実運用ではコンソールではなくILogger<>を使っている
        Console.WriteLine(fmtCmd);
    }

    public void OnExecutingCommand(IDatabase database, DbCommand cmd)
    {
        //noop
    }
}
```

### IConnectionInterceptor
コネクションが開いた、閉じたときに呼ばれるようです(使ったことない)

### IExceptionInterceptor
例外発生時に呼ばれます。

例外ログを残したり、
一意制約違反判定を行い一意制約違反であれば別例外にラップしてスロー

といった使い方を私はしています。

### IDataInterceptor
クエリ自動生成によるInsert, Update, Delete時に呼ばれます。
`false` を返すと実行を中止します。

私は共通列への値のセットを行うために使っています。

```cs
//共通列を定義した基底クラスを用意
//各エンティティクラスはこれを継承
public abstract class AbstractEntity
{
    [Column("created_at")]
    public DateTime? CreatedAt { get; set; }

    [Column("updated_at")]
    public DateTime? UpdatedAt { get; set; }
}
```

```cs
  public class CommonColumnInterceptor : IDataInterceptor
  {
      public bool OnDeleting(IDatabase database, DeleteContext deleteContext)
      {
          return true;
      }

      public bool OnInserting(IDatabase database, InsertContext insertContext)
      {
          if (insertContext.Poco is AbstractEntity aEntity)
          {
              DateTime now = DateTime.Now;
              aEntity.CreatedAt = now;
              aEntity.UpdatedAt = now;
          }
          return true;
      }

      public bool OnUpdating(IDatabase database, UpdateContext updateContext)
      {
          if (updateContext.Poco is AbstractEntity aEntity)
          {
              DateTime now = DateTime.Now;
              //更新対象列指定時のUpdateがうまくいかないので
              //それに対応するには別途拡張した仕組みを用意する必要があります。
              aEntity.UpdatedAt = now;
          }
          return true;
      }
  }
```

### ITransactionInterceptor  
トランザクションの開始、コミット、ロールバックで呼ばれるようです。(使ったことない)
dockerとmysqlでrails環境を構築したけどドハマリした

dockerにrails環境を作った
https://qiita.com/NA_simple/items/5e7f95ae58eec5d20e1f

途中なぜか上手くいかないと思ったら、mysql-clientsがインストールできなくなっているらしい。書き換え方は下のURLを参考に。
https://qiita.com/yagi_eng/items/1368fb2a234629a0c8e7

調子に乗ってすすめていると、またハマる。

```ruby:terminal
$ docker-compose run web rails db:create
Starting postgress_db ... done
Could not find activesupport-5.2.4.3 in any of the sources
Run `bundle install` to install missing gems.
```

なぜだ、、、と思ったらrubyのバージョンが違う？？
rbenvでバージョンを探しても、2.7.1が見つからず。
rbenv古い事に気づき、アップデート

rbenvをアップデート
https://qiita.com/pugiemonn/items/f277440ec260b8d4fa6a

からのgemも古い事に気づき、

```ruby:terminal
$ gem update
```

まだいかない、、、
bundler updateを行う。

ここらへんで絶望したので時間を置く。

一旦整理して、違うサイトの最初から手順をパクる。

https://toranoana-lab.hatenablog.com/entry/2020/06/05/173658

なんと止まること無くdockerの起動、localhostにアクセス可能に！！！
よっしゃ！！！！

```terminal:localhost_3000
Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
```

なんで :D
ググるとファイルが無いらしいからsudo touchで無理やり作ってる記事がちらほら。
でもファイルあるしなあ、と思いつつ削除&作成

同じエラー。

？？？と思い、ここでmysql立ち上げていないことに気づく
これだ！！！と思って

```terminal:terminal
mysql.server start
```

を実行するも、起動しない。
ググるとどうやら

```terminal:terminal
sudo rm mysql.sock
brew uninstall mysql
brew install mysql
```

と、sockファイルを消してからmysqlをアンインストール→インストールで治るらしい。
mysql.sockのパスは前のエラーで判明していたので、それを消してから

```terminal:terminal
mysql.server start
```

…通った！！！！

これは行ったか…？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484621/25d64822-54d9-d436-f5f0-6dec10e19cd5.png)

ヤッターーーーーーー！！！！！！！！！

docker理解してから構築したほうが早かったと思います。
勉強し直しましょう。自分。

なにはともあれ動いてよかった

最終的な各ファイルの中身↓

```ruby:gemfile
source 'https://rubygems.org'
gem 'rails', '~>6'
```

```ruby:docker-compose.yml
version: '3'
services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD:
    ports:
      - '3306:3306'
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - mysql-data:/var/lib/mysql
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
    stdin_open: true
    tty: true
    command: bundle exec rails server -b 0.0.0.0
volumes:
  mysql-data:
    driver: local
```

```ruby:Dockerfile
FROM ruby:2.7
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
    && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
    && apt-get update -qq \
    && apt-get install -y nodejs yarn \
    && mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]
```
Scenic with Nerves(Elixir)

# はじめに
- [Scenic](https://hexdocs.pm/scenic/welcome.html)は、Elixir/Erlang/OTP stackで直接書けるアプリケーションフレームワークです
- [Nerves](https://hexdocs.pm/nerves/getting-started.html)は、ElixirのIoTでナウでヤングなcoolなすごいヤツ！ です

# 準備(公式)
- [Scenic](https://hexdocs.pm/scenic/install_dependencies.html#content)
- [Nerves](https://hexdocs.pm/nerves/installation.html#content)

## 参考記事
- [Scenicを試してみる(Elixir)](https://qiita.com/torifukukaiou/items/0d2c63265aa2600bddd2)
- [ElixirでIoT#4.1：Nerves開発環境の準備（2020年4月版）](https://qiita.com/takasehideki/items/88dda57758051d45fcf9)
- [ElixirでIoT#4.1.1：WSL 2でNerves開発環境を整備する](https://qiita.com/takasehideki/items/b8ea8b3455c70398178a)

## 私が使ったバージョン
```
$ asdf current
erlang 23.0.1
elixir 1.10.3-otp-23
```

- (注) 2020/6/23 時点でNervesの[公式](https://hexdocs.pm/nerves/installation.html#all-platforms)に書いてあるバージョンと異なっています
    - [@matsujirushi12](https://twitter.com/matsujirushi12)さんの「[これだ。This release updates the system to use Buildroot 2020.05 and Erlang/OTP 23.](https://twitter.com/matsujirushi12/status/1274691931608473601)」
    - ↑こちらにありますように私がやったときにも[Erlang](https://www.erlang.org/)が23を求められたので上記のバージョンでやっています

# [Getting Started with Nerves](https://hexdocs.pm/scenic/getting_started_nerves.html#content)を参考になぞってみる

```
$ mix scenic.new.nerves my_app
$ cd my_app
$ export MIX_TARGET=rpi2
```

- `mix scenic.new.nerves`したときに`config/rpi3.exs`はできてはいます
- 私はRaspberry Pi 2しかもっていない。。。
- `config/rpi2.exs`がない状態で`mix deps.get`すると、以下のエラーが発生しました

```
$ mix deps.get
** (Code.LoadError) could not load /Users/torifuku/Documents/13_Elixir/Scenic_with_Nerves/my_app/config/rpi2.exs
    (elixir 1.10.3) lib/code.ex:1397: Code.find_file/2
    (elixir 1.10.3) lib/code.ex:871: Code.eval_file/2
    (mix 1.10.3) lib/mix/config.ex:158: anonymous fn/2 in Mix.Config.__import__!/2
    (elixir 1.10.3) lib/enum.ex:2111: Enum."-reduce/3-lists^foldl/2-0-"/3
    (mix 1.10.3) lib/mix/config.ex:157: Mix.Config.__import__!/2
    (stdlib 3.12.1) erl_eval.erl:680: :erl_eval.do_apply/6
```

- 気を取り直して
- コピーすればいいのだろう、きっと！ :rocket: 

```
$ cp config/rpi3.exs config/rpi2.exs 
$ mix deps.get
$ mix firmware
$ mix firmware.burn
```


- こんがりやきあがったmicroSDカード:fire::fire::fire:をRaspberry Pi 2に差し込んで、HDMIでテレビ:tv:とつなげてみました
- `lib/scenes/sys_info.ex`にかいてある文字列がテレビ:tv:に写りました！

```
MIX_TARGET: rpi2
MIX_ENV: dev
Scenic version: 0.10.2
```

```
Please note: because Scenic
draws over the entire screen
in Nerves, IEx has been routed
to the UART pins.
```

# Wrapping Up
- とりあえず(たぶん)、Nerves上でScenicを動かせました :rocket::rocket::rocket: 
- **Enjoy!**
WSL2でのError: Can't open display問題の解決

# 概要
[前回](https://qiita.com/Engr_Coal33/items/bc1dc187f8b993afc2f9)に引き続きまたWSLネタです。

Windows 10 May 2020 Update (Version 2004)が配信され、私のデスクトップPCはWindows 10 2004になりました。この機会にと思い、WSLのUbuntuを18.04LTSから20.04LTSに変更し、WSLのバージョンも2にして、18.04からの移行も済ませました。

追記：KB4566116適用後のWindows 10 1903,1909でもWSL2が使えるようになっているみたいです
https://forest.watch.impress.co.jp/docs/news/1272017.html

しかし、Displayの設定がWSL1のときとは異なっているようで、ネット上にまだ情報が少なかったため今回記事にすることにしました。(まあちゃんと探せば出てくるんだろうけど)

# 前提
~~環境はWindows 10 2004で、WSL2を有効化していることです。~~
環境はWindows 10  1903,1909(KB4566116適応済)または2004以降で、WSL2を有効化していることです。

### 確認方法
Windowsのバージョンは`Windows+R`キーを押して、winverと入力すると出てきます。(以下参照)
https://support.microsoft.com/ja-jp/help/13443/windows-which-version-am-i-running

WSLのバージョンは、Powershellを開いて

```powershell:powershell
wsl --list --verbose
```
として、バージョンが2であればWSL2が実行中です。

今からWSL2を使いたいんや！って方はこちらを御覧ください
https://docs.microsoft.com/ja-jp/windows/wsl/install-win10#enable-the-virtual-machine-platform-optional-component

# 本題
### 何が起きてるの
おそらく、ここを見ておられる方のほとんどは
https://www.atmarkit.co.jp/ait/articles/1812/06/news040.html
こちらに書かれている内容をすべて実行済みかと思われます。
もし、お済みでない方はこちらを参考に設定をしてみてください。

さて、ここからが本題です。
WSL2にて、

```bash:bash
echo "export DISPLAY=:0.0" >> ~/.profile
echo 'export LIBGL_ALWAYS_INDIRECT=1' >> ~/.profile
```
を実行するとかして、`~/.profile`に

```bash:bash
export DISPLAY=:0.0
export LIBGL_ALWAYS_INDIRECT=1
```
なんかを記述済みなのにも関わらず、xeyesを実行すると

```bash:bash
$ xeyes
Error: Can't open display: :0.0
```
だとかがでてくる、ということが起こりました。

WSL2で仮想的なイーサネットアダプター（vEthernet　WSL)が実装され、ホスト(Windows10側)と異なるIPアドレスが与えられているため、localhost:0.0みたいな指定ではだめみたいです。

更に厄介なことに、現状では、WSL 2のIPアドレスの割り当ては、WSL 2の仮想ネットワークが立ち上がるときに行われるため、一定のIPアドレスにならないようで、直接IPアドレス指定すればいいみたいなのですが、毎回ipconfigなんかで確認して、DISPLAY環境変数を変えなくてはいけないみたいです。

(自分もあんまり良くわかってないです。間違えてたらすみません。)

### そんなんいいからはよ解決策を教えてくれ

結論を言えば、2つだけです。

まず、
`echo "export DISPLAY=:0.0" >> ~/.profile`の代わりに

```bash:bash
echo "export DISPLAY=\$(cat /etc/resolv.conf | grep nameserver | awk '{print \$2}'):0.0" >> ~/.profile
```
としてやる(もし`echo "export DISPLAY=:0.0" >> ~/.profile`を実行していたらviとかで編集したほうがいいかも)

2つ目に、
VcXsrvを起動する際、3枚めの画面のAdditional parameters for VcXsrvの欄に`-ac`と書き込むだけでした。
このあと、save configurationで設定ファイルをshell:startupに保存しておくと、Windows起動時に自動でVcXsrvを起動してくれるようになるのでおすすめです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566454/3a74562c-4d93-1a25-bb2b-9b49e90e0e5a.png)

くわしいことはここに書かれてました。
https://github.com/microsoft/WSL/issues/4106

以上です。ありがとうございました。
RDSとDynamoDBをCAP定理、ACID、BASEを使って整理する

AWSの2大データベースであるRDSとDynamoDB、シンプルに初心者向けに何が違うのか、違いが簡単にわかるような説明を考えてみます。

# はじめに
初めてAWSのアーキテクチャーを考えるときに、最近ではサーバーレスな設計がごろごろ落ちているため、初めてシステム設計をする場合でも、NoSQLデータベースである、DynamoDBを使ったシステム構成が描けてしまいます。私が駆け出しのころは、Oracleまっさかりで、RDBを使ったシステム構成しか描けなかったものです。あらためて今回CAP定理という言葉をつかって初心者向けに比較してみたいと思います。

# CAP定理 と ACID と BASE を知っておこう
分散コンピューティングの考え方として、CAP定理、ACID、BASEを整理してみます。データベースを比較するときにかならず取り上げられる特徴になります。なかなか理解できませんが絵のように頭に焼き付けておきましょう。

## CAP定理
具体的な利用例でまとめられているのですが、3つの機能のうち1つを犠牲にしなければならないという定理です。2000年に生まれた概念です。

+ 一貫性 (Consistency)
 - 全てのノードで同時に同じデータが見える。
+ 可用性 (Availability)
 - 単一障害など一部のノードで障害が起きても処理の継続性が失われない。
+ 分断耐性 (Partition-tolerance)
 - 任意の通信障害などによるメッセージ損失に対し、継続して動作を行う。

## ACID
トランザクションシステムの持つべき性質としてまとめられた概念です。1970年後半に生まれた概念です。ACIDについては「[銀行の送金](https://tips-memo.com/acid#ACID)」を例にした説明がわかりやすいです。

+ 原子性 (Atomicity)
 - トランザクションに含まれるタスクが全て実行されるか、あるいは全く実行されないことを保証する性質をいう。
+ 一貫性 (Consistency)
 - トランザクション開始と終了時にあらかじめ与えられた整合性を満たすことを保証する性質を指す。
+ 独立性 (Isolation)
 - トランザクション中に行われる操作の過程が他の操作から隠蔽されることを指す。
+ 永続性 (Durability)
 - トランザクション操作の完了通知をユーザが受けた時点でその操作は永続的となり結果が失われないことを指す。

## BASE
可用性や性能を重視した特性を持つ分散システムの特性です。いつ生まれた概念かは不明です。

+ 基本的に利用可能 (Basically Available）
 - 基本的にいつでも利用できる。
+ 厳密ではない状態遷移 (Soft state）
 - 常に整合性を保っている必要はない。
+ 結果整合性 (Eventual consistency）
 - 結果的には整合性が保証される。

# RDB vs NoSQL (RDS vs DynamoDB)
CAP定理、ACID、BASE、ほか、いろいろな情報を盛り込んで、RDBとNoSQL、RDSとDynamoDBを整理してみます。

## CAP定理における整理
共通のデータを扱うネットワークで繋がったシステムが3つの望ましい性質のうち、2つしか満たせない、1つの特性は犠牲にしなければならない、というCAP定理に、RDBとNoSQLを当てはめてみます。

+ AP： 利用可能性(A)が高く、パーティション耐性(P)があるが、一貫性(C)を犠牲にする。NoSQLはここ。
+ CP: 一貫性(C)があり、パーティション耐性(P)があるが、可能性(A)を犠牲にする。
+ CA: 利用可能性(A)が高く、一貫性(C)があるが、分断耐性(P)を犠牲にする。RDBはここ。

## ACID、BASEも含めた整理
最後に、全部含めてまとめると以下のような表になります。スッキリまとまりました。ACIDはCAに、BASEはAPに対応します。

|   | RDB  |NoSQL  |
|---|---|---|
|CAP定理  |CA  |AP(+C)  |
|BASEとACID  |ACID  |BASE  |
|使い所  |整合性の必要なデータ保存、トランザクション処理、難しいクエリ処理  |簡単でたくさんある保存処理、キーバリューシステム(KVS)、ドキュメントDB  |
|例  |決済、他システム連携  |ゲームの課金情報保存、カート保存  |
|AWSの2大データベース  |RDS  |DynamoDB  |

# 余談
余談ですが「[12年後のCAP定理: "法則"はどのように変わったか](https://www.infoq.com/jp/articles/cap-twelve-years-later-how-the-rules-have-changed/)」の中では、銀行のATMについて触れら得れていました。非常に興味深かったのですが、銀行のATMは、一貫性(C)が求められる用に見えて、なんと、実は可用性(A)が求められるそうです。理由は利用者が多いほど利益性が高められるからだそうです。

# まとめ
ということで、データベースの大事なワードを盛り込みつつ、AWSの2大データベースを整理してみました。みなさんそれでは迷わずNoSQLやRDBを使ったシステム設計やアーキテクティングを楽しみましょう。

# 参考
おっさんがACIDとかBASEとかまとめておく。
https://qiita.com/suziq99999/items/2e7037042b31a77b19c8
「RDBMS」と「NoSQL」の比較
https://masawan-guitar.hatenablog.com/entry/2016/08/14/163447
CAP定理を見直す。“CAPの3つから2つを選ぶ”という説明はミスリーディングだった
https://www.publickey1.jp/blog/13/capcap32.html
12年後のCAP定理: "法則"はどのように変わったか
https://www.infoq.com/jp/articles/cap-twelve-years-later-how-the-rules-have-changed/
DynamoDB vs MongoDB: 6 Critical Differences
https://www.xplenty.com/jp/blog/dynamodb-vs-mongodb-differences-ja/#CAP
AmazonのDynamoの論文を読んでみた(1/3)
https://imai-factory.hatenablog.com/entry/2013/11/03/215247
AWS Black Belt Techシリーズ Amazon DynamoDB
https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-tech-amazon-dynamodb

以上
TypeError: can only concatenate str (not "float") to str

以下の実行時にエラー

```py:test.py
NUM=100.00
print("TEST:" + NUM)
```

```
$ python test.py
TypeError: can only concatenate str (not "float") to str
```

strを加えて解決

```py:test.py
NUM=100.00
print("TEST:" + str(NUM))
```

```
$ python test.py
TEST:100.00
```
EC2からMySQL(RDS)接続後にローカルMySQLにデータを入力する方法


# はじめに

フローは大体思い浮かんだのですが、個々のコマンドを調べながら実行していくのに時間がかかってしまいました。
今後も使うだろうと思ったので、こちらにまとめておこうかなと思います。


# 目次

* EC2からMySQL(RDS)に接続する方法
* MySQL(RDS)からEC2にバックアップをとる方法
* EC2からローカルにバックアップデータを転送する方法
* バックアップデータをローカルMySQLに復元する方法

## EC2からMySQL(RDS)に接続する方法

```
# EC2へssh接続（ローカル上で実行）
$ ssh -i "******.pem" ec2-user@***ip_address***

# EC2 上から本番環境の MySQL へ接続（EC2上で実行）
$ mysql -h *******endpoint********.ap-northeast-1.rds.amazonaws.com -P 3306 -u ***db_username*** -p

# パスワード入力
> *********

# MySQL から抜ける（接続できることを確認できればok）（本番環境のMySQL上で実行）
> exit
```

## MySQL(RDS)からEC2にバックアップをとる方法

```
# MySQL からデータをバックアップ （EC2上/tmp/mysqldump_all_database.dumpにバックアップをとる）
$ mysqldump --single-transaction -h *******endpoint********.ap-northeast-1.rds.amazonaws.com -P 3306 -u ***db_username*** -p ***password*** > /tmp/mysqldump_all_database.dump
```

## EC2からローカルにバックアップデータを転送する方法

```
# EC2から抜ける
$ exit

# EC2 -> ローカル へファイル転送（ローカル上で実行）
$ scp -i /Users/***username***/.ssh/*******.pem -r ec2-user@***ip_address***:/tmp/mysqldump_all_database.dump /Users/***username***/Downloads
```


## バックアップデータをローカルMySQLに復元する方法

```
# 開発環境の MySQL へ接続（ローカル上で実行）
$ mysql -h db -u root -p

# MySQL に復元するファイルの容量を一時的に大きくする（開発環境のMySQL上で実行）
$ set global max_allowed_packet = 200000000;

# 開発環境の MySQL に復元（ローカル上で実行）
$ mysql -h db -u root -ppassword -D ***development_db_name*** < /Users/***username***/Downloads/mysqldump_all_database.dump
```

# まとめ
意外とつまづくことなく、シンプルに実行できました。

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/
関数の引数について（python）

#はじめに
この記事は、半分は自分のメモ用に作成した記事です。
ただ、自分が見返した時に分かりやすいメモにするためにも、
誰が見ても分かりやすい記事になるよう心がけたつもりです。
（その方が、間違ってた時に指摘もしてもらえそうだし・・・（本音））

#STEP１：実引数と仮引数について
引数とは、仮引数と実引数との２つに大きく分類されます。
　仮引数：関数**定義**で使用。実際のオブジェクトに仮の名前を付けるので仮引数。(argument)
　実引数：関数**呼び出し**で使用。実際のオブジェクトなので実引数。(parameter)

```python

def foo(a):  # 仮引数
  a+=1
  return a

print(foo(1)) #実引数
 >>>2

```
#STEP2:仮引数の性質
仮引数の重要な性質は、**関数の呼び出し毎に設定される**ことです。
具体例を見ていきましょう。

```python

def remove_first(lst):
    lst = lst[1:]
    print(lst)


lst = [1, 2, 3, 4]
print(lst)
remove_first(lst)
 >>> [2, 3, 4]
remove_first(lst)
 >>> [2, 3, 4]

```
ここで言いたいのは、1回目と２回目のremove_first(lst)の結果が同じであると言うこと。
つまり、「1回めに呼ばれたときの仮引数」と「2回めに呼ばれたときの仮引数」は、
同じ変数であっても別の変数として扱われていると言うことです。

#STEP3：仮引数の種類
前述した仮引数には５つのパターンがあります。

 - 位置またはキーワード：いわゆる普通の関数定義
 - 位置のみ：後述
 - キーワードのみ：後述
 - 可変長位置：後述
 - 可変長キーワード：後述

とりあえず、ここは通常の位置またはキーワードを紹介します。

```python

def foo2(a, b=3):  # aが位置引数、bがキーワード引数
  return a + b
def foo3(a=1, b):  # エラー（位置引数の前に、キーワード引数は設定できない）
  return a + b

print(foo2(1)) # 位置引数（bの値は関数定義時のデフォルト値がで適用される）
 >>>4
print(foo2(1,5)) # 位置引数（a=1,b=5）
 >>>6
print(foo2(1,b=5)) # 位置引数＆キーワード引数
 >>>6
print(foo2(a=1,b=5)) # キーワード引数
 >>>6
print(foo2(b=2)) # エラー
 >>>TypeError
print(foo2(b=3,a=1)) # キーワード引数の順番入れ替え
```
上記から分かる重要な性質として、

 - 仮引数では、位置引数の前にキーワード引数は設定できない
 - キーワード引数は実引数で設定をしなかった場合、仮引数のデフォルト値が適用される
 - 実引数において、キーワード引数は順番を入れ替えて設定できる
 - **実引数では位置引数としても、キーワード引数としても呼び出せる**

#STEP4:位置のみ、キーワードのみ
次は、前述した位置のみ、キーワードのみを紹介します。
まず、位置のみですが、
**関数定義時に、/の前にある引数は位置引数でしか呼び出せない**
一方、キーワードのみですが、
**関数定義時に、*の後にある引数はキーワード引数でしか呼び出せない**

```python

def func(a,*,b,c):
    return a + b + c

def func2(a, /):
    return a 

print(func(1,b=2,c=3)) # bはキーワード引数で呼び出さないとエラーになる
print(func2(1)) # aは位置引数で呼び出さないとエラーになる

```

#STEP5:可変長位置、可変長キーワード
まず可変長位置ですが、**任意の個数の位置引数を受け取れる引数**のことです。
**関数定義時に引数の前に*をつけることで位置引数になります（１つの関数に１回まで）**
可変長キーワードは、**任意の個数のキーワード引数を受け取れる引数**のことです。
**関数定義時に引数の前に\**をつけることで位置引数になります（１つの関数に１回まで）**

```python

def func(*a, **b):
    print(a)
    print(b)

func(1,2,3,b=4,c=5)
 >>> (1, 2, 3)
     {'b': 4, 'c': 5}
```
練習のためにSwiftをUdemyで勉強してみた(5日目)

#今日やったこと
 - ARアプリを色々作って試した
 - Githubに作った作品を公開した

#ARアプリについて
テキストに沿って、いくつかのアプリを作りながら、AR機能を色々と遊んでおります。
しばらくはAR機能で遊べそうですが、じっくりとアプリを作っていきたくなる今日このごろです。

#作ったアプリ

##MyFirstARapp
タイトルにひねりのないやつ。
単純にXcodeでNew Projectしたときに最初にでてくるやつ。
AR機能をビルドする練習として
https://github.com/blumemond10/MyFirstARapp

##BoxAR
単純に直方体を置くアプリ。
簡単なオブジェクト配置、テクスチャの設定について学習しました。
https://github.com/blumemond10/BoxAR

##TextAR
単純に文字を置くアプリ。
簡単なテキスト配置、大きさ、色変更について学習しました。
https://github.com/blumemond10/TextAR

##MultiObject
複数のObjectを設置するアプリ。
上記で実践した、直方体、テキストに加え、球も配置しました。
位置が被るということに直面したので特に奥行きですが、配置の調整の必要性を学びました。
https://github.com/blumemond10/MultiObject

##BoxTouch
上記のBoxARを改造して、Objectをタップするとテクスチャが変わるようにしました。
ここでは、一度のタップで色がかわるのですが、ちょっと応用で「タップしている間色が変わる」「再タップで色が戻る」などの実験もこれからしてみたいな、と思ってます。
https://github.com/blumemond10/BoxARTouch
APIとWEB APIの違い

ほぼ同義で扱われることが多いですが、厳密には違うようなので整理するために記事にしました。

#APIとは？

- **A**pplication **P**rogramming **I**nterfaceの略で、何かしらのサービス提供者が、そのサービスを利用するために提供するインタフェースのこと。

- API提供者が公開している情報や機能を使うことで、同じ機能を持ったサービスを効率よく開発することができる。

- API利用者が用いるプログラミング言語と同じ言語で提供されることが多い。

- APIの例
    - WindowsAPI：Windowsの機能を使う。**`(Web上で動作するものではない)`**



#WEB APIとは？

- API提供者とAPI利用者とのやりとりを**`HTTP／HTTPSベースで(つまりWebベースで)`**実現するAPIのこと。

- 異なるプログラミング言語で開発されたアプリケーション間を連携させることが可能。

- WEB APIの例
    - SOAP：**S**imple **O**bject **A**ccess **P**rotocolの略で、XML形式で表現された「SOAPメッセージ」を用いて情報交換をする仕組みのこと。仕様が複雑なこともあって最近は利用が減ってきている。
    - REST：**R****E**presentational **S**tate **T**ransferの略で、システムの設計原則を集めたもの。RESTの考え方に従って実装されたAPIを、特にRESTful API(またはREST API)と呼ぶ。データの形式がXMLだけでなくJSONのような軽量なデータも利用できることから、SOAPに代わり現在の主流になっている。
    




参考サイト:https://techtarget.itmedia.co.jp/tt/news/1806/13/news01.html
参考サイト:https://www.geekly.co.jp/column/cat-technology/1903_033/
WEBサイトで大切な3つのパスの違いについて解説（絶対パス、相対パス、ルートパス）

#どうも7noteです。初心者が混乱しやすい3種類のパスについて違いを解説します。
どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/coding/path/
Ubuntuへopenssh-serverをインストールする

# はじめに
Virtual boxでUbuntu 18.04の仮想マシンを起動後にsshでログインを可能とするために仮想マシンに対してopenssh-serverのインストールを行いました。

# インストール時に発生した問題
openssh-serverのインストールを以下のコマンドで実施。

```
sudo apt install -y openssh-server
```
GitHubにpushしようとしたらハマった話

##この記事を書く理由
自作のrailsアプリケーションを作成中,そろそろgithubに上げるか(2回目)と思ったときにバチバチにハマりました

1回目にgithubにアプリケーションを上げたときはとりあえずできましたが,いまいちコマンドの意味などわかっていなかったので,そこらへんも今回は理解していきたいと思います

自分と同じgit初学者の方の助けになれば幸いです

##GitHubに上げようとするが...
自分の場合はRailsアプリケーションだったので,そのルートディレクトリに移動します
git init コマンドでアプリケーションのルートディレクトリに,「.git」というリポジトリを構成するディレクトリが新たに生成されます.またリポジトリがすでにある場合はリポジトリの初期化が行われます.

```
$ git init
```
続いてプロジェクトのファイルをリポジトリに追加します

```
$ git add -A
```
-Aというオプションは変更があったファイル,新たに作成されたファイル,削除されたファイルすべてをインデックスと呼ばれるコミットするためのファイルを保存する場所に反映します
git addのコマンドの違いについては下記サイトを参考にしてください
https://note.nkmk.me/git-add-u-a-period/

続いてcommitします。commitによってローカルリポジトリに変更を反映します

```
$ git commit -m "Commit message"
```

addとcommitの違いがイマイチわかんないぜーって方は以下のサイトを参考にすると良いと思います

https://kray.jp/blog/git-why-explanation/


次にリポジトリのoriginとしてGitの設定ファイルに追加します。

```
$ git remote add origin git@github.com:ユーザー名/アプリケーション名.git
```
これは簡単にいうとリモートリポジトリの名前をorigin(変数)に設定して,そのurlはgit@git・・・だよー、ってことです
試しにターミナルで下のコマンドを打つと,リモートリポジトリの名前とurlが出るはずです。

originは変数なので名前は実際なんでもいいですが,慣習的にoriginとするようになっています

```
$ git remote -v
```

##エラー内容
$ git remote add origin git@git・・・　を実行すると以下のエラーが起きてしまいました

```
fatal: remote origin already exists.
```
remote orginはすでに存在しているっていわれている

とりあえずググってみたら,このサイトが参考になった

https://qiita.com/hatorijobs/items/1cae1946656ece954c63

どうやらoriginを一度削除して,再度originを登録すればいいらしい

```
$ git remote rm origin
$ git remote add git@github.com:ユーザ名/リポジトリ名.git
```

###結果
はいラストです。
Githubへpushします。これでローカルリポジトリの結果がリモートリポジトリに反映されます

```
$ git push
```
うまくいった
###感想

ハマった原因としてエラーが起こった際に,参考サイトにたどり着く前に情報が誤ったサイトを参考にしてしまったのが原因です.
情報は鵜呑みにせずにしっかりと自分で考える力もつけたいです...!

これまで見てくれてありがとうございました。もしここ間違ってるよー,ってとこがあったらご享受お願いします!
おれはWSL1をやめるぞ！Linuxのカーネルでなァーーーーーッ！！

## 嘘概要

なぁお前ら・・・WSLでモダン開発ってのは限界があるなあ
おれが短い人生で学んだことは・・・・・・・・・・・・
人間は策を弄すれば弄するほど予期せぬ事態で策がくずされるってことだ！
・・・・・・・・・・・・
Winカーネルから脱するものにならなければなぁ・・・

、、、、、、、、
おれはWSL1をやめるぞ！

おれはWinカーネルから脱出するッ！
Linuxのカーネルでだァーーーーーッ！！


## 概要

Windows 10 バージョン 2004から、Windows SubSystem for Linuxのバージョン2（以下：WSL2）が利用できるようになりました。
これは、常用しているWSL1環境からWSL2への移行の仕方を書いた記事です。
ウェーーイ！WSL2！ウェーイ！と移行したら、少し痛い目を食らったので、留意点も含まれています。

## 最初に（留意点）

Windows10のアップデートも含めると1日溶けるので、暇な時・帰宅時に仕掛けて帰るなど、使わないときに行った方が幸せです:relaxed:
WSL1からWSL2への変換は、**すごく**時間がかかります。僕の場合は、４時間かかりました:scream:
マシンも激重になるので、並行してやろうとしないでください。

**お　兄　さ　ん　と　の　約　束　だ　ぞ　**

## WSL1とWSL2の違い

**「この章、たいしたこと言ってないんで、飛ばしちゃって平気です。
このキモオタ何言ってんだって感じの内容なんで。」**

従来のWindows SubSystem for Linuxのバージョン１（以下：WSL1）との違いは、本物のLinuxカーネルをHyper-V仮想マシン上で動作させる点があります。

ものすごく簡単に言ってしまうと、WSL2用のLinux仮想マシンを作って動かしているわけですね。
Virtual Boxと変わらない思った人もいると思いますが、導入のハードルがWSL2の方が楽です。（そもそも、インストール不要だし）
ついでに言うと、パフォーマンスもWSL2の方が上です。
参考：[VirtualBox他のベンチマークテスト](https://qiita.com/orikaito/items/6a3af80f5332d5e8a424#%E3%83%99%E3%83%B3%E3%83%81%E3%83%9E%E3%83%BC%E3%82%AF%E7%B5%90%E6%9E%9C)

なぜ、パフォーマンスが上なのか。
それについては、「Hyper-V Virtualbox 比較」や「Docker Virtualbox 違い」で、ググってみてください。

## Windows 10のアップデート

WSL2を使うなら、Windows 10 バージョン2004以降にアップデートしないといけません。（Homeでも大丈夫です。）
お使いのWindows 10 が、バージョン2004以降か確認するには、コマンドプロンプトないしファイル名を指定して実行(Winキー+R)で、`winver`と、入力してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83578/c4ad9fcb-3bf3-a156-ec70-343eae1d17be.png)


出てきたバージョン情報に、バージョン2004 (OSビルド 19041.264)かそれ以上の数字が書いてあれば、アップデートの必要はありません。

そうでない場合は、Windows Updateまたは[メディア作成ツール](https://www.microsoft.com/ja-jp/software-download/windows10)を用いて、アップデートしてください。

## 仮想マシンプラットフォームの有効化

Windows 10のアップデートが終わった後は、WSL2の仮想マシンを動かすために必要な「仮想マシンプラットフォーム」を有効化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83578/a0d7c294-99b6-e63e-379e-456b4f2e42bd.png)

上記の操作は、以下のコマンドでも同じことができます。
**（管理者としてPowerShellを開くこと）**

```powershell:仮想マシンプラットフォームを有効にする
> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```
有効化したあと、PCを再起動します。

## Linuxカーネルのインストール

Windows Insider Programで、WSL2を先行して利用してない場合、WSL2用のLinuxカーネルをインストールする必要があります。
以下のページからインストーラーをダウンロードして、カーネルをインストールしてください。
https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel

## WSL1からWSL2への変換

ようやく、WSL1の環境をWSL2に変換していきます。
作業としては、変換したいディストリビューション名を確認から行います。

```powershell:ディストリビューションの確認
> wsl --list
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu-18.04 (既定)
```

```powershell:wslの変換
> wsl --set-version Ubuntu-18.04 2
変換中です。この処理には数分かかることがあります...
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
```

WSL1のファイルを、全てWSL2の仮想ハードディスクにコピーするので、使い込んでいると、数分どころではない時間がかかります。

## WSLのバージョン確認
変換が完了したら、確認しましょう。

```powershell:wslのバージョン確認
> wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu-18.04           Running         2
```
目的のVERSIONが'2'になっていれば、変換完了です。

## 参考

- https://docs.microsoft.com/ja-jp/windows/wsl/install-win10
- https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel
- https://qiita.com/nanaki11/items/a12a76c00e210ac45b98#windows-powershell%E3%81%A7%E6%9B%B4%E6%96%B0
glueでmysqlのintカラムがnullになる

#glueで出力されないカラムがある
glueの使い方等については触れないので、別途ご確認ください。

##現象
AWSコンソールからglueのjobを作成する際にマッピングなどは自動で作成されるので超便利なのですが、int型のカラムをそのままにして出力すると、athenaなどで出力結果を確認するとカラムのデータが空だったりします。

##対策
1. 自動で作成されるApplyMappingを削除して、最後の出力をglueparquetにする。
【入門】AndroidStudio HelloWorldが表示される流れ

#はじめに
Android Studioで、動作確認ができたあとなにを勉強すればいいのか？といった視点で投稿してみます。具体的にはHelloWorldをエミュレータ上に表示したあと、どういった流れで表示されるかを確認します。また、開発を行う上でよく使われるファイルを挙げて簡単に説明してみたいと思います。

#環境と前提条件
- windows10(64bit)
- Android Studio 3.6.3（日本語化済み）
- API 29(Android 10.0)
- はじめの動作確認（HelloWorldの確認）ができている

はじめの動作確認は[Android Studio Hello Worldをエミュレータ上に表示させる](https://qiita.com/kepin/items/adff8d99767d50be892c)
を参考にしてみてください。

#プロジェクトの中身を確認する
作成したプロジェクトをAndroidStudioで開き、左側のタブ「1.プロジェクト」を開きます。ここで、「1.プロジェクト」の右隣のフィルタが「Android」になっていることを確認します。
次に、下図のように5つほどファイルを開きます。
これらが、Android Studioをいじるにあたり主に作業するファイルになってくると思います。
![2020-07-13 (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645318/d15e5388-7340-f67f-271a-84b0373a5f97.png)

#各ファイルの中身を確認する
ひとつずつ見ていきます。

はじめに、MainActivity.javaです。
プロジェクト作成と同時に作成され、自動で一部ソースコードが書き込まれています。

ここではonCreate()に注目してみます。
これはアプリケーションを起動したときに実行されるメソッドになります。
setContentView()は後述するtextViewなどを画面に表示するために必要なメソッドになります。onCreate()内に実装されているということは起動と同時に表示するということになります。

他にも、onStop()やonDestroy()といったメソッドが存在します。
これらのメソッドはライフサイクルと呼ばれ、Android開発を行う上で重要なポイントとなってきます。
が、調べると色々出てくるのでここでは割愛します。
![2020-07-13 (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645318/d15e5388-7340-f67f-271a-84b0373a5f97.png)

<br>
次に、activity_main.xmlです。
こちらもプロジェクト作成と同時に作成され、自動で一部ソースコードが書き込まれます。

左のソースコードと右の画面レイアウトはリンクしており、コードを変更するなり、画面部品を移動するなりして操作します。
ちなみに、右上の「属性」付近にある3種のボタンでソースコードとレイアウトの画面切り替えを行うことができます。

ここではTextView(9~16行目)に注目してみます。
ここのコードが画面レイアウトの「HelloWorld」とリンクしています。
文字の大きさや配置などを記載していくのですが、注目すべきは12行目のtext=の部分です。
HelloWorldと記載されています。ここで画面に表示する文字列をセットしているというわけです。
HelloWorldが勝手に表示される仕組みはここにありました！
![2020-07-13 (15).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645318/1076ed99-8786-c494-b285-17f8e5fafc31.png)

<br>
次に、strings.xmlです。
今回注目すべきポイントはありませんが、これもよく使うファイルになります。
上記ではHelloWorldを直打ちしてtextに代入していましたが、textに定数をセットしてstrings.xmlにてその定数に対応した文字列を指定することができます。
言葉のみでは伝えにくいので、これらも機会があれば投稿してみようと思います。
![2020-07-13 (16).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645318/4d8f3020-0025-04bb-7e3d-e7d31084237d.png)

<br>
次に、AndroidManifest.xmlです。
今回注目するポイントはありませんが、これも重要なファイルになります。
エラーが解決できない、、、というときはここに問題がある可能性があります。
こちらも詳しくは説明しません（できません汗）が、頭の片隅に入れておくと良いと思います。
![2020-07-13 (17).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645318/e4a10f42-82cf-cf46-f9a6-e6c9b9659696.png)

<br>
最後に、build.gradle(:app)です。
今回注目するポイントはありませんが、これも重要なファイルになります。
APIのversionなどか記載されており、例えばビルドが通らなかったり、インストールできなかったりする場合はこのファイルの設定をいじることになると思います。versionによって使えるメソッドが変わってきたりもします。
![2020-07-13 (18).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645318/0fac178e-da9c-de54-e192-7a88faf6038f.png)


#さいごに
HelloWorldをエミュレータ上に表示したあと、どういった流れで表示されるかを確認しました。
開発を行う上でよく使われるファイルを挙げてみました。
最後までありがとうございました。なにか間違いなどあればコメントいただければと思います。

#参考にしたサイト
文字列を','で区切る方法について

# はじめに
[計測器をPC制御する際](https://qiita.com/Yuziii/items/8e0437b33555647b0fc4)、測定値を取得した場合、返り値の多くは ```','``` で区切られた文字列になる。
その文字列を区切る方法を考えてみる。
なお、想定する返り値は以下で考えてみよう。

```result = '3.14E-3, -128.96'```

ちなみにこれは、ロックインアンプの測定値を返したものになる。

#スライスを使う
```python
R = result[0:7]
Th = result[9:16]
print('R:{}, Th:{}'.format(R, Th))
# R:3.14E-3, Th:-128.96
```

スライスで文字列を分解し、出力すると可能。
ただこのとき、計測器によっては誤動作？により返り値にスペースが入っていたりする。
そんな時、プログラムは止まってしまう。
健気なPCである
※ スライスについて→[こちら](https://qiita.com/Yuziii/items/3a14615a444ba1ce70e8)

#split()関数を使う
```python
result_list = result.split(',')
R = result_list[0]
Th = result_list[1]
print('R:{}, Th:{}'.format(R, Th))
# R:3.14E-3, Th:-128.96
```

```'   3.14E-3, -128.96'```のような返り値に対しても、これならカンマでちゃんと区切ってくれる。

#最後に
今回は、計測器によく見られる返り値の処理の方法について書いてみた。
正直どちらの方法でもOKで、好みによると思う。
ただ、ときどき誤動作を起こしてスペースキーが入ってしまうことや、計測器特有のヘッダーがついてたりするため、使い分け、または合体させて使うなど、柔軟な対応が必要だと思う。
開発作業の沿ったGitコマンドの使い方

# 概要

個々のGitコマンドについての説明記事は多数存在するが、開発作業で利用するコマンドが整理されている記事はあまり見つからなかった。
開発作業は多種多様なためどのケースにも当てはまるものではないが、Gitのリモートリポジトリから資材を取得してからプルリクエストを出すまでの手順を参考として作成。

# 本文
## １．開発着手時
**リモートリポジトリをコピーし、作業用ブランチを作成する。**

①開発対象のリポジトリの内容をローカルコピー（ローカルリポジトリの作成）

```
get clone xxxx(クローンURL)
```

②開発のマージ先ブランチに切り替え（デフォルトブランチがマージ先ブランチになっていない場合）

```
git checkout feature/develop
```

③マージ先ブランチの最新資材を取得

```
git pull
```

④作業用ブランチの作成

```
git checkout -b feature/xxxxx
```

## ２．開発中
**修正した資材をコミットし、リモートリポジトリにpushする。**

①修正資材の確認

```
git status
```

②修正資材をコミット対象に追加

```  
git add (git statusで確認した資材のパス)
```

※以下コマンドを使用すると修正資材すべてがコミット対象に追加される。便利だが不要な資材までコミット対象に入ってしまないよう注意。

```  
git add .
```

誤った資材をaddしてしまった場合、以下のコマンドで取消し。

```
git reset HEAD
```

④修正ソースのコミット

```　
git commit -m '（コミットコメント）'
```

⑤ローカルリポジトリのコミット内容をリモートリポジトリへpush

```
git push origin  feature/xxxxx
```

## ３．開発完了、プルリクエスト提出

**マージ先ブランチの修正をマージし、競合を解消させてからプルリクエストを提出する。**

①マージ先へ切り替え

```
git checkout feature/develop
```

②マージ先ブランチの最新資材をローカルリポジトリに取得

```
git pull
```

③マージ元（開発中ブランチ）へ切り替え

```
git checkout  feature/xxxxx
```

④ローカルリポジトリでマージ先ブランチの最新資材をマージ

```
git merge feature/develop
```

⑤競合が発生した場合は競合を解消（※解消手順は別途作成）


⑥マージ結果をリモートリポジトリにpush

```
git push origin feature/xxxxx
```

⑦プルリクエストを作成

## ４．その他

・ローカルリポジトリの修正を破棄して、リモートリポジトリの内容に戻したい。

```
git fetch origin
git reset --hard origin/HEAD
```
flutterでパスを通したあとにwhich flutterしても何も返ってこない

公式をみながらMacでflutterを導入していたが、bash_profileにパスを確かに通しても

```
$ which flutter
```

で何も返してこない。
(このとき、not foundだったり、何らかのエラーメッセージすら返してこないので、なんかおかしいと思いつつも、「エラーじゃないのかな？」とか勝手に勘違いしていた)

### パスの通し方が違った

まあそのまんまなのですが、パスの記述法が自分が思っていたのと違ってたってオチでした。
.bash_profileには

```
export PATH="$PATH:~/ユーザー名/ファイル名/flutter/bin"
```

とかいていたけど、正しくは

```
export PATH="$PATH:/Users/ユーザー名/ファイル名/flutter/bin"
```

だった。

#### 参考リンク

- [macOS install  - Flutter](https://flutter.dev/docs/get-started/install/macos)
- [dart - Flutter command not found - Stack Overflow](https://stackoverflow.com/questions/50652071/flutter-command-not-found)
Excel VBA 第8回 UsedRange、SpecialCells(xlLastCell)の不思議な動作 

#はじめに
UsedRangeは、使用済みセルの範囲を取得することができます。
私は、セルのループ処理を実施する場合、UsedRangeを多用します。
というのも、ループ処理において、プログラミングのミスで無限ループに入ってしまうことを恐れ、ループ処理をする場合、UsedRangeで、その範囲だけループすることが多いです。

今回は、UsedRangeの動作で、初めて気づいた個人的には不思議な内容について、まとめます（紹介したいわけではなく、あくまで自分への備忘です）。
同じことが、SpecialCells(xlLastCell)でも発生するようです。

#今回実施する内容
最終行や最終列まで罫線を引く場合、UsedRangeの範囲が最終行や最終列にならないことがあります。
そういったケースで分かった内容をまとめます。

#ソースコード(Git Hub)

#環境
OS:Windows 10 JP
Excel: Excel 2019 (64bit)

#参考
[UsedRange プロパティ (Excel)](https://docs.microsoft.com/ja-jp/office/vba/api/excel.worksheet.usedrange)
MicrosoftのOffice VBA リファレンスのUsedRangeの説明です。


#用語
なし

#UsedRangeの動作について
##UsedRangeの説明
参考に記載した、UsedRangeの説明をみると、以下の通りです。

> 指定したワークシートの使用されている範囲を表す**range** オブジェクトを返します。 読み取り専用です。

##UsedRangeを使ってみる
「使用されている範囲」というのがあいまいですが、この範囲は、Excelの上下や左右のスクロールバーの大きさにもでてきますし、それなりになじみがあるかと思います。
また、色々なサイトでもUsedRangeは紹介されていますので、その点でも「使用されている範囲」は、想像可能と思いますが、ちょっとだけ紹介します。

１. セルに値が入っている場合

![UsedRangeの範囲.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405480/b4a4a007-d67c-3d7d-5980-e17e1d7ad4e4.jpeg)

セルに値が入っている場合、図のように、値の入っている先頭のセルと値の入っている最後のセルを囲った範囲がUsedRangeの範囲となります。

図では、C4セルとE8セル以外は何も使っていませんが、この長方形がUsedRangeの範囲です。
「使用している範囲」であって、「使用しているセル」ではないため、このようになります。

２. セルに書式が設定されている場合

![UsedRangeの範囲2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405480/8b2cd13e-2b30-cc0c-d222-909a578cb12b.jpeg)

先ほどの範囲から、C4セル～D10セルに罫線を引くと、「使用している範囲」は、C4セル～E10セルになります。

ここまでは普通の動作であって、期待通りです。

##最終行や最終列で罫線を引くと不思議なことが
３．２の状態から、C列の11行目から最終行(1048576行)まで罫線で囲う場合

![UsedRangeの範囲3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405480/9296ea09-72b7-dfd6-96aa-7c087c64e713.jpeg)

最終行まで罫線を引いているにも関わらず、範囲は、C1セル～E10セルになります。
私が期待していたのは、C4セル~E1048576セルなのです。 
今回の範囲では、以下の通りになります。

- 先頭が使用していないはずの、C1セル～E3セルをUsedRangeの範囲に含みます。
- 最終は、罫線を記載して使用しているはずのC11セル～E1048576セルをUsedRangeの範囲に含みません。

すべての行に罫線を引くと、使用されていない判断する仕様なのでしょうか？

##最終行の罫線を削除すると
４．３の状態から最終行の緯線を消す場合

![UsedRangeの範囲4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405480/c88157dc-dc09-5634-0d3a-fdf5152831f7.jpeg)

C1セル～E1048576セルの範囲がUsedRangeの範囲になります。
これはまだ想像可能なと思います。一度使用したセルはその値を変えても使用していないセルはならず、UsedRangeの範囲は変わらないため想定通りです。

##罫線を途中から引いたら
５．２の状態から、C列の15行目から最終行（1048576行）まで罫線で囲う場合

![UsedRangeの範囲5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405480/7c409dea-0282-a09f-defb-015c004d432f.jpeg)

C1セル～E14セルの範囲がUsedRangeの範囲になります。
15行目～1048576行は罫線が記載されてますがUsedRangeの範囲なりません。
最終行まで罫線を引くと引いていなかったと判断する不思議です。

##列方向は？
列方向も行方向と同じ動作になりました。
方向性は同じということですね。

##SpecialCells(xlLastCell)の動作は？
SpecialCells(xlLastCell)は、最終セルを取得することができます。
今回１～５の動作でUsedRangeの最後のセルになりました。
これも方向性は同じということですね。

#おわりに

今回見つけたこの動作は、試しにExcel 2016 (32bit)版でも同様でした。
今まで気づきませんでしたが、これって既知なのでしょうか？
それともScript作成方法に誤りがあったのでしょうか？
わかりませんが、いずれにせよ、気を付けないといけないなと思いました。
Rails6:ActionTextの初期データをseedを使って投入する

# はじめに
Rails6から使えるようになったActionTextを使ってみたのですが、初期データを入れるときにつまずいてしまったので、そのときのことを記事にしようと思いました。

# 前提

Rails:6.0.3.2
使うモデル名:Post 
カラム:title
リッチテキストのフィールド名:content

# seedの投入

まず簡単にpostをいくつか作る

```
15.times do
  Post.create!(title: Faker::Book.unique.title)
end
```

その後に`action_text_rich_texts` テーブルにPostと関連づけるデータを投入することで、ActionTextの初期データを入れることができます。

実際にはこんな感じになるかと思います。

```
Post.all.each do |post|
  ActionText::RichText.create!(record_type: 'Post', record_id: post.id, name: 'content', body: Faker::Lorem.sentence)
end
```

record_typeにはActionTextを使っているモデル名、recor_idはpostのid、nameにはリッチテキストフィールド名、bodyには実際にいれたい文面をいれるように設定してください。

最後に投入して完成です。

```
rails db:seed
```

これでview側に表示できるようにすれば投入したデータが表示されてるかと思います。


# おまけ：ActionTextから投稿したみたいに改行、太文字を設定する

初期データに改行、太文字を入れたい場合は以下のように設定します。

```
content = '<div class="trix-content">
　　<div><strong>ここが太文字</strong>です。<br><br>ここの文章は改行されています</div>
</div>'
rich = ActionText::RichText.last
rich.update(body: content)
```
これでview側を確認すると改行と太文字が入った初期データを用意することができていると思います。

# 余談
画像つきの記事って初期データから用意できるのかな。。
DockerCompose で Gatsby環境構築

## やりたいこと

Gatsbyの環境を作りたい
Dockerで...!

## 作り方

環境

Mac
Docker for Mac

1. 作業フォルダに`docker-compose.yml`と`Dockerfile`を作成します

2. Dockerfileの中身を下記のようにします

```Dockerfile:title=Dockerfile
FROM node:12.14.1

WORKDIR /home/node/app
RUN npm install -g gatsby-cli
EXPOSE 8000
```

nodeのLTSのイメージを使って、gatsby cliをインストールしているだけです
alpine使ってないのは私がコマンドをまだ理解できていないからです...
EXPOSEはコンテナのポートを公開しているだけなので、このままではアクセスはできませんが
次で解決するので進めます



3.　docker-compose.ymlを下記のようにします

```yml:title=docker-compose.yml
version: "3.7"
services:
  gatsby:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: gatsby
    ports:
      - "8000:8000"
    volumes:
      - .:/home/node/app
    environment:
      - NODE_ENV=development
    stdin_open: true

```

解説としては

```yml
build:
      context: .
      dockerfile: Dockerfile
```

カレントディレクトリのDockerfileをビルドします

`container_name: gatsby`
コンテナ名をgatsbyにします

```yml
ports:
      - "8000:8000"
```
上記で、ホスト(Mac)とゲスト(docker)のポートをマッピング(関連付け)しています

```yml
volumes:
      - .:/home/node/app
```

>volumes - volume（データの永続化領域）の定義
>volume とは、コンテナのライフサイクルが終了した後でもデータを保管しておけるデータ領域です。
>ホスト側のディレクトリを volume としてコンテナ内にマウントできる。
>本機能はホストとコンテナ間でファイルを受け渡すときに利用できる。
>参考：[オブジェクトの広場](https://www.ogis-ri.co.jp/otc/hiroba/technical/docker/part4.html "オブジェクトの広場")

`stdin_open`はコンテナの標準入力をオンにします
getsby new 〇〇とかするのでオンにしております


4.　ビルドしましょう！ `docker-composer up -d --build`(ビルドとデーモンでの立ち上げ)
２回目以降は`docker-compose up -d`です

5.　`docker exec -it gatsby bash`でコンテナ内に入れます

6.　コンテナに入ったら、`gatsby new blog(別の名前でも可)`を入力し、gatsbyのサイトを立ち上げます
別のテーマ使う場合は公式参考に
https://www.gatsbyjs.org/docs/themes/

7.　gatsby developでビルドして、localhostを確認して、表示されていれば成功

お疲れさまでした

なお、おそすぎて使い物にならなかった...
→alpineにしました
https://blog.collapse-natsu.com/post/createEnvForGatsbyWithDocker
IntelliJのプラグインを試作してみた。

# 対象者
IntelliJのプラグインを作ったことない人
コンテキストメニューに機能を追加したい人

# 使ったもの
- IntelliJ Ultimate
- Java 11.0.7
- Gradle 5

# 手順
## プロジェクト作成
![HashConverter – build.gradle (HashConverter) IntelliJ IDEA 2020_07_13 21_06_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202825/7a8a0d2c-5579-4e00-f748-847d28770587.png)

![HashConverter – build.gradle (HashConverter) IntelliJ IDEA 2020_07_13 21_06_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202825/2265ed90-77d9-27f7-252d-0bc7a8069187.png)

作成が完了するとBuildが開始される。
![HogePlugin – build.gradle (HogePlugin) IntelliJ IDEA 2020_07_13 21_07_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202825/9a37be88-9b58-0a55-f06d-853b613ebc21.png)

## Action編集
srcディレクトリを選択、「New → Plugin Devkit → Action」を選択
![HogePlugin – TestAction.java [HogePlugin.main] IntelliJ IDEA 2020_07_13 22_51_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202825/5a2bfa01-359a-5b40-32ba-5e47faa07c31.png)

ActionID/ClassNameを入れて、EditorPopupMenuを選択
![HogePlugin IntelliJ IDEA 2020_07_13 22_46_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202825/b766a7d3-f359-e4cd-bbb1-cf816447dbe1.png)

Javaファイルが作成、plugin.xmlが編集される
![HogePlugin IntelliJ IDEA 2020_07_13 22_46_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202825/953a70b5-bd6f-6f13-2e20-799b41821e99.png)

Javaファイルに、HelloWorldを入力。
![HogePlugin – TestAction.java [HogePlugin.main] IntelliJ IDEA 2020_07_13 22_55_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202825/17aa8440-a466-916d-74aa-2a99cc3c04c4.png)

## Build/実行
Build/実行のための設定
![HogePlugin – TestAction.java [HogePlugin.main] IntelliJ IDEA 2020_07_13 22_56_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202825/a2c1e4bd-df62-9e96-c8d1-7ac96860e0fb.png)

Build/実行すると、別にIntelliJが起動する。
![SampleProject [C__Users_Naoyuki_IdeaProjects_SampleProject] - IntelliJ IDEA 2020_07_13 22_47_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202825/20cce7b2-f15d-c23d-bd93-3113eafdd5b0.png)

任意のファイルを開き、コンテキストメニューを確認すると「Test」が表示されていることが確認できた。
![SampleProject [C__Users_Naoyuki_IdeaProjects_SampleProject] - IntelliJ IDEA 2020_07_13 22_48_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202825/cc815b26-c446-6005-d0ac-fcb9b82c670b.png)

「Test」を選択すると、開発に使っているIntelliJ側で「HelloWorld」が出力された。
![HogePlugin – TestAction.java [HogePlugin.main] IntelliJ IDEA 2020_07_13 22_48_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202825/0527507d-3535-8960-863a-88508a1ca993.png)
ubuntu18.04.3にROSをインストールする

ubuntu18.04.3にROS melodicをインストールする。
これで検索すると、諸先輩方のインストール手順を拝見できるが、ubuntu18.04もROS melodicもリリースされてから結構時間が経っているせいか、ubuntuのバージョンの微妙な違いによっても手順が異なるようなので、自分用にまとめておく。
PCもJetson NanoもXavier NXも同じ手順で大丈夫でした。Jetson Nanoにubuntu 18.04をインストールして立ち上げる手順は[こちら](https://qiita.com/ezokitsune/items/0d9060b2376dc4d57820)

ROSを入れる前に、今後のubuntuのアップデートタイミングは自分で決めたいので、自動アップデートを停止して再起動。

```cmd:terminal
$ sudo dpkg-reconfigure -plow unattended-upgrades
$ sudo shutdown -r now
```

アップデート

```cmd:terminal
$ sudo apt update
$ sudp apt upgrade
```

aptへROSのダウンロード先の登録

```cmd:端末
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
```

公開鍵の取得

```cmd:端末
$ sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
```

一応アップデートとアップグレード

```cmd:端末
$ sudo apt update
$ sudo apt upgrade
```
ROSのインストール

```cmd:端末
$ sudo apt install ros-melodic-desktop-full
（ここは結構時間がかかる）
```

rosdepのインストール

```cmd:端末
$ sudo apt install python-rosdep
```

ROSの初期設定

```cmd:端末
$ sudo rosdep init
一瞬で終わる。updateするように表示されるので言われるがまま
$ rosdep update
```

環境変数の設定

```cmd:端末
$ cd ~
$ echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
$ source ~/.bashrc
```

ROSパッケージインストーラのインストール

```cmd:端末
$ sudo apt install python-rosinstall python-catkin-tools python-rosdep
```

ROSのビルドシステムはcatkinなので、そのワークスペースを作る

```cmd:端末
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/
$ catkin init
```

ビルドテスト

```cmd:端末
$ catkin build
何やら動く

$ source devel/setup.bash
$ echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
```

ROSの動作確認

```cmd:ターミナル1
$ roscore
```

```cmd:ターミナル2
$ rosrun turtlesim turtlesim_node
青色背景に亀の絵が出る
```

```cmd:ターミナル3
$ rosrun turtlesim turtle_teleop_key
ターミナル３のウィンドウを選択した状態で矢印キーを押すと亀が動く
```

```cmd:ターミナル4
$ rosrun rqt_graph rqt_graph
/teleop_turtleノードから/turtlesimノードへ/turtle1/cmd_vrlトピックが渡されているグラフが描かれる
```

```cmd:ターミナル5
$ rqt
メニューバーから、Plugins→Topics→Topic Monitrを選んで、/turtle1/cmd_velにチェック、ターミナル3で矢印キーで亀を動かす都度、値が変化するのが見える。左右キーでの旋回はangularのZで右-2、左2という値。動かしながらそのほかの値を見てみる。
```
PHPickerViewControllerを使ってみた

# はじめに
PHPickerViewControllerはUIImagePickerControllerのカメラ以外の機能に複数選択など新機能が追加されました。
そのPHPickerViewControllerを使ったサンプルコードを作ってみました。
Xcode12 beta2で作成しています。
[サンプルコードはgithub](https://github.com/FromF/PHPPickerSwiftUI)で公開しています。

# コードの解説
## 呼び出し

```swift
    func makeUIViewController(context: Context) -> some UIViewController {
        var configuration = PHPickerConfiguration()
        // 静止画を選択
        configuration.filter = .images
        // 複数選択可能（上限枚数なし）
        configuration.selectionLimit = 0
        let picker = PHPickerViewController(configuration: configuration)
        picker.delegate = context.coordinator
        return picker
    }
```

`filter`で選択できる画像形式を指定できます。複数選択もできるうようです。
`selectionLimit`で複数選択する時の上限を指定できます。0の場合は上限なく複数選択できます。

## delegate

```swift
        func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
            
            // Pickerを閉じる
            parent.picker.toggle()
            
            for result in results {
                if result.itemProvider.canLoadObject(ofClass: UIImage.self) {
                    result.itemProvider.loadObject(ofClass: UIImage.self) { (image, error) in
                        
                        if let image = image as? UIImage {
                            // 選択された画像を追加する
                            self.parent.images.append(image)
                        } else {
                            print("Error(1)")
                        }
                        
                    }
                } else {
                    print("Error(2)")
                }
            }
        }
```

画像を選択後Addを押すとdelegateが呼ばれます。
UIImageに変換し、クロージャーが呼ばれます。シュミレーターで選択した一部の画像はUIImageに変換できないことがありました。
これは、まだBetaなので今後正式リリースに向けて改善されるのだと期待しています。
人工知能（AI）

##人工知能（AI）
####人工知能（AI）とは
現在、私たちが生活するうえで人工知能は身近な物となってきました。
よくニュースなどで目にするのは「自動運転」、「AIロボット」などでしょうか？
数年前には囲碁にて人工知能がプロ棋士に勝利したという話題がありました。

では人工知能とはいったいどの様な物の事を指すのでしょうか？
実は人工知能の定義は専門家の間でもまだ定まっておりません。
一般的には人工的につくられた知能とされます。
または、まるで人間のような振舞いを模範するシステムとされることもあります。

####機械学習とは
機械学習とは、人工知能が学習をする方法の一つです。
「大量のデータから特性や規則、関連性を分析し、高い精度で予測・分析を行う機能」を自動的に学習を行うシステムの事です。
ただし、特性などの特徴に関しては予め指定しなければなりません。
例）画像認識、将棋AIなど

####深層学習（ディープラーニング）とは
機械学習の一分野です。
人間の脳神経回路をモデルとした多層構造アルゴリズム「ディープニューラルネットワーク」を用い、特徴量の設定や組み合わせをAI（人工知能）が自ら考え判断を行います。
つまり、深層学習では特徴や規則等を大量のデータを用いる事で自ら分析、判断を行い分類や予測をする事が可能となります。

##機械学習
####教師あり学習
大量に用意したデータに対し、「データ」と「問題の正解」のセットが予め与え、それを元に学習する仕組みの事です。
回帰：「数値」を予測※連続値、規則性をもとに予測
分類：「カテゴリ」を予測※予め決めたカテゴリに分ける
####教師なし学習
教師あり学習とは異なり、正解を必要としない学習方法です。
原理原則、特性等の構造を理解してデータの予測します。
クラスタリング：過去からの傾向から見て予測
次元削減：ある程度入力の変数を減らす
####強化学習
与えられた問題に対し、AIが人間のように試行錯誤を行い、問題を解決する仕組みです。

##ライブラリ関連
必須とは言わないまでも、かなり重要なライブラリを3点記載致します。

###Numpy
NumpyとはPython用の計算ライブラリ
**①array**
多次元配列を扱う
**②where**
指定した条件を満たす配列(ndarray)の要素番号を抽出する
**③append**
配列の末尾に新しい配列を生成できる
**④arrange**
範囲を指定して配列を生成したい時は、「numpy.arrage」を使用。
また、numpy.arrange(a, b)メソッドではa以上b未満の配列を生成することも可能
**⑤shape**
ndarrayで生成した多次元配列や行列の、各次元の要素数を表示
**⑥reshape**
生成した配列をnumpy.reshape(m, n)メソッドを使用すればm×n(行数m、列数n)の、配列の次元を変更することができる

###Pandas
PandasとはPython用の分析ライブラリ
データの読み込みや統計量の表示、グラフ化等のデータ分析が容易になる
**①head**
先頭5行を表形式で表示
**②shape**
行、列数を表示
**③info**
詳細情報を表示
**④describe**
統計量を表示
countは件数、meanは平均値、stdは標準偏差、minは最小値、25%・50%・75%は四分位点、maxは最大値 
**⑤hist**
ヒストグラムを表示。散布図や某グラムなどのグラフも描写可能
**⑥astype**
データ型を変更

###Matplotlib
MatplotlibとはPython用の描画ライブラリ
線や棒、3Dグラフを描画することが可能
グラフを描写する際はplot関数を使用
**①折れ線グラフ**

**②散布図**

**③ヒストグラム（棒グラフ）**

**④円グラフ**


##参照
https://ainow.ai/artificial-intelligence-3/#1_AI
https://techacademy.jp/magazine/17697
  https://techacademy.jp/magazine/17472