Djangoのモデル作成

Djangoでモデルを作成する方法の備忘録。

前回の投稿の続き

アプリの作成

$ python manage.py startapp api

mysite/settings.py

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'api', # 追記
]

モデルの作成

api/models.py

# 以下を追記
class Table(models.Model):
name = models.CharField(max_length=128, default="")

def __str__(self):
return self.name

api/admin.py

# 以下を追記
from .models import Table

# Register your models here.
@admin.register(Table)
class Table(admin.ModelAdmin):
pass

データベースファイルの作成

$ python manage.py makemigrations
$ python manage.py migrate

実行と確認

$ python manage.py runserver 0.0.0.0:8000

ブラウザから「http://127.0.0.1:8000/admin/」にアクセスすると管理画面が表示され、そこに今作成したモデル「Table」が表示されます。

Djangoのdjango.contrib.authを使ってAdminLTEのログイン画面にてユーザ認証

本稿はサーバサイドDjangoとクライアントサイドAdminLTEという環境でログイン画面から初期画面を表示するための設定方法を記載しています。
ログアウト機能も実装しています。
基本的に最低限の設定で済むよう、Djangoが提供している機能を最大限活用しているつもりです。
Djangoはインストール済み、AdminLTEはダウンロード済み(/path/to/AdminLTE)であることを前提としています。

バージョン

  • OS: CentOS 7.3
  • Python: 3.5.1
  • Django: 1.10.4
  • AdminLTE: 2.3.7

Djangoプロジェクト作成

$ django-admin startproject mysite

$ cd mysite/

Djangoプロジェクトファイルの編集

mysite/settings.py

ALLOWED_HOSTS = ['127.0.0.1',] # 変更
# ...(中略)...
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates'),], # 変更
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
# ...(中略)...
# 以下を追記
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]

LOGIN_URL = '/login/'
LOGIN_REDIRECT_URL = '/'

mysite/views.py

# 以下を作成
from django.shortcuts import render
from django.http import HttpResponse
from django.conf import settings
from django.contrib.auth.decorators import login_required

@login_required
def index(request):
return render(request, 'index.html')

mysite/urls.py

from django.conf.urls import url
from django.contrib import admin
from . import views # 追記
from django.contrib.auth import views as auth_views # 追記

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', views.index, name='index'), # 追記
url(r'^login/', auth_views.login, { 'template_name': 'login.html' }, name='login'), # 追記
url(r'^logout/', auth_views.logout_then_login, name='logout'), # 追記
]

adminユーザ作成

$ python manage.py createsuperuser
Username (leave blank to use 'username'): admin
Email address:
Password:
Password (again):
Superuser created successfully.

AdminLTEのファイル配置

$ mkdir templates
$ mkdir static
$ cp /path/to/AdminLTE/pages/examples/login.html templates/
$ cp /path/to/AdminLTE/pages/examples/blank.html templates/index.html
$ cp /path/to/AdminLTE/dist static/
$ cp /path/to/AdminLTE/bootstrap static/
$ cp /path/to/AdminLTE/plugins static/

HTMLファイルの編集

template/login.html

{% load static %} <!-- 追記 -->
<!DOCTYPE html>

<!-- 以下、変更箇所 -->
<!-- Bootstrap 3.3.6 -->
<link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
<!-- Theme style -->
<link rel="stylesheet" href="{% static 'dist/css/AdminLTE.min.css' %}">
<!-- iCheck -->
<link rel="stylesheet" href="{% static 'plugins/iCheck/square/blue.css' %}">

<div class="login-box-body">
{% if form.errors %} <!-- 追記 -->
<p class="login-box-msg bg-red">Your username and password didn't match. Please try again.</p> <!-- 追記 -->
{% else %} <!-- 追記 -->
<p class="login-box-msg">Sign in to start your session</p>
{% endif %} <!-- 追記 -->

<form action="{% url 'login' %}" method="post">
{% csrf_token %} <!-- 追記 -->
<input type="text" class="form-control" name="username" placeholder="Username">
<input type="password" class="form-control" name="password" placeholder="Password">

<!-- jQuery 2.2.3 -->
<script src="{% static 'plugins/jQuery/jquery-2.2.3.min.js' %}"></script>
<!-- Bootstrap 3.3.6 -->
<script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script>
<!-- iCheck -->
<script src="{% static 'plugins/iCheck/icheck.min.js' %}"></script>

template/index.html

{% load static %} <!-- 追記 -->
<!DOCTYPE html>

<!-- 以下、変更箇所 -->
<!-- Bootstrap 3.3.6 -->
<link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
<!-- Theme style -->
<link rel="stylesheet" href="{% static 'dist/css/AdminLTE.min.css' %}">
<!-- AdminLTE Skins. Choose a skin from the css/skins
folder instead of downloading all of them to reduce the load. -->
<link rel="stylesheet" href="{% static 'dist/css/skins/_all-skins.min.css' %}">

<img src="{% static 'dist/img/user2-160x160.jpg' %}" class="img-circle" alt="User Image">
<img src="{% static 'dist/img/user2-160x160.jpg' %}" class="user-image" alt="User Image">
<img src="{% static 'dist/img/user2-160x160.jpg' %}" class="img-circle" alt="User Image">

<a href="{% url 'logout' %}" class="btn btn-default btn-flat">Sign out</a>

<img src="{% static 'dist/img/user2-160x160.jpg' %}" class="img-circle" alt="User Image">

<!-- jQuery 2.2.3 -->
<script src="{% static 'plugins/jQuery/jquery-2.2.3.min.js' %}"></script>
<!-- Bootstrap 3.3.6 -->
<script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script>
<!-- SlimScroll -->
<script src="{% static 'plugins/slimScroll/jquery.slimscroll.min.js' %}"></script>
<!-- FastClick -->
<script src="{% static 'plugins/fastclick/fastclick.js' %}"></script>
<!-- AdminLTE App -->
<script src="{% static 'dist/js/app.min.js' %}"></script>

ファイル構成

mysite/
| mysite/
| | __pycache__/
| | __init__.py
| | settings.py
| | urls.py
| | views.py
| | wsgi.py
| static/
| | bootstrap/
| | dist/
| | plugins/
| templates/
| | index.html
| | login.html
| manage.py
| db.sqlite3

実行と確認

$ python manage.py runserver 0.0.0.0:8000

ブラウザから「http://127.0.0.1:8000」にアクセスするとログイン画面が出てきます。
ユーザ名「admin」と設定したパスワードを入力すると初期画面が出てきます。
初期画面から「Sign out」をクリックするとログアウトしてログイン画面に戻ります。

Djangoでサンプルページ作成

環境

  • ホスト
    • OS: Windows 10
    • 仮想化ソフト: Vagrant (VirtualBoxを使用)
  • ゲスト
    • OS: CentOS 7.1
    • IPアドレス(プライベートネットワーク): 192.168.33.10
  • 使用するソフトウェアのバージョン(本稿でインストール方法を記載しています)
    • Python: 3.5.1
    • Django: 1.10.4

Python3インストール

こちらのサイトを参考にさせていただきました。

$ sudo yum install -y gcc zlib-devel bzip2 bzip2-devel readline readline-devel sqlite sqlite-devel openssl openssl-devel git

$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv

$ vi ~/.bash_profile
# 以下を追加
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

$ source .bash_profile

$ pyenv install 3.5.1

$ python --version
Python 2.7.5

$ pyenv versions
* system (set by /home/vagrant/.pyenv/version)
3.5.1

$ pyenv global 3.5.1

$ pyenv rehash

$ python --version
Python 3.5.1

$ pyenv versions
system
* 3.5.1 (set by /home/vagrant/.pyenv/version)

Djangoをインストール

$ sudo yum install -y python-pip

$ pip install django

初期ページ表示

$ django-admin startproject mysite

$ cd mysite/

$ vi mysite/settings.py
ALLOWED_HOSTS = ['192.168.33.10',] # 変更

$ python manage.py runserver 0.0.0.0:8000

ブラウザから「192.168.33.10:8000」にアクセスすると下の画像のようなページが表示されます。
initial-page

サンプルページ作成(HTML, CSS, Javascript使用)

$ vi mysite/urls.py
from django.conf.urls import url
from django.contrib import admin
from . import views # 追記

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', views.index, name='index'), # 追記
]

$ vi mysite/views.py
# 以下を作成
from django.shortcuts import render
from django.http import HttpResponse

def index(request):
return render(request, 'index.html')

$ vi mysite/settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates'),], # 変更
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]

# 以下を追記
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]

$ mkdir templates

$ mkdir static

$ mkdir static/css

$ mkdir static/js

$ vi templates/index.html
# 以下を作成
{% load static %}
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Django test page</title>
<link rel="stylesheet" href="{% static 'css/style.css' %}">
<script type="text/javascript" src="{% static 'js/sample.js' %}"></script>
</head>
<body>
<h1 id="title">Django test page</h1>
<button type="button" id="button">Click here</button>
</body>
</html>

$ vi static/css/style.css
# 以下を作成
@charset "UTF-8";

body {
text-align: center;
}

$ vi static/js/sample.js
# 以下を作成
window.addEventListener('load',
function (event) {
document.getElementById('button').addEventListener('click',
function() {
alert('Hello');
}
, false);
}
, false);

$ python manage.py runserver 0.0.0.0:8000

再度、ブラウザから「192.168.33.10:8000」にアクセスすると下の画像のようなページが表示されます。
django-test-page

Junos(SRX)に公開鍵認証でSSHログインする

Juniperのネットワーク機器用OSであるJunos OSにSSHする際に、公開鍵認証でログインする方法です。
以下の方法はSRX210で試していますが、他のJunosでも同様のはずです。

前提

パスワード認証でログインできる環境を想定します。

.sshディレクトリを作成

まずはパスワード認証でJunosにログイン

$ ssh (ユーザ名)@(IPアドレス)
Password:(パスワードを入力)

シェルコマンドモードになって.sshディレクトリを作成

$ start shell
% cd
% mkdir .ssh

scpで公開鍵をコピー

ログイン元端末でscpコマンドを実行

$ scp ~/.ssh/id_rsa.pub (ユーザ名)@(IPアドレス):~/.ssh/authorized_keys
Password:(パスワードを入力)

※OSのクリップボードを使ったコピペができる場合は以下の方法でもOK

Junosで.sshディレクトリを作成した後

% cd ~/.ssh
% vi authorized_keys
公開鍵(ログイン元端末の~/.ssh/id_rsa.pub)を貼り付け

これで公開鍵認証でログインできるようになりました。

ZBOX OI520にCentOS6をインストール

今流行りの小型PCですが、OSとしてLinuxを使うとなるといくらか障壁があるように感じます。
そこで今回ZATOC社の小型ベアボーンPCにCentOS6.8をインストールしたので、その結果をここに報告します。
筐体はZBOX OI520という形状が球体という面白いマシンで、意外とインターフェイスも充実しているというなかなかイケてるやつです。
インストール方法はインストールディスクをUSB接続のDVDドライブから読み込ませ、通常のタワーマシンなんかにインストールする方法と全く同じようにインストールすることができました。
現在自宅サーバマシンとして常時起動させていますが、特に問題なく動き続けています。

今後はハイパーバイザが入るか試してみたいです。

CentOS 6.7にRoundcube Webmail 1.1.4をインストール

CentOS 6.7にRoundcube Webmail 1.1.4をインストールする方法です。
既にメールサーバを構築している環境を想定します。
Roundcube Webmailはyumを使ってインストールできます。

# yum install roundcubemail

次にデータベースを作成してデータベースの初期設定を行います。

# mysql -u root -p
# create database roundcubemail default character set utf8;
# grant all privileges on roundcubemail.* to roundcubemail@localhost identified by 'password';
# flush privileges;
# exit
# mysql -u root -p roundcubemail < /usr/share/roundcubemail/SQL/mysql.initial.sql

次に設定ファイル(defaults.inc.php)を編集します。
この後で見るように今のRoundcubeはブラウザからのインストール設定ができるため、この設定ファイルを直接編集しなくても設定ができるようになっています。
しかしブラウザからでは編集できない項目がいくつかあり、結局はこの設定ファイルを編集する必要があるので、今回はまとめてこのファイルで設定する方針でいきます。

# vim /etc/roundcubemail/defaults.inc.php
$config['db_dsnw'] = 'mysql://roundcubemail:(password)@localhost/roundcubemail';
$config['default_host'] = 'ssl://www.tetsis.com';
$config['default_port'] = 993;
$config['smtp_server'] = 'ssl://www.tetsis.com';
$config['smtp_port'] = 465;
$config['smtp_user'] = '%u';
$config['smtp_pass'] = '%p';
$config['product_name'] = 'tetsis.com webmail';
$config['force_https'] = true;
$config['mail_domain'] = 'tetsis.com';
$config['default_charset'] = 'ISO-2022-JP';

次にブラウザを使ってインストール作業を行いますが、デフォルトでは外部のIPアドレスからの通信は遮断されています。
そこで接続に必要なIPアドレスを登録します。
(メインページに関してはどのIPアドレスからもアクセスできるようにしています)

# vim /etc/httpd/conf.d/roundcubemail.conf
<Directory /usr/share/roundcubemail/>
<IfModule mod_authz_core.c>
# Apache 2.4
Require local
</IfModule>
<IfModule !mod_authz_core.c>
# Apache 2.2
Order Deny,Allow
Allow from all
Allow from ::1
</IfModule>
</Directory>

<Directory /usr/share/roundcubemail/installer/>
<IfModule mod_authz_core.c>
# Apache 2.4
Require local
</IfModule>
<IfModule !mod_authz_core.c>
# Apache 2.2
Order Deny,Allow
Deny from all
Allow from 127.0.0.1 (インストールする端末のIPアドレス)
Allow from ::1
</IfModule>
</Directory>

Apacheを再起動します。

# service httpd restart

ブラウザで「https://(サーバのIPアドレス)/roundcubemail/installer/」にアクセスすると、以下のようなページが表示されます。

設定画面1
設定画面1

「OK」となっていることを確認します。
問題なければ一番下の「NEXT」をクリックします。

すると以下の画面が出てきます。
ここでいろいろな設定ができますが、今回は必要な設定はサーバ側で行っているのでここは変更せずに一番下の「CREATE CONFIG」をクリックします。

設定画面2-1
設定画面2-1

以下のような画面が出てくるので「Download」をクリックしてダウンロードしたファイルをサーバの「/etc/roundcubemail/config.inc.php」として保存します。
もしくは「<?php」から始まるテキストをコピーしてサーバの「/etc/roundcubemail/config.inc.php」ファイルにペーストします。
それが完了したら、「CONTINUE」をクリックします。

設定画面2-2
設定画面2-2

最後の設定画面です。「OK」となっているかを確認します。
必要であれば、「Test SMTP config」と「Test IMAP config」でテストします。

設定画面3
設定画面3

テストが完了したら「https://(サーバのIPアドレス)/roundcubemail/」にアクセスします。
すると以下のログイン画面が出てくるので後はユーザ名とパスワードを入力します。
これで、Roundcubeの使用が可能になります。

ログイン画面
ログイン画面

最後にインストール用ページのディレクトリを削除します。

# rm -rf /usr/share/roundcubemail/installer

C++で構造体型のvector変数をソートする方法

C++で構造体型の変数を使っている時、その変数の配列もしくはvectorをソートする方法を紹介します。
方法自体はいくつかあるみたいなのですが、今回は「演算子のオーバーロード」で実現したいと思います。
つまり、本来使用できない構造体の演算子(”>”や”<“)に意味を持たせて(オーバーロードして)使用できるようにします。
構造体の演算子をオーバーロードするには、operatorというメンバ関数を追加します。

struct Struct {
    int num1;
    int num2;

    bool operator<(const Struct& another) const {
        //メンバ変数であるnum1で比較した結果を
        //この構造体の比較とする
        return num1 < another.num1;
    }
};

こうすると、Struct型変数同士の比較ができるため、Struct型のままstd::sort関数に渡してソートすることができます。
(std::sort関数は、”<“のみを使ってソートしているため”<“のみの記述でソートが可能です。もし、”>”演算子を使う必要があるときは同様にoperator関数を追加してください。)

#include <iostream>
#include <vector> //for vector
#include <algorithm> //for sort

using namespace std;

struct Struct {
    int num1;
    int num2;

    Struct(int n1, int n2) {
        num1 = n1;
        num2 = n2;
    }

    bool operator<(const Struct& another) const {
        return num1 < another.num1;
    }
};

int main() {
    vector<Struct> vec;
    vec.push_back(Struct(10, 20));
    vec.push_back(Struct(5, 5));
    vec.push_back(Struct(15, 10));

    cout << "Before" << endl;
    for (int i = 0; i < vec.size(); i++) {
        cout << i << ": num1=" << vec[i].num1 << ", num2=" << vec[i].num2 << endl;
    }

    //ここでソートする
    sort(vec.begin(), vec.end());

    cout << "\nAfter" << endl;
    for (int i = 0; i < vec.size(); i++) {
        cout << i << ": num1=" << vec[i].num1 << ", num2=" << vec[i].num2 << endl;
    }

    return 0;
}

実行結果

Before
0: num1=10, num2=20
1: num1=5, num2=5
2: num1=15, num2=10

After
0: num1=5, num2=5
1: num1=10, num2=20
2: num1=15, num2=10

num1の値でソートされていることが分かります。

例2:クラスでも可能

構造体での演算子オーバーロードを紹介しましたが、クラスでも構造体と同じように演算子オーバーロードができます。
(当たり前。というか逆にクラスで演算子オーバーロードができるからC++の構造体では演算子オーバーロードができる、というのが正しい流れですね)

#include <iostream>
#include <vector> //for vector
#include <algorithm> //for sort

using namespace std;

class Class {
public:
    int num1;
    int num2;

    Class(int n1, int n2) {
        num1 = n1;
        num2 = n2;
    }

    bool operator<(const Class& another) const {
        return num1 < another.num1;
    }
};

int main() {
    vector<Class> vec;
    vec.push_back(Class(10, 20));
    vec.push_back(Class(5, 5));
    vec.push_back(Class(15, 10));

    cout << "Before" << endl;
    for (int i = 0; i < vec.size(); i++) {
        cout << i << ": num1=" << vec[i].num1 << ", num2=" << vec[i].num2 << endl;
    }

    //ここでソートする
    sort(vec.begin(), vec.end());

    cout << "\nAfter" << endl;
    for (int i = 0; i < vec.size(); i++) {
        cout << i << ": num1=" << vec[i].num1 << ", num2=" << vec[i].num2 << endl;
    }

    return 0;
}

実行結果は構造体の時と同じです。

補足

この方法は演算子の挙動を自分で変えてしまうものなので、同じプログラムを使い続けていると気づかない内に不具合を起こしてしまう、という可能性は残ってしまいます。
そのため、この方法は一時的な(または将来拡張しないことが前提の)プログラムに対する処置と割り切り、そうでない場合はpairやmapといった他のコンテナクラスを用いた設計に変える対策をとるほうが良いかもしれません。

C++でフォーマットが決まっているファイルからistringstreamを使ってデータを読み込む

C++でファイルを読み込む方法です。
今回は特にフォーマットが決まったファイルからistringstreamを使ってデータを取得する方法を紹介します。

まずistringstreamを使うと、リダイレクション記号(>>)で文字列から簡単に数値を取り出すことができます。
数値はスペースで区切られている必要があります。

double num1, num2, num3;
istringstream iss("1 2.5 3");
iss >> num1 >> num2 >> num3;
//num1=1, num2=2.5, num3=3 になる

これを応用して、ファイルからデータを読み込む時も、最初にgetline等でファイルから取得した文字列をistringstreamに代入し、最後に上で示したリダイレクション記号を使って数値を取り出します。

ifstream ifs("data.dat");
string str;
double num1, num2, num3;
while (getline(ifs, str)) {
    istringstream iss(str);
    iss >> num1 >> num2 >> num3;
    //data.datから読み込んだ1行が「1 2.5 3」とすると
    //num1=1, num2=2.5, num3=3 になる
}

ただし、この方法はフォーマットが決まっていることが前提なのでそれだけ注意してください。

今回の例では、読み込むファイル(data.dat)はカンマで区切られた3つの数字が1行に格納されていることを想定します。
カンマで区切られているので、今回紹介した方法を使えるようにするために、最初にカンマをスペースに置換します。
置換はstd::replaceで行います。

#include <iostream>
#include <string>
#include <fstream> //for ifstream
#include <sstream> //for istringstream
#include <algorithm> //for replace
 
using namespace std;
 
int main() {
    ifstream ifs("data.dat");
    string str;
    double num1, num2, num3;
 
    while (getline(ifs, str)) {
        replace(str.begin(), str.end(), ',', ' ');
 
        istringstream iss(str);
        iss >> num1 >> num2 >> num3;
        cout << "num1=" << num1 << ", num2=" << num2 << ", num3=" << num3<< endl;
    }
 
    return 0;
}

data.datの中身が以下のようだと

1,5,1.1
-1,3,3.4
2,4,-4.5
10,2,1.08

出力結果は以下のようになります。

num1=1, num2=5, num3=1.1
num1=-1, num2=3, num3=3.4
num1=2, num2=4, num3=-4.5
num1=10, num2=2, num3=1.08

整数でも小数でも負数でも想定通りに動きます。

FirefoxをVimのように操作するアドオン「Vimperator」

Firefoxのアドオン「Vimperator」を紹介します。
VimperatorはFirefoxをVimのように操作することができます。
導入は簡単でFirefoxの「メニュー」→「アドオン」でVimperatorと検索して、インストールするだけです。

ただ、初期設定のVimperatorは少々使いにくいのでVimperatorの設定ファイルである「vimperatorrc」を編集します。

vimperatorrcの作り方

ノーマルモード(Firefoxの左下に何も表示されていない状態)で

:mkv

と入力します。
そうするとホームディレクトリに「_vimperatorrc」(Windowsの場合)もしくは「.vimperatorrc」(Linux)というファイルが出来上がります。

vimperatorrcの編集

vimperatorrcをテキストエディタで開いて編集します。

おすすめの設定をいくつか載せておきます。

ヒントモードに出てくる数字を文字に変更

この時ホームポジションのキーのみで選択できるようにすると使いやすくなります。

set hintchars=lasdfghjk

ヒントモード時のハイライト

見やすければ何でもいいですが、私はこのように設定しています。

highlight Hint font-family: Arial; font-size: 20px; font-weight: bold; color: Cyan; text-shadow: 2px 2px 3px black, 2px -2px 3px black, -2px 2px 3px black, -2px -2px 3px black;
highlight HintElem color: gray; background-color: lightcyan;
highlight HintActive color: gray; background-color: Cyan;

スクロール幅の調整

Vimperatorの特徴はマウスを使わなくても指をホームポジションに置いたままスクロールできることです。
しかし初期設定では一回のタイプでスクロールする幅が少ないので増やしておきます。

map j 5&lt;C-e&gt;
map k 5&lt;C-y&gt;

vimperatorrcを編集したら、Firefoxを再起動するか
ノーマルモード(Firefoxの左下に何も表示されていない状態)で
Windowsの場合は

:source ~/_vimperatorrc

Linuxの場合は

:source ~/.vimperatorrc

と入力し、設定ファイルを再読み込みすることでvimperatorrcの設定が有効になります。

実際に使ってみよう

設定が終わったらノーマルモードで

:help

と入力してヘルプを開きましょう。
いろいろな便利コマンドがあるので、少しずつ覚えてVimperatorマスターを目指しましょう。

注:最近のWebページはマウス操作が前提のものがあります。そういった場合はおとなしくマウスを使いましょう。

台湾のU-bikeをクレジットカードで乗る方法

台湾の台北に行ったときにU-bike(YouBikeともいう)を使うことがありました。
U-bikeというのは格安で自転車をレンタルできるU-bikeというレンタル自転車システムです。
U-bikeは悠遊カード(日本でいうsuicaみたいなもの)で利用できるため便利で安いのですが、その場合台湾のキャリアで使える電話番号による登録が必要になります。
そこで、電話番号からの登録が難しい場合はクレジットカードが使えるようになっています。

今回はクレジットカードでU-bikeを利用する方法の記録を残しておきます。

まず、自転車置き場の近くにある機械のところに行きます。

U-bike01
私は中国語(台湾語)が分からないので英語にしました。
左下の「English」を押します。

U-bike02
上から2つ目の「SINGLE RENTAL」を押します。

U-bike03
値段の説明とかがあります。
読んだら「Confirm」を押します。

U-bike04
今回はクレジットカードを使うので右側の「Next Page (Single rental)」を押します。

U-bike05
こちらも目を通したら、「I have read …」のチェックボックスを押し、「Confirm」を押します。

U-bike06
「Credit Card」を押します。
ちなみにVISAとMasterCardとJCBが使えるみたいです。

U-bike07
クレジットカードの情報を入力します。
入力が終わったら「Submit」を押します。

U-bike08
「Select Bike」を押します。

U-bike09

U-bike10
チュートリアルです。
借りる時と返す時の説明です。
借りる時は自転車を引き出すだけ、返す時は前輪の上についている金具を差し込むだけ、簡単です。
「I now understand …」のチェックボックスを押し、「Next」を押します。

U-bike11
次に利用する自転車を選びます。
どれを選んでも問題ないと思います。
今いる場所から近くにある自転車を選ぶと楽です。

U-bike12
選んだ自転車で良ければ「Confirm」を押します。

U-bike13
これが出ると自転車が使えるようになります。
90秒以内に自転車を引き出す必要があるのでそこだけ注意です。
あとは自由に台北の街中を走れます。