OmniAICreator/Qiita-1.07M huggingface dataset:
Windows フォーム 雑感

夕べ、優吾ちゃんにWindows FormじゃなくてWindows FormsっていわれてVisualStudio2015で確認したら、こいつのテンブレードは、Windows フォームだった。念のため、2019 revも見たらこっちも日本語はフォームだった

ふーん…

でも、.net FWのネームスペースは、System.Windows.Forms
Docsも含めて、カタカナはフォーム、英語はForms
カタカナ表記は基本は単数形という一時期の文科省の指示に従っているのでしょう

ここまでは、枕で

WindowsFormsが良くないのがDataSetと組み合わせて使うのが便利なんだけど、これだとデータベースのスキーマとUIがべったりと依存しちゃうんだよねぇ

DIも使いづらい

改めて触ったら、確かに、コリャ駄目だ感の百貨店だぁ
A-FRAME: 物理演算でボーリングっぽい動きを実現してみる８（ピンの物理的形状の中心）

A-Frameをつかって物理演算ができるようにしてみます。
A-Frame側の設定で、ピンの物理的形状とレンダリングされる形状の中心ずれを調整できるか検証します。

### 例１）複合シェイプのcylinderを利用してoffsetで位置を調整する
設定しました。
![pin2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/794281b3-7ecd-3f72-06d7-e2ddf3e3537a.gif)[demo](https://k38.github.io/aframe/physics-system/pin_shape_compound_1.html)
位置調整はできました。
ボールを転がしてみましょう。
![pin2-1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/c6e987c3-2443-818b-26da-44948686e58a.gif)[demo](https://k38.github.io/aframe/physics-system/pin_shape_compound_2.html)
物理的な形状にboxを指定していた時よりも、衝突時に下端の縁でまわるようになり、よりピンらしくなりました。
が、倒れても起き上がってきます。
しぶといですね。

### 例２）エンティティを入れ子にしてローカル座標で位置を調整する
設定しました。
![pin1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/00ca5b9d-43cc-eb52-c386-a5f95978bf83.gif)[demo](https://k38.github.io/aframe/physics-system/pin_model_localpos.html)
こちらの方法でも位置調整はできました。
ボールを転がしてみましょう。
![pin1-1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/b9ce0c14-811e-fd31-91ab-42711d3111d0.gif)[demo](https://k38.github.io/aframe/physics-system/pin_model_localpos_bowl.html)
こちらも、衝突時に下端の縁でまわるようになり、よりピンらしくなりました。
そして倒れたら起き上がってこなくなりました！

## まとめ
ピンの物理的形状とレンダリングされる形状の中心を揃える為に、２つの手法を試しました。
どちらの方法でも中心を揃える事ができましたが、エンティティを入れ子にする方法だとピンが倒れたままになりました。

普通のシェイプのcylinderと複合シェイプのcylinderで何かが違うようですが、今のところ違いの理由の見当はついていません。
ボーリングっぽい動きをするピンを目指すには、エンティティを入れ子にする方法が良さそうです。

今回はじめて複合シェイプを使いましたが、もっと色々できそうなので、どういったものかもう少し見ていきたいと思います。
MVC概念を理解するためのメモ

本投稿は、これからフレームワークを勉強していくにあたって、初心者でも一から勉強していくための覚書として記載する。



## 「MVC」とは何か？

**「<font color="OrangeRed">MVC</font>」** は「**Model**」「**View**」「**Controller**」の頭文字をとった **<font color="OrangeRed">デザインパターン</font>** の一つ。  


- #### デザインパターンとは
1994年に発売されたGoFによる著書 **「オブジェクト指向における再利用のためのデザインパターン」** で広く認知されるようになった概念。開発を行う上で、**「再利用性」** の高いプログラミングを行うための指針とも言える。  
問題が発生した際の解決策は、1994年までは体系化されておらず、開発に時間がかかったり、問題解決に難航することも多かった。
そこで、**「よく発生する問題とそれに対処する良い設計」** を23パターンに分類し、技術者たちに認知させる事で生産性を向上させた。  
ただし、あくまでも問題解決に対するトレードオフが成立しやすい場合の解決策であり、 **最善の改善策ではない場合もある** 、という事は肝に命じておく必要がある。



- #### 「再利用性を高くする」とはどういう事か
「デザインパターン」という概念の存在しない時代のプログラミングは、全てを一つにまとめてコーディングすることも珍しくなかった為、どの部分でトラブルが発生しているのか、どこに変更を加えるべきなのか等が分かりづらく、時間がかかってしまう事が多かった。  
「再利用性を高くする」とは、多く人間が携わりたくさんのコードが存在する中で、**それぞれの役割をしっかり区分し、** トラブルが起きた際や変更を加える際に **トラブルの特定や使用の変更・追加をしやすくする事で、生産性を高める** ということ。


「MVC」とは、それぞれの役割を、「Model」 「View」 「Controller」に区分した生産性を高める設計のデザインパターンである。



## 「Model」 「View」 「Controller」とは

「MVC」が、役割を区分したデザインパターンである事は分かった。ではどのような役割に区分されているのかを以下にまとめる。

### 「**Model**」
- DB内のデータを操作する(取得・作成・更新・削除)
- DB内のデータを加工する(Model内のデータを組み合わせる、要求されたデータ形式に整形する、等)


### 「**View**」
- ユーザーが閲覧する箇所のコードを生成し、実装を行う
- 主にユーザーはこの「View」を通してアプリケーション等の操作を行う

###「**Controller**」
- 「Model」と「View」の橋渡し的な役割を担う
- 「View」から受けとったユーザーからのリクエストに応じた処理を実行する
- 「Model」へデータの受け渡しを行う
- 「View」を生成する際に、「Model」から受け取ったデータを「View」に渡す
- **直接に描画を行ったり、「Model」の内部データを直接操作したりはしない。**


このように区分することで、例えば、「View」はデザイナーが担当する等、技術者の役割分担が明確化している。プログラミングの面においても「デザインパターン」で学習したように、機能が区分され、機能同士の変更に影響を及ぼしにくいというメリットがある。


## あくまでも基礎概念としての「MVC」

「MVC」のデザインパターンに関する論文は、1988年に初めて公開され、本投稿の最初に紹介したGoFによる書籍「オブジェクト指向における再利用のためのデザインパターン」の中で紹介された。この書籍の販売した年も1994年と非常に古い。

2019年現在においても多く利用される概念の一つではあるものの、多様化する開発においては対応しきれない局面も数多く見られる。現在では発展的なデザインパターンも数多く存在する。  

> ##### 「MVC」の発展形に関する具体例
※今回詳細は省くものの、後学のための学習を推奨
>
  - MVC2
  - MVVC
  - Model2MVC
  - MVP 等

本投稿では、それら発展的なデザインパターンに最初から飛びつくのではなく、それらを理解するための基礎の一つとして把握しておく事を念頭に「MVC」の概念を理解する事を強く推奨する。


### 参考サイト

- [デザインパターン](https://ja.wikipedia.org/wiki/デザインパターン_(ソフトウェア))
- [Model View Controller](https://ja.wikipedia.org/wiki/Model_View_Controller)
- [MVCの本当のメリットは何か？](https://qiita.com/ryouzi/items/5ff3bef12ff07922ccc7)
Amazon Linux 2の仮想マシンをVirtualBoxで作成する時のコマンド

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/amazon-linux-2-virtual-machine.html
https://www.virtualbox.org/manual/ch08.html#vboxmanage-intro

`meta-data`や`user-data`を探り探り設定しながら仮想マシンを作成・削除したので、仮想マシンを作成する作業をコマンドで自動化しました。

# 前提
- VirtualBoxのバージョン: 6.0.14
- `VBoxManage`コマンドにパスが通っている
- Windowsのコマンドプロンプトから実行するバッチ
- NATのポートフォーワーディングによりSSH接続できるようにする（ホスト側のポート番号は任意）

# create_vm.cmdとして以下を保存

```
@echo off
@setlocal enabledelayedexpansion
setlocal

set CURRENT_FOLDER=%~dp0
cd %CURRENT_FOLDER%

set VM_NAME=%1
set VM_LIST_PATH=%2
set SEED_ISO_FILE_PATH=%3
set VM_FILE_PATH=%4

VBoxManage list vms > "%VM_LIST_PATH%"

findstr "%VM_NAME%" "%VM_LIST_PATH%"
if "%ERRORLEVEL%"=="0" (
    echo 仮想マシン「%VM_NAME%」は作成済み
    exit /b 0
)

VBoxManage createvm --name "%VM_NAME%" --register

VBoxManage modifyvm "%VM_NAME%" --ostype Linux26_64 --memory 8192 --vram 128 --cpus 2 --boot1 dvd --boot2 disk --boot3 none --boot4 none --nic1 nat --nictype1 82540EM --cableconnected1 on --natpf1 SSH,tcp,,50022,,22 --nic2 hostonly --hostonlyadapter2 "VirtualBox Host-Only Ethernet Adapter" --nictype2 82540EM --cableconnected2 on

VBoxManage storagectl "%VM_NAME%" --name IDE --add ide --controller PIIX4 --portcount 2 --hostiocache on --bootable on
VBoxManage storageattach "%VM_NAME%" --storagectl IDE --port 0 --device 0 --type dvddrive --medium "%SEED_ISO_FILE_PATH%"

VBoxManage storagectl "%VM_NAME%" --name SATA --add sata --controller IntelAhci --portcount 1 --hostiocache off --bootable on
VBoxManage storageattach "%VM_NAME%" --storagectl SATA --port 0 --device 0 --type hdd --medium "%VM_FILE_PATH%"

endlocal

exit /b 0

```

# 使い方

```
call create_vm.cmd "<仮想マシン名>" "<仮想マシン一覧を出力するファイルパス>" "<seed.isoのパス>" "<Amazon Linux 2 VM イメージのパス>"
```

# ハマったところ

- `storagectl`でIDEの場合は最小ポート個数を2にする必要があったのに対して、SATAの場合は1で良かった。
Railsの基礎の基礎　DB,ActiveRecord,migration ,MVC,HTTP,CRUD

Railsを学ぶ際の基礎に当たるところをここに記載しておきます。
随時更新予定(2019年11月29日)

##DBを操作する言語:SQL
例:Mysql,Sqlite

**CRUD**
Create/Read/Update/Delete

##ActiveRecordとは
Databaseの処理をRubyから簡単に行うための仕組み
SQLをうまく扱うための仕組み　ModelとDBのことをさす(厳密には違う)

例：@contacts = Contanct.all

##migrationとは
DBの変更をテキストで残すことができる
それによりgitで他の人と変更を共有することができる

##MVCとは
Model 
View 
Controller

##実際の流れ
1.controllerが最初にインターネットの通信を判断する役割。どのモデルに処理を依頼するか考える
2.Modelはデータベースからデータをとる、もしくは入れる。そして再びコントローラに戻る。
3.Modelのデータが取れたらそれを表示する。それを表示するViewをコントローラーが考える。

##主なHTTPメソッドとCRUD
**HTTPとは**
Hypertext Transfer Protocolとは、WebブラウザがWebサーバと通信する際に主として使用する通信プロトコルであり、インターネット・プロトコル・スイートのメンバである。

簡単にいうと**ホームページのファイルとかを受け渡しするときに使う約束**

**CRUDは？**
DBとのやりとり

|HTTPメソッド|CRUD|意味|
|:----|---|--:|
|Get |Select|取得する|
|Post|Insert|作成する|
|Put|Update|全更新する|
|Patch|Update|部分更新する|
|Delete|Delete|削除する|
virtualenvを使ったDjango開発仮想環境構築〜新規プロジェクト・新規アプリ作成と初期設定までの手順

# はじめに

まっさらな状態から仮想環境構築〜新規プロジェクト・新規アプリ作成・初期設定までの手順を忘れることがあるので残しておきたいと思います。

**Python3系と仮想環境構築ツールであるvirtualenvがインストール済みであることを前提条件とします。**

著者の環境は以下となります。

- MacOS Mojave 10.14.6
- Python 3.7.5
- Django 2.2

**予め、Djangoの各バージョンで対応しているPythonのバージョンを確認してください。**
https://docs.djangoproject.com/ja/2.2/faq/install/#faq-python-version-support

# virtualenvを使って仮想環境構築

まず任意の場所(デスクトップ)でこれから作成するプロジェクトを入れるフォルダを`mkdir`コマンドで作成。(今回例として名前をsampleprojectとする)
`cd`コマンドで作成したフォルダ内に入る。

```
$ mkdir sampleproject
$ cd sampleproject
```

仮想環境を構築する為、以下のコマンドを実行。
名前は任意で構わないが、分かりやすく`プロジェクト名-env`とした方が良い。

```
$ virtualenv sampleproject-env
```

構築した仮想環境に入るには以下のコマンドを実行。
ターミナルの$マークより前に`(プロジェクト名-env)`と表示されていれば成功。

```
$ . sampleproject-env/bin/activate
# 以下が表示されていれば成功
(sampleproject-env) $
```

# Djangoを仮想環境内にインストール

引き続き、Djangoを仮想環境内にインストールしていく。
今回は例としてDjango 2.2をインストールする。
2つめのコマンドでバージョンが2.2と表示されればインストール成功です。

```
(sampleproject-env) $ pip install django==2.2
(sampleproject-env) $ python -m django --version
```

# 新規プロジェクト作成

新規でプロジェクト作成する際は、`$ django-admin startproject [任意のプロジェクト名] .`コマンドで作成できる。(今回は名前をsampleprojectとする)

```
(sampleproject-env) $ django-admin startproject sampleproject .
```

上記コマンドの最後に.をつけた場合とつけない場合、以下の違いがある。

.をつけた場合は、**余計に1つフォルダを作る手間を省くことができる。**

```
sampleproject(一番最初に作成したフォルダ、コマンド実行場所)/
     └ sampleproject(上記コマンドで作成されたプロジェクト)
```

.をつけない場合は、**コマンドを実行した場所からもう1つフォルダが作成される。**
フォルダ構成が一階層増えるイメージ。
冒頭で紹介したmkdirで新規フォルダ作成せずに直接プロジェクト作成する場合に使う。
フォルダ構成が複雑化して分かりにくいので実際の開発ではあまり推奨しない。

```
sampleproject(一番最初に作成したフォルダ、コマンド実行場所)/
     └ sampleproject/
          └ sampleproject(上記コマンドで作成されたプロジェクト)
```

# 新規アプリ作成

新規アプリを作成する際は、`manage.py`が存在するフォルダから以下のコマンドを実行する。(今回例として名前をsampleとする)

```
(sampleproject-env) $ python3 manage.py startapp sample
```

# 初期設定

sampleproject内のsettings.pyのTEMPLATESの中身を編集。
HTMLファイルが入っている場所を指定する。(HTMLファイルはBASE_DIRの中のtemplatesフォルダに格納される)
設定できたら、`manage.py`が入っているフォルダにtemplatesフォルダを作成。

```python:sampleproject/settings.py
"""省略"""
TEMPLATES = [
    {
        """省略"""
        'DIRS': [BASE_DIR, 'templates'],
        """省略"""
            ],
        },
    },
]
"""省略"""
```


作成したアプリ名を設定する。(アプリ名は今回例として作成したsampleとする)

```python:sampleproject/settings.py
"""省略"""
INSTALLED_APPS = [
    """省略"""
    'sample',
]
"""省略"""
```


`cd`コマンドで作成したアプリのフォルダまで移動。(今回例としてsampleフォルダ)
`touch`コマンドで`urls.py`を新規作成。

```
(sampleproject-env) $ touch urls.py
```

projectフォルダ内のurls.pyに作成したアプリの繋ぎこみを設定する。(今回例としてsampleフォルダ)

```python:sampleproject/urls.py
from django.contrib import admin
# includeメソッドを追加
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    # 何もURLを記述しない場合の挙動はrootページ(home画面)となる
    # つまり、sampleアプリを呼び出す
    path('', include('sample.urls')),
]

```

これで初期設定は完了です。

# 仮想環境から出る

virtualenvで構築した仮想環境から出るには以下のコマンドを実行。

```
(sampleproject-env) $ deactivate
```

仮想環境に再度入る場合は以下を実行。(今回例としてsampleprojectとする)

```
$ . sampleproject-env/bin/activate
# 以下が表示されていれば成功
(sampleproject-env) $
```

# 最後に

AnacondaでDjango開発環境を整えると依存関係の影響やもっと別の問題が起きる可能性を考慮してAnacondaを使った方法を採用しませんでした。
今回、Anacondaをアンインストールしてから環境構築していきました。
Django環境で新規プロジェクト作成するまで苦労しました。
参照にされがちな技術書3選

技術書の中で他の技術書の内容が引用されてることって結構ありますよね。
独断と偏見でこの技術書よく出てくんなーってやつ紹介します。

先に参照されている本の内容を知っていると、理解しやすくなるので、技術書読みはじめたい！って人向けに。

統計とか撮ってるわけではないんであくまで感覚です。

##オブジェクト指向における再利用のためのデザインパターン 増補改訂版Java言語で学ぶデザインパターン入門 ##
![b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496565/4bcf02d9-5294-2f78-619d-14236f3684b9.jpeg)

https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E5%86%8D%E5%88%A9%E7%94%A8%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-%E3%82%A8%E3%83%AA%E3%83%83%E3%82%AF-%E3%82%AC%E3%83%B3%E3%83%9E/dp/4797311126

![a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496565/e359bde0-d96b-d142-d6f0-fccd164cfa0b.jpeg)

https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88Java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80-%E7%B5%90%E5%9F%8E-%E6%B5%A9/dp/4797327030

有名なGoFの23個のデザインパターンってやつです。
「プログラマならこれくらい知ってて当然だろ！」って感じでしれっと出てきます。

普通に知らないと話についていけないです。

GoFのデザインパターンはめちゃくちゃ有名なのでググったらQiitaとかWikipediaとか出てくるしので、そこらへんを読んどくといいでしょう。
Wikipediaも意外と信憑性高い。

##人月の神話##
![51gkchhanKL.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496565/30a47a52-62c3-638d-bdab-5cda5d17677e.jpeg)
https://www.amazon.co.jp/dp/B07QL464C2/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

初版は1975年という有名な古典。
技術書の世界ではブルックスという名前は、日本におけるイチローくらいの有名。

「遅れているソフトウェアプロジェクトへの要員追加は、プロジェクトをさらに遅らせるだけである」というだとか、
「9ヶ月で出産できる妊婦を9人集めても、１ヶ月で出産することはできない」あたりの理論は頻出。

##達人プログラマー 職人から名匠への道 ##
![aaa.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496565/bcfc87ca-1162-0b4e-d2df-ec859d53f3b9.jpeg)
https://www.amazon.co.jp/%E6%96%B0%E8%A3%85%E7%89%88-%E9%81%94%E4%BA%BA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC-%E8%81%B7%E4%BA%BA%E3%81%8B%E3%82%89%E5%90%8D%E5%8C%A0%E3%81%B8%E3%81%AE%E9%81%93-%EF%BC%A1%EF%BD%8E%EF%BD%84%EF%BD%92%EF%BD%85%EF%BD%97%EF%BC%A8%EF%BD%95%EF%BD%8E%EF%BD%94-ebook/dp/B06W567M44/ref=pd_sim_351_2/358-2271541-6482404?_encoding=UTF8&pd_rd_i=B06W567M44&pd_rd_r=2f67b597-d6b9-453e-a68c-c34c730bc0c1&pd_rd_w=iRJrB&pd_rd_wg=DbNAi&pf_rd_p=51d7f721-ab31-4c99-8db8-c3f45803167a&pf_rd_r=4FQDV1YY5DVGNW4CAA28&psc=1&refRID=4FQDV1YY5DVGNW4CAA28

DRY原則はあまりにも有名。
割れ窓理論も結構好き。
私の開発環境 2019年 決定版

この記事は、「みんなのプログラミング作業環境 Advent Calendar 2019」の2日目の記事です。
なんの尾も白身もないタコの開発環境です😇

## ハードウェア

### PC

カテゴリ | 内容
---|---
PC | [Lenovo IdeaPad MIIX 720](https://www.lenovo.com/jp/ja/static/catalog/tablet-2017-miix720_cs_0214)
CPU | i7-7500U @ 2.70GHz 2.90GHz
RAM | 16GB
GPU | Intel(R) HD Graphics 620
※専用スタイラス付き

### 周辺機器

カテゴリ | 内容
---|---
キーボード | [Anker ウルトラスリム Bluetooth ワイヤレスキーボード](https://www.amazon.co.jp/gp/product/B00U25RP38/)（Amazonリンク）
マウス | [ロジクール Bluetbooth M590RU](https://www.amazon.co.jp/gp/product/B072R618HQ/)（Amazonリンク）
外部ディスプレイ | BenQ GW2283（1920x1080）
USB 3.0 Type-C ハブ | [これ](https://www.amazon.co.jp/gp/product/B07K313392/)（名称不明、Amazonリンク）
モニタアーム | [HUANUO PCモニターアーム 耐荷重8kg (モニターアーム)](https://www.amazon.co.jp/gp/product/B07QXQMB6M/)（Amazonリンク）
タブレットスタンド | [KlearLook 卓上 4.7～12.9インチ対応](https://www.amazon.co.jp/gp/product/B0794W33N7/)（Amazonリンク）
スキャナ | ScanSnap S1500M

### デスク

カテゴリ | 内容
---|---
デスク | [昇降式 スタンディングデスク 幅70cm ガス圧 無段階昇降 木目調ブラウン](https://www.amazon.co.jp/gp/product/B07NXCX6WC/)（Amazonリンク）
チェア | [サンワダイレクト カウンターチェア高さ グリーン 150-SNCERG7G](https://www.amazon.co.jp/gp/product/B073DV8HPQ/)（Amazonリンク）

### 音響

カテゴリ | 内容
---|---
有線ヘッドセットマイク | [エレコム HS-EP13TBK](https://www.amazon.co.jp/gp/product/B00RYACK8O/)（Amazonリンク）
高感度マイク | [サンワサプライ MM-MCUSB33](https://www.amazon.co.jp/gp/product/B06XS864ZR/)（Amazonリンク）
無線ヘッドセットマイク | カシムラ BL-72

## ソフトウェア

カテゴリ | 内容
---|---
OS | Windows 10 Home ver. 1909
エディタ | VS Code、サクラエディタ
IDE | PhpStorm EAP、NetBeans IDE 8.1
Gitクライアント | Smart Git、Git for Windows
SVNクライアント | TortoiseSVN
同期式メモ | Evernote プレミアムプラン
ブラウザ | Google Chrome
メーラ | メール（Win10標準）
ToDo管理 | Microsoft To-Do
ターミナル | Git Bash
SSH | Putty
SFTP | WinSCP
diff | WinMerge
Office | Microsoft Office365
ナレッジベース | [Knowledge](https://information-knowledge.support-project.org/ja/)
仮想PC | VirtualBox
仮想PC管理ツール | Vagrant、Docker toolbox

## こだわりポイント

<dt>昇降式スタンディングデスク</dt>
<dd>座りっぱなしによる腰痛・眠気対策として。
もっぱら座って使っている。😇</dd>
<dt>タブレットスタンド</dt>
<dd>開発画面の視線を上げるため。
PCがクラムシェル型でないので、タブレットスタンドで下駄を履かせている。</dd>
<dt>キーボード</dt>
<dd>安いbluetoothキーボードを求めた結果。気合いでUS配列に対処。
左下がFnキーなのだけが許せない。</dd>
<dt>マウス</dt>
<dd>2台ラグ無し切替え可。もともとはPC2台だったが職場の都合で1台になったので力が有り余っている。</dd>
<dt>高感度マイク</dt>
<dd>現在、会社とビデオ会議つなぎっぱ運用をしているので、ハードウェア的にミュートがかけられるように。</dd>
<dt>有線マイク</dt>
<dd>現在、会社とちゃんとビデオ会議するとき、相手側が用意している内臓マイクでは集音性に難があるので、こちらからボリュームを上げるため。
また、bluetoothだととっさの呼びかけにマイク設定を変更する必要があり、急な呼び出しに対応できないため。（急にビデオ会議呼び出すなよ）</dd>
<dt>Knowledge</dt>
<dd>オンプレミスに設置できる簡易Qiita。Githubに対する[gogs](https://gogs.io/)みたいなもの。Dockerでポンと設置できる。VPS上で稼働中。</dd>
</dl>

現在、私が社員としてリモートワークしている関係上、机や椅子に至るまで自分のセンスで選び放題です。
ただし、私物扱いなので自腹なのはお察しください。

ソフトウェアについては、職場の標準ツールがメインです。変わったものを使おうとすると話が通じにくくなったので。😇

## まとめ

自席は私物で出来ている

マウスは私物で、モニタは私物

幾たびの職場を越えて不変

（中略）

ならば我が領収書に意味は不要ず

この自席は、

無限の私物で出来ていた
Pixhawk

#Pixhawk比較

|**Boards　　　　　　　　　　　　　　　　　　　　　　**|Main FMU Processor　　　　　　　　|  Memory　　　　　　　　　　　　　　　              ||
|----------|-----------------------------------------------|----------------------|-------------------|
|**CUAV V5 nano** |STM32F765(32Bit Arm Cortex-M7), 216MHz | 2MB memory 512KB RAM|http://docs.px4.io/master/en/flight_controller/cuav_v5_nano.html| 
|**Pixhawk4**     |STM32F76532(32Bit Arm Cortex-M7), 216MHz | 2MB memory, 512KB RAM|https://docs.px4.io/v1.9.0/en/flight_controller/pixhawk4.html|
|**Pixhawk4 Mini**|STM32F765(32Bit Arm Cortex®-M7), 216MHz | 2MB memory, 512KB RAM|https://docs.px4.io/v1.9.0/en/flight_controller/pixhawk4_mini.html|
|**Pixhawk1**|STM32F427(32Bit  Arm Cortex-M4), 168 MHz | 2MB memory, 256KB RAM|https://docs.px4.io/v1.9.0/en/flight_controller/mro_pixhawk.html|
Amazon Web Services (AWS)サービスの正式名称・略称・読み方まとめ #18 (ロボット工学)

Amazon Web Services (AWS)のサービスで正式名称や略称はともかく、読み方がわからずに困ることがよくあるのでまとめてみました。

Amazon Web Services (AWS) - Cloud Computing Services
https://aws.amazon.com/


まとめルールについては下記を参考ください。

Amazon Web Services (AWS)サービスの正式名称・略称・読み方まとめ #1 (コンピューティング) - Qiita
https://qiita.com/kai_kou/items/a6795dbab7e707b0d1a6

全サービスを並べたチートシートもあるよ！

Amazon Web Services (AWS)サービスの正式名称・略称・読み方チートシート - Qiita
https://qiita.com/kai_kou/items/cb29d261c8acc49fd22a


間違いや、こんな呼び方あるよーなどありましたらコメントお願いします！


## Robotics - ロボット工学

### AWS RoboMaker

- 正式名称: AWS RoboMaker
- https://docs.aws.amazon.com/robomaker/?id=docs_gateway
- 読み方: ロボメーカー
- 略称: なし
- 俗称: なし


## 他のまとめ

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#1 \(コンピューティング\) \- Qiita](https://qiita.com/kai_kou/items/a6795dbab7e707b0d1a6)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#2 \(ストレージ\) \- Qiita](https://qiita.com/kai_kou/items/a8ba7a17dd88e9763fbf)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#3 \(データベース\) \- Qiita](https://qiita.com/kai_kou/items/26dcbd7846205efbe48f)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#4 \(開発者用ツール\) \- Qiita](https://qiita.com/kai_kou/items/e459647883dd00cda939)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#5 \(セキュリティ、アイデンティティ、コンプライアンス\) \- Qiita](https://qiita.com/kai_kou/items/5c5d4d9c543fc19a88c4)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#6 \(暗号化と PKI\) \- Qiita](https://qiita.com/kai_kou/items/e81c55a33f4e3ee7b4c7)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#7 \(機械学習\) \- Qiita](https://qiita.com/kai_kou/items/80c9759b6849ad7898f4)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#8 \(マネジメントとガバナンス\) \- Qiita](https://qiita.com/kai_kou/items/145fa47d56bb9aa57134)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#9 \(移行と転送\) \- Qiita](https://qiita.com/kai_kou/items/965cf87628fb12e23164)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#10 \(モバイル\) \- Qiita](https://qiita.com/kai_kou/items/36cc134277e3e3e6cac4)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#11 \(ネットワーキングとコンテンツ配信\) \- Qiita](https://qiita.com/kai_kou/items/1e1855248bd2ebe90f26)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#12 \(メディアサービス\) \- Qiita](https://qiita.com/kai_kou/items/7653a09c8418ff46c2e2)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#13 \(エンドユーザーコンピューティング\) \- Qiita](https://qiita.com/kai_kou/items/ae0aaad7f5019841df40)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#14 \(分析\) \- Qiita](https://qiita.com/kai_kou/items/3f31ce445cbf597d1e7f)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#15 \(アプリケーション統合\) \- Qiita](https://qiita.com/kai_kou/items/97af297a11fa16a1df3c)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#16 \(ビジネスアプリケーション\) \- Qiita](https://qiita.com/kai_kou/items/da941eec64dba4f50d12)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#17 \(サテライト\) \- Qiita](https://qiita.com/kai_kou/items/58434ec361f85cfc2c02)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#18 \(ロボット工学\) \- Qiita](https://qiita.com/kai_kou/items/af28c78d10ad4eb42cce)
React + Redux + Typescriptで"JavaScript heap out of memory"

先日、React + Redux + Typescriptで開発しているプロジェクトで"JavaScript heap out of memory"に遭遇し、解決に１日掛かりました。

最終的に設計した自分のせいだったのですが、戒めの意味でもここで共有しておきます。

# ReduxにDOMの参照を持たせたのが原因

はい、もう恥ずかしいぐらいにいろいろやらかしています。そもそもReduxはデータをimmutableに扱うのが原則です。そこにmutableでしかありえないものをホイっと渡していました。

発生するheapエラーの厄介な点は、コードのどこが原因なのかをエラーメッセージが教えてくれないことです。"JavaScript heap out of memory"で調べると、「ビルドする際に使用するメモリーを増やすオプション（`--max-old-space-size=xxxx`）を追加すると解決する」という情報しか出てきません。

さらにTypescriptを使っていたのでReduxのモジュールとしてstateに以下のようなコードを書いた時点で、そのモジュールのアクションを経由して実際に値を入れたりしなくても、このエラーは発生してしまいます。

```.ts
import { createSlice, PayloadAction } from 'redux-starter-kit';

type DangerousRefState = {
  div: HTMLDivElement | null;
}

const initialState: DangerousRefState = {
  div: null
};

const dangerousRefModule = createSlice({
    name: "dangerous-ref",
    initialState,
    reducers: {
        // 実際にこのアクションを呼ぶコードを書かなくても、
        // ビルドすると"JavaScript heap out of memory"
        setRef: (state, action: PayloadAction<HTMLDivElement>) => ({
            div: action.payload
        })
    }
});
```

以上です。

ちなみになぜ、DOMの参照を持たせようと思ったのか...については恥ずかし過ぎて言えません。。
ショアのアルゴリズムと量子フーリエ変換

## 概要
**格子暗号**を勉強するモチベーションの１つとして、**格子暗号が量子コンピュータ耐性をもつ暗号**という事実も大きな要因の１つである。
**SSL通信**などに用いられている従来の**RSA**などの通信は量子コンピュータによって破られるということは知っているが、実際にどうやって破られるのかよく知らなかったので調べてみた。備忘録的な要素あり。
注）専門書などはまだ読めておらず、にわか知識となります。

## キーワード

- **ショアのアルゴリズム**
- **量子フーリエ変換**

## ショアのアルゴリズム
キータに素晴らしい記事があり、それらを参照すると大変わかりやすい。([例えばこれ](https://qiita.com/kyamaz/items/eebd0f7734c8a33de2ad)や、[とかこれ](https://qiita.com/satto_sann/items/373e974a451896d728bb))
簡単にまとめると、ショアのアルゴリズムは量子コンピュータを用いてある自然数 $N$の**因数分解を多項式時間で解ける**とされるアルゴリズムである。いくつかのステップに分かれており、実際に量子コンピュータを活用するのはそのうちの1ステップであり、古典コンピュータで行う演算と組み合わせることによって全てのプロセスを構成しています。
どこに量子コンピュータが使われるかというと、先ほどの$N$を法とした時のある自然数$a$の位数、つまりある$T$で、$a^T=1 ~ mod ~N$となるようなTを見つけるところに量子コンピュータを用います。この$T$は周期とも書いてあり、これを確率関数で量子コンピュータは返してくれるのですが、これが**多項式時間で実行可能**ということです。その他の古典コンピュータで行われるプロセスは全て多項式時間で行えるプロセスなので、ショアのアルゴリズム全体の実行も多項式時間で済むことになります。

この$T$の関する**確率的分布（確率密度関数）**を量子コンピュータで求めるところに、**量子フーリエ変換**が用いられています。


## 量子フーリエ変換
いくつかの素晴らしい記事を読みました。計算は全ては追えませんでしたが、**フーリエ変換を行う際のプロセスを、基底ケットベクトルに対応した変換と置き直して進めていくところ**が素晴らしいなと思いました。
参考にしたのは、[こことか](https://whyitsso.net/physics/quantum_mechanics/QFT.html)、 [こことか](https://qiita.com/ground0state/items/df43cc5179b48ae72dbe)、[このへん](https://qiita.com/YuichiroMinato/items/e51182443febed5b429d)です。

ある時系列データがある時に、それを連続的な周波数を持つ正弦波で近似することを**フーリエ変換**と言いますが、もし分解する周波数が連続でない時、**離散フーリエ変換**と呼びます。
**量子フーリエ変換**は、この離散フーリエ変換を量子コンピュータで求めるときのやり方、計算アルゴリズのことを指しています。量子コンピュータの前提として、状態は量子ビットの重ね合わせ状態として書かれ、それらは基底ベクトルの重ね合わせでした。それらを実際に観測、つまり何らかの状態と掛け合わせることで、係数の２乗を確率として何らかの物理量が観測できました。**量子フーリエ変換では、各基底ベクトルを離散フーリエ変換される要素とみなし、観測した時に出てくる値を、離散フーリエ変換後の値としています**。
数式で追うと少しわかりやすいですが、入力$x$から離散フーリエ変換を施した$y$を求める際に、うまく式変形することで、この導出を、**$x$の基底ベクトルの変換とみなしています**。

導出は専門書なり、上の参考文献を追っていくと、この変換は**アダマールゲート**と、**位相変換ゲート**のを再帰的に入力状態に作用すればいいことがわかります。
n-qubitの入力に対する演算（ゲート）の数を数えると、$n^2$となるので、実質$2^n$個のサンプルに対して$O(n^2)$のオーダーで離散フーリエ変換を計算できたことになります。一方、高速フーリエ変換（バタフライ演算を利用したもの）では、仮に同じ$2^n$個のサンプルに対して$O(n\times 2^n)$の演算が必要なので、**量子フーリエ変換の方が圧倒的に早くなる**というわけです。

## おまけ　グローバーのアルゴリズム
いろいろブラウジングしていくと**グローバーのアルゴリズム**というのも有名な量子アルゴリズムだとわかったので追記。
参考にしたのは[wikipediaと](https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0)、[このすぱらしい記事](https://qiita.com/kyamaz/items/37973effe783197291bc)。
量子コンピュータを用いて、$N$個のなかから特定の１つの物を見つけたい時に、$O(N)$普通にかかるところを、$O(\sqrt{N})$で可能にするアルゴリズムで、たとえば**128ビット長の共通鍵暗号の共通鍵を総当たりで求める際に、$2^64$の計算量で求めることができます**。くわしくは書きませんが、意外と単純で、**振幅増幅手法**を入力状態に行うことでこれを可能にしています。


## 最後に
にわか記事となりましたが、いろいろ勉強していきたいとおもいます。
おわり。
aws cliを自作しています

aws cliを自作しています。AWSの中身を理解するためにAPIを叩きまくろうと思ってです。Pythonのboto3を使っています。Pythonの練習でもあります。おかげでかはわかりませんが、前よりもずっとAWS触りやすくなりました。

自作ツールではAWSのリソースの閲覧に特化して、いちいちヘルプを見なくても使えることを目指しています。

# aws cliで感じてること

aws cliは help を見れば使い方がわかりますが、サブコマンドごとにいちいちヘルプを見ないといけません。またパラメータが非常に多いサブコマンドもあり、ヘルプを見ながらコマンドを打っていくのがつらいです。こんな長いコマンドはなかなかすらすら打てるようにはならないです。

```
# とても長い覚えられないコマンドの例
$ aws cloudwatch get-metric-statistics --namespace AWS/Lambda --metric-name Duration \
  --dimensions 'Name=FunctionName,Value=xxxx' --start-time ... ... ...
```

慣れたらすらすらできるようになるのだろうか。APIと直接対応しているので、APIを把握していればいいんでしょうけど。

この長いコマンドにたどり着くにはこんな道のり。

```
# cloudwatchのAPIを探す
$ aws cloudwatch help

# それっぽいのを見つけた。get-metric-statistics だな

$ aws cloudwatch get-metric-statistics help

# パラメータがいっぱいあってたいへんだ・・・
# 日時はどういうフォーマットだろう
# periodとかどう書くんだ
# いっぱいググる

$ aws cloudwatch get-metric-statistics --namespace AWS/Lambda --metric-name Duration --start-time xxxx --end-time xxxx --period xxxx
At least one of the parameters Statistics and ExtendedStatistics must be specified.

# え、必須パラメータがたりないのか・・・
# Statisticsってどう指定するのか、もう一度ヘルプを見る
$ aws cloudwatch get-metric-statistics help

$ aws cloudwatch get-metric-statistics --namespace AWS/Lambda --metric-name Duration --start-time xxxx --end-time xxxx --period xxxx --statistics xxxx
# やっとできた
# けど本当はdimensionも指定したい。どう書くのやら
```

# 自作ツールで目指しているもの

自作のツールではこうなります。

※boto3というコマンド名は仮称です。こういう名前のコマンドが一般に存在するわけではありません

```
# lambdaのメトリックスを見たいので、まずはlambdaと打つ
# (cloudwatchからでもたどれます)
$ boto3 lambda
functions
layers

# このように表示されたら、見たいものを選んで、パラメータに追加して再実行する
# 見たいメトリックスは関数に紐づくので今回はfunctionsを選ぶ

$ boto3 lambda functions
xxxx
yyyy

# 関数の一覧が出てくるので、この中から見たい関数を選ぶ

$ boto3 lambda functions xxxx
code
configuration
metrics

# この中から見たいものを選ぶ

$ boto3 lambda functions xxxx metrics
duration
errors
invocations
throttles

# この中から見たいものを選ぶ

$ boto3 lambda functions xxxx metrics duration
# see-also: aws cloudwatch get-metric-statistics --namespace AWS/Lambda --metric-name Duration --dimensions Name=FunctionName,Value=xxxx --start-time 2019-10-10T13:03:00 --end-time 2019-10-11T13:03:00 --period 60 --statistics Average --output text
2019-10-10T13:03:00+00:00 1713.59 Milliseconds
2019-10-10T13:04:00+00:00 1736.76 Milliseconds
...

# 見たいものが見れました。
```
  
細かいパラメータをいじって詳細を見たいのであれば、上の `# see-also:` で表示される本家aws cliを叩けばよいです。本家aws cliの必要なパラメータが全部出ているので、これをいじるだけなら楽です。

以上。
Python 3 エンジニア認定基礎試験は本当に簡単なのか。

#はじめに

初投稿です。

底辺SESのバーチャルYouTuber、久遠寺ネアルです。

嘘です。

YouTuberでは無いです。

本当です。

少し身元を。


よくある中小企業のSESとして働き始めてはや6年。
ゲーム系の専門学校でC++の基礎を独学。
就職したのは汎用機オペレーターで、4年間機器エラーを電話&メールし続ける。
現場の異動でプログラマーをやるもCっぽい独自言語での開発だったため自身の成長に疑問を持つ。
その後転職し、やっぱり中小企業のSESでVB.NETをメインに.NET系でWebサイトやらPOSやら開発。仕事以外にもPHPやらLINEBOTやら機械学習やらで遊びながら現在に至る。

資格に関しては、応用情報とJavaSE8silverを持ってます。


##試験について

最近機械学習に興味をもって学習を始めたので、資格でもあったら受けてみようかなぁと思い探してみると「Pythonエンジニア認定基礎試験」とやらがあったので早速受験してみました。
他にも、同じ協会が実施している「Pythonエンジニア認定基礎試験」と日本ディープラーニング協会が実施している「G検定(ジェネラリスト検定)」も受験予定です。

どうやら出題される範囲が明確に示されていて1、2週間も勉強すれば受かるとのこと。
結果合格率が70～80%もあって、取らせる資格のようです。

出題範囲は全てオライリーの「Pythonチュートリアル 第3版」に載ってます。
実はWebで無料で読めるそうです。
一応Amazonのリンクを貼っておきますが、僕は電子版をスマホで読みました(Pythonは空白と改行が重要なのでソースコードはめちゃくちゃ見づらかった)。

半分ぐらいはお酒を飲みながら。

[Pythonチュートリアル 第3版](https://www.amazon.co.jp/dp/4873117534/)


教科書があって、期末テストみたいですね。


##試験の目的
・別の言語を使っていたけどPythonに興味を持った。
・初のプログラミングでPythonの学習を終えたので、初めて資格を取ってみたい。

上記2種類のパターンなのかなと思います。
目的を作ってモチベーションにするっていうのが主でしょうか。
仕事でPythonのコードを書いた経験が経歴書に書けるレベルであるなら必要のない資格かもしれません。
逆に、全く未経験でこの試験を取得するところからプログラミングを始めてみようという方には難しいかと思います。
プログラミング用語というべきか、そういう感じの単語がしれっと使われます。
「C言語にのっとって」とか書いてますので。

##試験の内容
試験問題はランダムに出題されるようですが、ある程度、どのような問題がどれぐらい出題されるか決まっているようです。
僕は試験当日に知ったので詳しく調べてはいないのですが・・・。
恐らく、チュートリアルの付録やおまけの部分は出題されていなかったかと思います。

そんな中でもビルトイン関数に関することが主でした。
リスト、辞書、for文の使い方とそれぞれの関数に与える引数が何を意味しているのかをしっかり理解していく必要があると思います。

インタプリタの使い方や外部パッケージ、ライブラリの話とかも少し出てきますが、比重は重くないのでチュートリアルを一周読んでいればそれ以上深く追う必要は無いと思います。
数は少ないですが、模試で出た分も数問出ていたのでこちらはやっておいたほうがいいかもしれません。

##試験の申し込み
もしかすると、試験の申し込みが一番難しかったという方もいるかもしれません。会場が一般の小さなスクールばかりなので、サイトがイケてなかったりそもそも申し込み用のフォームが見つからなかったりします。
CBT試験ではありますが翌日受験とかは出来ないので一週間以上前に、わかりやすいサイトで申し込みましょう。


#まとめ
僕はチュートリアルを1周読んでから模試の正答率を100%にしてから受験しました。

おすすめは金曜日に有給休暇をとって日曜日の夕方に試験を予約。
金曜日と土曜日にチュートリアルを読破。もう一周思い出しながらさらっと流し見して、試験当日模試を何度もスマホでやるといいと思います。
オススメと言っておいてなんですが、大体の試験はこんな感じで受験してますのでコツコツできる人はすごいなぁと思います。


「結論としては、経験者なら3日で取れる資格」
です。
初めてのプログラミング言語にPythonを選んでこの資格を取得したなら大したもんだと思います。


何か気になることがあればコメントお願いします。
Windowsにてワンクリックでログオフする

前回、ログインのバッチファイルを作ったので逆の発想をします。
作業者がログオフし忘れて、みたいなパターンを見かけるのでアイコンをワンクリックするだけでログオフするようにしてみました。

使い方によっては、作業中に恐ろしいことになるので、あくまで自己責任でお願いします。

##ショートカットの作り方
バッチファイルでもPowerShellでもなく、ショートカットだけでできます。

1.右クリックして[新規作成]→[ショートカット]
2.項目の場所に「shutdown -l」と入力
3.名前は任意で構いません

これだけでできます。
アイコンの変更をしたい場合は、プロパティから変更できます。

今回はログオフですが、オプションを変えることで色々できます。
shutdownコマンドのオプションはこちら

|引数|内容|
|---|---|
|-s|シャットダウン|
|-r|再起動|
|-l|ログオフ|
|-h|休止状態|
|-a|処理の中止|
|-t 秒|処理までの実行秒数|
|-c "メッセージ"|処理時にメッセージを表示する|
|-f|実行中のアプリケーションを強制終了させる|
【React入門】コンポーネントの条件付きRender (Conditional Rendering)

# はじめに

Reactの公式ドキュメントの条件付きレンダー(**Conditional Rendering**)にトライ。

条件付きレンダー-React
https://ja.reactjs.org/docs/conditional-rendering.html

# 開発環境

* Ubuntu18.04
* yarn 1.17.3
* create-react-app 3.1.2

# create-react-appで準備

```
$ create-react-app try-conditional-rendering
$ cd try-conditional-rendering
```

で、`./public/index.html`と`./src/App.js`を編集。

```html:./public/index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="theme-color" content="#000000" />
    <meta
      name="description"
      content="Web site created using create-react-app"
    />
    <title>Try Conditional Rendering</title>
  </head>
  <body>
    <div id="root"></div>
  </body>
</html>
```

```jsx:./src/App.js
import React from 'react';
import './App.css';

const App = () => {

}

export default App;
```

# 早速条件付きレンダーをやってみる。

まずは丸パクリにならないよう公式ドキュメントのマネをして`GreetInTheMorning`と`GreetInTheAfternoon`、そして`GreetInTheEvening`というコンポーネントを作る。

```jsx:./src/App.js
const GreetInTheMorning = () => {
  return <h1>おはようございます。</h1>
}

const GreetInTheAfternoon = () => {
  return <h1>こんにちは。</h1>
}

const GreetInTheEvening = () => {
  return <h1>こんばんは。</h1>
}
```

現在時刻によって上3つのコンポーネントのいずれかを表示したいとする。
本来ならちゃんと`Date`オブジェクトを使って...ってやるんだけど、今回は公式に沿って`Greeting`コンポーネントを作って`App`コンポーネントから`Greeting`コンポーネントに`nowHour`という引数を渡してズルをする。

```jsx:./src/App.js
const Greeting = (props) => {
  // 5時 ~ 12時までは"おはようございます。"を表示する
  if(5 <= props.nowHour && props.nowHour < 12) {
    return <GreetInTheMorning />
  }
  // 12時 ~ 18時までは"こんにちは。"を表示する
  else if(12 <= props.nowHour && props.nowHour < 18) {
    return <GreetInTheAfternoon />
  }
  // 18時 ~ 5時までは"こんばんは。"を表示する
  else if((18 <= props.nowHour && props.nowHour < 24)  || (0 <= props.nowHour && props.nowHour < 5) ) {
    return <GreetInTheEvening />
  }
  else {
    return <h1>Error.</h1>
  }
} 
```

`./src/App.js`の完成形が下のコード。

```jsx:./public/App.js
import React from 'react';
import './App.css';

const GreetInTheMorning = () => {
  return <h1>おはようございます。</h1>
}

const GreetInTheAfternoon = () => {
  return <h1>こんにちは。</h1>
}

const GreetInTheEvening = () => {
  return <h1>こんばんは。</h1>
}

const Greeting = (props) => {
  // 5時 ~ 12時までは"おはようございます。"を表示する
  if(5 <= props.nowHour && props.nowHour < 12) {
    return <GreetInTheMorning />
  }
  // 12時 ~ 18時までは"こんにちは。"を表示する
  else if(12 <= props.nowHour && props.nowHour < 18) {
    return <GreetInTheAfternoon />
  }
  // 18時 ~ 5時までは"こんばんは。"を表示する
  else if((18 <= props.nowHour && props.nowHour < 24)  || (0 <= props.nowHour && props.nowHour < 5) ) {
    return <GreetInTheEvening />
  }
  else {
    return <h1>Error.</h1>
  }
} 

// nowHour={}の中の数字を変えれば画面に表示される挨拶が変わる。
const App = () => {
  return <Greeting nowHour={13} />;
}

export default App;
```

# おわりに
続きはまた書きます。
Rails でファイルを強制ダウンロードさせたい

シンプルなんだけど、調べると意外に出てこなかったのでメモ。

## Rails でファイル（PDFなど）を強制的にダウンロードさせる方法
```
send_file path_to_file, type: 'application/force-download'
```

これでできた🙆‍♀️

## 説明
- Rails からファイル送出するには、基本 `send_file` を使う
- この時レスポンスヘッダの `Content-Type` には、
ファイルに応じた Mime タイプ（ `application/pdf` 等）が自動的にセットされる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135266/21e230fe-1ca2-0950-049a-49417539f8d0.png)

- これではブラウザによって挙動が変わってしまう・・・（ダウンロードされたり、ブラウザで直接開いたり）
- 強制ダウンロードさせるため、 `Content-Type` に `application/force-download` をセットしたい
- `send_file` のオプションとして `type` が渡せるから、そこに書いてみよう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135266/46163659-b97e-657c-fbee-33e2c9c3ed24.png)
→ `application/force-download` になった！

send_file では Content-Type 触れないのかと思って無駄に調べまくってしまった・・・
まずはドキュメントを読もう😌

**send_file**
https://apidock.com/rails/v6.0.0/ActionController/DataStreaming/send_file
CentOS8のメモリ使用量を減らす

* sssd : LDAP認証を使用する場合。
* tuned : 動的パラメーター変更。

```sh:無効化
for i in sssd tuned 
do
    systemctl disable $i
    systemctl stop $i
done
```

* 95 -> 69 MBまで下がった。
GANを用いた画像異常検知アルゴリズム

# 概要

ニューラルポケットは、**正常品と異常品を高精度で判別する画像分析アルゴリズム**を開発し、国際学会ACPRにて発表しました。複数のオープンデータセットによる評価で、世界最高の異常画像検出精度を達成しています。

正常品と異常品を画像から識別するアルゴリズムは、工場や農業、インフラ管理などの幅広い領域において活用が進められており、属人的な作業を機械化することによる、見逃し率の低減や作業の効率化などに、大きな期待が寄せられています。

この領域においては、従来、正常品とのパターンマッチングを中心としたアプローチが主流でしたが、近年、深層学習を用いたアプローチが広まり、正常品の中でも形状変化が大きい、食品や柔らかい素材の部品など含め、幅広く活用することが出来るようになってきました。

本手法は、その発展として開発されたものであり、以下のような特徴を持ちます：

- **従来の手法では大量に必要となっていた異常画像を大きく減らし、数枚とごく少量あっても学習モデルの構築が可能**
- 特に検出したい異常モードについては、数枚の異常画像を登録することで、感度を上げることが可能。その他、**実際の利用に応じたカスタマイズも容易**

ニューラルポケットでは、本手法の活用を進め、工場や農業、インフラ管理など、これまで困難だった分野のスマート化を進めて参ります。


以下、論文の概略の紹介になります。技術的な内容に興味のある方はぜひご覧ください。

# 技術紹介
## 画像異常検知における課題

例えば、ケーブル被覆のキズの検知を異常の例として取り上げます。
この時、画像による異常検知を行おうとすると、以下のような問題が発生します：

1. 正常品の形状が大きく変化するため、パターンマッチによる判定を行うことが困難
2. キズなのか、印刷された文字・パターンなのかの判別が困難
3. 近年の製造技術の向上により、異常品のデータがそもそも取得しづらい (正常品の数は多い)

同様の問題は、形状が変化するパーツを製造するときには一般的に発生します。また、農業など生産品の形状をコントロールできないような産業でも起こるため、異常検知の自動化の文脈においては、かねてより大きな課題となっていました。

## 解決のアプローチ
上記の問題を解決するために、我々はGAN(Generative Adversarial Network; 敵対的生成ネットワーク)を異常検知に応用しました。
GANとは、大量のデータの学習から、そのデータ全体の特徴を捉えた新しい画像を生成することができるフレームワークです。
【参考】 GAN 敵対的生成ネットワークの台頭【前編】 | AI専門ニュースメディア ainow.ai › 2019/07/17
https://ainow.ai/2019/07/17/173382/

![model1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540567/95dccfc4-aab3-9bf3-b14d-d045197328b5.png)


まずGANに正常データを学習させます。これによりニューラルネットは「正常データの画像」を一般的に生成する能力を獲得します。
今、異常画像を入力したときに、このGANを用いて、「異常画像にできるだけ類似した正常画像」を生成させます。ところが、このGANは、正常画像しか生成できないので、異常画像の中に含まれる「キズ」や「欠け」などの箇所は再現できません。つまり、**入力された異常画像と、この生成画像を比較することで、「キズ」や「欠け」を逆に浮き立たせることが可能**です。
上記までは、これまでも複数の文献にて提案されていた概念ですが、本手法においては、新規性の一つとして、GANが持つ豊かな表現能力の中に、異常画像に似たものが含まれないよう明示的に制約をかける工夫をしています。少数の異常画像を登録しておくと、それに近い画像をGANが生成した場合に罰則を受けるような構造としており、異常検知性能の向上に貢献しています。

入力された異常画像と生成画像の比較を行うアルゴリズムにも工夫があります。
異常画像と生成画像を比較する際、これまでの手法では単純なピクセル輝度差を用いていることが多かったのですが、これは画面全体の輝度差やノイズなどの違いによって大きく影響を受け、異常画像の検知性能の低下を招いていました。
本手法では、異常画像と生成画像を見比べ、画面全体の輝度差やノイズなどとは異なる**形状差を明示的にパターン認識させるようなモデルを導入しています**。これにより、異常画像と正常画像を精度良く分離することが可能になっています。

論文の中では他の方が検証可能なように、オープンデータセットを用いた評価を行っています。
手書き文字のデータセットを用いた場合の、異常・正常識別結果が以下になります。
上側はベンチマークとした類似手法、上側は本手法によるもので、**正常・異常クラスが作る分布の重なり部分が小さくなり、分類精度が向上している**ことが分かります。

<img width="375" alt="figure5-new.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540567/ec269257-ff74-b017-65c5-8525f34dc108.png">

これらの手法の組み合わせにより、過去の複数のベンチマークを更新し、世界最高の異常検知精度を達成しています。
vbsの作法 その46

#概要

vbsの作法調べてみた。
geocodingやってみた。

#環境

windows 7 64bit

#サンプルコード


```
Dim lat
Dim lng
Dim url
Dim oHTTP
Dim oDOM
Dim res
Set oHTTP = CreateObject("MSXML2.XMLHTTP")
Set oDOM = CreateObject("MSXML2.DOMDocument")
url = "https://www.geocoding.jp/api/?q=山形県米沢市アルカディア１丁目"
oHTTP.Open "GET", url, False
oHTTP.Send
msgbox oHTTP.responseText
oDOM.loadXML oHTTP.responseText
lat = oDOM.getElementsByTagName("lat")(0).text
lng = oDOM.getElementsByTagName("lng")(0).text
res = lat & "," & lng
msgbox res
```

以上。
podman 

## podmanの良さ

* デーモンレスのためか dockerより `50MB` ほどメモリ使用量が少なかった。

## インストール

```sh
sudo yum install -y podman-docker
```

## ディレクトリ

* /etc/containers/
* /var/lib/containers/storage/

## man 

man docker
をすると
man podmanが表示される。

## 起動

```sh
# バックグラウンド起動
docker run -it -d -p 80:80 nginx

# rm
docker run -it --rm -p 80:80 nginx
```

```sh
$ docker images
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.

# メッセージを非表示にする
$ sudo touch /etc/containers/nodocker

$ docker images
```


## podman-compose

```sh
pip3 install podman-compose
# /usr/local/bin/podman-compose にインストールされる。
```


```go:docker-compose.yml
nginx:
  image: nginx
  ports:
    - 8080:80
```

```sh:動かない・・・
$ sudo /usr/local/bin/podman-compose up
Traceback (most recent call last):
  File "/usr/local/bin/podman-compose", line 11, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.6/site-packages/podman_compose.py", line 1093, in main
    podman_compose.run()
  File "/usr/local/lib/python3.6/site-packages/podman_compose.py", line 611, in run
    self._parse_compose_file()
  File "/usr/local/lib/python3.6/site-packages/podman_compose.py", line 688, in _parse_compose_file
    for service_name, service_desc in services.items():
AttributeError: 'NoneType' object has no attribute 'items'
```
db/seeds.rbの中身を変更したらrails db:seedできない。そんなときにありがちな原因

# 何が起こったか

`db/seeds.rb`の中身を変更したら、`rails db:seed`が失敗するようになりました。

```
# rails db:seed
rails aborted!
SyntaxError: /var/www/sample_app/db/seeds.rb:5: syntax error, unexpected tIDENTIFIER, expecting ')'
            admin: true)
            ^~~~~
/usr/local/bundle/gems/activesupport-5.1.6/lib/active_support/dependencies.rb:286:in `load'
...略
```

この後やたら長いスタックトレースが流れてきて面食らいます。

# 原因

原因は、`db/seeds.rb`で、単に項目区切りのカンマを入れ忘れていたことでした。`db/seeds.rb`を以下のように修正します。

```diff:db/seeds.rb
  User.create(name:                 "Example User",
              email:                "example@railstutorial.org",
              password:             "foobar",
-             password_confirmation: "foobar"
+             password_confirmation: "foobar",
              admin: true)
  ...略
```

```
# rails db:seed
```

今度こそ`rails db:seed`は成功するはずです。なお、`rails db:seed`が正常に完了した場合は、シェルに何も表示されません。
プログラミング関連に関する情報収集

ソフトウェアエンジニアでも何でもないサラリーマンですが、
フリーランスのプログラマとして、いつか独立するぞ。。。

という風な野望を抱いています。

しかしながら、
やはり実務経験がない、
周囲に熱く語らう仲間がいない、
仕事でも全く関係がない・・・

となってくると、完全な自主努力に頼らざるを得ません。


そこで自分が、これまでの間、歩んできた経緯を振り返ります。


#書籍
AIやスクレイビングと言った、キーワードに引かれて、
PYTHON関係の本を購入する。

しかしながら、最初はまったく訳が分からず1年ほど放置・・・

その後、日経の定期購読で下記を購入
・日経SYSTEMS
・日経ソフトウェア

日経SYSTEMSは、1年間の定期購読であったが、
一冊2000円近い内容で、ぺらっぺら・・・
途中で辞めたくなったが、１年は我慢・・・

日経ソフトウェア
ＡＩとＰＹＴＨＯＮに特化しすぎる。
やりたい内容はあったが、やはり素人には理解できず
本棚には眠り続けている。
ＣＤの付録は一切手を付けられず、途中からは放置状態で解約

という訳で、その後は本屋へ行き、
見開いては購入を繰り返し、いまや我が屋の本棚は、
どこかの書店の一角かと思うぐらい
新書の本が並べられている状況・・・

その範囲は、GITHUB～DOCKER、ｃ＃、JAVA、ＵＭＬ関連など。。。

買ったのは良いが、その後は分からない用語に苦しめられ
そのたびに、本を買いあさり、いまでは漠然とキーワードが
頭にインプットされた状況となっている。

しかし、大半は読んでいない・・・（いつか子供が読んでくれるかな？）


#勉強会

その次は、COMPASSで見つけたイベントに参加

ご当地のPYTHONの集まりに参加
PYTHONのAI勉強会に参加
マイクロソフト、ＹＡＨＯＯのイベントに参加

PYTYONの集いでは、やはり地元のローカルな薄い人材のため、
集まった人とは、年代も境遇もまったく違っており、
アラフィフサラリーマンの入れる余地はなく撤退

それに男ばかりの集まりのため、どうしても自身の山コミュとの
男女比率が気になり、やはりプログラマは男社会なのかと
なかば時代が変わっていないことに失望をする
（IT時代なので、システムエンジニアとか女性が多いと思っていたのだが）

次に、企業のイベントに参加
さすがに、ＩＴ企業になると、やはりビルとか凄くて、
しかし、ＩＴ企業と言うのは、本当にひっそりとしていて
自分の努める製造業に比べて、人件費が薄い。。。
って衝撃だった。

やはり少数精鋭で成り立っている業界なんだと実感した。

その後、ＡＩ勉強会では、JYUPTER　NOTEでの演習などがあったが
講師の方が東京の方で・・・

やはり関西は遅れている。
関西では、そもそも情報が得られないことに対して
失望してしまった・・・


#GITHUB

そうこうしているうちに、仕事でもPYTHYONマクロを使ったWEBアプリ
を自分でチャレンジすることになった。
（これも形になるか分からないので、土日に家で頑張って作ったのだが）

その間に、不明なソースを探すことが多くて、
TERATAILにはずいぶんとお世話になった。

そのうちに、自分でGITHUB検索をするようになり、
とくにソースコードを入れて、類似のものを検索するというのに
けっこう役立った。

そこで得られたソースを片っ端から読んでいき、
やはりプログラマというのは、初心者もいれば、プロまでいるので、
そのうち人のソースを見ると、だいたいのレベルが分かるようになってきた。

で、その中で、とあるプログラマのコードを見て衝撃を受ける。

その内容とは、一切のサブルーチンを使わず、
すべての内容が羅列されているコードであり、
かつライブラリの使用も極薄で、
一切のルーチンを平たく書いている
いわゆるスパゲッティコードという奴だが。。。

しかしながら、できているサイトは秀逸で、
レストランのオーダーをＷＥＢで受注するというものであった。

デザインも秀逸ながら、そのコードを読むことで、
スクリプトからＳＱＬまで、目の前で動いているのが
読める内容で、完全に衝撃を受ける。

直感的にプログラムが動いているのが、
分かる点では素晴らしく、
あえてコピー＆ペーストをすれば、
コードをクラスや関数にしておく必要性はない

また容量の都合でコードを節約しないといけない時代ではなく
スクリプトならば、読み込んで動作しているので、
所詮は全ソースを並べて書いているのと変わらない。

などなど、いろんな発見があり、
その方を、恩師として、JAVASCRIPTとFLASK、SQLITEの使い方を
見本とさせていただく。

本当に、このコードとの出会いが、自分のプログラマ人生の始まりだったと
言わざるを得ない。。。

そうして、ログイン認証からＤＢを駆使した
ＷＥＢアプリを完成させることができた。

(第二部に続く)
Core NFC ってなんだ【iPhone で ピッと NFC】

Advent Calendar 2019 始まりました。
この Advent Calendar 自体をやってみるのも初めてなんですけど…。
見様見真似でチャレンジします。

# NFC (Near Field Communication)
ここでいう NFC とは Near Field Communication の略です。
何かの機器に対してカードを近づけてピッとさせるアレ、あれが NFC です。

[NFC Forum の文書](http://nfc-forum.org/wp-content/uploads/2013/12/N-Mark-Brand-Guide_Japanese_final.pdf)にはこのように書かれています。
> 魔法の杖をひと振りしたら何でも望みがか なうといいのに――昔から人はそんな夢を 見てきました。その長年の夢が、NFC(Near Field Communication)テクノロジーの登場 で現実のものになりました。

日本で NFC が用いられている場面は、Suica、PASMO、ICOCA 等に代表される交通系ICカードから、楽天Edy、nanaco、WAON などの電子マネーカード、自動車の運転免許証、個人番号（マイナンバー）カード、パスポートにも含まれていますね。
おサイフケータイ、最近はコンタクトレス決済（NFC Pay）もじわじわとやってきています。
会社や学校での入退出管理でカードをピッとやっている場所はだいたい NFC です（カードをシュッとスライドさせるタイプは異なります）。

# Core NFC
そして、この Advent Calendar のテーマである「Core NFC」とは、iOS 端末で NFC を利用するアプリケーションを開発する際に必ず用いることとなる Framework です。
Android であれば android.nfc.tech Package に対応するかなと思います。

[Apple Developer Documentation](https://developer.apple.com/documentation/corenfc) にはこう書かれています。
> Detect NFC tags, read messages that contain NDEF data, and save data to writable tags.

この Framework は iOS 11.0 のときに登場しましたが、そのときは NFC Data Exchange Format (NDEF) のタグの読み取りができるだけのものであり、利用できる場面が非常に限定されていました。

しかし、iOS 13.0 にて NDEF に依らない情報の読み取り、そして情報の書き込みが可能となり、いよいよ本格的に NFC 技術を iPhone で活用するときがきた！という状況になっています。

~~Android では昔からできた~~

#Core NFC で何ができるか
日本の場合、一番大きな活用場面は「キャッシュレス決済」もしくは「電子マネーカードとの情報のやりとり」かなと思います。
iOS 13.0 が登場した2019年9月、多くのメディアで取り上げられた「iPhone で電子マネーカードの残高をチェックできるようになった」という情報、あれは Core NFC を用いて開発されたアプリ群を紹介するものでした。

個人的 3大 iPhone の電子マネーカードリーダー
- [Japan NFC Reader](https://apps.apple.com/jp/app/id1480265213) （本記事執筆者が開発）
- [ICリーダー](https://apps.apple.com/jp/app/id1474445461)
- [CardPort](https://apps.apple.com/jp/app/id1478284681)

これらのアプリは Core NFC を用いて、電子マネーカードと NFC 通信を行うことでカード内に記録されている残高、利用履歴、ポイント等を取得し、端末に表示するということを行っています。

また、技術的には電子マネーカードのチャージも iPhone で行うことができたり、スマートロックの解除などスマートホームでの活用も考えられます。

#まとめ

- **NFC とは機器に対してカードを近づけてピッとさせるアレ**
- **日本では Suica 等の交通系ICカードや電子マネーカード、運転免許証やパスポートにも含まれている**
- **Core NFC は NFC を iPhone で使うために必要な Framework**
- **iOS 13.0 で Core NFC の機能が大幅に追加され、実用的になった**

Core NFC Advent Calendar 2019、隔日で記事の執筆を予定しているので、はじめはなかなか内容が薄い記事が続くかな…と思います。どうかお付き合いください…。
jQuery メソッド

jQueryを勉強していく中でメソッドやオブジェクトやら出てきてどれがどれかわからなくなったので
メソッドについて書いてみた
メソッドとは、簡単に言うと便利な機能の事。ｊQueryのメソッドは前述のオブジェクトにしか使えない

```js
$function(){
  $('h1').hide(); //.hideは要素を隠すメソッド
  }
}
```
これで指定したh1の要素を隠すというコードになっている
他にも要素を削除するなど様々ある

詳しくは↓に一覧があるので見てみるといいかも
[コピペで使える JavaScript逆引きリファレンス](https://javascript.programmer-reference.com/jquery-list-method/)
Laravel モデルファイル作成

[マイグレーションファイルの作成](https://qiita.com/ken85shin/items/2ea4ba8536669b7820c5)後に、モデルファイルを作成する手順。


## Model（モデル）とは

Modelとは、データベースや外部サービスへのアクセスを基本とした、ビジネスロジックを扱うコンポーネントです。

## Eloquent（エロクアント）とは

Eloquentとは、[ORマッパー](http://si.comp.ae.keio.ac.jp/web_app_dev_material/app/or_mapper/index.html)の一種です。

役割としては、データベースとアプリのモデルクラス形式のデータの受け渡しをになっています。オブジェクト操作の一環として、データベースを操作できます。

### artisanコマンドでモデルを作成

```terminal
$ php artisan make:model モデル名
```
Laravelには命名規則があり、テーブル名（複数系）とモデル名（単数系）とする必要があります。

| 項目       |  名前 |   
|:-----------------|------------------:|
| テーブル名         |             users | 
| モデル名          |               User |   

このルールを守る事で、自動的にデータベースとモデル（実行ファイル）が紐づいてくれます。

###実行結果

```php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class モデル名 extends Model
{
    //
}
```

###モデルが作成される場所

ディレクトリ名/app

appディレクトリ内に作成されるので確認

モデルは増えた時のために、`Models`のディレクトリ内に作成するのがベターです。

```terminal
$ php artisan make:model Models/Test
```

ディレクトリ内にモデルを作ることができます。

```php:Test.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Test extends Model
{
    //
}
```

###マイグレーションファイルをまとめて作る

`-mc`のオプションでマイグレーションファイルとモデルをまとめて作成できます。

```terminal
$ php artisan make:model Models/Test -mc
```
【Bootstrap】jQueryライブラリの読み込み【Rails Tutorial 8章まとめ】

##BootstrapのjQueryライブラリ
Bootstrapに含まれるCSSのdropdownクラスやdropdown-menuといったドロップダウン機能は、Bootstrapのjavascript(jQuery)ライブラリを読み込まなければ使えない。

application.jsにBootstrapのJavaScriptライブラリを追加する。

```app/assets/javascripts/application.js
//= require rails-ujs
//= require jquery
//= require bootstrap
//= require turbolinks
//= require_tree .
```
#Rails ( #Ruby + ActiveSupport )  + Time.use_zone + travel_to で現地時刻=日本時刻=JSTを固定して UTC 変換結果を見て遊ぶ例

- タイムゾーンの9時間の扱いを一生かかっても覚えられる気がしない
- 足し算と引き算を間違える確率が65%
- Rubyで遊んでいたらだんだん分かってきた気がするけれど
- タイムゾーンに慣れ親しむだけで1週間かかって、3日で忘れる気がした


```rb
require 'active_support/core_ext'

# 日本時間の年始の時間
jst_beggining_of_year = Time.use_zone('Tokyo') { Time.local(2020, 01, 01, 00, 00, 00) }

# travel するために必要
require 'active_support/testing/time_helpers'
include ActiveSupport::Testing::TimeHelpers

# 日本時間の年始に時間を固定する
travel_to jst_beggining_of_year

# 今日の日付は 2020-01-01
Date.current
# => Wed, 01 Jan 2020

# 現在時刻は 2020-01-01 00:00:00 で JST のタイムゾーンも持っている
Time.now
# => 2020-01-01 00:00:00 +0900

# こちらも同じく
Time.current
# => 2020-01-01 00:00:00 +0900

# Time.nowはRubyのclassだがちゃんとtravelできている
Time.now.class
# => Time

# Time.currentはRails=ActiveSupportのclassみたいだがtravelできている
# Time.zone= を指定していない場合は Ruby の Time.now と同じように働く気がしたが合ってるかな
Time.current.class
# => ActiveSupport::TimeWithZone

# Time.zone.now メソッドでは、Time.zoneの指定をしていないので何も得られない
# Time.currentとは扱いが違うみたいだ
Time.zone.now
# NoMethodError: undefined method `now' for nil:NilClass

# Time.zone 指定を日本時間にする
Time.zone = 'Tokyo'
# => "Tokyo"

# 現在時刻は 2020-01-01 00:00:00 で JST のタイムゾーンや曜日も持っている
Time.zone.now
# => Wed, 01 Jan 2020 00:00:00 JST +09:00

# Time.zone.now は ActiveSupport の class を持っている
Time.zone.now.class
# => ActiveSupport::TimeWithZone

# 今日の日付は 2020-01-01だ
# こちらも Ruby ではなく Rails = ActiveSupport のもの
Date.current
# => Wed, 01 Jan 2020

# Time.zone 指定を日本時間にする
Time.zone = 'UTC'
# => "UTC"

# UTCでいうと今日の日付はまだ、前年の年末だ
Date.current
# => Tue, 31 Dec 2019

# 日本時間の年始の0時は、UTCでいうと9時間遅い、年末の15時だ 
Time.zone.now
# => Tue, 31 Dec 2019 15:00:00 UTC +00:00


```


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2775








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【Oracle SQL】テーブル作成後の修正に使えるDDL文

メモ用


# 制約系（UNIQUE, FOREIGH KEY)
### チェック制約


### 外部キー制約
```sql

-- ON DELETE CASCADEなしだと
ALTER TABLE テーブル名1
ADD CONSTRAINT 外部キー名
  FOREIGN KEY (列名1-1)
  REFERENCES テーブル名2(列名2-1)
  -- ON DELETE CASCADE; -- 親テーブルの行が削除される場合、参照している子テーブルの該当行も削除される。
  -- ON DELETE SET NULL; -- 親テーブルの行が削除される場合、参照している子テーブルの該当行は null に更新される。
  -- ON 句なし  参照している子テーブルの該当行がある場合、親テーブルの行を削除できない。
```


### 主キー制約

### 一意制約 (UNIQUE)
```sql
ALTER TABLE テーブル名 MODIFY (列名 UNIQUE);

ALTER TABLE テーブル名 ADD UNIQUE (列名1, 列名2, 列名3, ...);
```

# リネーム（名前変更）

### 
```sql

ALTER TABLE word RENAME COLUMN 作成日 to 作成日時;

-- primary制約を削除
alter table "WORD" drop constraint "WORD_PK";

```


```sql

-- IDをユニークな連番で生成
create sequence word_seq;
ALTER TABLE word ADD (ID NUMBER DEFAULT word_seq.nextval,); 



-- デフォルト値を設定
ALTER TABLE テーブル名 MODIFY (列名 default  SYSTIMESTAMP ) ;

ALTER TABLE dictionary　MODIFY ( 作成日 SYSTIMESTAMP ) ;

alter table dictionary alter column 作成日 TIMESTAMP;

ALTER TABLE dictionary　MODIFY ( 作成日 default  SYSTIMESTAMP ) ;
ALTER TABLE word MODIFY (作成日時 NOT NULL);
ALTER TABLE word MODIFY (ID PRIMARY KEY);



ALTER TABLE dictionary　DROP (作成日) CASCADE CONSTRAINTS;

alter table dictionary add (作成日 TIMESTAMP default SYSTIMESTAMP); 

```
# データ追加

```sql

INSERT INTO テーブル名(
    列名１,
    列名２
) VALUES (
  '列名１の値',
  '列名２の値'
);


```

# 置換

ある任意の列のデータを一斉に置換することができます。(データ移行などで、文字化け対策などに使ったりします。)

```sql

-- GをBに変換する
update <table> set <column> =
replace(<column>, 'G', 'B') where <column>like '%G%
```

# 複製

テーブル複製

```sql

CREATE TABLE New_Table_name AS SELECT * FROM Existing_table_Name; 
```

[oracle - Creating Duplicate Table From Existing Table - Stack Overflow](https://stackoverflow.com/questions/8997399/creating-duplicate-table-from-existing-table)