OmniAICreator/Qiita-1.07M huggingface dataset:
リストのコピー

```python
i = [1, 2, 3, 4, 5]
j = i
j[0] = 100
print('j = ', j)
print('i = ', i)

x = [1, 2, 3, 4, 5]
y = x.copy() # y =x[:]と書いても同じ処理が行えるがわかりにくいので推奨しない 
y[0] = 100
print('y = ', y)
print('x = ', x)
```
出力
j =  [100, 2, 3, 4, 5]
i =  [100, 2, 3, 4, 5]
y =  [100, 2, 3, 4, 5]
x =  [1, 2, 3, 4, 5]

```
X = 20
Y = X
Y = 5
print(Y)
print(X)

X = [ 'a', 'b']
Y = X
Y[0] = 'p'
print(Y)
print(X)
```
5
20
['p', 'b']
['p', 'b']
nokogiriを更新したらRubyを実行するたびに「Ignoring」と毎回怒られるようになった

nokogiriを更新すると毎回このようにIgnoringが出てくるようになった。


```
Ignoring childprocess-2.0.0 because its extensions are not built. Try: gem pristine childprocess --version 2.0.0
Ignoring childprocess-1.0.1 because its extensions are not built. Try: gem pristine childprocess --version 1.0.1
Ignoring ed25519-1.2.4 because its extensions are not built. Try: gem pristine ed25519 --version 1.2.4
Ignoring escape_utils-1.1.1 because its extensions are not built. Try: gem pristine escape_utils --version 1.1.1
Ignoring ffi-1.11.3 because its extensions are not built. Try: gem pristine ffi --version 1.11.3
Ignoring ffi-1.11.2 because its extensions are not built. Try: gem pristine ffi --version 1.11.2
Ignoring ffi-1.11.1 because its extensions are not built. Try: gem pristine ffi --version 1.11.1
Ignoring ffi-1.11.0 because its extensions are not built. Try: gem pristine ffi --version 1.11.0
Ignoring ffi-1.9.25 because its extensions are not built. Try: gem pristine ffi --version 1.9.25
Ignoring ffi-1.9.23 because its extensions are not built. Try: gem pristine ffi --version 1.9.23
Ignoring ffi-1.9.18 because its extensions are not built. Try: gem pristine ffi --version 1.9.18
Ignoring greenmat-3.2.2.4 because its extensions are not built. Try: gem pristine greenmat --version 3.2.2.4
Ignoring json-2.2.0 because its extensions are not built. Try: gem pristine json --version 2.2.0
Ignoring json-1.8.6 because its extensions are not built. Try: gem pristine json --version 1.8.6
Ignoring kgio-2.11.3 because its extensions are not built. Try: gem pristine kgio --version 2.11.3
Ignoring kgio-2.11.2 because its extensions are not built. Try: gem pristine kgio --version 2.11.2
Ignoring msgpack-1.3.1 because its extensions are not built. Try: gem pristine msgpack --version 1.3.1
Ignoring msgpack-1.3.0 because its extensions are not built. Try: gem pristine msgpack --version 1.3.0
Ignoring msgpack-1.2.10 because its extensions are not built. Try: gem pristine msgpack --version 1.2.10
Ignoring msgpack-1.2.6 because its extensions are not built. Try: gem pristine msgpack --version 1.2.6
Ignoring msgpack-1.2.4 because its extensions are not built. Try: gem pristine msgpack --version 1.2.4
Ignoring mysql2-0.5.1 because its extensions are not built. Try: gem pristine mysql2 --version 0.5.1
Ignoring mysql2-0.4.10 because its extensions are not built. Try: gem pristine mysql2 --version 0.4.10
Ignoring mysql2-0.3.20 because its extensions are not built. Try: gem pristine mysql2 --version 0.3.20
Ignoring mysql2-0.3.18 because its extensions are not built. Try: gem pristine mysql2 --version 0.3.18
```

# 解決策
`gem pristine --all`
を複数回、Igonorが消えるまで実行する。

途中でmysqlに関するエラーがでたが、アンインストールし、再インストールすると解消された
PC搭載Webカメラの画像をOpenCVから読み込む

# 環境
* Windows 10
* Python 3.8
* pip
* numpy

# インストール
`pip install opencv-contrib-python`
pythonインタプリタ上から`import cv2` が通ればインストール成功

# サンプルコードの実行
参考　
https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_video_display/py_video_display.html

注意：閉じるボタンではなく'q'キーで抜ける

```python
import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Our operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Display the resulting frame
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
```

##やっていること
```
cap = cv2.VideoCapture(0)
```
cv2.VideoCaptureクラスのインスタンスを取得。インデックス０を指定するとPC搭載カメラになるらしい

```
    # Capture frame-by-frame
    ret, frame = cap.read()
```
無限ループ内でさっきとったcapインスタンスに対し readメソッドを実行
retには取得できたかの True/Falseが、frameにはnumpy.ndarrayが返ってくる
このframeに対して画像処理等をする

```
    # Our operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
```
さっきとってきたframeに対してcv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)とすると色の変換ができる。ここではグレイスケールにしている
他にも cv2.COLOR_BGR2HSV(輝度)などある

```
# Display the resulting frame
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
```
cv2.imshow()という関数で'frame'というウィンドウに、gray(配列)を入れて表示する
cv2.waitKey(1)は1 ms表示している間キー入力を待ち受け、取得結果を0xFFでマスクして
'q'と入力されていたら無限ループを抜ける


# 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298745/4542d988-df0d-e2a2-bc64-5c35445a1e35.png)
HerokuのDBを操作する方法

## はじめに
この記事ではHerokuにデプロイしたアプリのDBを、ローカルから参照する方法を解説します。
前提として、PCにHerokuをインストールしていることと、Herokuにアプリをデプロイしている必要があるため、それらの作業がまだ出来ていない人は以下の記事を参考にして設定を終わらせておきましょう。
https://qiita.com/ysda/items/5719c894254aa898aed1

## この知識が役立つ場面
・本番環境でのみバグが起こっている
本番環境のDBに入っている何らかのデータが原因という場合もあります。
こういう時に、本番のDBを参照して確認してみましょう。

・卑猥な言葉や差別用語が投稿されてしまった
アプリをデプロイすると誰がどんなデータを作るかわかりません。
ブログアプリを例にすると、いつの間にか卑猥な言葉や差別用語の含まれた記事が作られる可能性があるわけです。そんな物をポートフォリオとして公開する訳にはいきません。
記事の削除機能を作っていなかった場合、削除機能を実装してデプロイして削除...という手間が発生しますが、DBを直接操作する手順を覚えておけば、迅速に不適切なデータの削除を行えます。


## PostgreSQLのインストール
まずはheroku上のPostgreSQLのバージョンを確認します。
以下の例ではバージョンが12となっているので、ローカルのPCにバージョン12をインストールします。

```
% heroku pg -a アプリ名
=== DATABASE_URL
Plan:                  Hobby-dev
Status:                Available
Connections:           0/20
PG Version:            12.2
Created:               2020-04-30 02:57 UTC
Data Size:             8.8 MB
Tables:                6
Rows:                  29/10000 (In compliance)
Fork/Follow:           Unsupported
Rollback:              Unsupported
Continuous Protection: Off
Add-on:                postgresql-convex-63450
```

以下のリンクからでPostgreSQLをダウンロードし、dmgファイルを開いてインストールしましょう。
https://postgresapp.com/downloads.html
![スクリーンショット 2020-05-14 18.13.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/a0074940-afa2-ad0b-e45e-ed8421f6d26e.png)

これでDBを操作できるようになります！さっそくテーブルの一覧を表示してみましょう。

```
% heroku pg:psql -c "\d"           

--> Connecting to postgresql-flexible-70379
                     List of relations
 Schema |         Name         |   Type   |     Owner      
--------+----------------------+----------+----------------
 public | ar_internal_metadata | table    | xxeikjppyexwuj
 public | posts                | table    | xxeikjppyexwuj
 public | posts_id_seq         | sequence | xxeikjppyexwuj
 public | schema_migrations    | table    | xxeikjppyexwuj
 public | users                | table    | xxeikjppyexwuj
 public | users_id_seq         | sequence | xxeikjppyexwuj
(6 rows)
```

SQL文は以下のコマンドで打てるようになります。

```
% heroku pg:psql -a アプリ名
```

select文を実行してみましょう。(SQL文の末尾にセミコロンをつけないと実行されないので注意)

```
アプリ名::DATABASE=> select * from posts;
 id |    title     |          content          |         created_at         |         updated_at         | user_id 
----+--------------+---------------------------+----------------------------+----------------------------+---------
  2 | テストその２ | ourblogのテストその２です | 2020-05-13 15:49:47.069074 | 2020-05-13 15:49:47.069074 |       2
  3 | テスト吉田   | 吉田ユーザーでのテスト    | 2020-05-13 15:50:19.990057 | 2020-05-13 15:50:19.990057 |       1
  4 | あああああ   | おおおおおお              | 2020-05-13 15:50:27.940949 | 2020-05-13 15:50:27.940949 |       1
  1 | テスト編集後 | ourblogのテスト編集後     | 2020-05-13 15:49:30.594094 | 2020-05-13 16:34:25.282793 |       2
(4 rows)
```

DBの操作を終了してターミナルに戻りたい時はquitで戻れます。

```
アプリ名::DATABASE=> quit
```
uniqueness: scope を使ったユニーク制約方法の解説

#uniqueness: scope を使ったユニーク制約方法の解説

uniqueness: scopeを利用して一意性検証をする方法について解説します。

## 目次
* [動作環境](#動作環境)
* [実装例](#実装例)
* [解説](#解説)
* [複数のscope](#複数のscope)
* [データベース側の制約](#データベース側の制約)
* [おわりに](#おわりに)

---------------------------------------
## 動作環境
`OS : macOS Mojave 10.14.6`
`ruby : 2.6.3p62`
`rails : 5.2.4`


##実装例

```ruby
class Label < ApplicationRecord
  has_many :labelings, dependent: :destroy
  belongs_to :user, optional: true
  validates :name, presence: true, uniqueness: { scope: :user }
end
```
ユーザはタスクに紐付けるラベルを作成することができますが、各ユーザは同じ名前のラベルを作れないようにラベルモデルのnameカラムに一意性制約をつけています。

実行結果[5]を見るとRollbackしています.

```bash
[3] pry(main)> user = User.first
[4] pry(main)> user.labels.create(name:'test-label')
   (0.2ms)  BEGIN
   (1.6ms)  COMMIT
#同じユーザで同名のラベルを作成する
[5] pry(main)> user.labels.create(name:'test-label')
   #Rollbackする
   (0.3ms)ROLLBACK
#違うユーザで検証
[6] pry(main)> user2 = User.last
[7] pry(main)> user2.labels.create(name:'test-label')
   (5.7ms)  BEGIN
#書き込み成功
 　(34.0ms) COMMIT
```

## 解説

`scope`を付けない場合,テーブル全体で一つの名前のラベル名しか保存できません。
`validates :name, uniqueness:true`

つまりscopeという文字通りscopeの中での一意性制約にするオプションです。

このことによって各ユーザごとに一意となるカテゴリを作成することができます。

## 複数のscope

またscopeは配列により複数作成することもできます。

scope は配列にして複数指定できます。

validates :name, uniqueness: { scope: [:group_id, :user_id] }
これでname, group_id, user_id の全てが同じデータは1件しか作成できないように制約できます.


## データベース側の制約

また上記だけでなくデータベース側にも制約を作成する場合は、以下のように両方のカラムにuniqueインデックスを作成します.

```ruby:label.rb
class AddUniqueIndexToLabels < ActiveRecord::Migration
  def change
    add_index :labels, [:name, :user_id], unique: true
  end
end

```

## おわりに

ActiveRecordの一意性検証の範囲指定について学びました.
GitHubとアプリケーションの紐付け方-チーム開発-

###概要
この記事ではGitHubとアプリケーションの紐付け方を解説します。
また、その際にGitHub Desktopを活用していきます。


###方法

まず、ローカルリポジトリを作成します。

GitHub Desktopを開いて左上の<strong>Current　Ripository</strong>をクリックします。
クリックして開いた画面の<strong>Add</strong>をクリックします。
<img width="954" alt="スクリーンショット 2020-05-15 20.59.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516627/6a43689b-c80e-fefa-b29f-b2b22f0c6963.png">
すると下記のような画面が出てきます。

<img width="403" alt="スクリーンショット 2020-05-15 21.00.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516627/bc3516a9-6bae-ad83-d60a-9c05fcfbf8a2.png">
その画面内の<strong>Choose...</strong>をクリックするとファイルが選択できる画面が出てくるので自分が作成中のアプリケーションのフォルダを選択します。
そして<strong>Add Repository</strong>ボタンをクリックします。
これでローカルリポジトリの作成完了です。

もし<strong>Add repository</strong>が押せない場合はターミナルの自分が作成中のディレクトリで`git init`を叩いてください。
そうすればクリックできるようになると思います。

<img width="740" alt="スクリーンショット 2020-05-15 21.00.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516627/257e7b99-e86c-048b-41b7-c44c79e13a05.png">

次に上記画面の左下に<strong>Summary(required)</strong>とあると思いますので、そこに<strong>initial commit</strong>(初めてのコミットという意味)と入力して、<strong>Commit to master</strong>ボタンをクリックします。
これでコミットが完了したので最後ににリモートリポジトリを作成します。

画面右上に<strong>Public repository</strong>があるのでそこをクリックします。するとリポジトリ名を決められたり、コードを公開するかしないかのチェックボックスが出てきます。場合に合わせて適宜変更してください。
<strong>Publish repository</strong>ボタンをクリックしたらリモートレポジトリの作成完了です。
ブラウザでGithubのページにアクセスして自分の作成しているアプリケーションの名前があれば作成は成功しています。

ここまででGitHubとアプリケーションの紐付けに関しては完了しています。


<br>
<br>
この記事を読んでいただきありがとうございました。
パスワードのSHA-512暗号化を、実行環境をあまり気にせず自動化できるようにスクリプト化した。

# 動機

いまどきのLinuxでは、`/etc/shadow`等に保存されるパスワードはSHA-512で暗号されている。たとえば、Dockerfileで、コンテナ内に一般ユーザを作成するときには、平文パスワードがファイルに記されるのは避けて

```Dockerfile:Dockerfile
RUN useradd -p 'encrypted_password' accountname
```

としたり、

```Dockerfile:Dockerfile
RUN echo 'accountname:encrypted_password' | chpasswd -e
```

といったパスワード設定も行いたくなる。そうするとあらかじめSHA-512でパスワードを暗号化する必要があり、その方法はいくつか挙げられている。

  - [OpenSSLでSHA512のPASSWORDを生成する](https://matoken.org/blog/2019/03/15/generate-a-sha512-password-with-openssl/)
  - [sha512でハッシュされたsaltつきパスワードを生成するには](http://april.fool.jp/blogs/2013/09/07/sha512%E3%81%A7%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%81%95%E3%82%8C%E3%81%9Fsalt%E3%81%A4%E3%81%8D%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E3%81%AB/)
  - [シャドウ用のSHA-512ハッシュパスワードを作成する方法は？](https://qastack.jp/server/330069/how-to-create-an-sha-512-hashed-password-for-shadow)

ところが、**いくつかある方法のうちどの方法が使えるかは実行環境にとても依存している**ようである。

たとえばホストがmacOSのバージョンによっては`python`や`perl`の`crypt`関数がSHA-512に対応していない、とか`openssl`,`htpasswd`は新しいバージョンでは対応しているが`CentOS7`に標準ではいっているものは対応していないとか、場合によって使い分けが必要のようだ。イメージをビルドする環境によっていちいち方法を探して変えるのはやっていられないと思うので、いくつかの方法を順次試していくスクリプトを作成した。ファイルの置き場は以下

  - [github](https://github.com/nanigashi-uji/passwd_sha512encrypt.git)
  - [gitlab](https://gitlab.com/nanigashi_uji/passwd_sha512encrypt.git)

# 使い方

下記のような使い方を想定している。

```bash:初期ワスワード設定例
# useradd -p "$(./passwd_sha512encrypt -u worker)" worker
Enter password for worker:
Enter password again for check. : 
```
```bash:作成済みアカウントへの設定例
# ./passwd_sha512encrypt -f -u worker   | chpasswd -e
Enter password for worker: 
Enter password again for check. : 
```
これらの例の場合、プロンプトに従って標準入力から入力することになる。`useradd`では暗号化したパスワードのみ、`chpasswd`はアカウント名と暗号化したパスワードの対、と必要な情報が違うので`-f`オプションで出力を切り替える。

もっとも、コンテナビルド等で何回もキーボード入力するのはやっていられないと思う。暗号化された物を保存しておく使い方が現実的である。ファイルに出力するオプション引数(`-o output-file`)も設定しておいた。詳しい使い方は下記。

```bash:help表示
% ./passwd_sha512encrypt -h
[Usage] % passwd_sha512encrypt [options] [username] [rawpassword]
[Options]
           -o output      : Set outputfile (default: stdout)
           -u username    : Set username
           -p rawpassword : Set destenation 
           -f             : Output username:encrupted_password
                            (Default output is encrupted_password only)
           -q             : Skip type-miss check
           -v             : verbose output
           -d             : debug output
           -h             : Show Help (this message)
```

# 動作

内部では`openssl`, `htpassword`, `PHP`, `Python` (Version 3→Version2の順),`perl`の順で、それぞれを環境変数`PATH`に含まれるディレクトリを順番に探して、SHA-512に対応しているものかどうかを判定して実行する。

どれも対応していなかったら失敗する。この場合。**`-o`オプションで指定した出力されたファイルは作成されない**ので、このスクリプトの出力をシェルでリダイレクトする場合と動作が異なる。サイズ0のファイルが作成されないので、`Makefile`でファイルの依存関係を利用して処理を停めやすいと思う。
RVMの使い方

Rubyのバージョン変更管理システム「RVM」の使い方を簡単にご説明します。

#0. RVMとは？

基本的には最新版を使うのが一番良いです。
ただし、開発済のプログラムが違うバージョンだと動かなかったりするので、

プロジェクトXでは、Ruby 2.6.3 を。
プロジェクトYでは、Ruby 2.5.1 を使用する

というようなことがあります。

その際逐一、プロジェクトごとにRubyのバージョンを再インストール・アンインストールしなくても済むように、コマンド一つでバージョンを切り替えられる便利ツールが用意されています。

その便利ツールの一つが「RVM」です。
(同じようなツールに「rbenv」もあります。完全に好みの問題ですが、なんとなくRVMの方が主流な気がします)

[インストールはこちらから](https://rvm.io/rvm/install)可能です。

#1. RVMコマンド実行手順

###`$ rvm list`を実行し、現在使用可能なRubyを表示する
```
$ rvm list
=* ruby-2.6.3 [ x86_64 ]

# => - current
# =* - current && default
#  * - default
```

この場合は、ruby2.6.3しか使用可能ではないため、もし2.5.〜を使いたい場合は以下を実行する

###`$rvm install [使いたいバージョン(数字のみ)]`
```
$rvm install 2.5.1
Warning, new version of rvm available・・・
・・・(省略)・・・
Ruby was built without documentation, to build it run: rvm docs generate-ri
```

###再度`$ rvm list`で使用可能なRubyのバージョンを確認

```
$ rvm list
=> ruby-2.5.1 [ x86_64 ]
 * ruby-2.6.3 [ x86_64 ]

# => - current
# =* - current && default
#  * - default

```


###`$ rvm use [使いたいバージョン(数字のみ)]`

```
$ rvm use 2.5.1
Using /home/ec2-user/.rvm/gems/ruby-2.5.1
```


###`$ ruby -v`で先ほどのバージョンが適応されているかどうか確認
```
$ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
```


###`$ rvm list`で、使用しているRubyが絞り込めているかどうか確認

```
$ rvm list
=> ruby-2.5.1 [ x86_64 ]
```
Flutter Engineのユニットテストについて

# はじめに

Flutter Engineのユニットテストについての記事です(誰得？)。

Flutter Engineにコントリビュート (PR) する場合、リグレッション的にユニットテストをPASSさせる必要があります。PR時に自動で回るCIでもチェックされますし、もし新しい機能を追加する場合には新しくユニットテストを入れる必要があります。

# Flutter Engine環境準備

[Flutter Engineのビルド手順](https://qiita.com/kurun_pan/items/02b46e4b330b137da3db#flutter-engine%E3%81%AE%E3%83%93%E3%83%AB%E3%83%89%E6%89%8B%E9%A0%86)に従い、Flutter Engineをビルドします。

# ユニットテストの実行方法

```Shell
$ ./flutter/testing/run_tests.sh
```

もし、テストパスしないシナリオがあれば、途中でエラメッセージとともにストップします。

# 新しくユニットテストを追加する

ユニットテストのコーディングスタイル等は[event_channel_unittests.cc](https://github.com/flutter/engine/blob/master/shell/platform/common/cpp/client_wrapper/event_channel_unittests.cc)のあたりのコードを参考にしてください。その他、以下のBUILD.gnにあるユニットテストのコードも参考になります。

その他、必要に応じて以下のgnファイルやライセンスファイルのメンテが必要です。

```shell:ファイルの追加削除などに連動してメンテするファイル
src/flutter/shell/platform/common/cpp/client_wrapper/BUILD.gn
src/flutter/ci/licenses_golden/licenses_flutter
```
英語論文の文章をショートカットキー1回で整形してDeepL翻訳に突っ込む

英語論文を読むとき一番大変なことといえば，[DeepL翻訳](https://www.deepl.com/en/translator)にかけるために文をコピーした後，毎回整形することじゃないですか．(?)
その処理を自動化してショートカットキー一つで出来るようにしました．
![図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433211/878735c4-0ea9-3e27-6801-8bf1da5283e4.png)
こんな感じです．Windowsを対象としています．

#方法
1. Pythonスクリプトでクリップボードに格納されている文を取り出し，整形した後DeepL翻訳に投げます．
2. このPythonスクリプトをバッチファイルから実行できるようにし，
3. そのバッチファイルをショートカットキーから実行できるようにします．

###Pythonスクリプト

```python:ClipboardCopyToDeepL.py
import re
import pyperclip
import webbrowser
import urllib.parse

text = urllib.parse.quote(pyperclip.paste(), safe = "|").replace("|", "%5C%7C").replace("%0D", "%20").replace("%0A", "").replace("-%20", "")
webbrowser.open("https://www.deepl.com/en/translator#en/ja/" + text)
```
（5/27追記：やっぱりurlLibを利用するようにしました．なぜか"|"は標準の"%7C"ではなく"%5C%7C"だったので別で変更しています）

いたってシンプルですが，[pyperclip](https://pypi.org/project/pyperclip/)を使ってクリップボード上のテキストを取り出した後整形しています．
整形のルールは

- 英単語が改行で区切られている時に入る`-`をなくす
- 改行をスペースに置き換える

だけです．
最後にDeepL翻訳にWebリクエストを投げて終わりです．
DeepL翻訳は`https://www.deepl.com/en/translator#en/ja/`の末尾に翻訳したい文字列を入れてあげると翻訳結果が表示されるサイトに飛んでくれるのでそれを利用しました．

このスクリプトをどこかに保存しておいて，バッチファイルでリクエストがあったときに実行されるようにします．

###バッチファイル
pythonスクリプトと同じ階層に以下のバッチファイルを配置します

```bash
"Pythonの実行ディレクトリ" "pythonスクリプトのディレクトリ"
```

例えばanacondaを利用しており，作成したスクリプトをデスクトップの"ClipboardCopyToDeepL/"以下に置いた場合は

```bash:ClipboardCopyToDeepL.bat
C:\Users\ユーザ名\anaconda3\python.exe C:\Users\ユーザ名\Desktop\ClipboardCopyToDeepL\ClipboardCopyToDeepL.py
```

となります．

###ショートカットキー割り当て
バッチファイルのショートカットを作成します．
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433211/7e929a9f-b1e3-3558-7317-c9ddb74c7d1c.png)
ショートカットのプロパティから，`ショートカットキー`の設定を行います
![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433211/4abc5964-812f-b863-a786-437c34417e5e.png)
枠をクリックして割り当てたいキーを打つと勝手に入力されます．

（追記: 自分はこのショートカットを`C:\ProgramData\Microsoft\Windows\Start Menu\Programs\`以下に配置すると使えるようになりました．）

#終わりに
これで論文が読むのが捗りますね．
Vuetfiy v-dialogのモーダル化が機能しない

# Vuetify v-dialogのモーダル化が機能しない

新規で作成もしくはソースコードの内容を大体把握してある個人の方・一人でプロジェクトを回している方には参考にならないかと思います。

Vuetifyの`v-dialog`にはオプションで色々指定できる
モーダル化させるために`persistent`を指定することでダイアログ外を押しても閉じないようにできる

それが機能しなかったので備忘録的にまとめる

Vuetify
https://vuetifyjs.com/ja/components/dialogs/

## 結論

`outside`というオプションが悪さしていました。
このオプションはダイアログ外を押した時に発火するイベントです。
そいつが諸悪の権化なので削除するなりよしなに修正することで回避しましょう。

こんなことで時間取られるの辛い…辛い…

ちなみに調べるとVuetify2.1以下だとバグで機能しないらしいですが、`orverlay`と合わせるとバグるみたいなので多分今回の場合は関係ないです。
https://github.com/vuetifyjs/vuetify/issues/8697
React: 以前の値を取得するときの挙動についての理解



[<フックに関するよくある質問 – React> 前回の props や state はどうすれば取得できますか？](https://ja.reactjs.org/docs/hooks-faq.html#how-to-get-the-previous-props-or-state)を読み直していたときに挙動の理解に少し詰まったので、その解説です。

### tl;dr

レンダーされたあとにその時点の値を保存しておくことで、次回のレンダリング時に「以前の値」を取り出せる。

### 前提理解
- React.useEffectはレンダリングされた後に実行される
    - なので、このタイミングで「次回のレンダリング時にとっての前回の値」、つまり「現在の値」を格納しておく。
    - 格納先はrefに格納する
- ref は何でも格納できる変数だと考えてOK
    - 一般的にはDOMを紐付け・入れるケースが多いけど、実体はJavaScriptの生オブジェクトなので何を入れてもOK。


### コードで見る

コードブロックごとに実行順番を記載しました。
1 -> 2 -> 3の順番で読み解いていくと理解しやすいかと思います。

```tsx
import React from "react";
import ReactDOM from "react-dom";

const App: React.FC = () => {
  /*************
   * 1
   *************/
  const ref = React.useRef(null) as any;
  const [count, setCount] = React.useState<number>(0);
  const increment = () => setCount(prev => ++prev);

  /*************
   * 3
   *************/
  React.useEffect(() => {
    console.log("[useEffect]count is ", count);
    ref.current = count; // <= 現在の値を保存しておく。次回から見たら前回の値になる。
  });

  /*************
   * 2
   *************/
  return (
    <div className="App">
      {console.log("[render]start---")}
      {console.log("[render] prev is ", ref.current)}
      {console.log("[render] count is ", count)}
      <p>prev: {ref.current}</p>
      <p>now: {count}</p>
      <button onClick={increment}>+</button>
    </div>
  );
};

ReactDOM.render(<App />, document.getElementById("root"));

```



console.logの結果は下記です。

<img width="505" alt="Screen Shot 2020-05-15 at 20.44.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186228/c730381d-c8fb-5b20-69a4-ba2f05367957.png">

ボタンをクリックするごとに赤枠ごとロギングされます。１つ目の赤枠は初回レンダリング時に表示されます。


### おわりに

React.useEffectとrenderの実行順番を意識してなかったので、少し詰まったけどそこを意識すれば割と簡単に読めるかと思います。

ちなみに、usePreviousみたいにカスタムフックスにもできます。将来的にもReactから提供されるかもなので、極力カスタムフックスを作っておくほうが良いかと思います。(参照: [フックに関するよくある質問 – React](https://ja.reactjs.org/docs/hooks-faq.html#how-to-get-the-previous-props-or-state))
[Windows10] デスクトップのアイコンを非表示にする ～リモート時代のたしなみ

別にどうということはないんですが、プレゼンする際や、リモートワークで画面共有している際に、取引先の会社名がついたファイルとか、同契約書が並んでいるデスクトップを不覚にも第三者に見せてしまうリスクを極小化できます。

①デスクトップで右クリック
②表示 ＞ デスクトップアイコンの表示

でON/OFFできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159452/2f7f7dc7-4aab-44a7-c8a1-f4aeb3a7bc7b.png)

エクスプローラーでみれば存在しているので、もちろんファイルの管理は問題ありません。

以上、おそまつ様でした。
C言語の記憶クラスを下世話に理解する

C言語では、変数に**記憶クラス**と**スコープ**という考え方があります。
これを、下世話に表現してみましたのが、下の表です。

|宣言子|分類|下世話的表現|
|------|----|-----------|
|auto|自動変数|キャバクラのお姉さん。|
|static|静的変数|出張先の愛人。|
|register|レジスタ変数|合コンの相手。|
|extern|大域変数|本妻。|

記憶クラス**`extern`**は、**大域変数**を宣言します。
これは言ってみれば**本妻**のようなもので、全国どこに行っても存在が消えることはありません。
しかも、どこからも（その気があれば）アクセス可能です。

記憶クラス**`static`**は、**静的変数**を宣言します。
これは言ってみれば出張先にいる**愛人**のようなもので、存在自体は消えることはありませんが、アクセスできる範囲がその地域に限られています。
アクセスするにはそこに行く必要がありますが、次に訪れた際も忘れずに、別れたときのままにいてくれる、非常に都合のよい存在です。

記憶クラス**`auto`**は、**自動変数**を宣言します。
これは言ってみれば**キャバクラのお姉ちゃん**のようなもので、そこに行かないと会えませんが、行けば自動的に確保されます。
ただし、前のことはすっかり忘れていて、まず同一人物ではありません。
（※キャバクラには行ったことがないので、あくまでも想像です）

最後の記憶クラス**`register`**は、**レジスタ変数**を宣言します。
これは言ってみれば**合コンの相手**のようなもので、使えるか使えないかは、様々な要因で決まってしまいます。
変数（≒男性）の数に比べて圧倒的にレジスタ（≒女性）は少ないことが多いです。
希望しても適わないことが多く、通常はすでに割り当てが決まっていることが一般的です。
（※合コンには行ったことがないので、あくまでも想像です）

もう少し掘り下げてみましょう。
大域変数と静的変数は、どこに行ってもその存在が消えることはありません。
これに対して、自動変数は関数（≒キャバクラ）内部でのみ存在します。
大域変数と静的変数は、同じ名前ならば原則同じ人物を差します。
これに対して自動変数は、同じ名前でも同じ人物（≒メモリ位置）とは限りません。

これをスコープと言うところから見ると、どうなるでしょうか。
わかりやすく、すべて同じ名前であるとしましょう。
大域変数MidoriがTokyoなどプログラムのどこで宣言されていても、Midoriは日本全国からアクセスできます。
しかし、静的変数MidoriがファイルHokkaidoで宣言されている場合、静的変数MidoriによってHokkaidoでは大域変数Midoriの存在が見えなくなってしまいます。つまり忘れられてしまうのです。
しかし、Hokkaidoに関数Susukinoというキャバクラがあって、もしMidoriという自動変数がいたら、なんと静的変数Midoriも見えなくなってしまいます。つまり忘れられてしまうのです。
Tokyoの大域変数Midoriは、Hokkaidoでは静的変数Midoriの前に霞み、さらにSusukinoのキャバクラ嬢Midoriの前には、それも霞んでしまうのです。
まさに恐るべしといった感じですが、私にはまったく実感の湧かない話です。

何だか疲れる話なので、このへんにしておきましょう。
しかし、無理がありますね、このこじつけには。
Visual Studio Codeで日本語入力時に文字が左にずれる・カーソルが二重になる

パソコン(windows)を買い替えてVSCodeを入れたところ、下記のように日本語入力がうまく行かず、調べ方が悪かったのかQiitaの記事等を調べてもなかなか直し方が見つからず詰まってしまったので、試した方法、詰まったところ？、__<font color="Red">最終的に解決した方法<font color="Red">__を備忘録的に書いています。
##概要
![xyd3p-h76r0.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638279/439c9a5a-270e-08e8-c912-9ed3e522a1ab.gif)
↑のように日本語入力時に文字が左に埋まっていく、カーソルが二つになりずれる。
確定すると普通に表示されて問題無いのですがストレスが半端なかったので直し方を探しました。

## 1.再インストール  
困った時はまずはこれということで、[VS Codeをアンインストールするには](https://www.atmarkit.co.jp/ait/articles/1810/12/news026.html)を参考に何度か試すも治らず。  
これで治ったという人もいたのですが、前のPCの設定ファイルをまるまる移し替えたり何をやってもダメでした。

## 2.調べ方が分からない
いい検索方法もわからなかったのでそもそもヒット数が少なく、文字がずれるカーソルが2重になる等調べたら色々出てきたのですが、どれが自分と同じ状態なのかもいまいちわからず捜査が難航したので<font color="SteelBlue">__悲しみのツイート__</font>ついでにTwitterで検索したところ同じ状況の人が結構見つかりました。
![messageImage_1589539561859.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638279/8387dfca-46d7-a96e-5a2d-b8fb184cba1f.jpeg)

## 3.Letter Spacingの設定
Twitterで__Letter Spacing__の設定を変えてしまっていて0に戻したら戻ったという方が居たのですがそもそも初期設定のままなので最初から0になっていました。  
__数値を変えるとずれ幅が変わった__ので、急にこの症状がでた場合はまずここの数値を見るといいかもしれません。![unknown.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638279/b9b17590-3f06-9def-7157-2cccf1bec197.png)


## 4.Google 日本語入力（IME）インストール
IMEの問題かもということで[Google 日本語入力](https://www.google.co.jp/ime/)をインストール、解決に至らず．．．

## 5.フォントを変更 <font color="Red">（解決）</font>
__最終的にこの方法で<font color="Red">解決</font>しました__
こちらもTwitterで等幅フォントに変更したら解決したというツイートを発見  
さっそく[Visual Studio Codeで等幅フォントを使う](https://minus9d.hatenablog.com/entry/2018/12/22/111047)を参考に変更したところ正常に表示されるようになりました。  
~~どうしてもフォントに慣れなかったので~~[VSCodeで日本語にのみ別のフォントを設定する(Windows)](https://ice-script.com/vscode-two-fonts-setting/)を参考に日本語以外はVSCode初期搭載のConsolas日本語はMeiryo UIに落ち着きました。![unknow2n.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638279/2a1c493c-c82d-a9bd-3028-2a9a2641f360.png)
初心者による初心者のためのspilt構文


# はじめに
初めまして、私はJavaScriptの勉強を最近始めたばかりです。
そんな私でも出来た`split構文`について簡単に説明したいと思います！
# そもそもsplit構文とは
* `split構文`は文字列や数値が`「,」（カンマ）`や`「　」（スペース）`で区切られた配列を文字列を分割できます。

###文だとイメージが掴みにくいと思うので例文で説明します！
```javascript:Hello.javaScrip
   //まずスペースで区切られてる「dog koala wolf skunk」という配列を変数strに代入し        
   const str = 'dog koala wolf skunk'

   //次に変数strをsplitを使って分けた要素を変数wordsに代入します
   const words = str.split(' ');
    
   //こうするとwordsの中身が['dog', 'koala', 'wolf', 'skunk']になります
   //出力したい要素が先頭からn番目とするとwords[n]と入力します
   console.log(words[0]);
   
```
【結果】
`dog`
###<font color="red">:warning:注意点</font>
* 要素の先頭から数えるので一番初めは０です！

#最後に
* split構文は覚えておけば応用にも使える<font color="orange">便利な文法<font/><font color="black">です！<font/>
* 基礎の基礎しか書いてないですが参考にしていただけると嬉しいです。

##参考リンク
https://www.javadrive.jp/start/string_class/index5.html
ターミナルに現れる意図せぬ(base)を消そう【Condaの環境から抜ける】

# これはなに
ターミナルの先頭に現れる(base)を消そうという記事
<img width="335" alt="スクリーンショット 2020-05-15 20.31.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328441/3b5e8ba0-c0f1-45a1-4439-6da524af2d8e.png">
↑お前誰や

# そもそもこれなに
Conda は Python のバージョン管理ツール[^1]です。
機械学習のライブラリ欲張りセットである Anaconda をインストールすると標準でついてきます。
(base) が出ている状態である、ということは Conda が提供する仮想環境に入っている状態です。
特に問題がなければそのままで構いませんが、「Conda 以外のバージョン管理ツール（ pipenv, poetry など)を使いたい」、「なんかよくわからないけど不安だから消したい」みたいな時には不便ですよね。

# 消そう
消します。
## 一時的に消す
ターミナルで以下のコマンドを実行します。

```zsh:仮想環境から一時的に抜ける
$ conda deactivate
```
これで仮想環境から出て、忌むべき(base)を消し去れました。
しかし、ターミナルを再起動したらまた憎い(base)が再び現れるかもしれません。その場合は以下で対処します。

## 永続的に消す（復元可能）
```zsh:仮想環境にデフォルトで入らないようにする
$ conda config --set auto_activate_base False
```

Conda の config を書き換えて、デフォルトで仮想環境に入らないように設定します。これで再起動しても現れないはず。

## 帰ってきて Conda
逆に戻るときは以下です。

```zsh:仮想環境に入り直す
$ conda activate
```


[^1]: バージョン管理ツール: ライブラリの導入や削除、またライブラリ同士の依存関係を管理するシステムのこと
Amazon Linux 2 における sendmail の設定で詰まったこと

Amazon Linux 2 でウェブアプリを作っていて、パスワード再設定機能を実装する際、メールサーバーが必要になりました。
ただ、そこまでしっかりしたサービスではないので、別に迷惑メールに入れられてもいいから無料でやりたいってことで、Amazon Linux 2 にデフォルトで入っている sendmail を使ってみることに。

参考にしたのはこちらの記事↓
https://www.server-memo.net/server-setting/sendmail/sendmail-setting_centos7.html

この記事をしっかり読めばできると思いますが、自分が詰まった点について書いていきます。

1. /etc/mail/sendmail.mc の設定

>Dwホスト名
Dmドメイン名
define(`confDOMAIN_NAME',`$w.$m')dnl

を加筆するのですが、ここは好きに設定して良いようです。メールサーバーに関する知識が薄い自分としてはあらかじめ決めた何かが必要なのかと思いました。
自分は
Dw : mail
Dm : xxx.work　（自分でとったウェブサーバー用のドメイン）
に設定しました。

2. sendmail.cf作成

>sudo m4 sendmail.mc > sendmail.cf

を実行したのですが、なぜかpermission deniedに、、、
sendmail-cf はインストールしたのですが。

結果的には、他の設定ファイルも読み込んでくれる
>sudo make

コマンドでしっかり作成してくれました。

あとはこの記事に沿って設定すればしっかり使えると思います。
あとこれは自分の環境特有のものかもしれませんが、受信用に設定したメールアドレスにはメールの送信はできなかったので、試す際は別のメールアドレスに送信したほうが良いかもしれません。

メールに限らずですけど、通信についてはもっと勉強しないとどこで詰まってるのかもわからないですし、大変ですね。
アナリシスパターンで基本型にすべきと提案されている「量」の概念

# 量とは？

現実世界では、長さを **160cm**、金額を **500円** など、量を「数値+概念」で表します。
ところが、システム上ではこれらを単に **160**, **500** といった数値で表すことも多いかと思います。

[アナリシスパターン](#参考文献アナリシスパターン) では、このような「量」という概念について、単に数値ではなく「量」、つまり **160cm**, **500円** として、そのままモデリングすることが提案されています。


## 量の定義

量は次のように定められた型です。

![スクリーンショット 2020-05-15 18.45.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209425/bc993830-f797-6da3-7a83-555e36d2fb60.png)

これを使うと、次のような表現が可能です。

![スクリーンショット 2020-05-15 18.50.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209425/f6539fee-9093-5a46-024d-c49d24311942.png)

金額、長さなどは世の中では「数値＋単位」で扱われるため、この概念をそのまま型として定義しようとするものです。
単なる数値ではなく、「量」という型に基づいて設計することで、システム内で扱われる値をより正確な概念で扱うことができます。

## 直感的な感想

最初これをみたとき、 **数値だけで保存したほうがデータ小さくなるし、単位が重視される場面はそこまで多くないのでは？** と思いました。しかし、後に

1. そもそも型のモデリング段階で、データの大きさなどの実装を考慮することは無意味
2. 量という概念は、直感的な解釈よりも広い

という事に気づきました。

## 1. モデリング段階で実装を考慮すること

これは様々なところで言われていることですが、モデリングの段階で実装を考慮すると、特定の実装に依存したモデリングをしてしまう要因となります。レイヤードアーキテクチャに代表されるように、特定の実装に依存することはあまり推奨されることではないと認識しています。

## 2. 量という概念は、直感的な解釈よりも広い

これについては、そもそも「単位」が何かを理解する必要がありました。
[Wikipedia（単位）](https://ja.wikipedia.org/wiki/%E5%8D%98%E4%BD%8D)によると、単位とは

> 単位（たんい、英: unit）とは、量を数値で表すための基準となる、約束された一定量のことである。

とあります。
つまり、単位というのは「cm, kg, 円」のように単に後ろにつける符号に限らず、例えば

- 容積を表すための「東京ドーム ○個分」
- 体重を表すための「りんご ○個分」

なども量の単位として扱うことができます。

### 例: 商品代金の支払い

買い物をする場合、**商品代金** を **お金** を使って支払います。
しかし、**値引クーポン**、**ポイント** などを使うことで支払う金額をディスカウントできることがあります。

一般的な解釈としては、次のような式が成立します。

```
商品代金 - (値引クーポンの値引き額 + ポイントの値引き額) = 支払うお金
```

ここで、上の式に現れた概念はすべて「量」です。
**商品代金は基本的にお金で払う** という前知識が邪魔をしていましたが、上の式は下と同じです。

```
商品代金 = 支払うお金 + 値引クーポンの値引き額 + ポイントの値引き額
```

つまり、**お金を特別視する必要は無い** ということになります。
したがって、この関係性は次のような図で表せます。[^keisan]

![スクリーンショット 2020-05-15 19.32.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209425/911e6c7a-9b68-3916-a023-678327d9fc32.png)

システムでこのように定義することができれば、今後「支払い方法を増やす仕様変更」などが入った場合にも容易に改修することができます。
「量」という現実世界に即した概念でモデリングを行うことで、より本質的な洞察をシステムに組み込むことが可能となります。

## まとめ

「量」という概念を使うことで、本質的な概念を抽出できる例を示しました。
アナリシスパターンでは、量についてより詳しい記述[^kansan]もありますので、ぜひ読んでほしいです。

## 参考文献：アナリシスパターン

システムでよく遭遇する「型の構造」の詳細な分析が記された本です。
読むのが少し難しいですが、理解すると非常に納得感が得られます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209425/c99c1ef8-52fa-f937-68bc-316a03c09722.png" width="200px">

[Google ブックスリンク](https://books.google.co.jp/books/about/%E3%82%A2%E3%83%8A%E3%83%AA%E3%82%B7%E3%82%B9%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3.html?id=GmV6GQAACAAJ&redir_esc=y)

- 書籍名: アナリシスパターン: 再利用可能なオブジェクトモデル
- 著者: マーチンファウラー
- 翻訳: 堀内一, 児玉公信, 友野晶夫, 大脇文雄
- 出版社: アジソンウェスレイパブリッシャーズジャパン, 1998

[^keisan]: 量同士の演算操作を定義する方法は、アナリシスパターンにて詳しく記述されています。ここでは簡単に数量の合計値で例示しています。
[^kansan]: 例えば、換算率を定義することで「100ポイントを１円分と扱う」といったことも可能です。これを使うと、上の例で「円分ポイント」とした単位を単に「ポイント」として、ポイントの概念をそのまま入れ込むこともできます。
【ruby】『ruby入門(メモ6)』メソッドで恐竜fizzbuzzを作ってみよう(windows10+ruby2.3.3)

###０．あると望ましい(どうでもいい)前提知識
超久しぶりの投稿！
気分転換のためにfizzbuzzを作成してみました。
インドミナスレックス(IndominusRex):ヴェロキラプトルとティラノザウルスを融合させた恐竜。
インドラプトル(Indoraptor):インドミナスレックスとヴェロキラプトルを融合させた恐竜。

この知識を前提に変形fizzbuzzを作ってみた。
最後にインドラプトルが表示されていれば成功！

###１．コード

```ruby:method_fizzbuzz.rb
def act_dino(dinosor)
	if dinosor == 'Tyrannosaurus'
		puts 'Bite!!'
	elsif dinosor == 'Stegosaurus'
		puts 'Waving the tail!'
	else
		puts '???'
	end				
end

def FizzBuzz_dinosor(n)
	#インドラプトル
	if n % 45 == 0
		'Indoraptor'
	#インドミナスレックス	
	elsif n % 15 == 0
		'IndominusRex'
	#ティラノサウルス
	elsif n % 5 == 0
		'Tyrannosaurus'
	#ヴェロキラプトル	
	elsif n % 3 == 0
		'Velociraptor'
	else
		n.to_s
	end
end

act_dino("tiger")
act_dino("Stegosaurus")

n=0
while n < 45 do
	n += 1
	puts FizzBuzz_dinosor(n)
end
```

###２．実行結果
```
c:\ruby_pg>ruby method_fizzbuzz.rb
???
Waving the tail!
1
2
Velociraptor
4
Tyrannosaurus
Velociraptor
7
8
Velociraptor
Tyrannosaurus
11
Velociraptor
13
14
IndominusRex
16
17
Velociraptor
19
Tyrannosaurus
Velociraptor
22
23
Velociraptor
Tyrannosaurus
26
Velociraptor
28
29
IndominusRex
31
32
Velociraptor
34
Tyrannosaurus
Velociraptor
37
38
Velociraptor
Tyrannosaurus
41
Velociraptor
43
44
Indoraptor

c:\ruby_pg>
```
AtCoder Beginners SelectionでRuby学習【Product】様々な解法から学ぶ

## はじめに
Ruby学習の一環として「競技プログラミング（競プロ）」に挑戦します。
そのための学習の中で学んだことをアウトプットしていきます。
今回は「AtCoder Beginners Selection」の二問目（Product）より。
https://atcoder.jp/contests/abs

## 問題
2つの正整数a,bが与えられます。 
aとbの積が偶数か奇数か判定してください。 

制約
1≤a,b≤10,000
aとbは整数

入力は以下の形で与えられる。

```ruby
a b

# 例
2 3
```
積が奇数なら Odd 、偶数なら Even と出力せよ。

```ruby
出力例
# 上記例の場合
Even
```

## 解答①
まずは僕が最初に書いたコードです。

```ruby
a,b = gets.chomp.split(" ").map(&:to_i)

c = a * b

if c % 2 == 0 
    print "Even"
else
    print "Odd"
end
```
前回の学習で学んだメソッド（gets chomp split map）を使って入力を受け取り、
あとはif文で…という感じ。
[AtCoder Beginners SelectionでRuby学習【PracticeA】標準入力](https://qiita.com/jag_507/items/f7f3e181867ed8b6db73)

ただ他の方の解答を見てみると、2行で完結している方もいて、そっちの方がかっこいい！
ので、どんな記法を用いて書いているのか、いくつか見てみたいと思います。

## 解答② 三項演算子

```ruby
a, b = gets.chomp.split.map(&:to_i)
(a*b%2==0) ? puts('Even') : puts('Odd')
```
入力を受け取るまではほぼ同じで、
後半は三項演算子を用いた記述方法ですね。
条件が複雑でない場合は、こちらの方が良さそうです。

```
三項演算子
条件式 ? 真の時の値 : 偽の時の値
```


## 解答③ odd?メソッド  even?メソッド

```ruby
a,b = gets.split(" ").map(&:to_i)
(a*b).even? ? (puts "Even") : (puts "Odd")
```
解答②で学んだ三項演算子を使いつつ、
代数演算子「%」ではなく、aとbの積をodd?メソッドもしくはeven?メソッドを使って
直接判定しちゃおうという方法。

```ruby
例
#even?メソッド
10.even?
=> true

#odd?メソッド
10.odd?
=> false
```


ここから下は1行で記述が完結する解答です。
ざっとみた感じ、共通する考え方は「aかbのどっちかが偶数なら結果も偶数じゃん」ということ。
積ではなく、入力された整数について判定を行っています。

## 解答④ all?メソッド
all?メソッドは配列の要素を繰り返し実行し、返り値が全て真の時にtrueを返します。


```ruby
puts gets.split.map(&:to_i).all?(&:odd?) ? "Odd" : "Even"
```
奇数を判定するodd？メソッドで配列の要素の判定を行い、
全て奇数であれば、trueを返すため"Odd"、一つでも偶数があれば、falseを返し、"Even"となります。


最後に最も短いコードでの解答です。

## 解答⑤ 正規表現
```ruby
puts gets[/[02468]\b/]?:Even: :Odd
```
詳しい説明は今の僕には難しいので省きますが、
ここでは入力されてくる様々な文字列のパターンのうち
**「末尾が偶数のもの」をメタ文字も用いつつまとめて表現**し判定を行っているようです。

以下が正規表現で表現された部分

```ruby
[/[02468]\b/]
```
ここで使われているメタ文字の意味は以下の通り。

| メタ文字           |意味　　　　　　　　　 |解答における役割　| 
|:----------------- |:------------------|:------------------|
| [...]             |括弧内のいずれか 1 文字 | 括弧内のいずれか 1 文字 | 
| /.../             |囲まれた文字列を正規表現とする| 囲まれた文字列を正規表現とする| 
| \b           　　  |先頭もしくは末尾とマッチ　|解答例では末尾とマッチ|



## 最後に
以上、AtCoder Beginners SelectionでRuby学習【Product】から学んだ様々な記法をご紹介しました。
コードの長さやメモリも判定されるみたいなので、簡潔に短い解答を意識していきたいですね。
もし間違いなどございましたら、ご指摘いただけると嬉しいです。
plunkerでmermaid その2

#概要

plunkerでmermaidやってみた。
sandbox作ってみた。

#写真

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/b4db5b75-682c-cf7f-1fd8-69bd939ff989.png)


#サンプルコード


```
sequenceDiagram
  ユーザ   ->> +Vue         : ログインボタンクリック
  Vue      ->> +Laravel     : ログインAPI
  Laravel  ->> +Database    : SQL
    Note right of Database  : 認証テーブル参照
  Database ->> -Laravel     : Result
  alt ログイン成功
    Laravel ->> Vue         : success
  else 失敗
    Laravel ->> -Vue        : failure
  end
  Vue       ->> -ユーザ     : 結果表示

```

#成果物

https://embed.plnkr.co/plunk/iiiLTsnvuKtGgWpf

以上。
Excel VBAで、データを更新するたびに、入力が遅くならないようにしてみた

#Excel VBAで、データを更新するたびに、入力が遅くならないようにしてみた
数式がいっぱい入っていると、セルのデータを更新するたびに、Excelのワークシートに入力を待たされ、再計算が走って、次のデータを入れらないことがある。

データを連続で入れたいときに、別にその都度計算がいらない時もあって、最後に一気に数式の更新ができればいいときもある。

Excelで、その時に、［ファイル］→［オプション］で、`計算方法の設定`にある `ブックの計算`で、`手動`を選べばいいが、何かのたびに設定を変えていると、戻し忘れたりする。

シートでデータを一気に入れたあとに、数式の結果更新ができればよかったので、マクロ簡単にできないかなと。
作業するワークシートを表示したまま、再計算を無効にすることができれば、操作が楽になると考えた。
###シートの準備
あまり凝った作りにしたくないので、ワークシートのA1セルに ”**手動**”と表示すると、再計算をしないようにと考える。
プルダウンで ”**手動**” と選べるようにリストボックスにしてみた。
目線でよく見る”A1”セルを見れば、自動再計算するかしないかの状態もよくわかるし。:relaxed:
###では、マクロの作成に入ろうかと
シートで、"A1"セルに”**手動**”と切り替えたときに、再計算しないようにしたい。

```vb:Sheet1
Private Sub Worksheet_Change(ByVal Target As Range)
    Select Case Range("A1")
    Case "手動"
        Application.Calculation = xlCalculationManual
    Case Else
        Application.Calculation = xlCalculationAutomatic
    End Select
End Sub
```

と書いたが、このワークブックを閉じるときに、自動計算するように忘れずに戻しておきたいので、

```vb:ThisWorkbook
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Application.Calculation = xlCalculationAutomatic
End Sub
```
と忘れずに書いといた。

これでばっちり！:laughing:
cat とか tail と cut で unix command で csv の3列目の情報の uniq とかとっちゃう方法

## 要件

```hoge.csv
id, name, category, price
1, apple, fruits, 100
2, beef, meet, 200
3, orange, fruits, 100
```


## 方法

```
tail -n +2 hoge.csv |cut -d "," -f 3|sort|uniq -c

   2  fruits
   1  meet
```
JSON_EXTRACT_ARRAY

## JSON_EXTRACT_ARRAY
便利なやつが現れた


## 例1

```SQL
SELECT
  JSON_EXTRACT_ARRAY("[{'a': 1, 'b': 2}, {'a': 3, 'b': 4}]")
```

|行|f0_|
| ---- | ---- |
|1|{"a":1,"b":2}|
||{"a":3,"b":4}|

ざっくりいうと、JSONの中の配列を扱えるようになった。
ただ、これだけだとイマイチぱっとしない。

## 例2

```SQL
WITH data AS (
  SELECT 
    *
  FROM
    UNNEST([
        STRUCT(1 AS user_id, "[{'a': 1, 'b': 2}, {'a': 3, 'b': 4}]" AS json_data),
        (2, "[{'a': 5, 'b': 6}, {'a': 7, 'b': 8}, {'a': 9, 'b': 10}]")
    ])
)

SELECT
  *
FROM
  data
```

|行|user_id|json_data|
| ---- | ---- | ---- |
|1|1|[{'a': 1, 'b': 2}, {'a': 3, 'b': 4}]|
|2|2|[{'a': 5, 'b': 6}, {'a': 7, 'b': 8}, {'a': 9, 'b': 10}]|

こんなデータがあったとして、それぞれのjson_dataのbの値を抜き出したい場合にこういった書き方ができる

```SQL
SELECT
  user_id,
  JSON_EXTRACT(ele, '$.b') AS b_value
FROM
  data,
  UNNEST(JSON_EXTRACT_ARRAY(json_data)) AS ele
```

|行|user_id|b_value|
| ---- | ---- | ---- |
|1|1|2|
|2|1|4|
|3|2|6|
|4|2|8|
|5|2|10|

こんな感じでJSON_EXTRACT_ARRAYとUNNESTとJSON_EXTRACT(JSON_EXTRACT_SCALAR)を使うことで恐らくどんな形のJSONデータであろうが中身を引っ張ってこれるようになった。

応用次第でいろんな事ができる（気がする）

```SQL
SELECT
  SUM(CAST(JSON_EXTRACT(ele, '$.a') AS INT64)) AS a_sum,
  SUM(CAST(JSON_EXTRACT(ele, '$.b') AS INT64)) AS b_sum
FROM
  data,
  UNNEST(JSON_EXTRACT_ARRAY(json_data)) AS ele
```

|行|a_sum|b_sum|
| ---- | ---- | ---- |
|1|25|30|
Addressables.LoadAssetAsync を aync/await でスッキリ書く

こんにちは。Unity使い始めて1ヶ月ほどの初心者です。

[外部リソースの読み込み事情が面倒すぎて心が折れそう](https://qiita.com/k7a/items/df6dd8ea66cbc5a1e21d)ですが
`AAS（Addressable Assets System）` を試しているところです。

今回はAASでのアセット読み込みを async/await でスッキリ書けたのでメモします。

# Addressable Assets System でのアセット読み込み
AASではResources のように同期処理で読み込むメソッドが無く、
基本的には `Addressables.LoadAssetAsync`で非同期に読み込むみたいです。

[公式ドキュメント](https://docs.unity3d.com/Packages/com.unity.addressables@1.1/manual/AddressableAssetsGettingStarted.html)によると、以下のように読み込み完了時のイベントハンドラで目的のアセットを取得するよう書かれています。

```c#
Addressables.LoadAssetAsync<GameObject>("AssetAddress").Completed += OnLoadDone;
```

# async/await を使って書いてみる
もっとスッキリ書けないかなーと模索していましたが、
.Task プロパティが用意されていて、async/await で書けます。

```c#

GameObject prefab = await Addressables.LoadAssetAsync<GameObject>("HogePrefab").Task
```

# 参考
[Addressable Assets Systemを完全に理解する]
(https://qiita.com/k7a/items/b4fd298bcb64dc968ad1)
【VR日記①】ど素人がMozilla Hubsに申し込んでみた

Virtual Realityのことを全く知らないVRど素人、あいちゃんです！今日も元気です！
先日、[Mozilla Hubs](https://hubs.mozilla.com/):hatching_chick:の体験会に参加してみたら、すっごく楽しくて、この楽しさを伝えるには **Hubs日記** を書くしかないな と思ったのでアレコレ書きます。

#VRな人たちと知り合ったキッカケ

名古屋に、[xR Tech Nagoya](https://vrm-nagoya.connpass.com/)というVR？AR？MR？（←素人ですみません…）の勉強会やセミナーをやっている[むろまちくん](https://twitter.com/i_osd1_Bonsai)というVRの達人がいます。
むろまちくんと知り合ったのは、これまたVRの達人（住人？）[マルコさん](https://twitter.com/kojimarco)のお誕生日会ででした。
![fb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587320/297bfe81-ba56-4791-b762-bd9c83497f04.png)
<div class="fb-post" data-href="https://www.facebook.com/taguchiai/posts/2624846257561386" data-show-text="true" data-width=""><blockquote cite="https://developers.facebook.com/taguchiai/posts/2624846257561386" class="fb-xfbml-parse-ignore"><p>マルコさんのお誕生日会🎂
さすがKojima rcoさん、変なお友だちが多いね！
Hashiguchi さんが みんなを3D化してくれた！楽しいな♪</p><a href="https://www.facebook.com/taguchiai">田口 相</a>さんの投稿&nbsp;<a href="https://developers.facebook.com/taguchiai/posts/2624846257561386">2019年11月3日日曜日</a></blockquote></div>

このときは[VRゴーグル](https://amzn.to/2LwBk0o)をつけて、不思議な世界に入って、そこにいた女の子キャラと闘うという体験させてもらったので、**VRのイベント＝VR機材が必要**と思い込んでいました。

#Hubs Scrum というイベント

その[むろまちくん](https://twitter.com/i_osd1_Bonsai)が、今回、「[**ブラウザで動くソーシャルVR『Mozilla Hubs』の体験会および多接続時の負荷テスト**](https://vrm-nagoya.connpass.com/event/175544/)」をやるというので申し込んでみたんです。

私みたいなド素人でも、参加してみようと思えたのは、イベント概要に「**VR環境の無い方であってもスマホやPCでの参加が可能**」とあったことです。
VR環境がなくても〜というのは、私のような初心者にとってとても敷居が低いです。初心者は、申し込むところからが勉強であり、チャレンジですから！

参加申込サイトのトップ画に ハンバーガーが空を飛んでいるのも お気軽感が出ていていいですね。楽しそうです。
![e31de6962cd9f2341d88430deae1eda3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587320/5c927a82-cf6c-f35b-174d-ceda32428529.png)
関係ないけど、イベントやセミナーの告知サイトで集客うまくやるには、

- あなたにもできると思わせる文章
- 内容がイメージできる画像

が大事だなーと、改めて考えさせられました。

#申込後に準備したこと

タイムスケジュールを一通り読んで、「networked-aframeってなに？」「EasyVRStudioっておいしいの？」というレベルで、準備に必要なことを確認しました。

>当日は以下のURLよりご参加をよろしくお願い致します。
>[会場入場](https://hub.link/d3VkEtm)

あ。**これだけ**なんだね。
「会場入場」をクリックすると、[Mozilla Hubs](https://hubs.mozilla.com/)に入って、言われるがままにメールアドレスで登録。（登録はGoogleアカウント取るよりカンタン！）

登録しなくても入場できましたが、登録しておいたほうがいろんな機能がついてるんじゃないかな？と期待して…。

<br>
あとは当日を待つばかりです！
このときは、アバターが登録できるなんて思いもしなかったです。自分はあくまでもギャラリーの立場で、VRのすごい人たちがあれこれ動かすのを観るだけと思ってました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587320/3c4765ef-86b2-4238-600c-45111b1baf82.png" width=10%> ＞＞＞＞＞＞[【VR日記②】](https://qiita.com/web500/items/386222fe6fb569adc455)へ続く・・・
SSM PortForwardでのWindows RDPもhost名でつなぎたい

[前回](https://qiita.com/naoaki-yzrh/items/54f364f23bfbab271821)の続きです

SSM PortForwardによるRDP接続もInstanceIDが必要・コマンドが長ったらしいのでスクリプト化してみました
通常なら下のような感じで実行し、RDPの接続先として `localhost:13389` を指定することになります

```
aws ssm start-session --target i-xxxxxxxxxxxxxxxx --document-name AWS-StartPortForwardingSession --parameters "portNumber=3389,localPortNumber=13389" --profile yuzuriha
```

コードはたいして変わってませんｗ
awscliのところぐらいです

```python:rdp_proxy.py
#!/usr/bin/python

import sys
import os
import subprocess
import argparse

from boto3.session import Session


def start_port_forward(profile, hostname, port):
    session = Session(profile_name = profile)
    client = session.client('ec2')
    try:
        response = client.describe_instances(
            Filters = [
                {
                    'Name':   'tag:Name',
                    'Values': [hostname]
                }
            ]
        )
    except:
        return

    subprocess.call([
        'aws',
        '--profile',
        profile,
        'ssm',
        'start-session',
        '--target',
        response['Reservations'][0]['Instances'][0]['InstanceId'],
        '--parameters',
        'portNumber=3389,localPortNumber={0}'.format(port),
        '--document-name',
        'AWS-StartPortForwardingSession',
    ])


def main():
    parser = argparse.ArgumentParser(
        formatter_class = argparse.RawTextHelpFormatter,
    )
    parser.add_argument('--profile')
    parser.add_argument('--host')
    parser.add_argument('--port', default=13389)
    args = parser.parse_args()

    start_port_forward(args.profile, args.host, args.port)

    sys.exit(0)


if __name__ == '__main__':
    main()
```
自宅などで複数人が別のテレカン(hangouts, meet, zoom, discord etc)でモブプログラミングとかしているときに、入出力共にクリアな音声を確保する方法

## TL;DR

まぁ、 Bose Noise Cancelling Headphones 700 かなと。

## 履歴

MacBook Pro の default speaker and microphone

↓

まぁ、microphone 自体の性能が低いよね

↓

ゼンハイザーの片耳ヘッドフォン

↓

マイクから別テレカンの声入っちゃうよね

↓

FIFINE-T669-USB単一指向性コンデンサーマイクセット & SONY イヤホン MDR-XB55 : カナル型 グレイッシュホワイト MDR-XB55

↓

単一指向性なら。。。いややっぱ別テレカンの声入るよね。。

↓

Bose Noise Cancelling Headphones 700

↓

マイクの方のノイズキャンセリングすげぇw 解決w
FlaskとDjangoのJSONデータの受け取り方の違いにハマる

こんばんは、@0yanです。
今日はLINE WORKS版Trello BotのFlaskアプリを、LINE WORKS問い合わせ対応BotのDjangoアプリに統合する際、JSONデータの受け取り方の違いにハマった（ダサイ･･･）ので、しくじり先生的な感じで記事書きます。
※LINE WORKS版Trello Botの作成方法は[こちら](https://qiita.com/0yan/items/b112024cfe9eed443795)

#Flaskの場合
`data = request.json['key']`で、辞書型の値として受け取れます。

```python:具体例（Flaskの場合）
@app.route('/webhook', methods=['HEAD', 'POST'])
def comment_notification_to_talk_room():
    if request.method == 'HEAD':
        return '', 200
    elif request.method == 'POST':
        action_type = request.json['action']['display']['translationKey']  # ★ココ
        if action_type == 'action_comment_on_card':
            card_name = request.json['action']['data']['card']['name']
            user_name = request.json['action']['memberCreator']['fullName']
            comment = request.json['action']['data']['text']
            message = f'{user_name}さんがコメントしました。\n【カード】{card_name}\n【コメント】{comment}'
            talk_bot.send_text_message(send_text=message)
            return '', 200
    else:
        abort(400)
```


#Djangoの場合
`body = json.loads(request.body)`のように、JSONから辞書型に変換する必要があります。

```python:具体例（Djangoの場合）
def comment_notification_to_talk_room(request, bot_no, account_id=None, room_id=None):
    talk_bot = TalkBotApi(api_id, server_api_consumer_key, server_id, private_key, domain_id, bot_no)

    # リクエストボディをJSONから辞書型に変換、action_typeを取り出す
    body = json.loads(request.body)  # ★ココ
    action_type = body['action']['display']['translationKey']

    # TrelloのコメントをLINE WORKSトークルームに送信
    if action_type == 'action_comment_on_card':
        card_name = body['action']['data']['card']['name']
        user_name = body['action']['memberCreator']['fullName']
        comment = body['action']['data']['text']
        message = f'{user_name}さんがコメントしました。\n【カード】{card_name}\n【コメント】{comment}'
        if account_id is not None:
            talk_bot.send_text_message(send_text=message, account_id=account_id)
            logger.info(f'通知成功  accountID:{account_id}')
        elif room_id is not None:
            talk_bot.send_text_message(send_text=message, room_id=room_id)
            logger.info(f'通知成功  roomID:{room_id}')
        else:
            logger.error('accoutId, roomIdはどちらか一方を指定する必要があります。')
```


いやー、こんなくだらないことに数時間使ってしまうとは･･･。
この失敗が誰かの役に立つことを願っています。
Django2系でform.is_valid()の結果が常にFalseになる事象の対応

# 事象と環境

## 事象

**views.py**に書いた**View**クラスの**post**メソッドで、**is_valid**を実行した。
WEBブラウザ上でどのような入力をした場合でも、**is_valid**の結果が**False**になった。

forms.pyでバリデーションメソッドは実装していない。

以下にソースコードの抜粋を示す。
**Form**クラスに**Meta**クラスがあるが、今回の事象とは関係ない認識である。

```python:views.py
class View(View):
    def post(self, request, *args, **kwargs):
        form = Form()
        is_valid = form.is_valid()
        print(is_valid)
        ...
```

```python:forms.py
class Form(forms.ModelForm):
    class Meta:
        model = ExperimentResult
        fields = ("title", "comment",)
        widgets = {
            'title' : forms.TextInput(attrs={'class':'text_area'}),
            'comment' : forms.TextInput(attrs={'class':'text_area'})
        }
```

## 環境

実行環境は**django2.2.12**、python3.7、Windows10である。
※OS、pythonバージョンは関係ないと想定される。

# 原因

Formクラスをインスタンス化する際に、__init__メソッドの第一引数に"request"があることを想定している。

form=FormClass()と書いたときには、__init__メソッドに"request"が渡されない。そのため、"is_valid"メソッドを実行すると、"request"が渡されていないことで、バリデーションエラーが発生し、必ずFalseが帰ってくる。

# 対応

Formクラスをインスタンス化する際に引数としてdata=request.POSTを入れる。
※GETメソッドの場合はrequest.GETになると想定される。

```python:views.py
class View(View):
    def post(self, request, *args, **kwargs):
        form = Form(data=request.POST)
        is_valid = form.is_valid()
        print(is_valid)
        ...
```

上記対応後、Trueが帰ってくることを確認した。

# 参考

https://stackoverflow.com/questions/20801452/django-form-is-valid-always-false
【Javaの基礎知識】型変換について

#はじめに

こちらの記事は、
- Javaをこれから学習し始める
- 基本的なことをおさらいしたい

という方向けです。

型や変数については下記の記事に記載しております。
[【Javaの基礎知識】型や変数について](https://qiita.com/gatchan03/items/d9ca3bc662450b13c413)

#基本型(プリミティブ型)の変換
ある基本型の変数から他の基本型の変数に変換す方法をご紹介します。

| 変換元の基本型| 型変換が可能な変更先の基本型 |
|:-:|:-:|
| char |int, long, float, double|
| byte |short, int, long, float, double|
| short |int, long, float, double|
|int|long, float, double|
| long |float, double|
| float | double |
| double | なし |

##小さい型から大きい型
整数のデータ型は、
`byte < short < int < long`
というサイズ感です。
小さい型から大きい型に変換するとき、**自動的に型が変換される場合**と、**プログラマが意識的に変換を行うキャスト**があります。


```java
    自動的に型が変換される場合

    byte a = 127;
    short b = a;
    System.out.println(b);//出力結果＝127

    short c = 32767;
    long d = c;
    System.out.println(d);//出力結果＝32767
```

```java
    プログラマが意識的に変換を行うキャスト

    byte a = 127;
    byte b = 127;
    System.out.println((long)a + b);//出力結果＝254

    int c = 2147483647;
    int d = 2147483647;
    System.out.println((long)c + d);//出力結果＝4294967294
```

##大きい型から小さい型
大きい型から小さい型への変換は注意が必要です。

以下のやり方だとエラーがでます。

```java
    long a = Long.MAX_VALUE;//longの最大値を代入しています
    System.out.println(a);//出力結果＝9223372036854775807
    short b = a;//Type mismatch: cannot convert from long to short
```

エラーを直す方法はありますが、変数の中身が変わってしまいます。
そのデータ型が持つことのできるサイズを超えるとデータの切り捨て（データの溢れ）が生じ、想定された実行結果になりません。

```Java
    long a = Long.MAX_VALUE;//longの最大値を代入しています
    System.out.println(a);//出力結果＝9223372036854775807
    short b = (short) a;//キャストで型変換しています
    System.out.println(b);//出力結果＝-1
```

#参照型の変換

今回は、クラス型の型変換のみの説明になります。
変換元の参照型がクラス型の場合の変換先の参照型と、型変換のルールが下図の通りです。

| 変換先の参照型 | 型変換のルール |
|:-:|:-:|
|クラス型|変換先のクラス型が変換元のクラス型のスーパークラスであること。|
|インタフェース型|変換先のインタフェース型のインタフェースを変換元のクラス型のクラスが実装していること。|
|配列型	|型変換不可。|

<br>

**参照型暗黙の型変換**
親クラス型 変数 ＝ new 子クラス();

```Java
//親クラス
class Oya {
  void greet() {
    String a = "おはよう";
      System.out.println(a);
  }
}

//親クラスを継承した子クラス
class Kodomo extends Oya {
  void name() {
    String b = "イニエスタ";
      System.out.println(b);
  }
  public static void main(String[] args) {
      Oya oy = new Kodomo();
      oy.greet();//出力結果＝おはよう
      Oya oy2 = new Oya();
      oy2.greet();//出力結果＝おはよう

      Kodomo ko = new Kodomo();
      ko.greet();//出力結果＝おはよう
      ko.name();//出力結果＝イニエスタ
      Kodomo ko2 = new Oya();//エラー：Type mismatch: cannot convert from Oya to Kodomo

  }
}
```
エラーが出ているところにあるように、
子クラス型 変数 ＝ new 親クラス();
はできません。

#文字列への変換
全ての型から文字型へ変換が可能です。

```java
    Integer a1 = 123;
    String s1 = "あ" + a1;
    System.out.println(s1);//出力結果＝あ123
    System.out.println(s1 instanceof String);//出力結果＝true


    int a2 = -123;
    String s2 = String.valueOf(a2);
    System.out.println(s2);//出力結果＝-123
    System.out.println(s2 instanceof String);//出力結果＝true
```

#最後に
参照型の変換に関してまだまだ深くは理解できていないので、
わかり次第追記していく予定です。

それでは、ありがとうございました☕️