akiyoko blog

akiyoko の IT技術系ブログです

ゼロからはじめる Django で ECサイト構築(その2:Django Oscar の Sandbox サイト構築)

前回の記事「ゼロからはじめる Django で ECサイト構築(その1:ECパッケージの選定)」では、Django ベースの ECパッケージを選定し、「Django Oscar」が圧倒的人気で最有力候補であることが確認できました。


<過去記事>
akiyoko.hatenablog.jp


今回、「ゼロからはじめる Django で ECサイト構築」シリーズの第二回では、実際に、Django Oscar の Sandbox サイトを構築していくことにします。



f:id:akiyoko:20160531080056j:plain




 

Django Oscar について

概要

Django Oscar は、ECサイトを構築・運営するために必要な多くの機能が盛り込まれた、オープンソースで Django 製の ECパッケージです。ライセンスは修正BSDライセンス(New BSD license)で、商用利用も可能です。

github.com


機能の詳細については、次回以降にまとめていく予定です。


Sandbox とは

Sandbox とは、動作確認をするための開発者用のテスト環境のことを指します。
いわゆる「デモ環境」のことですね。

Django Oscar には、いろんな機能が組み込まれたデモサイトを簡単に立ち上げられるような仕組みが備わっていて、これを使うことで、Django Oscar の機能をお試しで検証することができます。




 

ECサイト構築に必要な三要素

さて、ECサイトを構築するためには、

  • 決済代行サービスのマーチャントアカウント
  • ECパッケージ
  • サーバ

の三つが必要最低限の要素として挙げられるでしょう。


まず一つ目の「決済代行サービスのマーチャントアカウント」は、PayPalWebPay などの決済代行サービスのビジネスアカウント(売り手アカウント)を指します。Sandbox 環境においては、Sandbox(ややこしいですが、決済代行サービス側が用意してくれるテスト環境を指します)用のマーチャントアカウントを使用することで、実際に支払いをすることなく決済処理の流れをシミュレートすることができます。


今回の検証では、決済代行サービスとして PayPal を利用するのですが、Sandbox については次のように説明されています。

ペイパルでは、決済サービスの動作確認ができるテスト環境として、Sandboxを公開しています。
テスト用の「Buyer(買い手)」アカウントと、「Seller(売り手)」アカウントを作成し、サービスの導入から、決済の流れまで、詳細にシミュレーションすることができます。


Sandbox | ペイパルビジネスガイド - PayPal


二つ目の ECパッケージについては、前回の選定で最有力候補となった「Django Oscar」を使用します。なお、決済モジュールには「django-oscar-paypal」を使用することとします。


三つ目のサーバについては、今回の Sandbox サイトでは仮想環境(Vagrant 上の Ubuntu 仮想マシン)を利用します。




 

Sandbox サイトの構築手順

ここから実際に、Django Oscar の Sandbox サイトを構築していきます(2016/5/28 バージョン)。


構築する環境は以下となります。

  • サーバ:Ubuntu 14.04TLS(on Vagrant)
  • Python 2.7.6
  • Django 1.9.6(現時点の最新バージョン)
  • ECパッケージ:Django Oscar 1.2+(現時点の最新バージョン)
  • 決済モジュール:django-oscar-paypal 0.9.7(現時点の最新バージョン)

 
以降、次のような手順で進めていきます。

 

1. サーバの初期設定

私は通常、PyCharm Professional Edition の

  • Vagrant 連携機能
  • サーバとのソースコード同期機能
  • リモートデバッグ機能

などの機能を利用するために、PyCharm を使っています。なので、いつもなら

  • PyCharm の設定
    • Pure Python Project を作成(空っぽのプロジェクトを作成)
    • Vagrant連携

という流れで、PyCharm から Ubuntu サーバを立ち上げています。


<過去記事>
akiyoko.hatenablog.jp


手動でやるなら、以下のコマンドを実行します。

$ cd ~/PycharmProjects/oscar_sandbox/
$ vagrant init ubuntu/trusty64

仮想マシンに固定 IPアドレスを付けるために、Vagrantfile を書き換えます。

  config.vm.network "private_network", ip: "192.168.33.105"

仮想マシンを起動します。

$ vagrant up


Vagrant サーバに ssh で乗り込みます。

$ ssh vagrant@192.168.33.105

 

1.1. 最低限のライブラリをインストール
$ sudo apt-get update
$ sudo apt-get -y install python-dev git tree

 

1.2. MySQL をインストール

Ubuntu サーバに MySQL をインストールします。

$ sudo apt-get -y install mysql-server
(root/rootpass)
$ sudo apt-get -y install mysql-client libmysqlclient-dev python-mysqldb

$ mysql --version
mysql  Ver 14.14 Distrib 5.5.49, for debian-linux-gnu (x86_64) using readline 6.3

$ sudo mysql_install_db

### 文字化け対策(セクションの最後に以下の設定を追加)
### http://blog.snowcait.info/2014/06/04/mariadb-utf8/
$ sudo vi /etc/mysql/my.cnf
---
[mysqld]
  ・
  ・
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem

# Character set settings
character-set-server = utf8

[mysqldump]
  ・
  ・
---

$ sudo service mysql restart

$ sudo mysql_secure_installation
Enter current password for root (enter for none):
Change the root password? [Y/n] n
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y


 

1.3. データベースを作成

データベース、データベースユーザを作成します。
なお、データベース名は Djangoプロジェクト名と合わせて myproject とします。

データベース名 myproject
データベースユーザ myprojectuser
データベースユーザパスワード myprojectuserpass
$ mysql -u root -p
mysql> create database myproject character set utf8;
mysql> create user myprojectuser@localhost identified by "myprojectuserpass";
mysql> grant all privileges on myproject.* to myprojectuser@localhost;
mysql> flush privileges;
mysql> exit


 

1.4. pip をインストール

Python 2.7.9 以降であれば pip がバンドルされているのですが、Ubuntu 14.04LTS では Python 2.7.6 が標準なので、手動でインストールします。

「sudo apt-get -y install python-pip」でインストールすると pip のバージョンが古いので、get-pip.py で最新版を入れることにします。

$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo -H python get-pip.py
$ pip --version
pip 8.1.2 from /usr/local/lib/python2.7/dist-packages (python 2.7)


参考


 

1.5. virtualenv, virtualenvwrapper をインストール
### virtualenv, virtualenvwrapper をインストール
$ sudo -H pip install virtualenv virtualenvwrapper

### virtualenvwrapper の設定
$ cat << EOF >> ~/.bash_profile

if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
EOF
$ cat << EOF >> ~/.bashrc

source /usr/local/bin/virtualenvwrapper.sh
export WORKON_HOME=~/.virtualenvs
EOF
$ source ~/.bashrc


 

2. Sandbox サイト(Django Oscar)の作成

2.1. Django Oscar プロジェクトを構築

Setting up the development environment — django-oscar 1.3 documentation
に従って、Oscar プロジェクトのインストールをします。

### Djangoプロジェクトの virtualenv 環境を設定して activate
$ mkvirtualenv myproject

### /opt/webapps 配下にプロジェクトの外箱を作成
$ sudo mkdir -p /opt/webapps/myproject
$ sudo chown -R `whoami`. /opt/webapps

### JPEG Support
### http://django-oscar.readthedocs.org/en/latest/internals/contributing/development-environment.html#jpeg-support
$ sudo apt-get -y install libjpeg-dev libfreetype6-dev zlib1g-dev
### make sandbox をした後であれば ↓ を実行して Pillow を再インストール
### pip install --no-cache-dir -I pillow
### http://qiita.com/tototoshi/items/7b74fe26eb7bf39be7b5

### MySQLライブラリのインストール
###($ pip install MySQL-python でも OK)
$ pip install mysqlclient

### Oscar プロジェクトを作成
$ cd /opt/webapps/myproject/

### 通常であれば、django-admin.py startproject . とするところを、今回は clone -> make sandbox として Sanbox サイトを作成
### http://django-oscar.readthedocs.org/en/latest/internals/getting_started.html
$ git clone https://github.com/django-oscar/django-oscar.git .


ここで、

###$ git checkout 1.2

として、最新の stable バージョン (1.2) に合わせようとしましたが、make sandbox 実行時に、

django.db.utils.OperationalError: (2013, 'Lost connection to MySQL server during query')

というエラーになってしまったので、master のままで試すことにしました(2016/5/28 時点)。


ちなみに、現時点の最新コミットは以下の通りです。

commit 156a4b814d540bb1c6216b757cfa4441b36f8077
Merge: e1a8ea7 de633f8
Author: Michael van Tellingen
Date: Wed Apr 13 09:03:37 2016 +0200

Merge pull request #2030 from crgwbr/fix_broken_py3_migrations

Fix makemigrations in Python 3

 

### MySQL用の設定変更
$ vi sites/sandbox/settings.py
<変更前>
---
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': location('db.sqlite'),
        'USER': '',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
        'ATOMIC_REQUESTS': True
    }
}
---
  ↓
<変更後>
---
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'myproject',
        'USER': 'myprojectuser',
        'PASSWORD': 'myprojectuserpass',
        'HOST': 'localhost',
        'PORT': '',
        'ATOMIC_REQUESTS': True
    }
}
---

### Sandbox プロジェクトを作成
### プロジェクトのディレクトリ構造は
### myproject/ (as <repository_root>)
### └─ sites/sandbox/ (as <django_project_root> also as <configuration_root>)
$ make sandbox


ちなみに、make sandbox の処理はこのようになっています。

Makefile(抜粋)

install:
    pip install -e . -r requirements.txt

build_sandbox:
    # Remove media
    -rm -rf sites/sandbox/public/media/images
    -rm -rf sites/sandbox/public/media/cache
    -rm -rf sites/sandbox/public/static
    -rm -f sites/sandbox/db.sqlite
    # Create database
    sites/sandbox/manage.py migrate
    # Import some fixtures. Order is important as JSON fixtures include primary keys
    sites/sandbox/manage.py loaddata sites/sandbox/fixtures/child_products.json
    sites/sandbox/manage.py oscar_import_catalogue sites/sandbox/fixtures/*.csv
    sites/sandbox/manage.py oscar_import_catalogue_images sites/sandbox/fixtures/images.tar.gz
    sites/sandbox/manage.py oscar_populate_countries
    sites/sandbox/manage.py loaddata sites/_fixtures/pages.json sites/_fixtures/auth.json sites/_fixtures/ranges.json sites/_fixtures/offers.json
    sites/sandbox/manage.py loaddata sites/sandbox/fixtures/orders.json
    sites/sandbox/manage.py clear_index --noinput
    sites/sandbox/manage.py update_index catalogue

sandbox: install build_sandbox

 
Sandbox の作成が完了したら、作成状況を確認してみます。

$ pip list | grep Django
Django (1.9.6)

$ pip list | grep django-oscar
django-oscar (1.3.dev0, /opt/webapps/myproject/src)

$ pip freeze
alabaster==0.7.8
apipkg==1.4
Babel==2.3.4
beautifulsoup4==4.4.1
coverage==3.7.1
coveralls==0.4.4
decorator==4.0.9
Django==1.9.6
django-debug-toolbar==1.4
django-extensions==1.6.1
django-extra-views==0.6.4
django-haystack==2.4.1
-e git+https://github.com/django-oscar/django-oscar.git@156a4b814d540bb1c6216b757cfa4441b36f8077#egg=django_oscar
django-tables2==1.0.7
django-treebeard==4.0.1
django-webtest==1.7.8
django-widget-tweaks==1.4.1
docopt==0.6.2
docutils==0.12
execnet==1.4.1
factory-boy==2.6.1
fake-factory==0.5.7
flake8==2.5.1
flake8-blind-except==0.1.0
flake8-debugger==1.4.0
funcsigs==1.0.2
ipaddress==1.0.16
ipdb==0.8.1
ipython==4.0.1
ipython-genutils==0.1.0
isort==4.2.2
Jinja2==2.8
MarkupSafe==0.23
mccabe==0.3.1
mock==1.3.0
mysqlclient==1.3.7
nose==1.3.7
pathlib2==2.1.0
pbr==1.10.0
pep8==1.7.0
pexpect==4.1.0
phonenumbers==7.4.1
pickleshare==0.7.2
Pillow==2.7.0
pockets==0.3
ptyprocess==0.5.1
purl==1.3
py==1.4.31
pycountry==1.8
pyflakes==1.0.0
Pygments==2.1.3
pyprof2calltree==1.3.2
pysolr==3.2.0
pytest==2.8.5
pytest-cache==1.0
pytest-cov==2.2.0
pytest-django==2.9.1
pytest-xdist==1.13.1
python-dateutil==2.5.3
pytz==2016.4
PyYAML==3.11
requests==2.7.0
simplegeneric==0.8.1
six==1.10.0
snowballstemmer==1.2.1
sorl-thumbnail==12.4a1
spec==0.11.1
Sphinx==1.3.3
sphinx-rtd-theme==0.1.9
sphinxcontrib-napoleon==0.4.3
sqlparse==0.1.19
tox==1.8.1
traitlets==4.2.1
Unidecode==0.4.19
uWSGI==2.0.12
virtualenv==15.0.1
waitress==0.9.0
WebOb==1.6.1
WebTest==2.0.17
Werkzeug==0.9.6
whitenoise==2.0.6
Whoosh==2.6.0
$ find . -name "*.pyc" -exec rm -rf {} \;
$ tree -a /opt/webapps/myproject/ -I ".git|docs|tests" -L 3
/opt/webapps/myproject/
├── AUTHORS
├── CHANGELOG.rst
├── CONTRIBUTING.rst
├── .coveragerc
├── Dockerfile
├── .dockerignore
├── .gitignore
├── gulpfile.js
│   ├── index.js
│   └── tasks
│       ├── default.js
│       ├── less.js
│       └── watch.js
├── LICENSE
├── lint.sh
├── .mailmap
├── Makefile
├── MANIFEST.in
├── package.json
├── README.rst
├── requirements_migrations.txt
├── requirements.txt
├── runtests.py
├── sandbox.yml
├── setup.cfg
├── setup.py
├── sites
│   ├── _fixtures
│   │   ├── auth.json
│   │   ├── comms.json
│   │   ├── offers.json
│   │   ├── order-events.json
│   │   ├── pages.json
│   │   ├── promotions.json
│   │   ├── range-products.csv
│   │   └── ranges.json
│   ├── README.rst
│   └── sandbox
│       ├── apps
│       ├── deploy
│       ├── fixtures
│       ├── __init__.py
│       ├── logs
│       ├── manage.py
│       ├── public
│       ├── README.rst
│       ├── settings_mysql.py
│       ├── settings_postgres.py
│       ├── settings.py
│       ├── settings_sphinx.py
│       ├── static
│       ├── templates
│       ├── test_migrations.sh
│       ├── update_latest.sh
│       ├── urls.py
│       ├── whoosh_index
│       └── wsgi.py
├── src
│   ├── django_oscar.egg-info
│   │   ├── dependency_links.txt
│   │   ├── PKG-INFO
│   │   ├── requires.txt
│   │   ├── SOURCES.txt
│   │   └── top_level.txt
│   └── oscar
│       ├── app.py
│       ├── apps
│       ├── core
│       ├── defaults.py
│       ├── forms
│       ├── __init__.py
│       ├── locale
│       ├── management
│       ├── models
│       ├── profiling
│       ├── static
│       ├── templates
│       ├── templatetags
│       ├── test
│       └── views
├── tox.ini
├── transifex.sh
├── .travis.yml
└── .tx
    └── config

29 directories, 56 files

ここで一旦、データベースをバックアップしておきます。

### http://weblabo.oscasierra.net/mysql-mysqldump-01/
### ちなみに、リストアするときは mysql -u root -p myproject < ~/myproject_init.dump
$ mysqldump --single-transaction -u root -p myproject > ~/myproject_init.dump


 

2.2. Runserver で起動
$ python sites/sandbox/manage.py runserver 0.0.0.0:8000

でサーバを起動して、
http://192.168.33.105:8000/
にブラウザからアクセスします。

f:id:akiyoko:20160529121316p:plain


ログインユーザ

username: superuser
email: superuser@example.com
password: testing

username: staff
email: staff@example.com
password: testing

f:id:akiyoko:20160529121332p:plain

f:id:akiyoko:20160529121348p:plain


疎通ができたら、Runserver を一旦停止します。


ちなみにここまでの設定では、決済モジュールの設定をしていないので、決済処理を完了することができなくなっています。

f:id:akiyoko:20160529122316p:plain

(住所や電話番号などのダミー情報は、US Address Generator - Fake Address, Random Address Generator で生成したものを入力しました。)
f:id:akiyoko:20160529122334p:plain

f:id:akiyoko:20160529122349p:plain

このように、決済モジュール(payment gateway libraries)を設定してね、って怒られます。



以下、PyCharm を使う場合のメモです。PyCharm を使ってない方はすっ飛ばしてください。

  • PyCharm の設定
    • デプロイ先サーバ設定
    • ソースコードの同期
    • ローカル側でソースコードを Git管理
    • Project Interpreter の設定
    • Run/Debug設定(以下に詳細を記載)


Project ペインの manage.py ファイルで右クリック > [Create "manage"] を選択します。

Name manage
Script sites/sandbox/manage.py
Script parameters runserver 0.0.0.0:8000
Environment variables PYTHONUNBUFFERED=1(デフォルトのまま)
Python interpreter Project Default (Remote Python 2.7.6 Vagrant VM at ~/PycharmProjects/oscar_sandbox (/home/vagrant/.virtualenvs/myproject/bin/python))
Working directory /opt/webapps/myproject
Path mappings - Local path /Users/akiyoko/PycharmProjects/oscar_sandbox
Path mappings - Remote path /opt/webapps/myproject


ここで、「Add content roots to PYTHONPATH」と「Add source roots to PYTHONPATH」のチェックを外します。

f:id:akiyoko:20160529125100p:plain

要するに、Script のパスに気をつけてね、ってことです。



各種設定を確認

Sandbox サイトの settings.py を確認すると、以下のドキュメントに書かれている、既存サイトに追加する場合に追加する必要のある設定が全て追加されています。
http://django-oscar.readthedocs.org/en/latest/internals/getting_started.html


sites/sandbox/settings.py(抜粋)

    ・
    ・
SITE_ID = 1
    ・
    ・
TEMPLATE_CONTEXT_PROCESSORS = (
    "django.contrib.auth.context_processors.auth",
    "django.core.context_processors.request",
    "django.core.context_processors.debug",
    "django.core.context_processors.i18n",
    "django.core.context_processors.media",
    "django.core.context_processors.static",
    "django.contrib.messages.context_processors.messages",
    # Oscar specific
    'oscar.apps.search.context_processors.search_form',
    'oscar.apps.promotions.context_processors.promotions',
    'oscar.apps.checkout.context_processors.checkout',
    'oscar.core.context_processors.metadata',
    'oscar.apps.customer.notifications.context_processors.notifications',
)

MIDDLEWARE_CLASSES = (
    'debug_toolbar.middleware.DebugToolbarMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
    # Allow languages to be selected
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    # Ensure a valid basket is added to the request instance for every request
    'oscar.apps.basket.middleware.BasketMiddleware',
    # Enable the ProfileMiddleware, then add ?cprofile to any
    # URL path to print out profile details
    #'oscar.profiling.middleware.ProfileMiddleware',
)
    ・
    ・
# Add another path to Oscar's templates.  This allows templates to be
# customised easily.
from oscar import OSCAR_MAIN_TEMPLATE_DIR
TEMPLATE_DIRS = (
    location('templates'),
    OSCAR_MAIN_TEMPLATE_DIR,
)
    ・
    ・
INSTALLED_APPS = [
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.admin',
    'django.contrib.flatpages',
    'django.contrib.staticfiles',
    'django.contrib.sitemaps',
    'django_extensions',
    # Debug toolbar + extensions
    'debug_toolbar',
    'apps.gateway',     # For allowing dashboard access
    'widget_tweaks',
]
from oscar import get_core_apps
INSTALLED_APPS = INSTALLED_APPS + get_core_apps()

# Add Oscar's custom auth backend so users can sign in using their email
# address.
AUTHENTICATION_BACKENDS = (
    'oscar.apps.customer.auth_backends.EmailBackend',
    'django.contrib.auth.backends.ModelBackend',
)
    ・
    ・


INSTALLLED_APPS に

  • django.contrib.sites
  • django.contrib.flatpages

が追加されていて、MIDDLEWARE_CLASSES に

  • oscar.apps.basket.middleware.BasketMiddleware
  • django.contrib.flatpages.middleware.FlatpageFallbackMiddleware

が追加されていることが確認できます。



ちなみに、「TEMPLATE_CONTEXT_PROCESSORS」と「TEMPLATE_DIRS」を分けて記述している Sandbox の setteings.py の書き方は、Django 1.9 の書き方としては少し古いようですね。

Before Django 1.8 this setting was split between TEMPLATE_CONTEXT_PROCESSORS and TEMPLATE_DIRS.


http://django-oscar.readthedocs.org/en/latest/internals/getting_started.html



 

決済モジュールの導入手順

続けて、Django Oscar の Sandbox サイトに決済モジュールを組み込んでいきます。

決済代行サービスに「PayPal」を利用することを想定して、決済モジュールには「django-oscar-paypal」を選択することにします。


手順は以下の通りです。


参考
http://django-oscar-paypal.readthedocs.org/en/latest/


 

1. PayPal の Test API Credentials を取得

PayPal の決済モジュールを利用するには、「Test API Credentials」という PayPal の決済API を利用するための認証情報が必要となります。

「Test API Credentials」は、以下の 3セットのキー・バリューとなっています。

  • PAYPAL_API_USERNAME
  • PAYPAL_API_PASSWORD
  • PAYPAL_API_SIGNATURE



Test API Credentials を取得する前に、まずは PayPal のアカウントを取得します。本番ではビジネスアカウントが必要ですが、Sandbox では個人アカウントでも大丈夫です。


PayPal アカウントを取得した後に、「PayPal Developer」ページからログインします。
https://developer.paypal.com/
f:id:akiyoko:20160531003041p:plain

Sandbox アカウントではなく、通常の PayPal アカウントでログインします。
f:id:akiyoko:20160531003105p:plain

「DASHBOARD」をクリックします。
f:id:akiyoko:20160531003128p:plain

「Accounts」を選択します。
f:id:akiyoko:20160531003200p:plain

Sandbox 用の「Buyer アカウント(マーチャントアカウント)」と「Seller アカウント(買い手アカウント)」がデフォルトで用意されている(はずな)ので、Type が「BUSINESS」となっている方の Buyer アカウントの「Profile」をクリックします。
f:id:akiyoko:20160531003227p:plain

「API Credentials」タブから Test API Credentials を確認することができます。
f:id:akiyoko:20160531003251p:plain


参考(PayPal 公式)


参考(Test API Credentials)


参考(ビジネスアカウント)


 

2. django-oscar-paypal のインストール

Ubuntu サーバ側で、django-oscar-paypal をインストールします。

$ workon myproject
$ pip install django-oscar-paypal
  • django-localflavor==1.3
  • django-oscar-paypal==0.9.7

が追加されました。


 

3. INSTALLED_APPS に追加

sites/sandbox/settings.py に「paypal」を加えます。

INSTALLED_APPS = [
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.admin',
    'django.contrib.flatpages',
    'django.contrib.staticfiles',
    'django.contrib.sitemaps',
    'django_extensions',
    # Debug toolbar + extensions
    'debug_toolbar',
    'paypal',
    'apps.gateway',     # For allowing dashboard access
    'widget_tweaks',
]


 

4. マイグレーション

以下のコマンドを実行して、django-oscar-paypal 系のテーブルを作成します。

$ python sites/sandbox/manage.py migrate --run-syncdb

Operations to perform:
  Synchronize unmigrated apps: reports_dashboard, messages, django_extensions, treebeard, gateway, communications_dashboard, reviews_dashboard, offers_dashboard, pages_dashboard, shipping_dashboard, haystack, promotions_dashboard, checkout, vouchers_dashboard, django_tables2, partners_dashboard, staticfiles, oscar, paypal, sitemaps, catalogue_dashboard, users_dashboard, search, debug_toolbar, widget_tweaks, dashboard, ranges_dashboard, orders_dashboard
  Apply all migrations: customer, promotions, shipping, wishlists, offer, admin, sessions, thumbnail, contenttypes, auth, payment, reviews, analytics, catalogue, flatpages, sites, address, basket, partner, order, voucher
Synchronizing apps without migrations:
  Creating tables...
    Creating table paypal_expresstransaction
    Creating table paypal_payflowtransaction
    Running deferred SQL...
Running migrations:
  No migrations to apply.
  Your models have changes that are not yet reflected in a migration, and so won't be applied.
  Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them.

Django 1.9 の場合は、「run-syncdb」オプションを付けないとテーブルが作成されないので要注意です。(最後の警告は無視して OK。対応したいのであれば、makemigrations を実行すればよい。)

参考
http://stackoverflow.com/a/34635951


ここで、

  • paypal_expresstransaction
  • paypal_payflowtransaction

というテーブルが追加されました。



ここでもう一度、データベースをバックアップしておきます。

$ mysqldump --single-transaction -u root -p myproject > ~/myproject_migrate_paypal.dump

 

5. settings を修正

ここからは、
http://django-oscar-paypal.readthedocs.org/en/latest/express.html#getting-started
を参考にして進めていきます。


https://github.com/django-oscar/django-oscar-paypal/blob/master/sandbox/settings.py
を参考に、settings.py を修正します。


sites/sandbox/settings.py の最後の方に、以下の設定を追加します。

    ・
    ・
# django-oscar-paypal
# ===================

PAYPAL_SANDBOX_MODE = True
PAYPAL_CALLBACK_HTTPS = False
PAYPAL_API_VERSION = '119'

PAYPAL_API_USERNAME = ''
PAYPAL_API_PASSWORD = ''
PAYPAL_API_SIGNATURE = ''

from django.utils.translation import ugettext_lazy as _
OSCAR_DASHBOARD_NAVIGATION.append(
    {
        'label': _('PayPal'),
        'icon': 'icon-globe',
        'children': [
            {
                'label': _('Express transactions'),
                'url_name': 'paypal-express-list',
            },
        ]
    })

# Try and import local settings which can be used to override any of the above.
try:
    from settings_local import *
except ImportError:
    pass


次に、sites/sandbox/settings_local.py に、「1. PayPal の Test API Credentials を取得」で取得したマーチャントアカウントの APIキーを設定します。

PAYPAL_API_USERNAME = 'xxxxxx-facilitator_api1.xxxxxx.xxx'
PAYPAL_API_PASSWORD = 'xxxxxxxxxxxxxxxx'
PAYPAL_API_SIGNATURE = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

 

6. urls.py を修正

https://github.com/django-oscar/django-oscar-paypal/blob/master/sandbox/urls.py
を参考に、sites/sandbox/urls.py を修正します。

<修正前>

    ・
    ・
from oscar.app import application
from oscar.views import handler500, handler404, handler403
    ・
    ・
# Prefix Oscar URLs with language codes
urlpatterns += i18n_patterns('',
    # Custom functionality to allow dashboard users to be created
    url(r'gateway/', include('apps.gateway.urls')),
    # Oscar's normal URLs
    url(r'', include(application.urls)),
)
    ・
    ・

  ↓
<修正後>

    ・
    ・
from oscar.app import application
from oscar.views import handler500, handler404, handler403
from paypal.express.dashboard.app import application as express_dashboard
    ・
    ・
# Prefix Oscar URLs with language codes
urlpatterns += i18n_patterns('',
    # PayPal Express integration
    url(r'checkout/paypal/', include('paypal.express.urls')),
    # Dashboard views for Express
    url(r'dashboard/paypal/express/', include(express_dashboard.urls)),
    # Custom functionality to allow dashboard users to be created
    url(r'gateway/', include('apps.gateway.urls')),
    # Oscar's normal URLs
    url(r'', include(application.urls)),
)
    ・
    ・


 

7. django-oscar-paypal のテンプレートファイルを修正

Django Oscar の basket(ショッピングカート)機能、および checkout(チェックアウト)機能で使われている各種テンプレートファイルに対して、以下の修正を行います。

  • Django 1.9 対応(django-oscar-paypal が Django 1.9 に対応していないため)
  • 体裁修正(django-oscar-paypal が Django Oscar のスタイルに対応していないため)


ここで、settings.py の設定が以下のようになっており、Sandbox プロジェクトの仕組み上、「sites/sandbox/templates/」 -> 「src/oscar/templates/oscar/」の順にテンプレートファイルをルックアップし、それでも無ければ、INSTALLED_APPS でインストールしたアプリケーションのテンプレートファイルを参照するようになっています。

from oscar import OSCAR_MAIN_TEMPLATE_DIR
TEMPLATE_DIRS = (
    location('templates'),
    OSCAR_MAIN_TEMPLATE_DIR,
)

Sandbox プロジェクトでは、「src/oscar/templates/oscar/」配下に実ファイルを配置しているため、ライブラリが持っているテンプレートファイルによるオーバーライドが出来ないので注意が必要です。


 

1) ショッピングカート画面

django-oscar-paypal の Sandbox用に用意されているファイル
https://github.com/django-oscar/django-oscar-paypal/blob/master/sandbox/templates/basket/partials/basket_content.html
を sites/sandbox/templates/ 配下にコピーします。

$ cd /tmp/
$ git clone https://github.com/django-oscar/django-oscar-paypal.git
$ cd django-oscar-paypal/
$ git checkout 0.9.7
$ mkdir -p /opt/webapps/myproject/sites/sandbox/templates/basket/partials
$ cp -a sandbox/templates/basket/partials/basket_content.html /opt/webapps/myproject/sites/sandbox/templates/basket/partials/basket_content.html

2016/5/28 現時点の django-oscar-paypal のソースコードのままでは、以下のようにエラーが出てしまいます。

f:id:akiyoko:20160529145830p:plain

テンプレート内で、

{% load url from future %}

と書くと、Django 1.9 で動かした場合に、

'url' is not a valid tag or filter in tag library 'future'

というエラーが発生します。これは、Django1.9 以降では、future タグの url がなくなって、ビルトインのものを使うようになったからです。なので、Django1.9 以降では、url を load する必要は無く、

{% url 'checkout:preview' %}

とそのまま使えばよいです。


参考
https://www.bountysource.com/issues/29762758-django-1-9-compatibility-url-tag


要するに、django-oscar-paypal のテンプレートが Django 1.9 対応されていないのが原因なので、以下のように修正していきます。


sites/sandbox/templates/basket/partials/basket_content.html
<修正前>

{% extends 'oscar/basket/partials/basket_content.html' %}
{% load url from future %}
{% load i18n %}

{% block formactions %}
<div class="form-actions">
	{% if anon_checkout_allowed or request.user.is_authenticated %}
        {% if basket.total_excl_tax > 0 %}
            <a href="{% url 'paypal-redirect' %}"><img src="https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif" align="left" style="margin-right:7px;"></a>
        {% endif %}
	{% endif %}
	<a href="{% url 'checkout:index' %}" class="pull-right btn btn-large btn-primary">{% trans "Proceed to checkout" %}</a>
</div>
{% endblock formactions %}

  ↓
<修正後>

{% extends 'oscar/basket/partials/basket_content.html' %}
{#{% load url from future %}#}
{% load i18n %}

{% block formactions %}
<div class="form-actions">
	{% if anon_checkout_allowed or request.user.is_authenticated %}
        {% if basket.total_excl_tax > 0 %}
            <a href="{% url 'paypal-redirect' %}"><img src="https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif" align="left" style="margin-right:7px;"></a>
        {% endif %}
	{% endif %}
	<a href="{% url 'checkout:index' %}" class="pull-right btn btn-large btn-primary">{% trans "Proceed to checkout" %}</a>
</div>
{% endblock formactions %}

上記の対応後、ショッピングカート画面を確認すると、以下のように表示が少し崩れてしまっています。

f:id:akiyoko:20160529150928p:plain


こちらは、Django Oscar 側のテンプレートのスタイルの当て方が変わったのに、django-oscar-paypal の Sandbox 用のテンプレート側がまだ対応できていないことが原因のようです。

そこで、src/oscar/templates/oscar/basket/partials/basket_content.html を参考にして、以下のようにテンプレートファイルを修正します。

<再修正後>

{% extends 'oscar/basket/partials/basket_content.html' %}
{#{% load url from future %}#}
{% load i18n %}

{% block formactions %}
    <div class="form-actions">
        <div class="row">
            <div class="col-sm-8">
                {% if anon_checkout_allowed or request.user.is_authenticated %}
                {% if basket.total_excl_tax > 0 %}
                <a href="{% url 'paypal-redirect' %}"><img src="https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif" align="left" style="margin-right:7px;"></a>
                {% endif %}
                {% endif %}
            </div>
            <div class="col-sm-4">
                <a href="{% url 'checkout:index' %}" class="btn btn-lg btn-primary btn-block">{% trans "Proceed to checkout" %}</a>
            </div>
        </div>
    </div>
{% endblock formactions %}

これで、きちんと表示されるようになりました。
f:id:akiyoko:20160529151517p:plain


 

2) チェックアウト画面

同じように、
https://github.com/django-oscar/django-oscar-paypal/blob/master/sandbox/templates/checkout/payment_details.html
を sites/sandbox/templates/ 配下にコピーします。

$ cd /tmp/django-oscar-paypal/
$ mkdir -p /opt/webapps/myproject/sites/sandbox/templates/checkout
$ cp -a sandbox/templates/checkout/payment_details.html /opt/webapps/myproject/sites/sandbox/templates/checkout/payment_details.html

こちらも、同様のエラーが出るので、
f:id:akiyoko:20160529152118p:plain


以下のように修正を加えます。

sites/sandbox/templates/checkout/payment_details.html
<修正前>

{% extends 'oscar/checkout/payment_details.html' %}
{% load url from future %}
{% load i18n %}

{% block payment_details %}
    <div class="well">
        <div class="sub-header">
            <h3>{% trans "PayPal Express" %}</h3>
        </div>
        <p>{% trans "Click on the below icon to use Express Checkout but where the shipping address and method is already chosen on the merchant site." %}</p>
        <div style="overflow:auto"><a href="{% url 'paypal-direct-payment' %}" title="{% trans "Pay with PayPal" %}"><img src="https://www.paypal.com/en_US/i/logo/PayPal_mark_37x23.gif" align="left" style="margin-right:7px;"></a>&nbsp;</div>
    </div>

    <div class="well">
        <div class="sub-header">
            <h3>{% trans "PayPal PayFlow Pro" %}</h3>
        </div>
        <form method="post" action="{% url 'checkout:preview' %}" class="form-stacked">
            {% csrf_token %}
            <h4>{% trans "Bankcard" %}</h4>
            {% include "partials/form_fields.html" with form=bankcard_form %}
            <h4>{% trans "Billing address" %}</h4>
            {% include "partials/form_fields.html" with form=billing_address_form %}
            <div class="form-actions">
                <button type="submit" class="btn btn-large btn-primary">{% trans "Continue" %}</button>
            </div>
        </form>
    </div>

{% endblock %}

  ↓
<修正後>

{% extends 'oscar/checkout/payment_details.html' %}
{#{% load url from future %}#}
{% load i18n %}

{% block payment_details %}
    <div class="well">
        <div class="sub-header">
            <h3>{% trans "PayPal Express" %}</h3>
        </div>
        <p>{% trans "Click on the below icon to use Express Checkout but where the shipping address and method is already chosen on the merchant site." %}</p>
        <div style="overflow:auto"><a href="{% url 'paypal-direct-payment' %}" title="{% trans "Pay with PayPal" %}"><img src="https://www.paypal.com/en_US/i/logo/PayPal_mark_37x23.gif" align="left" style="margin-right:7px;"></a>&nbsp;</div>
    </div>

    <div class="well">
        <div class="sub-header">
            <h3>{% trans "PayPal PayFlow Pro" %}</h3>
        </div>
        <form method="post" action="{% url 'checkout:preview' %}" class="form-stacked">
            {% csrf_token %}
            <h4>{% trans "Bankcard" %}</h4>
            {% include "partials/form_fields.html" with form=bankcard_form %}
            <h4>{% trans "Billing address" %}</h4>
            {% include "partials/form_fields.html" with form=billing_address_form %}
            <div class="form-actions">
                <button type="submit" class="btn btn-large btn-primary">{% trans "Continue" %}</button>
            </div>
        </form>
    </div>

{% endblock %}

f:id:akiyoko:20160529152616p:plain

ここでは詳しく触れませんが、日本では「PayPal PayFlow Pro」は使えないので、最終的なテンプレートファイルは以下のようにしておきます。

<再修正後>

{% extends 'oscar/checkout/payment_details.html' %}
{#{% load url from future %}#}
{% load i18n %}

{% block payment_details %}
    <div class="well">
        <div class="sub-header">
            <h3>{% trans "PayPal Express" %}</h3>
        </div>
        <p>{% trans "Click on the below icon to use Express Checkout but where the shipping address and method is already chosen on the merchant site." %}</p>
        <div style="overflow:auto"><a href="{% url 'paypal-direct-payment' %}" title="{% trans "Pay with PayPal" %}"><img src="https://www.paypal.com/en_US/i/logo/PayPal_mark_37x23.gif" align="left" style="margin-right:7px;"></a>&nbsp;</div>
    </div>
{% endblock %}

f:id:akiyoko:20160529152636p:plain



 

3) PayPal からのリダイレクト画面

続いて、PayPal での処理処理が終わったときにリダイレクトされてくる画面のテンプレートファイルを修正します。これまで同様に、

  • Django 1.9 対応
  • 体裁修正

の対応を行います。

$ cp -r /home/vagrant/.virtualenvs/myproject/lib/python2.7/site-packages/paypal/templates/* /opt/webapps/myproject/sites/sandbox/templates/
$ rm -rf /opt/webapps/myproject/sites/sandbox/templates/paypal/payflow

$ tree sites/sandbox/templates/paypal/
sites/sandbox/templates/paypal/
└── express
    ├── dashboard
    │   ├── transaction_detail.html
    │   └── transaction_list.html
    └── preview.html

sites/sandbox/templates/paypal/express/preview.html
<修正前>

{% extends "checkout/preview.html" %}
{% load currency_filters %}
{% load i18n %}
{% load url from future %}
{% load thumbnail %}

{# Null out the actions as they can't be used here #}
{% block shipping_address_actions %}{% endblock %}
{% block shipping_method_actions %}{% endblock %}
{% block order_contents_actions %}{% endblock %}

{% block payment_method %}
    <div class="span6">
        <div class="sub-header">
            <h2>{% trans "Payment" %}</h2>
        </div>
        <div class="well well-success">
            <h4>{% trans "PayPal" %}</h4>
            <p>
                {% blocktrans with amt=paypal_amount|currency email=paypal_user_email %}
                    {{ amt }} will be deducted from your PayPal account, registered 
                    to email: {{ email }}.
                {% endblocktrans %}
            </p>
        </div>
    </div>
{% endblock %}
    ・
    ・

  ↓
<修正後>

{% extends "checkout/preview.html" %}
{% load currency_filters %}
{% load i18n %}
{#{% load url from future %}#}
{% load thumbnail %}

{# Null out the actions as they can't be used here #}
{% block shipping_address_actions %}{% endblock %}
{% block shipping_method_actions %}{% endblock %}
{% block order_contents_actions %}{% endblock %}

{% block payment_method %}
    <div class="col-sm-6">
        <div class="sub-header">
            <h2>{% trans "Payment" %}</h2>
        </div>
        <div class="well well-success">
            <p>{% blocktrans with amount=order_total.incl_tax|currency %}<strong>{{ amount }}</strong> will be debited from your bankcard.{% endblocktrans %}</p>
            <div class="alert-actions">
                <a href="{% url 'checkout:payment-details' %}" class="btn">{% trans "Change payment details" %}</a>
            </div>
        </div>
    </div>
{% endblock payment_method %}
    ・
    ・


 

4) ダッシュボード画面

Django Oscar のダッシュボード画面を使う場合は、以下の 2ファイルに Django 1.9 対応の修正を加える必要があります。


sites/sandbox/templates/paypal/express/dashboard/transaction_list.html

{% extends 'dashboard/layout.html' %}
{% load currency_filters %}
{% load i18n %}
{#{% load url from future %}#}
    ・
    ・


f:id:akiyoko:20160529154701p:plain


sites/sandbox/templates/paypal/express/dashboard/transaction_detail.html

{% extends 'dashboard/layout.html' %}
{% load currency_filters %}
{% load i18n %}
{#{% load url from future %}#}
    ・
    ・

f:id:akiyoko:20160529154718p:plain


以上で、Django Oscar の Sandbox サイトを構築するまでの作業は終了です。



GitHub にも修正内容をアップしたので、こちらも参照してください。
GitHub - akiyoko/oscar_sandbox




 

まとめ

やや細かな修正内容まで言及してしまいましたが、Django Oscar の Sandbox サイトを構築して、決済モジュールを導入するまでの手順を紹介しました。

これで、Django Oscar のいろいろな機能を試すことができるようになりました。次回は、この Sandbox サイトを使って、Django Oscar の ECサイトとしての機能を検証していきます。

ゼロからはじめる Django で ECサイト構築(その1:ECパッケージの選定)

はじめに

とあるニーズがあって、Python(ほぼ Django 一択)ベースの ECパッケージを使った ECサイトを構築しようかと、昨年の10月頃から細々と調査をしていたのですが、EC-CUBE や osCommerce、Zen Cart、Magento、WordPress + WelCart など PHPベースの ECパッケージについて書かれた記事は数多く存在するのですが、Pythonベースの ECパッケージについての記事があまり無いように思ったので、勉強がてらメモを残していきたいと思います。




 

ECサイトのタイプ

まず第一に、ECサイトには、以下に示したような構築方式および出店方式の違いがありますが、導入実績や信頼性、初期・月額費用、構築期間、カスタマイズ性、専門知識の必要性、集客・販促の必要性などの特徴を考慮しつつ、目的に合ったものを採用する必要があります。

以下の表では、構築・出店方式のタイプ別に、構築や運用の手間がかかりそうな順に並べてみました。

構築・出店方式 概要 代表例
フルスクラッチ型 フルスクラッチで構築
無料パッケージ型 オープンソースの ECパッケージをサーバに導入 EC-CUBEZen CartLive Commerce など
有料パッケージ型 有料の ECパッケージをサーバに導入 ecbeingコマース21 など
ASP型 ECサービスをレンタル えびすマートエレコマ など
インスタントEC型 簡単にネットショップ開設 Stores.jpBASE など
オンラインモール型 Web上の仮想商店街 楽天市場、Amazon、ポンパレモール など
C2Cモール型 消費者間取引 ヤフオク、メルカリLINE MALL など






参考



私の場合は、カスタマイズ性と構築費用(ECパッケージのコストゼロ)を最優先させかったので、オープンソースの ECパッケージを利用する「無料パッケージ型」を採用することとしました。



 

ECパッケージの特徴

そもそも ECパッケージとは、ECサイト(電子商取引をするためのネットショップ)を構築するために必要な数々の機能を一つにまとめたソフトウェアを指します。


一般に、ECパッケージに求められる機能としては、

  • ショップフロント機能
    • 商品紹介
      • 商品カテゴリ別表示
      • 商品一覧
      • 商品詳細
      • 商品検索(キーワード / 価格帯)
      • 商品の並び替え(注文数 / 価格 / 新着 / ユーザー評価)
      • 最近閲覧した商品紹介
      • ユーザー評価(レビュー)
    • 商品注文
      • ショッピングカート
      • 決済手続き
        • クレジットカード決済
        • 振込決済(コンビニ / 銀行 / 郵便局)
        • 代引決済
        • 携帯キャリア決済
      • タイムセール
      • クーポン
      • ディスカウント(ボリュームディスカウント / 配送料無料)
      • ゲスト注文
      • 予約注文
      • 関連商品・レコメンド(この商品を買った人はこんな商品も買っています)
    • メンバーシップ
      • アカウント登録
      • 退会
      • パスワード変更
      • ログイン
      • ログアウト
    • マイページ
      • 注文履歴
      • 配送先登録
      • お気に入り登録(ほしい物リスト)
    • 問い合わせ
  • バックオフィス機能
    • 商品管理
      • 商品カテゴリ登録
      • 商品登録
      • タイムセール登録
      • クーポン登録
      • ディスカウント条件設定
    • 受注管理
      • 消し込み(返品処理)
    • 顧客管理
    • 問い合わせ管理
    • 売上集計
    • 販売分析
    • 各種メール送信
    • システム設定
      • システムメンテナンス
      • デザインテーマ設定
      • 多言語化

などが挙げられます。


無料パッケージにせよ有料パッケージにせよ、ECパッケージの選定においては、上記の機能がどれだけ実現できるかが一つの重要な選定基準となります。




 

ECパッケージの選定

ここで、ECパッケージを選定するために、Djangoベースの ECパッケージの中から人気のあるものをリストアップしてみます。


Djangoベースのパッケージの評価するには、Django Packages : E-Commerce を参照するのが手っ取り早いです。

Django Packages で比較

スター数の上位 4つをリストアップしてみました。
(「SATCHLESS」は最近開発が活発でなくなって来ているようなので、除外しました。)


PACKAGE DJANGO-OSCAR DJANGO SHOP SALEOR CARTRIDGE
Description Domain-driven e-commerce for Django A Django based shop system An e-commerce storefront for Python and Django Ecommerce for Mezzanine
Category Framework Framework Framework App
Development Status Production/Stable Unknown n/a Beta
Last updated April 3, 2016, 5:30 a.m. May 16, 2016, 9:40 a.m. May 11, 2016, 10:38 a.m. April 4, 2016, 2:54 a.m.
Version 1.2rc1 0.9.1 n/a 0.11.0
Stars 1997 1044 501 464
Repo Forks 814 438 199 222
Payment Methods Gateways: DataCash, PayPal, PaymentExpress. There is also an accounts extension that provides support for giftcards, loyalty schemes and customer budgets. cash-on-delivery paypal (ext), postfinance (ext) Easily extensible All supported by django-payments: Authorize.net, Braintree, Coinbase, Cybersource, Dotpay, Google Wallet, PayPal, Sage Pay, Sofort, Stripe Authorize.net, eGate, PayPal, Stripe, Braintree, PIN
Shipping options Extremely flexible. Any part of the shipping calculation can be customised to suit your domain. Flat rate, easy api for extensibility Per-country shipping rules provided out of the box, custom options are easy to implement. Split deliveries for a single order Flat rate provided plus hooks for implementing your own rules
Configurable Checkout Steps Yes - The checkout can be easily customised to add, remove, alter or combine steps. It's not controlled by a single setting though. Saleor is meant to be forked so you can just edit the code

Django Packages : E-Commerce より抜粋。2016年5月22日時点のもの)


DJANGO-OSCAR」と「DJANGO SHOP」が二大人気となっているようですが、「DJANGO-OSCAR」のスター数・フォーク数はほぼダブルスコアになっています。

なお、CARTRIDGE のカテゴリが「App」となっていますが、このパッケージはショッピングカート機能のみを提供するもので、「Mezzanine」という CMSパッケージ向けに作られています。


ちなみに、「Django Packages : E-Commerce」の全パッケージ中でステータスが「Production/Stable」になっていたのは、

の 4つだったのですが、スターやフォーク数では「DJANGO-OSCAR」が圧倒的人気です。




ECパッケージの機能の中でも特に重要な機能の一つが「決済処理」ですが、多くの ECパッケージが、Pluggable なモジュール形式の「決済モジュール」を提供しています。PayPal や Stripe などの決済代行サービスに合わせた決済モジュールが個別に用意されているケースが多いのですが、ECパッケージ本体に組み込まれている場合や、別パッケージとしてソースコードが管理されている場合もあります。



 

決済モジュールの特徴

決済処理に特化したモジュールは「決済モジュール」と呼ばれ、Pluggable に差し替え可能な仕組みになっている場合が多く、決済代行サービスに合わせたものをチョイスして取り込むことができます。ECパッケージ本体やサードパーティ(コミュニティ)の決済モジュールで対応できない決済代行サービスを利用したい場合は、決済モジュール自体を自作する必要も出てきます。

決済処理の仕組み

ECサイトの決済処理の仕組みを簡単に図解すると、以下のようになります。

f:id:akiyoko:20160515172525p:plain
10 Safe and Popular Gateways for Online Payment Processing | InstantShift を参考に作成)


ECサイトから見れば、決済代行サービスを窓口(ゲートウェイ)として利用することで、Visa や MasterCard のようなカード会社と直接やり取りすることなしに、決済処理ができるようになっています。


決済モジュールは以下の位置に配置され、API を通じて決済代行サービスとやり取りを行います。

f:id:akiyoko:20160522231309p:plain



決済モジュールは、ECパッケージのチェックアウト機能に合わせた決済モジュールが複数用意されている場合が多いので、使用する決済代行サービスに合わせてチョイスするのがベストです。


例えば、ECパッケージに「DJANGO-OSCAR」を使うのであれば、

django-oscar-datacash Integration with the DataCash payment gateway
django-oscar-paypal Integration with PayPal. This currently supports both Express Checkout and PayFlow Pro.
django-oscar-paymentexpress Integration with the Payment Express payment gateway
django-oscar-accounts Managed accounts (can be used for giftcard functionality and loyalty schemes)
django-oscar-stores Physical stores integration (opening hours, store locator etc)
django-oscar-eway Integration with the eWay payment gateway.
django-oscar-sagepay-direct Integration with "DIRECT" part of Sagepay's API

https://github.com/django-oscar/django-oscar#extensions より)

が本家(django-oscar)から提供されており、これらは比較的信頼性も高いものと推測されます。その他にも、コミュニティが製作した決済モジュールも多々用意されているようですが、こちらの信頼性については個別に検証が必要です。


 
以上から、例えば、決済代行サービスに PayPal を利用する予定であれば「django-oscar-paypal」をまずは検討するのがよい、ということになります。しかしながら、PayPal を利用するにしても、使用する API の種類によっては(例えば日本国内では)対応できないという可能性もあるため、実際に検証が必要となります。



 

決済モジュールの選定

ECパッケージに依存しない決済モジュールも存在します。ECパッケージで用意された決済モジュールが決済代行サービスに対応していない場合などは、それらを使用すれば(カスタマイズは必要になると思いますが)、イチから自作しなくてもよくなるケースもあるでしょう。


こちらについても、Django Packages で比較検討してみることにしました。

Django Packages で比較

スター数の上位 5つをリストアップしました。
(「LFS - LIGHTNING FAST SHOP」は ECパッケージなので除外。加えて、「DJANGO-ZEBRA」は長年メンテされていなさそうなので除外しました。)


PACKAGE DJANGO-MERCHANT DJANGO-PAYPAL DJ-STRIPE DJANGO-GETPAID DJANGO-PAYMENTS
Description A Django app to accept payments from various payment processors via Pluggable backends. A pluggable Django application for integrating PayPal Payments Standard or Payments Pro Django + Stripe Made Easy Django payments processor. Universal payment handling for Django
Development Status Alpha Unknown Beta Production/Stable n/a
Last updated July 8, 2015, 1:29 a.m. May 9, 2016, 1:51 p.m. May 11, 2016, 12:01 p.m. Jan. 25, 2016, 4:58 p.m. April 20, 2016, 12:05 p.m.
Version 0.2 0.3.2 0.8.0 1.7.3 n/a
Stars 825 307 285 167 142
Repo Forks 142 83 141 63 57

Django Packages : Payment Processing より抜粋。2016年5月22日時点)


全体的に「Production/Stable」ステータスのものが少ない印象です。
また、Stripe や Braintree など、日本ではまだ使えない決済サービス向けに作られたものが多いようにも思いました。



 

まとめ

「ゼロからはじめる Django で ECサイト構築」の第一回として、ECパッケージの選定を行いました。

「DJANGO-OSCAR」が圧倒的人気で機能も充実しているようです。まずは、「DJANGO-OSCAR」の機能を実際に見ていきたいと思います。
また、Mezzanine 向けのショッピングカート機能を提供する「CARTRIDGE」も気になるところです。

今後は、この二つを中心に調査を続けていきます。

Amazon プライムの戦略にまんまとハマってしまった(いい意味で)

昨年 Amazon プライムの会員になってから、早や 9ヶ月ほど経とうとしていますが、今やもう Amazon プライム無しでは考えられないくらいその利便性を痛感しています。

「Amazon プライムの戦略にまんまとハマってしまった」と言っていいかもしれません。
もちろんいい意味で、ですよ。

買ったもの

まず、Amazon プライム会員になってから買ったものを紹介していきます。

Kindle paperwhite おすすめ度:★★★

最初に買ったのは、Kindle端末(電子書籍リーダー)です。

今や通勤時の必須アイテムです。重さが約 200g と軽くて片手で楽に持てますし、バッテリーも数週間もつので大変重宝しています。


キャンペーン情報付きモデルだと通常モデルよりも 2,000円ほど安いのですが、はっきり言ってキャンペーン情報付きモデルの方が絶対お得です。 端末をオンにしたときに、以下のようにキャンペーン情報が表示されるだけで、他には違いはありません。

f:id:akiyoko:20150803012658j:plain



【追記】5/22まで、クーポンコード『PAPERW7300』で Kindle paperwhite が7,300円オフになるキャンペーンをしています。これはお得です。詳細はこちら。
www.amazon.co.jp



Kindle本たくさん おすすめ度:★★★

この一年で本 40冊(漫画除く)、雑誌 30冊ほど買っていました。
Amazon.co.jp: Kindle日替わりセール: Kindleストア」や「Amazon.co.jp: Kindle月替わりセール: Kindleストア」で安くなっているとついつい買ってしまいます。


私は Twitter で @AmazonJPKindle をフォローしているのですが、日替わりセール本を毎日定期的につぶやいてくれるので便利です。


買っただけで読んでいない本がたくさん溜まっているのですが、電子書籍なので、物理的な置き場所を取らないのもいいですよね!



あと、Kindle は頻繁にキャンペーンをやっていて、雑誌 99円セールとか KADOKAWA本半額セールとか、かなりお得なセールを期間限定でやっていたりするので、そういう情報収集も結構大事です。



Fire TV Stick おすすめ度:★★★

Fire TV Stick

Fire TV Stick

これは革命でした。

これで、我が家のテレビ(無駄に 50インチあります)で大画面で Amazon ビデオの映画やドラマ、YouTube を観ることができます。
後で説明しますが、対象となるビデオは限られますが、プライム会員の特典で無料でビデオが見放題になるので、プライム会員との合わせ技は最強です。


YouTube が大きな画面で見れるのも画期的でした。たまに遊びに来る姪っ子の機嫌が悪かったときに、テレビでアンパンマンを見せると元気になったりして、何かと役立ってます。


音声認識リモコンが付いて 1,500円ほど高い「Fire TV Stick 音声認識リモコン付属」というのもありますが、Fire TV のスマホアプリを使えば音声入力もできるので、特に必要ではありません。


Fire タブレット おすすめ度:★☆☆

最近買ったのが、これ。

Fire タブレット 8GB、ブラック

Fire タブレット 8GB、ブラック

Amazon プライム会員の期間限定キャンペーンで 5,000円オフの 3,980円だったので、思わず買ってしまいました。

通勤中にプライム・ビデオを観るのに使っています。スマホよりも大きな 7インチの画面でビデオを鑑賞することができ、画質も非常に綺麗で、とてもいい感じです。


私はモバイルルータを持っていないのですが、Amazonビデオ アプリを使えばタブレットにビデオを Wifi 環境下で事前にダウンロードしておけるので、通勤中でもビデオを観ることができるのです。

ストレージは 8 GB で、microSD を増設できるので容量の心配はありませんが、ビデオは一本あたり 300 MB 〜 1 GB 程度で観終わったらすぐに削除しているため、今のところ外部ストレージは使っていません。



Amazon プライム会員とは何か?

Amazon プライム会員になったのが私の Amazon プライム・ライフの全ての始まりでしたが(いい意味で)、そもそも、Amazon プライム会員とは何でしょうか?


<過去記事>
akiyoko.hatenablog.jp



Amazon プライム会員は年会費 3,900円(税込)の有料サービスなのですが、そのメリットが月額換算 325円とは思えないくらい充実しています。



ほかにもいろいろメリットはあるのですが、私の中で大きなものは次の五つです。

  • メリット①:「当日お届け便」などの Amazon プライム配送が無料
  • メリット②:Kindle端末で月一冊無料で読める(Kindleオーナー ライブラリー)
  • メリット③:Prime Music、プライムラジオが無料で聴き放題
  • メリット④:Amazon プライム・ビデオが無料で見放題
  • メリット⑤:会員限定の割引セール

 

メリット①:「当日お届け便」などの Amazon プライム配送が無料

これは本当に便利です。実際、これで助かったというのがすでに何度もあります。仕事などで緊急に必要になった雑貨や本を即日配送してもらえるという「奥の手」があるというのは、精神的にもすごく楽です。


メリット②:Kindle端末で月一冊無料で読める(Kindleオーナー ライブラリー)

Kindle端末(電子書籍リーダー)限定ですが、Kindleオーナー ライブラリー対象本を月一冊、無料で読むことができます。

これは当初思っていたよりもお得感は少なかったです。
というのも、Kindleオーナー ライブラリーの対象本が思ったよりも全然少なくて、ベストセラーの本とか本当に読みたい本はあまり無く、怪しい(?)自費出版の本が多くて、これだけで年会費を浮かそうというのは(付けられた値段でなくて本の本当の価値を考えると)難しいようにも思います。

しかしながら、たまに Kindleストアの Amazonプライム対象商品の一覧を眺めていると、ちょっと読んでみたい本に出会えるのでなかなか侮れません。

www.amazon.co.jp


メリット③:Prime Music、プライムラジオが無料で聴き放題

これも期待ほどでは無かったのですが、あると無いとでは全然違いますし、実際に結構な頻度で使ってます。

Amazon Music アプリをスマホと Mac にインストールして、今まであまり聴かなかった洋楽を中心に聴いています(邦楽はあまり充実していませんのであまり期待しない方がいいかもしれません)。プライム対象のラインナップはまだまだ少ないので、仕事中のバックグラウンドとして使う目的で考えるとちょうどよさそうです。


あと最近、今年4月から使えるようになった新サービス「プライムラジオ」ですが、これも仕事中のバックグラウンドとして使えそうな感じです。プライム対象のものがランダムで流れているだけなのですが。。

メリット④:Amazon プライム・ビデオが無料で見放題

f:id:akiyoko:20160516075733p:plain

これはスゴイ!

先述の Fire TV Stick と組み合わせることで、その真価が発揮されます。是非、Fire TV Stick の購入をおすすめします。

Fire タブレット 8GB、ブラック

Fire タブレット 8GB、ブラック

対象商品は限られますが、無料で Amazon ビデオが見放題になる特典です。ラインナップはまだまだ少ないですが、若干ながらも日々プライム対象のビデオは増えているようです。

英語の勉強と称して洋画を観始めたのですが、かなりハマってます。コンスタントに週に 2〜3本は観ているという感じです。画質も非常によくて満足しています。

この特典で、確実に 3,900円の年会費の元は取れていると思います。


メリット⑤:会員限定の割引セール

Kindle端末が 4,000〜7,300円オフセールで買えたり、Fire タブレットが 5,000円オフセールで買えたりするので、これだけで Amazonプライム会員の年会費が賄えると考えると、会員にならない理由はありません。


【追記】5/22まで、クーポンコード『PAPERW7300』で Kindle paperwhite が7,300円オフになるキャンペーンをしています。これはお得です。詳細はこちら。
www.amazon.co.jp



まとめ

Amazon プライム会員のメリットは、タイムセールにフライングで参加できたりとか、Amazon パントリーという食品・日用品のディスカウント購入ができたりとか、他にもあるのですが、そちらは利用してないのでメリットはよく分かりません。

しかしながら現状でも、Amazon プライム会員のメリットにとても満足しています。

ということで、Amazon プライムは世界一ぃぃぃぃぃ!

「スマートPythonプログラミング: Pythonのより良い書き方を学ぶ」を読んだ

Amazonプライム会員の特典で月一冊無料で読めるプライム対象本(正確には「Kindleオーナー ライブラリー」の対象本)を眺めていたら、新しい Python 本が見つかったので、早速読んでみました。

著者が想定する読者像は「不安を覚えながらなんとなく動くように Python を書いている人」と書いていますが、全部読んでみた感じでは私は、まず初学者向け Python 本をざっと読み終えた後、何ヶ月か(あるいは一年ほど)Python のコードを実務で書いた上で、「脱初心者」を目指そうとしている Python プログラマを対象としているのかなと思いました。

ということで、初学者向けには少し難しいけど、少し Python をかじった人には知りたいような内容が詰まっています。


例えば、「内包表記(リスト内包・集合内包・辞書内包)」や「ジェネレータ式」、「デコレータ」「コンテキストマネージャ」などは、分かりやすくまとまった記事を見つけるのが難しいように思います。そういった意味でも、なかなか貴重な学習本ではないかと思います。特に、デコレータは、脱初心者が抑えておきたい重要な要素だと個人的に思ってます。

ジェネレータは、あまり頻繁に出てくるものではありませんが、たまに出てくると「あれ?」と考えてしまったりします。ジェネレータは、yield 文で値が返されたときの状態を保持していて、次に呼び出されたときに前回の yield 文の直後から再開されるという、説明だけ聞くとややこしい概念なのですが、この本の説明で「なるほど」と思ったのは、「ジェネレータを呼び出すと、それで得られるのはイテレータオブジェクト」ということで、以下のようなサンプルコード(少し手を入れました)を例示しています。

test.py

#!/user/bin/env python
# -*- coding: utf-8 -*-


def test():
    yield 1
    yield 2
    yield 3


def main():
    it = test()
    for i in it:
        print(i)


if __name__ == '__main__':
    main()

Python 2.7 で実行

$ python test.py
1
2
3


またこの本は、全体的にすごく丁寧に説明されているな、と感じます。
例えば、序章の中で、「Hello, World!」を書くサンプルコードを出していますが、「なぜそう書くのか」を丁寧にひとつずつ解き明かして説明しています。
この部分と第二章の「開発環境を整えよう」は、初学者にも有益で分かりやすい説明になっていると思います。

しかしながら後半、特に、Python のバージョン 2.x 系と 3.x 系を共存させるための書き方などは、初学者や初級者には(頭の片隅には入れておいてもいいですが)めったに出会うこともがないため、最後まで読み切る必要はないと思います。


ともあれ、初学者が、「やさしいPython入門」や「Pythonスタートブック」などの薄めの本を読んだ後の二冊目の教科書として読むのは少し厳しい感じがするので、厚めの本を読んでからこの本を読むのがいいかもしれません。


私の場合は、初めてのときに

を読んだ後、次に、

を部分的に読んで、

を最近読みました。

最後の一冊は Python の言語としての使い方の説明は少ないので、Python 自体の学習という趣旨から外れるかもしれませんね。

NumPy, SciPy を利用するために Python 2系の Anaconda を、pyenv を使ってインストールする

はじめに

Anaconda (アナコンダ) とは


Anaconda は、Continuum Analytics 社によって提供されている、Python 本体に加え、科学技術、数学、エンジニアリング、データ分析など、よく利用される Python パッケージ(2016 年 2 月時点で 400 以上)を一括でインストール可能にしたパッケージです。面倒なセットアップ作業が効率よく行えるため、Python 開発者の間で広く利用されています。なお、Anaconda は商用目的にも利用可能です。



Anaconda を利用した Python のインストール (Windows) – Python でデータサイエンス より


 
以前(3年ほど前)、Mac に NumPy, SciPy をインストールするのにかなり苦労した憶えがあるのですが、最近は、Anaconda というパッケージを使えば、Mac だろうが Windows だろうが、NumPy, SciPy を含む科学技術計算パッケージと Python 本体をまとめてインストールすることができます。データサイエンス界隈では、Anaconda を使って手っ取り早く Python の科学技術計算環境を構築することが多くなっているようです。

<過去記事>
akiyoko.hatenablog.jp


実際にやってみたら、「以前の苦労は何だったのか」と呆気にとられるほど簡単にインストールできたので、メモを残しておきます。また今回、pyenv という Python のバージョンマネージャを使ってみたので、そちらも合わせて書いておきたいと思います。


現状

  • OS X 10.10.5
$ which python
/usr/local/bin/python

$ python --version
Python 2.7.10


これらの環境構築は、Homebrew を使って以下の手順で行っていました。

<過去記事>
akiyoko.hatenablog.jp



 

pyenv

Homebrew で pyenv をインストールします。

$ brew install pyenv

$ pyenv --version
pyenv 20160303

$ cat << EOF >> ~/.bash_profile
export PYENV_ROOT=\${HOME}/.pyenv
export PATH=\${PYENV_ROOT}/bin:\$PATH
eval "\$(pyenv init -)"
EOF

$ source ~/.bash_profile


 

Anaconda

pyenv でインストールできる Python のバージョンを確認。

$ pyenv install -l
Available versions:
  ・
  ・
  2.7
  2.7.1
  2.7.2
  2.7.3
  2.7.4
  2.7.5
  2.7.6
  2.7.7
  2.7.8
  2.7.9
  2.7.10
  2.7.11
  ・
  ・
  3.4.0
  3.4-dev
  3.4.1
  3.4.2
  3.4.3
  3.4.4
  3.5.0
  3.5-dev
  3.5.1
  ・
  ・
  anaconda-2.4.0
  ・
  ・
  anaconda3-2.5.0

Python 2系の Anaconda をインストールします。

$ pyenv install anaconda-2.4.0


インストールした Python を global に適用します。

$ pyenv global anaconda-2.4.0
$ pyenv rehash


バージョン確認。

$ pyenv versions
  system
* anaconda-2.4.0 (set by /Users/akiyoko/.pyenv/version)

$ python --version
Python 2.7.10 :: Anaconda 2.4.0 (x86_64)

$ which python
/Users/akiyoko/.pyenv/shims/python


 

「The Payoneer Forum Tokyo - 越境 EC セミナー」に参加しました

主催

Payoneer Inc.

会場

東京都新宿区西新宿8-17-3 住友不動産新宿グランドタワー 1F
ベルサール新宿グランド




 

Payoneer サービス紹介

ナボン 恵子 氏(Payoneer Inc)

  • 越境ECとは、国境を越えてオンラインで販売すること
  • Payoneer は、クロスボーダー決済プラットフォーム
  • 海外でビジネス展開するには
    • 現地法人の設立
    • 現地銀行口座の開設
  • Payoneer のアカウントがあれば OK
  • Payoneer の2005年に設立。本社は NY、日本法人も
  • 各国の規制に対応
    • 米国の貨幣サービス業務(MSB)
    • EUの電子マネー(E-Money)発行者
    • 香港の MSO
  • 外貨($, €, £)で受け取って、国内銀行口座にへ送金可能



 

ライフスタイルを変えた越境ECで月商4000万

小川 貴弘 氏(株式会社ターム)

  • なぜ越境EC?
    • 国内消費市場の縮小
    • 海外の市場規模の大きさ
    • サービスインフラ(特に物流)の整備
      • 現在は UPS, DHL を使用。日本郵便の UGX にも期待
  • 海外で売れるポイント
    • 価格が安い、商品が多い、納品日数が早い
  • 販路は Amazon.com
    • 圧倒的な集客力
    • 物流体制(FBA)
    • 販売しやすいマーケットプレイス
      • データも取れる
    • 海外銀行口座がなくても受取可能
      • 3年前まではダメだったが、Payoneer アカウントを使えば OK
  • Amazon FBA 販売
    • Amazon が出品者の商品在庫の保管、注文管理、出荷、カスタマーサービスを代行し、出品者の Amazon での販売を代行してくれるサービス
  • 会社間(BtoB)の取引にも Payoneer が使えるので便利


 

参考

国際宅配便(FedEx・DHL・UPS)について
EMSなど国際郵便の種類や特徴と料金比較 | ニッポンを届けたい!



 

今こそ海外展開を Amazon で

増田 航 氏(アマゾンジャパン株式会社 Amazon Global Selling)

  • 日本の EC市場 8兆円に対して、世界EC市場は16倍の127兆円(ゴールドマン・サックス調べ)
    • EC市場の成長率は中国が最も高い
    • 日本市場の伸び率が鈍化してきている
    • 北米・西欧は二桁%成長でまだ鈍化していない
  • BtoC-EC業界の世界ナンバーワン企業は、Amazon.com(経産省調べ)
  • Amazon は14カ国で展開中
    • (進出した順に)米・英・独・日・仏・加・中・伊・日・伯・印・墨・豪・蘭
  • アマゾンマーケットプレイスは 11ヶ国で展開中
  • FBA(Fulfillment by Amazon)
    • 受注機会の拡大(24時間365日)
      • ① カスタマーサポートがほとんど不要(英語でのカスタマーサポート 24時間365日)
      • ② 配送スピード(2日以内を担保)
      • ③ アマゾンプライム会員へのリーチ(米人口の 7人に1人がプライム会員。FBA は送料無料)
    • 振り込みは米ドル
      • 日本の銀行口座では受け取りできないので、Payoneer が必要


 

越境ECビジネスで使える配送とは

上杉 真一郎 氏(日本郵便株式会社)

  • BtoC・・・直接配送(直送)
    • 国際郵便・宅配クーリエ など
  • BtoBtoC・・・現地物流倉庫に一括輸送、物流倉庫から購入者に国内配送
    • FBA など
  • 国内配送と国際配送の違い
    • 1. 通関検査
      • 関税の徴収、輸出・輸入をしてはいけない品物の持ち込み・持ち出しを防ぐといった目的で行われる
    • 2. 海外への配送
      • Invoice, Packing list など
    • 3. 国際配送のための梱包
      • 国内と同じ梱包レベルでは厳しい
  • 通関検査(郵便通関)の場合は、必要な書類の内容で税関が判断するため、問い合わせが来ないようになるべく詳細を記載すること
  • 直送の場合は、購入者に関税が発生する可能性とその場合の対応についてお知らせをしておくこと
  • 国によっては郵送できないものもある(中国など)
    • JP の「国際郵便条件表」を確認
    • リチウム電池を含む商品を発送するには条件がある
  • 国際輸送の場合は、約10箇所の通過ポイントが必要(国内は約4箇所)
    • より強固な梱包が必要
    • 国際配送に「こわれもの」扱いは無い!!
  • 直送で一番使われているのは、EMS(国際スピード郵便)
  • ニーズに合った発送手段
    • EMS(国際スピード郵便)のほか、軽量なものは「国際 eパケット」、さらに小さい小包は「SAL便」もある
    • UBX(ゆうグローバルエクスプレス)
      • 関税元払い、複数個口扱いに対応
      • BtoBでの輸送はもちろん、FBAなどの BtoBtoC への配送にも適している
      • EMSのサイズや重さを超える荷物の取り扱いが可能
    • TOLLの国際物流サービス
  • US で優遇措置スタート(3/10より)
    • 個人輸入の場合に限り、商品代金+送料+保険料総額が $800以内であれば関税なし(3/10以前は $200 だった)


 

参考

国際宅配便の料金比較サイト
国際宅配便とEMSの料金検索 - 送料の虎




世界最大の中国卸売市場とOEM商品制作について 3国間貿易!日本に居ながら、中国でOEM制作し、米国FBA納品と販売

豊田 昇 氏(株式会社LuCent)

  • 中国から安く輸入して Amazon で高く売る
  • 検品・梱包・発送、インボイスの作成などを、個人や中小企業に代わって代行
  • 桜トレード代行サービス開始
    • 上海・深センで物流倉庫を確立、香港経由で配送、LAで荷受け
  • 米国のEC市場規模は、日本の4.3倍。中国は日本の約6倍

「第3回CodeIQ感謝祭「春のエンジニアまつり」」に参加しました

主催

CodeIQ

会場

東京都千代田区丸の内1-9-2 グラントウキョウサウスタワー41F




少し前に参加した勉強会。
特定の技術にフォーカスしたものではなく、エンジニアのキャリアについてのトピックが多かったように思います。

あと、芸人の厚切りジェイソンこと Jason Danielson 氏が登壇するということもあって、夕方頃から急に参加者が増えて満員状態になりました。
すごい人気ですね。


今回は、LTを除いたセッションで気になったことをメモ書き。


 

情報共有から始めるチーム開発とキャリア戦略

及川卓也氏


及川氏と言えば、昨年、米Google から日本のスタートアップの Qiita に転職して話題になりましたね。

グーグルでChrome開発に関わった及川卓也氏が「Qiita」開発元Incrementsの14人目の社員に | TechCrunch Japan


  • SECI(セキ)モデル
    • 共同化(暗黙知→暗黙知)いわゆる「俺の背中から学べ!」モデル
    • 表出化(暗黙知→形式知)
    • 連結化(形式知→形式知)
    • 内面化(形式知→暗黙知)
  • 共有を阻害するもの
    • 情報漏洩リスクへの不安
    • 共有することへの理解・共感不足
    • システム・ルール、そして文化情勢で解決?
  • Google では "Share Everything You Can"
    • Google Resume
    • Weekly Snipets
    • Codebase (Repository)
  • フロー型(リアルタイム型)か、ストック型(非同期型)か?
    • Slack はただのチャットではない
      • パーマリンク
      • チャンネルを自由に増やせる
      • DM
      • リアクション
      • 検索機能
    • Slack は、リアルタイム型・非同期型、対面型・分散型のいずれにも当てはまるのでは?
    • Slack はフロー情報、Qiita Team はストック情報・・では無い?
  • メンタルモデルをネットワーク型にする必要がある


SECI(セキ)モデルを理解するには、この本がオススメとのこと。

アジャイル開発とスクラム 顧客・技術・経営をつなぐ協調的ソフトウェア開発マネジメント

アジャイル開発とスクラム 顧客・技術・経営をつなぐ協調的ソフトウェア開発マネジメント



 

皆さん、はじめまして 株式会社メディアドゥです

森川晃氏

  • 著作物のデジタル流通を担う電子書籍取次
  • 著作物は「文化の発展に寄与」(著作権法第一条)

(目的)
第一条  この法律は、著作物並びに実演、レコード、放送及び有線放送に関し著作者の権利及びこれに隣接する権利を定め、これらの文化的所産の公正な利用に留意しつつ、著作者等の権利の保護を図り、もつて文化の発展に寄与することを目的とする。

  • どの本が売れているか、などのデータも武器になる
  • 電子書籍事業を始めるための4要素が揃っている唯一の企業
    • データベース、CMS、ビューア、コンテンツ
  • データベースは、Oracle Exadata X5
    • 約1.6億ダウンロード/月、約3ペタバイト配信/月
  • LINEマンガ、dブックでも導入




 

澤円の“リアル”プレゼン塾

澤円氏(マイクロソフトテクノロジーセンター)

【参考】


  • プレゼン三層構造
    • ビジョン = Why:何のためのプレゼンか?
    • 核 = What:何を伝えるプレゼンか?
    • 話術 = How:どうやって?
  • ビジョンと核が重要
  • ビジョン
    • ビジョンは究極の理想の形。変更不可
    • 「プレゼン終了後、聴衆にどうなってほしいか?」を決める
    • プレゼンは相手に行動させるためにするべし
    • プレゼンには「未来」を描け!
    • ただの報告はメールで十分。時間と空間の共有は貴重
    • 聴衆がプレゼンの後で他の人にワンセンテンスで内容を説明できるもの
    • 聴衆がプレゼンの後で他の人にどうしても教えたくなってしまうもの
    • シンプルであること
    • アクションの明確化を。誰が、何を、いつまでに
  • スライド作成のコツ
    • スライド1枚にテーマ(問題提起)1つ、説明3行
  • 話術のコツ
    • 口ぐせ、よく使う言い回しを気にする余裕を持つ
    • 視線の練習。電車に乗っている人たちの顔を短時間ずつ均等に眺めてみる
    • 背中で語らない
    • 笑顔。への字口は絶対ダメ
    • 話す速度よりもゆっくりと歩く(動く)と堂々と見せることができる
    • 手の動きは重要


 
澤円氏の本。




 

パネルディスカッション

Jason Danielson氏、及川卓也氏、澤円氏、増井雄一郎氏、星野俊介氏

  • ワークスタイルの違い
    • 大手は定時・残業という概念がない
    • ベンチャーは赤字なので頑張らないと自分も儲からない
    • 時間の感覚が違う。日本は「開始」時間に厳しい
    • 日本のナレッジワーカーの効率が計測できていないので、精神論になってしまっている
    • マネージャーの能力がイケてない。部下が目の前にいないと不安になる
    • 日本のクビに出来ないカルチャーがよくない。年功序列評価の影響
    • アメリカでクビになるのは、能力が低くてパフォーマンスが出ない人、あるいは部署自体がなくなる場合
    • 成長していかないとダメ。成長できない人が職場にのさばっていると組織が腐ってしまう
    • アメリカではボトム 5%が常にクビ候補
  • キャリアの違い
    • 日本人は給料の交渉をしないから給料が低い
    • ジョブ・ディスクリプションによって給料がほぼ決まっている
    • アメリカでは何歳でもコードを書けるが、マネージャになると責任が重くなるので給料が高くなるし、解雇リスクも高くなる
    • コードで人を評価するのは難しい。評価メトリクスを言語化するのは難しいので、それができる組織が限られる
    • 下支えのためのコードが評価されない傾向
    • 日本はソフトウェアを舐めすぎている?
    • 外資や海外で働くために一番必要なのはコミュニケーション
    • やりたいことを言語化すること
    • 最初の一歩をオープンソースのパッチから始めるのがよいかも
  • ポジティブな話
    • 厳しい世界に出ると自分を伸ばせる
    • 日本はぬるま湯、世界にはチャンスや成長の機会がたくさんある
    • ビジネスは、時間や言語のギャップを利用したものが多い
    • とにかく何でもいいからグローバルに接点をもってアウトプットをしていくこと
    • やりたいことは自分で決めてやればいい。諦めなければいずれ成功できる


 

考える力

Jason Danielson氏(株式会社テラスカイ)

  • 勉強のための勉強はつまらない
  • やりたいことをずっと長い間やることで、やろうとしていることができるようになる
  • 若い頃から出世がしたかったが、ある頃から仕事だけじゃないと感じるようになった
  • IT業界のスピードがすごい。30年でここまで変化があるのは、IT業界だけ
  • 変化させるのに何十年かかる古臭い企業の考え方は、IT企業には合わない
    • ソフトウェアを5年かけて開発すると、市場が全然違ってしまっている
    • 日本の企業は時間を掛けすぎている
    • i-modeはそれにどれだけの価値があるのかを作った人たちが分かってなかったが、Appleは違った
  • 情報はまず英語で入ってくる
    • 英語ができるとそれだけで情報量が違う
  • 人生は仕事だけじゃない
    • ITと全く関係ないこともやった方がいい。新しいことをやってみてほしい
  • やっていることを考えてほしい。「やれと言われているので」はダメ
    • 理由がわかるまではやらない方がマシ
    • 新機能作ったら使われるんですか?どういう価値があるんですか?どれだけ売れるんですか?
  • 価値を出そう
    • 実際の価値は、問題を解決しているかどうか


芸人「厚切りジェイソン」のまじめな啓発本。Twitter 界隈では有名。

日本のみなさんにお伝えしたい48のWhy (ぴあ書籍)

日本のみなさんにお伝えしたい48のWhy (ぴあ書籍)