OmniAICreator/Qiita-1.07M huggingface dataset:
kaminariをカスタマイズ

ページネーションはkaminariというgemを用いることが多いかと思います。

参考
https://qiita.com/residenti/items/1ae1e5ceb59c0729c0b9

機能面は実装済みという前提で話します。

kaminariを実装すると初めは以下のように見にくいデザインになっているかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614347/9fcae48c-169f-a978-68d7-9bbf70a53c9e.png)


例えば、これを以下のように変えましょう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614347/c3429f12-f52b-e6e0-c57f-08001f19344d.png)

上記リンクのように、bootstrapを適用するという方法もありますが、リンクホバーなど自分でカスタマイズしたいですよね。

#kaminariのviewファイルを作成

ターミナルにて以下を打ち込んでください。

```
rails g kaminari:views default
```
これによりviewフォルダの中にkaminariのview一覧が作成されました！これはそのままにして次に進んでください！

#日本語化
kaminariのgemのデフォが英語になっているので、これを日本語環境に変える必要があります。まず、config/applicationファイルをに以下を追記します。

```config/application.rb
config.i18n.default_locale = :ja
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
```
一行目は、日本語環境を適用、二行目は複数のlacaleファイル(後述)が適用されるコードになります。

全体としては以下のようになっているかと思います。

```config/application.rb
require_relative 'boot'

require 'rails/all'

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module Geektwitter
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 5.1
    config.i18n.default_locale = :ja
    config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded.
  end
end
```
これで日本語化が適用されます。

次にconfig/localesフォルダーにkaminari_ja.ymlを作成してください。(ja_ymlファイル中に例えばcreated_atの日本語化が既に書いてある場合、他の日本語化は本ページのように別のファイルを作成する必要があります。)

その中に以下をコピペします。

```config/locales/kaminari_ja.yml
ja:
  views:
    pagination:
      first: "&laquo; 最初"
      last: "最後 &raquo;"
      previous: "&lsaquo; 前へ"
      next: "次へ &rsaquo;"
      truncate: "..."
```

英語を日本語に変えました！

#カスタマイズ
次に該当のcssファイルに以下を追記しましょう。

```tweets.css
// paginate
.pagination{
  margin: auto;
  width: 50%;
  display: flex;
  justify-content: flex-start;
}
.pagination span{
  background-color: rgba(158, 158, 158, 0.4);
  text-align: center;
  width: 50px;
  border: solid 1px #344963;
  color: rgb(197, 20, 159);
  transition: .3s;
  -webkit-transform: scale(1);
  transform: scale(1);
}
.pagination span:hover{
  transition: .3s;
  -webkit-transform: scale(1.1);
  transform: scale(1.1);
}
.pagination span a:hover{
  transition: .3s;
  -webkit-transform: scale(1.1);
  transform: scale(1.1);
}
```
**※注意※**
**日本語環境に変えたあと、一度rails sを再起動して下さい。**

これで良い感じになったかと思います！色合いや位置の調整(width)は、各自変えてみてください！
「30日でできる！OS自作入門」四日目(harib01a〜harib01h)をUbuntu18.04/NASMで作る

#はじめに
[「30日でできる！OS自作入門」三日目](https://qiita.com/furble/items/e6b483c0572963e15bea)の続きです。

#環境
```bash
$ uname -a
Linux furble 5.3.0-45-generic #37~18.04.1-Ubuntu SMP Fri Mar 27 15:58:10 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

$ nasm -v
NASM version 2.13.02

$ qemu-system-i386 --version
QEMU emulator version 2.11.1(Debian 1:2.11+dfsg-1ubuntu7.23)

$ gcc --version
gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
```

#harib01a〜harib01e
新しく変える必要のある箇所無し。

#harib01f
nasmfunc.asmの頭は以下のようにしました。

```Nasm:nasmfunc.asm
section .text
		GLOBAL	io_hlt, io_cli, io_sti, io_stihlt
		GLOBAL	io_in8,  io_in16,  io_in32
		GLOBAL	io_out8, io_out16, io_out32
		GLOBAL	io_load_eflags, io_store_eflags
...
```
#harib01g、harib01h
新しく変える必要のある箇所無し。

今回は楽でしたね。
InputSystemでPress Any Keyを作る

#概要
ＰＣ向けのゲームを真面目に作ろうとすると、キーボード、ゲームパッド、マウス他の対応。
特に全部に対応したタイトル画面のPress Any Keyを作るのが面倒くさいですよね。
各デバイスごとの決定キーだけ対応させるっていう手抜きもありえますが、新しいInputSystemなら取得に必要なコードは実質1行！
おそらくゲームパッド上のメニューボタンなどにも反応してしまうので使う場合はお気をつけて

#環境
2019.3.6f1

#ソース

``` C#
    public class TitleManager : MonoBehaviour
    {
        private InputAction _pressAnyKeyAction = 
                new InputAction(type: InputActionType.PassThrough, binding: "*/<Button>", interactions: "Press");

        private void OnEnable() => _pressAnyKeyAction.Enable();
        private void OnDisable() => _pressAnyKeyAction.Disable();

        void Update()
        {
            if(_pressAnyKeyAction.triggered)
            {
                //シーン読み込み、アニメーション読み込みなどなど
            }
        }
    }

```
FileVault をオフにして開発速度を上げよう！

ベンチマークだと書き込みが`1.3GB/s` から `0.9GB/s` になるぐらい

* アプリの起動とかが遅いわけではない
* 開発するする時のホットリロードとかは非常に遅い！

FileVaultをオフにすればNuxtのホットリロードだと、体感の比較は2倍以上早くなった
ページトップボタン

以下のようなページトップボタン(ページの右下当たりにあって、クリックすると一番上に戻ってくるやつ)を実装します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614347/adf5e81e-46bd-e45a-b741-515a3c4c191a.png)

まず、ボタンを置きたいhtmlに以下をコピペ

```index.html.erb(など)
<p id="pagetop"><a href="#">↑ </a></p>
```

これがページトップの指令になります。

次に以下を該当cssファイルにコピペしましょう。

```tweets.css
/*ページトップ設定*/
#pagetop {
  margin-right: 10px;
	clear: both;
	padding-bottom: 40px;
}
#pagetop a {
	color: #FFF;		/*文字色*/
	font-size: 20px;	/*文字サイズ*/
	background: grey;	/*背景色*/
	text-decoration: none;
	text-align: center;
	display: block;
	float: right;
	border-radius: 30px;	/*角丸のサイズ*/
	width: 50px;
	line-height: 50px;
}
```

良い感じになるかと思います！
【pythonクラス変数】qiitaの記事でデマを流していた件について

# はじめに

先日、自分のために書いたメモをちょっと整形して[qiitaの記事](https://qiita.com/basashi/items/69fee6df0f23f140e91c)にして投稿したところ、[@shiracamus](https://qiita.com/shiracamus)さんからのコメントで、ちょこちょこ勘違いをしているしていることが判明したため、反省を含め、インスタンスやクラス周りの勘違いしていたところをまとめました。

**勘違い集なので、正しいのは題名の否定です（笑）**

間違いを指摘してくださった[@shiracamus](https://qiita.com/shiracamus)さん、ありがとうございました。

# 第一の勘違い: クラスはオブジェクトじゃない

Javaの入門書読んだときの「型がクラスで、その型から作られたものがインスタンス」という記憶につられて、「インスタンスはクラスから作られたオブジェクト!!、クラスはオブジェクトじゃない!!」という思い込みをしていたのでありました。

```python
class hoge:
    pass
print(type(hoge))
```

結果

```
<class 'type'>
```

クラスはインスタンスとは違う何かだと思っていました。が、どちらもオブジェクトであり、確かに、typeクラスのインスタンスですね。

ちょっと道をそれた話になってしまいますが、`__init__()`の中でクラス変数を定義したいと思います。(引用: [@shiracamus](https://qiita.com/shiracamus)さんのコメント)

```python
class Person:
    def __init__(self, name):
        type(self).name =  name
```

`type()`はオブジェクトに対して使うと、クラスを返すため`class.function()`の形になり、クラス変数を定義できます。

# 第二の勘違い: クラス変数もインスタンス変数もどちらも結局は、インスタンスの持つ変数

この勘違いも、第一の勘違いから来ています。クラスはオブジェクトじゃないと思っていたので、値は保持しないのではないかと思っていました。

実際にはインスタンスとクラスはどちらもそれぞれ、変数の一覧を持っていてます。クラス直下で定義した変数はもちろんクラスの変数の一覧に入りますし、`instance.function()`はインスタンスの変数一覧に（`self.function()`もこの一例ですね）、`class.function()`はクラスの変数一覧に入ります。

クラス変数を参照するときは、単にクラス変数の一覧を探しに行きますが、インスタンス変数を参照するときには、まず、インスタンス変数の一覧を探した後に、なかったらクラス変数の一覧を探しに行く、といった感じです。そのように考えると下の表にまとめた違いも納得できますね。（参考:　[Python の属性 - クラス変数とインスタンス変数ってなに？ | 民主主義に乾杯](https://python.ms/attribute/) ）

| 違い                               | クラス変数                     | インスタンス変数                 |
| ---------------------------------- | ------------------------------ | -------------------------------- |
| クラスオブジェクトからの参照       | できる                         | できない                         |
| インスタンスオブジェクトからの参照 | できる                         | できる                         |
| 変更すると                         | すべてのインスタンスに影響する | 特定のインスタンスにだけ影響する |

# 第三の勘違い: インスタンスの関数を呼び出すと自動的に第一引数が補完される

イメージとしてはあっていましたが、実際には、インスタンスの持つメソッドとクラスの持つメソッドはクラスがそもそも違いました。

```python
class hoge:
    def piyo():
        pass    
print(type(hoge.piyo))
hoge1 = hoge()
print(type(hoge1.piyo))
```

結果

```
<class 'function'>
<class 'method'>
```

クラス内に定義したメソッドはfunctionクラスのオブジェクトですが、インスタンス化されると、インスタンス自身を第一引数に追加してクラスの関数を呼び出すmethodクラスのオブジェクトが新たに作られます。ラッパー関数と呼ばれるそうです。このことから、`instance.function()`のような場合、第1引数にインスタンスが渡されるが、`class.function()`とした場合、引数が渡されない理由がわかりますね。[^1]

# 参考

[拙著](https://qiita.com/basashi/items/69fee6df0f23f140e91c)に対する[@shiracamus](https://qiita.com/shiracamus)さんのコメント

[^1]: 厳密にいうと`instance.function()`も``instance.method()``と書くのが正しいのかもしれませんね
Atcoder ABC161 A-EをPythonで

#A ABC Swap
Swapを2回行った結果は$(a,b,c) => (c,a,b)$なので、それを出力する。

```abc161a.py
a,b,c=map(int,input().split())

print(c,a,b)
```

#B Popular Vote
問題文の通りに実装するだけ・・と思ったら以下のコードでWAが出た。

```abc161b_WA.py
n,m=map(int,input().split())

l=list(map(int,input().split()))
s=sum(l)
ans=0
t=s/(4*m)
for i in l:
    if i>t:
        ans+=1
if ans>=m: print("Yes")
else: print("No")
```

~~判定条件をi>tからi>=math.ceil(t)に変えたら通った。math.ceil(t)>t>math.floor(t)のはずなので結果は変わりないはずなんだけど・・未だに謎。~~
（4/13/2020追記：コメントいただいた通り、t=iのケースが抜けてました。）

```abc161b.py
import math
n,m=map(int,input().split())

l=list(map(int,input().split()))
s=sum(l)
ans=0
t=s/(4*m)
for i in l:
    if i>=math.ceil(t):
        ans+=1
if ans>=m:
    print("Yes")
else:
    print("No")
```

#C Replacing Integer
操作：$x$を$x$と$K$の差の絶対値で置き換える、を繰り返した場合最小になる値は$Nmod(k)$または$|N mod(k)-K|$のどちらか小さいほうになるのでそれを出力する。例えば$N=7, K=3$の時は
$Nmod(K)=1,  |Nmod(k)-K|=|-2|=2$だが、
$K=4$だと$Nmod(K)=3$,  $|Nmod(k)-K|=|-1|=1$となる。

```abc161c.py
n,k=map(int,input().split())

a=n%k
b=abs(n%k-k)

print(min(a,b))
```

#D Lunlun number
初めに1-9が格納された配列を用意する。ルンルン数はこの各要素に$(-1,0,1)$を足した値を後ろに加えた値になる。例外として、$9+1=10$になるのでこれを除く。配列の要素数をカウントして$i>10^5$になったら打ち止め。

```abc161d.py
k=int(input())

q=["1","2","3","4","5","6","7","8","9"]
x=9
for i in q:
    if x>100000:
        break
    x+=1
    a=i[-1]
    for j in ([-1,0,1]):
        bb=int(a)+j
        if bb<10 and bb>=0:
            q.append(i+str(bb))
 
       
print(q[k-1])
```

#E Yutori
左端から〇を数え上げていった場合、そのステップ数は「この日までに働ける最大の日数」になる。
右側から〇を数え上げていった場合、そのステップ数は「この日から働ける最大の日数」になる。

この2つのリストを使って、$i$日目に働かない場合の最大稼働日数を算出するには、
左端からのリストの$i-1$日目のステップと右端からのリストの$i+1$日目のステップの和を求めればいい。
この和が$K$日に満たない時、その日は必ず働かなければいけない日になる。

35-38行目はもっとスマートなやり方があるような気がします。

```abc161e.py
n,k,c=map(int,input().split())
s=input()

available=[]
for i in range(n):
    if s[i]=="o":
        available.append(i)

#左側から〇を数える
left=[0]*n
rest=0
cnt=0

for i in range(n):
    if s[i]=="o" and i>=rest:
        cnt+=1
        left[i]=cnt
        rest=i+c+1
    else:
        left[i]=cnt

#右側から〇を数える
right=[0]*n
rest=n-1
cnt=0

for i in range(n-1,-1,-1):
    if s[i]=="o" and i<=rest:
        cnt+=1
        right[i]=cnt
        rest=i-c-1
    else:
        right[i]=cnt

#-1日目、n+1日目がエラーにならないように0を足す        
for i in ([left,right]):
    i.insert(0,0)
    i.append(0)

ans=[]

for i in range(1,n+1):
    a=left[i-1]+right[i+1]
    if a<k:
        ans.append(i)
    
for j in ans:
    print(j)
```
docker × rails × vue.js で環境構築をしてみた。

##謝辞
下記に記載されている手順は少し前後があるかもしれません。
私は最初に参考サイトリンク先を参考にrailsの環境構築をしてからvueを導入しました。なのでgemfileもdockerfileもdocker-compose.ymlも
最初から下記の記述をしていた訳ではありません。手順6以降が怪しいのでご了承をお願いします。
コメントで指摘いただけますと幸いです。

都度、更新していきます。

#手順
1.Dockerfile,docker-compose.yml,gemfile,gemfile.lockを作成。
※Dockerfile,docker-compose.ymlについては下記に明記。

2.gemfileに下記を記載。

```ruby:Gemfile
source 'https://rubygems.org'
gem 'rails', '~> 5.2.2'
gem 'webpacker', github: 'rails/webpacker'

```
3.gemfile.lockは中身は何も記載しなくてOK

4.アプリ新規作成

```
docker-compose run web rails new . --force --database=mysql --skip-bundle
```

5.database.ymlを修正

```ruby:database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password # docker-compose.ymlのMYSQL_ROOT_PASSWORD
  host: db # docker-compose.ymlのservice名

```

6.コンテナのビルド

```
$docker-compose build
```

7.vueを導入

```
$ docker-compose run web rails webpacker:install
$ docker-compose run web rails webpacker:install:vue
```

8.vue.js ファイルのビルド

```
$docker-compose run web bin/webpack
```

9.db作成

```
$docker-compose run web rails db:create
```

10.起動

```
$docker-compose up
```

##参考サイト
・[丁寧すぎるDocker-composeによるrails5 + MySQL on Dockerの環境構築(Docker for Mac)](https://qiita.com/azul915/items/5b7063cbc80192343fc0)

・[Rails5.2 + Docker環境にVue.js (Webpacker) を導入する](https://remonote.jp/rails-docker-vuejs-construction)

・[Vue.jsをつかったRuby on Railsプロジェクトのはじめかた(with Docker)](https://futurismo.biz/how-to-start-vuejs-rails-app/)


##Dockerfile

```ruby:Dockerfile

ROM ruby:2.5.3
  
RUN apt-get update -qq && apt-get install -y build-essential
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash
RUN apt-get install -y nodejs
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update -qq && apt-get install yarn

RUN mkdir /app_name
ENV APP_ROOT /app_name
WORKDIR $APP_ROOT

ADD ./Gemfile $APP_ROOT/Gemfile
ADD ./Gemfile.lock $APP_ROOT/Gemfile.lock

RUN bundle install
ADD . $APP_ROOT
```

##docker-compose.yml

```ruby:docker-compose.yml

ersion: '3'
services:
  db:
    image: mysql:5.7
    volumes:
      - db-volume:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: root
    ports:
      - "3306:3306"

  web: &app_base
    build: .
    command: rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/app_name
      - bundle:/usr/local/bundle:delegated
      - node_modules:/app/node_modules:delegated
    ports:
      - "3000:3000"
    depends_on:
      - db
    tty: true
    stdin_open: true

  webpack:
    <<: *app_base
    command: "bin/webpack-dev-server"
    ports:
      - "3035:3035"
    depends_on:
      - web
    tty: false
    stdin_open: false

volumes:
  db-volume:
  bundle:
  node_modules:

```
【備忘録】Web系のタグ

初めてのWeb系なので自分向けの備忘録

【input typeでのidとnameの違いと使い方】
id：CSSとかで指定する際に使う
name：値を渡すときに使う。

サーブレット側で受け取るときは「HttpServletRequest」のgetParameterメソッドにnameタグで指定した値を記載する。

【idなど画面に見せずにサーブレットに渡すとき】
input type="hidden"

【textareaに空白が入っちゃう】
textarea・・・
/textarea
として改行入れちゃってる。
フリーランス でもエンジニアリングマネジメント


こんにちは 0->1 一人立ち上げもするIoT/Webのフルスタックエンジニアです。 

ずっとリーダーやエンジニアリングマネージャとしても様々なプロジェクトに携わってきて、まあ、最近は違うのかもしれないけど、またコンピュータサイエンスなど学んだことはないのだけど、と、思いつつ、自分がソフトウェアプロジェクトを走らせるときに押さえているポイントでをここに書き留めておきたいと思います。 

* 参考とした資料はなく、思いつくままなので、フィードバックいただければ感謝です！
* 以下、webシステム開発の話です。 IoTなどものが絡む開発は、また別です。

## 何をする？
あまりエンジニアリングマネジメントって聞かないのですけれど、プロジェクトを進めるために、 (water fall でも agileでも）要件定義 => 設計 => コーディング => テスト => デプロイ を行うために基礎となるタスクがあります。外部要件から（顧客が環境をしているなど）に対し、内部要件とも言えるものを実現するためのタスクです。 未経験プログラマ志望の新人がプロジェクト兼自分の組織に後輩として入ったときどうするか、っていうユースケースを思い浮かべるといいかもしれません。　あなたは、開発リーダー/マネージャであり、またarchitectも兼任しているとします。

## マネジメントの目的

目的は、開発チーム部隊のお客様として企業やお客様に喜んでもらえるサービスを提供することかなと思います。それぞれの観点で定性・定量評価可能か検討しておくと、施策を振り返るときに客観的にできそうです。

- Quality Code を早くoutputする = プロジェクトのコストを下げる
- 生産性をあげる = プロジェクトのコストを下げる
- エンジニアリングメンバおよびチームをプロジェクトを通じ（人間・技術的に）成長させ、企業・個人の付加価値を増加させる
- 上記を実現する仕組みを作り込んで次のプロジェクトに再利用できるようにする。（全て文書やシステムにはせず、人や組織に実装するところもあります。仕組みの硬直化を避ける必要があります。時代も技術もどんどん変化するのですから）

##  内部要件を押さえる

目的を達成するにあたって、プロジェクト要件だけではなく、内部要件も押さえておく必要があります。　プロジェクトのあるべき規模・開発にかけられるコスト・日程・生産性・自社戦略・利用できるリソース制限・顧客要望・メンバの成長方向（だからメンバとの1on1がまず必要）などです。

## 具体的な活動

- 契約書を読むこと
- セキュリティを考慮すること
- デプロイ先　 GCP? AWS? さくら？ 決める場合には比較し、決定を客観的に説明できる必要（説明責任）ありますよね？
- 製品のアーキテクチャを決める。 lambda? 普通のサーバ？  vue?react typescript ? .... DBは？ -- tech leadがいて、彼/彼女が何かを推してきても絶対鵜呑みにしてはいけません。説明責任を持てるようにします。
- 開発機を決める (どんな性能のPCが必要？　画面は？） 今時の開発は4k画面ぐらいないと辛いと思います。低いパフォーマンスの小さい画面・狭ネットワーク帯域で開発してモチベーション・生産性を低いまま行くのがいいのか、ちゃんとした開発機がいいのか、は（そこそこの大きさのプロジェクトなら後者でしょう）内部要件次第です。
- 開発環境を決める(OS, editor, 仮想環境・・） - 定めないと大変なことになります。バグが特定環境でしか出なかったり、チームに配るリリースの各環境での動作確認が大変だったりと、コストがかかります。自前で解決できるほど優秀なエンジニア集団であれば話は別です。 
- IDE ? vim??? - VSCode? PyCharm? とかも、できれば統一するか分かった上でいろいろ使うかすることでQuality Codeを早く仕上げる役に立ちます。 いっつもvimでやっていてわたしは超高速ですというエンジニアさんがいるのでしたらわたしはコメントできません・・・。 知識に対価を払って学びもせずに楽してqality code 書く派なので。
- docker, virtual box, ...(まさか、素のOS上に環境構築しろというPMがいないことだけを望みます。複数のプロジェクトの作業ができなくなりますね。 OSのアップデートにも振り回されるし、たとえ1年後でも開発環境が再現できなくなる可能性があり、論外です）
- testフレームワーク、CIなどのツール定義
- コミュニケーション手段をきめる: slackならまあOK。（有料でなければビデオ会議手段は別途必要） わたしのようなフリーランスが入っている場合は様々なお客様とやりとりするので（プロジェクトごとに分離できない）charworkでは会話が混乱します。
- リポジトリの運用を決める： git flow とか github flowとか
- チームメンバへの意識づけ・プロジェクトを通じての期待を伝えること
- マイルストーンの設定（製品としての品質確認の上）
- 開発チームの外のステークホルダとのコミュニケーションを徹底的に図る・社内・顧客の期待値コントロール
- チームのそれぞれのメンバとコミュニケーションを継続すること。納期・品質も含めた妥当な成果物を得るためです。 （micro managementではありません）
- チーム内のコミュニケーションを推進すること。社内・社外も含めた勉強会が良い手だと思います。コミュニケーションを疎かにしてうまくいくプロジェクトはがあるでしょうか？
- チーム内の課題（チケットに上がっているものだけではなく）にアンテナをはり、目的に沿った施策を打ち出していくこと。
- 顧客・予算・計画とビジネスゴールを忘れない。
- 世界に通用するチームを作ること。世界は狭くなりました。メンバの競争相手は国内の大都市圏の他社ではなく、世界のエンジニアです。　企業の外で学ぶことを推進すべきです。
- 規格・標準書を押さえる。 W3C HTML5 / CSS や ISO/IEC, ECMA, RFC, IEEEから押さえる。　一方で、mozilla とか実装も学ぶ。
- 言語・ツールなど2年も前の選定は正しくない場合も多いので、言語・技術やオペレーションについて学び続け、リフレッシュして次のプロジェクトに生かす。これをしないと低いスキルでとどまる化石エンジニアリングチームを産むことになってしまいます。
- 生産性向上・教育のための投資として、UMLツールやIDE・PCなどの予算が必要になります。予め年次予算枠を獲得しておき、いざというときに施策が打てないなんていうことが無いようにします。

もっとあるけど、随時更新していきます。
フォームの作り方

##input要素
input要素は１行のテキスト入力の要素です。
※input要素は終了タグが不要です。
【例】

```
<form>
 <p>テキスト入力</p>
 <input>  #終了タグは不要
</form>
```
##textarea要素
textarea要素は複数行のテキスト入力の要素です
【例】

```
<form>
 <p>テキスト入力</p>
 <textarea></textarea>
</form>
```
##送信ボタン
送信ボタンにも、input要素を使います。
input要素にtype属性を指定でき、type属性にsubmitを指定すると、入力欄ではなく、ブラウザに設定されている言語で送信ボタンが表示されます。
日本語のブラウザではデフォルトで「送信」になります。
テキストを変更するには、value属性に値を指定することで、ボタンに表示されるテキストを変更することができます。
【例】

```
<form>
 <p>テキスト入力</p>
 <textarea></textarea>
 <input type = "submit"　value = "送信します">
</form>
```
classを指定する場合

```
<input class = "sample-submit" type = "submit" value = "送信します">
```
返信機能実装時、工夫した点 -newアクション-

投稿に対する返信機能を作成する際に、newアクションの実装を少し工夫することで便利にすることができました。

#●実装コード
Q&Aサイトを実装しているため、投稿＝Question 返信＝Answerとなっています。

```ruby:app/contorollers/answers_controlelr.rb
  def new
    @question = Question.find(params[:id])
    @answer = @question.answers.build
  end
```
```ruby:config/routes.rb
  get  "/answers/:id", to: "answers#new", as: :new_answer
  resources :answers, except: %i(new)
```

#●解説
###1.アソシエーションでquestionを取得することができる。
```ruby:app/contorollers/answers_controlelr.rb
  def new
    @question = Question.find(params[:id])
    @answer = @question.answers.build
  end
```
こうすることで、@answer = @question.answersとすることで、@answer.questionのような形で、questionを取得することができます。例えば下記のように活用したり。

```ruby:app/contorollers/answers_controlelr.rb
def create
redirect_to question_path(@answer.question)
```



###2.@questionを取得することで、"answers/new" ページに質問の内容を記載することができる。
```ruby
get  "/answers/:id", to: "answers#new", as: :new_answer
  resources :answers, except: %i(new)
```
こうすることで、/new/:question_id　とすることができます。
この記述がないと、/new.question_id　となってしまい、パラメーターを渡すことができません。


#●まとめ
あくまで自分はポートフォリオを作成している段階のレベル感です。
もっと良い実装方法や誤りがありましたら、指摘して頂けますと大変助かります。
ABC157「Friend Suggestions」

# [Friend Suggestions](https://atcoder.jp/contests/abc157/tasks/abc157_d)

## 考えたこと

- ぱっと見難しくはなさそう（解けなかったんだけどね）

- 友達候補の条件を読む
  - 最後の条件が複雑だけどちゃんと読むと、a, bが連結成分上にあればいいってことが書いてある（最初これ読んでなくて死んだ）
- なんかよくわかんなくて終了



## 解法

1. 求めたいものを明確にする
   - 条件を読むと、友達候補の数は「連結成分の大きさ - 連結成分上の友達の数 - 連結成分上のブロックの数」になることがわかる
   - なので、連結成分の大きさ、連結成分上の友達の数、連結成分上のブロックの数がわかれば解ける
2. 連結成分の大きさを求める
   - DFSで節点にラベルをつける。同じ連結成分上にある接点のラベルは同じ値っていう設定
   - ここの計算量ちょっとわかんないけど、TLEにはならない（頭いい人教えて...）
3. 答えを求める
   - 答えはこれ→連結成分の大きさ - 連結成分上の友達の数 - 連結成分上のブロックの数
   - 連結成分上の友達の数は、普通に友達の数でOK
   - 連結成分上のブロックの数は、ラベルが同じかを比較すれば判定できる
   - ってこととで解ける



## [コード](https://atcoder.jp/contests/abc157/submissions/11900898)

```cpp
#include <bits/stdc++.h>
using namespace std;

int N, M, K;
int A[111111];
int B[111111];
int C[111111];
int D[111111];
vector<int> F[111111];
vector<int> bl[111111];
int label[111111]; // 節点iのラベルはlebel[i]
map<int, int> label_cnt; // label[l]: ラベルlの連結成分の大きさ

// 連結成分の大きさを求める
int dfs(int now, int l) {
	label[now] = l;

	int ret = 0;
	for (int child : F[now]) {
		if (label[child] != 0) continue;
		ret += dfs(child, l) + 1;
	}

	return ret;
}

int main() {
	// 入力
	cin >> N >> M >> K;
	for (int i = 0; i < M; i++) {
		cin >> A[i] >> B[i];
		A[i]--, B[i]--;
		F[A[i]].push_back(B[i]);
		F[B[i]].push_back(A[i]);
	}

	for (int i = 0; i < K; i++) {
		cin >> C[i] >> D[i];
		C[i]--, D[i]--;
		bl[C[i]].push_back(D[i]);
		bl[D[i]].push_back(C[i]);
	}

	int l = 1; // ラベル番号
	for (int i = 0; i < N; i++) {
		if (label[i] != 0) continue;
		label_cnt[l] = dfs(i, l) + 1;
		l++;
	}

	for (int i = 0; i < N; i++) {
		int ans = label_cnt[label[i]] - 1 - F[i].size();
		for (int b : bl[i]) {
			if (label[b] == label[i]) {
				ans--;
			}
		}
		cout << ans << " ";
	}
	cout << endl;
}
```





## 感想

- 同じグループのものにラベルをつけるって発想がなかった
  - 言われてみれば当たり前なんだけどね。なんで思いつかないんだろうね
  - ラベルつけたら、同じグループかどうかを一瞬で判定できるから強い
-  Union Findでも解ける
  - 気力ないからねる
  - Union Find使ってないのにタグつけちゃったごめん
機械学習入門したけどやめたのでここにメモる

#概要
pythonを用いた機械学習を入りだけ学ぶ機会があったので、かじってはみたが、コロナの影響で通っていたスクールが中止に。。
大雑把でランダムではあるが、学んだことを記録として残させてもらいます。

##機械学習とは
主にコンピュータなどに学習(ルールを学ばせる)させ、学習したことに基づいて処理（判別や予測）をさせる事。

##scikit-learn
pythonの機械学習ライブラリ。機械学習のアルゴリズムが多く実装されている。
初学者が学ぶには最適なライブラリ。

##Numpy
pythonの計算パッケージ。高等数学の計算を容易に行うことができる。

構文例

```

import numpys as np
numpy.zeros(dtype=None)   #メモリの割り当て

```

##グラフ化

import matplotlib.pyplotモジュール
機械学習などにおいて、グラフを描写するためのモジュール

構文例

```
import matplotlib.pyplot

matplotlib.pyplot.scatter(データ1,データ2,  s=サイズ, c=色, marker=マーカーの形, cmap=カラーマップ, norm=None,  vmin=正規化時の最小値, vmax=正規化時の最大値, alpha=透明度, linewidths=線の太さ,　edgecolors=線の色)　 #散布図を描写
```



##決定木
####メリット
- 分類ルールを樹木モデルとして可視化できるため結果の解釈が比較的容易。
- 分類したルールを編集することもできる
- 学習のための計算コストが低い

####デメリット
- 過学習してしまう傾向があるく
- 扱うデータの特性によっては樹木モデルを生成することが難しい場合がある
決定木の分類器の生成

構文例

```
tree.DecisionTreeClassifier(分岐の深さ)
```

###アンサンブル学習
いくつかの性能の低い分類器（弱仮説器）を組み合わせて性能の高い分類器を作る手法。この手法は２つに分類できる

- バギング
学習データの抜けや重複を許容して複数のグループに分割して、弱仮説器を生成する手法。その分類結果の多数決を取る。

- ブースティング
複数の弱仮説器を用意して重み付きの多数決で分類を実現する。
難易度の高い学習データを分類できるように繰り返し重みを更新していく

###サポートベクターマシン
分類にも会期にも使える優れた教師あり学習のアルゴリズム
学習データノイズにも強く、分類性能が非常に高いのが特徴。
分類速度は他のアルゴリズムと比べると、遅くなり、基本的には2クラスの分類器となるため、他クラスの分類を行うためには複数のサポートベクターマシン分類器を組み合わせる必要がある。

##回帰問題
数値を予測する問題。学習時に入力、出力データの組から規則を学び、未知のデータに適切な出力を生成できるようにする。

####線形回帰
直線的な関係を推定する回帰

####非線形回帰
線形回帰ではない回帰

####最小二乗法
(実際の値-予測値)**2

最小二乗法を実装したlinear_model.LinearRegression()というモジュールを使用して線形単回帰を作る。

```
from sklearn import svm
classifier = svm.SVC(パラメータの指定)  #分類器の生成
```

###クラスタリング

scikit-learnのsklearn.clusterモジュールを使用する。

####K-means
クラスタ数をあらかじめ設定して、徐々にクラスタ化を進める方法

```
from sklearn import cluster

変数 = cluster.KMeans(n_clusters=クラスタ数)　　#k-meansを実行して分類器に代入
変数.fit(データ)　　#クラスタ化
```

sklearn.datasetsモジュールの関数はBunch型のオブジェクトを返す

####Bunch
sklearnのdatasetの型。

```
from sklearn.database.base import Bunch

Bunch(data:データ, target:ラベル) #sklearnのデータの形に変換する
```

#####copy
要素が同一の意味を持つが、元と違うメモリを使用している複製オブジェクトを返す

#####view
元の配列と同じメモリを使用している複製オブジェクトを返す。元の配列が変更されたら、複製したオブジェクトも変更される。メモリの節約にも使える。

####globモジュール
条件を満たすファイル名、ディレクトリ名などのリストやイテレータを取得できる

##pandas
データ分析用のライブラリ。主なデータ構造はSeries,DataFrameでそれぞれ1次元配列を高機能にしたような構造、後者は二次元配列でスプレッドシートに似た構造になっている。

```
import pandas as pd

変数 = pd.DataFrame(二次元配列)　#DataFrameの作成

```

機械学習のsklearnではpandasの形式では使えないためndarrayのに変換して機械学習でデータを使用するためvalues、もしくはas_matrixで変換する

#まとめ
色々雑にはまとめてあるので、分かりにくいが、今後機械学習を使う機会があれば色々更新しようと思う
DartのListやMapのClone(Deep Copy)

Dartには、Javaのような`Clone`メソッドがありません。
なので、シャローコピーではなく、ディープコピーが欲しい場合、普通のオブジェクトでも色々と面倒なことをしないといけません。

ListやMapとなると更に大変です。
多分一番スマートな方法で、こうかな？

```dart
List<String> clone = []..addAll(originalList);
```

空で初期化して、`addAll`する、というものです。

しかし、Dart2.3.0以降から、更に便利な構文が導入されていたので紹介します。

```dart
List<String> clone = [...originalList];
```

これだけ！

Mapでも出来ます。

```dart
Map<String, int> clone = {...originalMap};
```

テストコードを書いてみました。

```dart
void main() {
  test('list deep copy', () {
    var list = [1, 2, 3, 4, 5, 6, 7];
    var list2 = [...list];
    expect(listEquals(list, list2), isTrue); // これはpass
    expect(list == list2, isTrue); // ここはfail
  });

  test('map deep copy', () {
    var map = {1: 'a', 2: 'n', 3: 'v'};
    var map2 = {...map};
    expect(mapEquals(map, map2), isTrue); // これはpass
    expect(map == map2, isTrue); // これはfail
  });
}
```

ListやMapの`operator==`は、基本的にインスタンスが同じかの比較になりますので、ディープコピーしたオブジェクトとは一致しないわけですが、それぞれ、中身の比較を行う`listEquals`、`mapEquals`は成功するというわけです。

`...`は、**spread operator**と言うそうです。
https://dart.dev/guides/language/language-tour#spread-operator

Dartって面白い言語ですね。

# 参考サイト

https://stackoverflow.com/questions/21744480/clone-a-list-map-or-set-in-dart
RailsでGoogleAnalyticsを設定する

Railsで作成したアプリにGoogleAnalyticsを設定することがたくさんあると思う。
[google-analytics-rails](https://github.com/bgarret/google-analytics-rails)という便利なgemがあるそうだが、PRを見てみると2017年10月で終わっている…
多分メンテナンスされていないし、gemを使うほどでもないので自分で設定することにしたが、RailsからJavascriptへの変数の渡し方に手間取ったので残しておく。

## Analyticsタグの設置
GoogleAnalyticsタグは`head`に書いていく。今回はログインしている場合は変数`current_user`をJavascriptに渡してあげて、ログインしていない場合は変数を渡さないという仕様にする。
この`current_user`をRailsからJavascriptに渡す時にかなり工夫した。

## コード
コードを書いていく。テンプレートエンジンはslimを使っている。

```slim:app/views/layouts/application.slim.html

doctype html
html
  head
    meta content=("text/html; charset=UTF-8") http-equiv="Content-Type"
    = csrf_meta_tags
    = stylesheet_link_tag 'application', media: 'all'
    = javascript_include_tag 'application', 'data-turbolinks-track': 'reload'
    - if Rails.env.production?
      = render './google_analytics'
```

Analyticsは本番環境だけで動かしたいので`if Rails.env.production?`の中に入れる。
Analyticsスクリプトは他のファイルでも使う可能性があり使いまわしたいので、部分テンプレートで共通化しておく。
先に答えを出すと、下記のようなコードになる。

```slim:app/views/layouts/_google_analytics.slim.html

script async="" src="https://www.googletagmanager.com/gtag/js?id=#{トラッキングID}"
javascript:
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'トラッキングID');
  if (#{raw current_user.to_json}) {
    gtag('set', {'user_id': #{raw current_user.to_json}.id});
  }
```

RailsからJavascriptに変数を渡す場合、その変数のデータ型がintegerの場合はそのまま渡して問題ないが、それ以外の場合は`current_user.to_json`というように`to_json`をつけてあげないといけない。
また、エスケープ処理をさせないために、`ActionView::Helpers::OutputSafetyHelper`で用意されている`raw`メソッドを使用する。
こうすることで、Railsの`current_user`を`gon`などを使わずに渡すことが出来た。
メソッド

# メソッド
データに対して`.関数名()`で呼び出せる関数のことです。`.`の左に書いたデータが第1引数となります。
関数を続けて適用する場合に入れ子にすることなく記述できます。
また、開発環境によっては`.`をタイプした時点でメソッドの候補が出るためコーディングが非常に楽になります。

~~~rust
fn main() {
    // 文字列を整数に変換。parseは失敗する可能性があるメソッドなのでエラー処理が必要。
    // unwrap()はエラーの場合panicになる。エラーでなければ値を取り出す。
    let mut number: i32 = "3".parse().unwrap();

    // i32型はpowメソッドを呼び出すことができる。
    number = number.pow(2); // numberを2乗する
    println!("3の2乗は {} です。", number);

    // まとめて書いてもメソッド構文なら読みやすい
    // メソッドを続けて書くことをメソッドチェーンと言う
    let number: i32 = "3".parse::<i32>().unwrap().pow(2);
    println!(
        "3の2乗は {} です。1行で計算しました。",
        number
    );
}
~~~

メソッドチェーンとはメソッドの戻り値に対してメソッド呼び出すことです。チェーンのように処理をつなげていくことが出来ます。
2つ目の例ではメソッドを追加したために、何の型の`parse()`なのか区別できなくなりました。そのため、`::<i32>`と書いて型をコンパイラに教えています。`let`文に型を書いたので推論してくれるかなと期待したのですが駄目でした。

# メソッドの実装
`impl`ブロックを書き、その中でメソッドを実装します。
`impl` `型名` `{` `メソッド` `メソッド` `メソッド` `...` `}`
以下の例ではメソッドチェーンをやってみたかったので各メソッドの引数と戻り値の型をそろえています。

~~~rust
/// パソコン
/// ログインしてパスワードを変更する機能しかない。
struct PC {
    login: bool,      //認証
    password: String, //パスワード
}

impl PC {
    // ログインする
    fn login(&mut self, password: &str) -> &mut PC {
        if self.password == password {
            println!("ログインしました。");
            self.login = true;
            self
        } else {
            println!("パスワードが違います");
            self
        }
    }

    // ログアウトする
    fn logout(&mut self) -> &mut PC {
        println!("ログアウトしました。");
        self.login = false;
        self
    }

    // パスワード変更
    fn change_password(&mut self, new_password: &str) -> &mut PC {
        if self.login {
            println!("パスワードを変更しました。");
            self.password = String::from(new_password);
            self
        } else {
            println!(
                "パスワードを変更するにはログインする必要があります。"
            );
            self
        }
    }
}

fn main() {
    let mut my_pc = PC {
        login: false,
        password: String::from("abcd"),
    };

    // ログイン
    my_pc.login("abcd");

    // パスワード変更
    my_pc.change_password("efgh");

    // ログアウトしてログインしてパスワード変更してログアウトしてログイン
    my_pc
        .logout()
        .login("efgh")
        .change_password("123456789")
        .logout()
        .login("123456789");
}

~~~

### 余談
implを勉強した素直な感想は「classじゃ無いの？」でした。しかし、理解してみるとこちらのほうが理にかなっている気がします。特に、トレイトとインターフェース(javaなどの)ではトレイトのほうがスマートだと思います。トレイトはこれから勉強する予定なので、javaとの違いを意識してみると面白いかも、などと考えています。

[目次](https://qiita.com/tonesuke/items/52e469f18e747c794376)
Macでマイクが使えないとき

# はじめに

Macbook proを使っていてテレワークのからみでSkype for Businessをインストール。
しかし、カメラのアクセス許可はでるがマイクのアクセス許可がでてこない。

プライバシー設定みてももちろんマイクのタブにSFBなし。

いろいろググると出てくる別アカウントを試しても使えない。

* 環境
 * Macbook Pro 2018 (MacOS Catalina 10.15.4)

# 結論

自分は [ここ](https://community.spiceworks.com/topic/2158310-mic-not-working-on-skype-for-business-calls-on-mac) にかかれているTTC.dbにinsertする方法で解決。

# 手順

2020.04.18
ターミナルの権限周りを追記

1.ターミナルを起動


2.次のディレクトリへ移動  

```
$ cd ~/Library/Application\ Support/com.apple.TCC
```

3.TCC.dbのバックアップ  

```
$ cp TCC.db TCC.db.bk
```

権限周りでエラーになる場合は、「環境設定」＞「セキュリティとプライバシー」＞「フルディスクアクセス」に"ターミナル.app"を追加
（この方法でもダメならSIPの無効化までいかないと？）

4.dbを開いてinsert文実行  

資格情報を聞かれるので入力

```
$ sudo sqlite3 ~/Library/Application\ Support/com.apple.TCC/TCC.db
sqlite> INSERT INTO access VALUES('kTCCServiceMicrophone','com.microsoft.SkypeForBusiness',0,1,1,NULL,NULL,NULL,'UNUSED',NULL,0,1541440109);
sqlite> .exit
```

５.セキュリティとプライバシーを開いて確認

# ちなみに

他のアプリ、ボイスメモもマイクが使えなかったりするが、ChromeやQTは使えたりでわけがわからない。
AWS kinesisのイメージ

kinesisの勉強をしているのですが、どうもイメージがわかなくて困っていました。
諸先輩方の記事を見て自分なりのイメージをまとめてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480089/fd81dccb-ae56-7314-49e3-6d9dc4675319.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480089/fbf9b0be-5356-dc6c-4379-1acf136c54f9.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480089/48cecbe0-6348-f269-fd3e-955f914a911a.png)





業務で使ってみるまで本当の意味で腹落ちしないんだろうな。。。
間違いがありましたらご指摘ください。
Atcoder ABC162 A-Dをpythonで

A-Dまでの備忘録

#A Lucky7
for文使ったけどif inでもよかった。

```abc162a.py
a=list(input())
for i in a:
    if i=='7':
        print("Yes")
        exit()
print("No")
```
if inの場合

```abc162a_2.py
a=input()
if '7' in a:
   print("Yes")
else:
   print("No")
```

#B Fizzbuzz Sum
Fizzbuzzの出力は無視して、3でも5でも割り切れない数を足していくだけ

```abc162b.py
n=int(input())
a=0
for i in range(n+1):
    if i%3!=0 and i%5!=0:  
        a+=i
print(a)
```
#C Sum of gcd of Tuples (Easy)
今回からpython3のバージョンが上がったのでmath.gcdが使えるようになりました。
$gcd(a,b,c)=gcd(gcd(a,b),c)$はお約束

```abc162c.py
import math
k=int(input())
ans=0
for i in range(1,k+1):
    for j in range(1,k+1):
        a=math.gcd(i,j)
        for x in range(1,k+1):
            ans+=math.gcd(a,x)

print(ans)
```

#D RGB Triples
満たすパターンの総数はRの数×Gの数xBの数になる。例外としてi, j, kが等差数列になりかつそれぞれの色が異なる場合を除算する。等差数列の公差dのパターンは高々nなので素直に全探索する・・・としたらTLEした。
*後ほどpypy3で提出したら通った

```abc162d_TLE.py
n=int(input())
s=input()

r=s.count('R')
g=s.count('G')
b=s.count('B')

ans=r*g*b

for i in range(n):
    for d in range(n):
        j=i+d
        k=j+d
        if k<n:
            if s[i]!=s[j] and s[j]!=s[k] and s[k]!=s[i]:
                ans-=1

print(ans)
```

k<nの時だけ調べるのではなくk>=nの時にbreakするとよい

```abc162d.py
n=int(input())
s=input()

r=s.count('R')
g=s.count('G')
b=s.count('B')

ans=r*g*b

for i in range(n):
    for d in range(n):
        j=i+d
        k=j+d
        if k>=n: break
        if s[i]!=s[j] and s[j]!=s[k] and s[k]!=s[i]:
            ans-=1

print(ans)
```
FlutterのWidgetTestでContextを得る

下記環境でFlutterアプリを開発中です。

|ツールなど|バージョンなど|
|:--|:--|
| MacBook Air Early2015|macOS Mojave 10.14.5|
|Android Studio |3.6.1|
|Java |1.8.0_131|
|Flutter|1.12.13+hotfix.5|
|Dart |2.7.0|

FlutterのWidgetTestを書いていて、BuildContextが必要になってその方法を調べたので、覚え書き。

# tester.elementを使う

例えば、FooWidget(やその子ウィジェット)のBuildContextが必要な場合は、以下のようにします。


```dart

  final BuildContext context = tester.element(
      find.byWidgetPredicate((Widget widget) => widget is ListView));
```

ウィジェットの特定に条件がたくさんで長くなるときは、分けて書く方が見やすいかも。(好みの問題)

```dart
  WidgetPredicate predicate = (Widget widget) => 
      widget is FooWidget && 
      widget.data=='Foo' &&
      ....;

  final BuildContext context =
      tester.element(find.byWidgetPredicate(predicate));
```

ちなみに、必要になったシチュエーションとしては、

- `BoxDecoration`の`Border`の`color`に`Theme.of`で取得できる色

を条件としたかったためで、こんな風に`context`を使いました。

```dart
    WidgetPredicate predicate = (Widget widget) =>
      widget is Container &&
      widget.decoration is BoxDecoration &&
      (widget.decoration as BoxDecoration).border ==
          Border(
            left: BorderSide(
              width: 0.5,
              color: Theme.of(context).dividerColor,
            ),
            top: BorderSide(
              width: 0.5,
              color: Theme.of(context).dividerColor,
            ),
          );
```

以上です。

# 参考サイト

flutter自身(ダイアログ)のテストコード内にありました。
https://github.com/flutter/flutter/blob/master/packages/flutter/test/material/dialog_test.dart
開発ファイルをgithubで管理する方法

#開発ファイルをgithubで管理する方法

新しく開発を始める時にそのファイルをGitやGithubで管理したい！
そんな時に使用するコマンドをメモがてら書きます。

##１ 管理したいファイルへの移動

```
cd 管理したいファイル名
```

##2 git init
管理したいファイルまで移動したらgit initコマンドを打ちます。

```
git init
```

そうすることでファイルに.gitファイルが作成されます。
この.gitファイルにはGitで使用されるファイルが新しく作成されます。

##3 git add .

```
git add .
```
ファイルの変更をステージングします。

##4 git commit

```
git commit -m "コミットメッセージ"
```

変更をcommitします。

##5 git hubに移動
git hubでファイル名と同じ名前のリポジトリを新規作成します。
リポジトリのURLが表示されるのでコピーします。

##6 git remote add origin URL

コマンドで

```
git remote add origin コピーしたURL
```

こうすることでリモートリポジトリが作成されます。

##7 git push

```
git push -u origin master
```
これでgitで管理することができます！！
【PMP】PMBOKの？？？を自分の理解で書いてみる（品質のマネジメントと品質のコントロールの違い）

#初めに
　PMP取得を目指して勉強中の状の人が書いています。自分の学習の備忘として残していきます。
　（誤った理解などが後で判明すれば訂正していきます）。

##テーマ
　品質のマネジメントと品質のコントロール
　【特に？？？】
　　結局テストはどこででやっているの？
　　PMBOK（第六版）の定義は以下に記載の通り。
　　これを見た時、品質マネジメント計画に「テストをする」とあれば
　　それを実行するプロセスは品質のマネジメントなのでここでテストをやっているのだろう。
　　と思ったら、品質のコントロールのツールと技法に「検査」があったために完全に混乱した。

　　[定義]
　　□品質のマネジメント
　　　組織の品質方針をプロジェクトに組み入れて、
　　　組織の品質マネジメント計画を品質活動の実行に移すプロセス
　　□品質のコントロール
　　　パフォーマンスを測定し、プロジェクトのアウトプットが完全かつ正確で、
　　　顧客の期待を満たしていることを保証するために、
　　　品質マネジメント活動の実行結果を監視し、記録するプロセス

##考察
　注目した主要なアウトプットは「品質報告書/テスト・評価文書」と
「品質コントロールの測定結果/検証済み成果物」。
　前者は品質のマネジメント、後者が品質のコントロールのアウトプット。
　それぞれどういうものかというとこういう理解。
　　・品質報告書
　　　⇒品質マネジメントの課題やプロセスやプロダクトの改善事項に関する推奨事項など
　　・テスト・評価文書
　　　⇒テスト仕様書やテスト要項書と呼ばれるもののように見える
　　・品質コントロールの測定結果
　　　⇒「不具合X件/1Kstepsあたり」のようなものを管理図などで表現したもののように見える
　　・検証済み成果物
　　　⇒テストして合格した結果のプロダクト

　とりあえず品質のコントロールについてはプロダクトを中心にテストの「結果」に
　焦点が置かれている模様。
　そしてますます見失ったのが品質のマネジメント。
　プロセスという大きなカテゴリに注目しているときもあれば、
　テスト・評価文書（テスト仕様書）のようなピンポインな所に注目している時もあるようで、
　守備範囲が広い。
　ただ分かったことは、どちらもテストを実施自体にはあまり興味がなさそうだということ。

##結論
　結局テストはどこでやっているのかというと
「プロジェクト作業の指揮・マネジメント」に当たる部分というのが1つ目の結論。
　ここのアウトプットである「作業パフォーマンス・データ」がいわゆるテスト結果で、
　この活動の中でテストが行われているのだろう。

　そしてもう一つは「テストがどこでやられているかはまぁそんな大事じゃなくね？？」
　という結論。
　実際1つめの結論はあまり自信がないけれど、まぁ良いかな。と。
　とにかくその結果を見える形で残し（品質のコントロール）、
　それがプロジェクト成功のための品質担保に繋がるようにうまく行っているかをを
　ちゃんと見て、だめなら変えていきましょう（品質のマネジメント）ということ。

##後記
　結局当たり前のことしか書いていないけれど「その結果を見える形で残す」、
　「うまく行っているかをちゃんと見る（＝前提として予め測定方法や基準を決めておく）」は
　言うほど簡単じゃないはず。
　これに向けて具体的に何をすれば良いかが語れて、行動できる人がどれだけいるかという話。
[rails,active_storage]紐づいた画像のidの呼び出し方

#方法

今回は自分用ですが、皆さんのお役にも立つかと思ったため記述させてただきます

```ruby:app/models/item.rb
〜前略〜
has_many_attached :images
〜後略〜
```

```ruby:appcontrollers/items_controller
〜前略〜
def edit
  @item = Item.find(params[:id])
end
〜後略〜
```

上記の条件でactive_storageを紐づけている場合、下記の記述でimagesのidを表示できます


```ruby:app/views/item/edit

= @item.images_blob_ids

```


#おまけ

条件が同じの場合,全ての画像を表示する方法は下記の通りとなります。

```ruby:app/views/item/edit
-@item.images.each do |image|
  =image_tag image
end
```
DHT11とRaspberry Piで温湿度を取得

DHT11は3ピンタイプを使用。

配線は下図のように。
GPIO14から温湿度を取得。

![lchika_ブレッドボード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/1ccd39aa-c48f-ee03-aeb6-9d4b5ddec777.png)

下記リポジトリのコードを利用。

```bash
$ git clone https://github.com/szazo/DHT11_Python
$ cd DHT11_Python
$ python3 -m pip install .
```

サンプルコードを実行。

```bash
$ python example.py
Last valid input: 2020-04-13 23:25:23.831141
Temperature: 21.1 C
Humidity: 50.0 %
Last valid input: 2020-04-13 23:25:29.914568
Temperature: 21.1 C
Humidity: 56.0 %
Last valid input: 2020-04-13 23:25:35.998205
Temperature: 21.2 C
Humidity: 69.0 %
```

6秒おきに温湿度を取得して標準出力に表示する。
ハーっと息を吹きかけたりすると温湿度が上がるのが確認できる。
TypeError: 'int' object is not subscriptableでハマった話

今までわりとフラットに処理を記述してプログラムを書いていました。言い換えれば、思いつくままに処理を書いていたという感じ。アジャイルどころか、「こんなコードかな？」と思いついたままに、頭の中、思考がダダ漏れるままに処理を記述していたという感じです。プログラムを書いているというよりは、原稿書いてるというイメージだったのかも。

多少なりとも勉強が進んで、これじゃいかんと。別に繰り返し利用する処理じゃなくても、関数で書くようにしてみようと。データも、変数に入れ込むときにいちいち考えながら加工するんじゃなくて、まずは生データをわりとそのまま取り扱うようにプログラムに取り込み（いや、変数に代入するだけですが）、必要なデータはそこから取り出して使うようにしようと。

＃ 余計なこと考えながらデータを入力すると絶対ミスするからです！

どちらも、あとからプログラムを書き換えたり、読み直すときにわかりやすい構造にしたかったからです。で、できるところからやってみようと思ったわけです。そしたらハマりました……。

### 配列なのにintってどういうことよ？
今回ハマった沼については、原因は後者でした。読み直すときにどんなデータかわかりやすいよう配列で記述したつもりだったのですが、それがあだとなり……。まだまだ配列はちゃんと理解できてないわーということが実感できた一件です。具体的には、以下のコードです。

```Python:list_jikken-00.py
# 変数を設定
ringo_int = 300
ringo_float = 256.1
ringo_list = [ringo_int, ringo_float]

# 型を確認
print(type(ringo_int))
print(type(ringo_float))
print(type(ringo_list))

# 値を表示
print(ringo_int)
print(ringo_float)
print(ringo_list)

# 配列から要素を取り出す
print(ringo_list[0][0]) # ここでエラーになるという。どぼじで？？？
print(ringo_list[0][1])
```

これは本当にハマったプログラムではなくて、もっとシンプルなプログラムにしてどこが悪いのか洗い出してみようとして単純化した実験プログラムです。でも、これを実行すると17行目で、

`TypeError: 'int' object is not subscriptable`

が出てしまって、でもどこが悪いの？っていう。元のプログラムでも、上の実験コードでもエラーは同じ。ringo_listは型を確認したって、`<class 'list'>`だし、printしたって`[300, 256.1]`じゃん？ なんでintって言うのよー！

上記のエラーコードで検索すると、「ちょっとコードを書けるようになってくると必ず突き当たるエラーである」的なことが書いてある解説が多く、まったく意外性のない人生であることに落胆（まあ、それは知っていましたが）。でもやっぱり、intではなくlistを扱っているつもりなので、どこをどう直せばいいのかわからない。

### 1行×n列の特別感
まあ、元のプログラムで最初に取り扱う生データが二次元配列で作るのに向いていたため、どうも配列は二次元というのがなぜか強烈に頭に残ってしまった模様。subscriptが添え字を意味するという解説を目にしたところで、「あれ、二次元じゃないじゃん？」と気がつき、最後のところを

```python:list_jikken-01.py
...
# 配列から要素を取り出す
print(ringo_list[0])
print(ringo_list[1])
# なるほど！
```

とすればいいことにようやく行き当たりました。そこまでデバッグしておいて配列の構造に思い至らないとは、ほとほと自分の頭の固さがいやになりますね。

最後に整理しておくと、このエラーはringo_listが二次元配列ではないのに二次元配列から要素を取り出す書き方をしていたのが原因で出たエラーです。`ringo_list[0]`の部分で要素を取り出したときにintの値が返ってきたのに対して、さらに[0]や[1]を付けていたので、整数に添え字は付けられないよ、つまり`TypeError: 'int' object is not subscriptable`になったと、このように理解した次第です。ちぃ、覚えた。

でも、1行×n列の配列として扱ってくれたほうが直感的なんじゃないかとちょっと愚痴りたい気もしますが、記述をシンプルにするというポリシーのほうが勝るのかな。愚痴りたいけど、文句を言うつもりはありません。覚えたからもう大丈夫。前を向いて生きていこう。

今後は配列の構造にはもっと意識的になろうと固く誓った在宅勤務の一日となりました。
トランザクションてなんぞや



トランザクションという言葉。何度か聞いたことがあり、その度に調べては忘れることを何度か繰り返したので、初心者ながら一度簡単に調べてまとめてみる。

#トランザクションとは

複数の SQL によるデータベースに対する処理を１つの処理としてまとめてデータベースに反映させること。
##必要な場面
　　複数の処理を連続して行う際、すべての処理が成功したときにのみデータベースへの変更を有効にしなければならない場合。
　　 → 　一部の処理が正しく実行されなかった場合には、すべての処理をキャンセルして取り消す(ロールバックする)ことが可能。

###よくある簡単な例　「銀行の入出金システム」
　**例：【Ａさんの口座から１００万円をＢさんの口座に移動させる処理】**
　　●必要な処理は以下の２つ
　　　1. Ａさんの口座から１００万円をマイナスする処理
　　　2. Ｂさんの口座へ１００万円をプラスする処理
　
　　もし、トランザクションを利用せずに上記処理を行い、２つ目の処理に失敗した場合、
　　Ａさんの口座からは１００万円がなくなり、Ｂさんの口座はそのままで、お金がなくなってしまう。
　　つまり、**データの不整合**が起こってしまう。

　　こういった場合に、`トランザクションを利用すれば、`１，２の処理を１つのトランザクションとしてまとめ、
　　すべての処理が成功した場合にのみ、口座の変更内容が確定(**コミット**)される。
　　処理が一部でも失敗した場合には、すべての処理が取り消される(**ロールバック**)されるため、
　　口座の変更は発生せず、`データの整合性は維持される。`
　　
##Laravel での使い方
###transaction() メソッドを使用する方法

```
　　　 DB::transaction(function () {
          $a -= 100;
          $b += 100;
      });
```

　　クロージャの中で例外が投げられると、自動的にロールバック(処理を取り消し)し、クロージャが正しく実行されると、自動的にコミット(処理を反映)される。

###beginTransaction() メソッドを使用する方法(手動トランザクション)
```
      DB::beginTransaction();
      try {
          // 一連の処理
          $a -= 100;
          $b += 100;
      DB::commit(); // トランザクションをコミット
      } catch (Exception $exception) {
          DB::rollBack(); // トランザクションをロールバック
          throw $exception;
      }
```
仕事メール

以下は自分の悪癖をリマインドするために、メモするものです。

#以下のような場合は、早めに返信！
▷　重要な内容を伝えられた
▷　こちらが依頼した情報を受け取った
▷　資料などを添付ファイルで受け取った
例：
「資料を受け取りました。ありがとうございました。
まずは、受取確認のみにて失礼します。」←　結び
※取り急ぎより「まずは」を使う

#メールを読んだことだけでも伝えたい
例：
「メールありがとうございました。
この件（詳細）については、改めてご返事いたします。
（または、進展などがありましたら、またご連絡いたします。」
「社内で検討いたしますので、数日の猶予（ゆうよ）をいただければと幸いです。
15日までには、ご返信いたします。」
「営業会議が今月末(30日)に開かれます。そこで結論が出る予定です。
結論が出次第ご連絡いたします。 」

#返信メールのタイトル
Re：......(再送)
Re：......(追伸)
Re：......(改良版)


#返事が用・不要を伝える
##### 返事用
例：
「ご多用のところ恐縮ですが、ご返事をいただければ幸いです。」
##### 返事不要
「ご確認いただければ、ご返信は無用です。」
「特に問題がなければ、ご返信には及びません。」

#返事の催促
相手の逃げ道を用意
▷企画案をお送りいただく期限が過ぎております。
至急お送りください。↓
企画案をお送りいただく期限が過ぎましたが、
進捗はいかがでしょうか？
状況をお知らせいただければ幸いです。

# 無理な依頼を断る
「あまり時間がかかると貴社にご迷惑が掛かる恐れがあります。」
「ご期待に添えず誠に残念ですが、」
「心苦しく思いますが」

# 間違いは直接指定しない
ファイルが添付されていませんでしたので..↓
ファイルが添付されていないようですので、
恐れ入りますが、再送信をお願いいたします。

# 間違いやすい敬語
...こどで、少々聞きたいですが ↓
...こどで、少々うかがいしたいのですが 

資料をご覧いただいて、いかがでございましたか？
課長がおっしゃったことですが、
私もご一緒させてください。

時間変更の件を知りませんか？↓
時間変更の件をご存じないでしょうか？

今回は私が行きます。↓
今回はこちらからお伺いいたします。

皆様にどうぞよろしくお伝えください。
担当の方をご紹介いただけないでしょうか？

資料をお調べになりましたか？
主任は、どのようにお考えですか？

セミナーに出席なさいますか？
部長もいらっしゃいますか？

#「～したく」の使い方
＝したいと思いので
Webサーバー構築 解説編

どうも、豚野郎です。
昨日投稿したWebサーバー構築の解説の話をしていきます。
ぶっちゃ前回のはコピペすればできるので、今回は出てくる用語に関して書いていきます。


<h1>1.Linuxって何？</h1>
世界中の有志の方々が作っているOSです。

基本的には無料で、中身を自由に弄れることが魅力の1つです。

また、不要な物が入っていないため、動きは早いです。

必要なものは自分でインストールしていきます。

種類のことをディストリビューションといいます。

では、ディストリビューションの例を挙げていきましょう。

・CentOS

代表的なディストリビューション・・・・・・とも言えないかもしれません。

つい最近までシェア1位だった記憶があります。

実は2019年12月の段階で3位です。

長期サポートが強みのOSみたいですね。



・Ubuntu

2019年12月の段階でシェア1位。

特徴としては初心者に優しいという点です。

初めからGUIで操作できます。

ファイアウォールも搭載されているみたいです(だから前回詰まったのか・・・・・)。

アプリケーション・セキュリティ対策共に充実したOSです。



・Arch Linux

上級者向けのディストリビューション。

自分の知り合いでも使っている人がいました。

インストール後はほぼ何も入っていないみたいです。

・全て自力で入れる

・英語のドキュメントを読み解く

以上の能力が必要です。



もっとありますが、これくらいにしていきます。

<h1>2.ファイアウォールって何？</h1>
内部ネットワークを外部から守る防御壁です。

ポート番号でアクセスを制御できます。

外部からのアクセスだけでなく、内部でウイルスが発生しても

外部へ配信することをポートで制御できます。



<h1>3.Apacheって何？</h1>
サーバー構築するのに必要なソフトウェアです。

使われていることが多く、情報が膨大のためトラブル時にも安心できることが特徴です。

最近はNginxが流行っています。

Apacheで『クライアント1万台問題』という、

クライアントの数が多くなるとサーバーがパンクする問題が出てきました。

Apacheの弱点を補うために作られたソフトウェアです。

大量のアクセスを処理できるようなWebサーバーです。

(だから最近よく使われてるんですね)


<h1>4.ポート番号って何？</h1>
ポート番号とは、インターネットで標準的に用いられるプロトコル（通信規約）であるTCP/IPにおいて、同じコンピュータ内で動作する複数のソフトウェアのどれが通信するかを指定するための番号。単に「ポート」と略されることもある。

(wikipedia参照)

学生時代、理解するのに時間がかかったのを憶えています。

サーバーとの間にファイアウォールという壁がありますが、

通信するためにポート番号という番号を指定しなきゃいけないんですね

(わかりにくい・間違ってたらごめんなさい)


<h1>5.sshって何？</h1>
サーバーと通信するためのプロトコルです。
通信が暗号化されることにより、安全に通信が可能です。



<h1>6.最後に</h1>
個人的に深く突っ込み過ぎずにまとめたつもりです。

これ以上は知らなくていいかな？と思っているので、

これからは趣味のWeb サーバーを使ってセキュリティ対策編とかできればいいかなと思っています。



ではでは。
雑雑なロックダウンシミュレータ

ロックダウンでどれくらい感染者数制御ができるか試してみた
(構想10分実装5分グラフ化5分)

感染者が500000人超えるとロックダウン
100000人切るとロックダウン解除

```python:simu.py

N=70

normal=10**8
patient=1
temp=0
lock=False

t=[]
log0=[]
log1=[]

for i in range(N):
    #一周期で感染者が回復もしくは死亡する
    
    #ロックダウンを開始する感染者閾値は適当
    if lock==False and patient>50**4:
        lock=True #ロックダウン開始
        temp=(normal*0.7)//1 #ロックダウンが始めると70%が家にこもる
    
    elif lock==True and patient<10**4:
        lock=False #ロックダウン終了
        temp=0 #ロックダウンが終わると日常生活を再開させる

    infect=((2*(normal-temp)/10**8)*patient)//1 #一人当たり1.5-2.4人に感染させるので係数は2とした (normal-temp)/10**8は感染効率
    patient+=infect-patient 
    normal-=infect
    
    t.append(i)
    log0.append(normal)
    log1.append(patient)

```

結果がこちら
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/476342/caa083ca-c08c-777e-15f8-17585eb88298.png)

青が未感染者、オレンジが感染者
ロックダウンの開始条件が50万人の感染となかなかきついので、感染者が100万人以上と大変なことになってたりする

```python:graph.py
import matplotlib.pyplot as plt

fig, ax = plt.subplots()

ax.plot(t, log0)
ax.plot(t, log1)
plt.show()
```

本当は症状がでた感染者と潜伏期の感染者に分けて計算して、感染者数目押しロックダウンの効果のラグを再現したかったけど今日はここまで
【Rails】サイトのタブに使うオリジナルアイコンの作り方〜設定まで（favicon）

#経緯
ポートフォリオで作成しているWEBアプリケーションにオリジナルのアイコンをつけたいと思い、方法を模索していました。

#アイコンの用意
私はアイコン兼、サイトロゴを用意しました。
こちらのフリーロゴ作成サイトで作りました。
https://www.squarespace.com/

こんなのが出来上がります。
![ReLearn-logo-orange.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574173/8b566f14-0c74-a4a9-10c5-543b7652372b.png)
こちらは私のポートフォリオで使ったロゴです。

かなり大きく写ってますがロゴとして使う際は
cssでwidthを指定してあげればうまく使えると思います。

# faviconの作成
先程作成したロゴを使って（別で用意する方はpng拡張子の画像を用意してください）、
こちらのフリーソフトで作成します。
http://www.xiconeditor.com/

手順はサイト内の右側にある数字順に行っていきます。
![スクリーンショット 2020-04-13 22.48.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574173/da58c062-7dca-0aa2-8d35-57366de227fa.png)

これでfaviconが出来上がります。

#設定
出来上がったfaviconを
app/assets/image配下に置きます。

```
app/assets/images/favicon.ico
```

そして、application.html.erbの<head></head>内にコードを書き込みます。


```app/views/layouts/application.html.erb
<html>
  <head>
<!--(省略) -->
    <%= favicon_link_tag('favicon.ico') %>
<!--(省略) -->
  </head>
```

これでrails s　でサーバーを起動すれば作成したオリジナルアイコンにタブの部分が変わります。

![スクリーンショット 2020-04-13 22.59.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574173/1a65ba26-7dd5-3bdc-3a81-8f9f607217b9.png)

こんな感じになります。
アイコンはダーク系かカラフルな感じの方が目立っていいかもしれません。

##参考
・https://allabout.co.jp/gm/gc/23917/
・https://qiita.com/ntkgcj/items/6643a07a43a36029dc9b
VQEをBlueqatで実装してみた

NISQ時代はVQEがくるんじゃない？（ホントにくるのかな・・・？）って事で、簡単な問題をBlueqatで実装してみた。なお今回はプログラム動作確認という意味で、トリビアルな組み合わせ最適化問題を解いてみる。
## 今回解いた問題
以下のハミルトニアン$H$が最小となる$q(0)$、$q(1)$の組み合わせを解く。
$$
 H = 1 - q(0) - q(1) 
$$
なお、$q(0)$、$q(1)$は0もしくは1のどちらかの値となる。この問題設定では、$q(0)=q(1)=1$のときハミルトニアン$H=-1$で最小の値をとる。

## 補足情報
ちなみに、すべての$q(0), q(1)$の組み合わせについてハミルトニアンは以下の値をとる。

- $q(0)=0,q(1)=0 \rightarrow H = 1$ 
- $q(0)=0,q(1)=1 \rightarrow H = 0$
- $q(0)=1,q(1)=0 \rightarrow H = 0$
- **$q(0)=1,q(1)=1 \rightarrow H = -1$**


## ソースコード
```python

from blueqat.pauli import qubo_bit as q
from blueqat.vqe import Vqe, QaoaAnsatz

#Hamiltonian
h = 1.0 - q(0) - q(1)

ansatz = QaoaAnsatz(h, 10)
runner = Vqe(ansatz)
result = runner.run()

print("mode:")
print(result.most_common())
print("minimum value:")
print(runner.ansatz.get_energy(result.circuit, runner.sampler))
```
ソースコードの詳細の説明は割愛しますが、結構簡単に書けますね。


## 実行結果
```
mode:
(((1, 1), 0.9999999999996781),)
minimum value:
-0.9999999999996781
```
$(1,1)\rightarrow q(0)=1, q(1)=1$の解の組み合わせ

$0.9999999999996781 \rightarrow (1,1)$の出現確率（実行の都度結果が変わる）

## 最後に
すごい簡単に実装できました！今後は少し応用を利かせていきたいと思います。
【Oracle】カーソル入門

# はじめに

以下の記事に続いて、カーソルについて復習した結果を記事としてまとめてみました。

* [【Oracle】PL/SQL入門](https://qiita.com/nkojima/items/93a9c01741965f11bb8c)
* [【Oracle】ストアドプロシージャ入門](https://qiita.com/nkojima/items/2f793251e4465a3a8da2)
* [【Oracle】ストアドファンクション入門](https://qiita.com/nkojima/items/aa7be169f2d983c0f413)

# 使用した環境

* Oracle社が提供している[Oracle Live SQL](https://livesql.oracle.com/)でOracle19cを利用しました。

# カーソルとは

* データの「検索条件」と「現在位置」を保持して、複数の検索結果を1件ずつ処理するための仕組みのことです。
* 平たく言えば、「検索条件に合致するレコードを、1件ずつ取り出すための仕組み」となります。

# 作成したSQL

## 基本的なカーソル処理

* 変数と同様に、カーソルも宣言部で宣言する必要がありますが、データ型の代わりに検索条件（SELECT文）を指定します。
 * カーソルの宣言を見れば、カーソルにどのようなデータが格納されるのかが分かります。
* カーソルの宣言と併せて、カーソルの1行分のデータを代入する変数を宣言します。
 * 結果セットとは「メモリ上に保持された検索結果」のことです。
* `OPEN {カーソル名};`で、カーソルに紐づいたSELECT文を実行して、カーソルに結果セットを保持します。
* `FETCH {カーソル名} INTO {変数名};`で、カーソルの結果セットから1行読み込んで変数に代入します。
* `EXIT WHEN {終了条件};`は、ループ処理の終了条件を示しています。
 * SELECT文に対する結果セットが存在しない場合、あるいは結果セットに読み込むべき行が無くなった場合にはループ処理を抜けます。
* 最後にカーソルを閉じて、カーソルが保持していたメモリを開放します。

```sql:基本的なカーソル処理
-- 宣言部
DECLARE
  -- カーソルの宣言
  CURSOR cur IS 
    SELECT
      T1.DNAME,
      T2.ENAME,
      T2.JOB
    FROM
      SCOTT.DEPT T1,
      SCOTT.EMP T2
    WHERE
      T1.DEPTNO = T2.DEPTNO;
  -- カーソルの結果セットの1行分を代入する変数
  dept_row cur%ROWTYPE;
-- 処理部
BEGIN
  -- カーソルを開く
  OPEN cur;
    LOOP
      -- 結果セットを変数に代入する
      FETCH cur INTO dept_row;
      EXIT WHEN cur%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(dept_row.DNAME || ',' || dept_row.ENAME || ',' || dept_row.JOB);
    END LOOP;
  -- カーソルを閉じる
  CLOSE cur;
END;
```

```text:実行結果
ACCOUNTING,CLARK,MANAGER
ACCOUNTING,MILLER,CLERK
ACCOUNTING,KING,PRESIDENT
RESEARCH,FORD,ANALYST
RESEARCH,SCOTT,ANALYST
RESEARCH,JONES,MANAGER
RESEARCH,SMITH,CLERK
RESEARCH,ADAMS,CLERK
SALES,WARD,SALESMAN
SALES,MARTIN,SALESMAN
SALES,TURNER,SALESMAN
SALES,JAMES,CLERK
SALES,ALLEN,SALESMAN
SALES,BLAKE,MANAGER
```

## 暗黙カーソル

* 宣言部でカーソルを定義せずに、for文の「制御リスト」にSELECT文を書くことで、ループ変数に結果セットの1行分を代入します。
* SELECT文に対する結果セットが存在しない場合には、ループ処理は発生しません。
 * 例えば、下記のSQL中のSELECT文に`T1.DEPTNO > 100`という検索条件を追加すると、SELECT文の実行結果として結果セットが1つも返されないため、ループ処理は発生しません。

```sql:暗黙カーソル
-- 宣言部
DECLARE
-- 処理部
BEGIN
  FOR cur IN (
    SELECT
      T1.DNAME,
      T2.ENAME,
      T2.JOB
    FROM
      SCOTT.DEPT T1,
      SCOTT.EMP T2
    WHERE
      T1.DEPTNO = T2.DEPTNO
  ) LOOP
    DBMS_OUTPUT.PUT_LINE(cur.DNAME || ',' || cur.ENAME || ',' || cur.JOB);
  END LOOP;
END;
```

```text:実行結果
ACCOUNTING,CLARK,MANAGER
ACCOUNTING,MILLER,CLERK
ACCOUNTING,KING,PRESIDENT
RESEARCH,FORD,ANALYST
RESEARCH,SCOTT,ANALYST
RESEARCH,JONES,MANAGER
RESEARCH,SMITH,CLERK
RESEARCH,ADAMS,CLERK
SALES,WARD,SALESMAN
SALES,MARTIN,SALESMAN
SALES,TURNER,SALESMAN
SALES,JAMES,CLERK
SALES,ALLEN,SALESMAN
SALES,BLAKE,MANAGER
```

# 参考URL

* [「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典 - カーソル【DB】](https://wa3.i-3-i.info/word11582.html)
* [PL/SQLでカーソルを使う（基本編）](https://www.atmarkit.co.jp/ait/articles/1811/19/news019.html)
* [明示カーソルと暗黙カーソル](https://www.shift-the-oracle.com/plsql/cursor-loop.html)