tanamonの稀に良く書く日記

KEEP CALM AND DRINK BEER

住所.jpのMySQLデータがインポートできない件

住所情報のデータベースを探したら住所.jpというのを見つけた。

jusyo.jp

お知らせが2010年からあるので、けっこう昔からデータ提供しているらしい。

しかし、試しに使ってみようと思ったらインポートエラー。

$ mysql -u root -p sandbox -p < zenkoku.sql
Enter password:
ERROR 1366 (HY000) at line 3: Incorrect integer value: '' for column 'new_id' at row 1

ファイル2行目にあるcreate tableの中で以下の部分が間違っていた。

`new_id` int(11) default NULL

型がintなのにinsert文では空文字を入れてる。

このnew_idというカラムは、

住所が廃止された場合(7)delete_flgを[ 1 ]とし、移行先の(1)idが判明していればこの項目に記載します。(現在未使用です)

住所データSQL - 仕様【住所.jp】

ドキュメントに未使用とあるので、手っ取り早く文字列型にしておく。

`new_id` varchar(11) default NULL

これでインポートできます。

pyenvにAnaconda系バージョンを入れるとPipenvの初期化に失敗する

LegacyVersion('anaconda3-5.3.1')というエラー

% pipenv --three
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/pipenv/vendor/pythonfinder/models/pyenv.py", line 53, in get_versions
    version = PythonVersion.parse(p.name)
  File "/usr/local/lib/python3.7/site-packages/pipenv/vendor/pythonfinder/models/python.py", line 119, in parse
    raise ValueError("Not a valid python version: %r" % version)
ValueError: Not a valid python version: <LegacyVersion('anaconda3-5.3.1')>
...

こんなエラーが出た。LegacyVersion('anaconda3-5.3.1')らしい。

Anaconda installer archiveによると2018-11-19リリース版。なのにレガシー。

そもそもAnacondaは使ってない

% python --version
3.7.3

% which python
/Users/user/.anyenv/envs/pyenv/shims/python

デフォルトは現在最新の3.7.3を有効にしている。anacondaは使ってない。

このanaconda、どこから来たのか。

複数環境をスイッチさせてる中にanacondaを入れるとよくないという話を聞くが、こういうことが起こるからだろうか。

アナコンダは気質に悪評があり、さらにオオアナコンダは大きすぎるので、ボアと比べるとペットとしては人気がない。

アナコンダ - Wikipedia

ペットでもアナコンダは人気無いようですし(関係ない)。

pipenv --python `which python`で動く?

手探りしてたら、pipenvの初期化でパスが通ったpythonのバージョンを指定したら通った。

% pipenv --python `which python`
Creating a virtualenv for this project…
Pipfile: /Users/user/Documents/workspace/sandobox/Pipfile
Using /Users/user/.anyenv/envs/pyenv/shims/python (3.7.0) to create virtualenv…
⠏Running virtualenv with interpreter /Users/user/.anyenv/envs/pyenv/shims/python
Using base prefix '/Users/user/.anyenv/envs/pyenv/versions/anaconda3-5.3.1'
/usr/local/lib/python3.7/site-packages/virtualenv.py:1041: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
  import imp
New python executable in /Users/user/Documents/workspace/sandobox/.venv/bin/python
Installing setuptools, pip, wheel...done.

Virtualenv location: /Users/user/Documents/workspace/sandobox/.venv
Creating a Pipfile for this project…

この指定で動くのも、また謎すぎる。

Using base prefix '/Users/user/.anyenv/envs/pyenv/versions/anaconda3-5.3.1'というログが残ってるから、強引に置き換えて無理やり動かした感じがする。

やっぱり動かない

% pipenv shell
Warning: Your Pipfile requires python_version 3.7, but you are using None (/Users/user/D/w/s/.venv/bin/python).
  $ pipenv --rm and rebuilding the virtual environment may resolve the issue.
  $ pipenv check will surely fail.
Launching subshell in virtual environment…
 . /Users/user/Documents/workspace/sandbox/.venv/bin/activate
%  . /Users/user/Documents/workspace/sandbox/.venv/bin/activate

pipenv shellをすると警告が出た。いちおう、shellには入れる。

(sandbox) % pipenv install requests
Warning: Your Pipfile requires python_version 3.7, but you are using None (/Users/user/D/w/s/.venv/bin/python).
  $ pipenv --rm and rebuilding the virtual environment may resolve the issue.
  $ pipenv check will surely fail.
Installing requests…
⠋
Error:  An error occurred while installing requests!
/bin/sh: /Users/user/Documents/workspace/sandbox/.venv/bin/pip: /Users/user/Documents/workspace/proxy/.venv/bin/python: bad interpreter: No such file or directory

installが使えないので、やはり正常にインストールされてなかった。

Anacondaを消してみる

Anacondaを消して、再度pipenvしてみる。

% pyenv uninstall anaconda anaconda3-5.3.1
pyenv: remove /Users/user/.anyenv/envs/pyenv/versions/anaconda3-5.3.1? y

% pyenv versions
  system
* 3.7.3 (set by /Users/user/.anyenv/envs/pyenv/version)

% rm .venv

% pipenv --three
Creating a virtualenv for this project…
Pipfile: /Users/user/Documents/workspace/sandbox/Pipfile
Using /Users/user/.anyenv/envs/pyenv/shims/python3 (3.7.3) to create virtualenv…
⠧Running virtualenv with interpreter /Users/user/.anyenv/envs/pyenv/shims/python3
Using base prefix '/Users/user/.anyenv/envs/pyenv/versions/3.7.3'
/usr/local/lib/python3.7/site-packages/virtualenv.py:1041: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
  import imp
New python executable in /Users/user/Documents/workspace/sandbox/.venv/bin/python3
Also creating executable in /Users/user/Documents/workspace/sandbox/.venv/bin/python
Installing setuptools, pip, wheel...done.

Virtualenv location: /Users/user/Documents/workspace/sandbox/.venv

動いた。

Anacondaが最新だったら

Anacondaが古いからダメなのかもしれないと思い、最新のAnacondaを入れて、再度pipenvをしてみる。

% pyenv install anaconda3-2019.03
Downloading Anaconda3-2019.03-MacOSX-x86_64.sh...
-> https://repo.continuum.io/archive/Anaconda3-2019.03-MacOSX-x86_64.sh
Installing Anaconda3-2019.03-MacOSX-x86_64...
Installed Anaconda3-2019.03-MacOSX-x86_64 to /Users/user/.anyenv/envs/pyenv/versions/anaconda3-2019.03

% pyenv versions
  system
* 3.7.3 (set by /Users/user/.anyenv/envs/pyenv/version)
  anaconda3-2019.03

% pipenv --three
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/pipenv/vendor/pythonfinder/models/pyenv.py", line 53, in get_versions
    version = PythonVersion.parse(p.name)
  File "/usr/local/lib/python3.7/site-packages/pipenv/vendor/pythonfinder/models/python.py", line 119, in parse
    raise ValueError("Not a valid python version: %r" % version)
ValueError: Not a valid python version: <LegacyVersion('anaconda3-2019.03')>
...

やはりエラーになる。LegacyVersionって、それ現在の最新版ですよ!

どうやらpyenvにAnacondaを混ぜるとよくないらしい。

ビルドインのpipenvを使わなければ動く

pyenvで入れたPythonにPipenvをインストールすれば動く。

% which pipenv
/usr/local/bin/pipenv

% pip install pipenv
...

% which pipenv
/Users/user/.anyenv/envs/pyenv/shims/pipenv

% pipenv --three
Creating a virtualenv for this project…
Pipfile: /Users/user/Documents/workspace/sandbox/Pipfile
Using /Users/user/.anyenv/envs/pyenv/versions/3.7.3/bin/python3 (3.7.3) to create virtualenv…
⠧ Creating virtual environment...Already using interpreter /Users/user/.anyenv/envs/pyenv/versions/3.7.3/bin/python3
Using base prefix '/Users/user/.anyenv/envs/pyenv/versions/3.7.3'
New python executable in /Users/user/Documents/workspace/sandbox/.venv/bin/python3
Also creating executable in /Users/user/Documents/workspace/sandbox/.venv/bin/python
Installing setuptools, pip, wheel...
done.
Running virtualenv with interpreter /Users/user/.anyenv/envs/pyenv/versions/3.7.3/bin/python3

✔ Successfully created virtual environment!
Virtualenv location: /Users/user/Documents/workspace/sandbox/.venv

今までPipenvはMacのビルドイン版を使ってたけど、こっちのほうがいいのかな。

エラーログ(検索用)

% pipenv --three
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/pipenv/vendor/pythonfinder/models/pyenv.py", line 53, in get_versions
    version = PythonVersion.parse(p.name)
  File "/usr/local/lib/python3.7/site-packages/pipenv/vendor/pythonfinder/models/python.py", line 119, in parse
    raise ValueError("Not a valid python version: %r" % version)
ValueError: Not a valid python version: <LegacyVersion('anaconda3-5.3.1')>

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/bin/pipenv", line 11, in <module>
    sys.exit(cli())
  File "/usr/local/lib/python3.7/site-packages/pipenv/vendor/click/core.py", line 764, in __call__
    return self.main(*args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/pipenv/vendor/click/core.py", line 717, in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python3.7/site-packages/pipenv/vendor/click/core.py", line 1114, in invoke
    return Command.invoke(self, ctx)
  File "/usr/local/lib/python3.7/site-packages/pipenv/vendor/click/core.py", line 956, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python3.7/site-packages/pipenv/vendor/click/core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/pipenv/vendor/click/decorators.py", line 64, in new_func
    return ctx.invoke(f, obj, *args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/pipenv/vendor/click/core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/pipenv/vendor/click/decorators.py", line 17, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/pipenv/cli/command.py", line 203, in cli
    clear=state.clear,
  File "/usr/local/lib/python3.7/site-packages/pipenv/core.py", line 565, in ensure_project
    pypi_mirror=pypi_mirror,
  File "/usr/local/lib/python3.7/site-packages/pipenv/core.py", line 488, in ensure_virtualenv
    python = ensure_python(three=three, python=python)
  File "/usr/local/lib/python3.7/site-packages/pipenv/core.py", line 401, in ensure_python
    path_to_python = find_a_system_python(python)
  File "/usr/local/lib/python3.7/site-packages/pipenv/core.py", line 364, in find_a_system_python
    python_entry = finder.find_python_version(line)
  File "/usr/local/lib/python3.7/site-packages/pipenv/vendor/pythonfinder/pythonfinder.py", line 90, in find_python_version
    return self.system_path.find_python_version(
  File "/usr/local/lib/python3.7/site-packages/pipenv/vendor/pythonfinder/pythonfinder.py", line 44, in system_path
    ignore_unsupported=self.ignore_unsupported,
  File "/usr/local/lib/python3.7/site-packages/pipenv/vendor/pythonfinder/models/path.py", line 309, in create
    ignore_unsupported=ignore_unsupported,
  File "<attrs generated init 21cfbcaf749d3af30eb10d5110d156423170deac>", line 37, in __init__
  File "/usr/local/lib/python3.7/site-packages/pipenv/vendor/pythonfinder/models/path.py", line 102, in __attrs_post_init__
    self._setup_pyenv()
  File "/usr/local/lib/python3.7/site-packages/pipenv/vendor/pythonfinder/models/path.py", line 133, in _setup_pyenv
    self.pyenv_finder = PyenvFinder.create(root=PYENV_ROOT, ignore_unsupported=self.ignore_unsupported)
  File "/usr/local/lib/python3.7/site-packages/pipenv/vendor/pythonfinder/models/pyenv.py", line 98, in create
    return cls(root=root, ignore_unsupported=ignore_unsupported)
  File "<attrs generated init e2de76c84a062f4c9c55ad2f5f11c1f2c8b33679>", line 7, in __init__
  File "/usr/local/lib/python3.7/site-packages/pipenv/vendor/pythonfinder/models/pyenv.py", line 57, in get_versions
    version = self.version_from_bin_dir(bin_dir)
  File "/usr/local/lib/python3.7/site-packages/pipenv/vendor/pythonfinder/models/pyenv.py", line 36, in version_from_bin_dir
    version = get_python_version(py.as_posix())
  File "/usr/local/lib/python3.7/site-packages/pipenv/vendor/pythonfinder/utils.py", line 41, in get_python_version
    raise InvalidPythonVersion("%s is not a valid python path" % path)
pipenv.vendor.pythonfinder.exceptions.InvalidPythonVersion: /Users/user/.anyenv/envs/pyenv/versions/anaconda3-5.3.1/bin/anaconda is not a valid python path

MySQL5.6以降では時刻系の型に精度未満の値を入れると四捨五入される

昔の記憶のまま使ってたらハマった話。

先に検証用のテーブルを作る。

time, datetime, timestampそれぞれの型で、デフォルト精度(カッコなし)とマイクロ秒精度(6指定)のカラムを加えておきます。

mysql> set sql_mode = '';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> create table test(
    ->   id int unsigned not null auto_increment,
    ->   test_time time,
    ->   test_datetime datetime,
    ->   test_timestamp timestamp,
    ->   test_time_full time(6),
    ->   test_datetime_full datetime(6),
    ->   test_timestamp_full timestamp(6),
    ->   primary key (id)
    -> );
Query OK, 0 rows affected (0.04 sec)

set sql_mode='';は試したCloudSQL環境でエラーになったので足していますが、他の環境では不要かも。

このテーブルにデータを入れて確認してみます。

mysql> insert into test (
    ->     test_time, test_datetime, test_timestamp,
    ->     test_time_full, test_datetime_full, test_timestamp_full
    -> )
    -> values (
    ->     '23:59:59.999999', '2019/12/31 23:59:59.999999', '2019/12/31 23:59:59.999999',
    ->     '23:59:59.999999', '2019/12/31 23:59:59.999999', '2019/12/31 23:59:59.999999'
    -> );
Query OK, 1 row affected (0.02 sec)
mysql> select * from test \G
*************************** 1. row ***************************
                 id: 1
          test_time: 24:00:00
      test_datetime: 2020-01-01 00:00:00
     test_timestamp: 2020-01-01 00:00:00
     test_time_full: 23:59:59.999999
 test_datetime_full: 2019-12-31 23:59:59.999999
test_timestamp_full: 2019-12-31 23:59:59.999999
1 row in set (0.00 sec)

結果は23:59:59となる(秒未満は切り捨てられる)と思っていましたが、そうではなく繰り上げられて24:00:00になっています。 さらに日付付きだと翌年になっています。

これは予想外。なぜだろうか。

MySQLはたまにしか使わないけど、昔の記憶を辿ってもこんな処理にはなってなかったと思う。

検索するとMySQL5.5と5.6で挙動が変わると書いてあった。

公式ドキュメントも確認します。

MySQL 5.6.4 より前では、時間値で小数秒部分が許可されているインスタンスは制限されています。 (略) ただし、MySQL は時間データ型のカラムに値を格納するときに、小数部を破棄し、それを格納しません。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 11.3.6 時間値での小数秒

MySQL 5.6.3までは、破棄、つまり切り捨てが行われるようです。

MySQL 5.6.4 以降では、マイクロ秒 (6 桁) までの精度を持つ TIME、DATETIME、および TIMESTAMP 値に対して小数秒のサポートを拡張しています。

小数秒部分を持つ TIME、DATE、または TIMESTAMP 値を同じ型のカラムに挿入するが、小数部の桁数が少ない場合、次の例に示すように丸めが行われます。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 11.3.6 時間値での小数秒

MySQL 5.6.4以降は、丸め、つまり四捨五入が行われるようです。

MySQL 5.6系のGeneral Availability(正式)版は5.6.10からなので、実質的に5.5系は切り捨て、5.6系は四捨五入という理解で良さそうです。

さらに、

0 の値は、小数部がないことを表します。省略した場合、デフォルトの精度は 0 です。(これは、以前の MySQL バージョンと互換性を保つため、標準 SQL のデフォルトである 6 とは異なっています。)

MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.20.4 丸め動作

という記述もありました。

標準とは異なると書いてある。なるほど、地雷を踏み抜いてたわ。

トラブルが起きたコード

もともと、精度指定をしないtimestamp型にある期間の終了日時を入れるテーブルがあった。

Python実装だったので以下のようなコード。

>>> import arrow
>>> arrow.get().ceil('day').datetime
datetime.datetime(2019, 7, 4, 23, 59, 59, 999999, tzinfo=tzutc())

終了時間を雑にceilで上げたものをSQLで入れたら、翌日00:00:00にされていた。

で、別の場所では日にちだけの精度でwhereで絞ってたので翌日のデータが混じるというのが起きたトラブルでした。

データの修正

テーブル定義を直したら、すでに入ってる間違ったデータもなんとかしたい。

mysql> select addtime('2020-01-01 00:00:00', '-.000001');
+--------------------------------------------+
| addtime('2020-01-01 00:00:00', '-.000001') |
+--------------------------------------------+
| 2019-12-31 23:59:59.999999                 |
+--------------------------------------------+
1 row in set (0.02 sec)

addtimeで-1マイクロ秒を足してあげればよい。

一括で更新する場合には、whereにmicrosecond()を使うと、ずれたデータだけ指定できる。今回の場合では= 0で比較しておけばよい。

mysql> select microsecond('2020-01-01 00:00:00');
+------------------------------------+
| microsecond('2020-01-01 00:00:00') |
+------------------------------------+
|                                  0 |
+------------------------------------+
1 row in set (0.00 sec)

mysql> select microsecond('2019-12-31 23:59:59.999999');
+-------------------------------------------+
| microsecond('2019-12-31 23:59:59.999999') |
+-------------------------------------------+
|                                    999999 |
+-------------------------------------------+
1 row in set (0.00 sec)

CloudSQLでcreate tableが失敗する理由

ERROR 1067 (42000): Invalid default value for 'test_timestamp_full'

このエラーが出ます。

原因はsql_modeにNO_ZERO_DATEが指定されているせいです。

MySQL 5.6.17以降ではNO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZEROは非推奨になっています。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 5.1.7 サーバー SQL モード

ですが、Cloud SQLは5.6.17以降でもこれらが有効になっているようです。

mysql> select version();
+-------------------+
| version()         |
+-------------------+
| 5.7.14-google-log |
+-------------------+
1 row in set (0.04 sec)
mysql> SELECT @@GLOBAL.sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@GLOBAL.sql_mode                                                                                                                         |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+

さらに、timestampが2つ以上あって、両方ともdefault nullの場合に失敗します。

なので、以下のSQLのようにdefault値を設定すればエラーが解消されます。

mysql> create table test(
    ->   id int unsigned not null auto_increment,
    ->   test_time time,
    ->   test_datetime datetime,
    ->   test_timestamp timestamp,
    ->   test_time_full time(6),
    ->   test_datetime_full datetime(6),
    ->   test_timestamp_full timestamp(6) default current_timestamp(6),
    ->   primary key (id)
    -> );
Query OK, 0 rows affected (0.03 sec)

しかし、以下のSQLは失敗します。

mysql> create table test(
    ->   id int unsigned not null auto_increment,
    ->   test_time time,
    ->   test_datetime datetime,
    ->   test_timestamp timestamp default current_timestamp,
    ->   test_time_full time(6),
    ->   test_datetime_full datetime(6),
    ->   test_timestamp_full timestamp(6),
    ->   primary key (id)
    -> );
ERROR 1067 (42000): Invalid default value for 'test_timestamp_full'

この理由はよくわからない。

MySQLでtimestampに桁数指定をする時にはcurrent_timestampにも桁数を付ける

今日、ハマったこと。

こんなテーブルがあったとする。

mysql> create table test(
    ->   id int unsigned not null auto_increment,
    ->   name varchar(100) not null,
    ->   last_modified timestamp not null default current_timestamp on update current_timestamp,
    ->   primary key (id)
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> insert into test(name) values('name1');
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+----+-------+---------------------+
| id | name  | last_modified       |
+----+-------+---------------------+
|  1 | name1 | 2019-07-02 22:54:52 |
+----+-------+---------------------+
1 row in set (0.00 sec)

ここで、last_modifiedをミリ秒以下の精度で持たせたくなったとする。

timestamp型にミリ秒以下を持たせたい場合はtimestamp(n)として、nに持たせたい桁数を渡せばいいらしい。 ミリ秒ならtimestamp(3)、マイクロ秒ならtimestamp(6)とすればよいようだ。 マイクロ秒にしてみる。

mysql> alter table test modify last_modified timestamp(6) not null default current_timestamp on update current_timestamp;
ERROR 1067 (42000): Invalid default value for 'last_modified'

しかしエラーになった。default valueがおかしいらしい。

ここで、元のテーブルがもっとややこしかったせいで原因特定までだいぶ遠回りしたけど、結論を書くとcurrent_timestampにも桁数が必要だった。

mysql> alter table test modify last_modified timestamp(6) not null default current_timestamp(6) on update current_timestamp(6);
Query OK, 1 row affected (0.04 sec)
Records: 1  Duplicates: 0  Warnings: 0

これが正しい。

ちなみに、公式ドキュメントにもちゃんと書いてあった。

TIMESTAMP または DATETIME カラム定義のいずれかの場所に明示的な小数秒精度値が含まれる場合、カラム定義全体で同じ値を使用する必要があります。次の場合は許可されます。

CREATE TABLE t1 ( ts TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) );

次の場合は許可されません。

CREATE TABLE t1 ( ts TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(3) );

MySQL :: MySQL 5.6 リファレンスマニュアル :: 11.3.5 TIMESTAMP および DATETIME の自動初期化および更新機能

ドキュメントはちゃんと読もうと思った。

浦添パルコシティの最新映画館で4DX / ScreenX / IMAXレーザーの3種類を体験してきた

読むのが面倒な人向けに、先に評価のまとめを載せておきます。

4DX

ScreenX

IMAXレーザー

IMAXレーザーはやばい。 県外の人にも「映画好きなら旅行ついでに寄ったらいいよ」と勧めたくなるレベル。

以下、本文。

はじめに、パルコシティがオープン

昨日(6月28日)、沖縄県浦添市にパルコシティがオープンしました。 県内最大規模の商業施設だそうです。 最大、と言い切らないあいまいさの理由は4月にライカムが増床したから。

総賃貸面積約7万8千平方メートルと、現在すでに県内最大規模の「ライカム」だが、サンエーとパルコが、浦添市西海岸に19年夏の開業を目指す大型商業施設も同規模を計画している。 沖縄“最大”は譲らない? イオンライカム、面積拡大でリニューアル パルコとサンエーの同規模施設を意識か

どちらも賃貸面積の比較でも同じ約7.8万㎡と公表されているから。 同率一位ということです。

ユナイテッド・シネマの映画館

大型店なのでいろんな店舗があるのですが、その中でも初進出ユナイテッド・シネマの映画館がすごいらしいとオープン前から話題でした。

しかし、ふだんはふつうの映画館(県内企業のスターシアターズ系列)でしか観てない私にはイマイチどこがすごいのかわからない。しかも3種類もあるらしい。

そんな中で、オープン記念なのか特別価格(安い)で少し古い映画を上映するという情報があり、せっかくなので3種類を体験してみることにしました。

ちなみに、思い立ったのは当日の朝6時台。 なぜか早起きしたので、ジョギングをしていた最中のことでした。

オープン渋滞

1日で3作映画を観るのはけっこう大変。 しかも全てで新しい体験をすることになるので、途中に程よい休憩が挟むという、自分への配慮をしたスケジュールを組むことにします。 午前中に1本、午後に2本とするのがまあ自然でしょう。

1本目の上映開始は09:30。 家からパルコシティまで混んでなければ15分で着く距離だし、4倍の1時間あれば着くだろうと思って08:30に家を出ます。

58号沿いの屋富祖のキャンプ・キンザー入口あたりまでは順調に10分程度で来れたけど、そこから先が渋滞で全く進まなくなる。 メイクマン手前の時点でぜったい上映時間に間に合わないと確信したので、開き直ってながら運転にならない程度に本を読みつつ時間を潰して待つ。

結局、渋滞でかかった時間は以下のとおり。

  • 08:40-09:15(35分) メイクマン手前の信号の左折まで
  • 09:15-10:19(64分) 牧港のさくもとから入った道と合流するT字路まで
  • 10:19-10:44(25分) そこから駐車するまで

合計で2時間超えの124分。つらい。

T字路から先は少しスピードが上がったので、ここがボトルネックだったみたいです。 那覇から行く場合でもさくもとから回り込んで行ったほうが早い気がします。

次からは、各設備について。

4DXについて

1本目は4DX。

4DX®とは、現在、映画業界で最も注目を集める、最新の<体感型(4D)>映画上映システムです。 モーションシートが、映画のシーンに完全にマッチした形で、前後&上下左右に<動き>、その衝撃を再現。 さらに、嵐等のシーンでは<水>が降り、<風>が吹きつけ、雷鳴に劇場全体が<フラッシュ>する他、映画のシーンを感情的に盛り上げる<香り>や、臨場感を演出する<煙り>など、様々なエモーショナルな特殊効果で、≪目で観るだけの映画≫から≪体全体で感じる映画≫の鑑賞へと魅力的に転換致します。 通常のシアターでは得ることができない特殊効果によって、映画の持つ臨場感=魅力を最大限開放することができる、アトラクション・スタイルの映画上映システムです。 新次元の4Dアトラクションシアター ユナイテッド・シネマ|シネプレックス

一般的に、座席が揺れたり・モクモクしたり・水が出たりするような体感型のことを4Dと呼ぶようです。 ディズニーランドのミクロアドベンチャー系ですね(古い)。

中でも香りは可能性を感じますね。 ゾンビ映画でゾンビが臭いとか、戦争映画で鉄臭いとか、恋愛映画で女子高生の匂いがすると話題のデオコの香りがしたりするんですかね。 これは可能性を感じますよ!

www.sankeibiz.jp

なお、画面が立体(3D)かどうかは関係ないようで、4DXの2D作品とか4DXの3D作品とか呼んだりするようです。 ややこしい。

4DXの感想

観たのは、ジュラシック・ワールド(3D)。

あの事件から22年後。ついに恐竜たちを集めたテーマパーク“ジュラシック・ワールド”がオープンした。毎日2万人もの来場者で溢れるパークに、2人の少年がやって来る。パークの運営責任者のクレアの甥たちのザックとグレイだ。パスを手にした2人は、お目付役の手を振り切ってパーク観光へ。一方、パークでは遺伝子操作で生み出したハイブリット恐竜のインドミナス・レックスを生み出していた。防護壁を破って逃走したインドミナスは、パークへと向かう。取り残された少年たちを救うため、クレアは専門家のオーウェンに助けを求める。  ジュラシック・ワールド

先に書いた渋滞のせいで後半からの入場。

係員の人には「揺れてない間を見計らってさっと座りましょう」的なことを言われたけど、揺れたりして危ないからホントは途中入場がダメな設備なような気がする。

席は中央寄りで予約したけど、さすがに中に入るのは気が引けたので端っこで。

座席の動きと風を使った、ヘリの浮遊感と横Gが特にいい感じだった。 乗り物系の映画や、今日から公開のスパイダーマンにはこういうのが向いていると思う。

一方で、モブキャラが銃を撃った反動みたいなのもモーションが伝わるんだけど、なんでそれがこちらに伝わるの?というのが気になった。 これは主観と客観の違いだと思うんだけど、普通は主人公たち以外のキャラクターと感情移入しないので、そこのモーションを観客に入れる必要は無いと思う。

水は3Dメガネが濡れるので3Dでは要らないと思った。 女子も化粧が落ちるとか気になるのではなどと考えてたら、終わった後にオフにするボタンがあるのに気づいた。 おそらく、始まる前に説明があったのだろう。

後半だけなので確証はないけど、泡・フラッシュ・香り・雪・嵐・熱風は無かったと思う。

4DXは、効果を決めるスタッフの力量次第で面白さが変わる部分が大きいのと、観る側がどの程度の体験をしたいかの好みの差がけっこうありそうという点で、なかなか調整が難しいんだろうなと思った。

私は、毎回何かの反応があるより、しばらく反応なくて忘れた頃にドーンと使われるほうが予想できなくていいのにと思った。 そろそろ来るぞ、まだ来ない、キター!、みたいな感じで。

要は、途中で忘れさせる時間が欲しい。そうでないと、飛んでいる恐竜がカメラの横を通り過ぎるたびに「また空気プシュプシュやるんだろ?」みたいな予測ができるようになってくるので、体験より苦痛が前面に出てきてしまう。この苦痛が続くと疲れるので、途中からでも終わった頃にはけっこう疲れた。渋滞が無くて最初から観てたらうんざりしてたかもしれない。

しかし、こういうチューニングの欠点は、対象作品が増えれば少しずつ良くなっていくものなので、観たのが最新作では無いという点で評価にどう入れるか少し悩む。設備の評価では無いし。 少なくとも、最近の4DX映画では悪くはなってないはずなので、今度は新作で体験してみようかなと思う。

3Dについては、チラチラしてる(フレームレート?が低い)から元からあんまり好きではないんだけど、そこを差し引いても4Dの効果と合わせると映像は3Dのほうが合ってると思う。4DXで2Dだと片手落ちに感じる。

ScreenXについて

2本目はScreenX。

「ScreenX」とは、次世代型映画上映システムとして世界的に注目を集めている、3面マルチプロジェクション・映画上映システムです。正面のスクリーンに加え、両側面(壁面)にも映像が投影され、270度の視界すべてで映画を鑑賞することができ、映画の世界に自分の感覚が没入していくような臨場感を体験することができます。 「ScreenX」で上映される映画は、シーンによって正面のみに映像が投影されるシーンと、両側面に映像が投影されるシーンがあります。 左右に広がる画面は映画のシーンにさらなる抑揚と臨場感をもたらす効果を生み出し、映画自体の持つポテンシャルを最大限に表現することを可能にしました。 ScreenX 視界の限界を超える270° 3画面ワイドオープンスクリーン - ユナイテッド・シネマ

ようはパノラマ。 仕組み上、3Dにはできないような気がする。

席は注意書きにもあるように、中央寄りで取ったほうがいいです。

※ScreenXは座席位置により、特に左右映像の視聴環境(見え方)が異なります。予めご了承ください。 ScreenX 視界の限界を超える270° 3画面ワイドオープンスクリーン - ユナイテッド・シネマ

ScreenXの感想

観たのは、ファンタスティック・ビーストと黒い魔法使いの誕生(2D)。

ニュートはホグワーツ魔法魔術学校出身で、魔法動物をこよなく愛するシャイでおっちょこちょいな魔法動物学者。魔法動物を守るため世界中を旅する彼がいつも持ち歩いているのは、中が無限に広がる不思議な魔法のトランク。その中には、ありとあらゆるユニークな魔法動物たちが。ある日ニュートは、捕らえられていた強大な敵・グリンデルバルドが逃げ出したことを知る。強大な力を持ち、人間界の転覆を企む“黒い魔法使い”を追って、ニュートたちは魔法動物たちとともにホグワーツから魔法界へと旅立つ。 ファンタスティック・ビーストと黒い魔法使いの誕生

よく知らないで観た。 しかも2作目だったので話の筋がよくわからない。なぜ選んだのか。

部屋の作りは通常と同じなので左右の画面は90度傾いていて、左右の画面は中央のものより暗い。 左右にも画面があるから没入感が上がるのかなと思っていたけど、そういう効果はあまり無かった。

そして、左右の画面を使わない時がけっこうある。使うのは作品中30分だけで、使ってない時間のほうが長い。

※3面スクリーンで上映されるのは本編中約30分です。最も効果的なシーンでお楽しみいただけます。 ScreenX 視界の限界を超える270° 3画面ワイドオープンスクリーン - ユナイテッド・シネマ

今後設備が進化したら面白そうだけど、現時点のこれに追加料金は無いなと思った。 中央と左右のつなぎ目を無くして、丸くラウンドさせるか、せめて台形にしてほしい。

ちなみに、音響はあんまり良くなかった。

IMAXレーザーについて

最後はIMAXレーザー。

独創的な発想と優れたテクノロジーで映画鑑賞の可能性を広げてきたIMAX®から、 革新的な4Kレーザー投影システムと最新の12Chサウンドシステムを採用したIMAX ®レーザーが誕生します。 IMAX®ならでは大スクーンに映し出される鮮明な映像とパワフルな高音質サウンド。 これらが生み出すかつてない臨場感が客席を包み、観る者を映画の中へと導きます。 IMAXレーザー - IMAXで“感動”を超える“体験”を! - ユナイテッド・シネマ UNITED CINEMAS

日本ではここ浦添パルコシティにしか無いという、IMAXの最新設備。

従来型のIMAXの正統進化版。つよいIMAX

IMAXレーザーの感想

観たのは、ボヘミアン・ラプソディ(2D)。

1970年のロンドン。フレディ・マーキュリーは、ライブハウスで見かけたバンドのボーカルが脱退したことを知り、自らを売り込む。ギタリストのブライアン・メイとドラマーのロジャー・テイラー、それに1年後に加わったベーシストのジョン・ディーコンを加え、そのバンドは“クイーン”としてスタートする。やがてクイーンは数々のヒット曲を放ち、世界的なバンドになるが、フレディは自分のセクシャリティに悩んでいた。メンバーとの不和を乗り越えたフレディは、1985年のライヴ・エイドのステージに立つ。 ボヘミアン・ラプソディ

ボヘミアン・ラプソディは、公開時になんか観るタイミング逃したら、予想以上に流行って行きづらくなって観てなかったので、今回観れたのはちょうどよかった。

もう映像も音も最高だった。

映画が始まる前にIMAXの体験映像が流れるんだけど、その音響を聞いた時に「これはもう間違いないわ」と確信できた。 よくある低音重視の、いわゆる爆音とかではなく、純粋に音のバランスがいい。

とくに、後半のWe Will Rock Youの制作シーンのドン・ドン・チャとか魂に来る音がしていた。


Queen - We Will Rock You (Official Video)

(引用しておいてあれだけど、家で改めて聞いても感動しない)

それまで長時間かけて音の良さを実感したあとだったのに、そこからさらに上の体験を持ってくるのホントすごい。 映像も年代ごとに少しずつ鮮明度が上がるエフェクト加工しているようだけど、それに合わせて音質も上げていってたと思う。 こういうのは、おそらく他の映画館の設備だったら気づかけなかった。

あと、スクリーンが少し内側に湾曲してるのも没入感を上げる効果があったと思う。

観終わったあとには、ボキャブラリーが消え失せてた。

いやこれが最後でよかったと思った。

まとめ

やや真面目な話。

今の日本で映画館で映画を観るのはなかなかの大仕事。 ネットなどで簡単に観れる中で、わざわざ予定を立てて・時間をかけて・お金もかけないと観れない。

そんな中で、いかに顧客の財布の紐を緩めて満足させるかという課題を、最新設備の力で解決させようというのがこれらの映画設備なんだと思う。設備だけは家ではなかなか用意することはできないので。

4DXやIMAXは「どういう設備を用意したら家ではできない体験ができるか」をそれぞれ考えていて、それぞれ違った方向性だけど、どちらも「体験をさせるために設備を開発している」ように見える。 なので、過去に問題となった部分をよくしていった結果、総合パッケージになっている。

しかし、今回結果的に酷評となったScreenXは、設備を売っておしまいというスタンスなんだと思う。

  • なんで正面と左右で画面の明るさが違うの? → そっちのほうが安いから
  • なんで正面と左右の画面はフチがあるの? → 光が混じると境界部分が明るくなってしまうから多めに余白をとってる
  • なんで映像に対して音が悪いの → 映画館が選んだ音響設備の都合だから知らない

想像だけど、こんな感じなのでは。

名称に追加料金を取ってブランディングしているのに、こういうところが雑なのが4DXやIMAXと違う。 それでも安ければ別にいいけど、IMAXレーザーと同じ料金。

それは低評価になりますよ。

そもそも、同じ土俵に乗せて比較したのが失礼だったと思う。申し訳ない。

そんなわけで、最後に★マークで評価をつけて終わる。

評価 名称
★★★★★ IMAXレーザー
★★★ 4DX
ScreenX