Teradata Studio, Teradata Studio Express (Mac版) のインストール

# 概要

Teradata Studio, Teradata Studio ExpressはTeradataデータベースを操作するGUIソフトウェアですが、そのMac版のインストーラにはやや問題があり、インストールが失敗することがあります。
私の経験したのは、適切なJavaプログラムを見つける仕組みの問題でした。
結局、インストールした `.pkg` ファイルを一度解凍して中のスクリプトを修正し、再度パッケージ化するという荒療治により解決することができました。この方法を紹介します。

参考：[Studio Express Mac JDK installation issue | Teradata Forum](https://support.teradata.com/community?id=community_question&sys_id=96149b651b31c4d4682ca8233a4bcb0e)


# インストーラの取得

https://downloads.teradata.com からソフトウェアのインストーラをダウンロードします。

- [Teradata Studio Express](https://downloads.teradata.com/download/tools/teradata-studio-express)
- [Teradata Studio](https://downloads.teradata.com/download/tools/teradata-studio)

リンク切れの場合は検索すればすぐに見つかると思います。
Mac用には、`.pkg`ファイルが用意されています。

## インストーラが機能するかの確認

普通は`.pkg`ファイルをダブルクリックしてウィザードに従っていれば完了なのですが、私の環境では失敗しました。
この失敗への対処を紹介します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80588/46cdcc2d-33cc-ecc4-5715-e5793b987694.png" width="300"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80588/27e6f04b-beae-16a0-59fa-057cbefe96ca.png" width="400">

# Javaのバージョンの確認

Teradata Studio (Express) は、Java Runtime Environmentのバージョン 1.8, 10, 11 のいずれかを必要とします。これが満たされないとエラーが生じます。悪いことに、たとえ指定のバージョンのJavaがインストールされていても、これが正しく検知されなければやはりエラーがでます。ですので、(1) 指定のJavaバージョンをインストールする (2) それが正しく検知されるようにスクリプトを書き換える、の２手順で対応します。

## 指定のJavaバージョンをインストールする

バージョン 1.8, 10, 11 のいずれかがインストールできれば良いのですが、ここでは `AdoptOpenJDK` をHomebrew経由でインストールする方法を紹介します。

```shell
brew tap AdoptOpenJDK/openjdk
brew install adoptopenjdk8
```

インストールが完了すると、`/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home/bin/java` に、Javaプログラムがインストールされます。
下記はその確認コマンドです。

```shell
/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home/bin/java -version 
# openjdk version "1.8.0_252"
# OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_252-b09)
# OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.252-b09, mixed mode)
```

このバージョンを既定にするには、`~/.bash_profile` に下記を記載します。

```shell:.bash_profile
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
PATH=${JAVA_HOME}/bin:${PATH}
```

次回以降Terminalを開き直すと、次のようになります。

```shell
which java
# /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home/bin/java
```

参考：[HomeBrew で AdoptOpenJDK をインストールしてみた（訂正版）| qiita](https://qiita.com/gishi_yama/items/9cdb3d95ee7f25b8018f)


## Javaバージョン判定のスクリプトの修正

残念ながら、指定のJavaバージョンをインストールして既定に設定したとしても、まだTeradata Studio (Express) のインストールは成功しません。中で動いているJavaバージョンの判定スクリプトがあまり頑健でないためです。
そこで、エラー解消のため、スクリプトを直接修正します。
以下では、Expressの場合のコマンドを例として示しますが、適宜 Teradata Studioに読み替えてください。

まず、インストールした`.pkg`ファイルを解凍します。
コマンド最後の`TSE.unpkg`の部分は、解凍先フォルダで任意です。

```shell
pkgutil --expand TeradataStudioExpress.pkg TSE.unpkg
```

すると、Javaのバージョン判定をしているスクリプトが、`TSE.unpkg/TeradataStudioExpComponent.pkg/Scripts/preinstall` に見つかります（紛らわしいですが、`TeradataStudioExpComponent.pkg`はフォルダ名です）。
これは、以下のような短いPerlスクリプトです。

```perl:Scripts/preinstall
#!/usr/bin/perl
use strict;
use warnings;

my $javaversion = `java -XshowSettings:properties -version  > /tmp/javaver 2>&1`;
my $javaversionhelp = `grep "java.specification.version" "/tmp/javaver"`;
my ($jdk, $version) = split /\s*=\s*/, $javaversionhelp;
my $retval = 0;

if ( $version != 10 && $version != 1.8 && $version != 11 ) {	
        $retval=system("/usr/bin/osascript -e 'tell application \"Finder\"'  -e 'activate' -e 'display dialog \"Java Runtime Environment 1.8 or 10 or 11 is required and should be installed before installing Teradata Studio Express Application.\" buttons{\"OK\"} with title \"Teradata Studio Express Warning\"' -e 'end tell'") ;
	exit(-1);
}

exit(0);
```

読み解くと、次のような構成のようです。

1. `java`コマンドでバージョン情報を一時ファイルに書き出し
1. 一時ファイルの該当箇所からバージョン番号を取得
1. バージョンが 10, 1.8, 11 のいずれかでなければ、警告を出した上でエラー終了

さて、このプログラムが失敗する理由ですが、どうやら使っている`java`コマンドのパスが意図と違っているためです。これは、おそらく`.bash_profile`に記載した設定が反映されていないためです。したがって、既定バージョンを 1.8 にしたつもりでも、このプログラムではそう判定されません。

さて、プログラムの修正方法ですが、丁寧にやるなら、`java` コマンド部分をフルパス `/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home/bin/java` に書き換えることです。
しかし、実際のところこのプログラムがしているのはバージョン判定だけで、インストール作業とは関係ないので、無条件でパスさせてしまえば良さそうです。
そこで、プログラムの冒頭を以下のように書き換えます。そうすると、常に成功してプログラムが終了するはずです。

```perl:Scripts/preinstallの冒頭
#!/usr/bin/perl
use strict;
use warnings;

exit(0);
```

上記の編集後、下記のコマンドでパッケージを再構築します。
新しく`TSE.pkg`が作られます。

```shell
pkgutil --flatten TSE.unpkg TSE.pkg
```
`TSE.unpkg`をダブルクリックしてウィザードに従うと、上手くいけばインストールが成功します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80588/772a6dd6-a7ab-df42-309b-46fbf428f3c8.png" width="400">


# プログラム実行時のJavaバージョンを設定

インストール時にはバージョン判定を回避することでパスさせましたが、ソフトウェア実行時には、正しく意図したバージョンのJavaを使わせる必要があります。そのためには、プログラムの設定ファイルを編集します（管理者権限が必要です）。
Vimを使っていますが、適宜別のエディタに読み替えてください。

```shell
sudo vim /Applications/TeradataStudioExpress.app/Contents/Info.plist
```

後半部分に 特定のJava version を指定するようにコメントされている部分があるので、そこへ下記を追加します。

```xml:Info.plist　に追加
<string>-vm</string><string>/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home/bin/java</string>
```

## 終わりに

以上で設定変更は終わりです。あとは、ランチャーから起動すればソフトウェアが使えるようになっていると思います。