Flexで2回目以降のHTTPリクエストがキャッシュされてしまう

挙動を見る限りではHTTPリクエストの結果がキャッシュされていて、2回目以降はリクエストを発行せず(HTTP通信を行わず)に1回目のキャッシュを渡してくるっぽいです。
調べてみたらそのものスバリな回答がadobeのサイトにありました。どうやらFlexがキャッシュしているのではなく、Flexが動作しているブラウザがキャッシュを渡してくるようです。

HTTPService の send() メソッド実行時にリクエスト送信されない場合がある
http://kb2.adobe.com/jp/cps/232/232319.html

以下上記URLから引用:

上記の現象は、Flex アプリケーションがサーバに送信したリクエストを、ブラウザ(※)がキャッシュしているために発生しています。よって、リクエストがブラウザにキャッシュされないようにすることが回避策となります。
※ Internet Explorer のみ。FireFox の場合、本現象は発生しません。

IEだめぽ・・・orz

解決策としては、サーバ側で結果を返す際にヘッダ情報にブラウザのキャッシュを許可しないように明示してやれば回避できます。
今回サーバ側はPHPを使用していたので、結果を出力する前に下記コードを一行埋め込むことで対応しました。

header(“Cache-Control: no-cache, must-revalidate”); //キャッシュ無効化

ブラウザのキャッシュ制御についてはこのページを参考にさせていただきました。

ブラウザのキャッシュを制御する
http://tech.bayashi.net/pdmemo/browsercache.html

その他アプリ側だけで解決できる代替案としては、HTTPリクエストを投げる際に引数のひとつにユニークな文字列(タイムスタンプ等)を埋め込んで、ブラウザに毎回異なるリクエストだと思わせる方法もあるみたいです。

あとはブラウザのキャッシュ機能をOFFにするという手もありますが、さすがに利用者一人一人のブラウザのキャッシュをオフにするのは現実的ではないですね。

 

PDTで*.php以外の拡張子を持つファイルを関連付ける

PDTに限ったことではなく、Eclipse全般で言えることですが。

例えば拡張子に.includeを持つファイルをPHPファイルとして認識させたいならこんな感じです。

  1. メニューから ウィンドウ -> 設定を選択
  2. 左のペインから 一般 -> コンテンツ・タイプ を選択
  3. 右上の「コンテンツ・タイプ」ペインから テキスト -> PHP コンテンツ・タイプ を選択
  4. 右下の「ファイルの関連付け」ペイン横にある「追加」を押して「*.include」をコンテンツ・タイプとして入力し「OK」を押す
  5. 「OK」を押して設定ウィンドウを閉じる

以上です。
なお、関連付けを行う前に開いていた.includeファイルがある場合は、いったん閉じてから再度開く必要があります。

 

Excelファイルを開くと.TMPファイルが作成される

デスクトップ上にあるExcelファイルを編集していて気がつきました。見つけるたびにゴミ箱に放り込んでいたのですが、さすがにうっとうしくなったので原因と解決策を探っていたら、またもやウイルスバスターが原因と判明。

Microsoft Excelでファイルの上書き保存を行うと、拡張子”tmp”のファイルが作成される

対象はウィルスバスター2009とありますが、2010でもばっちり発現してます。
と思ったらこんな情報も

Microsoft Excel使用時にファイルの保存ができない(ウイルスバスター2010)

直ってないんじゃん、、、

というか、このPCのウイルスバスターが2009から2010へアップデートしたシロモノなので、2009で確認されたこの問題を抱えたまま今日に至ってるという可能性もなきにしもあらず。

とりあえず修正モジュール入れろと書いてあったので、手順どおりに入れてみた。今のところ無問題。

修正モジュールのダウンロード(ウイルスバスター2010用)

なお、上記モジュールを適用後も現象が回避されない場合には「Vsapi_UseMapping」を適用せよとのことです。
問題を修正できない修正モジュールってなんだよ。

Vsapi_UseMapping.zip

VsapiNTの何かのマッピングを変えるためにレジストリに変更を加えるようです。
こちらの環境では修正モジュールをインストール&再起動で問題は再発していないので、VsapiNTについてはとりあえず様子見です。

追記:
再発しました。(涙)
とりあえず上記のVsapi_UseMappingを適用してみました。術後の経過を静観中。
直感的にですが、データ量の大きいファイルの編集&上書きを繰り返していると発現するような気がします。大きなキャッシュを一時ファイルとして書き出すときに問題が生じるのかな?

 

Skype 4.2にしたらタスクバーから消えなくなった(Windows7)

4.1の頃は×ボタンを押したり「閉じる」を選択するとタスクバーに最小化されていたSkypeですが、4.2にアップデートしたら最小化されずタスクバーに居残ってしまうようになりました。ちなみにOSはWindows7(32bit)

結論から言うと、互換モード(Vista SP2)で起動するよう設定すると問題なく動作します。

  1. 「コンピューター」→「ローカルディスク(C:)」→「Program Files」→「Skype」→「Phone」と進み、スカイプのアイコン(Skype.exe)を右クリックして「プロパティ」を選択
  2. 「互換性」のタブを選択し、「互換モード」のくくりにある「互換モードでこのプログラムを実行する」のチェックボックスをオンにし、その下のプルダウンリストから「Windows Vista (Service Pack 2)」を選択する
  3. 「OK」を押してプロパティウィンドウを閉じる
  4. 通常通りSkypeを立ち上げ、タスクバーに最小化される事を確認する

以上です。

ネタ元はここ。
How to Minimize Skype to Windows 7 System Tray (Notification Area)
http://www.mydigitallife.info/2010/01/23/how-to-minimize-skype-to-windows-7-system-tray-notification-area/

今回の敗因は、メジャーリリース公開時に自動的にダウンロード&インストールする設定になっていた事ですね。
「設定」→「詳細」で速効オフ(通知のみ)にしておきました。
ってか今さらWindows7互換がらみのバグってなにさ。頼むよSkypeさん。

 

InfoPathの日付形式はyyyy-MM-ddです

InfoPathでは、フィールドに入力されたデータは、そのフィールドの「データ型」に設定された表示形式に変換された上で表示されます。例えば日付型(date)に設定されたフィールドに「2010/03/12」と入力すると「2010年3月12日」と表示されます。また、データ型に適合しないデータが入力されると、該当フィールドが赤枠で表示され「日付のみ指定してください」といったデータの修正を促すメッセージが表示されます。

これはこれで便利な機能なのですが、実際のXMLフィールドに格納される生データの書式がわからないという落とし穴も生じます。これが問題になるのはVSTAを使ってVBやC#で記述されたプログラムからフィールドに直接データを入力しようとする場合で、例えば日付データ型で表示形式が「yyyy/MM/dd」と定義されたフィールドに「2010/03/12」というデータを入れると「日付のみ指定してください」というエラーメッセージが表示されてしまいます。原因はInfoPathでは日付データを ISO形式(yy-MM-dd)という形式で格納するため、これ以外のフォーマットのデータは全てエラーとして認識してしまうのです。

そのフィールドの「見た目」を表示形式ではなく、InfoPathで定義されているデータ型の記述フォーマットに厳密に適合した形式で入力してあげる必要がある、というのがミソです。まあ文字列型に数字入れてもエラーにはならないので、ハマるとしたら確実に日付関連のフォーマットぐらいでしょうか。私は見事にそれにハマったわけですが。

フォーマットさえ分かれば、後はこんな↓感じで簡単なコードだけで変換する事が出来ます。

日付の場合:
string todaysDate = DateTime.Today.ToString(“yyyy-MM-dd”);

日付と時刻の場合:
string todaysDateAndTime = DateTime.Today.ToString(“yyyy-MM-ddThh:mm:ss”);

下記のドキュメントにDateの形式に関する情報がちょろっと確認できます

Date のメンバ
http://msdn.microsoft.com/ja-jp/library/microsoft.office.interop.InfoPath.semitrust.date_members.aspx

ただし上記のMicrosoftの公式ドキュメントにもあるように、この形式は共通言語仕様(CLS)には準拠していないため、たとえばこのデータを別システム(DBなど)に渡そうとする場合は再度データフォーマットの変換が必要になります。特に日付と時刻の型(YYYY-MM-DDThh:mm:ss)は、そのままMicrosfot SQL Serverのdatetime型フィールドに突っ込むとエラーになる(涙)ので、こんな感じで書式を再変換してやる必要があります

SQLServerのdatetime型に変換する
string todaysDateAndTime = DateTime.Parse(todaysDateAndTime).ToString();

しっかしInfoPath情報少ないですね、、、

 

Windows Server 2008で休止状態を無効にする

いつの間にかサーバの空き容量が20%を切っててびっくり。
調べたらpagefile.sysとhiberfil.sysだけで20GB近く食ってる。ページングファイルは別としてもハイバネーションはいらんだろ。サーバーをサスペンド状態にしておく運用ってなにさ。

コントロールパネル内にある電源オプションから変更できるのかとおもいきや、実はコマンドラインで設定する必要があるとのこと。Vista以降そうなったらしいのだけれど、そうだったかなあ。

powercfg.exe /hibernate off で無効
powercfg.exe /hibernate on で有効

いつもどおりマイクロソフトの仕様です。

Windows を実行しているコンピューター上で休止状態を無効にする方法および再度有効にする方法
http://support.microsoft.com/kb/920730/ja

  1. [スタート] ボタンをクリックし、[検索の開始] ボックスに「cmd」と入力します。
  2. 検索結果の一覧で、[cmd] を右クリックし、[管理者として実行] をクリックします。
  3. ユーザー アカウント制御からメッセージが表示される場合は、[続行] をクリックします。
  4. コマンド プロンプトで、「powercfg.exe /hibernate off」と入力します。
  5. 「exit」と入力し、Enter キーを押します。

念のためサーバは再起動させました。必要なかったかもしれないけれど、念のため。

 

ネットワークドライブにSQL Server エージェントのタスクはアクセスできない

結論から言うとUNC (\\サーバ名\フォルダ名)でアクセスしなさい、という事です。

もくろんでいたのは、別システムがsambaの共有ディレクトリ上に定期的に吐きだすテキストデータを、SSISパッケージ化したタスクで取得&データベースに取り込むというシナリオでした。その際にsambaの共有ディレクトリをQ:ドライブにマップして「Q:\hogehoge\Datafile.txt」という形式でアクセスしてやれと。

ところがSSISタスクを作成し手動で実行すると問題なく動作するのに、SQL Serverエージェントの定期ジョブに登録&実行するとエラーで停止してしまうんです。その際に表示されるエラーはこんな感じで、なんというか、決して親切ではないですね。

開始: xx:xx:xx
エラー: 20xx-xx-xx xx:xx:xx.xx
コード: 0xC002F304
ソース: ファイル システム タスク ファイル システム タスク
説明: エラーが次のエラー メッセージで発生しました: “パスの一部が見つかりません。”。 エラー終了
DTExec: パッケージの実行から返されました DTSER_FAILURE (1)。

試行錯誤の末、ローカル上に置いたファイルであれば問題ない事が判明。ネットワーク経由でのファイルアクセスが原因だという事になり、アクセス権限やらSSISパッケージのProtectionLevelの変更やら、いろいろ試したけど全部ダメ。

結局ネットワークドライブがそもそも使えねんじゃね?という結論にたどり着きました。
Windows Server 2000の関連資料としてこんな記述を見つけましたが、Windows Server 2008でも同じ現象が起きます。

ネットワーク ドライブの削除、再利用ができない
http://support.microsoft.com/kb/417903/ja

上記資料の「原因」の欄にある「SMB (Server Message Block)セッションは、ログオンとユーザー アカウント毎に管理されます。」というのがすべてを物語っています。つまりドライブレターの割り当ては、アカウント固有というわけではなくアカウントかつそのセッション固有のものである、と。

探してみたら同じような事しようとしてハマった人を発見。
フォーラムとはいえ、回答者によって「できる」「できない」で真っ二つに分かれているのがなんとも。
今回の件でいえば「ちゃっぴ」さんが正解です。

ネットワークドライブへのバックアップ
http://social.msdn.microsoft.com/Forums/ja-JP/sqlserverja/thread/d81f3dbc-9235-45e4-9743-2f854e5647d9

 

WordPress 2.9.xの自動アップデートがコケる

結論から言えば/var/php.iniのmemory_limitの上限を引き上げれば解決します:

[変更前]
memory_limit = 16M
[変更後]
memory_limit = 64M

(変更後は 「service httpd restart」 を実行してapacheを再起動すること。念のため)

ズボラな私は基本的に自動アップデートで済ませてしまうのですが、バージョン2.9.1以降、以下のメッセージが表示されたままウンともスンとも言わないという状態が続いていました

http://ja.wordpress.org/wordpress-2.9.1-ja.zip からアップデートをダウンロードしています。

その前後でサーバの移行などしていたためエラー原因が絞りきれず、とりあえず放置しておいた(笑)んですが、2.9.2がリリースされても同様の現象が確認されたので、とりあえず/var/log/httpd配下にあったapacheのエラーログを確認したらそのものズバリなエラーが。最初から見とけよ。

[Fri Feb 26 08:20:10 2010] [error] [client 192.168.XXX.XXX] PHP Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 2804864 bytes) in /xxx/xxx/tokiwasou.com/memo/wp-includes/http.php on line 1331, referer: http://www.tokiwasou.com/memo/wp-admin/update-core.php

要はPHP実行に必要なメモリが足りんと。どうやらサーバ移行した際にPHPに割り当てるメモリサイズ(memory_limit)を、デフォルト(16M)のまま放置しておいたのが原因のようです。33MB超のメモリを割り当てようとしてコケたみたいなのでとりあえず上記のmemory_limit=64Mで回避しましたが、このあたりのさじ加減はサーバによって異なると思うので、64Mで失敗する方は128Mでも256Mでもサーバのリソースが許す限りお好きな値をどうぞ。

 

Microsoft SQL Server Management Studioで「変更の保存が許可されていません」と言われた

Microsoft SQL Server Management Studioを使ってテーブルをデザインし、いざ作成(または変更を適用)しようとすると、

「変更の保存が許可されていません。行った変更には、次のテーブルを削除して再作成することが必要になります。再作成できないテーブルに変更を行ったか、テーブルの再作成を必要とする変更を保存できないようにするオプションが有効になってます。」

と冷たくあしらわれ、キャンセルするかテキストファイルに保存するしかない状況に追い込まれます。

てっきりデータベースのセキュリティ設定に引っかかったと思い、ユーザ追加したりパーミッション変更したりと色々やってみたのですがダメ。

つまるところDB側の問題ではなく、なんとMicrosoft SQL Server Management Studioの初期状態ではテーブルの作成を必要とするような変更はできないようになっている、というオチでした。

解決策:

  1. Microsoft SQL Server Management Studioの「ツール」メニューから「オプション」を選択し、ツリー表示の中から「Designers」をクリック
  2. 「テーブルの再作成を必要とする変更を保存できないようにする」チェックボックスを外す
  3. 「OK」を押して完了

うっかりミスを減らすためとはいえ、サーバ側でなくツール側に制限かけとくってどうなんでしょ。手間が増えるだけであんまり効果はないと思うんですけど。少なくとも僕は引っかかりました。

 

Windows Server 2008でKB967723がWindows Update失敗 (エラーコード:80070490)

KB967723はセキュリティ用の更新プログラムなのですが、こいつがコケます。
しかもコケるので放置しようとすると「インストールしてください」というポップアップが定期的に表示されてイラッとします。
%SystemRoot%\SoftwareDistribution\Download以下のファイルを全て削除するとか、BITS(Background Intelligent Transfer Service)サービス再起動したりとか色々やってみたのですがうまくいかず、結局個別にパッチ落としてインストールしたら問題なくインストールできました。なんなんだ、、、

Windows Server 2008 用セキュリティ更新プログラム (KB967723)

32bit:
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=35c1d5a9-a953-4fc6-90c0-d2358c7b89e6

64bit:
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=6e46822e-f79d-492d-ad01-ee680ad324f5

Service Pack2適用前後で発現しているので、ひょっとしたらこいつ絡みかも。
ちなみに当方ではSP2適用後にKB967723を個別にダウンロード&手動インストールで上手くいきました。64bit版です念のため。