MyBook LiveというNASでWEBサイトをホストしてみた。イントロ

行き当たりばったりに生活しているというのはおそろしいもので、 まず最初は突然我が家のPCのメインOSとなっているWindows Vista を Windows 7にアップグレードしようとおもったのが発端だった。

ハードディスクの中身を見てみると500ギガバイトの残りが100ギガバイトを切っている。アップグレードする前にバックアップしようと思ったのだがバックアップするスペースがない。

大半はごみデータだというのはわかっているのだが、全部見ていって整理する自信がなかったので、バックアップ用のハードディスクを購入することにした。

NetWorkに接続できるハードディスクで安いものをと探したらBestBuyで Western DigitalのMybook Liveというのがセールになっていたので買って来た。 ちなみにこのようなデバイスをNAS(Network Attached Storage)と言うようだ。

1テラバイトで130ドルだった。 電源を接続するとブートアップし、IPアドレスを通してブラウザベースのユーザーインターフェースで中身を色々設定できる。ネットワークにハードディスクがぶら下がってビデオとか写真のデータを入れておけば、家庭内のパソコンからアクセスできる。 便利である。 MioNetというサービスを使えば、外部からも接続が可能らしい。

インターネットで情報を見ていたら、このデバイス、実はDebianLinuxで作動している、ということがわかった。 ちなみにCPUは800MhzのパワーPC,メモリーは256MB. さらに裏技でターミナルモードでLinuxにリモートログインができる、ということもわかった。  Western DigitalではMyBookシリーズを色々だしているようだが、これをLinuxのコンピューターとして使ってしまおうというユーザーが情報を交換しあっているサイトがあるのを見つけた。

 

で,試している途中ではUIがつかえなくなりそうになったりとか色々てこずった部分もあったが、結果的にどうなったかというと、このサイトの情報を参考にしながら、WEBサーバーを構築し、その中でPHPとMySQLも動かすことができるようになった。 もちろん従来のNASとしての機能もしっかり動作している。

ただし、一旦改造したものに対し、ファームウエアアップデートをうっかりおこなうと、せっかく設定したLinuxのイメージの部分を全部書き直すことになるそうで、 そうすると、ハックした部分はすべてまっさらになってしまい、もとの木阿弥。そうなった場合のリストアの手段も考えておかなくてはならない。

これだけで、内部でテスト用のLinuxべーす、Apache WEBサーバーとして使える。

次にこのウェブサーバーを外部からアクセスする事もできるようにするためにはドメインネームを確保しなければならないが、ドメインネームというのは固定したIPアドレスに割り当てられるものだとばかり思っていた。 我が家のインターネット環境はプロバイダによって割り当てられるIPアドレスがダイナミックアドレスになっていて、ケーブルモデムをリセットしたりした場合に同じアドレスに落ち着くという保障はどこにもない。 これは、どちらかといえば普通の環境だと思う。 ちなみに我が家はComcastという米国大手のケーブルサービスを使っている。

世の中良くしたもので、このようなユーザーのためにDDNS(DynamicDomainService)というのがある。 常にIPアドレスを監視していて、変更があったらすぐにドメインのアドレスに反映される。 自分はTZOという有料のサービス(年間30ドル)を使ったがDynDNSとか、NO-IPとか無料のサービスもあるようである。 自分が使っているシスコの無線ラウターには最初からDDNSをサポートする機能がついていて、これを使ってTZOの設定を行うとusername.linksysnet.comというようなドメインネームで外部から自宅のルーターまでたどり着くことができる。 ルーターのWEB専用のポートをMyBookLiveにフォワードするように設定しておくと、 外部からMyBookLiveのWebサーバーに接続される。

というわけでHostService無し、専用のサーバーPCを自宅で常に電源ONしておく必要もない、という状態で、Webサイトの運営ができるようになった。データ量が大きいサイトには使えないかもしれないが、ひっそりと使うサイトはこれで十分かも。

SharePoint のDocument LibraryをWindows Explorerで見る

Document library created in the SharePoint can be opened in the Windows Explorer. This is handy for bulk copying files from the network drive to SharePoint document library, for instance.  Procedure is quite simple. You just need to click “Actions” in the standard view menu and then select “Show in windows Explorer”  The separate file window will open.  You can copy, move paste etc., in this window.

People sometimes complained that this does not work for him/her.  It took me sometime to understand the reason. It turned out that this only worked at the root folder level in our installation of SharePoint 2003.  In aother word, if you create a subfolder in the document library and you “desend” to this subfolder, you can not switch the view to explorer view. Solution to this is to always start at the root folder level. With the 2007 installation, this limitation seems gone.

無料サイトと有料サイトの違い

いやおうなしに広告バナーが追加されてくるGodaddyの無料サイトなどは別にしても、従来使っていたバナーフリーの000website.comなどはそれなりに満足していたはずだったのだが、”間違えて”、購入してしまった有料サイトにこのブログを移行して早くもその差を体感している。
アップデートにしても、閲覧にしてもリスポンスが早い。  ストレスを感じない。 これをもってして、自分の間違いを許すこととする。(おい)

Switching host

I have just moved the web host from free hosting to fee based hosting.  One thing I immediately noticed was the increase in speed for accessing the site.  This costs me $4/month but hopefully I don’t need to deal with connection difficulty as often as I used to with the previous service.  The service I was using before was actually a fine one for free service.  The provider is called 000webhost.com, and they supplied a site without any advertisement, so I was able to have a site without clutter of flashy advertisement. But I think it’s worth to pay $4 for a peace of mind knowing I have a little better service with larger bandwidth.  Time to do more exploring.

SharePointクロスサイトのリスト表示をJQueryで行う

いきなりSharePointの話題なのであるが、同時にかなりマニアックである。

仕事場では4年前からSharePointを使っており自分の部署のアドミンなどをなぜか押し付けられ、とはいうもののねっこのところはしっかりITのかたがたが管理しているわけで、仏様の手のひらにのった孫悟空のようなカスタマイズしかできないわけではあるが、それはさておき

SharePointの不満のひとつにクロスサイトで使っているリストパーツを表示できない、というのがある。 同じサイトコレクションの下であればリストの共有もできる、ということだが、我がITチームはそのようには設定してくれなかった。 もちろん、それなりの理由が4年前にはあったわけで愚痴は言うまい(←言ってる).

Christophe Humbert氏が主催している Path to SharePoint ではこれに対する 解決法が載っている. 彼のサイトにある online tools のひとつが吐き出すJavaScriptを CEWPに落とし込んであげるだけで、他のサイトからのリストやカレンダーの表示が可能になる。 このスクリプトは  JQueryを使ってターゲットページのリストを抜き出し、中身をCEWPのあるところに表示するような仕掛けになっている。

この “Cross site list Snapshot tool” 、使ってみると快適に作動する。 ただし、この方法で抜き出されたリストはそのままではTextToHTML script が使えない。

この TextToHTML というのもChristopheさんの作なのだが、リスト表示の中身を計算式HTMLを生成したコラムをスクリプトを使って処理してカラーテキストや背景色を変えたり、果てはバーグラフやKPIに使うような赤・青・黄の信号灯を表示したりそのほかにも色々できる便利ものである。 もし、SharePointを使っていて、まだ見たことがなければ百聞は一見にしかず、 これとか,これ, あるいは こんな表示もできる、ということで、SharePointの表現力が一気に高まる。 同じ作者の Easy Tabs なども使ってサイトの設計を行えば、苦労せずに同僚から尊敬のまなざしで見られること間違いなしである。

ではなぜ、この二つのツールが組み合わせではうまくうごかないかというと  TextToHTML はページがロードしている最中に実行されてしまうが、そのときにはまだ Cross site list snapshot のスクリプトは他のページを読みこんでいる最中でリストの表示が間に合わないのである。

やはりおなじようなことを彼のブログで質問した人がいて、 Christopheさんが言うにはJQueryのcallback functionを使えば動くはず、ということであった。.

つまりJQuerryの load function に textToHTML scriptをコールバックさせて、順序正しくスクリプトを実行させればよいわけ。

早速試してみて、うまくいったので、ここに書いておく。 2010年の11月1日時点でPathToSharePointサイトにおいてあるスクリプトで作動を確認済み。

まずは TextToHTML のほうを修正する。.  このスクリプトをChristopheさんのサイトからダウンロードしたら、テキストエディターを使って以下の部分を修正する。 (ここでは “light version”を使用)

// Calendar views
var regexpA = new RegExp("\\s*<([a-zA-Z]*)(.|\\s)*/\\1?>\\s*");
TextToHTML(document.getElementsByTagName("a"),regexpA);

// List views
var regexpTD = new RegExp("^\\s*<([a-zA-Z]*)(.|\\s)*/\\1?>\\s*$");
TextToHTML(document.getElementsByTagName("TD"),regexpTD);

上の部分を下のように修正する。基本的には実行コードをファンクションとして定義する。

// Start of modifications
//Calendar views
function calendarT2H() {
var regexpA = new RegExp("\\s*<([a-zA-Z]*)(.|\\s)*/\\1?>\\s*");
TextToHTML(document.getElementsByTagName("a"),regexpA);
}
// List views
function listT2H(){
var regexpTD = new RegExp("^\\s*<([a-zA-Z]*)(.|\\s)*/\\1?>\\s*$");
TextToHTML(document.getElementsByTagName("TD"),regexpTD);
}
//maintains the original functionality of the script.
// Omit below two lines if no other part of the page uses TexttoHtML
calendarT2H();
listT2H();
//end of modifications

で、この修正されたスクリプトを TextToHTMLとして保存

次に Path To SharePoint’s  Tool のCross-Site-List-Snapshotページ を使って、自分の使いたいリストのスクリプトを作成。

このスクリプトをtext editorで開き、以下の文字列を探す。

..(“href”,$(this).attr(“href”)+s+”Source=”+location.href);});});};LoadView…

ここの

“location.href);});});};”

この部分を

“location.href);},listT2H());});};”

このように変更してコールバックを追加。  [ listT2H() はリスト表示の場合。カレンダーの場合は calendarT2H() に変更.]

[おまけ]JQuery load() 関数の使いかた。
Load (url,parameters,callback)
ここで url は参照されるURL, parameters は Javascript object で、サーバーにおくる値を プロパティーとして保持。callback はAjaxが終了した時点でjQueryが呼び出す関数。SnapshotのコードではurlがターゲットリストのあるページのURL. parametersはクリストフさんが処方したマジックパラメーターで、これでリスト成分をぬきだしている。ただし、オリジナルスクリプトではコールバックが空白になっている。 (実は昔JQueryの参考書を読んだときに、このCallback機能の具体的な使い方がわからなかったのだが今回の経験で必要性を実感した次第)

このスクリプトをセーブする.

われわれの環境はSharePoint2007で、一番綺麗にCEWPを使ってスクリプトを実行させる方法は、ソースとして書き込むのではなく、スクリプトファイルをリンクすることだと思っているので、サイト内に “webpart”というドキュメントライブラリーを作成し、ここに二つのスクリプトファイルをアップロードする。

リストを表示したい Web Part ZoneにはふたつのCEWPを埋め込むことになる。

WepPart 1 – CEWP  linked to ../webpart/CrossSiteListSnapshot-modified.txt
WebPart 2 – CEWP (Hidden) linked to ../webpart/TexttoHTML-modified.txt

これで、他のサイトのリストやカレンダーが色つきカラーバー付きで表示されるようになる。

めでたしめでたし!

Showing a list from another SharePoint Site

Showing a list from another SharePoint site (or cross-site listing)

One of the frustration about developing SharePoint page is that you can not use a list view from another Site. If two sites are under the same Site collection, then it will be possible but our IT people created each division’s site as independent site and not as a site collection (and there was a good reason for doing this way, 4 years ago. I am aware of that too.)

Christophe Humbert from Path to SharePoint has a solution to this. One of his online tools will generate a JavaScript snippet that you can drop into CEWP to show a list or calendar from another site page.  He uses JQuery to extract a list out of the target page and insert where the CEWP is located.

This “Cross site list Snapshot tool” works pretty well.  However, the list “extracted” in this manner can not take advantage of TextToHTML script.

The TextToHTML is another gem from Christophe that uses calculated columns to display colored text, background or even bar charts and also traffic signals (as KPI). If you have not seen his solution, take a look at this,this and this.  Along with Easy Tabs (another Christophe’s creation)  my colleagues in the office think I am a SharePoint wizard (far from the truth)

The reason the combination does not work is because  TextToHTML will execute as soon as the browser read the script. Unfortunately at that time, the Cross site list snapshot script is still busy working on extracting the list so TexttoHTML does not see the list.

In his response to one of the comments in his blog, Christophe mentioned a use of callback function that is available for JQuery so that two scripts can talk to each other.

The idea is for the JQuerry load function to “call back” textToHTML script once the load function finishes its primary job.

I have experimented with this concept and came up with (my) solution so I am presenting it here.  This works with scripts available from PathToSharePoint site as of November 1, 2010

First we have to modify the TextToHTML script.  Download the script from Christophe’s site and look for the following section of the code. (I use “light version” of the script)

// Calendar views
var regexpA = new RegExp("\\s*<([a-zA-Z]*)(.|\\s)*/\\1?>\\s*");
TextToHTML(document.getElementsByTagName("a"),regexpA);

// List views
var regexpTD = new RegExp("^\\s*<([a-zA-Z]*)(.|\\s)*/\\1?>\\s*$");
TextToHTML(document.getElementsByTagName("TD"),regexpTD);

Change  the code above as follows. In essense, we are turning the executable codes to function declarations.

// Start of modifications
//Calendar views
function calendarT2H() {
var regexpA = new RegExp("\\s*<([a-zA-Z]*)(.|\\s)*/\\1?>\\s*");
TextToHTML(document.getElementsByTagName("a"),regexpA);
}
// List views
function listT2H(){
var regexpTD = new RegExp("^\\s*<([a-zA-Z]*)(.|\\s)*/\\1?>\\s*$");
TextToHTML(document.getElementsByTagName("TD"),regexpTD);
}
//maintains the original functionality of the script.
// Omit below two lines if no other part of the page uses TexttoHtML
calendarT2H();
listT2H();
//end of modifications

Save the above script as your TextToHTML.

Now generate your list snapshot script using Path To SharePoint’s  Tool -Cross-Site-List-Snapshot page

Open the Script with text editor. Search for the following string toward the end of the script.

..(“href”,$(this).attr(“href”)+s+”Source=”+location.href);});});};LoadView…

Change

“location.href);});});};”

to

“location.href);},listT2H());});};”

What I did was to add a callback function parameter to JQuery’s  load() function.  [Replace listT2H() with calendarT2H() if the target is calendar.]

The JQuery load() function works like this
Load (url,parameters,callback)
Here, url is the URL of the resource being fetched, parameters is a Javascript object whose properties hold values to send to the server, and callback is a callback function that jQuery will call when the Ajax operation is complete. In the snapshot code, url is our list page url, parameters is a magic that Christophe is passing on to modify the list output. However,
as supplied by Christophe’s code generator, There is no callback.

Save the Script text.

I am using SharePoint2007 and I found the cleanest way to use CEWP for scripting is to link a file to CEWP, rather than entering source code directly in CEWP.  I create “webpart” document library and upload both text files to the library.

So, in the above set up,   A Web Part Zone has two webparts. Both are CEWP.

WepPart 1 – CEWP  linked to ../webpart/CrossSiteListSnapshot-modified.txt
WebPart 2 – CEWP (Hidden) linked to ../webpart/TexttoHTML-modified.txt

The page now shows a list from another site with calculated columns correctly rendered.

Why study PHP? 何故PHPなのか その2

まずは前回の復習 (Internet上のページがどのようにつくられているか、門外漢向けの説明、と同時に自分が理解したと思った内容の復習です)

  1. Internet のWeb home  Page上の情報 は HTMLという言語で記述されている。
  2. 表示の加飾方法(内容ではなく)についてはCSSというファイルに記述され、これがHTMLを記述したファイルから参照されている。
  3. これをブラウザが読み込んで人間たちが読めるように表示する。
  4. HTMLとCSSで構成されたweb Pageは静的なページで閲覧者のアクションに対して動的なページにするにはスクリプト言語を追加する必要がある。
  5. スクリプトにはブラウザー側で動くスクリプトとサーバー側で動くスクリプトがある。

 

と言うところまで説明しました。 今日はここから

ここで言っているサーバーの意味を簡単に言うと世界のどこかにある、Internetでホームページを発信しているコンピューターのこと。 スクリプトがサーバーで実行される場合は、閲覧者のコンピューターに届くときにはごく普通のHTMLファイルになっています。 ブラウザーからはサーバー側でどのような作業がされたのかを見ることはできません。 これの代表的な言語がPHPです。(マイクロソフトのExpress WebやVisual StudioでWebアプリケーションを作っている場合はNET.ASPという言語がサーバー側で動き、アプリケーション(aspxファイル)を処理してhtmlとCSS、VBscriptなどに吐き出してブラウザー側に送っています。)

Client 側とは 閲覧者が使っているブラウザーです。 ブラウザー側で動くスクリプトはHTMLに”このスクリプトを使ってね“という記述があって、 それをブラウザーが実行します。代表的なスクリプト言語にはJavaScriptがあります。VBScriptなどもそうです。 JavaScriptを使うと、dropdownやflyoutのメニューなどや、単語にカーソルを当てると、それに対応したイメージを表示させるような仕組み、フェードイン、フェードアウトのようなアニメーションをページに組み込むことができます。すなわちスクリプトの内容もブラウザー側に送られてきます。 ちなみにこのスクリプトの内容はIE8のような新しいブラウザーでは開発モードにすると(F12を押す)見ることができます。

Server side Scripting, Client side Scripting, それぞれ得手不得手があるので同じページに両方使うことも普通に行われます。

Server side scripting はサーバーがPHPやASP.netなどの環境をサポートしている必要があります。 有料のプロバイダーはほとんどの場合PHPをサポートしていますが、 無料サービスのホストの中にはサポートしていないこともあり、 そのようなHostを使っているときには、プロバイダーが用意したページ作成ソフトで画面を作るか、 HTML,CSS, JavaScriptの三種の神器のみでページ作成に取り組むことになります。

ここで自分がどうしてこのような事に興味を持ったのか、その理由を書いておきます。

インターネットサービスのプロバイダーと契約をしたときに、メールアカウントの他に、HomePageのスペースも頂きました。 15年も前の話です。 当時はwindows 95にFrontpage Expressというhome page 作成用のツールがついてきましたが、 今にして思うと、これは簡単なHTML生成のソフトでした。  このツールだけでも当時としてはそれなりのページが作れましたのでなんとなく満足していましたが、そのうちプロバイダーがWebPageBuilderというブラウザ上で簡単にhomepageを作れるツールを提供するようになりました。 これはテーマを選ぶと、それなりのページが作れ、メニューも自動生成される、というものでした。 それからというもの、内容の編集はすべてWEB上のツールで行いました。 しかし、それだとどうしても出来るページ、構成は定型なものになってしまいます。

私の場合、最初はHTMLだけで簡単なhomepageを作っていました。 そのうち、他の方たちのページを見て、見出し部分がしっかりトップにあり、メニューが左側に配置され、 その右側に本文が並べられているような作りはどうやって実現するのだろうと興味を覚えCSSを覚えることになりました。

さらに簡単なアニメーションとかも入れたくてJavaScriptも少し勉強しました。 JavaScriptの場合、Internetに色々なコードが開示されていたり、さらにJQuery というswiss army knifeのようなツールがあって、 かなり高度なこともそれほど深い知識が無くてもホームページ上で使えるようになります。

これだけでわりと「らしい」ページを作れるようになったのですが その次に困ったのが「すべてのページ共通な部分をいちいち コピーペーストで複製していかなくてはいけない」 ということでした。

特にメニュー関係の項目は メニューを増やすごとにすべてのページを編集しなければなりません。 これはもっと良い方法があるはずだ、と思ったのです。

調べてみると、サーバーサイドインクルード(SSI)という仕組みがあって、HTMLの記述に 「このファイルを含むのよ」 と書き込んで 別ファイルにメニューの記述を書いておけばこの別ファイルを変更するだけで このファイルを参照しているすべてのHTMLページに反映される、ということができるらしい、という事がわかりました。 ただし、この機能はサーバーがサポートしている必要があります。 

SSIと同じことは PHPでもできます。同じ事はJavaScriptでも出来るのですが、 PHPでは 一行のコード  ですむところをJavaScriptではそれなりのコーディングが必要になります。 なぜかというと、 PHPの場合はサーバー側で処理を行い、 ブラウザーが受け取るHTMLは既にインクルードされるべき内容が反映されたものになっていますが、JavaScriptで行う場合はまずはJavaScriptを含んだHTMLをブラウザ側で読み込み、次にJavaScriptの指示に従って、インクルードするべき内容をサーバーに取りに行き、これをHTML内部に埋め込むという作業を行った後で、整形されたHTMLをブラウザーが再度表示する、というような作業を行うからです。 JavaScriptでやるのはスマートではないなあ、と思い、PHPに興味が沸きました。 

一昔前のWebの教科書を見ると、Server Side Scripting はPerlという言語を使っています。 PHPというのはここ10年ほどで急速に認められてきた言語体系のようです。

さらに調べてみると、 WordPress ,Drupal, Joomla!など今話題のWebコンテントのマネージメントツールや、facebook,WikipediaなどのWeb serviceは皆PHPを使って作成されているようです。  これはかじってみるしかありますまい。 と思うに至り PHPの勉強をすることにした次第。

ModXのテンプレート変数(Template Variable, or TV)のすごさが判ってきた

 

とにかく実際に試してみる、とういのが物事なんでも大事なようで、オンラインのチュートリアルでわかったようなつもりになっていても、 実際に経験してみてその効果が実感できるということがよくわかったのが、このModXのTVの使い方

その1: 新しいページを作成してそこに表示するメニューをまったく別の親からはじめようと思ったのだが、メニュー部分はテンプレートに入っている。 テンプレートに新規のものを指定することももちろん出来るわけだが、今回はメニュー用Snippetのwayfinder のstartidの指定部分を`20`という固定から menurootというTVを作って`*menuroot`という変数指定とし、default値を20とすることで、従来のページには影響を与えず、新規のページについては何もしなければデフォルトのメニューを表示、メニューの表示を違う親から始めたければTVの値を指定できるようにして解決。

その2: その新しいページの固定幅を広くしたい必要が生じた。 CSSには .wrapper { width:750px; .. というクラスで指定してあるのだが、 新しく .wrapperWide{ width:1000x;   というクラスを指定し、 テンプレート上の

<div class=”wrapper”…  という部分を <div class=”wrapper[[*narrowOrWide]]….   として narrowOrWide というTVを追加する。   narrowOrWide のデフォルト値は空白なので、 従来のページはそのまま。 新しいページのnarrowOrWideのTV値を”Wide” とすることで解決。 

システムの仕組み上そうなるのが当たり前なのだが、 ページがうまく表示されたときには感動した。

Warning: Cannot modify header information – headers already sent by

新しいサイトに Feedback Formを実装して試験をしたらこのエラーに出くわした。 ググってみると結構ヒットする。 

基本的には <?php タグの前に文字列などがあるとこのエラーが出る、という話なのだが、 最初テクストパッドで見ても文字列どころかスペースもなにもない。 他の原因かと思い、推奨されていた バファリングをONにしたりなどしてみたが拉致開かず。 

ところがPSPADエディターをHexモードにして眺めてみると なぜか先頭にFFFEのバイトがくっついている。  

これは一体なんじゃい?  テクストモードだとまったくわからない。 

Watcom Cのエディターを起動し読み込んでみたら、 こちらでは 

<?php

 と出た。 PSPADでも設定を変えると表示できるような気がするが、とにかく、Watcom editor を使ってこのわけのわからんゴミを削除し、サイトにアップロードしなおしてトライしたところ解決! (さきほどNetBeansのIDEでも表示が出る事を確認) 無為に使った時間の総計約3時間

 
そこで FFFE at the beginning of Text file でググってみたら、  Wikipedia 上の Byte Order markという記述にたどりついた。NotepadなどのWindowsのエディターはデフォルトでこれがくっつくんだそうな。 説明はそちらにゆずるとして、  PHPで不具合が出ますよ、と、どんぴしゃのことがしっかり書いてある。 これで半日つぶしたぞ! 
 
PS: フラッシュを埋め込んだページのいくつかに、このが表示される理由がわからなかったのだが、 これでなんとなく察しがついた。 埋め込みに使ったテンプレートファイルを眺めてみることにしよう。
 
 
 in my case, it was the Byte order Mark that was appended to the beggining of the PHP file.  For detail discussion, see Wikipdia entry “byte order Mark”  It even talks about this particular  PHP error.