OmniAICreator/Qiita-1.07M huggingface dataset:
useReducerを使って値を変更する機能を実装[React初心者向け]

## React初心者がハマりがちな穴かも
タスク管理アプリを作成するに当たって、useReducerを使ってState内プロパティの値をいじる関数を作ろうとしたところ、いくつかつまずいた点があり、ググってもあまり情報が無かったので備忘録として残しておきます。（'追加'と'削除'に関しては情報多かったけど'変更'に関しては…）
React初心者の方は参考にどうぞ。
ちなみにuseReducerの使い方を１から説明するような記事ではありません。


### やりたかったこと
以下の画像に手書きで記している箇所をクリックすることで文字列を未完了⇄完了と自由に変更できるようにしたかった。なお今回の場合、**完了or未完了はprogressというプロパティ**で管理しています。
![スクリーンショット 2021-02-06 9.54.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/959339/827a8fa2-1071-1333-efdd-9180a2d24dbf.png)

### 試した方法
少しまわりくどい方法ですが、「'未完了'の場合は'完了'を、'完了'の場合は'未完了'を返す」という方法を取りました。すると最初は以下のようなコードになりました。

```javascript
const tasks = (state = [], action) => {
    switch(action.type) {
      case CHANGE_INCOMP_TO_COMP: // 未完了→完了
      const incompEventID = action.id - 1
      return (
      // console.log(state[incompEventID]) によってオブジェクトの取得は確認済み
      state[incompEventID].progress = '完了'
      )

      case CHANGE_COMP_TO_INCOMP: // 完了→未完了
      const compEventID = action.id - 1
      return (
      // console.log(state[compEventID])
      state[compEventID].progress = '未完了'
      )

      default:
      return state
    }
}
```
console.log(state[compEventID])で目的とするオブジェクトが取得できていることを確認できました。
それならばstate[compEventID].progressに再代入すれば良いだろう、と。
早速yarn startで実行してみました。

ところが。

### state.mapは関数じゃない！？
タスクリストの作成を担っているコンポーネント内で、以下のようなエラーが起こりました。
![スクリーンショット 2021-02-06 10.02.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/959339/a5205762-4060-56a4-4357-5539737a77de.png)
map関数の実行でこのようなエラーが起きた場合、**stateが配列でなくなってしまったことが原因である**と予測できます。

ReactDeveloperToolでstateを確認したところ、**「'未完了'('完了')」**と表示されました。配列どころかオブジェクトですらなくなり、ただの文字列となってしまっていたのです…。

### エラーの原因はスプレッド構文！？
さて、React経験者の方であれば原因はとっくにお気づきのことかと思いますが、Reactにおいてstateの値を直接いじることは原則出来ません。初歩的ですが忘れがちなルールです。

今回実装したのは追加機能でも削除機能でもなく変更機能であったことと、Reducerという慣れない手法を用いたことでハマってしまった初歩的な穴でした。


stateを直接いじれないのであれば、「...state」というスプレッド構文の形で**stateをコピーを取り出せば良いのです。**

修正後のコードが以下となります。

```javascript
const tasks = (state = [], action) => {
    switch(action.type) {
      case CHANGE_INCOMP_TO_COMP: // 未完了→完了
      const Comp = {progress: '完了'}
      Object.assign(
      ...state,
      Comp
      )
      return [...state]

      case CHANGE_COMP_TO_INCOMP: // 完了→未完了
      const Incomp = {progress: '未完了'}
      Object.assign(
      ...state,
      Incomp
      )
      return [...state]

      default:
      return state
    }
}
```
さて、ここでObject.assign()という関数が出てきました。
この関数はオブジェクト同士を結合させる機能を持つものですが、**プロパティ名が被ったときは上書きしてくれる**のです。
この場合、直前に宣言した「Comp(Incomp)」でstate内のプロパティ「progress」を上書きしたということですね。

**これで完了⇄未完了の切り換え機能を実装することが出来ました。**


最後に、先ほどエラーの起こったmap関数は以下のようにリファクタリングしました。

```javascript
return (
    <ul>
      {Array.isArray(state.tasks) && state.tasks.map((task, index) => {
        return (
          <Task key={index} task={task} state={state} dispatch={dispatch}/>
        )
      })}
    </ul>
  )
```
Array.isArray()を使って**「stateが配列であるか」を判定し、trueであれば実行させる**というような形で**map関数を保護**しました。

### 最後に
最後まで読んでいただきありがとうございました。
まだReactを覚えたばかりの駆け出しですので、間違った記載があれば、温かい目でご指摘頂けますと幸いです。

作成中ですが、本アプリケーションのURLは↓になります。
https://task-manegementapp.web.app/

以上です。
【超初心者】SQLの勉強を初めて一週間のアウトプット

## SQLの勉強しようと思った背景
ポートフォリオの作成にRuby（Ruby on Rails）を使用しており、
フレームワーク様が非常に便利なため、DBやSQLを意識せずとも使用ができます。
それはポートフォリオの作成時には便利で助かったのですが、知識が追いついていないと感じ
今後（就職後）のことも考え、勉強を開始しました。


##教材について
今は[こちら](https://www.amazon.co.jp/dp/B07L3MX199/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)の教材を使っています。

![Qiita](https://images-na.ssl-images-amazon.com/images/I/9160JJpexVL.jpg)

プロゲートなどサイトで進めることも考えたのですが、
振り返り辞書的な要素としても使えるように１冊購入しました。


##学習内容

###①SQLの役割
データベースへ指示を出せる翻訳語のようなイメージです。
例えば社員情報を登録しているデータベースがあり、それの一部を取り出したいようなときに
SQLのを使います。
SQLが直接データベースへ指示を出すのではなくDBMS（データベース管理システム）を通して
指示を出します。


### ②４大命令について
４大命令とは
SELECT,DELETE,INSERT,UPDATEの４つが該当します。

②-1 SELECT（選択）

```SQL
# 特定のテーブルからカラムを取得
SELECT カラム名 
FROM テーブル名;

# テーブルから全てのカラムを取得
SELECT * 
FROM テーブル名;
```
テーブル：データベースの表を指します
カラム：テーブルの列の部分　

②-2 DELETE（削除）

```SQL
# 特定のテーブルを削除
DELETE 
FROM テーブル名;

```
この場合テーブル内の全データが削除されます。

###②-3 INSERT（追加）

```SQL
#テーブルに値を追加 
INSERT INTO テーブル名
(カラム名1,カラム名2,カラム名3)
VALUES(カラム名1に追加するもの,カラム名2に追加するもの,カラム名3に追加するもの)
```
該当テーブルの全ての列に値を追加する場合は

```
(カラム名1,カラム名2,カラム名3)
```
の省略は可能です。

###②-4 UPDATE（更新）

```
# 特定のテーブルの値を更新する
UPDATE テーブル名
SET カラム名=変更する値
```


、、と以上が4大命令になります。

ただし、今のままだたと全てのデータの削除、選択、、など
**特定のカラムを選択することができない状態**です。
そこにに**WHERE句**を使用することでできることが大幅に増えていくと思うので
そのあたりを次は勉強していきたいなと思います。
ローカルのCSVデータをWorkbenchを使ってMySQLに登録する方法

`LOAD DATA LOCAL INIFILE`コマンドでローカルのCSVデータをMySQLに登録することができる。

1. CSVデータをアクセス権が付与されていない`C:/temp/`配下に配置する。
2. そのまま実行すると`The used command is not allowed with this MySQL version`と言われることがあるので、その場合は以下を行う
3. Edit Connection > Connection > Advanced > Others に `OPT_LOCAL_INFILE=1`を追加する
4. MySQLにつなぎ直す
5. 以下`LOAD DATA LOCAL INIFILE`コマンドを実行する<br>

```
LOAD DATA LOCAL INFILE '/temp/ファイル名.csv' INTO TABLE スキーマ名.テーブル名;
```



参考サイト：
https://dev.mysql.com/doc/refman/5.6/ja/load-data.html
https://yoku0825.blogspot.com/2020/02/mysql-workbenchload-data-local-infile.html
【Rspec】コントローラーのテストコードで謎のエラーが出た話〜CSSの記述ミス〜

### 解決したいこと
モデルのテストコードが終わり、コントローラーのテストコードを書いていました。
中身を何も書かずに実行し、緑字で全てが通って一安心。
さて中身を書いてチェックしていくぞと始めた矢先の出来事です。


### 発生している問題・エラー



![94e85b18cacefbc4125fff14c50aa91c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887559/2bd2d248-6c15-08a3-e6d5-85ea0f9d605a.png)


```terminal

Failures:

  1) PartiesController GET #index indexアクションにリクエストすると正常にレスポンスが返ってくる
     Failure/Error: <%= image_tag '1.jpeg', class: 'img-fluid', alt: 'Responsive image' %>
     
     ActionView::Template::Error:
       Invalid CSS after "  padding: 20px;0": expected "{", was "}"
     # (sass):10660
     # ./app/views/parties/index.html.erb:10:in `_app_views_parties_index_html_erb__2288480399134122666_70347675772820'
     # ./spec/requests/parties_spec.rb:11:in `block (3 levels) in <top (required)>'
     # ------------------
     # --- Caused by: ---
     # Sass::SyntaxError:
     #   Invalid CSS after "  padding: 20px;0": expected "{", was "}"
     #   (sass):10660
```

`Failure/Error: <%= image_tag '1.jpeg', class: 'img-fluid', alt: 'Responsive image' %>`

このコードはtopページで表示している画像のコードで関係ないもののはずなのに、なぜかここが引っかかる。
テストコードはこんな感じ。


```parties_spec.rb

require 'rails_helper'

describe PartiesController, type: :request do

  before do
    @party = FactoryBot.build(:party)
  end

  describe "GET #index" do
    it "indexアクションにリクエストすると正常にレスポンスが返ってくる" do
      get root_path
      binding.pry
      expect(response.status).to eq 200
    end
    it "indexアクションにリクエストするとレスポンスに投稿済みのpartyの名前が存在する" do
    end
    it "indexアクションにリクエストするとレスポンスに投稿済みのpartyの画像が存在する" do
    end
    it "indexアクションにリクエストするとレスポンスに投稿済みのpartyの開催地域が存在する" do
    end
    it "indexアクションにリクエストするとレスポンスに投稿済みのpartyのジャンルが存在する" do
    end
  end
end
```

`binding.pry`で止まっていない。
indexアクションで並べているものと関係ないものが引っかかっているのはわかったが、どうにも原因が掴めないまま時間が過ぎてしまっていた。
そこでエラー文を読んでみると、CSSがおかしいような表示。
んん？？なんでCSS？？

```terminal
ActionView::Template::Error:
Invalid CSS after "  padding: 20px;0": expected "{", was "}"
```

`padding: 20px;0`
よーく見るとこれがおかしいことに気付く。
「　;　」の後に謎に「　0　」が入っている。ミスタイプだ。
コピーしてVScodeの検索にかけてみると、該当する記述がCSSファイルにあったので0を消して修正。

しっかりテストが通った！
エラーの解消方法の基本はエラー文を読む、というのが未だにきちんとできていないなと痛感。
検索してヒントをもらえたので感謝です。


### 参考にさせていただきました
[CSSの記述が間違っていてエラーが出た話](https://qiita.com/shun915a/items/dbf6637d5ab836546655)

ありがとうございました。
【CircleCI】コミット時にRSpec通す設定個人用メモ(database.yml書き換え無し）

タイトルの通り。githubとの連携は済ませた状態です。初心者が独学とググりまくりで作ったものなのでお手柔らかにお願いします。。

## 環境
Mac OS X
Ruby:　2.7.1
Rails:　6.0.3.4
mysql: 8.0.2

## 実際のコード
```yaml:config.yml
version: 2.1
orbs:
  ruby: circleci/ruby@0.1.2 

jobs:
  build:
    docker:
      - image: circleci/ruby:2.7.1-buster-browsers
        environment:
          BUNDLER_VERSION: 2.1.4
          RAILS_ENV: test

      - image: circleci/mysql:8.0.22
        command: [--default-authentication-plugin=mysql_native_password]
        environment:
          MYSQL_DATABASE: 'rails_practice_test'

    working_directory: ~/myappname

    steps:
      - checkout

      - restore_cache:
          keys:
            - v1-dependencies-{{ checksum "Gemfile.lock" }}
            - v1-dependencies-
      
      - run:
          name: setup bundler
          command: |
            sudo gem update --system
            sudo gem uninstall bundler
            sudo rm /usr/local/bin/bundle
            sudo gem install bundler

      - run:
          name: Which bundler?
          command: bundle -v

      - run:
          name: bundle install
          command: |
            bundle install --jobs=4 --retry=3 --path vendor/bundle

      - save_cache:
          paths:
            - ./vendor/bundle
          key: v1-dependencies-{{ checksum "Gemfile.lock" }}

      - run: mysql_config --socket
      - run: bundle exec rails db:create
      - run: bundle exec rails db:schema:load
      
      - run:
          name: install yarn
          command: |
            curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
            echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
            sudo apt update && sudo apt install yarn

      - run: bin/yarn

      - run: bin/webpack

      - run:
          name: run rspec
          command: bundle exec rspec
```
database.ymlのテスト環境も以下のように少し変える

```yaml:database.yml
test:
  <<: *default
  database: 'rails_practice_test'
  username: <%= ENV.fetch("DB_USERNAME") { 'root' } %>
  port: <%= ENV.fetch("DB_PORT") { hoge } %>
  host: <%= ENV.fetch("DB_HOST") { 'hoge.hoge.hoge.hoge' } %>
```

自分はこれでローカルでもコミット時にもRSpecを走らせることができました。一部の変数は書き換えてるので適宜読み替えてください。

↓以下疑問に思ったことです

「CircleCiを回すときはconfig/database.ymlとconfig/database.ynl.ciを入れ替える必要がある」という記事が多く見られたのですが、これが一般的なのでしょうか？自分が入れ替えなくても通せたので疑問に思いました。


記事を読んでいただきありがとうございました。
Windows10にPyQt5レンダリングのPyMOLをインストールする （2021年2月12日版）

（記事がかなり古くなっていたため、混乱を避けるためにこの記事は削除しました）

https://github.com/cgohlke/pymol-open-source-wheels にWindows用のwhlファイルが置かれています。
【Heroku】アプリを削除する方法

#プログラミング勉強日記
2021年2月12日

#Herokuコマンドを使ってアプリを削除する方法
　Herokuアプリとリモートリポジトリの設定を全て削除する。

```
$ heroku apps:destroy --app アプリ名
// アプリ名をもう一度入力する
```

　上のコマンドではもう一度アプリ名を入力してから削除されるが、下記のコマンドではアプリ名を入力しなくても削除できる。

```
$ heroku apps:destroy --app アプリ名 --confirm アプリ名
```


#サイトからアプリを削除する

##1. Herokuにログインする
　[サイト](https://id.heroku.com/login)からHerokuにログインして、対象のアプリを選択する。


##2. settingタブをクリックする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/f9cfd434-ff96-bb0f-cfe5-37aefe579b8d.png)


##3. Delete Appをクリック
　Settingの一番下にあるDelete Appをクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/8a0d067c-9bd3-3532-9b47-eda0f366611a.png)

##4. アプリ名を入力して実行する
　アプリ名を入力してDelete Appを押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/d87d6275-f777-3721-967d-c2f493c9ed17.png)

##5. GitのリモートリポジトリのHerokuを消す

```
$ git remote rm heroku
```
ドメイン参加サーバを別ネットワークで復元

# やりたいこと
設定変更もある調査のため、ドメイン参加のサーバを一時別ネットワークで復元
別ネットワークにDCも同伴すれば認証は通るが、サーバ単体のみの復元で済ましたい。

# AWSのEC2なら...
ローカル管理者を作成して利用できる。

## 復旧用アカウントの作成
 * awsコンソールで「接続」->「セッションマネージャ」接続
  * SSM エージェント未インストールの場合
    「AWS System Manager」の「フリーとマネージャー」から対象のインスタンスを選んで「インスタンスアクション」から「セッションを開始」を選択
 

## ユーザ追加コマンドの実行

```bash
net user reset-user /random /add
```
 * 作成されたパスワードをメモ

## 管理者グループへ追加
```shell
net localgroup administrators reset-user /add
```

## サーバにアクセス
 * リモートデスクトップをコンソール接続で起動してログイン
 * リモートを管理者権限で開く

  ```
mstsc /admin
  ```

 * 作成した復旧用アカウントでログイン


# 参考
  * https://ap-northeast-1.console.aws.amazon.com/systems-manager/managed-instances
Linux標準教科書　第1章まとめ

# はじめに
エンジニアとして働く上で欠かせないLinuxについて理解を深めたいという思いから、Linux標準教科書を読むことにしました。
ただ読むだけだとなんとなく読んで終わりそうなので、自分なりに追加で調べてみたりまとめてみることにしました。


# Linux標準教科書とは？
Linux標準教科書とは、LPI-JapanがLinux/OSS技術者教育に利用してもらうことを目的として開発し、<strong>無償</strong>で公開されている教材です。

> 基本的なコマンド、正規表現、シェルスクリプト、ファイル管理などLinuxの基礎知識を系統立てて学べるように構成されており、初心者の方が基礎からLinuxを学ぶために最適な内容となっています。本教材は、これまでに20万回以上ダウンロードされ、「授業で使える実践的な教科書」として学校教育、社員教育、個人学習などに広くご利用いただいています。
参考：[Linux標準教科書](https://linuc.org/textbooks/linux/)

[こちらのサイト](https://linuc.org/textbooks/linux/form.php)より、アンケートに答えるとメールアドレスに教科書ダウンロードページのURLとダウンロードコードが送られてきます。

今回は、Linux標準教科書Ver.3.0.2を読みます。

# Linuxの誕生
Linux誕生の前に、Linuxの元になったUNIXというOSがある。
UNIXは1960年代に開発された。送料やメディア代等の経費を支払うだけで自由に利用でき、さらにソースコードを配布していたため、ユーザは独自に研究・開発・変更等を行うことができた。

その結果、`自由に改造できたため、様々な団体や企業によりUNIXが作成されまとまりがなくなってきた。`
この問題を解決するために、開発者はライセンス契約をはじめ、UNIXを管理し始めた。

そんな中、設計の基本はUNIXに似た、あるUNIX互換OSであるLinux開発された。

`Linuxの1番の特徴が、ライセンスの形式。`
LinuxはGPL(GNU General Public License: GNU一般公衆利用許諾)というライセンス形式が採用されていた。

## GPLライセンスについて
オープンソースソフトウェアを開発・配布する際に用いられる代表的なオープンソースライセンス。
下記のような特徴がある。

- プログラムを実行する自由
- ソースの改変の自由
- 利用・再配布の自由
- 改良したプログラムをリリースする権利

> GPL ライセンスが他のライセンスと異なる点としては、GPL ライセンスで公開されているプログラムを改変したり、自らのプログラムの一部として組み込んだ場合のような、派生的・二次的な著作物を作成した場合、派生著作物にも GPL ライセンスの適用を強制する点にあります。
参考：[正しく知れば怖くない GPL ライセンスの特徴](https://yamory.io/blog/about-gpl-license/#gpl-%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9%E3%81%AE%E5%86%85%E5%AE%B9)


そのため、多くのディストリビューターにより開発され、多くのユーザに使われるようになった。

また、このライセンス体系により、一部の個人や組織に独占されることなく全利用者が恩恵を受けて発展させていくことができた。

##  ディストリビューターとは？？
ディストリビューターとは、Linuxディストリビューションを開発する団体のこと。
ディストリビューションは、日本語訳で分配・流通という意味。

つまり、LinuxディストリビューションとはLinuxの配布形態のようなもの。

Linuxディストリビューションを開発する背景としては、Linuxは日々改良が進んでいたが、`当初はLinuxのインストールが非常に困難で、コンピュータスキルの高いユーザしか使うことができなかった。`
そこで、様々な団体がLinuxを使う上で必要なプログラムをまとめ、簡単な手順で手軽にインストールできるようにした。これがLinuxディストリビューションのはじまりである。

代表的なLinuxディストリビューターは、以下の通りです。

- Red Hat
- Fedora
- Debian
- CentOS
- Ubuntu

参考：[Linuxディストリビューションとは](https://www.linuxacademy.ne.jp/lablog/infrastructure/266/)


# 基本ソフトウェアと応用ソフトウェア
ソフトウェアには基本ソフトウェアと応用ソフトウェアに分かれる。

### 基本ソフトウェア
OSのこと。応用ソフトウェアが動作するために必要なもの（各ソフトウェアに共通するもの）を提供したり、ハードウェアを管理する役割がある。

### 応用ソフトウェア
OS上で動くアプリケーションのこと。WordやExcel、PowerPointなど。

## カーネルとユーザランド
基本ソフトウェアはさらに2つの領域に分かれる。それが「カーネル」と「ユーザランド」である。

### カーネル
OSの中核となる部分（メモリ制御とかCPU制御など）。ハードウェアと直接やり取りするなどの中心的な機能を受け持つ部分。
`ハードウェアの違いを吸収して、プログラムがどのようなハードウェア上でも同じように動作する役割がある`

### ユーザランド
OSが動作するのに必要な、カーネル以外の部分。
ファイルシステムやファイル操作コマンド、シェルなど基本的なソフトウェア群を指す。

図でまとめてみると、このようなイメージ。
![スクリーンショット 2021-02-12 15.33.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381376/962e5bde-5ac7-a9f4-e279-9e8a93ddb87a.png)


# まとめ
今回は、Linux標準教科書第一章について読み、自分なりに要約・まとめてみました。
今までなんとなくLinuxはOSなんだなくらいしか知らなかったので、歴史的背景から知ることができとても勉強になりました。

以上
A - F, C - Travel, C - Buy an Integer

2021/2/11
くじかつ、精進内容。

##[A - F](https://atcoder.jp/contests/soundhound2018-summer-qual/tasks/soundhound2018_summer_qual_a)

O(1)

```python:python
a, b = list(map(int, input().split()))
 
if a + b == 15:
  print("+")
elif a * b == 15:
  print("*")
else:
  print("x")
```

##[C - Travel](https://atcoder.jp/contests/abc183/tasks/abc183_c)

計算量はパッと思い浮かばない。。。
順列全探索ですね。

```python:python
import itertools
 
N, K = list(map(int, input().split()))
T = [[] for _ in range(N)]
 
for i in range(0, N):
        T[i] = list(map(int, input().split()))
 
l = [0] * N
for i in range(0, N):
    l[i] = i
 
res = 0
for p in itertools.permutations(l):
    sum = 0
    for i in range(1, N):
        if p[0] > 0:
            continue
        y = p[i]
        x = p[i-1]
        sum += T[x][y]
        if i == N-1:
            sum += T[y][0]
 
    if sum == K:
        res += 1
 
print(res)
```

##[C - Buy an Integer](https://atcoder.jp/contests/abc146/tasks/abc146_c)

O(NlogN)
二分探索

```python:python
import math
import itertools
 
A, B, X = list(map(int, input().split()))
 
left = 0
right = 1000000001
 
while right-left > 1:
    mid = (right + left) // 2
    if A*mid + B*len(str(mid)) > X:
        right = mid
    else:
        left = mid
        
print(left)
```

##まとめ
緑diffは勉強してない分野と判断。
３完走で撤退し余った時間を勉強に当てました。
比較 - テクニカルライティング・クリエイティブライティング

## 動機

テクニカルライティング・クリエイティブライティング の違いを明確に説明した日本語文書が見当たらず。[Difference between Technical Writing and Creative Writing](https://www.geeksforgeeks.org/difference-between-technical-writing-and-creative-writing/) をサマリした。要約すると以下。

### テクニカルライティングとは
- 事実に基づいた分かりやすい内容。
- 特定のトピックについてユーザーに情報を提供し、指導し、教育する。
- 技術論文等、特定の読者が存在する。
- 技術的なトピックについて情報を提供したり、どう行うかについてガイドする。
- 辞書的な意味1: https://en.wikipedia.org/wiki/Technical_writing
- 辞書的な意味2: https://en.wikipedia.org/wiki/Technical_communication / [テクニカルコミュニケーション](https://ja.wikipedia.org/wiki/%E3%83%86%E3%82%AF%E3%83%8B%E3%82%AB%E3%83%AB%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)

### クリエイティブライティングとは
- 想像に基づいた抽象的な内容。
- ユーザーを楽しませたり、インスピレーションを与えたりする。
- 読者対象を制限しない。
- 実際の生活に役立つか、または読者にエンターテイメント性のあるテーマ、メッセージ、道徳や教訓を与える。
- 辞書的な意味: https://en.wikipedia.org/wiki/Creative_writing
 

## 比較

テクニカルコミュニケーションは、特定の受け手に向けて使いやすい情報を作成することを目的とした、ビジネスコミュニケーション。テクニカルコミュニケーターによって作成される情報は、高度な技術的なものからビジネス向けのものまで、またその中間のものまで多岐にわたる。

| テクニカルライティング | クリエイティブライティング |
|:------|:------|
|事実と概念に基づく。 |想像力と創造力に基づく。 |
|事実に基づいたわかりやすい内容。 |想像力と象徴的な内容。 |
|特定の読者・受け手。 |不特定の読者・受け手。   |
|ユーザーに情報を与え、指導し、教育することが目的。 |楽しませ、刺激を与え、鼓舞することが目的。  |
|フォーマルで標準的な文体。 |フォーマルではなく、芸術的な文体。  |
|読者に技術的な話題についての情報を与えたり、何かをする方法についての指示を与える。 |読者にテーマ、メッセージ、道徳や教訓を与え、それが実生活に役立つか、またはいっときの娯楽を与える。 |
|目次、インデックス、ラベル、チャート、写真やグラフのようなテキスト。 |諍いごとから主題設定そして円満解決に至るような物語。 |
|客観的。   |主観的。   |
|専門的。   |一般的。   |
|順序立てて体系的に構成される。   |恣意的で芸術的に構成される。   |
|トピックをより詳しく説明するために、図が含まれる。|トピックにより多くの魅力を与えるために、グラフィックが含まれる。 |
|事実、研究、情報などに依存する。| 作家、ライターの考え方に依存する。 |



## 参考文献
https://www.tech-jpn.jp/wp-content/uploads/2014/08/4-1-7.pdf
[What is Technical Writing?](http://techwhirl.com/what-is-technical-writing/)
[What is Technical Communication?](https://web.archive.org/web/20100524154910/http://www.tcanz.org.nz/Resources/Learn+About+Technical+Communication/Technical+Communication.html)
[40 Foundational Books for Technical Writing](https://idratherbewriting.com/2010/09/10/40-foundational-books-for-technical-writing/)
[Competence Framework for Technical Communication](http://competencies.technical-communication.org/overview.html)
[Stack exchange: good-examples-of-and-practices-in-code-documentation](https://writers.stackexchange.com/questions/12417/good-examples-of-and-practices-in-code-documentation)
[Stack exchange: what-is-the-best-way-to-learn-technical-writing](https://writers.stackexchange.com/questions/5341/what-is-the-best-way-to-learn-technical-writing/7962#7962)
Quora: https://www.quora.com/topic/Technical-Writing
Slackのチャンネルに自作アプリを追加できない

# 事象
問い合わせBOTを追加したいのだが、下図のように「表示する」と表示されてしまっている。
![スクリーンショット 2021-02-12 17.27.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1104729/ed3b5fda-d48b-8257-3e1e-1c531d7f780a.png)


# 解決方法
Slack APIページの自作アプリの「Fearures」→「App Home」画面より
「Always Show My Bot as Online」にチェックを入れた後、Slackを更新させると「追加する」と表示されるようになりました。

![スクリーンショット 2021-02-12 17.31.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1104729/aac4b0cc-60d7-ad81-42ae-43dd02ff353a.png)
PythonのBeautifulSoupを使ったGoogle scholarのスクレイピング（複合検索，引用推移）

# はじめに
Google scholar から論文情報を抽出するツールを作成した。  [[github](https://github.com/tmu-research-project-2020/google-scholar-scraper.git)]
* `citations_trend.py`：キーワードに関する legend, buzz 論文に関する情報を取ってくる
* `conf_scrape.py`：会議に関する論文を100件取ってくる
* `scraping_utils.py`：Google Scholar のスクレイピングを行うために必要なツール

## 環境
Python3
BeautifulSoup
requests
pandas
numpy


## 1. スクレイピングの仕組み
1. url をリクエスト
   * （大量にリクエストすると BAN されてしまうので注意）
   * （重要そうな論文順に、1ページ10件並んでいる）
1. html を BeautifulSoup で解析。論文情報抽出。

獲得可能な論文情報
- 論文タイトル、URL、著者、発行年、引用回数、論文ID、スニペット、年毎の被引用数

## 2. 複合キーワード検索
通常のキーワード検索だと**古い年代の有名な文献**が出てくる  
![machine-translation-only-keyword.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1104699/640463c5-d84a-738c-c48b-7c998919252d.png)


→検索の際に分野に関係のある**キーワード**だけではなく、  
**出版（会議）名**・**論文が公開された年**も指定したい  

---  

**複合条件**（キーワード・出版名・出版年）で検索できるように修正した
1. キーワード、出版名、出版年を入力
1. url をリクエストし、上位100件を検索
1. 論文の情報（タイトル、著者、出版年、引用数、url、スニペット）を抽出
1. csv に出力

## 3. ある論文を引用している論文、引用数の推移
対象論文発行年〜2021年間の年ごとの対象論文引用数を取得
- 引用論文の発行年を取得することで実現

後にでる、レジェンド論文、可視化論文の被引用推移を可視化するために使用

**被引用推移取得までの流れ**
1. 著者、キーワード、出版名、出版年を入力
1. url をリクエストし、上位10件を表示・対象論文を選択
1. 選んだ論文を引用している論文を上位100件検索
1. 論文の情報・各年の引用数の推移を抽出し、csv に出力

## 4. 分野のレジェンド論文・バズ論文を可視化
**分野の初学者**に向けて、読んでおくべき2種類の論文を提案  
- **レジェンド論文**：年代を問わず重要な論文
- **バズ論文**：最近出版され、注目されている論文

---

それぞれ以下のように定義して、**論文情報・引用推移**をスクレイピングした
- レジェンド論文：単純なキーワード検索で上位に来る論文
- バズ論文：キーワード＋出版年の複合検索で上位に来る論文

---

得られた情報を csv に保存し、**Web アプリ上で可視化**を行った [[link](https://gs-visualizer-production.herokuapp.com/)]
![legend-info.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1104699/235c0cef-8fd9-0273-6cea-01c9ae6ec855.png)
![legend-citations.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1104699/67317203-04c9-06f5-e46b-29453ed66c56.png)
sin波を重ね合わせてピアノの音を再現する

#sin波の重ね合わせ
さまざまな周波数のsin波を重ね合わせることで，好きな音を作ることができます．

```sin_sound_synthetic.py
import wave
import numpy as np
from matplotlib import pylab as plt
import struct

a = 1       #振幅
fs = 44100  #サンプリング周波数
f0 = 440    #周波数(ラの音にあたります)
sec = 5     #秒
voice = []

#倍音にあたる部分
a1 = 0.6      #振幅
f01 = 880     #周波数
voice1 = []

a2 = 0.4      #振幅
f02 = 1320    #周波数
voice2 = []

a3 = 0.8      #振幅
f03 = 1760    #周波数
voice3 = []

a4 = 0.6      #振幅
f04 = 2220    #周波数
voice4 = []

a5 = 0.75      #振幅
f05 = 2640    #周波数
voice5 = []


#サイン波を合成
for n in np.arange(fs * sec):
    s = a * np.sin(2.0 * np.pi * f0 * n / fs)  + \
       a1 * np.sin(2.0 * np.pi * f01 * n / fs) + \
       a2 * np.sin(2.0 * np.pi * f02 * n / fs) + \
       a3 * np.sin(2.0 * np.pi * f03 * n / fs) + \
       a4 * np.sin(2.0 * np.pi * f04 * n / fs) + \
       a5 * np.sin(2.0 * np.pi * f05 * n / fs)
    voice.append(s)

#正規化（各要素を最大振幅で割る）
maxvoice = np.max(voice)
maxvoice = np.abs(maxvoice)#絶対値をとる
minvoice = np.min(voice)
maxvoice = np.abs(minvoice)#絶対値をとる

if minvoice < maxvoice:
    voice = voice/maxvoice
else:
    voice = voice/minvoice

#横軸：tは時間方向での離散値です．voiceの長さをサンプルレートで切っているので，サンプル数分の配列になってます．
t = np.arange(0, len(voice))/fs

#サイン波を表示
plt.plot(t,voice)
plt.xlim([0,0.02])#範囲指定0秒〜0.02秒
plt.show()

#サイン波を-32768から32767の整数値に変換(signed 16bit pcmへ)
voice = [int(x * 32767.0) for x in voice]

#バイナリ化
binwave = struct.pack("h" * len(voice), *voice)

#サイン波をwavファイルとして書き出し
w = wave.Wave_write("sin_sound_synthetic.wav")
p = (1, 2, fs, len(binwave), 'NONE', 'not compressed')
w.setparams(p)
w.writeframes(binwave)
w.close()
```
実行は以下のコマンドで

```
$ python sin_sound_synthetic.py
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1101426/e2b4eaaa-8905-3179-b6f4-de9c47e3f238.png)
完成した波形

作業ディレクトリの中に
sin_sound_synthetic.wav
というファイルが生成されているはずです．
どんな音色になっていますか？

参考
https://qiita.com/MuAuan/items/ef4da6167d13cbf56e78
iOS IDFA対応アプリ申請時に必要なApp Privacy


iOS 14.5以降からIDFA(Identifier for Advertising)取得許可ダイアログを表示してユーザーから許可をもらわない限り正しいIDFAが取得できなくなりました。

この機能の実装が完了し、アプリをレビュー用に提出するボタンを押した際に次の警告が出ました。

![Screen Shot 2021-02-12 at 16.30.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8920/59a7bdbb-e6b6-9b46-f80f-1c69950b1f83.png)

> Your app contains NSUserTrackingUsageDescription, indicating that you will request permission to track users. To update this information on your app's product page, you must indicate which data types are tracking users. If this is incorrect, update your app binary and upload a new build to App Store Connect.


`NSUserTrackingUsageDescription`が`Info.plist`にあるのに、App Store Connect側で対応するApp Privacyが選択されていなかったようです。

これを解決するためには、App Privacy > Device IDの質問 "Do you or your third-party partners use device IDs for tracking purposes? (あなたのアプリもしくはサードパーティパートナーはデバイスIDをトラッキング目的で使いますか？)" に対して、"Yes, we use device IDs for tracking purposes (はい、私達はデバイスIDをトラッキング目的で使います)" を選択します。

![Screen Shot 2021-02-12 at 16.55.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8920/4401fa32-9bed-342b-40ea-5b70847a8ef6.png)

そうすると以下の項目がApp Privacyに現れてアプリの提出が可能になります。

![Screen Shot 2021-02-12 at 16.27.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8920/7e2fe124-b6cd-fb7c-da63-f1e94efc6312.png)

![Screen Shot 2021-02-12 at 16.25.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8920/c8e8f96d-0f19-e5d8-0d1f-a189a537d0f5.png)
ESXiに追加した物理nicが認識されない(Realtekのドライバーをインストールする)

ESXiをインストールしたマシンにLANカードを追加して物理nicを増設したらESXiに認識されなかったので、Realtekのドライバーをインストールすることで解決した手順です。


# 環境

- バージョン：ESXi6.7
- 追加したnic：[これ](https://www.amazon.co.jp/gp/product/B07T6CZLTR/)
    - チップセットがリアルテックのRTL8111Gらしい
    - これとは別に認識されて正常に稼働しているnicがある

# 手順

今回は動作しているnicがあるので、ホストマシンにSSH接続して作業を進めます。動作してるnicが別にない場合は[参考](#参考)の1つ目のブログ等で紹介されてる別の手段もあるようです。

## インストール前にホストの状態を確認する
まずは物理nicが認識されていないことを確認してみます。SSH接続して以下を実行すると、ドライバーがない場合追加したnicは出てこないと思います。

```
[root@localhost:~] lspci -v |less | grep "Network controller"
0000:04:00.0 Network controller Ethernet controller: Intel Corporation I211 Gigabit Network Connection [vmnic0]
※ ↑はIntelの認識されているnicだけ表示されている状態
```

ドライバが入っていないことも確認しておきます。以下はインストール後の状態なので表示さていますが、net55-r8168が出てこなければドライバがないことが原因で物理nicが認識されていない可能性があります。net55以外のRealtekドライバーが出てきたときは先にアンインストールが必要な場合もあるようですが、私の場合は何も入っていなかったので、このまま作業を進めます。

```
[root@localhost:~] esxcli software vib list | grep Realtek
net55-r8168                    8.045a-napi                           Realtek  CommunitySupported  2020-12-29
※ ↑はドライバインストール後の状態
```
## ドライバを準備する
Realtekのドライバを以下からダウンロードします。

- https://vibsdepot.v-front.de/wiki/index.php/Net55-r8168
    - ページ下部のDirect Download linksの"VIB File of version 8.045a"からダウンロード
    - zipファイルではなくvibファイルの方をダウンロードすること(後述の手順が微妙に異なるため)

ドライバーをESXiのデータストアにアップロードしてください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/d01b3c32-e2eb-0f91-44e9-93f8e0761111.png)


## ドライバーをインストールする
ドライバーのインストール前にVIB（VMware Infrastructure Bundle）の許容レベルをCommunitySupported（一番低い）にする必要があります。

```
[root@localhost:~]esxcli software acceptance set --level=CommunitySupported
```

ドライバーをインストールします。先ほどデータストアにアップロードしたvibファイルを使います。

```
[root@localhost:~]esxcli software vib install -v /vmfs/volumes/********/net55-r8168-8.045a-napi.x86_64.vib
※ もしダウンロードしたファイルがzipのほうなら"-v"ではなく"-d"になる
※ VIBファイルのパスは自環境に合わせて修正
※ 正常にinstallされればインストール成功の"Message"と"Reboot Required"がtrueになって表示されるはずです。
```

終わったら、ESXiを再起動してください


## 結果確認

私の場合は、上記手順でvmnic1と2の二つが追加で認識されるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/851fb378-490f-6634-4c99-e1b4c92e028c.png)

# まとめ

今回はRealtekのドライバーをインストールすることでESXiに認識されなかった物理nicが認識されるようになりました。別の物理nicが認識されてSSHが使えたので、比較的簡単な手順でしたがどのnicも認識されなかった場合はもう少し面倒な手順になるようです。そもそも、今回のような状況を避けるためにIntel製のものにしておくとESXiでは面倒がないらしいです。



# 参考
1. https://tech-mmmm.blogspot.com/2018/05/realteknicesxi-67.html
2. https://kb.vmware.com/s/article/2137854?lang=ja
Fargateでコンテナ内でタスクのIDを取得する

取得したいケースがあったのでメモ書き

```Ruby
uri = "#{ENV['ECS_CONTAINER_METADATA_URI']}/task"
response = Net::HTTP.get_response(URI.parse(uri))
json = JSON.parse(response.body)
json['TaskARN'].split('/').last
```
メタデータを取得してTaskのARNから抽出している。
環境変数から取得できるようにしてほしい・・・
Chromebookでラズベリーパイのマニュアルインストールディスク作成

### 経緯
ChromeOSでラズパイのインストールディスクを作成する。(Chromebookしか手元になかったので)
WinとMacなら[Raspberry Pi Imager](https://www.raspberrypi.org/software/)使えばいい。
公式の手順が見つかりにくかったので翻訳メモ。

### 用意するもの

- micro sd(32GB over)
- Chrome book

### 手順

([公式](https://www.raspberrypi.org/documentation/installation/installing-images/chromeos.md)翻訳しただけ）

1. [Chromebookリカバリユーティリティ](https://chrome.google.com/webstore/detail/chromebook-recovery-utili/jndclpdbaamdhonoechobihbbiimdgai)をダウンロードします。
2. [Raspberry Pi OS.zip](https://www.raspberrypi.org/software/operating-systems/#raspberry-pi-os-32-bit)ファイルをダウンロードします。
3. リカバリユーティリティを起動します
4. ウィンドウを閉じるアイコンの横にある右上隅の[設定の歯車]アイコンをクリックします。
5. [ローカルイメージを使用]オプションを選択します。
6. ダウンロードした.zipファイルを選択します。
7. SDカードを挿入し、[続行]をクリックします。
8. 警告を読み、[今すぐ作成]ボタンをクリックします。
9. SDをラズパイに差して起動して終わり
AndroidでLocalDateを使おうとしてハマった

AndroidでLocalDateを使いたくて[Java 8+ API の desugar のサポート](https://developer.android.com/studio/write/java8-support#library-desugaring)に従って以下の設定を入れた。

```
compileOptions {
    coreLibraryDesugaringEnabled true
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

dependencies {
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.1'
}
```

そして、ビルドして、実行すると……**クラッシュ！**

なんでかな〜と思ってググっていたら、
https://issuetracker.google.com/issues/157681341
> Could you have a quick go at trying to have the isCoreLibraryDesugaringEnabled enabled just for the **main app module**

と書いてあった。
なるほど、自分が↑の設定を入れたのはaarモジュールだった。
アプリのメインモジュールの方にも同じ設定を入れたら、実行できた！

モジュールを細かく分けてAndroidアプリをビルドしている方はお気をつけを〜
【PHPUnit学習記録】PHPUnitを使用できる環境を整える(composer)

PHPUnitの学習を始めました。
　
今回は、composerを使用して環境構築をしていきたいと思います。(Mac)

下記を参考にさせて頂きました:relaxed::tulip:

PHPUnit導入手順について↓
https://qiita.com/niki-tstk/items/e215806023c6411bb7c1

PHPUnit公式ドキュメント↓
https://phpunit.readthedocs.io/ja/latest/organizing-tests.html

package.jsonについて↓
https://qiita.com/righteous/items/e5448cb2e7e11ab7d477
https://qiita.com/gght/items/f74788c728b33f071e50
http://liberty-technology.biz/PublicItems/npm/package.json.html

　__PHPUnitをインストールする__

　まずはプロジェクトのディレクトリに移動します。

```
$ cd プロジェクトディレクトリ名
```
　下記コマンドでPHPUnitをインストールします。

```
$ composer require phpunit/phpunit --dev
```

　__PHPUnitがインストールされているか確認する。__

```
$ vendor/bin/phpunit --version
```

　下記のような表示が出ていればインストールできています。

```
PHPUnit 9.5.2 by Sebastian Bergmann and contributors.
```

　__composer.jsonファイルを編集する__
　ファイルを開くと以下のような記述がされています。

```
{
    "require-dev": {
        "phpunit/phpunit": "^9.5"
    }
}
```

　そして、何やらエラーが。

```
 Missing property "name".
 Missing property "description".
```
　"name"と"description"を設定しなければならないようです。

　・name→URLやコマンドラインの引数、node_modulesに記述されるディレクトリ名として使われます。
　・description→パッケージの目的を示すための文字列です。 npm search でパッケージを見付けるのに役立つようです。
　
　これについては、下記の記事に詳しく記載されておりますので、オススメです。
https://qiita.com/righteous/items/e5448cb2e7e11ab7d477


　__ディレクトリやファイルを作成する__

　ディレクトリの構成は、以下の通りです。

```
src                                 tests
`-- Currency.php                    `-- CurrencyTest.php
`-- IntlFormatter.php               `-- IntlFormatterTest.php
`-- Money.php                       `-- MoneyTest.php
`-- autoload.php
```

　srcディレクトリに、元のファイルを。(上記の例だと Currency.php、IntlFormatter.php、Money.php)
　そしてtestsディレクトリにテストファイルを作成します。


　これで、ひとまず環境構築が完了です。
　早速コードを書いてテストを実行してみましょう:fist:


　今回の記事の内容に不備等ございましたら、後学の為にご指摘頂けますと幸いです。
Rのscale 関数で標準化

# はじめに（標準化とは）
標準化とはデータの平均が0、標準偏差が1になるように変換すること。実際の操作としてはデータの平均を $\bar{x}$ 、標準偏差を $s$ と置くと、以下の計算をしていることになる。

$$x_{new} = \frac{x-\bar{x}}{s}$$

R で標準化する場合には`scale`関数を使う。

# ランダムで生成した正規分布のデータに対して

平均50、分散が10の正規分布に伴うデータを生成する。

```R:コード
dat <- rnorm(n=1000, mean=50, sd=10)
dat.mean <- mean(dat)
dat.sd <- sd(dat)
print(c(dat.mean, dat.sd))
hist(dat)
```

```:出力
[1] 49.65276 10.17034
```
![R_rnorm_hist.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1077734/542a45a2-9753-72bf-54c4-a7c3e21592a1.png)

これに`scale`関数を適応してみると、

```R:コード
dat.new <- scale(dat) #scale関数で標準化する
dat.new.mean <- mean(dat.new)
dat.new.sd <- sd(dat.new)
print(c(dat.new.mean, dat.new.sd))
hist(dat.new)
```

```:出力
[1] 1.5824e-16 1.0000e+00
```
![R_norm_new_hist.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1077734/8b723ea9-f769-51f9-7eec-3d3a1788f5dc.png)

となり、平均0、標準偏差1のデータになっている。

# おまけ（iris データで標準化）

かの有名なiris dataでも標準化してみる。今回はlabelを無視してすべてのデータを一気に標準化してしまう。

```R:コード
iris.data <- iris[,-5] #Speacies の列を削除
iris.data.mean <- sapply(iris.data, mean)
iris.data.sd <- sapply(iris.data, sd)
print(c(iris.data.mean, iris.data.sd)) #平均と標準偏差を出力

split.screen(figs=c(2, 2)) #四つの図を書く準備
screen(1)
hist(iris.data[,1], xlab=colnames(iris.data)[1])
screen(2)
hist(iris.data[,2], xlab=colnames(iris.data)[2])
screen(3)
hist(iris.data[,3], xlab=colnames(iris.data)[3])
screen(4)
hist(iris.data[,4], xlab=colnames(iris.data)[4])

```

```:出力
Sepal.Length  Sepal.Width Petal.Length  Petal.Width Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
   5.8433333    3.0573333    3.7580000    1.1993333    0.8280661    0.4358663    1.7652982    0.7622377 
```
![R_iris_hist.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1077734/cb7f796e-f7d8-2bc0-eb13-ca58fbfa83c5.png)

これを標準化する。

```R:コード
iris.data.new <- as.data.frame(scale(iris.data)) #標準化+データフレーム化（値がmatrixで返ってくるので。）
iris.data.new.mean <- sapply(iris.data.new, mean)
iris.data.new.sd <- sapply(iris.data.new, sd)
print(c(iris.data.new.mean, iris.data.new.sd)) #平均と標準偏差を出力

split.screen(figs=c(2, 2)) #四つの図を書く準備
screen(1)
hist(iris.data.new[,1], xlab=colnames(iris.data.new)[1])
screen(2)
hist(iris.data.new[,2], xlab=colnames(iris.data.new)[2])
screen(3)
hist(iris.data.new[,3], xlab=colnames(iris.data.new)[3])
screen(4)
hist(iris.data.new[,4], xlab=colnames(iris.data.new)[4])
```
```:出力
 Sepal.Length   Sepal.Width  Petal.Length   Petal.Width  Sepal.Length   Sepal.Width  Petal.Length   Petal.Width 
-4.484318e-16  2.034094e-16 -2.895326e-17 -3.663049e-17  1.000000e+00  1.000000e+00  1.000000e+00  1.000000e+00 
```
![R_iris_hist_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1077734/564b4407-befe-da0b-1f7c-19b41f03e9b2.png)


一回の操作ですべての項目についてまとめて標準化できる。
VSCodeのターミナルからAnaconda Promptを操作したい【Windows】

# 背景
Anacondaを導入してみたけど操作はAnaconda Promptからしかできないらしい。
この状態だと

- VSCodeとAnaconda Promptで2窓するは不便
- 補完機能がうまく動作しない(仮想環境を読み込めない)

などの問題があるのでなんとかVSCodeから操作できるようにしたい。

# 前提

- Windows10
- Anaconda3
- VSCode 

を使用していること

# 解決方法

## Step1．VSCodeにPythonの拡張機能をインストールする
当然入っているものと思いますがとにもかくにも入れておきましょう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672627/b4f109aa-2770-4e1e-5a4e-5d8b4e26a855.png" width=75%>

## Step2．Anaconda Promptのパスを通す
左下の歯車アイコンから「設定」を選択して`terminal.integrated.shell.windows`で検索
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672627/47b83860-8269-f139-d7b3-49e09c30cda9.png" width=75%>
`settings.jsonで編集`をクリック。

`"terminal.integrated.shell.windows"`が空になっていると思うのでここにAnaconda Promptのパスを指定します。
特に設定をいじっていなければ以下と同じパスにあるはずです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672627/31fd7cc5-57c6-b213-dc22-1b8e81089a89.png" width=75%>

## Step3．動作テスト
適当なファイルを開いて``Ctrl + Shift + ` ``でターミナルを開き、`activate <<仮想環境名>>`を実行すれば・・・
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672627/d27619c7-1e9f-f42d-8a40-b7a064ec8e0f.png" width=75%>
`(<<仮想環境名(画像の場合はbase)>>)`が頭につくようになり、仮想環境が動いていることを確認できました。


私の場合はこれだけで解決しましたが参考にした記事では他の方法も取られていたのでうまく行かない場合はそちらも参考にしてみてください。

# 参考

【最新】VSCodeでAnaconda3(Python)を実行する方法(Windows)｜テックダイアリー
https://tech-diary.net/vscode-anaconda3-python/

Visual Studio Code のターミナルから Anaconda Prompt を開くようにする (Windows)
https://qiita.com/_meki/items/5b4f06318f1a0986c55c
【github actionsで自動デプロイ】Docker環境でRspecを実行し、EC2へデプロイ！！

未経験からエンジニアに転職を目指しています。

本日githubactionsでDocker環境を構築し、Rspecを実行することが出来たので備忘録として投稿します。
少しでもお役に立つことができれば幸いです。
※github actionsを用いたDocker環境構築は以下の記事を参考にさせて頂きました。
https://codelabo.com/posts/20201128164634

#前提
- rails 5.2.4(rails6.0以降の場合はおそらく動作しないです)
- dockerを用いて開発をしている
- docker-composeを使用している
- 本番環境にはrbenvを使用している  
※上記を満たしていても、動作しないことがあるかもしれませんがご容赦ください  

#rails.yml

```ruby:rails.yml
name: Rails CI/CD

on:
  push:
    branches: [処理を実行するためのトリガーにしたいブランチ名]
              #例 masterとした場合はmasterに変更が加わった際に処理が実行されます

jobs:
#rspecの実行
  rspec: #名前は何でも良いです
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Setup docker
      shell: bash
      run: |
        docker-compose build
        docker-compose run web rails db:create
      env:
        RAILS_ENV: test
    - name: Rspec
      run:  |
        docker-compose run web bundle exec rspec
      env:
        RAILS_ENV: test
#ここからデプロイ
  build:
    runs-on: ubuntu-latest
    needs: rspec #ここは上記の任意につけた名前が入ります。Rspec実行が完了しない限り、デプロイが走らないようにしています。並列で処理を実行したい場合はこの行は削除してください。
    steps:
    - uses: actions/checkout@v2
    - name: Deploy
      env:
        PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }}
        USER_NAME: ${{ secrets.USER_NAME }}
        HOST_NAME: ${{ secrets.HOST_NAME }}
      run: |
        echo "$PRIVATE_KEY" > private_key && chmod 600 private_key
        ssh -o StrictHostKeyChecking=no -i private_key ${USER_NAME}@${HOST_NAME} 'cd あなたのアプリ名 &&
        git pull origin Pullしたいブランチ名 &&
        ~/.rbenv/shims/bundle install &&
        ~/.rbenv/shims/bundle exec rails assets:precompile RAILS_ENV=production &&
        ~/.rbenv/shims/bundle exec rails db:migrate RAILS_ENV=production &&
        if [[ -e tmp/pids/puma.pid ]];then kill $(cat tmp/pids/puma.pid); echo kill puma process;fi &&
        ~/.rbenv/shims/rails s -e production'
```

#最後に
開発にはdockerを用いたものの、dockerイメージをECR,ECSにデプロイする方法がわからず、
デプロイは通常の方法で行いましたが、ようやくdockerの恩恵を感じることが出来た気がします！笑

ただ、上記の方法では毎回コンテナをビルドし直すため、デプロイに時間がかかってしまう・・・
そのため、dockerのキャッシュをもたせる方法を模索中です！（わかる方いらっしゃれば教えて下さい）

以上です！最後まで読んでいただきありがとうございました！
【オラクルクラウド】オートノマスDBの構築方法

DB構築がこんなに簡単!!

## 今回やること
- オラクルクラウドでオートノマスDB（ADW）を作成します。

## 前提条件
- Oracle Cloud Infrastructureを利用できる状態になっていること

## ADWの構築手順

- ホームメニューから『Autonomous Data Warehouse』をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064900/60b4c026-1efa-d2c0-5390-30aba983fc1f.png)

- 『Autonomous Databaseの作成』をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064900/eb27ff32-6afb-0961-9d41-61aefe177f5b.png)
- Autonomous DBには2種類あります
データウェアハウス（分析用途）
トランザクション処理（分析以外の用途）
今回はデータウェアハウスを選択します

- デプロイタイプには2種類あります
共有インフラストラクチャ（仮想マシン）
共有インフラストラクチャ（専有マシン）
今回は共有を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064900/0d05a887-0531-8bee-beda-e5e3f611e0e6.png)

- Always Free
完全無償で利用可能なオラクルクラウドのサービスです
- 自動スケーリング
リソースが不足した場合、自動でコア数を増やす機能です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064900/3aabb60e-e9b1-e20e-225c-1831344e9183.png)


- ライセンスタイプ

オラクルライセンスをクラウドへ持ち込みが可能です。
「Autonomous Databaseの作成」をクリック 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064900/1d812072-03a1-924d-6263-84fa24db3197.png)

## ステータスが緑に変わったら構築完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064900/876ceea2-ad2f-7bb5-445d-cf430b8e5914.png)
Google Translate API token generator

###python

https://www.github.com/ssut/py-googletrans/tree/master/googletrans%2Fgtoken.py

https://py-googletrans.readthedocs.io/en/latest/

tts tk
https://pypi.org/project/gTTS-token/

[https://gtts.readthedocs.io/en/latest/](https://www.github.com/Boudewijn26/gTTS-token/tree/master/docs%2Fnovember-2020-translate-changes.md)

###javascript

https://www.npmjs.com/package/google-translate-token

tts
https://flows.nodered.org/node/google-translate-tts

### emacs googletranslate
Emacs interface to Google Translate aka atykhonov google-translate
tk issue
https://github.com/atykhonov/google-translate/issues/52

### reference
david loves coffee
google-translation-api-hacking
https://vielhuber.de/en/blog/google-translation-api-hacking/

###Heroku server
not work 2021
https://github.com/guyrotem/google-translate-server

### stackoverflow
https://stackoverflow.com/posts/40078546/revisions

### other type
https://github.com/lushan88a/google_trans_new
結合テストコードで出会ったエラー

はじめまして、今回が初投稿です。  

現在オリジナルアプリを作成していて、結合テストコードを行っています。  
学習期間中結合テストコードの学習をしましたが、作成するアプリに記述するのは初めてなので  
手こずってしまいました。  
忘れないためにも、投稿したいと思います。  

手こずったのは、新規登録のユーザー情報を入力するテストコードです。  
初めに記述したコードがこちらです。

```
fill_in "メールアドレス", with: @user.email
fill_in "パスワード（半角英数混合6文字以上）", with: @user.password
fill_in "パスワード再入力", with: @user.password_confirmation
fill_in "プロフィール写真", with: @user.image
```

これは、新規投稿フォームにFactoryBotで生成した、情報を入力している記述です。
こちらを記述しターミナルから、

```
bundle exec rspec spec/system/users_spec.rb
```

を行ったところ

```
 1) Users 新規登録 新規登録できる時 正しい情報が登録できれば新規登録ができてトップページに遷移する
  Failure/Error: fill_in "パスワード（半角英数混合6文字以上）", with: @user.password
     
  Capybara::Ambiguous:
  Ambiguous match, found 2 elements matching visible field "パスワード（半角英数混合6文字以上）" that is not disabled

```

こちらのエラーが現れました。
これは、いろんな要素が重なってしましどれかわからない！！
みたいなエラーとのことでした。
なので、最初のものを選んであげるようにすれば、解決できるとのことでした。

```
fill_in "メールアドレス", with: @user.email
fill_in "パスワード（半角英数混合6文字以上）",match: :first, with: @user.password
fill_in "パスワード再入力", match: :first, with: @user.password_confirmation
fill_in "プロフィール写真", with: @user.image
```

最初のものを選んで上げるようにするには、match: :firstをつけてあげればいいとのことでした。

これで、解決！！
と思ったのですがその後に

```
Capybara::ElementNotFound:
Unable to find field "プロフィール写真" that is not disabled
```

とエラーが現れました。
要するに、写真の添付の仕方の記述が違ったようです。
私は、FactoryBotに記述した

```
after(:build) do |user|
        user.image.attach(io: File.open('public/images/test_image.png'), filename: 'test_image.png')
end
```
この記述を使えると思ったのですが、そうではなかったそうです。

```
fill_in "メールアドレス", with: @user.email
        fill_in "パスワード（半角英数混合6文字以上）",match: :first, with: @user.password
        fill_in "パスワード再入力", match: :first, with: @user.password_confirmation
        attach_file "user[image]", "public/images/test_image.png"
```

この記述に直したところ上手くいきました。

以上が今回手こずってしまったエラーになります。
初投稿で色々と不手際があるかもしれませんが、何かございましたらコメントお願いいたします。
Raspberry Pi Pico を有線LANにつないで通信する

Raspberry Pi Picoは激安で素晴らしいのですが、通信機能がありません。Wi-FiもBluetoothもないので、せいぜいUART機能を使って、PCとRS-232Cで通信するくらいしかできません。安いのでとりあえず買ってはみたけど、使い道が思いつかないという声を聞きます。センサーで読み取った値をサーバーに送るくらいのことはしたいので、通信機能がほしいです。

本記事では、Raspberry Pi PicoにENC28J60というLANコントローラーを接続して、UDPパケットを送受信し、NTPサーバーから日時のデータを取得します。

###### ▼全体像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61222/adc4a8cc-de91-cfcc-85f0-cf39ca4f8e95.png)

プログラムは、10年くらい昔にATmega328PでENC28J60を制御したときのコードを再利用しています。

###### ▼昔作ったやつ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61222/92ce0800-5a06-3290-1d91-d805816696bf.png)

ENC28J60は高機能なLANコントローラーではありませんので、TCP/IPの様な高度な機能は搭載されていません。イーサネットの生パケットを送受信することしかできません。上位のプロトコルはホストのマイコン側に実装します。少なくとも次のような機能がRaspberry Pi Pico側に必要です。

- ARP…IPアドレスからMACアドレスを問い合わせる。および応答する
- DHCPクライアント…ルーター等からIPアドレスを割り当ててもらう
- リゾルバ…インターネットホスト名をDNSサーバに問い合わせてIPアドレスを得る
- パケット通信…UDPパケットをイーサネットフレームの中に入れて送受信する

本記事ではNTPサーバに問い合わせして、データを取得するだけなのでUDP通信を使います。もし、ウェブサーバーなどを作りたかったら、TCPの通信機能を実装する必要があり、かなり大がかりなプログラムになってしまいますので、TCPは本記事では扱いません。今後の挑戦課題となっています。

動画は次のツイートにあります
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/RaspberryPiPico?src=hash&amp;ref_src=twsrc%5Etfw">#RaspberryPiPico</a> とENC28J60で、有線LAN接続でNTPサーバから日時を取得するのできた！ <a href="https://t.co/eUOHTR7rFQ">pic.twitter.com/eUOHTR7rFQ</a></p>&mdash; そらみみ (@soramimi_jp) <a href="https://twitter.com/soramimi_jp/status/1359912208172347396?ref_src=twsrc%5Etfw">February 11, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

###### ソースコード
https://github.com/soramimi/pico-ntpclock

ENC28J60とホストのマイコンはSPIで通信します。クロック（SCK）は平常時はLowレベルで、立ち上がりエッジで信号線の読み書きを行うというフォーマットなので、次のフォーマット指定が必要でした。これに気付くまで数時間はまりました。

``` .c
spi_set_format(SPI_PORT, 8, SPI_CPOL_0, SPI_CPHA_1, SPI_MSB_FIRST);
```
AWS SAAを取得するにはこれをしろ！

2021年2月にAWS認定ソリューションアーキテクトアソシエイトを受験し、合格致しました。
合格するために、してきた勉強方法を書いていきたと思います。

##勉強期間
2020年12月末~2021年２月上旬までの約1ヶ月半ほどです。

##使用した教材（必ずこれだけはしておけ！)
1,この１冊で合格！　AWS認定ソリューションアーキテクト - アソシエイト テキスト&問題集

![51yzU9MI8WL.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629294/3845b9d0-29b4-27cd-0ada-2d7a0e7d7b07.jpeg)

この教材で、AWSの基礎を覚えます。しかし、この教材だけでは合格するには足りないと思います。(40~60%ほどしか得点できない)

2,AWS WEB問題集
https://aws.koiwaclub.com/

WEB問題集で、本番のテスト相当の問題を解いて基礎+応用力を鍛えます。
SAAの問題集は、#1~#143まであります。
私が解いた感じでは、#1〜79(基礎)#80~#143(テスト相当)に別れているように感じました。
WEB問題集の中の合格体験記にもあるように、#80~#143を2,3周してある程度解けるようになればもう合格できると思います。


##より合格を確実にするために
1,AWS公式模擬試験
https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/
2000円で、10問出てきます。本番相当の問題ですが、WEB問題集と同じくらいの問題なので、必須ではないと思います。

2,AWSサービス別資料
https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/
本番の試験は、ELBやCloudFrontが多く出たので、その資料を見とくのはありかもしてません。(問題は人によって違うと思いますが)

##最後に
SAAは、アソシエイトの資格の中で一番難しいと思います。
今後は、他の資格も取って行きたいと思います。
linuxとかMacでN日前の日付を文字列で取得する方法メモ

linuxでN日前の日付を文字列で取得する方法メモ
(Macの場合も以下の方法でしかできなかった。なぜ、、)

> 古いUNIX系の場合
一時的にタイムゾーンを設定して対応する。
※日本時間は世界標準時間 GMT (≒UTC) より9時間早いので、
　1日前 (24時間前)なら -9+24=15 をタイムゾーンに設定
　1日後 (24時間後)なら -9-24=-33 をタイムゾーンに設定
>
```
$ date +"%Y%m%d"
20090609
$ env TZ=JST-33 date +%Y%m%d
20090610
$ env TZ=JST-153 date +%Y%m%d
20090615
$ env TZ=JST+15 date +%Y%m%d
20090608
$ env TZ=JST+159 date +%Y%m%d
20090602
```

間に`/`をいれる事も可能

```
$ env TZ=JST-33 date +%Y/%m/%d
2021/02/13
```

# 参考
[dateコマンドで○日前の日付を取得する](http://mrgoofy.hatenablog.com/entry/20090609/1275123686)
[dateコマンドでバックアップファイル作成時にファイル名に日付_時間を付ける (LinuxとWindows用)](https://qiita.com/na0AaooQ/items/c26b637261d9962f981f)
Git 個人開発メモ　developブランチで修正する

個人開発における私の現在のGitの使い方を解説する。

機能の修正をしたいときに、コードを弄るのはmaster or mainブランチでは一切行わずに、
`developブランチ`を作成して、毎度コードの修正を行っている。

開発にあたってまず、

```terminal
git branch develop
```

で`developブランチ`を作成する。

その後にコーディングを進める。

その後に場合に応じて私は二通りのことをする。

##修正できたとき
`developブランチ`で開発を行い、修正がうまくできたなら、

```terminal:develop
git add .
git commit -m 'メッセージ'
git switch main
```

```terminal:main
git merge develop
git push 
git branch -d develop
```

この流れでコマンドを打っている。

developブランチでaddとcommitをし、
mainブランチへ移動して、mergeを行い、
GitHubへプッシュして、
最後にdevelopブランチを削除する。

##修正を取り消したいとき
`developブランチ`で開発行っているが、うまくいかなかったりや、やっぱり修正前のコードに戻したいって時は、

```terminal:develop
git add .
git commit -m '修正を取り消します'
git switch main
```

```terminal:main
git branch -D develop
```

これで開発用の`developブランチ`を強制的に削除することができる。
ポイントは、ブランチを強制的に削除する時は `-D`オプションを使用する。
gitで指定日時からのcommit件数を取得する

`2021/01/25`からのgit commit件数を表示するには以下でOKのようだ

```
$ git log --after '2021/01/25' --oneline | wc -l
27
```

```
NUM=`git log --after '2021/01/25' --oneline | wc -l`
echo ${NUM}
```

# 参考
[git log よく使うオプションまとめ](https://qiita.com/take4s5i/items/15d8648405f4e7ea3039)
[git log で特定の期間のログだけを出力する方法](https://gotohayato.com/content/490/)
[コミットの履歴を表示する (git log) [Git]](https://site-builder.wiki/posts/1158)
sin波から音声ファイルを作る


#

```sin_sound.py
import wave
import numpy as np
from matplotlib import pylab as plt
import struct

a = 1     #振幅
fs = 44100 #サンプリング周波数
f0 = 440  #周波数(ラの音にあたります)
sec = 5   #秒
voice=[]

#サイン波を生成
for n in np.arange(fs * sec):
    s = a * np.sin(2.0 * np.pi * f0 * n / fs)
    voice.append(s)

#横軸：tは時間方向での離散値です．voiceの長さをサンプルレートで切っているので，サンプル数分の配列になってます．
t = np.arange(0, len(voice))/fs

#サイン波を表示
plt.plot(t,voice)
plt.xlim([0,0.01])#範囲指定0秒〜0.01秒
plt.show()

#サイン波を-32768から32767の整数値に変換(signed 16bit pcmへ)
voice = [int(x * 32767.0) for x in voice]

#バイナリ化
binwave = struct.pack("h" * len(voice), *voice)

#サイン波をwavファイルとして書き出し
w = wave.Wave_write("sin_sound.wav")
p = (1, 2, fs, len(binwave), 'NONE', 'not compressed')
w.setparams(p)
w.writeframes(binwave)
w.close()
```

実行は以下のコマンドで行います．

```
python sin_sound.py
```

作業ディレクトリの中に
sin_sound.wav
というファイルが作成されているはずです．
再生してみてください．


参考
https://qiita.com/MuAuan/items/ef4da6167d13cbf56e78
Django Rest Framework（DRF）とVuetifyを使って，csvファイルを読み込ませる

## はじめに
この記事ではDjango Rest Framework（DRF）とVuetifyを使って，csvファイルをバックエンド側で読み込ませる流れを記載します．これをやろうと思った時に少しつまづいたのでその備忘録です．



## Vuetify側

```html
<v-form type="submit">
<v-file-input  @change="onChange($event)"></v-file-input>
<v-btn @click="Submit()">
</v-form>
```


* <v-file-input  @change="onChange($event)"></v-file-input>でファイルを読み込むことができます．ファイルを挿入すると$eventの中身に格納されます．読み込んだら下の感じで見れます．

* 通常のinput type="file"でやる方法で下の中身を出力するにはevent.target.files[0]を記載します．

![スクリーンショット 2021-02-12 15.47.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460757/b0588923-b86b-1a8c-c80f-53c9af092164.png)

script側の記載方法は以下の通りです．

```javascript
data(){
return {
  file:""
}}
methods:{

onChange(event){
console.log(event);
this.file = file;
},
 async Submit() {
      const formData = new FormData();
      formData.append("file", this.file);
  
        await this.$axios.post("test/", formData)
        .catch(error => {
          return error.response;
        });
     
    }
  }
```


* onChangeでファイルが入力されたのを確認しています．this.fileでファイル情報を格納．

* test.csvの中身を確認したいときはFileReaderのオブジェクトが必要となるので，別途作成する必要があります．

* buttonがクリックされたらSubmitが発火．ファイル情報はFormDataで格納します．

## DRF側

```python
import  pandas as pd
from rest_framework.decorators import api_view
from rest_framework.response import Response

@api_view(["POST"])
def api_view(request):
    if request.method == "POST":
        print(pd.read_csv(request.data["file"]))
        return Response(request.data,status=status.HTTP_200_OK)

```

* バックエンド側でapi_viewのurlを作成し，そこにPOSTをします．その上でpd.read_csv()をするとcsvの中身をバックエンド側で読み込むことが容易にできます．

## 終わりに
今回はvuetifyの機能でファイルを読み込むことをしてみました．
Laravelで migrationsを使用しないでDB作ったら躓いた話

Larabel-admin のコントローラを設定し、モデルも作成し、画面フローができたものの、一覧がいつまでたっても表示されない現象に悩まされたのでメモです。

#現象
Larabel-admin にて、新規登録より項目を入力し「送信」クリックで「保存しました」と出るものの、一覧が表示されませんでした。
最初は、登録がされていないのでは？と思い、Laravel-adminの記述法などを確認してみましたが、原因が一向にわかりませんでした。
ふと、DBを直接参照してみたところ、データが格納されていることに気が付きました。登録はできるのに、参照ができないという状態を不思議に思いました。

#紆余曲折
EloquentModelの書き方が怪しいのでは？と、テーブル名を変えてみたりいろいろ試したものの、解決できませんでした。
次にEloquentModelを通さず、DBファサードから取得を試しみたところ取得ができました。頭の中が「？？？」で埋まりました。
また、EloquentModelの書き方などを調べました。

#原因
うまくいってるテーブルと新しく作ったテーブルの違いを比較しました。
結果的にtimestampにdefault値が入っていたのが問題でした。
timestampにdefault値が入ると何が問題だったかというと、deleted_atに現在の時間が入ってしまうため、soft delete が効いてしまっていました。
すべての疑問が解決しました。

#結論
素直にmigiration を使えばよかったなと思いました(´∇｀)ｿﾚﾅ

一応直接でも、　 timestamp NULL default NULL とすれば、NULLでテーブル作成できることは確認しました。