未分類

前回までにdockerを動かせるまでになりました。

今回はdockerで試しにプロキシサーバーを立ててみようと思います。

未分類

前回までにssh ユーザー名@elephantcat.workみたいなことができるようになりました。

次はVPSで新しいサービスを稼働させるべく、dockerを入れます。

未分類

前回はVPSでUbuntuを1台立てて、sshでユーザー名@IPアドレスに繋げられるところまで設定しました。

今回はこのVPSにドメインを設定し、sshでユーザー名@ドメインに繋げられるようにしよう、としてみます。

未分類

前回はVALUE SERVERというレンタル共有サーバーから、ConoHaのVPSに引っ越した話をしました。

今回以降はしばらくそのとき行った設定などのメモをしておきます。

未分類

VALUE SERVERのまるっとプランから、ConoHaの1GBプランに引っ越しました。

未分類

はじめに

前回はvscodeのメニュー表示バグの回避+αを記事にしました。

今回はようやくdjangoです。

git導入

まずは開発の基本gitです。バージョン管理すると失敗してもいつでも元に戻せます。というわけでgitをインストールします。

sudo apt install git

vscode上で環境構築

フォルダ作成

まずはvscodeを起動します。[フォルダを開く]から、~/python/を開き、右上のボタンからdjango_appsフォルダを作成して開きます。

gitリポジトリの作成

フォルダが開いたら次はメニューからターミナルを開きます。

開いたターミナルでgitリポジトリをその場に作ります。

git init

Python環境の作成とgit無視ファイルの設定

出来たら次にpythonの環境をその場に作ります。

python3 -m venv env

すると何やら左側に怪しい数字が出てきます。数字の出てるボタンをクリックします。

見てみると、さっきのpython環境を作成したときに出来たファイルのようです。つまり環境作成したときに346個のファイルが変更(追加)されたよと言っています。これはvscodeがデフォルトで持っているgitの機能で、さきほど作ったリポジトリを認識していて、その変更を検出したために変更ファイル数を教えてくれてたのです。ただ、自動生成されるファイルや外部から取得するファイルはgit管理対象にしないのがお約束なので、ここでは無視ファイルに指定します。いきなり346個も指定するのは辛いので、右上の階段状のボタンを押します。

これでフォルダ階層表示になるので、変更部分が分かりやすくなります。envを右クリックして、

[.gitignoreに追加]を選択します。これは、選択したフォルダ以下全てをgit管理対象にしない=無視するという意味です。

無視にすると、変更として検出されなくなり、無視設定ファイルである.gitignoreが作成されました。このファイルを開くと

346個のファイルが全て一覧されてしまっているので、

最上位フォルダのみに修正しておきます。 (以降このフォルダに追加された場合も自動で無視したいので)

これで心置きなくpython環境を設定できます。

vscode用python環境選択

次はvscodeにpython環境を認識させます。F1キーを押して、python: Select Interpreterと打ち込んでEnterしてください。

さっき作成したpython環境が./env/bin/pythonにあるので、それを選びます。

これでvscodeがこのフォルダで使用するpython環境が設定されました。

pipを使ったインストール

後はvscodeのメニューのターミナルから新しいターミナルを開きます。env環境で立ち上がるので、ここでpipでパッケージを更新しておきます。

pip install -U pip
pip list -o
pip install -U setuptools

これで更新が必要なpythonモジュールがなくなるので、djangoをインストールします。

pip install django

djangoのプロジェクト作成と確認

まずはsample_siteプロジェクトをカレントディレクトリに作成します。

django-admin startproject sample_site .

これでサービスが稼働可能な状態になるので、djangoの開発サーバーを起動してみます。

python manage.py runserver

プロンプトが戻らずに出力が止まり、http://127.0.0.1:8000/などと出てきていたら起動成功です。firefoxを立ち上げて、http://127.0.0.1:8000/を開いてみましょう。

まだ何もプログラミングもしてないのに、画面が出ましたね。これがフレームワークの力です。骨組みはすでにあるので肉付けしてくれという状態なのです。でもこれは確認用の画面なので、この画面を編集することはありません。

アプリケーション作成

まずはCtrl+Cで開発用サーバーを止めて、sample_appを作成します。

python manage.py startapp sample_app

ここまでで骨組みが出来ています。

pipのrequirements.txt作成

今、pythonの環境は全てgitからは無視ファイルとして扱っているため、保存されません。そのため、pythonの環境はいつでも復元できるようにインストールしたパッケージのリストをバージョン付きで保存します。それがrequirements.txtです。以下のコマンドで作成します。

pip freeze > requirements.txt

sqlite3データの無視ファイル追加

データベースのデータはgitには入れないので、このファイルも無視します。db.sqlite3を右クリックして[.gitignoreに追加]してください。あとは、pythonバイトコードのキャッシュ(.pyc)も無視ファイルに追加します。最終的に.gitignoreは↓な感じになります。

env/
db.sqlite3
*.pyc

gitリポジトリにコミット

切りが良いので、リポジトリにコミットしておきます。まずは数字の出ているところアイコンを押して、変更と書いてあるバーの右側の+を押します。

すると、[変更]の上に[ステージング済みの変更]という項目が出来上がり、元々検出されていた変更ファイル群が[ステージング済みの変更]に移動しました。後はコミットするだけなのですが、初回はその前にやることがあります。確認の意味でメッセージに「初回コミット」と入れて、一度チェックボタンを押して見ると…

こんな感じで怒られます。gitは原則コミットした人の名前とメールアドレスをちゃんと記述する慣習で、その設定がされていないとエラーになります。

初回だけなので、vscode内のターミナルからサクっと登録しておきます。

git config --global user.email "you@example.com"
git config --global user.name "Your Name"

※メールアドレスと名前は自分の物に変えてください

これでコミットできるようになったので、チェックボタンを押してコミットしてみてください。成功すれば何も出ずに16個の変更ファイルがなくなります。ターミナルからgit logとすると、履歴を見ることが出来ます。

(env) user@ubuntu1804:~/python/django_apps$ git log
commit de2a5a426e41514b9281ee3250d19560f92e632a (HEAD -> master)
Author: first_user <first_user@elephantcat.work>
Date:   Sat Feb 8 01:28:39 2020 +0900

    初回コミット
(env) user@ubuntu1804:~/python/django_apps$ 

Hello,Worldの作成

まずはViewから作成します。見たまんまなHello,Worldを返すビューです。

from django.http import HttpResponse

def index(request):
    return HttpResponse("<html><body>こんにちは!世界</body></html>")

このアプリのURLとビューの対応表です。

from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

このサイトのURLとアプリの対応表です。

"""sample_site URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/3.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('sample_app/', include('sample_app.urls')),
    path('admin/', admin.site.urls),
]

では、開発サーバー起動

python manage.py runserver

firefoxで確認

OK!なので、ステージングしてコミットします。

一応GitList Giteaに置いておきました。

まとめ

djangoでHello,Worldまでをgitにコミットしながらローカルvscode環境で実行させるところまでできた。

次回(↓)はアプリケーションとしての何かの機能を実装して、デバッグまでしてみたい。

未分類

はじめに

前回は、Ubuntuにvscodeをインストールして、pythonの開発環境を立ち上げてみました。

今回は、その環境でdjangoというpython用のWebフレームワークを使って、Webアプリを作ってみたいと思っていましたが、閑話休題。一旦少しUbuntuのデスクトップ環境を少し整えます。今まで説明した設定だけではあまりに使いにくいので…

デスクトップテーマの変更

見た目なんてどうでもいいのですが、Ubuntu18.04でvscodeを使うと、メニューが表示されないバグがあるので、その回避策でテーマを変更します。

gnome-tweaksのインストール

デスクトップ版なのにデフォルトではテーマすら変更できないのが最近のUbuntuです。まずはgnome-tweaksをインストールします。

sudo apt install gnome-tweaks

インストールが終わったら、Windowsキー→tweaks[Enter]でtweaksを起動します。

この画面でテーマの変更が可能です。

Yaruのインストール

vscodeの問題回避に有効と言われているのは、18.10で配布されたテーマ(Yaru)なのですが、これは18.04でもパッケージが追加されています。ただし、追加されたパッケージはsnap用なので、snapでインストールします。(aptにもppaという私用のパッケージ配布リポジトリがありましたが、もううまく動かないとのことなので今はsnapしかありません)。

sudo snap install communitheme

インストールが終わったら再起動します(ログアウトでもいいかもしれませんが念の為) 。再起動したらログイン前に、下図のようにセッションを「Ubuntu」から「Ubuntu with communitheme snap」に変更してから、ログインします。

一度変更すれば、次回は同じものがデフォルト選択されます。ログイン完了したら、Tweaksを起動して、 テーマのうちアプリケーション、カーソル、アイコンの3つをCommunithemeに変更すれば完了です。

メニューが白背景になるので、vscodeで現象が発生しなくなります(ごめんなさい。しばらく効果あったのですが、最終的には発生しました。一度発生したら結構頻度上がりました)。アイコンなどの形もやや変わり、少し新しい感じになります。

スクリーンロックの設定

Ubuntuのスクリーンロックがとにかく時間が短いです。VirtualBox内などの環境でスクリーンロックが必要なケースは稀だと思うので、これはOFFにしてしまいます。右上のメニューから設定ボタンを押すと…

こんな画面が出るので、ココの画面ロックを押します。すると…

またダイアログが出てくるので、自動画面ロックをOFFにします。

ついでに電源管理の省電力ブランクスクリーンもOFFにしておきます。

リソースモニタの常時表示

GUIで使う場合は特に時間よりも何よりも、固まってるのか動いてるのか分からない場合があるので、システム負荷が知りたいことが多いです。そのため、上部バーなどに常駐するリソースモニタを入れておきます。

sudo apt install gnome-shell-extension-system-monitor

入れ終わったら一旦ログアウトして再ログインした後、tweaksを起動します。とりあえず曜日よりも日付が欲しい派なので、日付をONします。

拡張機能にあるシステムモニタをONにして、設定ボタンを押します。

CPU~Diskまで全てDisplayします。GPUも必要なら出来ますが、あんまり信用できないかもしれないので、私は使ってません(Windows側で見てる)。

設定完了すると、トップバーはこんな感じになります。

まとめ

これで大体Ubuntu GUIで何をするにも最低限必要な環境にはなったかと思います。GUIなので、リソース消費が激しいですけども。。。
次回(↓)こそUbuntu+vscode+djangoが出来ればいいと思います。

未分類

はじめに

前回は、WindowsのDBeaverからVirtualBoxのUbuntuに入れたPostgreSQLにアクセスして簡単な表を見てみました。

今回は、一旦DBから離れてUbuntu 18.04上にVisual Studio codeをインストールして、Pythonの開発環境を整えてみます。

Visual Studio codeのインストール

最初に断っておくと、私はLinux上のVisual Studio code(以下vscode)を常用していません。理由はWindowsのvscodeからremote-sshで使っているからです。ただ最初はローカルにvscodeをインストールして使います。参考資料は以下になります。

Running Visual Studio Code on Linux

snap/apt?

Ubuntuにvscodeをインストールする方法はsnapを使う方法とaptを使う方法の2種類あります。snapはUbuntuでしか利用されない特殊なパッケージで、コンテナを前提としたアプリのインストールをするため、従来のパッケージ管理と大きく違います。アプリに余計なオーバーヘッドは要らないので、今回はaptで行きます。

aptリポジトリの追加

wget -O - https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
sudo install -o root -g root -m 644 packages.microsoft.gpg /usr/share/keyrings/
sudo sh -c 'echo "deb [arch=amd64 signed-by=/usr/share/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list'
rm packages.microsoft.gpg

インストール

sudo apt-get install apt-transport-https
sudo apt-get update
sudo apt-get install code

これでコマンドラインからcodeと打つとvscodeが起動するようになりました。もちろんWindowsキーからcodeでも、アプリケーション表示からvscodeアイコンを選択しても起動します。

起動直後の画面はこんな感じかと思います。

VisualStudio codeのプラグイン追加

vscodeは豊富なプラグインが売りになっています。まずはプラグインの追加方法説明も兼ねて…

日本語化

してみます。vscodeの左側についているバーの一番下のアイコンが拡張機能です。ここを押すと…

各種拡張機能(プラグイン)の一覧が出てきます。一番上に検索ボックスがあるので、そこに Japanese と打ち込むと…

日本語に関連した拡張機能が一覧されます。では一番上にJapanese Language Pock fo…というのがあるのでこれのInstallボタンを押します。しばらくすると右下にポップアップが出てくるので、そこにある[Restart Now]ボタンを押すと…

日本語で起動してくれます。

vscodeには各種のプラグインがありますが、ここではこれだけにして、必要なときに入れていく方式を採ります。

Python開発環境の構築

vscodeで環境構築する前にpython自体の環境構築方法について説明を入れておきます。

python2とpython3

まずはpythonのバージョンについて…

pythonにはバージョン2系とバージョン3系があります。2系のスクリプトは3系で動かないことが多いです(文字列周りがかなり違う)。なのでpythonというとまずはバージョンを確認することが多いわけです。今回は18.04.3をクリーンインストールしたので2系は入っておらず、3系だけです。環境を構築する上で2系のことは考えないことにします。また3系でもバージョンはいくつかありますが、複数のバージョンを切り替えて使用することも考えないことにします。

pythonのパッケージ管理

最近のスクリプト言語は、使用するライブラリ(モジュール)などをパッケージ管理が出来るようになっています。インターネットから自由にダウンロードして、簡単に利用でき、また更新なども一発で出来るようになっています。pythonでもそのような機能がありますが、スクリプト言語のパッケージでよく問題になるのは、「インストールする場所」です。例えば複数のユーザーで共通で使いたいライブラリがあるとか、このアプリだけで使うライブラリなどがあった場合、同じ場所に突っ込むと、必要なバージョンが違うなどの不都合が発生したりします。

なので、この手のパッケージ管理はアプリケーションならアプリケーションの環境ごとに分けることが多いです。その環境を切り替えるコマンドがvenvです。

venvのインストール

このvenvはpython標準の機能なのですが、ubuntuは改悪してvenvを外しているので、最初にこれをインストールします。

sudo apt install python3-venv

venv環境の作成とactivate

次に環境をtestという名前で作成します。

python3 -m venv ~/.venv/test

最後に指定してる引数が環境を保存するディレクトリになります。そしてこのディレクトリの名前が環境の名前です。では早速作成した環境に切り替えてみます。

user@ubuntu1804:~$ . ~/.venv/test/bin/activate
(test) user@ubuntu1804:~$ 

環境を切り替えるとプロンプトが変わり、カッコ付きで環境の名前が入るようになります。この状態であれば、いくらパッケージをインストールしても他の環境に影響を与えることはありません。

パッケージの更新・追加

試しにpip自体のアップデートをしてみます。

(test) user@ubuntu1804:~$ pip install -U pip
Collecting pip
  Downloading https://files.pythonhosted.org/packages/54/0c/d01aa759fdc501a58f431eb594a17495f15b88da142ce14b5845662c13f3/pip-20.0.2-py2.py3-none-any.whl (1.4MB)
    100% |████████████████████████████████| 1.4MB 958kB/s 
Installing collected packages: pip
  Found existing installation: pip 9.0.1
    Uninstalling pip-9.0.1:
      Successfully uninstalled pip-9.0.1
Successfully installed pip-20.0.2
(test) user@ubuntu1804:~$

めちゃくちゃバージョンアップしました。他にアップデートできるものがないかどうか見てみます。

(test) user@ubuntu1804:~$ pip list -o
Package    Version Latest Type 
---------- ------- ------ -----
setuptools 39.0.1  45.1.0 wheel
(test) user@ubuntu1804:~$

setuptoolsもアップデートできるようなのでやっておきます。

(test) user@ubuntu1804:~$ pip install -U setuptools
Collecting setuptools
  Downloading setuptools-45.1.0-py3-none-any.whl (583 kB)
     |████████████████████████████████| 583 kB 6.5 MB/s 
Installing collected packages: setuptools
  Attempting uninstall: setuptools
    Found existing installation: setuptools 39.0.1
    Uninstalling setuptools-39.0.1:
      Successfully uninstalled setuptools-39.0.1
Successfully installed setuptools-45.1.0
(test) user@ubuntu1804:~$

では適当にbottleでもインストールしてみます。

(test) user@ubuntu1804:~$ pip install bottle
Collecting bottle
  Downloading bottle-0.12.18-py3-none-any.whl (89 kB)
     |████████████████████████████████| 89 kB 2.1 MB/s 
Installing collected packages: bottle
Successfully installed bottle-0.12.18
(test) user@ubuntu1804:~$

インストール済みのパッケージを一覧します。

(test) user@ubuntu1804:~$ pip list
Package       Version
------------- -------
bottle        0.12.18
pip           20.0.2 
pkg-resources 0.0.0  
setuptools    45.1.0 
(test) user@ubuntu1804:~$ 

これだけ分かればパッケージ管理は何とか出来ると思います。削除など必要であればググって調べてください。

venv環境のdeactivateと削除

次は今の環境を抜けて元の環境に戻します。

(test) user@ubuntu1804:~$ deactivate 
user@ubuntu1804:~$

環境自体の削除は最初に作ったディレクトリを消すだけです。

rm -rf ~/.venv/test

今回環境は~/.venvディレクトリの下に作りましたが、ココは私が好みで使ってるというだけなので、どこでも大丈夫です。ここまででvenvの使い方や雰囲気が分かったと思います。

vscodeで作業する

まずはターミナルからフォルダを作成します。

mkdir -p ~/python/sample

ようやくvscodeを使います。 vscodeの[フォルダを開く]ボタンを押して作ったフォルダを開きます。すると…

左側のペインにSAMPLEと書かれてる部分が現れました。同じ行の右側に並んでいるアイコン群の一番左に[新しいファイル]ボタンがあるので押して、sample.pyと入れます。

作成したファイルが開かれて、右下にPython用の拡張機能が推奨されてます。渡りに船なので[Install]です。

次はpylintのインストールを促されますが、まだpipが使えないので、ここでターミナルから環境を作っておきます。

python3 -m venv ~/python/sample/venv

すると…

賢いことにvscodeが環境を検出してコレ使うか?って聞いてくれています。当然[Yes]です。
環境も選択できたので、ついでにさっき聞かれていたpylintも[Install]しちゃいます。すると、画面下側にターミナルが出てきて、venv環境がactivateされた状態でbashが立ち上がり、自動でpylintがインストールされてます。到れり尽くせりですね。

では、このターミナルからrequestsパッケージをインストールしちゃいます。

(venv) user@ubuntu1804:~/python/sample$ pip install requests
Collecting requests
  Downloading https://files.pythonhosted.org/packages/51/bd/23c926cd341ea6b7dd0b2a00aba99ae0f828be89d72b2190f27c11d4b7fb/requests-2.22.0-py2.py3-none-any.whl (57kB)
    100% |████████████████████████████████| 61kB 5.2MB/s 
Collecting chardet<3.1.0,>=3.0.2 (from requests)
  Downloading https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl (133kB)
    100% |████████████████████████████████| 143kB 3.8MB/s 
Collecting urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 (from requests)
  Downloading https://files.pythonhosted.org/packages/e8/74/6e4f91745020f967d09332bb2b8b9b10090957334692eb88ea4afe91b77f/urllib3-1.25.8-py2.py3-none-any.whl (125kB)
    100% |████████████████████████████████| 133kB 3.3MB/s 
Collecting idna<2.9,>=2.5 (from requests)
  Downloading https://files.pythonhosted.org/packages/14/2c/cd551d81dbe15200be1cf41cd03869a46fe7226e7450af7a6545bfc474c9/idna-2.8-py2.py3-none-any.whl (58kB)
    100% |████████████████████████████████| 61kB 5.5MB/s 
Collecting certifi>=2017.4.17 (from requests)
  Downloading https://files.pythonhosted.org/packages/b9/63/df50cac98ea0d5b006c55a399c3bf1db9da7b5a24de7890bc9cfd5dd9e99/certifi-2019.11.28-py2.py3-none-any.whl (156kB)
    100% |████████████████████████████████| 163kB 4.2MB/s 
Installing collected packages: chardet, urllib3, idna, certifi, requests
Successfully installed certifi-2019.11.28 chardet-3.0.4 idna-2.8 requests-2.22.0 urllib3-1.25.8
(venv) user@ubuntu1804:~/python/sample$ 

画面的には↓な感じです。

さて、これで必要な環境が整ったので、コードを書いてみます。

import requests
print(requests.get('https://www.google.co.jp/').text)

Google日本のトップページを取得して、標準出力に書き出すスクリプトです。では、右上の実行ボタンを押して実行しちゃいます。

サクっと実行出来ました。次はデバッグしてみます。左側のアイコンの上から4つ目の虫っぽいのをクリックします。

ソースコード2行目の左側で左クリックし、2行目にブレークポイントを張っておきます。

2行目に赤丸を確認してから、[Pythonでデバッグする]を押します。

すると…

プログラムが動いてから2行目実行直前で止まりました。左側には変数も表示されており、デバッグが出来ることが分かります。
上にある右向き三角ボタンを押して、実行を再開します。

プログラムが終了し、元の状態に戻りました。

まとめ

Ubuntu18.04上にvscodeをインストールし、venvで用意したpythonの実行環境を使い、vscode上でGoogleのトップ画面を取得するプログラム(sample.py)を作成し、実行・デバッグしてみました。

次回(↓)は、この環境でdjangoに挑戦します(?)。

未分類

前書き

前回はWindows上のVirtualBoxで入れたUbuntuにPostgreSQLをインストールし、簡単なテーブルを作成・表示させてみました。

今回はそのテーブルをWindowsから見てみようという記事です。

Ubuntu側の設定

PostgreSQLの設定

前回はUbuntu上のpsqlコマンドから同じマシン上のPostgreSQLサーバーに接続してSQLを叩いていました。現在のPostgreSQLの設定はこのタイプの接続しか許可していません。別のマシン上のアクセスを許可する設定をしていきます。

この設定は設定ファイルに書かれているので、ターミナル/sshで接続したコマンドプロンプトから、viコマンドを使ってファイルを編集する必要があります。ただ、viはとても癖のあるエディタで機能も少ないので、それを改良したvimを先にインストールします。操作感は同じですが、ハイライトされるなどの機能が違います。

$ sudo apt install -y vim

インストールが終わると、同じviコマンドでも、動きが変わってきます。ではまず、/etc/postgresql/10/main/pg_hba.confを編集して、別のマシンからの接続設定を追加します。

$ sudo vi /etc/postgresql/10/main/pg_hba.conf

viの操作方法(最小限)

キー操作意味
上に移動
下に移動
左に移動
右に移動
i入力モードに入り、以降[ESC]で戻るまで打ち込んだ文字を挿入します。
xカーソル位置の文字を削除します。
dd1行削除します。
[ESC]入力モードから戻ります。
ZZファイルを保存して終了します。
:q!ファイルを保存しないで終了します。

上を参考にどうにかして、ファイル末尾付近に移動して「ココ追加」の1行を追加してみてください。vimでググるとよりいろいろな操作方法を知る事ができますが、覚えることが多いので今は最小限でいいです。

# database superuser can access the database using some other method.
# Noninteractive access to all databases is required during automatic
# maintenance (custom daily cronjobs, replication, and similar tasks).
#
# Database administrative login by Unix domain socket
local   all             postgres                                peer

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# ↓ココ追加
host    all             all             10.0.2.2/32             md5
# ↑ココ追加
# IPv6 local connections:
host    all             all             ::1/128                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            md5
host    replication     all             ::1/128                 md5
"/etc/postgresql/10/main/pg_hba.conf" 102L, 4790C             90,10        末尾

追加したのは、「(ホストから転送されてきた)ホスト自身からの接続の場合、パスワードで認証する」という設定です。10.0.2.2はVirtualBoxがホストに割り当てている仮想ネットワーク上のアドレスです。編集しているpg_hba.confファイルのフォーマットについての詳細は、

20.1. pg_hba.confファイル (PostgreSQLのマニュアル)

を御覧ください。よく分からないと思いますが、丁寧に説明しているとそれぞれ1つの記事になってしまうので、今回は割愛します。

参考: VirtualBoxのネットワークについて

参考: pg_hba.confファイルの認証設定

次にpostgresql.confを編集し、TCP/IPで待ち受ける(listenする)IPアドレスを追加します(デフォルトではTCP/IPで待ち受けていない=IPアドレスでの接続を待ち受けていない)。

$ sudo vi /etc/postgresql/10/main/postgresql.conf

ここでも「ココ追加」と書かれている1行を、どうにかして追加してください。

# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------

# - Connection Settings -

#listen_addresses = 'localhost'         # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all
# ↓ここ追加
listen_addresses = '*'                  # what IP address(es) to listen on;
# ↑ここ追加
                                        # (change requires restart)
port = 5432                             # (change requires restart)
max_connections = 100                   # (change requires restart)
#superuser_reserved_connections = 3     # (change requires restart)
unix_socket_directories = '/var/run/postgresql' # comma-separated list of directories
                                        # (change requires restart)
#unix_socket_group = ''                 # (change requires restart)
#unix_socket_permissions = 0777         # begin with 0 to use octal notation
                                        # (change requires restart)
#bonjour = off                          # advertise server via Bonjour
<c/postgresql/10/main/postgresql.conf" 664L, 23154C           64,15-10       8%

完了すると、Ubuntuが持っているネットワークI/F全てで、ポート5432の接続待ちをする設定が追加されます。後はPostgreSQLサービスを再起動して新しい設定を読み込ませるだけです。

$ sudo service postgresql restart

VirtualBoxの設定

sshのときと同様にポートフォワードの設定が必要です。Ubuntuを動かしているVirtualBox上のメニューから、[デバイス]>[ネットワーク]>[ネットワーク設定]を開きます。

[高度]>[ポートフォワーディング]を押します。

上記のようにゲストIPを10.0.2.15でホスト/ゲストポートを5432に設定し、名前を適当につけて[OK]を押します。

すると、ホスト側の5432ポートに来た接続は、ゲスト側のIP10.0.2.15のポート5432に転送されます。この設定がない場合、ファイヤーウォール(NAT)に弾かれて、ホストからゲストにPostgreSQLの標準通信ができません。

Windows側の設定

PostgreSQLクライアントを導入

PostgreSQLクライアントの選定

PostgreSQLの無料クライアントはいくつか種類があります。

最も軽いのはUbuntuで使用したpsql(サーバー同梱)です。これはバッチ実行などをする際にはよく使いますが、コマンドから直に何かしたいとき以外はあまり使いません。

PostgreSQL専用のGUIクライアント兼管理ツールpgadminがあります。これも管理をする際には使いやすいツールです。

今回は、他のDBでも汎用に使用できるGUIのSQLエディタである、DBeaverをご紹介します。これは元々主にJava開発のIDEとして使用されるeclipseのプラグインとして実装されたものです。日本ではこのような種類ではA-5が有名ですが、世界的には現在このDBeaverが無料汎用SQLエディタでNo.1です。

DBeaverのインストール方法

DBeaverのインストールにはいくつか方法があります。

  1. インストーラを使用する
  2. zipを展開してjdkの設定を自分でする
  3. chocolateyを使用してインストールする

今回はchocolateyを使用して、インストールしますが、いずれの方法でも構いません。

Chocolateyとは

以下のリンク先のソフトです。

Chocolatey Software | Chocolatey – The package manager for Windows

Windows用のコマンドラインベースのパッケージ管理ツールに該当します。Ubuntuのaptのような使い勝手のツールです。便利なので、私も可能なときはchocolateyでアプリをインストールしています。便利な点はいくつかありますが、

  • まとめてソフトのアップデートを出来ること
  • インストールしたアプリの一覧をエクスポートし、他のPCにもまとめてインストールすることが出来ること
  • 共通の依存パッケージを複数入れなくて良くなったりすること

くらいでしょうか…

逆にイケてない点は

  • アプリ独自で更新機能を持っているソフトはどっちでアップデートする迷う(DBeaverもそうですが)
  • ユーザーの少ないパッケージは作りが適当で、うまくインストール/アンインストールできない場合がある

辺りです。

Chocolateyのインストール

インストール方法はあらゆるケースを網羅した資料が英語だけど↓にあります。

Chocolatey Software | Installation

私は以下の手順でインストールしています。

  1. Windowsキーを押す
  2. cmdと打ち込んでCtrl+Shift+[Enter]
  3. ユーザーアカウント制御(UAC)の問い合わせに[OK]
  4. 立ち上がった管理者権限のコマンドプロンプトで以下を実行
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command " [System.Net.ServicePointManager]::SecurityProtocol = 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"

終わるとchocolateyが使えるようになります。コマンドラインが不得意な人は、続けてchoco install chocolateyguiでGUI版もインストールできます。

DBeaverのインストール

管理者権限のコマンドプロンプトから

cinst dbeaver -y

するだけでインストールは終了します。

Windowsから接続

DBeaverの起動

初回起動時に出てくるポップアップは全部キャンセルします。一度しか見れないメッセージだと間違えるかもしれないので。

左上の新しい接続ボタンを押します。

PostgreSQLのゾウさんを選択して[次へ]

DatabaseとUserとPasswordを記述して、[テスト接続]

まだドライバがないため、ダウンロードするか聞いてくれるので[ダウンロード]

ダウンロードが完了すると、正しく設定されていれば上のようなテスト接続成功画面が出てきます。
満足して[OK]→[終了]してください。

元の画面に戻ると、データベースナビゲータで選べるデータベースが追加されてます。開いてみてください。

ポチポチ押していくと、前回作成したデータベースやテーブルがグラフィカルに表示されてることが分かります。ここでexample_tableをダブルクリックすると…

何やら分かりやすく整理されてテーブルの定義が表示されています。上部中央のデータタブをクリックすると…

当然のようにExcel表のような画面が表示されています。SQLを覚えてpsqlでコマンド叩かなくてもExcelが使える人なら簡単な編集は出来てしまいます。もちろんSQLも便利に使えるソフトです。でも、これでデータベースも怖くなくなりそうじゃないですか?

まとめ

WindowsのVirtualBox上で動くUbuntuに入れたPostgreSQLサーバーを外部からTCP/IPで接続できるように設定し、WindowsからDBeaverを使ってアクセスできるようになった。

次回は、Ubuntu上でVisual Studio codeをインストールし、pythonの開発環境を整えたいと思います(↓)。

未分類

前回まではVirtualBox上のUbuntu18.04にsshサーバーをインストールして、Windowsからsshで繋げられるところまで実施しました。

今回はUbuntu18.04にHerokuでよく使用されるPostgreSQLをインストールして、SQLなDatabaseを使えるようにします。

インストールの前に

Dockerじゃダメなの?

最近の環境構築では、こういうケースで、便利なのでDockerを使うことも多いです。ただし、それはUbuntuやLinuxに慣れてれば、の話なので、今回はまずは基本のローカルインストールを実施します。

Databaseとはどんなもの?

みんなが使用する大規模データを入れておくサーバーです。ファイルサーバーよりもより細かく、大量のデータを検索したり集計したりできます。検索したり集計したりするのに、データの持ち方や、検索・集計に使用するI/Fや言語などの区別により、いろいろな種類のデータベースがあります。

今回インストールするPostgreSQLは古式ゆかしいSQLを使用するRDBMSという分類のデータベースです。Excelのお化けみたいなタイプで、OracleやMySQLなどと同様古くからある、最もオーソドックスなタイプのデータベースになります。

インストール

$ sudo apt install postgresql

いつもどおり、パスワードを入力して、容量確認して"y"でOKです。2020年2月4日現在PostgreSQLの最新バージョンは12ですが、ここでインストールされるバージョンは10になります。これはUbuntu18.04が約2年前のOSであることが原因です。最新バージョンを入れる方法もありますが、そこまで凝ったこともしないので、今回はバージョン10のまま使います。

初期設定など

素のPostgreSQLはpostgresという管理ユーザーが一人だけいるパスワード設定のない管理用のデータしか入っていないデータベースになっています。

管理ユーザーで接続

まずはsudoで PostgreSQLの管理ユーザー postgres になります。

user@ubuntu1804:~$ sudo -i -u postgres bash --login
[sudo] user のパスワード: 
postgres@ubuntu1804:~$ 

PostgreSQLに接続します。ここではPostgreSQLサーバーに同梱されているpsqlコマンドを使います。

postgres@ubuntu1804:~$ psql
psql (10.10 (Ubuntu 10.10-0ubuntu0.18.04.1))
Type "help" for help.

postgres=# 

この状態でPostgreSQLに接続しています。例えば現在操作しようとしているデータベースの状態を調べるには…

postgres-# \conninfo
You are connected to database "postgres" as user "postgres" via socket in "/var/run/postgresql" at port "5432".
postgres-# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | 
 template0 | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(3 rows)

postgres-# 

psqlコマンドの内部コマンドである、\coninfoで、現在接続しているデータベースを調べています。"postgres"という名前のデータベースに接続しています。ややこしいのですが、PostgreSQLに限らずデーターベースサーバー内には通常複数のデータベースが格納されていて、それぞれに名前がついています。この"postgres"という名前のデータベースは、管理用のデータが入っているデータベースです。

その次に実行している\l内部コマンドが、現在接続しているPostgreSQLサーバー内のデータベース一覧です。全て管理用のデータベースなので、普通のデータは格納しませんし、これらのデータベースは基本的に直接いじりません。

管理ユーザーのパスワード設定

まずはpostgresユーザーのパスワードを設定します。 (パスワード)部分にはご自分の覚えやすいパスワードを設定してください。

postgres-# alter user postgres with password '(パスワード)'
postgres-# 

一般ユーザーとデータベース作成

このままPostgreSQL内のユーザー追加と、データベース追加を行います。
(ユーザー)(パスワード)(ユーザーデータベース名)には自分で名前を入れてください(ユーザー名はUbuntuのユーザー名と一致させてください)。ここではそれぞれuser, password, userdbで実施しています。

postgres=# create user "(ユーザー)" password '(パスワード)';
CREATE ROLE
postgres=# create database "(ユーザーデータベース名)" owner "(ユーザー)";
CREATE DATABASE
postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | 
 template0 | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 userdb    | user     | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | 
(4 rows)

postgres=# 

psqlの内部コマンド\lで新しいデータベースuserdbが所有者userで作成されているのが分かります。

なお、今回設定されたパスワード、実は使用しません。ローカル接続のpeer認証を使っているからなのですが、ネットワーク経由で接続する場合に初めて必要になるのですが、今回はネットワーク経由で使用しないということです(SSLクライアント認証などを使用する場合はネットワーク経由でも使いませんけども…)。

これで一旦管理ユーザーでの作業が終わるので、抜けます。psqlからは\qで、sudo bashからはexitで抜けます。

postgres=# \q
postgres@ubuntu1804:~$ exit
ログアウト
user@ubuntu1804:~$ 

一般ユーザーで接続

改めてpsqlコマンドで繋ぎ直します。(ユーザーデータベース名)(ユーザー)には先程作成したものを使用してください。ここではそれぞれuserdb, userとしています。

user@ubuntu1804:~$ psql -d (ユーザーデータベース名) -U (ユーザー)
psql (10.10 (Ubuntu 10.10-0ubuntu0.18.04.1))
Type "help" for help.

userdb=>

テーブル作成とデータ追加

何もしないのも寂しいのでサンプル程度のデータを作成します。以下を貼り付けて実行してください。create tableでExcel表のようなテーブルを作成し、insertでデータをテーブルに挿入しています。英語圏の人なら何をしているかこれだけで分かるような文法です。

create table example_table (item_id varchar(14) primary key, item_name varchar(100), kakaku numeric(10,0));
insert into example_table values('4514603365511','アサヒ 十六茶 PET500ml',124);
insert into example_table values('4514603343519','アサヒ 十六茶 (LL)紙パックスリム250ml',80);
insert into example_table values('4514603377019','アサヒ 十六茶 PET2L',350);
insert into example_table values('4514603240719','アサヒ 十六茶 PET275ml',115);
insert into example_table values('4514603377217','アサヒ 十六茶 PET630ml',140);
insert into example_table values('4514603240818','アサヒ 十六茶 ボトル缶275g',115);
insert into example_table values('4514603241112','アサヒ 十六茶 缶245g',86);
insert into example_table values('4514603386110','アサヒ 十六茶ほうじ茶 PET630ml',140);
commit;

実行するとexample_tableが作成されて、中にアサヒ飲料様の尊いお茶のデータが数件作成されます。元データは↓のホームページからお借りしました。

JANコード一覧|商品情報|アサヒ飲料

では作成したテーブルのデータをselectで見てみましょう。

userdb=> select * from example_table;
    item_id    |               item_name               | kakaku 
---------------+---------------------------------------+--------
 4514603365511 | アサヒ 十六茶 PET500ml                |    124
 4514603343519 | アサヒ 十六茶 (LL)紙パックスリム250ml |     80
 4514603377019 | アサヒ 十六茶 PET2L                   |    350
 4514603240719 | アサヒ 十六茶 PET275ml                |    115
 4514603377217 | アサヒ 十六茶 PET630ml                |    140
 4514603240818 | アサヒ 十六茶 ボトル缶275g            |    115
 4514603241112 | アサヒ 十六茶 缶245g                  |     86
 4514603386110 | アサヒ 十六茶ほうじ茶 PET630ml        |    140
(8 rows)

userdb=>

それっぽいデータが表示されました。十六茶、皆さんも大好きですよね。

まとめ

WindowsのVirtualBox上にインストールしたUbuntu18.04にPostgreSQLをインストールし、簡単なテーブルを作成、表示してみました。

次回はもう一発PostgreSQLをやります。ホスト側から、DBeaverというSQLエディタを使って操作してみます。