レベル: 中級 Martin Brown, Developer and writer, Freelance
2008年 2月 05日 出力フォーマットの生成に使用する文書自体の中にフィルタリング命令を埋め込む場合、XQuery を使うと XML 文書の情報のマージやフィルタリングがずっと容易になります。この機能を利用すると、必要なフォーマットの中に RSS や Atom のフィード情報を集約することができます。この記事では、RSS と Atom のフォーマットの構造について調べ、さらに XQuery を使って RSS と Atom の情報の表示を単純化する方法を学びます。
RSS と Atom の基礎
RSS (Really Simple Syndication) の標準と Atom の標準は、さまざまな用途のための項目に対して XML 構造を使用します。RSS フィードも Atom フィードも、使い方としてはウェブログやニュースのサイトを宣伝するためのデータ配布フォーマットとしての用途が最も一般的です。
RSS フィードと Atom フィードが含む情報は比較的少量です。つまりユーザーがブログ投稿の全ページを表示する場合に通常配布される全情報を提供するわけではないため、ファイルのダウンロードは容易であり、また Web サーバーの負荷を軽減することができます。また RSS と Atom のファイルには、フィードの中のデータを識別、整理するための、作成者やタイトル、主題、キーワードといったタグの付いた情報など、より詳細な分類情報が含まれています。
以下に示すのは私のブログから引用した RSS フィードの一例です (リスト 1)。
リスト 1. RSS フィードの例
<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.0.4" -->
<rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
>
<channel>
<title>MCslp</title>
<link>http://mcslp.com</link>
<description>News from the desk of Martin MC Brown</description>
<pubDate>Wed, 07 Nov 2007 23:25:53 +0000</pubDate>
<generator>http://wordpress.org/?v=2.0.4</generator>
<language>en</language>
<item>
<title>System Administration Toolkit: Testing system validity</title>
<link>http://mcslp.com/?p=269</link>
<comments>http://mcslp.com/?p=269#comments</comments>
<pubDate>Wed, 07 Nov 2007 23:25:48 +0000</pubDate>
<dc:creator>Martin MC Brown</dc:creator>
<category>Articles</category>
<category>IBM developerWorks</category>
<category>Open Source</category>
<category>System Administration</category>
<guid isPermaLink="false">http://mcslp.com/?p=269</guid>
<description><![CDATA[Have you ever wondered whether the system you are
using is the same as the one that you originally configured?
Making sure that the configuration and setting information that you configured is the
same as when you configured it should be a basic part of any security procedure.
After all, if an unscrupulous person has [...]]]></description>
<content:encoded><![CDATA[<p>Have you ever wondered whether the
system you are using is the same as the one that you originally configured?
</p>
<p>Making sure that the configuration and setting information that you configured
is the same as when you configured it should be a basic part of any security procedure.
After all, if an unscrupulous person has changed the configuration of your system, you
want to know about it. </p>
<p>Tracking that information though can be difficult. You can't expect to
check the contents of every single file. Even if you automated the process, the
potential quantity of information to be checked could be enormous and often what you
want first is a quick indication of where to start looking. </p>
<p>In my new article, System Administration Toolkit: Testing system validity I
show you a number of techniques for recording and verifying this information, and
include sample scripts that will automate the process for you. </p>
<p>Read: <a href="http://www.ibm.com/developerworks/aix/library/
au-satsystemvalidity/index.html?ca=drs-">Systems Administration Toolkit:
Testing system validity</a>
</p>
]]></content:encoded>
<wfw:commentRSS>http://mcslp.com/?feed=rss2&p=269</wfw:commentRSS>
</item>
...
</rss>
|
この同じ情報を Atom フォーマットで表現したものがリスト 2 です。
リスト 2. Atom の例
<?xml version="1.0" encoding="UTF-8"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en">
<title>MCslp</title>
<link rel="alternate" type="text/html" href="http://mcslp.com"/>
<tagline>News from the desk of Martin MC Brown</tagline>
<modified>2007-11-07T23:25:53Z</modified>
<copyright>Copyright 2007</copyright>
<generator url="http://wordpress.org/"
version="2.0.4">WordPress</generator>
<entry>
<author>
<name>Martin MC Brown</name>
</author>
<title type="text/html" mode="escaped"
><![CDATA[System Administration Toolkit:
Testing system validity]]></title>
<link rel="alternate" type="text/html" href="http://mcslp.com/?p=269"/>
<id>http://mcslp.com/?p=269</id>
<modified>2007-11-07T23:25:48Z</modified>
<issued>2007-11-07T23:25:48Z</issued>
<dc:subject>Articles</dc:subject>
<dc:subject>IBM developerWorks</dc:subject>
<dc:subject>Open Source</dc:subject>
<dc:subject>System Administration</dc:subject>
<summary type="text/plain" mode="escaped"><![CDATA[Have you ever
wondered whether the system you are using is the same as the one that you
originally configured?
Making sure that the configuration and setting information that you configured
is the same as when you configured it should be a basic part of any security
procedure. After all, if an unscrupulous person has [...]]]></summary>
<content type="text/html" mode="escaped"
xml:base="http://mcslp.com/?p=269"><![CDATA[...]]></content>
</entry>
|
表 1 は RSS ファイルと Atom ファイルから抽出できる情報を要約したものです。この表では、それぞれの情報のタイプに対応する XML タグを一覧表示しています。後ほど RSS と Atom の個々のファイルの内容を構文解析し、処理する際に、この表が必要になります。
表 1. RSS ファイルと Atom ファイルから抽出できる情報の要約
| RSS | Atom | 説明 |
|---|
| channel | feed | フィード情報のルート | | title | title | フィードのタイトル、または投稿のタイトル | | link | link | 配信元のホストへのリンク、または個々の投稿へのリンク | | item | entry | 個々のニュース項目あるいはブログ・ポストのルート | | dc:creator | author | 投稿の作成者 | | pubDate | modified | 変更日 | | pubDate | issued | 公開日 | | category | dc:subject | カテゴリーまたは主題 | | description | summary | 投稿の要約 | | content:encoded | content | 投稿の内容全体 |
通常は、フィード情報を構成する XML ファイルの内容を構文解析し、その情報を適切なフォーマットで出力します。
RSS と Atom に対する従来の処理
XQuery によるソリューションを調べる前に、従来のソリューションでは RSS ファイルと Atom ファイルを構文解析し、出力を生成するという問題をどう処理しているかを検証しましょう。ここではその例として、RSS と Atom のフィードを HTML に変換します。
RSS または Atom フィードを処理するための従来の方法では、プログラミング言語 (Perl や PHP、Java など) を使って XML ファイルの内容のすべてを構文解析します。そしてその情報を動的に出力するか、あるいは静的な HTML ファイルに出力して表示します。
Perl によるプロセッサーの例をリスト 3 に示します。このスクリプトでは、大量の複雑な作業を行ってくれる XML::FeedPP モジュールを使っています。このモジュールは XML をダウンロードして構文解析し、その情報をオブジェクトとして返します。このオブジェクトに対して繰り返しで処理を行うことで、項目のタイトルとリンク・アドレスを出力することができます。
リスト 3. XML::FeedPP モジュールを利用した Perl ベースのパーサー
use XML::FeedPP;
my $source = 'http://planet.mcslp.com/wp-rss2.php';
my $feed = XML::FeedPP->new( $source );
print <<EOF;
<html>
<body>
<b>All the news that's fit to print</b>
<hr/>
EOF
foreach my $item ($feed->get_item())
{
my ($title,$link) = ($item->link(),$item->title());
print <<EOF;
<div>
RSS item <b>$title</b> is located at <b>$link</b>
</div>
EOF
}
print <<EOF
</body>
</html>
EOF
|
このスクリプトを実行すると、リスト 4 のような出力が得られます。この出力は HTML ですが、当然ながらプログラミング言語によるソリューションの利点として、この情報をデータベースの中に挿入することもできます。
リスト 4. Perl ベースの RSS パーサーの出力を一部省略して表示したもの
<html>
<body>
<b>All the news that's fit to print</b>
<hr/>
<div>
RSS item <b>http://feeds.computerworld.com/~r/Computerworld/MartinMCBrown/
~3/188475547/six_months_with_two_skype_phones</b> is located at <b>Six
months with two Skype phones</b>
</div>
<div>
RSS item <b>http://feeds.computerworld.com/~r/Computerworld/MartinMCBrown/
~3/187849420/what_to_do_with_the_old_computing_bits_and_pieces</b> is located
at <b>What to do with the old computing bits and pieces</b>
</div>
...
</div>
</body>
</html>
|
プログラミング言語によるソリューションの 1 つの問題は、XML の処理は比較的複雑なプロセスであり、また実装や言語が異なると XML 情報の処理機能も異なることです。
しかし (特に大部分の言語にとって) 最も複雑なのは、マークアップ要素とプログラミング要素は同じファイル内に組み合わされていることが多いにもかかわらず、実際に処理を追いかける場合で、非常に複雑になりがちです。出力のスタイルやレイアウトを変更しようとしても、それを実現するためにプログラミング・ロジックに大幅な変更が必要になるため、変更は困難であったり、さらには問題が起きやすくなったりします。
RSS または Atom フィードを処理する、もう 1 つの方法は、XSLT スタイルシートを使用して即時処理で情報を HTML に変換する方法です。XSLT を使った例をリスト 5 に示します。この例は Perl スクリプトによって得られる出力と同じ基本的な出力を生成します。
リスト 5. XSLT スタイルシートを使用する
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" />
<xsl:template match="rss/channel">
<html>
<body>
<xsl:apply-templates select="item" />
</body>
</html>
</xsl:template>
<xsl:template match="item">
<div>
RSS item <b><xsl:value-of select="title"/></b> is located
at <b><xsl:value-of select="link"/></b>
</div>
</xsl:template>
</xsl:stylesheet>
|
XSLT によるソリューションには、フォーマット用のソースと同じファイルに処理のプログラミング部分を埋め込めるという、大きな利点があります。個々のコンポーネントを構文解析する XSL 文が付加されていても、文書の基本的な構造は見えるのです。
XSLT の欠点は、入力 XML が複雑であり出力ファイルも複雑なため、より一層処理が複雑になってしまうことです。XSLT はループなどの基本的なプログラミング概念をサポートしており、さらには一部の複雑なデータや情報を処理することもできますが、完全なプログラミング言語に比べると XSLT の機能は限定されています。このように処理が複雑になるため、特に非常に大規模で複雑なファイルの場合には一部の処理が遅くなります。
ここに挙げた例を使った場合には、RSS フィードと Atom フィード両方のすべての要素を処理する XSL 変換を作成することは困難かもしれませんが、不可能ではありません。しかしその出力と動作は非常に理解しにくいものになるかもしれません。
XQuery を使って RSS を即時変換する
XQuery は、個々の要素を抽出する上での XPath 仕様言語の柔軟性と、関数やループ、そしてプログラム可能要素を容易に定義できる機能とを組み合わせて持っています。この組み合わせによって、XPath での単純なパス処理を、処理の際に情報を読み取り、操作するための柔軟な方法に変えることができます。
XQuery は XSLT とは異なり、理解しやすいプログラミング環境と実行モデルを持っています。また、いくつかの強い型付けが可能なため、プログラミング言語ベースのソリューションに頼ることなく容易に情報を処理することができます。
まず、先ほどの例と等価な、RSS ソースの情報を基本的な HTML ファイルとして出力する非常に単純な例から始めましょう (リスト 6)。
リスト 6. XQuery ベースの単純な RSS パーサー
declare function local:rss-row ($link, $title)
{
<div>
RSS item <b>{$title}</b> is located at <b>{$link}</b>
</div>
};
declare function local:rss-summary ($url)
{
for $b in doc($url)/rss/channel/item
return local:rss-row($b/link/text(), $b/title/text())
};
<html>
<body>
<b>All the news that's fit to print</b>
<hr/>
{local:rss-summary("planet.rss2.xml")}
</body>
</html>
|
このクエリーは次のように分解することができます。
- メインのコンポーネントは <html> タグに囲まれた部分であり、ここにはローカルの rss-summary 関数への呼び出しが含まれ、RSS ソースを提供しています (RSS ソースはここではローカル・ファイルですが、URL の場合もあるかもしれません)。
- その前に宣言されている rss-summary 関数は、XPath 仕様を使って各項目を選択することで、for ループを使って各項目を繰り返しで処理しています。
- 各項目に対してローカルの rss-summary 関数を呼び出します。この関数は提供されたリンクとタイトル・テキストを取得し、それを HTML フラグメントの中に挿入しています。
XQuery コンポーネントを提供する GNU Qexo ライブラリーを使ってクエリーを実行します ($ java -jar kawa-1.9.1.jar --xquery --main simplerss.xql)。
出力は基本的に、他のソリューションを利用した先ほどの例と同じです。そこで、先に進み、元々の基本的な例を拡張することにしましょう。
出力をソートする
最も単純な第一歩は、出力用にニュース項目をソートすることです。従来のソリューションでは、ソートは不可能とは言えないまでも困難な場合がありました。しかし XQuery はいくつかの異なるデータ型をサポートしています。これは、さまざまなデータに基づいて、ソース XML ファイルの中でソートを行えるということです。
ニュース・フィードの場合には、さまざまな情報断片に基づいて項目をソートする場合がほとんどです。典型的なモデルでは、項目を日付でソートし、エントリーを日付順に読めるようにしています。
出力にソート機能を追加するためには、出力を命令するための 1 行を rss-summary 関数の中の FLOWR (for、let、where、order by、そして return) 式に単に追加するだけです (リスト 7)。
リスト 7. 出力にソート機能を追加する
declare function local:rss-summary ($url)
{
for $b in doc($url)/rss/channel/item
order by $b/pubDate
return local:rss-row($b/link/text(), $b/title/text())
};
|
XQuery は RSS ファイルと Atom ファイルの中に書かれている日付をそのまま理解できるため、情報を自動的にソートしてくれます。もし項目を日付の降順に (最新項目が最初になるように) 並べたい場合には、単純に式によって命令に descending パラメーターを追加します (リスト 8)。
リスト 8. descending パラメーターを追加する
declare function local:rss-summary ($url)
{
for $b in doc($url)/rss/channel/item
order by $b/pubDate descending
return local:rss-row($b/link/text(), $b/title/text())
};
|
日付でソートする上記のどちらの例でも、個々のタグの内容をソートの値として選択することで、XPath 式を使って個々の項目 (この場合は RSS フィードの中の 1 つの項目) を参照しています。
これで、XQuery を使って 1 つの RSS フィードを HTML として出力する、基本的なシステムができました。今度は複数のフィードを処理する必要があります。
複数のフィードをマージする
元々のスクリプトでは、システムはどのフィードを処理するかを、rss-summary 関数への呼び出しの中にある指定によって判断しています ({local:rss-summary("planet.rss2.xml")})。
さらにフィードを追加するためには、この関数を複数回呼び出します。planet.mcslp.com は、実際にはいくつかの異なるフィードを集約し、表示しやすいように 1 つのブログやフィードとして提供します。このプロセスを繰り返すには、複数のフィードをマージする XQuery を使います。
また、複数のフィードをマージする場合には、おそらく各投稿にタイトルを追加して各投稿のソースを表示できるようにしたいはずです。リスト 9 は、2 つのフィードからの情報を含むように変更されたフィード出力を示しています。
リスト 9. 複数の RSS フィードを表示する (multirss.xql)
declare function local:rss-row ($doctitle, $link, $title)
{
<li><a href="{$link}">{$doctitle}: {$title}</a></li>
};
declare function local:rss-summary ($url)
{
let $feeddoc := doc($url)
for $b in $feeddoc/rss/channel/item
order by $b/pubDate descending
return local:rss-row($feeddoc/rss/channel/title/text(), $b/link/text(), $b/title/text())
};
<html>
<body>
<b>All the news that's fit to print</b>
<hr/>
<ul>
{local:rss-summary("http://coalface.mcslp.com/wp-rss2.php")}
{local:rss-summary("http://www.mcslp.com/wp-rss2.php")}
</ul>
</body>
</html>
|
図 1 は、このプロセスの出力を最終的に HTML として描画したものを示しています。
図 1. 複数の RSS フィード
2 つの文書で連続的に rss-summary 関数を複数回呼び出すことによる問題は、情報がマージされないことです。つまり 1 つのフィードからの情報が出力され、続いてもう 1 つのフィードからの情報が出力されます。
複数のフィードを本当にマージするために最も容易な方法は、中間的な XML 文書を作成してそれを XQuery を使って再度構文解析し、個々の情報をフィルタリングして出力する方法です。この例をリスト 10 に示します。
リスト 10. 中間的な文書 (multirss2.xql) を使って複数のフィードをマージする
declare function local:buildmergerow ($doctitle, $item)
{
<item>
<doctitle>{$doctitle}</doctitle>
<title>{$item/title/text()}</title>
<link>{$item/link/text()}</link>
<pubdate>{$item/pubDate/text()}</pubdate>
</item>
};
declare function local:rss-row ($item)
{
<li><a href="{$item/link/text()}">{$item/doctitle/text()}:
{$item/title/text()}</a></li>
};
declare function local:rss-summary ($url)
{
let $feeddoc := doc($url)
for $b in $feeddoc/rss/channel/item
return local:buildmergerow($feeddoc/rss/channel/title/text(), $b)
};
<html>
<body>
<b>All the news that's fit to print</b>
<hr/>
<ul>
{
let $feedlist := ("http://coalface.mcslp.com/wp-rss2.php",
"http://www.mcslp.com/wp-rss2.php")
let $merged := for $url in $feedlist
return local:rss-summary($url)
return for $item in $merged
order by $item/pubdate descending
return local:rss-row($item)
}
</ul>
</body>
</html>
|
リスト 10 の例の動作は前の例よりも複雑ですが、それでも非常に単純です。この例は 4 つのコンポーネント (3 つの関数とメインの実行ブロック) に分割されますが、それぞれの部分は異なる役割を果たします。
-
buildmergerow() 関数はフィードのタイトルと個々の項目を受け付け、各項目に対して中間的な XML 構造を作成します (この XML 構造にはフィードのタイトル、項目のタイトル、リンク、そして公開日情報が含まれています)。
-
rss-summary() 関数は前の例とほとんど同じく、各項目に関して個々のフィードを処理しますが、この場合は各項目に対して buildmergerow() を呼び出します。
-
rss-row() 関数は、疑似的な RSS 風の XML フォーマットの中にある項目を HTML のリスト項目のフォーマットにします。
メインのブロックはフィードのリストを提供します。このフィードのリストに対して、それぞれのフィードを処理し、その処理結果の出力を返し、$merged 変数に格納します。for ループ全体の出力をこの変数に割り当てるため、その結果として、疑似的な RSS 項目の XML のリストをすべてのフィードに対する変数の中に配置することになります。処理が終了すると、$merged の値は、すべての RSS フィードのすべての項目を XML フォーマットで含んでいます。
次に、このセクションの最後の for ループは、この疑似的な RSS リストに対して繰り返しで処理を行い、項目をソートし、rss-row() 関数を使って情報をフォーマットします。すべてのフィードのすべての項目を 1 つの $merged リストの中にマージしたので、すべての項目を同じパラメーター (この場合は日付) を使ってソートすることができ、日付の新しい順に適切にマージされたリストを作成することができます。
このプロセスの結果を図 2 に示します。
図 2. マージされた RSS フィード
両方のタイプのフィードを処理する
複数の RSS フィードをマージする先ほどの例は、実際にはさまざまなタイプのフィードを処理するためのソリューションとして使用することができます。先ほどと同じ中間的な処理の手法を使って RSS フィードと Atom フィードを構文解析して中間的な XML フォーマットにし、その中間的な XML 文書を処理して必要な情報を作成するのです。
この場合には、いくつかの障害を克服する必要があります。最初の問題は、Atom がソース XML 文書の中で名前空間を使うことです。そのため、情報を適切に抽出するためには Atom の名前空間を宣言する必要があります。
2 番目の問題は、アクセス対象とする文書タイプを識別する必要があることです。文書タイプはフィードあるいは文書の名前から明らかなことが多いのですが、XQuery の中で if 文を使って特定のタグを探し、適切な構文解析関数を実行してファイルから文書タイプに関する情報を抽出することができます。この if 文の例をリスト 11 のフラグメントに示します。
リスト 11. フィード・タイプの情報を識別する if 文
if (count($feeddoc/atom:feed/atom:entry) > 0)
then
local:parse-atom($feeddoc)
else
local:parse-rss($feeddoc)
|
リスト 12 は完全なリストを示しています。このリストでは先ほどのソリューションを採用しています。先ほど見た、中間的な文書を作成する 1 つの関数の代わりに、今度は Atom フィード用の関数と RSS フィード用の関数という 2 つの関数があります。先ほどのソリューションと同様に、今度は各フィードを処理するために別々の関数があり (XPath 仕様は各フィードで異なるため)、中間的な XML 文書を作成するための、各フィードに対応する関数があります。
リスト 12. さまざまなタイプのフィードをマージする (multifeed.xql)
declare namespace atom = "http://purl.org/atom/ns#";
declare function local:atombuildmergerow ($doctitle, $item)
{
<item>
<doctitle>{$doctitle}</doctitle>
<title>{ $item/atom:title/text() }</title>
<link>{$item/atom:id/text()}</link>
<pubdate>{$item/atom:modified/text()}</pubdate>
</item>
};
declare function local:rssbuildmergerow ($doctitle, $item)
{
<item>
<doctitle>{$doctitle}</doctitle>
<title>{$item/title/text()}</title>
<link>{$item/link/text()}</link>
<pubdate>{$item/pubDate/text()}</pubdate>
</item>
};
declare function local:rss-row ($item)
{
<li><a href="{$item/link/text()}">{$item/doctitle/text()}:
{$item/title/text()}</a></li>
};
declare function local:parse-rss($feeddoc)
{
for $b in $feeddoc/rss/channel/item
return local:rssbuildmergerow($feeddoc/rss/channel/title/text(), $b)
};
declare function local:parse-atom($feeddoc)
{
for $b in $feeddoc/atom:feed/atom:entry
return local:atombuildmergerow($feeddoc/atom:feed/atom:title/text(), $b)
};
<html>
<body>
<b>All the news that's fit to print</b>
<hr/>
<ul>
{
let $feedlist := ("coalface.rss2.xml",
"mcslp.atom.xml")
let $merged := for $url in $feedlist
let $feeddoc := doc($url)
return if (count($feeddoc/atom:feed/atom:entry) > 0)
then
local:parse-atom($feeddoc)
else
local:parse-rss($feeddoc)
return for $item in $merged
order by $item/title
return local:rss-row($item)
}
</ul>
</body>
</html>
|
ここでは、スクリプトはファイルのローカル・コピーを使って少し時間を節約しています。では、Qexo ツールキットとは異なり、組み込みの URL アクセサー・メソッドを含まない別の XQuery プロセッサーを使って内容を構文解析してみましょう。例えば Saxon XQuery プロセッサーを使うと、$ java -cp /usr/share/saxon/lib/saxon8.jar net.sf.saxon.Query multifeed.xql のようなスクリプトを実行することができます。
図 3 はフィードの出力を示しています。この出力は図 2 の出力と等価なはずです。生成されるものには違いがなく、Atom フィードと RSS フィードを使って情報が生成されている点が異なります。
図 3. マージされた RSS と Atom の要約
まとめ
この記事では、RSS フィードと Atom フィードを XQuery を使って処理するための基本として、1 つのフィードを 1 つの HTML 文書に変換する方法を学びました。次に、ソートや複数フィードのマージ、さらには異なるタイプのフィードやソース情報の処理など、必要とするものに適したフォーマットで情報を出力するための、より完全なソリューションを作成しました。
XQuery は XML ファイルを処理するための柔軟な方法です。人によっては XQuery による方法が構文的に理解しやすいと思うかもしれません。実際、XQuery の一部の機能 (例えば、さまざまなソースや入力フォーマットを処理するために、再度、構文解析可能な 1 つの中間的な XML 文書を作成できる柔軟性など) は、XML ファイルを処理する際のいくつかの問題を解決する上で役に立ちます。
ダウンロード | 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|
| Article sample code | x-xqueryrss.zip | 3KB | HTTP |
|---|
参考文献 学ぶために
製品や技術を入手するために
議論するために
著者について  | 
|  | Martin Brown は過去 8 年以上プロのライターとして活躍してきました。彼はさまざまな話題に関して数多くの本や記事を執筆しています。専門領域は広く、無数の開発言語やプラットフォーム (Perl、Python、Java、JavaScript、Basic、Pascal、Modula-2、C、C++、Rebol、Gawk、Shellscript、Windows、Solaris、Linux、BeOS、Mac OS/X その他) から、Web プログラミング、システム管理やシステム統合にまでわたります。彼は ServerWatch.com と LinuxToday.com、そして IBM developerWorks に頻繁に寄稿しており、また Computerworld や The Apple Blog などのサイトの他、Microsoftの SME (Subject Matter Expert) にもブロガーとして頻繁に寄稿しています。彼の連絡先は、彼の Web サイトhttp://www.mcslp.com です。 |
記事の評価
|