All About ACS: ACS Mac Application Package の Mac 用 ODBC を試す

# ACS Mac Application Package の Mac 用 ODBC を試す 

「[All About ACS: IBM i Access Client Solutions 1.1.8.5 利用可能。Mac 用 AP(ODBCドライバー)も!](https://qiita.com/6onoda/items/ee04cb3761e11cf85b43)」で、お知らせしたとおり、ACS に Mac 用の Application Package が利用可能になっています。

「[IBM i Access - Client Solutions 5733XJ1](https://www.ibm.com/support/pages/ibm-i-access-client-solutions-5733xj1)」より抜粋します。


> Mac Application Package last updated on July 2020 (Latest Updates)
> 
> The next available update is planned for September 2020
> 
> Features include: ODBC, Programming Toolkit
>

Linux や IBM i の pase 用ど同様に ODBC が使えるようです。

## Mac Application Package の導入

下記で readme が確認できます(Qiita では ftp:// が期待したリンクにならないのでコピペしてください)。
ftp://ftp.software.ibm.com/as400/products/clientaccess/solutions/MacAP/readme_macos.txt

前提として、unixODBC driver manager の導入が必要なこと、unixODBC driver manager は、Homebrew package manager で導入すること、Mac AP の導入前に unixODBC driver manager が導入されていればドライバーの登録は Mac AP の自動で行われる、そうでない場合は手動で後から「 /Library/IBMiAccess/register_driver 」登楼するように、と記述されています。


> 1.2  PREREQUISITES
<p>------------------</p>
>
>  The unixODBC driver manager is required for the ODBC driver to function. It
  can be installed using the Homebrew package manager, available from
  https://brew.sh. Once Homebrew is installed, unixODBC can then be installed
  with:
>
>    brew install unixodbc
>
>  If unixODBC is not installed at the time of installation of this service pack,
  the installer will not be able to register the driver with unixODBC, however
  the driver can be manually registered once unixODBC has been installed by
  running the following command:
>
>  /Library/IBMiAccess/register_driver
  
そこで、下記の順番で導入します。

- Homebrew package manager 
- unixODBC driver manager 
- Mac Application Package

### Homebrew package manager の導入

Qiita に「[Homebrewのインストール](Homebrewのインストール)」という記事がありました。

> Homebrewページに移動し、記載されているインストールコマンド（シェルスクリプト）をターミナル画面にペーストし実行（Enter）します。

[Homebrewページ](https://brew.sh/index_ja) には、こうあります。

> これをmacOSのターミナルまたはLinuxのシェルプロンプトに貼り付けて下さい。

```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```
コマンドを貼り付けて、return を押します。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/a2fdbca5-e462-0ed1-f492-423f8a39ea38.png)

パスワードの入力が求められます。入力して return を押します。
導入の確認が求められます。return で導入を開始します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/81556b55-6652-7b9b-47e1-bf28fd8bfba0.png)

しばらく、時間がががります。導入完了まであせらずに待ってください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/17d75ba5-8b60-1971-8bad-5ab368b5b5eb.png)

### unixODBC driver manager の導入
Homebrew package manager を使って、unixODBC driver manager を導入します。
reaedme に従い、下記を実行します。

```
brew install unixodbc
```
導入されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/664a06f4-580f-4178-4223-fefa99031330.png)

### Mac Application Package のダウンロード

[ACS のダウンロードサイト](https://www-01.ibm.com/marketing/iwm/platform/mrs/assets?source=swg-ia) から Mac Application Package をダウンロードします。
IBM ID でログイン、ライセンスの受諾などのステップをすすめると、ダウンロード可能なモジュールの一覧が表示されます。

「ACS Mac App Pkg」をダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/772d3322-a5e4-a674-3145-33fa52a53c6c.png)

「IBMiAccess_v1r1_macOS_AP.zip」というファイルがダウンロードされました。

### Mac Application Package の導入

ダウンロードした「IBMiAccess_v1r1_macOS_AP.zip」Finder でダブルクリックして展開します。

pkg ファイルがあるのが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/b1597bb8-a3a4-d2e0-bdfb-63d760e83db9.png)

readme.txt に導入方法の記載があります。

> 1.3  INSTALLING
> <p>--------------- </p>
> 
  The service pack includes a standard macOS installer package. It can be
  installed by double clicking it or using the pkgutil command from the command
  line.
> 
  You may get a message when attempting to run the installer that says
  "[package] can't be opened because it is from an unidentified developer" and
  the dialog box will only have an "OK" button, preventing the package from
  being installed. If this occurs, temporarily override the security controls to
  allow its installation by right-clicking or ctrl-clicking on the installer and
  choose "Open". This will bring up the same dialog with the same warning, but
  now there will be "Open" and "Cancel" buttons instead. By choosing "Open", you
  can proceed with the installation.
> 
  In case the above steps do not work, you can find more information from Apple
  at the following web page:
  https://support.apple.com/guide/mac-help/open-a-mac-app-from-an-unidentified-developer-mh40616/mac

単純にダブルクリックしましたが、怒られました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/f723d2ff-da4a-39e1-101d-038cbca485bb.png)

右クリックか control クリックで回避とあります。

> by right-clicking or ctrl-clicking 

control を押しながら pkg ファイルをクリックし「このアプリケーション開く」「インストーラー」としました。「開く」でもかまいません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/e91bce02-37f2-0754-7c11-38d8816a9c84.png)

今度は「開く」があります。「開く」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/5792b703-7d73-863a-6d62-4f2969ec7e37.png)

インストーラーが起動しました。「続ける」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/ed40ae57-35a9-5f34-e164-50a58c4933ee.png)

unixODBC が前提というメッセージが表示されます。「続ける」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/3be38fc0-313b-9d5c-ad7a-74f30ed94a7a.png)

使用条件です。「続ける」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/a39c22f8-6784-bc6a-94b0-ba15152cdfd4.png)

使用許諾に「同意する」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/0bf38263-8bdf-9383-e6cc-8fdeb3116283.png)

必要ならインストール先を変更します。「インストール」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/43d68672-c4f8-8418-f778-5aafb65d8b20.png)

パスワードを入力して「ソフトウェアをインストール」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/fa5090b6-a4b9-1151-1ed8-f09ad4ac64a8.png)

導入されました。「閉じる」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/41c96b0b-31cc-52f6-bd31-af52daa71e56.png)

ダイアログに「OK」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/3cb110b2-b174-bb2f-eb80-42b1098012c8.png)

pkg ファイルをゴミ箱にいれるか聞かれます。このあたりは好みでしょう。
「ゴミ箱にいれる」を選んでも、ゴミ箱にはいるのは pkg だけで、展開されたフォルダーの他のファイルは、そのまま残ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/7449429a-c2e2-5bda-e819-16676f7d171b.png)

/usr/local/etc/odbcinst.ini を確認すると「IBM i Access for macOS ODBC Driver」が登録されているのが確認できます。

```
onoda@MBPro ~ % cat /usr/local/etc/odbcinst.ini
[IBM i Access ODBC Driver]
Description=IBM i Access for macOS ODBC Driver
Driver=/Library/IBMiAccess/lib/libcwbodbc.dylib
Threading=0
DontDLClose=1
UsageCount=1
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/2d4e32e3-887b-1940-c78e-94368db834e9.png)

## Mac Application Package の構成

「odbcinst -j」を実行して、データソースの場所を確認します。
利用する範囲がシステム全体なのかログインユーザーだけかのか、ini 形式かファイル形式か...で場所が変わります。

```
onoda@MBPro ~ % odbcinst -j
unixODBC 2.3.7
DRIVERS............: /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
USER DATA SOURCES..: /Users/onoda/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
```

今回は自分だけが使うことができればいいので、USER DATA SOURCES である 「/Users/onoda/.odbc.ini」を構成します。

```
onoda@MBPro ~ % nano /Users/onoda/.odbc.ini
```

構成内容はこちら。以前 ubuntu で [ODBCCreateDataSourceQ4](http://www.unixodbc.org/gui/) の GUI を使って、ACS Linux Application Package の ODBC に対して構成したのもを、そのまま使っています。

```
onoda@MBPro ~ % cat .odbc.ini 
[ACS_ODBC]
Description             = IBM i Access ODBC Driver
Driver          = IBM i Access ODBC Driver
System          = myDb2i
UserID          = user
Password                = password
Naming          = 0
DefaultLibraries                = QGPL
Database                =
ConnectionType          = 0
CommitMode              = 2
ExtendedDynamic         = 1
DefaultPkgLibrary               = QGPL
DefaultPackage          = A/DEFAULT(IBM),2,0,1,0,512
AllowDataCompression            = 1
MaxFieldLength          = 32
BlockFetch              = 1
BlockSizeKB             = 128
ExtendedColInfo         = 0
LibraryView             = ENU
AllowUnsupportedChar            = 0
ForceTranslation                = 0
Trace           = 0
```

ini の先頭に [ACS_ODBC] あるとおり、「ACS_ODBC」が DNS 名です、
isql で確認しましょう。

「isql DNS名 ユーザー名 パスワード」で接続します。
「Connected!」と出力されたら、接続できています。
「SQL>」のプロンプトに SQL 文を入力して実行します。
終了する時は「quit」です。

```
onoda@MBPro ~ % isql ACS_ODBC user password
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select * from sysibm.sysdummy1
+--------+
| IBMREQD|
+--------+
| Y      |
+--------+
SQLRowCount returns -1
1 rows fetched
SQL> quit
onoda@MBPro ~ % 
```
正しく動作しているようです。

## 日本語処理について

日本語のデータを見てみます。一見正しいようですが、不自然な「?」があるのがわかります。

```
SQL> SELECT TKBANG, TKΩAKN, TKNAKJ, TKADR1, TKADR2 FROM qeol.tokmsp WHERE TKBANG = '01010'
+-------+---------------------+---------------------+---------------------+---------------------+
| TKBANG| TKNAKN              | TKNAKJ              | TKADR1              | TKADR2              |
+-------+---------------------+---------------------+---------------------+---------------------+
| 01010 | ｱｲ ﾘﾖｶﾝ | 阿井旅館　　?| 東京都渋谷区?| 桜ヶ丘２９　?|
+-------+---------------------+---------------------+---------------------+---------------------+
```

Mac の日本語環境は UTF-8 として動作しています。

```
onoda@MBPro ~ % export | grep LANG
LANG=ja_JP.UTF-8
```

UTF-8では文字列の長さがEBCDICとは異なります。1 バイトの半角カナも 2 バイトのDBCS文字も UTF-8 では 3 バイトになります(ごく一部に UTF-8 で 4 バイトになるDBCS文字があります)。

そのため、EBCDIC で 10 バイトの文字に対して、UTF-8 で10 バイト用意するだけでは、データが入り切りません。

10 バイトのカラムにデータを入れてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/6b45257e-29fb-af87-4339-7043916796a7.png)

```
> create schema acs_test                        
  スキーマACS_TESTが作成されました。        
> create table acs_test.tab1 ( col1 char(10) )  
  テーブルTAB1がACS_TESTに作成された。    
> insert into acs_test.tab1 values              
  ('1234567890'),                               
  ('ｱｲｳｴｵｶｷｸｹｺ'),                               
  ('あいうえ')                                
  ACS_TESTのTAB1に3行が挿入された。       
```

Mac から ODBC 経由で取得します。
半角カナも 2 バイトのDBCS も UTF-8 では一文字 3 バイトなので、3 文字 9 バイトまでは表示されています。10 バイトに入り切らない 4 文字目の一部が「?」で表示されています。

```
SQL> select * from acs_test.tab1
+-----------+
| COL1      |
+-----------+
| 1234567890|
| ｱｲｳ?|
| あいう?|
+-----------+
SQLRowCount returns -1
3 rows fetched
```

全体を表示するには 30 バイト必要なので CAST でカラム長を 30 バイトに再定義すれば、全体が取得できます。


```
SQL> select cast( col1 as char(30) ) from acs_test.tab1
+-------------------------------+
| 00001                         |
+-------------------------------+
| 1234567890                    |
| ｱｲｳｴｵｶｷｸｹｺ|
| あいうえ                  |
+-------------------------------+
SQLRowCount returns -1
3 rows fetched
```

## Excel for Mac からは...利用できません

結論から言うと Excel for Mac からは利用できません。これが一番期待したことだったのですが...

Excel for Mac にも「データ」矢印「新しいデータベースクエリー」があって「データベース」からで、ODBC での取り込みができることを期待させます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/68bc737d-bdb5-e18f-dc0c-32092fca5e58.png)

でも、ドライバーマネージャーがインストールされていないというエラーになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/ec41cce8-9d59-56ae-fde6-84f1eb471be1.png)

実は、オープンソースで主要な ODBC ドライバーマネージャーには、ACS で対応している [unixODBC](http://www.unixodbc.org/) の他に [iODBC](http://www.iodbc.org/) というものもあります。

こちらなら Excel for Mac に対応しています。unixODBC は Excel for Mac に対応していないのです。
(このあたりは Mac の歴史的な経緯に理由があるようです。以前は macOS に ODBC ドライバーマネージャーがついてたようですし。

iODBC の Mac 用 ODBC ドライバーマネージャーは、iODBC のサイトからダウンロードできます。

http://www.iodbc.org/dataspace/doc/iodbc/wiki/iodbcWiki/Downloads#Mac%20OS%20X

ここにある mxkozzzz.dmg をインストールしたところ、先ほどの操作でデータソースを選択する iODBC の GUI が起動するようになりました、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/2f0c536f-836f-d412-8dab-fb2e97a26d0f.png)

しかし、ACS の Mac 用ドライバー は、あくまで unixODBC 用で iODBC には対応していません。当然ですが、ここから追加・構成ができません。Excel for Mac から ACS Mac Application Package の ODBC は利用できません。

***
2020-08-12 作成
2020-08-13 誤字、イメージリンクの修正
***
「All About ACS」では IBM i に対する新しいクライアント「IBM i Access Client Solutions」の情報をいろいろ提供していきます。
[記事一覧はこちら](http://qiita.com/6onoda/items/2dc925586d8d3b8644f2)で確認いたけます。

許可の無い転載を禁じます。
この記事は筆者の個人的な責任で無保証で提供しています。
当記事に関してIBMやビジネスパートナーに問い合わせることは、固くお断りします。
***