参考
メモ
tmux-1419
に記載の通り、~/.tmux.confに以下のように記載すると、
強制的に改行されるようになるようだ。
1 | set -as terminal-overrides ',*:indn@' |
エンジンの定義。(今回はSQLiteのインメモリモードを使用)
1
2from sqlalchemy import create_engine
engine = create_engine('sqlite:///:memory:', echo=True)
テーブルの作成。今回は2種類のテーブルを作成。
ユーザのIDをプライマリキーとして使用。 1
2
3
4
5
6
7
8
9
10
11
12
13from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey
metadata = MetaData()
users = Table('users', metadata,
Column('id', Integer, primary_key=True),
Column('name', String),
Column('fullname', String),
)
addresses = Table('addresses', metadata,
Column('id', Integer, primary_key=True),
Column('user_id', None, ForeignKey('users.id')),
Column('email_address', String, nullable=False)
)
実際にSQLite内でテーブルを定義する。このとき、テーブルの存在を確認するので複数回実行してもよい。(べき等である)
1
metadata.create_all(engine)
まずは空のクエリを定義。 1
ins = users.insert()
strを使うと、SQLを確認できる。 1
2
3str(ins)
--
'INSERT INTO users (id, name, fullname) VALUES (:id, :name, :fullname)'
今度は値を入れてみる。 1
2
3
4ins = users.insert().values(name='jack', fullname='Jack Jones')
str(ins)
--
'INSERT INTO users (name, fullname) VALUES (:name, :fullname)'
接続の取得 1
conn = engine.connect()
実行 1
2
3
4
5result = conn.execute(ins)
--
2018-12-24 14:08:34,031 INFO sqlalchemy.engine.base.Engine INSERT INTO users (name, fullname) VALUES (?, ?)
2018-12-24 14:08:34,031 INFO sqlalchemy.engine.base.Engine ('jack', 'Jack Jones')
2018-12-24 14:08:34,032 INFO sqlalchemy.engine.base.Engine COMMIT
挿入されたレコードのプライマリキーの確認。 1
2
3>>> result.inserted_primary_key
--
[1]
先の例と同じ1個ずつ挿入する場合。 1
2
3
4
5
6
7ins = users.insert()
conn.execute(ins, id=2, name='wendy', fullname='Wendy Williams')
--
2018-12-24 14:12:55,688 INFO sqlalchemy.engine.base.Engine INSERT INTO users (id, name, fullname) VALUES (?, ?, ?)
2018-12-24 14:12:55,688 INFO sqlalchemy.engine.base.Engine (2, 'wendy', 'Wendy Williams')
2018-12-24 14:12:55,688 INFO sqlalchemy.engine.base.Engine COMMIT
<sqlalchemy.engine.result.ResultProxy object at 0x7f63c8ca7940>
複数ステートメントを一度に実行する場合。 1
2
3
4
5
6
7
8
9
10
11conn.execute(addresses.insert(), [
{'user_id': 1, 'email_address' : 'jack@yahoo.com'},
{'user_id': 1, 'email_address' : 'jack@msn.com'},
{'user_id': 2, 'email_address' : 'www@www.org'},
{'user_id': 2, 'email_address' : 'wendy@aol.com'},
])
--
2018-12-24 14:13:42,077 INFO sqlalchemy.engine.base.Engine INSERT INTO addresses (user_id, email_address) VALUES (?, ?)
2018-12-24 14:13:42,078 INFO sqlalchemy.engine.base.Engine ((1, 'jack@yahoo.com'), (1, 'jack@msn.com'), (2, 'www@www.org'), (2, 'wendy@aol.com'))
2018-12-24 14:13:42,078 INFO sqlalchemy.engine.base.Engine COMMIT
<sqlalchemy.engine.result.ResultProxy object at 0x7f63c8ca7c18>
まずはクエリを実行。 1
2
3
4
5
6
7from sqlalchemy.sql import select
s = select([users])
result = conn.execute(s)
--
2018-12-24 14:16:11,363 INFO sqlalchemy.engine.base.Engine SELECT users.id, users.name, users.fullname
FROM users
2018-12-24 14:16:11,363 INFO sqlalchemy.engine.base.Engine ()
結果のパース。タプルライクに取得。 1
2
3
4
5for row in result:
print(row)
--
(1, 'jack', 'Jack Jones')
(2, 'wendy', 'Wendy Williams')
辞書ライクに取得。 1
2
3
4
5result = conn.execute(s)
row = result.fetchone()
print("name:", row['name'], "; fullname:", row['fullname'])
--
name: jack ; fullname: Jack Jones
conn.execute()の結果はイテレータっぽく扱えるので以下のような書き方ができる。
今回は2個のテーブルのカルテシアン積を求める例。 1
2
3
4
5
6
7
8
9
10
11
12
13
14for row in conn.execute(select([users, addresses])):
print(row)
--
2018-12-24 14:20:14,164 INFO sqlalchemy.engine.base.Engine SELECT users.id, users.name, users.fullname, addresses.id, addresses.user_id, addresses.email_address
FROM users, addresses
2018-12-24 14:20:14,164 INFO sqlalchemy.engine.base.Engine ()
(1, 'jack', 'Jack Jones', 1, 1, 'jack@yahoo.com')
(1, 'jack', 'Jack Jones', 2, 1, 'jack@msn.com')
(1, 'jack', 'Jack Jones', 3, 2, 'www@www.org')
(1, 'jack', 'Jack Jones', 4, 2, 'wendy@aol.com')
(2, 'wendy', 'Wendy Williams', 1, 1, 'jack@yahoo.com')
(2, 'wendy', 'Wendy Williams', 2, 1, 'jack@msn.com')
(2, 'wendy', 'Wendy Williams', 3, 2, 'www@www.org')
(2, 'wendy', 'Wendy Williams', 4, 2, 'wendy@aol.com')
どちらかというと、こちらの方がイメージに近いか。 1
2
3
4
5
6
7
8
9
10
11for row in conn.execute(select([users, addresses]).where(users.c.id == addresses.c.user_id)):
print(row)
--
2018-12-24 14:22:46,769 INFO sqlalchemy.engine.base.Engine SELECT users.id, users.name, users.fullname, addresses.id, addresses.user_id, addresses.email_address
FROM users, addresses
WHERE users.id = addresses.user_id
2018-12-24 14:22:46,769 INFO sqlalchemy.engine.base.Engine ()
(1, 'jack', 'Jack Jones', 1, 1, 'jack@yahoo.com')
(1, 'jack', 'Jack Jones', 2, 1, 'jack@msn.com')
(2, 'wendy', 'Wendy Williams', 3, 2, 'www@www.org')
(2, 'wendy', 'Wendy Williams', 4, 2, 'wendy@aol.com')
and_などを用いる例。 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15from sqlalchemy.sql import and_, or_, not_
s = select([(users.c.fullname +
", " + addresses.c.email_address).
label('title')]).\
where(
and_(
users.c.id == addresses.c.user_id,
users.c.name.between('m', 'z'),
or_(
addresses.c.email_address.like('%@aol.com'),
addresses.c.email_address.like('%@msn.com')
)
)
)
conn.execute(s).fetchall()
Pythonの演算子を用いる例。 1
2
3
4
5
6
7
8
9
10
11
12s = select([(users.c.fullname +
", " + addresses.c.email_address).
label('title')]).\
where(
(users.c.id == addresses.c.user_id) &
(users.c.name.between('m', 'z')) &
(
addresses.c.email_address.like('%@aol.com') | \
addresses.c.email_address.like('%@msn.com')
)
)
conn.execute(s).fetchall()
and_はwhere句を並べることでも実現できる。
1
2
3
4
5
6
7
8
9
10
11
12s = select([(users.c.fullname +
", " + addresses.c.email_address).
label('title')]).\
where(users.c.id == addresses.c.user_id).\
where(users.c.name.between('m', 'z')).\
where(
or_(
addresses.c.email_address.like('%@aol.com'),
addresses.c.email_address.like('%@msn.com')
)
)
conn.execute(s).fetchall()
基本的な使い方 1
2
3
4
5
6
7
8
9from sqlalchemy.sql import text
s = text(
"SELECT users.fullname || ', ' || addresses.email_address AS title "
"FROM users, addresses "
"WHERE users.id = addresses.user_id "
"AND users.name BETWEEN :x AND :y "
"AND (addresses.email_address LIKE :e1 "
"OR addresses.email_address LIKE :e2)")
conn.execute(s, x='m', y='z', e1='%@aol.com', e2='%@msn.com').fetchall()
予めバインドされた値を予め定義することもできる。 1
2
3
4
5
6
7stmt = text("SELECT * FROM users WHERE users.name BETWEEN :x AND :y")
stmt = stmt.bindparams(x="m", y="z")
# stmt = stmt.bindparams(bindparam("x", type_=String), bindparam("y", type_=String))
result = conn.execute(stmt, {"x": "m", "y": "z"})
result.fetchall()
--
[(2, 'wendy', 'Wendy Williams')]
ステートメントの中でSQLテキストを用いることもできる。
1
2
3
4
5
6
7
8
9
10
11
12
13s = select([
text("users.fullname || ', ' || addresses.email_address AS title")
]).\
where(
and_(
text("users.id = addresses.user_id"),
text("users.name BETWEEN 'm' AND 'z'"),
text(
"(addresses.email_address LIKE :x "
"OR addresses.email_address LIKE :y)")
)
).select_from(text('users, addresses'))
conn.execute(s, x='%@aol.com', y='%@msn.com').fetchall()
単純な例 1
2
3
4
5
6
7from sqlalchemy import func
stmt = select([
addresses.c.user_id,
func.count(addresses.c.id).label('num_addresses')]).\
group_by("user_id").order_by("user_id", "num_addresses")
conn.execute(stmt).fetchall()
単純な例 1
print(users.join(addresses))
いろいろな表現を用いることができる。 1
2
3
4print(users.join(addresses,
addresses.c.email_address.like(users.c.name + '%')
)
)
実施に実行 1
2
3
4
5
6
7
8
9
10s = select([users.c.fullname]).select_from(
users.join(addresses,
addresses.c.email_address.like(users.c.name + '%'))
)
conn.execute(s).fetchall()
--
2018-12-25 12:45:29,919 INFO sqlalchemy.engine.base.Engine SELECT users.fullname
FROM users JOIN addresses ON addresses.email_address LIKE users.name || ?
2018-12-25 12:45:29,919 INFO sqlalchemy.engine.base.Engine ('%',)
[('Jack Jones',), ('Jack Jones',), ('Wendy Williams',)]
outer join 1
2
3
4print(select([users.c.fullname]).select_from(users.outerjoin(addresses)))
--
SELECT users.fullname
FROM users LEFT OUTER JOIN addresses ON users.id = addresses.user_id
単純な例 1
2
3
4
5
6
7
8from sqlalchemy.sql import bindparam
s = users.select(users.c.name.like(bindparam('username', type_=String) + text("'%'")))
conn.execute(s, username='wendy').fetchall()
--
2018-12-25 13:34:19,392 INFO sqlalchemy.engine.base.Engine SELECT users.fullname
FROM users LEFT OUTER JOIN addresses ON users.id = addresses.user_id
2018-12-25 13:34:19,392 INFO sqlalchemy.engine.base.Engine ()
[('Jack Jones',), ('Jack Jones',), ('Wendy Williams',), ('Wendy Williams',)]
バインドした変数は複数回使用できる。 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18s = select([users, addresses]).\
where(
or_(
users.c.name.like(
bindparam('name', type_=String) + text("'%'")),
addresses.c.email_address.like(
bindparam('name', type_=String) + text("'@%'"))
)
).\
select_from(users.outerjoin(addresses)).\
order_by(addresses.c.id)
conn.execute(s, name='jack').fetchall()
--
2018-12-25 13:43:43,880 INFO sqlalchemy.engine.base.Engine SELECT users.id, users.name, users.fullname, addresses.id, addresses.user_id, addresses.email_address
FROM users LEFT OUTER JOIN addresses ON users.id = addresses.user_id
WHERE users.name LIKE ? || '%' OR addresses.email_address LIKE ? || '@%' ORDER BY addresses.id
2018-12-25 13:43:43,880 INFO sqlalchemy.engine.base.Engine ('jack', 'jack')
[(1, 'jack', 'Jack Jones', 1, 1, 'jack@yahoo.com'), (1, 'jack', 'Jack Jones', 2, 1, 'jack@msn.com')]
1 | stmt = users.update().\ |
1 | stmt = users.update().\ |
Flask on Dockerのブログ と同様にDockerfileを作り、ビルドする。
ファイルを作成
1 | $ mkdir -p ~/Sources/docker_flask/sqlalchemy |
ビルド
1 | $ sudo docker build . -t dobachi/flask_sqlalchemy:1.0 |
1 | $ mkdir apps |
シェルを起動する。
1 | $ sudo docker run -it --rm -p 5000:5000 -v $(pwd)/apps:/usr/local/apps -e "FLASK_APP=app.py" -w /usr/local/apps -e "LC_ALL=C.UTF-8" -e "LANG=UTF-8" dobachi/flask_sqlalchemy:1.0 /bin/bash |
シェル内で動作確認。テーブルを作ってレコードを生成。
1 | >>> from app import db |
sqlite3コマンドで接続して内容を確認。
1 | root@a5d5ee81df78:/usr/local/apps# apt install sqlite3 |
上記と同様の流れをアプリから動作確認する。 Dockerイメージは上記で作ったものをベースとする。
ここでは/registにアクセスすると、登録画面が出て、 登録するとリスト(/list)が表示されるアプリを作成する。
1 | $ mkdir -p ~/Sources/docker_flask/sqlalchemy_app |
1 | $ sudo docker run -it --rm -p 5000:5000 -v $(pwd)/apps:/usr/local/apps -e "FLASK_APP=app.py" -w /usr/local/apps -e "LC_ALL=C.UTF-8" -e "LANG=UTF-8" dobachi/flask_sqlalchemy:1.0 flask run --host 0.0.0.0 |
なお、上記の実装はエラーハンドリング等を一切実施していないので 例えば同じユーザ名、メールアドレスで登録しようとすると例外が生じる。
tmuxを使ってコピーするとき、矩形選択したいときがある。 矩形選択にも言及のあるブログ
にも記載あるが、 <prefix> + [
でコピーモードに入った後、
該当箇所まで移動し、スペースキーを押して選択開始、その後 v
を押すと矩形選択になる。 (初期状態では、行選択になっているはず)
後からまとめてignoreする方法 の通りで問題ない。
GitHubのgitignoreファイルの雛形 からダウンロード。
Pythonの例
1 | $ cd <レポジトリ> |
必要に応じて既存の.gitignoreとマージしたり、mvして.gitignoreとしたり。
1 | $ mv Python.gitignore .gitignore |
コミット。
1 | $ git add .gitignore |
すでにコミットしてしまったファイルがあればまとめて削除。
1 | $ git rm --cached `git ls-files --full-name -i --exclude-from=.gitignore` |
flask-adminのドキュメント を見ながら進める。 またFlask on Dockerのブログ で作成したDockerイメージを使って環境を作る。
1 | $ mkdir -p ~/Sources/docker_flask/docker_admin |
1 | $ sudo docker build . -t dobachi/flask_admin:1.0 |
1 | $ mkdir apps |
基本的には Flask込みのDockerイメージを作る方法のブログ で記載された内容で問題ない。 自身の環境向けにアレンジは必要。
Dockerfileは Flask込みのDockerイメージを作る方法のブログ の通り。
1 | $ mkdir -p ~/Sources/docker_flask/simple |
ビルドコマンドは自分の環境に合わせた。
1 | $ sudo docker build . -t dobachi/flask:1.0 |
インタラクティブにつなげる例も自分の環境に合わせた。
1 | $ docker run -it --rm dobachi/flask:1.0 /bin/bash |
自分の環境に合わせた。 Flask込みのDockerイメージを作る方法のブログ
では、
/bin/bashを起動してから、python3 <アプリ >としていたが、
ここでは直接指定して実行することにした。
1 | $ mkdir apps |
なお、もともとの Flask込みのDockerイメージを作る方法のブログ では、以下のようにPythonコマンドから直接実行するように記載されていたが、 今回は Flask公式 に従い、FlaskのCLIを用いることとした。
1 | sudo docker run -it --rm -p 5000:5000 -v $(pwd)/apps:/usr/local/apps dobachi/flask:1.0 python3 /usr/local/apps/app.py |
その際、手元の環境ではLANG等の事情により、いくつか環境変数を設定しないとエラーを吐いたので、 上記のようなコマンドになった。
上記で作ったDockerイメージを流用する。
1 | $ mkdir -p ~/Sources/docker_flask/getting_started |
1 | $ sudo docker run -it --rm -p 5000:5000 -v $(pwd)/apps:/usr/local/apps -e "FLASK_APP=app.py" -w /usr/local/apps -e "LC_ALL=C.UTF-8" -e "LANG=UTF-8" dobachi/flask:1.0 flask run --host 0.0.0.0 |
上記で作ったDockerイメージを流用する。
1 | $ mkdir -p ~/Sources/docker_flask/form |
1 | $ sudo docker run -it --rm -p 5000:5000 -v $(pwd)/apps:/usr/local/apps -e "FLASK_APP=app.py" -w /usr/local/apps -e "LC_ALL=C.UTF-8" -e "LANG=UTF-8" dobachi/flask:1.0 flask run --host 0.0.0.0 |
上記で作ったDockerイメージを流用する。
1 | $ mkdir -p ~/Sources/docker_flask/file_upload |
1 | $ sudo docker run -it --rm -p 5000:5000 -v $(pwd)/apps:/usr/local/apps -e "FLASK_APP=app.py" -w /usr/local/apps -e "LC_ALL=C.UTF-8" -e "LANG=UTF-8" dobachi/flask:1.0 flask run --host 0.0.0.0 |
上記で作ったDockerイメージを流用する。
1 | $ mkdir -p ~/Sources/docker_flask/cookie |
1 | $ sudo docker run -it --rm -p 5000:5000 -v $(pwd)/apps:/usr/local/apps -e "FLASK_APP=app.py" -w /usr/local/apps -e "LC_ALL=C.UTF-8" -e "LANG=UTF-8" dobachi/flask:1.0 flask run --host 0.0.0.0 |
上記で作ったDockerイメージを流用する。
1 | $ mkdir -p ~/Sources/docker_flask/logging |
1 | $ sudo docker run -it --rm -p 5000:5000 -v $(pwd)/apps:/usr/local/apps -e "FLASK_APP=app.py" -w /usr/local/apps -e "LC_ALL=C.UTF-8" -e "LANG=UTF-8" dobachi/flask:1.0 flask run --host 0.0.0.0 |
基本的には、 DockerコンテナでFlaskを起動し, JSONデータのPOSTとGET の通り。
dockerfileを作る。
1 | $ mkdir -p ~/Sources/docker_flask/post_json |
アプリを作る。
1 | $ cat << EOF > reply.py |
ビルドする。
1 | $ sudo docker build . -t dobachi/flask_json:1.0 |
ポート5000で起動する。
1 | $ sudo docker run --rm -p 5000:5000 -it dobachi/flaskjson:1.0 |
動作確認する。
1 | $ curl http://localhost:5000/reply -X POST -H "Content-Type: application/json" -d '{"keyword": "Keffia"}' |
gitHub: uwsgi-nginx-flask-docker を参考にする。 gitHub: uwsgi-nginx-flask-dockerのクイックスタート を見ながら試す。
1 | $ mkdir -p ~/Sources/docker_flask/nginx |
1 | $ cat << EOF > Dockerfile |
1 | $ sudo docker build -t dobachi/nginx-flask:1.0 . |
1 | $ sudo docker run --rm -it -p 8080:80 dobachi/nginx-flask:1.0 |
gitHub: uwsgi-nginx-flask-dockerのSPA を参考に進める。
1 | $ mkdir -p ~/Sources/docker_flask/nginx_spa |
1 | $ mkdir app/static |
1 | $ sudo docker build -t dobachi/nginx-flask-spa:1.0 . |
1 | $ sudo docker run --rm -it -p 8080:80 dobachi/nginx-flask-spa:1.0 |
gitHub: 構造的なプロジェクトの例 に記載の例を示す。 example-flask-package-python3.7.zip をダウンロードしてビルドしてみる。
1 | $ mkdir -p ~/Sources/docker_flask/ |
1 | $ sudo docker build -t dobachi/nginx-flask-package:1.0 . |
1 | $ sudo docker run --rm -it -p 8080:80 dobachi/nginx-flask-package:1.0 |
apiを追加する。
ファイルを修正 1
2
3$ cat example-flask-package-python3.7/app/app/api/api.py
from .endpoints import user
from .endpoints import get_ip
ファイルを追加 1
2
3
4
5
6
7
8
9
10
11$ cat example-flask-package-python3.7/app/app/api/endpoints/get_ip.py
from flask import request
from flask import jsonify
from ..utils import senseless_print
from ...main import app
@app.route("/get_ip", methods=["GET"])
def get_ip():
return jsonify({'ip': request.remote_addr}), 200
ビルドし、実行して、/get_ipにアクセスすると、接続元のIPアドレスが表示される。
flask
+ NginxでのSSL対応に関する記事 に記載された方法で試す。
また上記で使ったexample-flask-package-python3.7の例を用いてみる。
まずDockerfileを以下のように変更した。
1 | $ cat Dockerfile |
main.pyを以下のように修正し、アドホックなSSL対応を試せるようにする。
1 | $ cat app/app/main.py |
以上の修正を加えた上で、Dockerイメージをビルドし実行した。
1 | $ sudo docker build -t dobachi/nginx-flask-package:1.0 . |
gitHub: uwsgi-nginx-flask-dockerのテクニカル詳細 で書かれている通り。 以下の役割分担。
またアプリはFlaskで書かれていることを前提とし、
プロセスはSupervisordで管理される。
アプリはコンテナ内の/app以下に配備されることを前提とし、その中にとりあえずは動くuwsgi.iniも含まれる。
そのため、Dockerfile内でuwsgi.iniを上書きさせるようにして用いることを想定しているようだ。
以下のように/bin/bashを起動して確認した。
1 | $ sudo docker run --rm -it -p 8080:80 dobachi/nginx-flask-package:1.0 /bin/bash |
/etc/supervisor/conf.d/supervisord.confを確認する。
1 | # cat /etc/supervisor/conf.d/supervisord.conf |
uwsgiとnginxを起動させていることがわかる。
続いて、nginxの設定において、uwsgiと連携しているのを設定している箇所を確認。
1 | # cat /etc/nginx/conf.d/nginx.conf |
uwsgiでは、/appディレクトリ以下のuwsgi.iniと/etc/uwsgi/uwsgi.iniの両方を確認するようだ。
1 | # cat /etc/uwsgi/uwsgi.ini |
1 | # cat /app/uwsgi.ini |
ここでは気になったことを記しておく。
公式GitHubのREADMEには、 Use in python or scala という項目があり、 そこには以下のような記述がある。
1 | PixieDust lets you bring robust Python visualization options to your Scala notebooks. |
1 | Scala Bridge. Use Scala directly in your Python notebook. Variables are automatically transfered from Python to Scala and vice-versa. Learn more. |
1 | Spark progress monitor. Track the status of your Spark job. No more waiting in the dark. Notebook users can now see how a cell's code is running behind the scenes. |
カーネルを追加することで、ユーザが自身の環境に依存するライブラリ(Sparkなど)をインストールしなくても 簡単に使えるようになっているようだ? ★要確認
まずは、公式ウェブサイトのインストール手順 を読みつつ、 Qiitaの紹介ブログ を読みながら、軽く試してみることにした。 Anacondaを使っているものとし、Condaで環境を作る。
1 | $ conda create -n PixieDustExample python=3.5 jupyter |
また 公式ウェブサイトのインストール手順 には、以下のような記述があり、 Pythonは2.7もしくは3.5が良いようだ。
1 | Note PixieDust supports both Python 2.7 and Python 3.5. |
pipでpixiedustを探すと、エコシステムが形成されているようだった。
1 | $ pip search pixiedust |
そのまま入れることとする。依存関係でいくつかライブラリが入る。
1 | $ pip install pixiedust |
エラー。
1 | twisted 18.7.0 requires PyHamcrest>=1.9.0, which is not installed. |
condaでインストールする。
1 | $ conda install PyHamcrest |
PixieDust向けのJupyterカーネルをインストールする。 なお、本手順の前に、JDKがインストールされ、JAVA_HOMEがインストールされていることを前提とする。
1 | $ jupyter pixiedust install |
エラー。
1 | $ jupyter pixiedust install |
Sparkのダウンロードで失敗しているようだ。
軽くデバッグしたところ、URLとして渡されているのは、
http://apache.claz.org/spark/spark-2.3.0/spark-2.3.0-bin-hadoop2.7.tgzのようだった。
確かに、リンク切れ?のようだった。いったん、Spark公式サイトのダウンロードページで
指定されるURLからダウンロードするよう、createKernel.pyを修正して実行することにした。
なお、上記手順により、指定したディレクトリにSparkとScalaがインストールされる。 成功すると、以下のようなメッセージが見られる。
1 | (snip) |
なお、そのまま実行したら、以下のライブラリが足りないと言われたので予めインストールすることとする。 (bokeh、seabornはついでにインストール。インストールしないとRendererの選択肢が出てこない)
1 | $ conda install matplotlib pandas PyYaml bokeh seaborn |
さて、 Qiitaの紹介ブログ では、PixieDustのカーネルインストール時に一緒にインストールされるノートブックではなく、 日本語でわかりやすい紹介記事が書かれているが、ここではいったん、上記のインストール時のメッセージに従うこととする。
Jupyterを起動
1 | $ jupyter notebook /home/dobachi/pixiedust/notebooks |
あとは、適当にノートブックを眺めて実行する。
Loading External Data節でD3
Rendererを試したところ、以下のようなエラー。
1 | Object of type ndarray is not JSON serializable |
Adobe Readerのインストール手順を記したブログ に記載の手順で基本的には問題ない。
1 | $ sudo apt install libxml2:i386 gdebi-core |
ファイラから開くときのデフォルトアプリの設定の参考にした情報 を参考に設定する。
1 | $ sudo vim /etc/gnome/defaults.list |
変更内容は以下の通り。
1 | --- /etc/gnome/defaults.list.2018121101 2018-12-11 22:42:03.566334756 +0900 |