IIS のurls rewrite を使ってmodxのfriendly url を有効にする。

たとえIISサーバーを使っていてもHelicon Ape というツールをIISに組み込めば、modxについてくる.htaccess をそのまま使っのfriendly url を活用することはできているわけだが、今回はIISのURL rewrite module (IIS 7 の場合は別途ダウンロードで組み込む)を使って同じことをやってみた。

IISのGUIでルールを作る作業になるが、.htaccess の記述を参考にしてやってみたら動くようになった。

modx に付属する.htfile でfurl に関連するところは 以下の部分と思われる

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

これを解釈すると
条件として、要求されているファイル名がファイルとして存在しない、かつ
フォルダーとしても存在しない場合、それはつまり動的に生成されるHTMLページなので、
以下の書き換えルールを適用する。
書き換えルール: 渡された文字列$1を以下のパターンにして加工する
“index.php?q=$1”
さらに 後ろにクエリーがついている場合はそのまま渡し、 下流の処理を行わない。

IISのGUI上のRuleでは これを Inbound rule として追加するが、その内容は以下のごとくなる。

Matches Pattern, “Regular expression”
“^(.*\.html)$” <= RewriteRule の最初の部分*1 Conditions : "Matches All" {REQUEST_FILENAME} "file does not exist"  {REQUEST_FILENAME} "Directory does not exist" Action type "rewrite" index.php?q={R:1} <= RewriteRule index.php?q=$1 に匹敵 Append ques : yes <= [QSA] に匹敵 Stop Processing: yes <= [L] に匹敵 当たり前ながら、同じ条件を記述しているので、それほど迷わずにできた。 はまりそうになったところはRegular Expression の部分で.htmlを明示している部分。これをやらないとloopしてしまう。 ほかのところの条件付けでもっと綺麗に記述できるかもしれない。 とりあえず、これでOK

subfolder がアクセスできない? IIS

Modxで運用するサイトであるサブフォルダーだけアクセスできない。ManagerからはFile Treeで見ることができるのだが、フォルダーの中のイメージファイルの画像をレンダリングしない。 フロントエンドから見ると、イメージファイルの部分でサーバーエラーになっているようだ。

web.configでエラー出力をONにしてみると、エラー500で以下を表示した。

Configuration Error

Description: An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify your configuration file appropriately.

Parser Error Message: It is an error to use a section registered as allowDefinition=’MachineToApplication’ beyond application level.  This error can be caused by a virtual directory not being configured as an application in IIS.

Source Error:

 

Line 36:             に、ASP.NET で使用されるセキュリティ認証モードの構成
Line 37:             を有効にします。-->
Line 38: 		<authentication mode="Windows"/>
Line 39: 		<!--
Line 40:             <customErrors> セクションは、要求の実行中にハンドル


さて、これをどう解釈すればよいのだろう?とくよくよ考えるよりは、グーぐる検索をするのが一番で、この記述に行き当たった。

要約するとこういうことだ。IISサーバーで

 It is an error to use a section registered as allowDefinition=’MachineToApplication’ beyond application level.” というエラー表示が出る理由には二つある。

ひとつはアプリケーションをちゃんとバーチャルダイレクトリとして設定していないこと。 これは設定を見直せばよい。

もうひとつは、サブフォルダーにweb.configがルートのweb.configとバッティングするための不具合、

で、今回の場合、サブフォルダのファイルがアクセスできない、ということで、後者だと考え探したらやはりsubfolderに入っていたweb.configがルートのWebFoldeを発見。 考えてみればあたりまえで、このサブフォルダー、以前のテストでスタティックなサイトをやはりIISで運営していたのをmodxでダイナミックなサイトにしようとそのままコピーしていたのだ、から当然web.configもコピーしてしまっていた、というわけだった。

解決策としては、このサブフォルダーのweb.configをバッサリ削除。

 

たくもう。
後記:サブフォルダーにweb.configが存在すること自体、ありうる話(フォルダーごとに書き換えのルールを変えるなど。たとえばOutboundのurl情報からサブフォルダー情報を取り除く) なのでサイトの設定によっては必要なのだが、IISのGUIを使っていれば、このマネージメントはちゃんとなされて調和のとれたweb.configが作成される。
 

ModX cloud

Modx cloud というのをMODXのサイトで盛んに宣伝していたのは知っていたのだが、前回フォーラムにアクセスした際、「タダでアカウントをゲット」みたいなティッカーが表示され、それなら登録だけでも、とMODXCloud.comに登録してみれば、 Dev Siteを一本無料2本無料で使えることが分かったので、早速sandbox サイトを作ってみた。

これは便利だ。サーバーの構築を気にせず、簡単にサイトをリセットしたり、バージョンアップができるようだ。 スニペットやプラグイン、新しいアイデアを試してみたいときに気軽にアクセスしてイロイロ無茶やれそうな場所ができた。

MODXというのはコアを開発している人が基本的に二人なので、開発が細い。 その分、コニュニティで協力してやらなければならないのだろうが、MODXCLOUDのプロバージョンは他のプロバイダーよりも高めの料金設定なので、Financial なサポートをするのも 覚悟がいる。 バージョンアップの節目節目にdonationをするのが今の自分にできることだ。

modx Snippet を改良したときのメンテ法

昔に作ったmySnippet というスニペットがあるとする。 そしてそれを既にサイトのい何か所にも使っているような場合。

改良バージョンでmySnippet2というコードを作って、置き換えようとしたときに、全てのリソースのレファレンスを書き換える手間を省くために、mySnippetを以下の2行に書き換えて、mySnippetを呼んだときには実はmySnippet2を実行するようにしてしまう。


runSnippet('mysnippet2',$scriptProperties);
return $output

きも:modX のrunSnippetというAPIを呼び出して、パラメーターアレイには$scriptProperties というmodxのシステムアレイ変数を使えばmySnippetのプロパティセット及びタグ内部に使ったパラメーターがすべて新しいスニペットで使える。

簡単、確実。

JavaScript, Object literal で Private Variable を埋め込む

New とかを使わず、Object literal で object を記述するのがクール.。で、プライベート変数を仕込むには Function を使ってLiteral をReturnするパターンが使える。

var myobje=(function() {
// private変数
var name = "my, oh,my";
//この機能定義は即実行され、以下がまとめてオプジェクトリテラルとして返される。
return {
getName : function () {
return name;
}
};
}());

myobje.getName(); //"my, oh my"

おぷじぇくとの外部からはこのname という変数は直接いじれない。 function 内部の変数はファンクションが実行された後でも、内部に残っている、というClosure と呼ばれる性質を使った技。

Nexus7の使い方

最初はPDA的な使い方をするかなあ、と思いつつ購入したNexus7だったが、実際に今便利さを感じているのは 個人的な映画鑑賞とKindleの購読。 特に映画はGoogle Playから簡単に1日レンタルできてしまうのが、かなりやばい。

KindelのほうはKindle touchという専用端末があるのだが、両方使って別々の書籍を読んでいたりする。飛行機の長旅などでは電池の持ちが良いKindle Touchのほうが安心だが、Nexusのカラー表示というのも分野によっては捨てがたい。

Nexus 7 のバッテリーの持ち

先月くらいから急にNexus7のバッテリーの持ちが悪くなった。一日たつともう起動しなくなるくらいにバッテリーが減る。 これは変だとネットをあさってみると、OSの4.2.1アップグレード以後に電池の持ちが悪くなったという書き込みを多数発見。

で、JuiceDefender というスマホのほうで使っていたパワーセーブのアプリを入れたりしてしのいでいたが、先日 4.2.2のアップデートがプッシュされ、これを反映したら元に戻ったようだ。

Nexus 7 が起動しなくてびっくりした、という話

朝、いつものように、タブレットを充電プラグから外して画面をみようとしたら、画面が出てこない。 Power buttonを何度も押してみたがだめ。Nexus 7 が起動しない。 画面が出ない。

電池がだめになったか、とかいろいろ考えたが、考えるよりはまずグーグル。 dead nexus 7というキーワードで検索したら、パワーリセットの方法を書いた書き込みが見つかった。

1.パワーボタンとボリュームダウンボタンを同時に10秒間押し続ける。

2.パワーボタンから指を離す。

これでBios のような画面が出る。

あとはボリュームボタンで、Startを選びパワーボタンを押して回復した。

こいつもやっぱりコンピューターだった、という認識をあらたにしたのでした。