湯LOG

主に自分用のメモ

SQL初心者のおぼえがき(1)

SQLとは

ウィキペディアより引用

SQL(エスキューエル英語 i [ˈɛs kjuː ˈɛl]、シークェル英語 i [ˈsiːkwəl]、シーケル)は、リレーショナルデータベース管理システム (RDBMS) において、データの操作や定義を行うためのデータベース言語(問い合わせ言語)である。
SQL - ウィキペディア
https://ja.wikipedia.org/wiki/SQL

つまるところ、アプリとかWEBサービスとかを作る際に、ユーザーの情報だとかを保持するために必要な「データベース」を操作するための言語ということですね。

データベースにも幾つか種類があるのですが、その中でもメジャーなMySQLを勉強しました。

勉強するにあたって、下記のサイトをもとに参考にしました。dotinstall.com

MySQLのインストール

まずはMySQLのインストールから。インストール手順、セキュリティ設定などは以下のサイトを参考に。qiita.com
今回はSQLの勉強がメインということで作業ユーザの設定などは行いません。

用語

データベース(DB)

特定のテーマに沿ったデータを集めて管理し、容易に検索・抽出などの再利用をできるようにしたもの。
データベースをコンピュータ上で管理するためのシステムをデータベース管理システム (Database Management System, DBMS) という。

テーブル

データベースにおける表のことで、ExelのSheetをイメージするといいと思います。
データベースの中にいくつかテーブルを作ることができるんですね。
Exelには無数の行列がありますが、一方でデータベースでのテーブルは所定の個数の列があり、行数は不定です。各行は特定の列の値で識別され、それを候補キーと呼びます。

フィールド

列。

レコード

各フィールドに対応するデータ。行。

データベースの操作

それでは、実際にMySQLの起動、操作に移っていきます。

データベースの作成

mysql> create database test_database;

ここではtest_databaseという名前のデータベースを作成します。
ちなみに「;」を忘れると以下のように入力待ちになります。(次の行でセミコロン打っても大丈夫)

mysql> create database test_database
    -> ;
作成したデータベースを見る
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| test_database      |
+--------------------+
5 rows in set (0.00 sec)

こんな感じのでました。デフォルトでいくつか入ってるんですね。databasesは複数形なので注意です。

作成したデータベースを削除する
mysql> drop database test_database;

確認

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.01 sec)

簡単に消えてしまいました。これはこれで注意が必要そう。

作業データベースの変更
mysql> use test_database;
Database changed

テーブルの作成

create table [テーブル名](フィールド名 型, フィールド名 型, ・・・);
mysql> create table users(
    -> id int,
    -> name varchar(255),
    -> email varchar(255),
    -> password char(8)
    -> );

ここで、intは整数型、varchar(255)は255文字までの文字列、char(8)は8文字の文字列ということを指定します。
他にも、浮動小数点のdouble型、列挙型と言われるenum、文字列の長さがわからない場合のtextなどがあります。

mysql> show tables;
+-------------------------+
| Tables_in_test_database |
+-------------------------+
| users                   |
+-------------------------+
1 row in set (0.00 sec)
入力を必須にする
    -> id int not null,
自動連番
    -> id int not null auto_increment,
デフォルト値
    -> sex enum('male', 'female') default 'male',

索引(インデックス)

主キー:レコードを一意に特定するキー

    -> id int not null auto_increment primary key,

キー:普通の索引キー

    -> key score (score),

ユニークキー:重複した値が入ってきた時にエラーではじく

    -> email varchar(255) unique,

これらを基に、あらたに表を作成します。
ちなみに列挙型enumは、1が'male'、2が'female'を示します。

mysql> create table users(
    -> id int not null auto_increment primary key,
    -> name varchar(255),
    -> email varchar(255) unique,
    -> password char(8),
    -> score double,
    -> sex enum('male', 'female') default 'male',
    -> key score (score)
    -> );

テーブルの中身を確認

mysql> desc users;
+----------+-----------------------+------+-----+---------+----------------+
| Field    | Type                  | Null | Key | Default | Extra          |
+----------+-----------------------+------+-----+---------+----------------+
| id       | int(11)               | NO   | PRI | NULL    | auto_increment |
| name     | varchar(255)          | YES  |     | NULL    |                |
| email    | varchar(255)          | YES  | UNI | NULL    |                |
| password | char(8)               | YES  |     | NULL    |                |
| score    | double                | YES  | MUL | NULL    |                |
| sex      | enum('male','female') | YES  |     | male    |                |
+----------+-----------------------+------+-----+---------+----------------+
6 rows in set (0.01 sec)

幅が足りなくて見づらくなってしまいました。
が、ターミナル上では見やすく表示されるはずです。

レコードの挿入

対応する引数に値を代入し、レコードを作成します。

mysql> insert into users (name, email, password, score)
    -> values ('takuya', 'takuya@email.com', 'xxxx', 5.5);

データを抽出

挿入したレコードを表示させます。

mysql> select * from users;
+----+--------+------------------+----------+-------+------+
| id | name   | email            | password | score | sex  |
+----+--------+------------------+----------+-------+------+
|  1 | takuya | takuya@email.com | xxxx     |   5.5 | male |
+----+--------+------------------+----------+-------+------+
1 row in set (0.00 sec)

select文についてはまた後述します。
アスタリスク(*)はレコードを全部指定するということです。
挿入したレコードがきちんと表示されました。


長くなってしまったので、続きは次回に回したいと思います。(更新しました)yuzatakujp1013.hatenablog.com

boostセットアップメモ

はじめに

boostをセットアップする際に少しつまずいてしまったのでメモ。

手順

まずは普通にboostをインストール。
インストールしたいフォルダに移動して、git clone

cd C:/boost
git clone https://github.com/boostorg/boost.git

$(BOOST_ROOT)/tools/buildに bootstrap.bat があるので、それを実行。

>bootstrap.bat
Bootstrapping the build engine
'MySQL' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
'MySQL' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

あれ?エラー。
MySQLとか関係あるのか?
よくわからないけど、とりあえず「Visual Studio コマンド プロンプト」を使って実行している記事(以下)を見たのでそれでやってみる。
技術メモ/Boostセットアップ – otoco

Bootstrapping the build engine

Bootstrapping is done. To build, run:

    .\b2 --prefix=DIR install

できた。。。よくわかりませんな。
詳しい方いたら教えて頂きたいです。

次に、先ほどつくられた b2.exeを使ってインストールをします。

> b2.exe install -j4 --prefix=(インストールしたいディレクトリ)

ここで、-j4は並列数です。マルチコアCPUの場合は並列数を指定してやったほうがいいと思います。
これが終わったら、(インストールしたいディレクトリ)/bin にパスを通しておきます。

次に、boost自体のビルド
$(BOOST_ROOT) フォルダに移動し、

> b2 toolset=msvc threading=multi variant=debug,release link=static runtime-link=static address-model=64 --stagedir=stage/x64 -j8
> b2 toolset=msvc threading=multi variant=debug,release link=shared runtime-link=shared address-model=64 --stagedir=stage/x64 -j8

今回は64bitコードをインストール。
32bitコードを使いたい場合は単に64のとこを32にかえればいいと思います。

これでほぼ完了。
実際にboostを使うときは、
インクルードフォルダに $(BOOST_ROOT) フォルダ
ライブラリフォルダに 64 ビットなら $(BOOST_ROOT)\stage\x64\lib
を追加してやればよさげ。

わからないこと多すぎて時間かかってしまいました。

VagrantでLinux仮想環境構築

概要

vagrantを使って、仮想環境(virtualboxなど)上への仮想Linuxマシンの立ち上げ

はじめに

vagrant

仮想化支援ツール仮想マシンの構築と環境設定がまとめて実行できるらしい。ChefやPuppetなどの構成管理ツールが必要ないということですかね。
動的にアプリケーションやミドルウェアをセットアップするプロビジョニング機能が備わっているらしい。
(ベイグラントって読むらしい。バグラントって読んでたはずかちい)

virtualbox

仮想化ソフト。

vagrantはあくまで仮想化を支援するツールであって、結局のところvirtualboxのようなプロバイダが必要。
(ちなみにVMwareやパブリック・クラウドとの連携も可能)
自分の作業環境を別の場所で再現したり、チームや社内で設定環境を共有したりする際にvagrantが役立つみたいですね。


今回は仮想Linux上でDeepLearningのフレームワークであるCaffeを動かすために、仮想化から。
ホストOS:Mac OSX Yosemite 10.10.3
ゲストOS:Ubuntu 14.04

セットアップ

以下からダウンロード・インストール

Vagrantのダウンロードページ
http://lab.raqda.com/vagrant/

Virtualboxダウンロードページ
http://www.oracle.com/technetwork/jp/server-storage/virtualbox/downloads/index.html


Vagrantには日本語ドキュメントページがあるので、
操作一覧はここを参照すると良いでしょう。

Vagrantの日本語ドキュメントページ
http://lab.raqda.com/vagrant/

操作

インストールが終わったら、実際にvagrantを操作してwebサーバの自動設定やSSH仮想マシン内にログインしてみます。

まず、適当に作業用ディレクトリ(ここではcaffe_ubuntu)を作成し、そこに移動します。

$ mkdir caffe_ubuntu
$ cd caffe_ubuntu
仮想環境のベースとなるboxファイルを準備
$ vagrant box add NAME url
#example
$ vagrant box add ubuntu64 Ubuntu64_14_04 https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-i386-vagrant-disk1.box

他にも色々(CentOSもあります)
http://www.vagrantbox.es/

以下のコマンドでboxファイルが確認できます

$ vagrant box list
ubuntu64(virtualbox, 0)

みたいな感じになります。

vagrantfileの作成

このファイルでいろいろな設定を記述しています。(適当)
先ほど準備したboxファイルを基に作成します。

$ vagrant init ubuntu64

これでようやく仮想化の準備が整いました。
ちなみにvagrantfileにはネットワークの設定や共有フォルダの設定、GUIモードの設定などについて記述されています。
以下は、ホストとゲスト間でネットワークのやり取りを可能にし、共有フォルダ"/data"を設定(あらかじめ準備しておく)し、GUIモードで仮想環境を実行する場合の例(だいたいコメントアウトを消すだけ)

    Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
    config.vm.box="centos64"

    //ネットワークの設定
    config.vm.network :private_network, ip:"192.168.33.10"

    //共有フォルダの設定
    config.vm.synced_folder "data", "/vagrant_data"

    //GUIモードの設定
    config.vm.provider :virtualbox do |vb|
        vb.gui = true
    end
end
仮想マシンを起動
$ vagrant up

これだけ。GUIモードをオンにしているとvirtualboxが起動します。(id/passともに初期設定ではvagrantです)

$ vagrant status

で立ち上がりの確認できます。runningがでたらOK。
UbuntuGUIの初期設定に関してはまだよくわかってないのでおいおい。

SSHでログイン
$ vagrant ssh

成功するとvagrantアカウントでログインしたことになる。
rootにスイッチするには

$ sudo su

を実行。

SSH接続を終了
$ logout
仮想環境を終了
$ vagrant halt
その他基本的なコマンド
$ vagrant suspend     //仮想マシンを一時停止
$ vagrant destroy     //仮想マシンを破棄

おわり

とりあえずここまで。
初めて使った感想は、CUIだとあまり感動がない。。。
GUIでやりたい人はvirtualboxから直接立ち上げたほうがよさげ。