ページ

2012年2月27日月曜日

◆SharePoint パワーピボット(Power Pivot) 自動更新でファイル破損

またもDBCS絡みのバグっぽい。

SharePointのパワーピボットギャラリーにファイルをアップロードして自動更新の設定を行った。
しばらくして、更新結果を確認するために開こうとすると以下のようなメッセージが表示される。

PowerPivotエラー2

自動更新しただけでファイルが壊れてしまうとは・・・。
相変わらずやってくれる。

調べてみると以下のようなバグが報告されている。
PowerPivot for SharePont: Data Refresh causes a damaged book | Microsoft Connect

日本語環境だけで発生する不具合のようだ。
CUで対策済みだとか。(どのCUか書いてくれても良いのにね・・・)

これかな。
累積的な更新プログラム パッケージ 2 SQL Server 2008年の R2 の
image

CUによってまた別の不具合が出たりするので、どうしたものか・・・・。

◆ShaprePoint パワーピボットギャラリーでエラーアイコンが表示される

SharePoint2010にパワーピボットをアップロードした所、以下のようなエラーアイコンが表示される。

PowerPivot

エラーメッセージは「このドキュメントのスナップショットをキャプチャ中にエラーが発生しました。」との事。

調べてみると以下のような報告がされていたので、またまたバグのようだ。

コメントを見ると以下の解決策を見ろとの事。

PowerPivot Gallery shows Red X's for Icons

で、単純に解決かと思ったのだが、対策案が13も有るは、リンク切れは有るは、欠番が有るはで、なんとも「イケテナイ資料」。

仕方が無いので1から順に検証。

  1. Excelサービスがワークブックをレンダリングしているか確認。
    単純に「Excelサービス」が起動しているか確認すると解釈。
    これは問題なさそう。
  2. IE9がサーバーにインストールされていたら、「Sql 2008 R2 SP1 for PowerPivot for SharePoint」が必要。
    これが、単に「SQL Server 2008R2 SP1」を指すのであれば既にインストール済みなのだが、PowerPivot用の特別な何かが有るのだろうか・・・。
    検索してみたがよく判らない。
    仕方がないので手動で確認する。
    1. 「"C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS\PowerPivot\ASRGLoader.htm"」を開く
    2. 「onXLFrameLoad」という関数(Function)を探して、その中の以下の行を置き換える。
      if (ewaFrame.document.readyState == 'complete') {
    3. 置き換える内容は以下の通り
      if ( (ewaFrame.document.readyState == 'complete') || (ewaFrame.document.readyState == 'interactive') ) {

幸運にもこれがビンゴだったようで、再起動したら「X」アイコンが消えてギャラリー(サムネイル)が表示されるようになった。

2012年1月14日土曜日

◆デジカメを買う

先日、娘へのクリスマスプレゼントにデジカメを買った。
なんか、時代ははるかに進んでいて、自宅のデジカメ(300万画素くらい)がだいぶ貧相に見えてきたのでこちらも買い換えることとした。

もともとあまり使わないのでそれほど興味はなく、適当に取れればOK

という事で、単に見た目て決める。(カミさん任せ)

Z950 / FinePix Z950EXR | 富士フイルム

まぁー、今時どこも同じだろうとたかを括っていたらいきなり失敗した気がする。

娘の機種は(当然これより安い奴)、本体にバッテリーを装着したままPCなどとUSB接続すると自動的に充電してくれる。
しかし、こいつは旧態依然としてバッテリーを取り外して充電器での充電のようだ。
ん~、嫌すぎる。

こちとら素人なもので今時はみんなUSB繋ぎゃ充電されるものと思っていた(TT

また、試しに付属ソフトをインストールして写真を取り込んでみたのだが、このソフト君、拡大表示のまま次の写真を表示することさえできないのね・・・。(横には行くのだが、2段目にまでは行かない)
しかも、画像サイズの変更さえできないと来ている。
今時は高解像度なのでメールで送ったりするのにサイズを小さくする機能なんて必須だと思うのだが、そんなことさえ出来やしない。
全くのゴミだ。(インストールするんじゃなかった・・・)

情けな・・・。

やっぱり何も研究せずに衝動買いしたのがまずかったかなぁ・・・。
正直写りなんてどうでも良いんだよね。(今時そんな酷いのは無いだろうから)
コンパクトデジカメなんて使い勝手命だと思うのになぁ・・・。
そういえば、一緒に買った専用のストラップもどうにも設計不良に近い使い難さ。

すごーく損した気分・・・。(だから新製品なのに安かったのかなぁ・・・)
娘の安い奴と交換してもらおうかな。

2011年12月26日月曜日

◆SharePoint2010クロール設定でのプロキシ

またまた、SharePointで嵌る。

SharePointではコンテンツを検索するためにクロール処理を行なっておく必要がある。
そのクロールの設定でプロキシサーバー設定も出来るのだが、こいつが摩訶不思議な動作をする。

デフォルトではプロキシサーバーは以下のような表示になっている。
image

しかーし、この「なし」には2つの意味があって、本当の「なし」を意味する時と「未設定」を意味するときがある。

「なし」を意味するときはプロキシサーバーを使わない。
「未設定」を意味するときはWinHttpのプロキシー設定を使う。

では、どういう時に「なし」でどういう時に「未設定」なのか。

それは、なななんと、一度も設定変更を行なっていない「なし」は「未設定」で一度でも変更した「なし」は「なし」なのだ。

では、それをどうやってそれを区別するのか。
なななんと、GUI的には確認するすべはない。

SharePoint恐るべし・・・。

 

ちなみに、PowerShellでは以下のコマンドレットでこの設定値を取ってくることができる。

>Get-SPEnterpriseSearchService | select proxytype

結果は、「Default/Proxy/Direct」のいずれかとなる。

しかし、3つの設定値のある項目を2つのGUIに纏めてしまう設計者とは一体どんな人なんでしょうね。

◆SQL Server PowerPivot for SharePointのインストール権限

私はMSのサーバーアプリケーションが大嫌いだ。

正確に言うとMSのサーバーアプリケーションを管理するのが大嫌いだ。

その昔、ProjectServerと格闘して以来嫌悪感さえ感じる。

不運にも、最近SharepointServerを管理する羽目になった。

予想に違わず、メタメタだ。

どこかWordを彷彿させる。

MS好きの私が、これだけ嫌なのだからMS嫌いの人はどれだけ嫌になることやら。
MS嫌いの人はもともとこんなの触らないか・・・。

 

SQL Server PowerPivot for SharePointというのをインストールしているのだがインストールアカウントにサーバーファーム管理者権限がないといってエラーになる。
image

ドメインのAdministratorでインストールしてこんなエラーが出るのは不可解だ。
サーバーファーム管理者にはデフォルトでBUILTIN\Administratorsが入っているのだから。
試しにドメインのAdministratorを明示的にファームAdministratorsに追加しても駄目。

SharePointをインストールした時のユーザーじゃないと駄目なのだろうか。

2011年12月22日木曜日

◆サクラエディタとキングソフト辞書の干渉

サクラエディタを使っていて、なぜか上書きコピー出来ない現象に嵌った。

インサート貼り付けは問題ない、キーボードから上書きも出来るのに上書き貼り付けだけが効かないのである。

サクラエディタの設定をいくら眺めても設定関係では無さそう。

かなり悩んで試行錯誤した所、上書き貼り付けができないのではなく、文字列を選択しただけでコピーされてしまうのだと判った。
上書きしようと対象文字列を選択した段階でその文字列がコピーされてしまうので結果的に同じ文字列が上書き貼付けされて、あたかも上書きできていないように見えてしまう。

なぜこんなことになってしまったのか。
それほど頻繁に使っているわけでは無いので、いつからおかしくなったのかも判らない。

あれやこれや試してみて、やっと判った。

どうもキングソフト辞書と干渉しているようである。
このソフトは「Ctrl」キーを押すとカーソル下の単語を翻訳、文字列選択するとその文章を翻訳してくれる。

良くは判らないのだが、このソフトの翻訳機能を一時的に無効にした所、今回の不思議な現象が止まった。

果たしてどちらが悪いのか・・・。

2011年12月20日火曜日

◆SharePoint2010はエクスプローラビューが無くなった

理由はよくわからないがSharePoint2010はエクスプローラビューが無くなった模様。(なんでですかねぇ・・・・)

しかし、WebDavはそのまま使えるようなので、「\\サーバー名\DavWWWRoot\sites\サイト名」を使えば良さげ。

2011年12月13日火曜日

◆なぜかGmailが遅い場合の対処方法(IE8)

娘に与えていたお下がりのLetsNoteがとうとうお亡くなりになって、(HDD交換すればまだ使えそうなのだが)、10年も使っているのでその後何年使えるかと考えつつ思案しながらAmazonを眺めていたらEeePCが2万程度で代えるのを見つけて衝動買い。(クリスマスプレゼントにしました)

娘はネットサーフィンしかしないので必要十分。
ノートPCが2万で買えるとは良い時代になったものだ。(LetsNoteは確か18万位で買ったような記憶がある)

ネットワークセットアップも終わり、IEを立ち上げてGoogle接続もOK

完了、と思いきや、Gmailが返ってこない。
そのまま放置すると何分かしてつながりはするのだが、これでは使いものにならない。
はて。

再起動とかしても変わらず、Gmail以外はサクサクなのに・・・。
Flashとか?
と思ってFlashを使っている他のサイトにアクセスしたが問題なし。
IE9に上げれば良いのかな・・・。

と思って一応ネットを探すとIEをリセットすると直るとか。

リセットたってあーた、さっきセットアップしたばかりですから。
と思いながら一応リセットすると、なんとサクサク動くじゃないですか。

ん~、IE恐るべし。

ちなみにリセットは、「ツール」「インターネットオプション」「詳細設定」で「リセット」ボタンをクリック。

2011年12月12日月曜日

◆ASP.NET MVC 検証機能を追加する

前回のサンプルに検証機能を追加してみる。

Viewの設定

まずはエラーが有った時に表示する文言をViewに設定しておく。

<body>
<div>
<% using (Html.BeginForm("MyPost", "HelloWorld", FormMethod.Post))
{%>
<label>名前:</label>
<%: Html.TextBox("name","<初期値>") %>
<%: Html.ValidationMessage("name", "必須未入力エラーです", new { @Style = "color:red;font-weight:bold;" })%>
<input type="submit" value="送信" />
<% } %>

</div>
</body>

追加したのは7行目。
HtmlはViewPageクラスのHtmlプロパティでHtmlHelper型。そのValidationMessageメソッドを呼び出すとModelStateDictionaryの中身を調べて第1引数で指定したコントロールにエラーが有るか調べてくれる。エラーが有った場合は第2引数で指定したメッセージをHTMLとして出力する。第3引数はそのメッセージのStyleと言った感じだ。
実際ModelStateDictionaryの中身を作るのはコントローラー側の仕事だ。


ちなみに、ValidationMessageメソッドは拡張メソッドになっていて、実際にはValidationExtensionsクラスで実装されている。


コントローラーでエラーチェック


View側で表示の準備が出来たので、こんどはコントローラー側で入力チェックを行い、エラーがあればModelStateDictionaryにエラー内容を突っ込んでいけば良い。
ModelStateDictionaryはControllerクラスのModelStateプロパティで参照可能だ。


        [HttpPost]
public ActionResult MyPost(string name)
{
if (String.IsNullOrEmpty(name)){ModelState.AddModelError("name", "");}

if (!ModelState.IsValid) { return View(); }

ViewData["HelloName"] = "Hello " + name;
return View("Result");
}

 


ここでは、単純にPostされてきたname引数が空だったらModelStateDictionaryのAddModelErrorメソッドでエラーを追加している。
第1引数がエラーのあったコントロール、第2引数がエラーメッセージ。
(View側でエラーメッセージまで定義したのでとりあえずこちらでは何も指定してない。)


実際には、ここで様々な入力項目のチェックを行い、その結果1つでもエラーが有ったかどうかを6行目のIsValidプロパティで判定することになる。
エラーが無ければ9行目で結果画面を表示させるし、エラーがあればそのままView画面に差し戻しといった感じである。


結果


2011-11-28 11h18_47


エラー表示にスタイルシートを使う


上記エラー画面のソースは以下のようになっている。


5行目、6行目を見ると「input-validation-error」、「field-validation-error」というクラス名が付与されているのが判る。
HtmlHelperクラスがエラーに応じて付与してくれるのだろう。
MVCプロジェクトには予めSite.cssというスタイルシートが用意されているので、それを使えば良いようだ。


スタイルシートを使うように変更したソースは以下の通り。


<body>
<div>
<form action="/HelloWorld/MyPost" method="post">
<label>名前:</label>
<input class="input-validation-error" id="name" name="name" type="text" value="" />
<span Style="color:red;font-weight:bold;" class="field-validation-error">必須未入力エラーです</span>
<input type="submit" value="送信" />
</form>

</div>
</body>

<head runat="server">
<title>MyPost</title>
<link rel="Stylesheet"
type="text/css" href="../../Content/Site.css"/>
</head>
<body>
<div>
<% using (Html.BeginForm("MyPost", "HelloWorld", FormMethod.Post))
{%>
<label>名前:</label>
<%: Html.TextBox("name","<初期値>") %>
<%-- <%: Html.ValidationMessage("name", "必須未入力エラーです", new { @Style = "color:red;font-weight:bold;" })%>
--%>
<%: Html.ValidationMessage("name", "必須未入力エラーです")%>
<input type="submit" value="送信" />
<% } %>

</div>
</body>

3行目でスタイルシートへの参照を追加して、12行目して指定していた個別のスタイル指定を削除した。


しかし、これで実行すると、


2011-11-28 11h57_22


といった表示になってしまい、なんとなくイマイチ。
あー、このスタイルシートはデフォルトで作られている以下のページ用なのね・・・。
2011-11-28 11h58_59


さしあたって、Validation関係のスタイル以外は削除し以下の通りとした。


/* Styles for validation helpers
-----------------------------------------------------------*/
.field-validation-error
{
color: #ff0000;
}

.field-validation-valid
{
display: none;
}

.input-validation-error
{
border: 1px solid #ff0000;
background-color: #ffeeee;
}

.validation-summary-errors
{
font-weight: bold;
color: #ff0000;
}

.validation-summary-valid
{
display: none;
}

サマリーエラーの表示


よくあるパターンとして、エラー内容を個々に表示するのではなく、サマリーとして纏めて表示する方法がある。


それには、Html.ValidationSummaryメソッドを使うと良い。
エラーチェック(Actionメソッド)側では、ModelState.AddModelError("name", "サマリーエラー")としてエラーメッセージを指定する。


        [HttpPost]
public ActionResult MyPost(string name)
{
if (String.IsNullOrEmpty(name)){ModelState.AddModelError("name", "サマリー用エラー発生");}

if (!ModelState.IsValid) { return View(); }

ViewData["HelloName"] = "Hello " + name;
return View("Result");
}
}

<body>
<div>
<% using (Html.BeginForm("MyPost", "HelloWorld", FormMethod.Post))
{%>
<label>名前:</label>
<%: Html.TextBox("name","<初期値>") %>
<%-- <%: Html.ValidationMessage("name", "必須未入力エラーです", new { @Style = "color:red;font-weight:bold;" })%>
--%>
<%: Html.ValidationMessage("name", "必須未入力エラーです")%>
<%=Html.ValidationSummary("以下のエラーが発生しました。")%>
<input type="submit" value="送信" />
<% } %>

</div>
</body>

2011年12月9日金曜日

◆PowerPivotでスライサーの追加エラー

ExcelのアドオンであるPowerPivotを検証している。

機能的には気に入ったが、若干動作が不安定で、再起動すると直ったりする。

Webサイトからテーブルデータをコピペしてシートを作り、ピボットテーブル化してスライサーを追加しようとした所以下のようなエラーが出た。(スライサーフィールドを追加できませんでした)

image

なぜだかよくは判らないが、対処方法としては「Ctrl + Alt + F5」で最新状態に更新してやると良いようだ。

2011年12月5日月曜日

◆SQLServerの外部接続を許可する

全くのFAQと思うが、いつも忘れるのでメモしておく。(今回は2008R2で確認している)

  1. 「SQL Server Configuration Manager」の「SQL Server ネットワークの構成」にて「TCP/IP」プロトコルを「有効」にする。
    image
  2. ファイアウォールの設定
    1. コントロールパネルにて「Windows ファイアウォール」を開く。
      image
    2. 「Windowsファイアウォールを介したプログラムまたは機能を許可する」をクリック。
      image
    3. 「別のプログラムの許可」ボタンをクリック。
      image
    4. 「参照」ボタンをクリックしSQLServerのプログラムの場所を指定。(デフォルトではC:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Binn\SQLServer.exe)
      image

      ※ポートを指定して穴を開ける方法でも良いが、SQLExpressなどは動的なポートを使うため、プログラムを指定する方法で統一しておいたほうが良いかも。
  3. SQLServerインスタンスをブラウズ(一覧検索)する必要がある場合は、先の「SQL Server Configuration Manager」で「SQL Server Browser」を自動開始にしておく。
    image

2011年11月25日金曜日

◆ASP.NET MVC Postデータを取得する

 

ポストページ表示用Actionメソッド

まずは、Post用のページを表示するためのActionメソッドを定義する。(ここではMyPostとした)

ちなみに、ActionメソッドはActionと入力しTab,Tabでコードスニペットを使うのが良さそうだ。

        public ActionResult MyPost()
{
return View();
}

次にこのメソッドの場所で右クリックして「ビューの追加」を選択。
2011-11-25 15h13_39


ポストページ表示用ビューサンプル


MyPost.aspx


<body>
<div>
<% using (Html.BeginForm())
{%>
<label>名前:</label>
<%: Html.TextBox("name","<初期値>") %>
<input type="submit" value="送信" />
<% } %>

</div>
</body>

ここではまず、HtmlヘルパークラスのBeginFormメソッドを使ってFormタグを展開している。
その中に、ラベル、テキストボックス、ボタンを配置。
テキストボックスにはこれもまたHtmlヘルパークラスのTextBoxメソッドを使用した。
これで表示される画面とソースは以下の通り。
2011-11-25 16h39_42


2011-11-25 16h40_48


ヘルパークラスを使っても、それほど便利という感じでもないが、最近ではRazor記法とかが出てきているようなのでそちらを使ったほうが良いのだろう。


ちなみに、これも最近の機能っぽいが、<%:  %> とするとHTMLエンコードまでやってくれるらしい。


なお、<% using (Html.BeginForm("MyPost", "HelloWorld", FormMethod.Post))とすることでactionとmethodを明示的に指定することも可能。


ポストされたデータを処理するアクションメソッド


基本的には入力画面を表示したアクションメソッドと同じメソッド名になるのだが、区別するためにこちらには[HttpPost]属性を付加する。(というかActionPostスニペットで展開させるとそうなる)
また、ポストされたデータを受け取るためにメソッドに引数を指定する。ここでは画面入力された「name」の値を取得するために(string name)としている。


入力値はRequestプロパティから参照できるHttpRequestオブジェクトからも取得できる(Request.Form(“name”))ので引数の指定は必須では無いようにも思うが、シグネチャが被るので1つは指定しないといけないだろう。


取得したポストデータは画面に渡すためにViewData["HelloName"]に入れておく。


このケースではアクションメソッドの名前と、結果を表示するためのビューの名前が異なるため、Viewメソッドにビューの名前を引数で与えている。


        [HttpPost]
public ActionResult MyPost(string name)
{
ViewData["HelloName"] = "Hello " + name;
return View("Result");
}

結果を表示するビュー


上記で設定されたViewDataを取ってきてそのまま表示するだけだ。


<body>
<div>
<%:ViewData["HelloName"]%>
</div>
</body>

◆ASP.NET ユーザーパラメータを受け取る

ユーザーパラメータを受け取るにはActionメソッドの引数に指定すれば良い。

        public ActionResult Index(string id)
{
ViewData["param1"] = "パラメータ1です。";
ViewData["id"] = String.Format("ユーザーパラメータは({0})です。",id);
return View();
}

<body>
<div>
Hello World !!<br/>
<%=Html.Encode(ViewData["param1"]) %><br />
<%=Html.Encode(ViewData["id"]) %><br />

</div>
</body>

2011-11-25 14h41_48


なお、パラメータを増やすにはGlobal.asaxのルーティング定義にパラメータを追加してあげれば良い。


image


image


image


2011-11-25 14h52_08

◆ASP.NET MVC コントローラーからビューにデータを渡す

コントローラー側は、ControllerベースクラスにViewDataプロパティが用意されている。
これは、ViewDataDictionaryクラスになっていて「Key」「Value」で値が設定できるので以下のようにKey名称を適当に決めて値をセットしてあげれば良い。

        public ActionResult Index()
{
ViewData["param1"] = "パラメータ1です。";
return View();
}

受け取り側のビューでも同様にViewData[“param1”]とやれば値が取ってこれる。
HTMLに埋め込むには<%=……%>コードブロックを使えば良さげ。(かつてのASPっぽい感じかな)


また、HTMLエンコードにはヘルパークラスが提供されていて、Html.Encode()メソッドが使える。


<body>
<div>
Hello World !!<br/>
<%=Html.Encode(ViewData["param1"]) %>
</div>
</body>

2011-11-25 14h17_12

◆ASP.NET MVC ルーティング

ルーティングはGlobal.asaxで定義されている。

    public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
"Default", // ルート名
"{controller}/{action}/{id}", // パラメーター付きの URL
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // パラメーターの既定値
);

}

protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();

RegisterRoutes(RouteTable.Routes);
}
}

RouteCollection型となっているので複数のルーティングを定義できるのだろう。
初期状態では”Default”というルーティングが定義されていて、
「コントローラー名/アクション名/パラメータ」でルーティングされるようだ。


ControllerにはHome、actionにはIndexが初期値として定義してあるので、例えば
「http://ホスト名/コントローラ名」でアクセスされたときにはIndexアクションが実行されてIndexページが返るという仕掛けなのだろう。

私が最近チェックした記事