ながさわさんのアレグロモデラート

アレグロモデラート(Allegro moderato)は、速さを示す演奏記号で「穏やかに速く」

Y!mobile の PHS へ、リモートメールからのメール転送が突然されなくなった

f:id:lakeside_shinnosuke:20160507091225p:plain

ながさわさんは仕事用のメールアドレスをいっぱい持っている。どこでも読みたいし、どこでもそのアドレスで返信したいので、Domino サーバーで受信して、iNotes でブラウザからチェックする。

メールボックスがたくさんあるため、いちいち手動巡回もしていられないから、すべてのメールを Y!mobile の PHS に転送している。どのアドレス宛てに来たかは着信音を鳴らし分けたうえで、フォルダに自動振り分けされる。

ちなみに、転送先をひとつに集約しないのは、送信元のアドレスを使い分けたいから。僕は、送信アドレスを選択できるWeb メーラーサービスを知らない。また、PHS を使っているのは、スーパーだれとでも定額(相手が PHS なら通話料は無料。それ以外でも 10分まで無料。)の恩恵もあるが、ケータイと比べて音質が格段によいからです。スマホももっているが、これで電話しようという気にはなれない。かかってきても出ずに PHS からかけなおします。


さて、メールの転送は、リモートメールを使っている。
rmail.jp

PHS から リモートメールを登録し(有料)リモメアドレスというのを取得して、そのアドレスを PHS のメールに転送させる。仕事用アドレスの転送先は、いきなり PHS ではなく、このアドレスを介して転送する。理由は、そのまま転送すると、PHS のほうのメールの容量制限(1M)にひっかかり、相手に送信エラーが飛んでいくことを避けるため。リモートメールを介すれば、添付は削除したうえ、指定した文字数までに内容をカットしてくれる。また、送信元をそのままにして転送するか、受けたアドレスを送信元にして転送するかも選べる。HTML メールも、可能な限りテキストにしてくれる。

こんな感じで非常に重宝しており、PHS が鳴らないと、不安になるくらいなのだが、この連休の中盤、5/2 の 0:00 から、メールが一切転送されなくなった。仕事のメールはたくさん届いていたが、これが生き返らないと、こっちも返信する気になれない。

  • リモートアドレスはPCで確認でき、このアドレスには転送されていることは確認
  • PHS のメールアドレスには届く

ということはリモートメールの着信通知(PHSへの転送)ができていないのではないかと、問い合わせのメールを送ったら、次のような返信。

お問い合わせいただきましてありがとうございます。
 
現在、着信通知機能に不具合は発生しておりません。
以下の手順で着信通知設定をご確認ください。
 
●[アカウントリスト]-アカウント選択-[環境設定]-[着信通知設定]-
 [カスタム設定を行う]-「通知メールの差出人」を確認
 
上記で「通知メールの差出人」 が「元メールのまま」の場合、
ご利用の携帯端末でなりすましメールの規制をしているためにメールが届いていない可能性がございます。
お手数ですが、「通知メールの差出人」を「リモメアドレス」にご設定ください。
 ※アカウントを複数お持ちの場合は、それぞれでご設定いただく必要がございます。
 
また、合わせて端末側のメール設定で「rmail.ne.jp」を受信できるようにご設定ください。
 
何卒宜しくお願いいたします。

なぬ?なりすましメールだと?そんな設定知らないぞ。ググる...

www.ymobile.jp

お知らせ
2015年10月27日にお知らせさせていただいた、ケータイ(PHS)の迷惑メール防止機能の改善作業について開始時期が延期となりました。開始時期は改めて弊社ホームページでお知らせいたしますので、今まで通りオンラインサインアップよりご設定ください。
詳しくは下記お知らせをご確認ください。

だから、まだアナウンスされていないから、迷惑メール防止機能はないんじゃないの?と思いつつ、これまでのウィルコムだと、新規と機種変更のときくらいしか開けない、オンラインサインアップを開けてみる。

f:id:lakeside_shinnosuke:20160507094616p:plain

ホームページでは、迷惑メール防止機能はまだと書いてあるが、ここでは、Y!mobile での受付は延期と書いてある。何が正しいのかわからんが、とにかく、迷惑メール防止機能というのが選べるようになっている。(初めて知った)

そして、
f:id:lakeside_shinnosuke:20160507094858p:plain

この「迷惑メールフィルタ」ってのが「利用する」になっていた。これを「利用しない」にしたら、リモートメールの着信通知がされるようになった。やれやれ、なんてこった。オレこんなところさわってねーし、ノーアナウンスで設定変更かよ。いい加減にしろ。完全に PHS 軽視だな、Y!mobile さん。

ということで、着信転送されるようになりました。

Domino サーバーの認証者 ID ファイルのパスワード忘れ

Domino サーバーの認証者 ID ファイルのパスワード忘れてしまった。
運用して時間が経っていたので、再インストールするのもしゃくだったので、いろいろ調べてみる。

1. OLE か Java API で総当たりでパスワードをハックする

これはできなかった。OLE でアクセスできるのは、サーバーオブジェクトとクライアントだけで、VBA から OLE を呼ぶと、Notes クライアントが起動して、認証ダイアログが出てくる。つまり、ユーザーを切り替えるという API は用意されていない。
Java でも同じようだったのでやめ。

Public Sub hogehoge()

    Dim ss As Object
    Dim db As Object
    
    Set ss = CreateObject("Notes.NotesSession")
    Set db = ss.GETDATABASE("server", "database.nsf")
    Debug.Print db.Title

End Sub

しかし、ぜんぶ Object 型で定義しなければならないのはアレだ。Intelisense がほとんどつかえない。

OLE による Notes のアクセス:
http://www.ibm.com/support/knowledgecenter/SSVRGU_8.5.3/com.ibm.designer.domino.main.doc/H_USING_NOTES_CLASSES_IN_VISUAL_BASIC.html?lang=ja

2. 認証者ID を作り直す

IBM (参考)認証者 ID の盗難、紛失、または漏えいが発生した場合の対処方法 - United States

上記 URL の「補足情報」をもとに、認証者ID を作り直すというのがいちばん手っ取り早い方法のようだ。

もとの認証を削除したあと、新しい「組織」を同じ名前で作り直すと新しい cert.id が作られ、この ID で、サーバー ID と管理者 ID を再認証。新しい サーバー ID でサーバーを再起動後に、全ユーザーを再認証するとよい。

いまのところとくに問題は起きていません。ああ、よかった。

ちなみに、Linux 版 Domino のインストール方法はこちらが詳しいです。
Domino Serverのインストール・セットアップ

Access Web データベースから Oracle のトリガーを呼び出す(問題とその解決編)

さて、アプリケーションページには、Oracle のトリガーを呼び出すコードは書けているので、これを CLR トリガーに移植しようと粛々と作業。コンパイルが通り、DLL をデプロイしようとしたが、次々に起こる問題

1. CLR トリガーそのものから、ODP.NET が呼び出せない

f:id:lakeside_shinnosuke:20160429233536p:plain

SqlAssembly 'Database1' の作成に失敗しました。(Microsoft.SqlServer.Smo)
追加情報:
Transact-SQL ステートメントまたはバッチの実行中に例外が発生しました。
(Microsoft.SqlServer.ConnectionInfo)
→このクエリを実行するには、リソースプール 'default' のシステム メモリが不足しています。(Microsoft SQL Server、エラー:701)

うーーーーーむ。
これについては、いろいろ調べてみたのだけれども、DataSet クラスの使用することにコストがかかりすぎるということと、そもそも、SQL ServerCLR トリガーから、ODP.NET は呼び出せないのではないかというところに落ち着いた。DataSet クラスについては、DataReader への書き換えはできるが、ODP.NET が呼び出せないのであれば、CLR トリガーだけで処理はできないということになる。。。

脱力感に支配されながら、代替策を考える。

  • CLR トリガーから、シェルを呼び出して、コマンドとして実行する
  • CLR トリガーから、もともとの アプリケーションページを呼び出す

コマンドを呼び出しは古臭さが否めなかったし、アプリケーションページの呼び出しならば、そのまま使えそうだったので、後者をとる。CLR トリガーを全面的に書き直し、結局、HttpClient を呼び出すだけのコードになった。

    Dim wc As WebClient = New WebClient()
    wc.Credentials = New NetworkCredential(login, pwd)  ' SharePoint の基本認証
    wc.DownloadData(url)

2. CLR トリガーが外部リソースにアクセスするためには設定が必要

さて、生まれ変わった CLR トリガーのアセンブリは問題なくデプロイされた。SSMS から、INSERT 文を実行し、動きを確かめてみる。すると、

メッセージ 6522、レベル 16、状態 1、プロシージャ SqlTrigger1、行 1
ユーザー定義のルーチンまたは集計 "SqlTrigger1" を実行中に .NET Framework エラーが発生しました:
System.Security.SecurityException: 型 'System.Net.WebPermission, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' のアクセス許可の要求に失敗しました。
System.Security.SecurityException:
場所 System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request)
場所 System.Net.WebClient.DownloadData(Uri address)
場所 SalesQuotationTrigger.OrderQuotationTrigger.OnInsertUpdate()

うがっ。WebClient が呼べてない。。。これは少し調べると原因がわかった。
CLR トリガーには、権限の設定があるのだそうだ。
まずは、プロジェクトプロパティの Permission Level 、これを EXTERNAL_ACCESS にする。

f:id:lakeside_shinnosuke:20160430001952p:plain

これでビルドしたうえで、アセンブリの登録時に、権限セットを「外部アクセス」にする。

f:id:lakeside_shinnosuke:20160430002132p:plain

これで、再び実行すると、WebClient が呼べるようになったようだが、応答が返ってくるまでやたらと時間がかかる。うーん、これは明らかに WebClient のタイムアウトと思しき時間だなあ。。。重いのであまりやりたくないが、アプリケーションページをデバッグ起動してみる。すると、わかったのは、

3.CLR トリガーが呼び出されているとき、該当レコードは排他ロックされている

アプリケーションページは呼び出された先で、SQLServer を読みにいって、Oracle トリガーに渡す値を抽出するのだが、このとき、挿入、または更新された行は、排他ロックされており、SELECT ですら、ロックが解放されるまで待機してしまう。うーむ。
では、CLR トリガーで、ワークテーブルに同じ内容をコピーして、その内容を読み取るようにすればどうかと実装してみたところ、そのコピーしたレコードも排他ロックされていた。。。
結局、その実装はとっぱらい、アプリケーションページ側で、リクエストを受信したら、すぐにレスポンスを返すようにし、1秒後に別のスレッドで、これまでのコードを実行するようにしたら、ロックは解放された状態でテーブルを参照することができた。ここまでくると、なんだかアホらしくなってきたが、さあ、あとは削除だけだ。

4.削除トリガーが実行され、1 秒後には、該当レコードは消えている(あたりまえ)

ここまでの方法で削除トリガーを実装してみたら、該当レコードが取得できずにエラーとなってしまった。なんでやろ?と考えると、削除トリガーなのだから、ロックもなにも、1 秒後にはレコード自体が消えていることに気がついた。当たり前だ。
しぶしぶ、さっき実装したワークテーブルへのコピーのコードを復活させ、コピーの行を使って、値をとるようにした。CLR トリガー側でコピーした行は、アプリケーションページで削除するようにした。

やっとできた。Access Web データベースからの呼び出しも、多少の重さは感じるが、実用には問題ないレベルとなった。

いやー。
SQL Server ではリンクサーバーという機能があり、OLE データベースをリンクして、ビューとして見ることができたりするのだが、これで見えるのは、テーブルとビューだけで、さらに、OLE オブジェクトは、SQL Serverアーキテクチャからアクセスできないといけない。つまり、SQL Server が 64bit ならば、Oracle Client は 64bit でなければならない。この件も含めて、広くいろいろなことができるように見えるが、実現までには、たくさんのハードルがあるということがよくわかった。
Oracle のストアドを使って、外部ファイルを出力するとき、UTL_FILE を使えばいいが、SQL Server のストアドでは、ネイティブでファイル出力する機能はないらしく、結局、外部コマンドを呼び出すということになるらしい。だから、CLR トリガーや CLR ストアドが用意されているのだろうけれど、標準 API しか呼び出せないのであれば、ファイル出力とか、メール発信とかまでにとどめておいたほうがいいなあ。今回は、SharePoint があったから助かったし、Java EE のサーバーがあれば、同等のことはできるだろうけど、SQL Server しかない場合は、Oracle トリガーを呼び出すということはできないと言い切ったほうがいいのかもしれない。

たいへん勉強になりました。

おわり。

Access Web データベースから Oracle のトリガーを呼び出す(基本実装編)

CLR トリガーは以下のようにつくる。

本家のチュートリアルはこちら → CLR トリガー

SharePoint Server または SQL Server が入っているコンピューターで Visual Studio を実行し、SQL Server プロジェクトをつくる。

f:id:lakeside_shinnosuke:20160429220906p:plain

プロジェクトプロパティを開けて、C#VB.NET かを決める。

f:id:lakeside_shinnosuke:20160429221201p:plain

SQL CLR C#VB.NET)というカテゴリーの、SQL CLR C# (VB.NET) Trigger という項目を追加する。

f:id:lakeside_shinnosuke:20160429222744p:plain

生成されたコードに追記したものがこちら。

using System;
using System.Data;
using System.Data.SqlClient;
using Microsoft.SqlServer.Server;

public partial class Triggers{        
    // Enter existing table or view for the target and uncomment the attribute line

    // 以下は適切な名前に変える
    // EventFOR INSERT,UPDATE,DELETE のようにカンマでつなげられる
    [Microsoft.SqlServer.Server.SqlTrigger
    (Name="SqlTrigger1", Target="Table1", Event="INSERT,UPDATE,DELETE")]
    public static void SqlTrigger1 (){
        // Replace with your own code
        // SqlContext.Pipe.SendSQLServer Management Studio(SSMS) の
        // コンソールにメッセージが出力できる
        SqlContext.Pipe.Send("Trigger FIRED");

        SqlCommand command;
        SqlDataReader reader; 
        
        using (SqlConnection connection = new SqlConnection(@"context connection=true")){
            connection.Open();

            switch (SqlContext.TriggerContext.TriggerAction){
                // SqlContext.TriggerContext.TriggerAction で 何が起こったかわかる
                case TriggerAction.Insert:
                    command = new SqlCommand(@"SELECT * FROM INSERTED;",connection);
                    // INSERTEDINSERT された行
                    reader = command.ExecuteReader();
                    break;

                case TriggerAction.Update:
                    command = new SqlCommand(@"SELECT * FROM INSERTED;", connection);
                    // UPDATEINSERTED でとれる
                    reader = command.ExecuteReader();
                    break;

                case TriggerAction.Delete:
                    command = new SqlCommand(@"SELECT * FROM DELETED;", connection);
                    // DELETEDELETED でとる
                    reader = command.ExecuteReader();
                    break;

                default:
                    break;                
            }
        }

    }
}

どうやら、DataSet は使えないようなので、SqlDataReader でがんばること。

これをビルドすると、環境によっては、Visual Studio 上ではビルド失敗となるが、プロジェクトフォルダの obj フォルダに DLL の日付が変わっていれば、ビルドは成功している。これが CLR トリガーのライブラリになる。
(僕は SQLServer の入っているコンピュータで作らなかったので、ビルドには失敗したが、おそらく、SQLServer の入っているコンピュータでビルドすると、自動的にトリガーがデプロイされて、デバッグができるんだと思う。)

できた DLL を SSMS にデプロイするのだが、そのまえに、SSMS から、まず、CLR 統合の有効化のスクリプトを流す。

sp_configure 'clr enabled', 1
RECONFIGURE

つぎに、外部リソースへのアクセスの有効化のスクリプトを流す。

ALTER DATABASE databasename
SET TRUSTWORTHY ON

そして、DLL をデプロイする。トリガーを仕掛けたいデータベースから、プログラミング→アセンブリ→新しいアセンブリをえらぶ。

f:id:lakeside_shinnosuke:20160429225936p:plain

DLL を選択して OK を押す。

f:id:lakeside_shinnosuke:20160429230306p:plain

最後に、実テーブルに対して、トリガーをしかけるために、以下のようなスクリプトを流す。

USE databasename
GO

CREATE TRIGGER [SampleTable_Insert] ON [Access].[SampleTable]
   FOR INSERT
   AS  EXTERNAL NAME [Database1].[Triggers].[SqlTrigger1];
GO

これで CLR トリガーが呼び出せる。

ここまででハマりポイントがひとつある。トリガーを VB.NET でつくったとき、最後に CREATE TRIGGER するところで、

メッセージ 6505、レベル 16、状態 2、プロシージャ SampleTable_Insert、行 2
型 'Triggers' がアセンブリ 'Database1' に見つかりませんでした。

と出る。VB.NET で作ったときは、アセンブリのフルネームは、[Database1].[Database1.Triggers].[SqlTrigger1] となるらしい。デフォルトの名前空間をカブせて指定してください。

さあ、準備は整った。Access Services が作った SQLServer のテーブルに、Oracle のトリガーを呼び出す、CLR トリガーをコーディングしよう!道のりがまだ半分にも満たないことは、このときは知る由もなかった。。。(つづく)

Access Web データベースから Oracle のトリガーを呼び出す(導入編)

ゴールデンウィークでちょっと時間があるので、以前よりまとめようと思っていたテーマをポスト。

SharePointAccess Web データベースから、Oracle のトリガーを呼び出す必要があり、これまでは、ボタンが押されたときに、Web ブラウザーコントロールの URL を変更し、Oracle のトリガーを呼び出す SharePoint のアプリケーションページを呼び出していた。

code.msdn.microsoft.com

しかし、この方法だと、うまく動かないというケースが出てきた。要約すると、

  • GET パラメータを取得して、データベースを読み込み、PDF を作成して Octet-Stream を返す アプリケーションページを用意する
  • Access Web データベースのビュー(フォーム)に、更新ボタンと、Web ブラウザーコントロールを用意する
  • Web ブラウザーコントロールは、URL のフィールドをバインドする(Web ブラウザーコントロールには、値を直接セットできない)
  • 更新ボタンが押されたときに、レコードを保存→バインドされているレコードの ID を GET パラメータに付与したアプリケーションページの URL を作成→URL のフィールドにセット→ページのリフレッシュ
  • さらに、レコード移動時のイベントで、URL のフィールド値を消去する(そうしないと、レコードが表示されるたびに、アプリケーションページが呼ばれる)

このような処理だが、iframe に展開される Web ブラウザーコントロールの URL がうまく切り替わらないというケースが頻発し、原因究明よりも、このような信頼性に欠く方法はやめようということになった。

ちなみに、SharePoint のアプリケーションページを iframe から呼び出せるようにするには、aspx に、

<%@ Register tagprefix="WebPartPages" namespace="Microsoft.SharePoint.WebPartPages" assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

が、なければ追加して、

<WebPartPages:AllowFraming runat="server"/>

を追加する必要がある。

blogs.technet.microsoft.com

さて、この方法で、Super Visual Formade による帳票の呼び出し(PDF のダウンロード)も行っていたのだが、こちらのほうは、印刷ボタンを、ハイパーリンクコントロールにして、新しいウィンドウで呼び出すことで、確実にアプリケーションページを呼び出すということで回避した。
ちなみに、マクロからハイパーリンクの表示テキストを変更するには、以下のように「文字列#URL」という値をセットすればよい。

f:id:lakeside_shinnosuke:20160429214426p:plain

PDF のダウンロードのように、Octet-Sterm を返すのであれば、結果的に新しいウィンドウ(タブ)は開かないので、見た目の変更がなく、違和感がなかったのだが、トリガーの場合は、保存ボタンが押されるたびに、新しいタブが開くというのは、ユーザーインタフェースとして適切なものではない。

そこで、Access Services は、実データを SQLServer に書いているから、そのテーブルにトリガーに仕掛け、SQL Server のトリガーには、CLR トリガーという、.NET アセンブリを呼び出す機構があり、そこから Oracle を呼び出すという方法で進めていくことにしたのだが、これが、悪夢のはじまりだった。。。。(つづく)

Apache POI でつくった 200,000 × 255 の .xlsx ファイルを Microsoft Excel 2010 で開く

Excel は 2007 から、ワークシートの最大サイズが 1,048,576 × 16384 になったので、Apache POI で大きな .xlsx ファイルを作ってみる。

Apache POI の プロジェクトサイトから、POI のバイナリーをダウンロードする。
Apache POI - Download Release Artifacts

つづけて、SXSSF の How-To にあるサンプルコードを参考に 200,000 × 255 くらいで実行してみる。
The New Halloween Document

package poitest;

import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

public class Main {

    public static void main(String[] args) throws Throwable {
        SXSSFWorkbook wb = new SXSSFWorkbook(1); // keep 100 rows in memory, exceeding rows will be flushed to disk
        Sheet sh = wb.createSheet();
        for(int rownum = 0; rownum < 200000; rownum++){
        	if ( (rownum+1) % 1000 == 0 ){
        		System.out.println( rownum + 1 );
        	}
            Row row = sh.createRow(rownum);
            for(int cellnum = 0; cellnum < 255; cellnum++){
                Cell cell = row.createCell(cellnum);
                String address = new CellReference(cell).formatAsString();
                cell.setCellValue(address);
            }

        }

        FileOutputStream out = new FileOutputStream("c:/data/sxssf.xlsx");
        wb.write(out);
        out.close();

        // dispose of temporary files backing this workbook on disk
        wb.dispose();
    }
}

20分も待てば、232M の .xlsx ファイルができあがる。
(XSSF だと、オンメモリ処理で、メモリを大量に食いつぶすので、SXSSF じゃないとだめ。)

さて、これを開けたときの結果。

1.Excel 2010 32ビット

早々に、「'sxssf.xlsx' には読み取れない内容が含まれています。このブックの内容を回復しますか? ブックの発行元が信頼出来る場合は、[はい] をクリックしてください。」

と言ってくれ、「はい」すると、回復を試みる。うまくいけば、開くときもあるが、「リソース不足のため、このタスクを完了することができません。選択するデータを少なくするか、ほかのアプリケーションを終了して再度試してください。」

と出て「まいった」となる。

2.Excel 2013 32ビット

f:id:lakeside_shinnosuke:20160429191207p:plain

がんばって、開けようとするが、しばらくすると、

f:id:lakeside_shinnosuke:20160429191240p:plain

このように「まいった」と言うのだが、2010 のときと違い、64 ビットで開けたら開くかもよ、と言ってくれる。なので、

3.Excel 2010 64ビット

で開くと、
f:id:lakeside_shinnosuke:20160429192115p:plain

10分以上、もくもくと開こうとする。

f:id:lakeside_shinnosuke:20160429192411p:plain

その間、メモリはゆるやかな右肩上がり。

そして、

f:id:lakeside_shinnosuke:20160429192021p:plain

やったー。開きました。


非常に大きい .xlsx を Apache POI でつくるとき、次のような問題にぶちあたっていく。

  • .xls の API である HSSF に対応する .xlsx の API である XSSF を使うと遅い。(zip 展開しながらだから。)
  • XSSF はオンメモリなので、ありったけのメモリが使われる
  • POI 3.8 beta3 から利用できる SXSSF という API を使えば少ないメモリで .xlsx を作成できるが、Buffered Streaming に特化したものなので、大きなテンポラリファイルが作られテンポラリに書き出し済みの行へ戻ってセルの書き込みができない
  • ただし、SXSSF のテンポラリファイルは設定によって、gzip で圧縮しながらテンポラリを作ることもできる。
  • テンポラリファイルへの書き込み行数も設定できるので、この値を大きくしておけば、前に戻ることもできるようだ。(これは未確認。)

このように紆余曲折を経て、大きい .xlsx ファイルが、小さなリソースと、短い時間で作られることになるのだが、いざ、クライアントから開けようと思うと、32 ビットではでかすぎて開けられない、ということらしい。
そのうえ、32 ビット Excel で開くことができるファイルの具体的な制限というのは、どんなにググっても、適切な記述が出てこない。

強いて言えば、以下の URL の「データ モデル ブックのメモリ ストレージとファイル サイズの最大制限」
support.office.com

32 ビット環境の仮想アドレス空間は 2 ギガバイト (GB) で、Excel やブック、また同じプロセスで実行するアドインで共有されます。データ モデルのアドレス空間のシェアは 500 ~ 700 メガバイト (MB) まで増やすことができますが、他のモデルやアドインが読み込まれている場合は少なくなることがあります。
64 ビット環境では、ファイル サイズに対し、ハード制限はありません。ブックのサイズは、利用可能メモリとシステム リソースでのみ制限されます。
注: データ モデルにテーブルを追加すると、ファイル サイズが増大します。多数のデータ ソースやデータ型をブック内で使って複雑なデータ モデル関係を作るつもりではない場合、テーブル、ピボット テーブル、データ接続をインポートまたは作成するときに、[このデータをデータ モデルに追加する] ボックスをオフにします。
詳細については、「データ モデルの仕様と制限」を参照してください。

これはようするに、.xlsx が zip 展開 されたときに、2GB を超えているときに、32ビット Excel では、オンメモリに展開できない、と言っているようだ。いずれにしても、64 ビットで開けられたので、32ビットでは 232M はでかすぎる、ということだろう。

おわり。

app ファイルが展開できない(解決編)

つづき。

Windows Update 終了後、SPConfig を走らせると、構成失敗。数回再起動しても、構成失敗。
サーバーの全体管理は起動できるので、サイトのほうを表示すると、以下のような例外。

f:id:lakeside_shinnosuke:20160227105002p:plain

これは SPConfig の構成失敗のときと同じメッセージ。

アセンブリ 'Microsoft.SharePoint.WorkflowServices, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c' からの型 'Microsoft.SharePoint.WorkflowServices.WorkflowServiceApplicationProxy' にあるメソッド 'Upgrade' に実装が含まれていません。

うーん、ワークフローサービスとかインストールしてないしなあ、ワークフローの構成でもしてみるかなあ、と思いつつ、ググると以下ページがヒット。

セキュリティ更新プログラム MS14-022 for SharePoint 2013 について - Japan SharePoint Support Team Blog - Site Home - TechNet Blogs

このメッセージは既知の問題だったらしく、「追加の更新プログラム (2880963) (osfserver) 」をインストールすることで、見事、Access Services の表示までいきました。

app ファイルが展開できないときの結論(2015/2/27現在)

  • dacpac を取り出して展開してみる
  • app ファイルに環境に依存するような情報がないかどうかを確認(SQLServer のセキュリティ設定など)
  • Windows Update の重要な更新は最後までやりきる
  • Windows Update が終わったら、SPConfig を忘れない
  • Windows Update に含まれない更新プログラムがある場合は、既知の問題として公開されているので、個別に当てる(例外の内容でググるとよい)

SharePoint ってほんとうにたいへん。

ごきげんよう。