Ymotoのブログ

主にプログラミング学習記録

SQLの概要とおもな使いかた

SQL(ゼロからはじめるデータベース操作)をよんでまとめました。

はじめに

データベースを管理するコンピュータシステムをDatabse Management System(DBMS)という

DBMSの種類

  • Hierarchical Database(階層型データベース)
  • Relational Database(RDB)
  • Object Oriented Database(OODB: オブジェクト指向データベース)
  • XML Database(XMLDB)
  • Key-Value Store(KVS: キー・バリュー型データストア)

RDBMSのシステム構成

RDBMSとは、データベースからデータを取り出したり、データを書き換えたりするサーバの一種。

クライアントが、RDBMSに欲しいデータをSQL文にして送信する。要求を受け取ったRDBMSがデータベースにアクセスし要求されたデータを返す仕組み。

SQL

SQL(Structured Query Language)はデータベースを操作するための言語であり、ISO(国際標準化機構)で定められた標準規格、標準SQLがある。

標準SQLを覚えることで、さばざまなSDBMSでSQL文を書くことができる。

SQLは3つに分類される。

1.DDL(Data Definition Language)

データ定義言語。テーブルなどのオブジェクトを作成する

CREATE, DROP, ALTER

2.DML(Data Manipulation Language)

データ操作言語。データの挿入、更新、削除などを行う。

SELECT, INSERT, UPDATE, DELETE

3.DCL(Data Control Language)

データ制御言語。トランザクション(互いに関連する複数の処理をまとめた、一連の処理)関連のコマンド

COMMIT, ROLLBACK, GRANT, REVOKE

ルール

文の最後にセミコロンをつける。定数はシングルクォーテーションで囲む。

ユーザの作成と削除

$ createuser <username>
$ dropuser <username>

CREATE USER <username>;
DROP USER <username>;

postgres=# CREATE USER ymotodesu2;
CREATE ROLE
postgres=# \du
                                    List of roles
 Role name  |                         Attributes                         | Member of 
------------+------------------------------------------------------------+-----------
 kabos      | Create DB                                                  | {}
 pgadmin    | Superuser, Create role, Create DB                          | {}
 postgres   | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 posuser    |                                                            | {}
 ymotodesu2 |                                                            | {}

postgres=# DROP USER ymotodesu2;
DROP ROLE
postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 kabos     | Create DB                                                  | {}
 pgadmin   | Superuser, Create role, Create DB                          | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 posuser   |                                                            | {}

データベース作成と削除

CREATE DATABASE <Database name>;
DROP DATABASE <Database name>;

$ createdb <database name> (createdb -O <username> <databasename>)
$ dropdb <database name>

postgres=# create database ymotodb;
CREATE DATABASE
postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 dbtest    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 kabosdb   | kabos    | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 sample    | pgadmin  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 testdb    | posuser  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 ymotodb   | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
(8 rows)

postgres=# drop database ymotodb;
DROP DATABASE
postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 dbtest    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 kabosdb   | kabos    | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 sample    | pgadmin  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 testdb    | posuser  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
(7 rows)
postgres@tk2-212-15593:~$ createdb test1
postgres@tk2-212-15593:~$ psql -l
                                  List of databases
   Name    |   Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+-----------+----------+-------------+-------------+-----------------------
 dbtest    | postgres  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 kabosdb   | kabos     | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 postgres  | postgres  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 sample    | pgadmin   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | postgres  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |           |          |             |             | postgres=CTc/postgres
 template1 | postgres  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |           |          |             |             | postgres=CTc/postgres
 test1     | postgres  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 testdb    | posuser   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 ymotodb   | ymotodesu | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
(9 rows)

postgres@tk2-212-15593:~$ dropdb test1
postgres@tk2-212-15593:~$ psql -l
                                  List of databases
   Name    |   Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+-----------+----------+-------------+-------------+-----------------------
 dbtest    | postgres  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 kabosdb   | kabos     | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 postgres  | postgres  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 sample    | pgadmin   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | postgres  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |           |          |             |             | postgres=CTc/postgres
 template1 | postgres  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |           |          |             |             | postgres=CTc/postgres
 testdb    | posuser   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 ymotodb   | ymotodesu | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
(8 rows)

データベース一覧

$ psql -l
# \l

テーブルの作成

CREATE TABLE <テーブル名>
(<列名1> <データ型> <列の制約>,
 <列名2> <データ型> <列の制約>,
 <列名3> <データ型> <列の制約>,
 ..
 .
 <テーブルの制約1>, <テーブルの制約2>,... );
 

ymotodb=# create table Personal_information
ymotodb-# (id CHAR(4) NOT NULL,
ymotodb(# name TEXT NOT NULL,
ymotodb(# age INTEGER,
ymotodb(# PRIMARY KEY (id));
CREATE TABLE

データ型

  • CHAR : 文字列。CHAR(200)のように最大長を指定する。文字列が指定した長さに満たない場合、残りに半角スペースが入る。
  • VARCHAR : CHARと同じだが、指定した長さに満たなくても半角スペースで埋めない。

テーブルの削除

DROP TABLE <テーブル名>;

テーブルの検索

テーブル一覧

\dt

列を出力

SELECT <列名>..., FROM <テーブル名>;

すべての列を出力

SELECT * FROM <テーブル名>;

列に別名をつける

SELECT <列名1> AS <別名1>,
       <列名2> AS <別名2>,
       ...
FROM <テーブル名>;

データの登録(INSERT)

INSERT INTO <テーブル名> (列1, 列2, 列3, ...) VALUES (値1, 値2, 値3, ...);

※文字列には挿入する値にシングルクォーテーションをつける

※INSERT文は一回の実行で1行を挿入する

ymotodb=# select * from personal_information
ymotodb-# ;
 id | name | age 
----+------+-----
(0 rows)

ymotodb=# insert into personal_information (id, name, age) values (0001, yamamoto, 45);
ERROR:  column "yamamoto" does not exist
LINE 1: ...ersonal_information (id, name, age) values (0001, yamamoto, ...
                                                             ^
ymotodb=# insert into personal_information (id, name, age) values ('0001', 'yamamoto', 45);
INSERT 0 1
ymotodb=# select * from personal_information
;
  id  |   name   | age 
------+----------+-----
 0001 | yamamoto |  45
(1 row)

列リストの省略

テーブル名のあとの列リストは、テーブルの全列に対してinsertを行うばあい省略することができる。省略時は、valueの値が左から順に各列に割り当てられる

ymotodb=# insert into personal_information values ('0002', 'satou', 57);
INSERT 0 1
ymotodb=# select * from personal_information ;
  id  |   name   | age 
------+----------+-----
 0001 | yamamoto |  45
 0002 | satou    |  57
(2 rows)

他のテーブルのデータをコピー

INSERT INTO <テーブル名> (<列名>...) SELECT <列名> FROM <テーブル名>

ymotodb=# select * from personal_informationcp ;
 id | name | age 
----+------+-----
(0 rows)

ymotodb=# insert into personal_informationcp (id, name, age)
ymotodb-# select id, name, age from personal_information;
INSERT 0 2
ymotodb=# select * from personal_informationcp ;
  id  |   name   | age 
------+----------+-----
 0001 | yamamoto |  45
 0002 | satou    |  57
(2 rows)

データの削除(DELETE文)

テーブルの中身を空にする

DELETE FROM <テーブル名>;

一部の行だけを削除する

DELETE FROM <テーブル名>
 WHERE <条件>;

ymotodb=# select * from personal_information;
  id  |   name   | age 
------+----------+-----
 0001 | yamamoto |  45
 0002 | satou    |  57
 0003 | tanaka   |  20
(3 rows)

ymotodb=# DELETE FROM personal_information
ymotodb-# WHERE age <= 20;
DELETE 1
ymotodb=# select * from personal_information;
  id  |   name   | age 
------+----------+-----
 0001 | yamamoto |  45
 0002 | satou    |  57
(2 rows)

データの更新(UPDATE文)

UPDATE <テーブル名>
SET <列名> = <式>
WHERE <条件>

ymotodb=# select * from personal_information;
  id  |   name   | age 
------+----------+-----
 0001 | yamamoto |  45
 0002 | satou    |  57
 0003 | yamada   |  32
 0004 | katou    |  22
(4 rows)

ymotodb=# UPDATE personal_information
ymotodb-# SET name = 'コアラ'
ymotodb-# WHERE id = '0004';
UPDATE 1
ymotodb=# select * from personal_information;
  id  |   name   | age 
------+----------+-----
 0001 | yamamoto |  45
 0002 | satou    |  57
 0003 | yamada   |  32
 0004 | コアラ   |  22
(4 rows)

トランザクション

トランザクションとは

  • セットで実行する更新処理のまとまり 複数の操作をまとめて連続で行う。
  • COMMIT(処理の確定)とROLLBACK(処理の取り消し)がある

書き方

BEGIN TRANSACTION # トランザクション開始文

DML文;
DML文;
.
.
トランザクション終了文(COMMIT または ROLLBACK); 

COMMIT

トランザクション内の処理をすべて反映してトランザクションを終了するコマンド

ROLLBACK

トランザクション内の処理をすべて破棄し、トランザクションを終了するコマンド

COMMIT例

ymotodb=# select * from personal_information;
  id  |   name   | age 
------+----------+-----
 0001 | yamamoto |  45
 0002 | satou    |  57
 0003 | yamada   |  32
 0004 | コアラ   |  22
(4 rows)

ymotodb=# BEGIN TRANSACTION;
BEGIN
ymotodb=# UPDATE personal_information
ymotodb-# SET name = 'ゴリラ'
ymotodb-# WHERE age = 45;
UPDATE 1
ymotodb=# UPDATE personal_information
ymotodb-# SET age = 78
ymotodb-# WHERE id = '0002';
UPDATE 1
ymotodb=# COMMIT;
COMMIT
ymotodb=# select * from personal_information;
  id  |  name  | age 
------+--------+-----
 0003 | yamada |  32
 0004 | コアラ |  22
 0001 | ゴリラ |  45
 0002 | satou  |  78
(4 rows)

ROLLBACK例

ymotodb=# select * from personal_information
ymotodb-# ;
  id  |   name   | age 
------+----------+-----
 0001 | yamamoto |  45
 0002 | satou    |  57
 0003 | コアラ   |  20
 0004 | ラッコ   |  11
(4 rows)

ymotodb=# BEGIN TRANSACTION;
BEGIN
ymotodb=# UPDATE personal_information
ymotodb-# SET age = age - 2
ymotodb-# WHERE name = 'ラッコ';
UPDATE 1
ymotodb=# UPDATE personal_information
ymotodb-# SET name = 'suzuki'
ymotodb-# WHERE id = '0003';
UPDATE 1
ymotodb=# ROLLBACK;
ROLLBACK
ymotodb=# select * from personal_information
;
  id  |   name   | age 
------+----------+-----
 0001 | yamamoto |  45
 0002 | satou    |  57
 0003 | コアラ   |  20
 0004 | ラッコ   |  11
(4 rows)

Ruby入門

[Ruby入門]を読みながら写経しました。新しく覚えた箇所をメモ書きしておきます。

文字列

文字列オブジェクトに文字列を追加

文字列 << 追加する文字列

or

文字列.concat(追加する文字列)

str = 'Tokyo'
str << ',Japan'

str = 'Tokyo'
str.concat('Kyoto')

シングルクウォートとバッククォートの違い

バッククォートは文字列中に改行文字\nや、式展開#{ }を埋め込むことができる。シングルクウォートでは上記の文字が文字列として認識される。

エスケープ文字

手前に\をつけることでその文字を文字列として認識される。

%記法

%記法を使うとエスケープ文字を使用する必要がなくなる。 * %q! !はシングルクウォート * %Q! !%! !はダブルクウォート ! ! だけでなく、他の記号も区切り文字としてしようできる。

ヒアドキュメント

複数行の長い文字列を作成する場合に使う。 <<識別子 1行目 2行目 3行目 ・・・ 識別子 識別子をシングルクウォートで囲むと式展開が無効になり、ダブルクウォートで囲むと有効になる

バックスラッシュ記法

キーボードから直接入力できない文字を記述するために使われる。

文字列の中でxを使用したい場合、\xを使用する。これを文字xをエスケープするという。"エスケープするには\"と記述する。

数値と四則演算

ビット演算子

&: ビットAND :演算子の左辺と右辺の同じ位置にあるビットを比較して、両方のビットがともに1の場合だけ1にする。

OR : ビットOR :演算子の左辺と右辺の同じ位置にあるビットを比較して、両方のビットのどちらかが1の場合に1にする。

^ : ビットXOR :ビットの値が異なる場合にだけ1にする

~ : ビット反転 :演算子の右辺の値の各ビットに対して1の場合は0に、0の場合は1にする。

シフト演算子

ビット演算子の一つで、数値の各ビットを左または右にシフトさせるための演算子

2進数において左へ1つビットをシフトさせることは値を2倍にすることで、右へ1つビットをシフトさせることは1/2にすることに相当する。

左シフト

a << b : 左辺の数値を右辺の値だけ左にシフト。左端からはみ出した部分は削除され、空いた右端には0が格納される。

0000000001011 = 11
-------------
0000000010110 = 22

右シフト

a >> b : 左辺の数値を右辺の値だけ右へシフト。

0000000001011 = 11
------------------
0000000000101 = 5

定数と変数


定数は変数と同じく数値や文字列などのオブジェクトに名札をつけるために使用するが、定数の場合は例外を除き、一度オブジェクトを代入すると変更ができない。

定数に名前を付ける時のルール

1) 1文字目は英大文字
2) 2文字目以降は英数文字、アンダーバー(_)
3) 予約語は使用できない
組み込み定数

関係演算子と論理演算子の優先順位

(優先順位が高い)
  !  ~
  **
  *  /  %
  +  -
  <<  >>
  &
  |  ^
  >  >=  <  <=
  ==  !=
  &&
  ||
  ..  ...
  ?:
  =
  not
  and  or
(優先順位が低い)

条件演算子

条件式の結果によって異なる値を返す演算子 条件式 ? 真のときの値 : 偽のときの値

result = 80
flag = result > 60 ? "合格" : "不合格"

メソッド

トップレベ

クラス定義の中に記述されたのではなく、定義の外側にあるもの.メソッドはクラスの中に記述するものだが、トップレベルにも記述することができる。(Kernelモジュールの中に追加される)

Kernelモジュール

全てのクラスから参照できるメソッドを定義しているモジュール。

self

メソッド内で実行されるとそのメソッドを実行しているオブジェクトを示す

クラスとインスタンス

インスタンスメソッド

クラス内で定義されたメソッド。通常のメソッドはプログラム内からいつでも呼び出せるのに対し、インスタンスメソッドはそのクラスから作成されたオブジェクトしか呼び出すことができない。

アトリビュート、プロパティ

オブジェクトから取得したり、設定できる値

ローカル変数とインスタンス変数

  • ローカル変数: メソッドやブロックの内部で作成される変数。メソッドやブロック内部でのみ有効
  • インスタンス変数: 同じオブジェクトの内部で共有される変数。@ではじめる。

アクセス制御

クラス内での他のメソッドから実行されるだけのメソッドを定義するとき、オブジェクトから実行できないようにするためにアクセスを制限する。
public: オブジェクトからインスタンスメソッドとして実行可能
privete: クラス内の他のメソッドからのみ実行可能

※ 通常のメソッドは、指定をしない場合publicとなるが、initializeメソッドだけは常にprivateとなる。

モジュール

クラスとの違い

  • インスタンスを作成することはできない
  • 他のモジュールやクラスを継承できない

使用法

関数のようにモジュール内に定義されたメソッドを実行するか、クラスの中にincludeする。

Numericクラス

四捨五入:round

大きい方の整数へ変換する: ceil

小さい方の整数へ変換する: floor

整数を文字列に変換 基数を指定して形式変換: to_ s(base)
例: 12.to_s(2) →1100

文字コード取得: chr

商の整数部分を求める: div

整数または浮動小数点数の商を求める: quo, /

絶対値を取得: abs

Stringクラス

文字列を検索する(左から)。見つかった場合は文字列の左端の位置を返す index(pattern[, pos]) 第一引数には検索する文字列または文字コード、第二引数には検索を開始する位置を指定する。省略した場合は先頭から検索する str = "Hello" pos = str.index("ll") p pos 2
文字列を検索する(右から)reindex(pattern[, pos]) str = "Hello" pos = str.rindex("l") p pos 3
文字列が含まれているかどうか検索include?(substr) str = 'Hello'
check = str.include?("el")
文字列を削除する delete(str[, str2[, ...]]) 引数に指定した文字列が含まれていた場合は削除する。複数削除したい場合はカンマで区切って続けて引数に指定する。 str = 'Yo!world' str.delete!('Y')

Arrayクラス

Hashクラス

開始と終了位置を指定して取得する 1.新しい配列 = Arrayオブジェクト.slice(start..end)

2.新しいArrayオブジェクト = Arrayオブジェクト[start..end]

ary = ['こん', 'にち', 'は', 'ruby']

newary = ary[1..3]

→newaryに'にち','は','ruby'が入る。

開始と要素数を指定する 1.新しい配列 = Arrayオブジェクト.slice(start, len)

2.新しいArrayオブジェクト = Arrayオブジェクト[start, len]

ary = ['東京', '京都', '大阪', '名古屋', '福岡', '札幌']

newary = ary[1, 2]

→newaryに、'京都', '大阪'が入る。

指定の位置に新しい要素を挿入する Arrayオブジェクト[start, 0] = 新しい要素 ary = ["東京", "大阪", "名古屋", "福岡", "札幌"]

ary[1, 0] = ["横浜", "神戸"]

ary = ["東京", "横浜", "神戸", "大阪", "名古屋", "福岡", "札幌"]

配列を平坦化する Arrayオブジェクト.flatten ary = [1, 2, [3, 4, 5], 6, 7]

newary = ary.flatten

puts newary

[1, 2, 3, 4, 5, 6, 7]

配列の中の同じ要素を取り除く Arrayオブジェクト.uniq ary = [1, 2, 5, 2, 3, 5]

newary = ary.uniq

p newary

[1, 2, 5, 3]

配列の中の「nil」を取り除く Arrayオブジェクト.compact ary = [1, 2, nil, 3, 4, nil]

newary = ary.compact

p newary

[1, 2, 3, 4]

指定した値と等しい要素をすべて取り除く Arrayオブジェクト.delete(val)

引数「val」と等しい要素を取り除く

ary = [1, 2, 3, 5, 4, 3]

ary.delete(3)

p ary

[1, 2, 5, 4]

指定したインデックスの要素を取り除く Arrayオブジェクト.delete_at(pos)

引数「pos」であらわされるインデックスの位置にある要素を取り除く

ary = [1, 2, 3, 5, 4, 3]

ary.delete_at(2)

[1, 2, 5, 4, 3]

ブロック内での処理の結果がtrueの要素を取り除く Arrayオブジェクト.delete_if {|x| ...} ary = [1, 2, 3, 5, 4, 3]

ary.delete_if {|x| x % 2 == 0}

p ary

[1, 3, 5, 4, 3]

要素の順番を逆にする Arrayオブジェクト.reverse ary = [1, 2, 3, 4, 5]

newary = ary.reverse

 不明な箇所

クラスメソッドとインスタンスメソッド。モジュール

PostgreSQLの基本

今日はPostgreSQLの基本について勉強したのでまとめます。

参考: https://lets.postgresql.jp/documents/tutorial/postgresql-abc/1-1

PostgreSQL入門1(1)

データベース

大量のデータをコンピュータシステム上で扱えるように集めたもの

データベース管理システム

データベースを効率よく読み書きするためのソフトウェア。DBMS(DataBase Management System)とよぶことも

アプリケーション

データベース管理システムが実際にデータを収集したり、読み書きを行うためには、どのようなデータをどのような形でデータベースに入れるかを決めていなければいけない。これを決める用途のことをアプリケーションとよぶ。データベースはその用途が具体的に決まらないと作れない。

まとめ

データベースは具体的な用途が決まらないと作れない。データベース管理システムはアプリケーションを構成する種々のアプリケーションプログラムになりかわってデータベースを作ったり、データの読み書きをしてくれるソフトウェア。データベース管理システムを動かしてデータベースを使うには、アプリケーションプログラムを作らないといけない。

PostgreSQL入門2(2)

データベース管理システムがデータベースを守る

データベースに入れるデータは非常に重要なものが多い。データベース管理システムにはサーバがクラッシュしても、ハードウェアが故障してもバックアップと変更履歴を使ってデータベースを復元する手段がある。また、データベースは何人もの人が同時にデータベースを使うので、複数のアプリケーションプログラムが同時にデータベースにデータを読み書きすることができるようにデータベース管理システムは読み書きの整理をしている。

PostgreSQL入門2

PostgreSQLとは

フリーなオープンソースリレーショナルデータベース管理システム

※ フリー:利用するにあたってお金を払う必要がない
オープンソース: ソフトウェアは実行手順を人間が書いて作っている。この書かれたプログラムのもとを「ソースコード」といい、これを「コンパイラ」というプログラムでしょりしてコンピュータで動かせるようにする。オープンソースとはこのソースコードを公開していることをいう。

維持管理

PostgreSQLは80万行ものプログラムで書かれているので公開後に不具合や脆弱性がみつかったりする。これらの問題点を発見されるたびに修正していく作業をソフトウェアの維持管理という。
PostgreSQLでは「メジャーバージョン」というほぼ毎年新しい機能を追加したり、性能を改善した版を公開している。 維持管理は最新のメジャーバージョンだけでなく、過去のメジャーバージョンに対しても行われる。その結果同じPostgreSQLでもことなるプログラムが出回るので「バージョン番号」で区別する。

 バージョン番号の意味

8.3.5
8.3がメジャーバージョンを示し、5が維持管理をした「マイナーバージョン」を示す。メジャーバージョンが公開された後、5回の修正が行われたことがわかる。

PostgreSQLの入手方法

3つある。
1. Linuxディストリビューション。ほとんどのディストリビューションPostgreSQLが含まれている 2. PostgreSQLコミュニティ 3. サードパーティ

PostgreSQL入門3

リレーショナルデータベース

リレーショナルデータベースとは表であらわすデータ(Excelみたいなやつ)。リレーションとは表を数字的に扱ったときの名前。

Excelの表とデータベースの表の違い

  1. データベースの表は連結したり分割したりできない
  2. 行の順序に意味がない。
  3. 行はフィールドの値だけで区別されるので同じ値のフィールドでできている行を区別することはできない。
  4. データベースとのやり取りはSQLと呼ばれる一種のプログラム言語を使っておこなう

※フィールド: 特定の行の特定のカラムのことをいう

データベース管理システムはデータを確実に保存する。

Excelの最大行数は65,000行なのに対し、データベースの表の行数には制限はない。このような大量のデータを失わないための方法がデータベース管理システムにはある。

  1. クラッシュリカバリ
  2. アーカイブリカバリ

クラッシュリカバリ

データベース管理システムは、サーバの電源断やサーバプロセスの停止なのが発生したとき、変更の確定したデータが破壊されたり失われたりしないよう、データベースの変更記録(ログ)を常に保存し続けている。なんらかの異常が発生したとき、このログをつかってデータベースを最新の状態に復旧することをクラッシュリカバリという。クラッシュリカバリは異常発生後、最初にデータベース管理システムが起動したとき自動で行われる。

アーカイブリカバリ

データベースを格納していたディスクが壊れてアクセスできなくなるなどの異常が発生したとき、あらかじめ保存しておいたデータベースのバックアップとログをを使ってデータベースを復元することをアーカイブリカバリという。

sshの基本

sshをインストール、設定しました。
調べながら設定していくと何をどうしたか忘れてしまい、エラーがでても原因を探れなくなる事案が発生したため、これからは自分が設定した手順をメモしていくことにします。

sshとは

ネットワークを介して別のコンピュータにログインし操作するためのソフトウェアの一つ。公開鍵と秘密鍵を組み合わせ通信経路を暗号化する。 参考:http://e-words.jp/w/ssh.html

sshでできること

  1. リモートコンソール機能(ネットワークを通してほかのコンピュータのコマンド処理プログラムを利用)
  2. ネットワークを通してほかのコンピュータ上でプログラムを実行
  3. ポートフォワーディング(コマンド処理プログラム以外にもsshの暗号化通信機能を使用する)

参考:http://www.atmarkit.co.jp/ait/articles/0605/09/news086.html

sshインストールの手順

参考:http://www.bnote.net/kuro_box/ssh_inst.shtml
[https://webkaru.net/linux/ssh-prohibit-root-login/ ]

OpenSSHクライアントとOpenSSHサーバをインストール

$ sudo apt update
$ sudo apt install ssh

OpenSSHの設定(パスワード認証ログインとrootログインを禁止、Port22でログインできないようにする。)

設定ファイルsshd_configに設定する。 $ sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org バックアップを取る。とても大事
$ vi /etc/ssh/sshd_config
PermitRootLogin、PasswordAuthenticationをnoにする。ポート番号を22から他のものに変える。(0~1023はウェルノウンポートという主要なプロトコルで使用されているものなので避ける。49513~65535がいいらしいです。 参考:http://sawara.me/linux/890/)

#PermitRootLogin yes → PermitRootLogin no
#PasswordAuthentication yes → PasswordAuthentication no
#Port 22 → Port 他の番号     `#`を外して記入する

設定が完了したらSSHを再起動する
$ sudo /etc/init.d/ssh restart

公開鍵認証

参考:https://knowledge.sakura.ad.jp/3543/

rootユーザーで直接ログインすることを禁止しても、一般ユーザーはパスワードがわかるとsshログインできてしまう。公開鍵認証を使うと、「鍵を持っている人のみ一般ユーザによるログインを許可する設定」ができる

 方法

パソコン側に置く秘密鍵ファイルと、サーバー側におく公開鍵ファイルの二種類を作成する。この二つがそろって公開鍵認証によるログインが可能になる。

 公開鍵の設定手順

クライアントでキーペア(秘密鍵と公開鍵)を作成

参考:http://www.tooyama.org/ssh-key.html

※ クライアント側で設定(わたしの場合はmac)
$ mkdir .ssh .sshディレクトリを作る
$ cd ~/.ssh移動する
$ ssh-keygen -f client_rsa -t rsa -b 2048

  • ssh-keygen:鍵を作成するコマンド
  • -fオプション:鍵のなまえ
  • 秘密鍵(id_rsa)公開鍵(id_rsa.pub)
  • -t : 鍵の種類、暗号方式。RSAやDSAといったものがある。RSAにしておけばいいらしい。
  • -b :鍵の暗号化強度(bits) $ man ssh-keygenいわく、2048でいいらしい
$ ls ~/.ssh           ←鍵が作成されているか確認
client_rsa client_rsa.pub 

クライエントにキーペアを登録

$ ssh-add -K ~/.ssh/client_rsa

 鍵をサーバーに登録

ssh-copy-idコマンドを使う方法と手動コピーをする方法があるらしいが、手動は面倒そうなのでssh-copy-idをつかう

$ ssh-copy-id -i ~/.ssh/client_rsa.pub <ユーザ名>@<アドレス>
Are you sure you want to continue connecting (yes/no)? yes
<ユーザ名>@<アドレス>'s password:   ←パスワード認証する(初回のみ)
    Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '<ユーザ名>@<アドレス>'"
and check to make sure that only the key(s) you wanted were added

この方法では初回のみパスワード認証する必要があるのでPermission deniedのエラーが出た場合はリモートサーバのssh_configでPasswordAuthenticationyesにする。接続できたらもとに戻す


Port 22を変更したときウェルノウンポートを設定してしまいました。バックアップをとっていてよかった…。

aptコマンド

まだ理解は浅いのですが、Linuxのaptコマンドについてまとめます。

aptコマンドとは

Debian系のディストーションのパッケージ管理システムであるAPTライブラリを利用してパッケージを操作、管理するコマンド。RedHat系のディストリビューションだとyumrpmコマンド、macOSだとHomebrewなどがある。 APTはAdvanced Packaging Toolの略。

使い方

参考

ハッシュからキーと値を取り除く Hashオブジェクト.delete(key) h = {'suzuki' => 43, 'tada' => 54, 'nanri' => 19}

h.delete('suzuki')

ハッシュからキーと値を取り除く(指定したキーが存在しないばあいの処理を記述する) Hashオブジェクト.delete(key) {|key|...} t = {'yamada' => 14, 'satou' => 24, 'saitama' =>83}

t.delete('suzuki'){|key| puts "#{key}はありません"}

ブロック内で処理をし、結果がtrueの要素を取り除く Hashオブジェクト.delete_if {|key, value| ...} t = {'yamada' => 12, 'tanaka' => 65, 'suzuki' => 54}

t.delete_if {|key, value| value < 60}

複製したハッシュオブジェクトからキーと値を取り除く Hashオブジェクト.reject {|key, value| ...} h = {"suzuki" => 87, "itou" => 76, "yamada" => 69}

newHash = h.delete_if {|key, value| value < 80 }

コマンド意味
apt list パッケージ一覧を表示
apt search検索して該当するパッケージを表示する
apt show パッケージの情報を表示する
apt installパッケージをインストールする
apt removeパッケージを削除する
apt update インストールできるパッケージ一覧の最新情報を取得
apt upgradeインストール済みのパッケージをまとめて更新する
apt full-upgrade upgradeに調整を加える。(更新により使用できなくなるパッケージを削除等)

簡単なまとめになりましたが学習を進めていくにつれ更新していこうと思います。

Macのvimtutor

fjordでのCSSの課題が終わりました。難しくて一週間くらいかかりましたが、完成後のお手本を見ても道筋が全く見えずに焦っていた頃に比べると、何とか形にするくらいにはなったので少し自信がつきました💪

今日はmacvimチュートリアルを学習しました。概要はわかりましたが私の脳の容量を考えるとすぐに忘れる気しかしないので備忘録として書いておきます

vi概要

viとはすべてのunix系OS上で使えるテキストエディタ

viには大きく分けて3つの動作モードがある

  1. インサートモード(文字を入力する)iを押す
  2. コマンドモード(編集する)
  3. exモード viではこれらの動作モードをescキーと文字挿入系コマンドで切り替えながら作業する。ESCキーは自分がどこの動作モードにいるのか確認することもできるので、作業をするまえにESCキーを押す癖をつける。

vimtutorで覚えたこと箇条書き

  • vimの終了 :q!
  • 削除 カーソルを削除したい文字の上におき x
  • テキスト編集(挿入) カーソルの位置に追加するiをおすとインサートモードになる。そこから文字を入力
  • テキスト編集(追加) 行末についかする A
  • ファイルを保存して終了 :wq
  • 単語の末尾まで削除する dw
  • カーソルの位置から行の末尾まで削除する d$

  • 多くのコマンドはオペレータとモーションからテキストに変更を加える。

  • 削除コマンドdにモーション

  • w カーソルの一から空白を含む単語の末尾まで

  • e カーソルの一から空白を含まない単語の末尾まで
  • $ カーソルの位置から行末まで

などを追加する。例:d$はカーソルの位置から行末まで削除となる。

  • モーションを繰り返すには数値を付与する オペレータ 数値 モーション d2w単語の末尾まで削除を二回繰り返す

  • 行の先頭に移動するには0を使用

  • 最後のコマンドを取り消す u

  • 行全体の取り消し U
  • 取り消しの取り消し CTRL-R

  • 最後に削除された行をカーソルの後に貼り付けるp 使い方:ddで行を全て消し、pで貼り付け

  • カーソルの下の文字を置き換える r

  • 変更コマンド c 単語の一部、全体を変更 cw
  • タイプ中のミスはバックスペースキーで直すことが出来る

  • ファイル内での位置とファイルの状態がページの一番下に表示される ctrl-g

  • ファイルの最下行に移動 G
  • ファイルの先頭に移動 gg
  • 指定した行番号に移動 行番号 + G

  • ファイル内検索 /の後、検索語句をタイプする。 つぎの文字を検索する にはnを押す

  • 対応する括弧を検索 括弧(,[,{にカーソルを移動し、%とタイプする

  • 行の最初のoldをnewに置き換える

  • 行のすべてのoldをnewに置き換え :s/old/new/g
  • 置き換える範囲行番号を指定する :#,#s/old/new/g (##に開始と終 了の行番号指定)
  • ファイル全体で見つかるものを置き換える :%s/old/new/g
  • ファイル全体で見つかるものを確認しながら置き換える :%s/old/new/gc

  • 外部コマンドを実行する :!のあとにコマンド

  • ファイルへの変更を保存する :w ファイル名
  • 選択したものを書き込む vを押してからカーソルを移動し選択したい範囲まで移動し:Pを押す。その後 w ファイル名をタイプ
  • ファイルの中身を挿入する :r ファイル名 ←外部コマンドの出力を読み込むこともできる :r !ls (lsコマンドの出力を読み込む
  • カーソルの後ろにテキストを追加 a
  • コピーとペースト コピー y ペースト p (vで選択し、yでコピー)
  • カーソルを当てた文字のつぎからテキストを追加する a
  • 行末にテキストを挿入する A
  • 置き換えモード R

  • オンラインヘルプ

  • <HELP> キー
  • <F1>キー
  • :help (コマンドを引数として渡すとその題名のヘルプを見ることが出来る e.g. :help user-manual :help w ヘルプウィンドウを閉じる :q

vimrcスクリプト:set xxxが理解できなかったので復習します。

Webサービスの基本

非エンジニアのためのこれだけは押さえておきたいWEBサービスの基礎技術を読んだのでまとめます。

大事

実務では、非エンジニアとエンジニアに言葉の壁があるのでエンジニアはわかりやすく伝えることを意識する。
日頃から自己完結ではなく伝えることを意識して勉強する。

Webサービスの動き方

Webサービスはクライエント側がこのページを見たいという要求を送り、サーバー側が要求されたページを返すことの連続で成り立っている。
このやり取りには「住所」に当たるものが必要でそれはIPアドレスと呼ばれる。IPアドレスは数字であらわされるため、人間にわかりやすく表現したものがあり、それはドメインと呼ばれる。(例)ドメイン: facebook.com = IPアドレス:31.13.82.1

クライエント側がサーバに要求を送る際、DNSサーバ(ドメインネームシステム)がドメインからIPアドレスへの変換作業(名前解決)をしている。
サーバー用のOSはUnixベースのOSがよく使われていて、MacUnixベースのOSであるため開発環境がサーバの環境に近い。
Webサイトは静的なページをHTMLで書き、CSSでデザインする。ここに、サーバサイドスクリプト(RubyJava)を記述し、動的な要素を加える。