pax_global_header 0000666 0000000 0000000 00000000064 12060425040 0014503 g ustar 00root root 0000000 0000000 52 comment=056e948dedb3d0cb1eb56a1f1a99e82ff8779157
php-horde-feed-2.0.1/ 0000775 0000000 0000000 00000000000 12060425040 0014272 5 ustar 00root root 0000000 0000000 php-horde-feed-2.0.1/Horde_Feed-2.0.1/ 0000775 0000000 0000000 00000000000 12060425040 0016712 5 ustar 00root root 0000000 0000000 php-horde-feed-2.0.1/Horde_Feed-2.0.1/doc/ 0000775 0000000 0000000 00000000000 12060425040 0017457 5 ustar 00root root 0000000 0000000 php-horde-feed-2.0.1/Horde_Feed-2.0.1/doc/Horde/ 0000775 0000000 0000000 00000000000 12060425040 0020520 5 ustar 00root root 0000000 0000000 php-horde-feed-2.0.1/Horde_Feed-2.0.1/doc/Horde/Feed/ 0000775 0000000 0000000 00000000000 12060425040 0021363 5 ustar 00root root 0000000 0000000 php-horde-feed-2.0.1/Horde_Feed-2.0.1/doc/Horde/Feed/COPYING 0000664 0000000 0000000 00000002430 12060425040 0022415 0 ustar 00root root 0000000 0000000 Copyright 1999-2012 Horde LLC. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
- Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE HORDE PROJECT
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
php-horde-feed-2.0.1/Horde_Feed-2.0.1/doc/Horde/Feed/examples/ 0000775 0000000 0000000 00000000000 12060425040 0023201 5 ustar 00root root 0000000 0000000 php-horde-feed-2.0.1/Horde_Feed-2.0.1/doc/Horde/Feed/examples/blogger.php 0000664 0000000 0000000 00000003755 12060425040 0025345 0 ustar 00root root 0000000 0000000 post(
'https://www.google.com/accounts/ClientLogin',
'accountType=GOOGLE&service=blogger&source=horde-feed-blogger-example-1&Email=' . $username . '&Passwd=' . $password,
array('Content-type', 'application/x-www-form-urlencoded')
);
if ($response->code !== 200) {
throw new Horde_Feed_Exception('Expected response code 200, got ' . $response->code);
}
} catch (Horde_Feed_Exception $e) {
die('An error occurred authenticating: ' . $e->getMessage() . "\n");
}
$auth = null;
foreach (explode("\n", $response->getBody()) as $line) {
$param = explode('=', $line);
if ($param[0] == 'Auth') {
$auth = $param[1];
}
}
if (empty($auth)) {
throw new Horde_Feed_Exception('Missing authentication token in the response!');
}
/* The base feed URI is the same as the POST URI, so just supply the
* Horde_Feed_Entry_Atom object with that. */
$entry = new Horde_Feed_Entry_Atom();
/* Give the entry its initial values. */
$entry->{'atom:title'} = 'Entry 1';
$entry->{'atom:title'}['type'] = 'text';
$entry->{'atom:content'} = '1.1';
$entry->{'atom:content'}['type'] = 'text';
/* Do the initial post. */
try {
$entry->save($blogUri, array('Authorization' => 'GoogleLogin auth=' . $auth));
} catch (Horde_Feed_Exception $e) {
die('An error occurred posting: ' . $e->getMessage() . "\n");
}
/* $entry will be filled in with any elements returned by the
* server (id, updated, link rel="edit", etc). */
echo "new id is: {$entry->id()}\n";
echo "entry last updated at: {$entry->updated()}\n";
echo "edit the entry at: {$entry->edit()}\n";
php-horde-feed-2.0.1/Horde_Feed-2.0.1/doc/Horde/Feed/examples/blogroll.php 0000664 0000000 0000000 00000001135 12060425040 0025526 0 ustar 00root root 0000000 0000000 #!@php_bin@
"%prog opml_url\n\nExample:\n%prog subscriptions.opml",
));
list($values, $args) = $p->parseArgs();
if (count($args) != 1) {
$p->printHelp();
exit(1);
}
$blogroll = Horde_Feed::readFile($args[0]);
echo $blogroll->title . "\n\n";
foreach ($blogroll as $blog) {
$feed = $blog->getFeed();
echo $feed->title . "\n\n";
foreach ($feed as $entry) {
echo "$entry->title\n";
}
echo "\n\n";
}
exit(0);
php-horde-feed-2.0.1/Horde_Feed-2.0.1/doc/Horde/Feed/examples/delete.php 0000664 0000000 0000000 00000001535 12060425040 0025160 0 ustar 00root root 0000000 0000000 getMessage() . "\n");
}
/* We want to delete all entries that are two weeks old. */
$twoWeeksAgo = strtotime('-2 weeks');
foreach ($feed as $entry) {
/* Check the updated timestamp. */
if (strtotime($entry->updated) >= $twoWeeksAgo) {
continue;
}
/* Deleting the old posts is easy. */
try {
$entry->delete();
} catch (Horde_Feed_Exception $e) {
die('An error occurred deleting feed entries: ' . $e->getMessage() . "\n");
}
}
php-horde-feed-2.0.1/Horde_Feed-2.0.1/doc/Horde/Feed/examples/edit.php 0000664 0000000 0000000 00000002173 12060425040 0024642 0 ustar 00root root 0000000 0000000 getMessage() . "\n");
}
/* Grab the first entry in the feed. */
foreach ($feed as $entry) {
break;
}
/* Display the entry's unchanged state. */
echo "entry last updated at: {$entry->updated()}\n";
echo "current EditURI is: {$entry->edit()}\n";
/* Just change the entry's properties directly. */
$entry->content = 'This is an updated post.';
/* Then save the changes. */
try {
$entry->save();
} catch (Horde_Feed_Exception $e) {
die('An error occurred saving changes: ' . $e->getMessage() . "\n");
}
/* Display the new state. The updated time and edit URI will have been
* updated by the server, and $entry automatically picks up those
* changes. */
echo "entry last updated at: {$entry->updated()}\n";
echo "new EditURI is: {$entry->edit()}\n";
php-horde-feed-2.0.1/Horde_Feed-2.0.1/doc/Horde/Feed/examples/post.php 0000664 0000000 0000000 00000005023 12060425040 0024677 0 ustar 00root root 0000000 0000000 title = 'Entry 1';
$entry->content = '1.1';
$entry->content['type'] = 'text';
/* Do the initial post. */
try {
$entry->save();
} catch (Horde_Feed_Exception $e) {
die('An error occurred posting: ' . $e->getMessage() . "\n");
}
/* $entry will be filled in with any elements returned by the
* server (id, updated, link rel="edit", etc). */
echo "new id is: {$entry->id()}\n";
echo "entry last updated at: {$entry->updated()}\n";
echo "edit the entry at: {$entry->edit()}\n";
/* Using namespaces: create an entry with myns:updated using the base
* Horde_Feed_Entry_Atom class. */
$myfeeduri = 'http://www.example.com/nsfeed/';
$entry = new Horde_Feed_Entry_Atom($nsfeeduri);
Horde_Xml_Element::registerNamespace('myns', 'http://www.example.com/myns/');
$entry->{'myns:updated'} = '2005-04-19T15:30';
$entry->save();
/* Using namespaces, but with a custom Entry class: */
/**
* The custom feed class ensures that when you access this feed, the objects
* returned are MyEntry objects.
*/
class MyFeed extends Horde_Feed_Atom {
protected $_entryClassName = 'MyEntry';
}
/**
* The custom entry class automatically knows the feed URI (optional) and
* can automatically add extra namespaces.
*/
class MyEntry extends Horde_Feed_Entry_Atom {
public function __construct($uri = 'http://www.example.com/myfeed/',
$xml = null)
{
parent::__construct($uri, $xml);
Horde_Xml_Element::registerNamespace('myns', 'http://www.example.com/myns/');
}
public function __get($var)
{
switch ($var) {
case 'myUpdated':
// Translate myUpdated to myns:updated.
return parent::__get('myns:updated');
}
return parent::__get($var);
}
public function __set($var, $value)
{
switch ($var) {
case 'myUpdated':
// Translate myUpdated to myns:updated.
return parent::__set('myns:updated', $value);
}
return parent::__set($var, $value);
}
}
// Now we just need to create the class and set myUpdated.
$entry = new MyEntry();
$entry->myUpdated = '2005-04-19T15:30';
$entry->save();
php-horde-feed-2.0.1/Horde_Feed-2.0.1/doc/Horde/Feed/examples/read.php 0000664 0000000 0000000 00000001775 12060425040 0024637 0 ustar 00root root 0000000 0000000 getMessage() . "\n");
}
/* You can iterate over the entries in the feed simply by
* iterating over the feed itself. */
foreach ($feed as $entry) {
echo "title: {$entry->title()}\n";
if ($entry->author->name()) {
echo "author: {$entry->author->name()}\n";
}
echo "description:\n{$entry->description()}\n\n";
}
/* The properties of the feed itself are available through
* regular member variable access: */
echo "feed title: {$feed->title()}\n";
if ($feed->author->name()) {
echo "feed author: $feed->author->name()\n";
}
foreach ($feed->link as $link) {
echo "link: {$link['href']}\n";
}
php-horde-feed-2.0.1/Horde_Feed-2.0.1/doc/Horde/Feed/examples/reader.php 0000664 0000000 0000000 00000001052 12060425040 0025152 0 ustar 00root root 0000000 0000000 #!@php_bin@
"%prog feed_url\n\nExample:\n%prog http://graphics8.nytimes.com/services/xml/rss/nyt/HomePage.xml",
));
list($values, $args) = $p->parseArgs();
if (count($args) != 1) {
$p->printHelp();
exit(1);
}
$feed = Horde_Feed::readUri($args[0]);
echo count($feed) . " entries:\n\n";
foreach ($feed as $i => $entry) {
echo ($i + 1) . '. ' . $entry->title() . "\n";
}
exit(0);
php-horde-feed-2.0.1/Horde_Feed-2.0.1/lib/ 0000775 0000000 0000000 00000000000 12060425040 0017460 5 ustar 00root root 0000000 0000000 php-horde-feed-2.0.1/Horde_Feed-2.0.1/lib/Horde/ 0000775 0000000 0000000 00000000000 12060425040 0020521 5 ustar 00root root 0000000 0000000 php-horde-feed-2.0.1/Horde_Feed-2.0.1/lib/Horde/Feed.php 0000664 0000000 0000000 00000012247 12060425040 0022103 0 ustar 00root root 0000000 0000000
* @license http://www.horde.org/licenses/bsd BSD
* @category Horde
* @package Feed
*/
/**
* @author Chuck Hagenbuch
* @license http://www.horde.org/licenses/bsd BSD
* @category Horde
* @package Feed
*/
class Horde_Feed
{
/**
* Create a Feed object based on a DOMDocument.
*
* @param DOMDocument $doc The DOMDocument object to import.
*
* @throws Horde_Feed_Exception
*
* @return Horde_Feed_Base The feed object imported from $doc
*/
public static function create(DOMDocument $doc, $uri = null)
{
// Try to find the base feed element or a single of an
// Atom feed.
if ($feed = $doc->getElementsByTagName('feed')->item(0)) {
// Return an Atom feed.
return new Horde_Feed_Atom($feed, $uri);
} elseif ($entry = $doc->getElementsByTagName('entry')->item(0)) {
// Return an Atom single-entry feed.
$feeddoc = new DOMDocument($doc->version,
$doc->actualEncoding);
$feed = $feeddoc->appendChild($feeddoc->createElement('feed'));
$feed->appendChild($feeddoc->importNode($entry, true));
return new Horde_Feed_Atom($feed, $uri);
}
// Try to find the base feed element of an RSS feed.
if ($channel = $doc->getElementsByTagName('channel')->item(0)) {
// Return an RSS feed.
return new Horde_Feed_Rss($channel, $uri);
}
// Try to find an outline element of an OPML blogroll.
if ($outline = $doc->getElementsByTagName('outline')->item(0)) {
// Return a blogroll feed.
return new Horde_Feed_Blogroll($doc->documentElement, $uri);
}
// $doc does not appear to be a valid feed of the supported
// types.
throw new Horde_Feed_Exception('Invalid or unsupported feed format: '
. substr($doc->saveXML(), 0, 80) . '...');
}
/**
* Reads a feed represented by $string.
*
* @param string $string The XML content of the feed.
* @param string $uri The feed's URI location, if known.
*
* @throws Horde_Feed_Exception
*
* @return Horde_Feed_Base
*/
public static function read($string, $uri = null)
{
// Load the feed as a DOMDocument object.
libxml_use_internal_errors(true);
$doc = new DOMDocument;
$doc->recover = true;
$loaded = $doc->loadXML($string);
if (!$loaded) {
$loaded = $doc->loadHTML($string);
if (!$loaded) {
self::_exception('DOMDocument cannot parse XML', libxml_get_last_error());
}
}
return self::create($doc);
}
/**
* Read a feed located at $uri
*
* @param string $uri The URI to fetch the feed from.
* @param Horde_Http_Client $httpclient The HTTP client to use.
*
* @throws Horde_Feed_Exception
*
* @return Horde_Feed_Base
*/
public static function readUri($uri, Horde_Http_Client $httpclient = null)
{
if (is_null($httpclient)) {
$httpclient = new Horde_Http_Client();
}
try {
$response = $httpclient->get($uri);
} catch (Horde_Http_Exception $e) {
throw new Horde_Feed_Exception('Error reading feed: ' . $e->getMessage());
}
if ($response->code != 200) {
throw new Horde_Feed_Exception('Unable to read feed, got response code ' . $response->code);
}
$feed = $response->getBody();
return self::read($feed, $uri);
}
/**
* Read a feed from $filename
*
* @param string $filename The location of the feed file on an accessible
* filesystem or through an available stream wrapper.
*
* @throws Horde_Feed_Exception
*
* @return Horde_Feed_Base
*/
public static function readFile($filename)
{
libxml_use_internal_errors(true);
$doc = new DOMDocument;
$doc->recover = true;
$filename = urlencode($filename);
$loaded = $doc->load($filename);
if (!$loaded) {
$loaded = $doc->loadHTMLFile($filename);
if (!$loaded) {
self::_exception('File could not be read or parsed', libxml_get_last_error());
}
}
return self::create($doc);
}
/**
* Builds an exception message from a libXMLError object.
*
* @param string $msg An error message.
* @param libXMLError $error An error object.
*
* @throws Horde_Feed_Exception
*/
protected static function _exception($msg, $error)
{
if ($error) {
$msg .= ': ' . $error->message;
if ($error->file) {
$msg .= sprintf(' in file %s, line %d, column %d',
$error->file, $error->line, $error->column);
}
}
throw new Horde_Feed_Exception($msg);
}
}
php-horde-feed-2.0.1/Horde_Feed-2.0.1/lib/Horde/Feed/ 0000775 0000000 0000000 00000000000 12060425040 0021364 5 ustar 00root root 0000000 0000000 php-horde-feed-2.0.1/Horde_Feed-2.0.1/lib/Horde/Feed/Atom.php 0000664 0000000 0000000 00000005647 12060425040 0023011 0 ustar 00root root 0000000 0000000 ';
/**
* Cache the individual feed elements so they don't need to be
* searched for on every operation.
* @return array
*/
protected function _buildListItemCache()
{
$entries = array();
foreach ($this->_element->childNodes as $child) {
if ($child->localName == 'entry') {
$entries[] = $child;
}
}
return $entries;
}
/**
* Easy access to tags keyed by "rel" attributes.
* @TODO rationalize this with other __get/__call access
*
* If $elt->link() is called with no arguments, we will attempt to return
* the value of the tag(s) like all other method-syntax attribute
* access. If an argument is passed to link(), however, then we will return
* the "href" value of the first tag that has a "rel" attribute
* matching $rel:
*
* $elt->link(): returns the value of the link tag.
* $elt->link('self'): returns the href from the first in the entry.
*
* @param string $rel The "rel" attribute to look for.
* @return mixed
*/
public function link($rel = null)
{
if ($rel === null) {
return parent::__call('link', null);
}
// Index link tags by their "rel" attribute.
$links = parent::__get('link');
if (!is_array($links)) {
if ($links instanceof Horde_Xml_Element) {
$links = array($links);
} else {
return $links;
}
}
foreach ($links as $link) {
if (empty($link['rel'])) {
continue;
}
if ($rel == $link['rel']) {
return $link['href'];
}
}
return null;
}
}
php-horde-feed-2.0.1/Horde_Feed-2.0.1/lib/Horde/Feed/Base.php 0000664 0000000 0000000 00000005444 12060425040 0022756 0 ustar 00root root 0000000 0000000 _uri = $uri;
if (is_null($httpClient)) {
$httpClient = new Horde_Http_Client();
}
$this->_httpClient = $httpClient;
try {
parent::__construct($xml);
} catch (Horde_Xml_Element_Exception $e) {
throw new Horde_Feed_Exception('Unable to load feed: ' . $e->getMessage());
}
}
/**
* Handle null or array values for $this->_element by initializing
* with $this->_emptyXml, and importing the array with
* Horde_Xml_Element::fromArray() if necessary.
*
* @see Horde_Xml_Element::__wakeup
* @see Horde_Xml_Element::fromArray
*/
public function __wakeup()
{
// If we've been passed an array, we'll store it for importing
// after initializing with the default "empty" feed XML.
$importArray = null;
if (is_null($this->_element)) {
$this->_element = $this->_emptyXml;
} elseif (is_array($this->_element)) {
$importArray = $this->_element;
$this->_element = $this->_emptyXml;
}
parent::__wakeup();
if (!is_null($importArray)) {
$this->fromArray($importArray);
}
}
/**
* Required by the Iterator interface.
*
* @internal
*
* @return mixed The current row, or null if no rows.
*/
public function current()
{
return new $this->_listItemClassName(
$this->_listItems[$this->_listItemIndex], $this->_httpClient);
}
}
php-horde-feed-2.0.1/Horde_Feed-2.0.1/lib/Horde/Feed/Blogroll.php 0000664 0000000 0000000 00000003243 12060425040 0023653 0 ustar 00root root 0000000 0000000
* @license http://www.horde.org/licenses/bsd BSD
* @category Horde
* @package Feed
*/
/**
* Blogroll feed list class
*
* This is not a generic OPML implementation, but one focused on lists of feeds,
* i.e. blogrolls. See http://en.wikipedia.org/wiki/OPML for more information on
* OPML.
*
* @author Chuck Hagenbuch
* @license http://www.horde.org/licenses/bsd BSD
* @category Horde
* @package Feed
*/
class Horde_Feed_Blogroll extends Horde_Feed_Base
{
/**
* The classname for individual feed elements.
* @var string
*/
protected $_listItemClassName = 'Horde_Feed_Entry_Blogroll';
/**
* The default namespace for blogrolls.
* @var string
*/
protected $_defaultNamespace = '';
/**
* The XML string for an "empty" Blogroll.
* @var string
*/
protected $_emptyXml = '';
/**
* Cache outline elements so they don't need to be searched for on every
* operation.
*/
protected function _buildListItemCache()
{
$entries = array();
foreach ($this->_element->getElementsByTagName('outline') as $child) {
if ($child->attributes->getNamedItem('xmlurl')) {
$entries[] = $child;
}
}
return $entries;
}
public function getBody()
{
return $this;
}
public function getOutline()
{
return $this;
}
public function getTitle()
{
return $this->head->title;
}
}
php-horde-feed-2.0.1/Horde_Feed-2.0.1/lib/Horde/Feed/Entry/ 0000775 0000000 0000000 00000000000 12060425040 0022465 5 ustar 00root root 0000000 0000000 php-horde-feed-2.0.1/Horde_Feed-2.0.1/lib/Horde/Feed/Entry/Atom.php 0000664 0000000 0000000 00000014771 12060425040 0024110 0 ustar 00root root 0000000 0000000 ';
/**
* Name of the XML element for Atom entries. Subclasses can
* override this to something other than "entry" if necessary.
*
* @var string
*/
protected $_entryElementName = 'entry';
/**
* Delete an atom entry.
*
* Delete tries to delete this entry from its feed. If the entry
* does not contain a link rel="edit", we throw an error (either
* the entry does not yet exist or this is not an editable
* feed). If we have a link rel="edit", we do the empty-body
* HTTP DELETE to that URI and check for a response of 2xx.
* Usually the response would be 204 No Content, but the Atom
* Publishing Protocol permits it to be 200 OK.
*
* @throws Horde_Feed_Exception If an error occurs, an Horde_Feed_Exception will
* be thrown.
*/
public function delete()
{
// Look for link rel="edit" in the entry object.
$deleteUri = $this->link('edit');
if (!$deleteUri) {
throw new Horde_Feed_Exception('Cannot delete entry; no link rel="edit" is present.');
}
// DELETE
do {
$response = $this->_httpClient->delete($deleteUri);
switch ((int)$response->code / 100) {
// Success
case 2:
return true;
// Redirect
case 3:
$deleteUri = $response->getHeader('Location');
continue;
// Error
default:
throw new Horde_Feed_Exception('Expected response code 2xx, got ' . $response->code);
}
} while (true);
}
/**
* Save a new or updated Atom entry.
*
* Save is used to either create new entries or to save changes to existing
* ones. If we have a link rel="edit", we are changing an existing entry. In
* this case we re-serialize the entry and PUT it to the edit URI, checking
* for a 200 OK result.
*
* For posting new entries, you must specify the $postUri parameter to
* save() to tell the object where to post itself. We use $postUri and POST
* the serialized entry there, checking for a 201 Created response. If the
* insert is successful, we then parse the response from the POST to get any
* values that the server has generated: an id, an updated time, and its new
* link rel="edit".
*
* @param string $postUri Location to POST for creating new entries.
* @param array $headers Additional headers to transmit while posting.
*
* @throws Horde_Feed_Exception If an error occurs, a Horde_Feed_Exception
* will be thrown.
*/
public function save($postUri = null, $headers = array())
{
$headers = array_merge(
array('Content-Type' => 'application/atom+xml'),
$headers
);
if ($this->id()) {
// If id is set, look for link rel="edit" in the
// entry object and PUT.
$editUri = $this->link('edit');
if (!$editUri) {
throw new Horde_Feed_Exception('Cannot edit entry; no link rel="edit" is present.');
}
$response = $this->_httpClient->put($editUri, $this->saveXml(), $headers);
if ($response->code !== 200) {
throw new Horde_Feed_Exception('Expected response code 200, got ' . $response->code);
}
} else {
if ($postUri === null) {
throw new Horde_Feed_Exception('PostURI must be specified to save new entries.');
}
$response = $this->_httpClient->post($postUri, $this->saveXml(), $headers);
if ($response->code !== 201) {
throw new Horde_Feed_Exception('Expected response code 201, got ' . $response->code);
}
}
// Update internal properties using the response body.
$body = $response->getBody();
$newEntry = new DOMDocument;
$parsed = @$newEntry->loadXML($body);
if (!$parsed) {
throw new Horde_Feed_Exception('DOMDocument cannot parse XML: ', error_get_last());
}
$newEntry = $newEntry->getElementsByTagName($this->_entryElementName)->item(0);
if (!$newEntry) {
throw new Horde_Feed_Exception('No root element found in server response:' . "\n\n" . $body);
}
if ($this->_element->parentNode) {
$oldElement = $this->_element;
$this->_element = $oldElement->ownerDocument->importNode($newEntry, true);
$oldElement->parentNode->replaceChild($this->_element, $oldElement);
} else {
$this->_element = $newEntry;
}
$this->_expireCachedChildren();
}
/**
* Easy access to tags keyed by "rel" attributes.
* @TODO rationalize this with other __get/__call access
*
* If $elt->link() is called with no arguments, we will attempt to
* return the value of the tag(s) like all other
* method-syntax attribute access. If an argument is passed to
* link(), however, then we will return the "href" value of the
* first tag that has a "rel" attribute matching $rel:
*
* $elt->link(): returns the value of the link tag.
* $elt->link('self'): returns the href from the first in the entry.
*
* @param string $rel The "rel" attribute to look for.
* @return mixed
*/
public function link($rel = null)
{
if ($rel === null) {
return parent::__call('link', null);
}
// index link tags by their "rel" attribute.
$links = parent::__get('link');
if (!is_array($links)) {
if ($links instanceof Horde_Xml_Element) {
$links = array($links);
} else {
return $links;
}
}
foreach ($links as $link) {
if (empty($link['rel'])) {
continue;
}
if ($rel == $link['rel']) {
return $link['href'];
}
}
return null;
}
}
php-horde-feed-2.0.1/Horde_Feed-2.0.1/lib/Horde/Feed/Entry/Base.php 0000664 0000000 0000000 00000003010 12060425040 0024042 0 ustar 00root root 0000000 0000000 _element by initializing
* with $this->_emptyXml, and importing the array with
* Horde_Xml_Element::fromArray() if necessary.
*
* @see Horde_Xml_Element::__wakeup
* @see Horde_Xml_Element::fromArray
*/
public function __construct($element = null, Horde_Http_Client $httpClient = null)
{
$this->_element = $element;
if (is_null($httpClient)) {
$httpClient = new Horde_Http_Client();
}
$this->_httpClient = $httpClient;
// If we've been passed an array, we'll store it for importing
// after initializing with the default "empty" feed XML.
$importArray = null;
if (is_null($this->_element)) {
$this->_element = $this->_emptyXml;
} elseif (is_array($this->_element)) {
$importArray = $this->_element;
$this->_element = $this->_emptyXml;
}
$this->__wakeup();
if (!is_null($importArray)) {
$this->fromArray($importArray);
}
}
}
php-horde-feed-2.0.1/Horde_Feed-2.0.1/lib/Horde/Feed/Entry/Blogroll.php 0000664 0000000 0000000 00000004175 12060425040 0024761 0 ustar 00root root 0000000 0000000
* @license http://www.horde.org/licenses/bsd BSD
* @category Horde
* @package Feed
*/
/**
* Concrete class for working with Blogroll elements.
*
* @author Chuck Hagenbuch
* @license http://www.horde.org/licenses/bsd BSD
* @category Horde
* @package Feed
*/
class Horde_Feed_Entry_Blogroll extends Horde_Feed_Entry_Base
{
/**
* The XML string for an "empty" outline element.
*
* @var string
*/
protected $_emptyXml = '';
/**
* Get a Horde_Feed object for the feed described by this outline element.
*
* @return Horde_Feed_Base
*/
public function getFeed()
{
if (!$this['xmlUrl']) {
throw new Horde_Feed_Exception('No XML URL in element');
}
return Horde_Feed::readUri($this['xmlUrl']);
}
/**
* Add child elements and attributes to this element from a simple key =>
* value hash. Because feed list outline elements only use attributes, this
* overrides Horde_Xml_Element#fromArray to set attributes whether the
* #Attribute syntax is used or not.
*
* @see Horde_Xml_Element#fromArray
*
* @param $array Hash to import into this element.
*/
public function fromArray($array)
{
foreach ($array as $key => $value) {
$attribute = $key;
if (substr($attribute, 0, 1) == '#') {
$attribute = substr($attribute, 1);
}
$this[$attribute] = $value;
}
}
/**
* Always use attributes instead of child nodes.
*
* @param string $var The property to access.
* @return mixed
*/
public function __get($var)
{
return $this->offsetGet($var);
}
/**
* Always use attributes instead of child nodes.
*
* @param string $var The property to change.
* @param string $val The property's new value.
*/
public function __set($var, $val)
{
return $this->offsetSet($var, $val);
}
}
php-horde-feed-2.0.1/Horde_Feed-2.0.1/lib/Horde/Feed/Entry/Rss.php 0000664 0000000 0000000 00000001646 12060425040 0023754 0 ustar 00root root 0000000 0000000 ';
/**
* Return encoded content if it's present.
*
* @return string
*/
public function getContent()
{
if (isset($this->_children['content:encoded'])) {
return $this->_children['content:encoded'];
} elseif (isset($this->_children['encoded'])) {
return $this->_children['encoded'];
}
return isset($this->_children['content']) ? $this->_children['content'] : array();
}
}
php-horde-feed-2.0.1/Horde_Feed-2.0.1/lib/Horde/Feed/Exception.php 0000664 0000000 0000000 00000000240 12060425040 0024027 0 ustar 00root root 0000000 0000000 ';
/**
* Cache the individual feed elements so they don't need to be searched for
* on every operation.
* @return array
*/
protected function _buildListItemCache()
{
$items = array();
foreach ($this->_element->childNodes as $child) {
if ($child->localName == 'item') {
$items[] = $child;
}
}
// Brute-force search for elements if we haven't found any so
// far.
if (!count($items)) {
foreach ($this->_element->ownerDocument->getElementsByTagName('item') as $child) {
$items[] = $child;
}
}
return $items;
}
}
php-horde-feed-2.0.1/Horde_Feed-2.0.1/test/ 0000775 0000000 0000000 00000000000 12060425040 0017671 5 ustar 00root root 0000000 0000000 php-horde-feed-2.0.1/Horde_Feed-2.0.1/test/Horde/ 0000775 0000000 0000000 00000000000 12060425040 0020732 5 ustar 00root root 0000000 0000000 php-horde-feed-2.0.1/Horde_Feed-2.0.1/test/Horde/Feed/ 0000775 0000000 0000000 00000000000 12060425040 0021575 5 ustar 00root root 0000000 0000000 php-horde-feed-2.0.1/Horde_Feed-2.0.1/test/Horde/Feed/AllTests.php 0000664 0000000 0000000 00000000132 12060425040 0024035 0 ustar 00root root 0000000 0000000 run();
php-horde-feed-2.0.1/Horde_Feed-2.0.1/test/Horde/Feed/AtomEntryOnlyTest.php 0000664 0000000 0000000 00000001340 12060425040 0025730 0 ustar 00root root 0000000 0000000 assertEquals(1, $feed->count(), 'The entry-only feed should report one entry.');
foreach ($feed as $entry);
$this->assertEquals('Horde_Feed_Entry_Atom', get_class($entry), 'The single entry should be an instance of Horde_Feed_Entry_Atom');
$this->assertEquals('1', $entry->id(), 'The single entry should have id 1');
$this->assertEquals('Bug', $entry->title(), 'The entry\'s title should be "Bug"');
}
}
php-horde-feed-2.0.1/Horde_Feed-2.0.1/test/Horde/Feed/AtomPublishingTest.php 0000664 0000000 0000000 00000006020 12060425040 0026071 0 ustar 00root root 0000000 0000000 uri = 'http://example.com/Feed';
}
public function testPost()
{
$mock = new Horde_Http_Request_Mock();
$mock->setResponse(new Horde_Http_Response_Mock('', fopen(__DIR__ . '/fixtures/AtomPublishingTest-created-entry.xml', 'r'), array('HTTP/1.1 201')));
$httpClient = new Horde_Http_Client(array('request' => $mock));
$entry = new Horde_Feed_Entry_Atom(null, $httpClient);
// Give the entry its initial values.
$entry->title = 'Entry 1';
$entry->content = '1.1';
$entry->content['type'] = 'text';
// Do the initial post. The base feed URI is the same as the
// POST URI, so just supply save() with that.
$entry->save($this->uri);
// $entry will be filled in with any elements returned by the
// server (id, updated, link rel="edit", etc).
$this->assertEquals('1', $entry->id(), 'Expected id to be 1');
$this->assertEquals('Entry 1', $entry->title(), 'Expected title to be "Entry 1"');
$this->assertEquals('1.1', $entry->content(), 'Expected content to be "1.1"');
$this->assertEquals('text', $entry->content['type'], 'Expected content/type to be "text"');
$this->assertEquals('2005-05-23T16:26:00-08:00', $entry->updated(), 'Expected updated date of 2005-05-23T16:26:00-08:00');
$this->assertEquals('http://example.com/Feed/1/1/', $entry->link('edit'), 'Expected edit URI of http://example.com/Feed/1/1/');
}
public function testEdit()
{
$mock = new Horde_Http_Request_Mock();
$mock->setResponse(new Horde_Http_Response_Mock('', fopen(__DIR__ . '/fixtures/AtomPublishingTest-updated-entry.xml', 'r'), array('HTTP/1.1 200')));
$httpClient = new Horde_Http_Client(array('request' => $mock));
// The base feed URI is the same as the POST URI, so just supply the
// Horde_Feed_Entry_Atom object with that.
$contents = file_get_contents(__DIR__ . '/fixtures/AtomPublishingTest-before-update.xml');
$entry = new Horde_Feed_Entry_Atom($contents, $httpClient);
// Initial state.
$this->assertEquals('2005-05-23T16:26:00-08:00', $entry->updated(), 'Initial state of updated timestamp does not match');
$this->assertEquals('http://example.com/Feed/1/1/', $entry->link('edit'), 'Initial state of edit link does not match');
// Just change the entry's properties directly.
$entry->content = '1.2';
// Then save the changes.
$entry->save();
// New state.
$this->assertEquals('1.2', $entry->content(), 'Content change did not stick');
$this->assertEquals('2005-05-23T16:27:00-08:00', $entry->updated(), 'New updated link is not correct');
$this->assertEquals('http://example.com/Feed/1/2/', $entry->link('edit'), 'New edit link is not correct');
}
}
php-horde-feed-2.0.1/Horde_Feed-2.0.1/test/Horde/Feed/BlogrollTest.php 0000664 0000000 0000000 00000003062 12060425040 0024723 0 ustar 00root root 0000000 0000000 _feedDir = __DIR__ . '/fixtures/';
}
/**
* @dataProvider getValidBlogrollTests
*/
public function testValidBlogrolls($file)
{
$feed = Horde_Feed::readFile($this->_feedDir . $file);
$this->assertInstanceOf('Horde_Feed_Blogroll', $feed);
$this->assertTrue(count($feed) > 0);
foreach ($feed as $entry) {
break;
}
$this->assertInstanceOf('Horde_Feed_Entry_Blogroll', $entry);
$this->assertGreaterThan(0, strlen($entry->text));
$this->assertGreaterThan(0, strlen($entry->xmlurl));
$this->assertEquals($entry->text, $entry['text']);
$this->assertEquals($entry->description, $entry['description']);
$this->assertEquals($entry->title, $entry['title']);
$this->assertEquals($entry->htmlurl, $entry['htmlurl']);
$this->assertEquals($entry->xmlurl, $entry['xmlurl']);
}
public function testGroupedBlogrolls()
{
$this->markTestSkipped();
$feed = Horde_Feed::readFile($this->_feedDir . 'MySubscriptionsGrouped.opml');
}
public static function getValidBlogrollTests()
{
return array(
array('BlogRollTestSample1.xml'),
array('BlogRollTestSample2.xml'),
array('MySubscriptions.opml'),
array('MySubscriptionsGrouped.opml'),
);
}
}
php-horde-feed-2.0.1/Horde_Feed-2.0.1/test/Horde/Feed/CountTest.php 0000664 0000000 0000000 00000000515 12060425040 0024237 0 ustar 00root root 0000000 0000000 assertEquals($f->count(), 2, 'Feed count should be 2');
}
}
php-horde-feed-2.0.1/Horde_Feed-2.0.1/test/Horde/Feed/IteratorTest.php 0000664 0000000 0000000 00000004543 12060425040 0024745 0 ustar 00root root 0000000 0000000 feed = Horde_Feed::readFile(__DIR__ . '/fixtures/TestAtomFeed.xml');
$this->nsfeed = Horde_Feed::readFile(__DIR__ . '/fixtures/TestAtomFeedNamespaced.xml');
}
public function testRewind()
{
$times = 0;
foreach ($this->feed as $f) {
++$times;
}
$times2 = 0;
foreach ($this->feed as $f) {
++$times2;
}
$this->assertEquals($times, $times2, 'Feed should have the same number of iterations multiple times through');
$times = 0;
foreach ($this->nsfeed as $f) {
++$times;
}
$times2 = 0;
foreach ($this->nsfeed as $f) {
++$times2;
}
$this->assertEquals($times, $times2, 'Feed should have the same number of iterations multiple times through');
}
public function testCurrent()
{
foreach ($this->feed as $f) {
$this->assertTrue($f instanceof Horde_Feed_Entry_Atom, 'Each feed entry should be an instance of Horde_Feed_Entry_Atom');
break;
}
foreach ($this->nsfeed as $f) {
$this->assertTrue($f instanceof Horde_Feed_Entry_Atom, 'Each feed entry should be an instance of Horde_Feed_Entry_Atom');
break;
}
}
public function testKey()
{
$keys = array();
foreach ($this->feed as $k => $f) {
$keys[] = $k;
}
$this->assertEquals($keys, array(0, 1), 'Feed should have keys 0 and 1');
$keys = array();
foreach ($this->nsfeed as $k => $f) {
$keys[] = $k;
}
$this->assertEquals($keys, array(0, 1), 'Feed should have keys 0 and 1');
}
public function testNext()
{
$last = null;
foreach ($this->feed as $current) {
$this->assertFalse($last === $current, 'Iteration should produce a new object each entry');
$last = $current;
}
$last = null;
foreach ($this->nsfeed as $current) {
$this->assertFalse($last === $current, 'Iteration should produce a new object each entry');
$last = $current;
}
}
}
php-horde-feed-2.0.1/Horde_Feed-2.0.1/test/Horde/Feed/LexiconTest.php 0000664 0000000 0000000 00000001175 12060425040 0024553 0 ustar 00root root 0000000 0000000 assertGreaterThan(0, count($feed));
}
public static function getLexicon()
{
$files = array();
foreach (new DirectoryIterator(__DIR__ . '/fixtures/lexicon') as $file) {
if ($file->isFile()) {
$files[] = array($file->getPathname());
}
}
return $files;
}
}
php-horde-feed-2.0.1/Horde_Feed-2.0.1/test/Horde/Feed/ReadTest.php 0000664 0000000 0000000 00000004262 12060425040 0024025 0 ustar 00root root 0000000 0000000 _feedDir = __DIR__ . '/fixtures/';
}
/**
* @dataProvider getValidAtomTests
*/
public function testValidAtomFeeds($file)
{
$feed = Horde_Feed::readFile($this->_feedDir . $file);
$this->assertInstanceOf('Horde_Feed_Atom', $feed);
}
public static function getValidAtomTests()
{
return array(
array('AtomTestGoogle.xml'),
array('AtomTestMozillazine.xml'),
array('AtomTestOReilly.xml'),
array('AtomTestPlanetPHP.xml'),
array('AtomTestSample1.xml'),
array('AtomTestSample2.xml'),
array('AtomTestSample4.xml'),
);
}
/**
* @dataProvider getValidRssTests
*/
public function testValidRssFeeds($file)
{
$feed = Horde_Feed::readFile($this->_feedDir . $file);
$this->assertInstanceOf('Horde_Feed_Rss', $feed);
}
public static function getValidRssTests()
{
return array(
array('RssTestHarvardLaw.xml'),
array('RssTestPlanetPHP.xml'),
array('RssTestSlashdot.xml'),
array('RssTestCNN.xml'),
array('RssTest091Sample1.xml'),
array('RssTest092Sample1.xml'),
array('RssTest100Sample1.xml'),
array('RssTest100Sample2.xml'),
array('RssTest200Sample1.xml'),
);
}
public function testAtomWithUnbalancedTags()
{
$feed = Horde_Feed::readFile($this->_feedDir . 'AtomTestSample3.xml');
$this->assertTrue($feed instanceof Horde_Feed_Base, 'Should be able to parse a feed with unmatched tags');
}
public function testNotAFeed()
{
try {
$feed = Horde_Feed::readFile($this->_feedDir . 'NotAFeed.xml');
} catch (Exception $e) {
$this->assertInstanceOf('Horde_Feed_Exception', $e);
return;
}
$this->fail('Expected a Horde_Feed_Exception when parsing content that is not a feed of any kind');
}
}
php-horde-feed-2.0.1/Horde_Feed-2.0.1/test/Horde/Feed/bootstrap.php 0000664 0000000 0000000 00000000143 12060425040 0024321 0 ustar 00root root 0000000 0000000
12005-05-23T16:26:00-08:00Entry 11.2
php-horde-feed-2.0.1/Horde_Feed-2.0.1/test/Horde/Feed/fixtures/AtomPublishingTest-created-entry.xml 0000664 0000000 0000000 00000000775 12060425040 0032532 0 ustar 00root root 0000000 0000000
12005-05-23T16:26:00-08:00Entry 11.1
AtomPublishingTest-expected-update.xml 0000664 0000000 0000000 00000000453 12060425040 0032757 0 ustar 00root root 0000000 0000000 php-horde-feed-2.0.1/Horde_Feed-2.0.1/test/Horde/Feed/fixtures 12005-05-23T16:26:00-08:00Entry 11.2
php-horde-feed-2.0.1/Horde_Feed-2.0.1/test/Horde/Feed/fixtures/AtomPublishingTest-updated-entry.xml 0000664 0000000 0000000 00000001220 12060425040 0032533 0 ustar 00root root 0000000 0000000
12005-05-23T16:27:00-08:00Entry 11.2
php-horde-feed-2.0.1/Horde_Feed-2.0.1/test/Horde/Feed/fixtures/AtomTestGoogle.xml 0000664 0000000 0000000 00000142245 12060425040 0027075 0 ustar 00root root 0000000 0000000
Official Google BlogGoogler insights into product and technology news and our culture.tag:blogger.com,1999:blog-108617802006-01-12T19:55:20ZBlogger
This is an Atom formatted XML site feed. It is intended to be viewed in a Newsreader or syndicated to another site. Please visit the Blogger Help for more info.
trueA Googler2006-01-12T11:53:00-08:002006-01-12T19:55:20Z2006-01-11T03:07:43Ztag:blogger.com,1999:blog-10861780.post-113694886327994245Your Google homepage, to go
Posted by Abhijit Kalamkar, Software Engineer
Anyone who's ever tried to browse the web on their cell phone knows that it isn't always the best user experience. That's why I'm excited to tell you about Google Mobile Personalized Home. We've designed a way for you to view the things that you really care about, from your Gmail inbox to news headlines, weather, stock quotes, and feeds (Atom or RSS). The interface is optimized for small screens, and we've arranged things so you don't have to click on a bunch of links to locate what you're after -– your personalized content appears on top, right where it should be. Give it a try, and let us know how you like it.
Today is the one year anniversary of the Google Mini, Google's solution for website and corporate network search, and to celebrate we thought we'd announce a few more of them. The standard Mini lets you search up to 100,000 documents. Now organizations that constantly crank out new content can opt for either of two new Minis: one searches up to 200,000 documents, and another that can manage up to 300,000. All three deliver the same easy setup, intuitive interface and fast, relevant results that the Mini is already bringing to thousands of websites and corporate networks. You're growing, and the Mini is growing with you.
falseA Googler2006-01-10T12:49:00-08:002006-01-10T21:02:47Z2005-12-31T01:44:54Ztag:blogger.com,1999:blog-10861780.post-113599349496410640Google Earth in a Mac world (PC too)
Posted by Chikai Ohazama, Google Earth Team
We feel like proud parents around here. Our eldest, Google Earth for the PC, is officially leaving beta status today, and we couldn't be more pleased. For those of you who downloaded early, upgrade to the latest and discover Google Earth all over again.
And we have a brand new member of the family -- Google Earth for Macintosh. We're happy to finally have some good news for the, ahem, vocal Mac enthusiasts we've been hearing from. Let's just say that we have gotten more than a few "requests" for a Mac version of Google Earth. They've gone something like this:
1) "When is it coming out? Your website says that you are working on it."
2) "You know, Mac users are very heavy graphics/mapping/visualization/design/ architecture/education/real estate/geocaching/social-geo-video-networking fans who would certainly use Google Earth a lot."
3) "So when is it coming out?"
We heard you loud and clear. The Mac version runs on OS X 10.4 and up. Happy travels throughout Google Earth, whether you're on a Mac or a PC.
falseA Googler2006-01-09T22:16:00-08:002006-01-11T20:30:26Z2005-12-31T18:25:16Ztag:blogger.com,1999:blog-10861780.post-113605351620153422A new year for Google Video<span class="byline-author">Posted by Sanjay Raman, Google Video Team</span><br /><br />Till now, Google Video has been about watching videos and clips online, which is really convenient for videos <a href="http://video.google.com/videoplay?docid=-3496860874967925614&q=fastfocus">like this</a>. But wouldn't it be awesome to watch that episode of <span style="font-style: italic;"><a href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DCSI">CSI</a></span> that you missed when even your trusty DVR failed you? This is one reason we've launched the Google Video store, where you can rent or buy from such well-known media partners as <a href="http://video.google.com/cbs.html">CBS</a>, the <a href="http://video.google.com/nba.html">NBA</a>, The <a href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DCharlie_Rose">Charlie Rose Show</a>, and <a href="http://video.google.com/videosearch?q=Sony+BMG">SONY BMG</a>.<br /><br />We’re not only about mainstream content, though -– we have thousands of titles available (and more coming every day) from every imaginable type of producer, including <a href="http://video.google.com/videosearch?q=1896+tsar+nicholas&so=0">this 1896 clip</a> of the coronation of Tsar Nicholas II – one of the earliest known moving images. We’re especially pleased to offer such quality indie features as Ben Rekhi’s <span style="font-style: italic;"><a href="http://video.google.com/videoplay?docid=-1607114503824678810&q=waterborne ">Waterborne</a></span> (Drops Entertainment) and Lerone Wilson’s <span style="font-style: italic;"><a href="http://video.google.com/videoplay?docid=-4929215594503422280&q=aardvark%27d ">Aardvark’d: 12 Weeks with Geeks</a></span> (Boondoggle Films).<br /><br />When we launched our <a href="https://upload.video.google.com">Upload Program</a> earlier this year, people sent in a huge number of free and compelling videos. But since there's a ton of video that can't be offered for free, we built the <a href="http://video.google.com/">Google Video store</a> to give content owners the option to charge for downloads if they'd like. This means producers large and small can distribute their great content in an easy, secure way. Some of your favorite prime time and classic TV shows, sports, music videos, and documentaries are at your fingertips. Want to see how Shaq scored 30 points last night? Download and watch it (and every <a href="http://video.google.com/nba.html">NBA</a> game for the rest of the season) through Google Video.<br /><br />You can play all the videos you download using the all-new Google Video Player. We're especially pleased about the thumbnail navigation for browsing an entire video so you can play any portion with a single click. And there's another thing: if the content is not copy-protected, you can take your favorite videos with you on your <a href="http://www.apple.com/ipod/">iPod</a> or <a href="http://www.us.playstation.com/psp.aspx">PSP</a> -- our "to go" option.<br /><br />Since it's so early in the year, here's a resolution we intend to keep: make sure new features and content continue to roll out, so that you think Google Video is one of the best ways to find video on the web.<br /><br />These video providers are getting us off to a great start:<br /><br />• <span style="font-weight: bold;"><a href="http://video.google.com/videosearch?q=in_label%3Aowner%3Daquarius">Aquarius Health Care Media</a></span>: A leading producer and distributor of healthcare-related videos will pilot with Google Video using a variety of titles covering SIDS, diabetes, and blindness, among other health issues.<br /><br />• <span style="font-weight: bold;"><a href="http://video.google.com/videosearch?q=ardustry">Ardustry Home Entertainment</a></span>: Offers substantial libraries of theatrical motion pictures, television series, documentaries and reality programming, music and sports specials, lifestyle titles, and a wide array of “how-to†products.<br /><br />• <span style="font-weight: bold;"><a href="http://video.google.com/videosearch?q=bluehighways">BlueHighways TV</a></span>: Programming service that explores the people, stories, traditions and cultures of America. Discovering the sights and sounds of communities across the country with an up-close, laid-back programming style, BlueHighways TV presents a collage of remarkable music, folklore and information for audiences interested in all aspects of American life and heritage. Programming includes <span style="font-style: italic;">Reno's Old Time Music Festival,</span> <span style="font-style: italic;">American Journeys,</span> <span style="font-style: italic;">Stan Hitchcock's Heart to Heart,</span> and <span style="font-style: italic;">Gospel Sampler</span>.<br /><br />• <span style="font-weight: bold;"><a href="http://video.google.com/videosearch?q=in_label%3Aowner%3Dcaretalk">CareTALK</a></span>: A multimedia brand dedicated to consumer-directed health care offering programming and tools to help modern family caregivers; initially offering 10-20 hours of health and caregiving-related content (10-20 minutes in length).<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/cbs.html">CBS</a>: Includes prime time hits such as <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DCSI">CSI</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3Dncis">NCIS</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DSurvivor_Guatemala">Survivor: Guatemala</a>, and The Amazing Race (available spring ’06), as well as classics like <a style="font-style: italic;" href="http://video.google.com/videosearch?q=I+Love+Lucy">I Love Lucy</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DTwilight_Zone">Twilight Zone</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DBrady_Bunch">Brady Bunch</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=Have+Gun+Will+Travel">Have Gun Will Travel</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DMacGyver">MacGyver</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DStar_Trek_Deep_Space_Nine">Star Trek: Deep Space Nine</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DStar_Trek_Voyager">Star Trek: Voyager</a>, and My Three Sons (coming soon).<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DCharlie_Rose">The Charlie Rose Show</a>: Includes interviews with Henry Kissinger, Oliver Stone, Quentin Tarantino, Martha Stewart, Martin Scorsese, Harrison Ford, Dan Rather, Charles M. Schulz, Steve Jobs, Jay Leno, Tom Brokaw, and others.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=Cine+Excel&so=0">Cine Excel</a>: Independent producer will trial on Google Video with 3 DVD movie titles: <a style="font-style: italic;" href="http://video.google.com/videoplay?docid=6833548605067650376&q=Cine+Excel">Bikini Hotel </a>(1997), <a style="font-style: italic;" href="http://video.google.com/videoplay?docid=-9198267889833807992&q=Cine+Excel">Tao of Karate</a> (short-film, 1998) and <a style="font-style: italic;" href="http://video.google.com/videoplay?docid=8241854949946868864&q=Cine+Excel">Karate Wars</a> (1998).<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=classic+media">Classic Media</a>: Classic Media owns and manages some of the world's most recognizable family properties across all media including feature film, television, home video and consumer products. The company's extensive library features a diverse collection of popular animated and live-action characters. For lentaries are at your fingertips. Want to see how Shaq scored 30 points last night? Download and watch it (and every <a href="http://video.google.com/nba.html">NBA</a> game for the rest of the season) through Google Video.<br /><br />You can play all the videos you download using the all-new Google Video Player. We're especially pleased about the thumbnail navigation for browsing an entire video so you can play any portion with a single click. And there's another thing: if the content is not copy-protected, you can take your favorite videos with you on your <a href="http://www.apple.com/ipod/">iPod</a> or <a href="http://www.us.playstation.com/psp.aspx">PSP</a> -- our "to go" option.<br /><br />Since it's so early in the year, here's a resolution we intend to keep: make sure new features and content continue to roll out, so that you think Google Video is one of the best ways to find video on the web.<br /><br />These video providers are getting us off to a great start:<br /><br />• <span style="font-weight: bold;"><a href="http://video.google.com/videosearch?q=in_label%3Aowner%3Daquarius">Aquarius Health Care Media</a></span>: A leading producer and distributor of healthcare-related videos will pilot with Google Video using a variety of titles covering SIDS, diabetes, and blindness, among other health issues.<br /><br />• <span style="font-weight: bold;"><a href="http://video.google.com/videosearch?q=ardustry">Ardustry Home Entertainment</a></span>: Offers substantial libraries of theatrical motion pictures, television series, documentaries and reality programming, music and sports specials, lifestyle titles, and a wide array of “how-to†products.<br /><br />• <span style="font-weight: bold;"><a href="http://video.google.com/videosearch?q=bluehighways">BlueHighways TV</a></span>: Programming service that explores the people, stories, traditions and cultures of America. Discovering the sights and sounds of communities across the country with an up-close, laid-back programming style, BlueHighways TV presents a collage of remarkable music, folklore and information for audiences interested in all aspects of American life and heritage. Programming includes <span style="font-style: italic;">Reno's Old Time Music Festival,</span> <span style="font-style: italic;">American Journeys,</span> <span style="font-style: italic;">Stan Hitchcock's Heart to Heart,</span> and <span style="font-style: italic;">Gospel Sampler</span>.<br /><br />• <span style="font-weight: bold;"><a href="http://video.google.com/videosearch?q=in_label%3Aowner%3Dcaretalk">CareTALK</a></span>: A multimedia brand dedicated to consumer-directed health care offering programming and tools to help modern family caregivers; initially offering 10-20 hours of health and caregiving-related content (10-20 minutes in length).<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/cbs.html">CBS</a>: Includes prime time hits such as <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DCSI">CSI</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3Dncis">NCIS</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DSurvivor_Guatemala">Survivor: Guatemala</a>, and The Amazing Race (available spring ’06), as well as classics like <a style="font-style: italic;" href="http://video.google.com/videosearch?q=I+Love+Lucy">I Love Lucy</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DTwilight_Zone">Twilight Zone</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DBrady_Bunch">Brady Bunch</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=Have+Gun+Will+Travel">Have Gun Will Travel</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DMacGyver">MacGyver</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DStar_Trek_Deep_Space_Nine">Star Trek: Deep Space Nine</a>, <a style="font-style: italic;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DStar_Trek_Voyager">Star Trek: Voyager</a>, and My Three Sons (coming soon).<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=in_label%3Atvshow%3DCharlie_Rose">The Charlie Rose Show</a>: Includes interviews with Henry Kissinger, Oliver Stone, Quentin Tarantino, Martha Stewart, Martin Scorsese, Harrison Ford, Dan Rather, Charles M. Schulz, Steve Jobs, Jay Leno, Tom Brokaw, and others.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=Cine+Excel&so=0">Cine Excel</a>: Independent producer will trial on Google Video with 3 DVD movie titles: <a style="font-style: italic;" href="http://video.google.com/videoplay?docid=6833548605067650376&q=Cine+Excel">Bikini Hotel </a>(1997), <a style="font-style: italic;" href="http://video.google.com/videoplay?docid=-9198267889833807992&q=Cine+Excel">Tao of Karate</a> (short-film, 1998) and <a style="font-style: italic;" href="http://video.google.com/videoplay?docid=8241854949946868864&q=Cine+Excel">Karate Wars</a> (1998).<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=classic+media">Classic Media</a>: Classic Media owns and manages some of the world's most recognizable family properties across all media including feature film, television, home video and consumer products. The company's extensive library features a diverse collection of popular animated and live-action characters. For launch we will have <a style="font-style: italic;" href="http://video.google.com/videoplay?docid=2700527067868455741&q=classic+media">Rocky & Bullwinkle</a>, <span style="font-style: italic;">Casper</span>, <span style="font-style: italic;">Wendy</span>, <span style="font-style: italic;">Richie Rich</span>, <span style="font-style: italic;">Herman & Katnip</span>, <span style="font-style: italic;">Baby Huey</span>, <span style="font-style: italic;">Little Audrey</span>, <a style="font-style: italic;" href="http://video.google.com/videoplay?docid=-3466783103686653836&q=Mighty+Hercules">Mighty Hercules</a>, <span style="font-style: italic;">Little Lulu</span>, and <span style="font-style: italic;">Felix the Cat</span>.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=clearvue">CLEARVUE & SVE</a>: A leading provider of educational K-12 educational video content. They sell DVDs and run a subscription media-on-demand website with video, audio, and images. CLEARVUE & SVE primarily serves large clients such as schools, school districts or entire states. Leveraging Google Video, they have embarked on a new and bold strategy to target individual customers directly. Among the hundreds of videos you will find on Google, topics vary from classic children's literature to detailed explanations about the workings of the human body.<br /><br />• <span style="font-weight: bold;"><a href="http://video.google.com/videosearch?q=in_label%3Aowner%3Dechelon">Echelon Home Entertainment 2</a></span>: Focuses on independently produced films made by filmmakers from around the world which offer a unique perspective to the traditional genres: drama, action, thriller, comedy, family, animation, classic, B&W, foreign.<br /><br />• <span style="font-weight: bold;"><a href="http://video.google.com/videosearch?q=in_label%3Aowner%3Dimage_entertainment">Egami Media</a></span>: A subsidiary of Image Entertainment and a leading independent licensee, producer and distributor of home entertainment programming with over 3,000 titles released in North America. Highlighted content in Google Video includes live concert programs include <span style="font-style: italic;">Kiss: Rock the Nation: Live!</span>, <span style="font-style: italic;">Chick Corea: Rendezvous in New York</span>, <span style="font-style: italic;">Roy Orbison: Black & White Night</span>, and dozens more. Other titles include IMAX programs from MacGillivray Freeman, stand-up comedy and independent, foreign and silent film classics.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=in_label%3Aowner%3Dfashion_tv">Fashion TV</a>: The only 24 hours a day, 7 days a week fashion, beauty and style TV station worldwide provides glamorous entertainment with emphasis on the latest trends. Google Video content includes fashion show clips and behind the scenes footage from many fashion shows.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=in_label%3Aowner%3Dgetty_images">Getty Images' Archive Films Collection</a>: A diverse collection of short clips that capture personalities, moments and eras throughout history -- selected from vintage newsreels and educational film, as well as contemporary news and events from around the world.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=in_label%3Aowner%3Dgreencine">GreenCine.com</a>: Feature length independent films, documentaries and classic titles, including works by legendary Polish director Andrzej Wajda (<span style="font-style: italic;">Zemsta</span>) and award-winning actor-director Caveh Zahedi (<span style="font-style: italic;">In the Bathtub of the World</span>).<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=HDNet&so=0">HDNet</a>: Co-founded by Mark Cuban, HDNet has agreed to make select original programming from its library available for the launch of Google's first commercial video offering. The programs to be made available come from HDNet's ever growing library of original content including the <span style="font-style: italic;">HDNet World Report</span>, a groundbreaking series featuring news in HD from around the globe; <span style="font-style: italic;">True Music</span>, a popular weekly music series highlighting up-and-coming bands; <span style="font-style: italic;">Higher Definition</span>, a celebrity interview series hosted by Robert Wilonsky; <span style="font-style: italic;">Young, Beautiful and Trying to Make it in Hollywood</span>, following actresses through the hectic process of getting hired in Hollywood; and <span style="font-style: italic;">Deadline</span>, delivering current events and news from around the world from an irreverent point of view.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=heretv">here!</a>: Gay and lesbian U.S. television network featuring original movies and series and film library (independent and foreign films, documentaries and shorts).<br /><br />• <span style="font-weight: bold;"><a href="http://video.google.com/videosearch?q=hollywood+licensing">Hollywood Licensing's HilariousDownloads.com</a></span>: Hollywood Licensing is the entertainment licensing agency which represents the best and most extensive library of hilarious videos in the world. Tapping into a library boasting tens of thousands of clips, they have custom produced 20 packages of funny themes a celebrity interview series hosted by Robert Wilonsky; <span style="font-style: italic;">Young, Beautiful and Trying to Make it in Hollywood</span>, following actresses through the hectic process of getting hired in Hollywood; and <span style="font-style: italic;">Deadline</span>, delivering current events and news from around the world from an irreverent point of view.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=heretv">here!</a>: Gay and lesbian U.S. television network featuring original movies and series and film library (independent and foreign films, documentaries and shorts).<br /><br />• <span style="font-weight: bold;"><a href="http://video.google.com/videosearch?q=hollywood+licensing">Hollywood Licensing's HilariousDownloads.com</a></span>: Hollywood Licensing is the entertainment licensing agency which represents the best and most extensive library of hilarious videos in the world. Tapping into a library boasting tens of thousands of clips, they have custom produced 20 packages of funny themes for Google Video. For example, if you think that your recent home improvements was nothing but a miserable experience, wait until you see a bucket of wet plaster land on a man's face, a house collapsing or a door falling of its hinges for no particular reason.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=in_label%3Aowner%3Ditn">ITN</a>: One of the world's leading news producers, providing news programming for the main commercial broadcasters in the U.K. and its combined news broadcasts reach over two-thirds of the U.K. population. The company has a strong reputation for the creative and innovative use of modern technology, winning the Royal Television Society's 2004 Innovation Award.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=in_label%3Aowner%3Diwatchnow">iWatchNow.com</a>: Titles include Night of the Living Dead (George Romero), The Chronicles of Narnia: The Lion, Witch, and the Wardrobe (original animated film BBC from1979), The Man Who Knew Too Much (Hitchcock), the hard-to-find Comedy's Dirtiest Dozen (with Chris Rock and Tim Allen), and The Little Shop of Horrors (1960).<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=kantola&so=0">Kantola Productions</a>: Captures unique speaking events given by well-known experts at Stanford University. Topics focus on innovative and practical business advice, such as How Leaders Boost Productivity by John H. (Jack) Zenger and <span style="font-style: italic;">Mastery of Speaking as a Leader</span> by Terry Pearce.<br /><br />• <span style="font-weight: bold;"><a href="http://video.google.com/videosearch?q=in_label%3Aowner%3Dlime">LIME</a></span>: “Healthy Living with a Twist†offers entertaining and revealing programming focused on a greener, healthier, more balanced lifestyle. Programming features inspiration from leading experts, authors, and pop culture icons and covers topics including the environment and sustainability, personal growth, alternative health, healthy foods, and business ethics.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=mediazone.com&so=0">MediaZone.com</a>: Programming covers sporting events, TV episodes, movies, how-to programs. Content includes <span style="font-style: italic;">The Rugby Channel presents ‘The Best Tries of 2004’</span> and <span style="font-style: italic;">The All Blacks of New Zealand Vs. Springboks of South Africa</span>.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=in_label%3Aowner%3Dtwi+nobel">Nobel Video Library</a>: A library focused on the achievements of individual Nobel Laureate. The series was developed to introduce students to the work of the laureates as well as to support classroom discussion regarding important issues addressed by Nobel Prize winners in recent decades.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=open+championship&so=0">Open Championship</a>: Official programs from the classic golf tournament, the British Open, such as<span style="font-style: italic;"> </span><span style="font-style: italic;">Reflections: Past Open Champions</span>.<br /><br />•<a style="font-weight: bold;" href="http://video.google.com/videosearch?q=plum+tv"> Plum TV</a>: Provides highly localized programming to the nation’s most influential consumers, and strives to be an incubator of groundbreaking new television programming. Each Plum TV station shares branding which links each station as a network, but still provides original programming customized to reflect each community. Plum TV’s programming includes regionally-focused feature pieces, tourist information (weather, traffic reports, restaurant reviews, retail and lodging information), a real estate show, local news and specially targeted entertainment for each community’s interests.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=porchlight+entertainment">PorchLight Entertainment</a>: Porchlight produces family-oriented motion pictures and TV specials. Google Video will offer 36 titles including <span style="font-style: italic;">Enough Already</span> and <span style="font-style: italic;">Role of a Lifetime</span>.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=SOFA+Entertainment&so=0">SOFA Entertainment</a>: Represents pop culture at its best. Featuring several titles from the classic <span style="font-style: italic;">The Ed Sullivan Show</span> along with documentaries, feature films and music programming. SOFA Entertainment truly offers something for everyone. Some highlights include <span style="font-style: italic;">The Very Best of The Ed Sullivan Show - Vol. 1 & Vol. 2.</span><br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=Sony+BMG">SONY BMG MUSIC ENTERTAINMENT</a>: The lineup of launch videos includes offerings from some of SONY BMG's largest global superstar artists, including Christina Aguilera, Beyonce, Kenny Chesney, Destiny's Child, Kelly Clarkson, Alicia Keys, Lil' Flip, Jessica Simpson, Shakira, System of a Down, Switchfoot, Usher, and many more.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=Tai+Seng&so=0">Tai Seng Entertainment</a>: The definitive Asian cinema powerhouse. Known as the best source for Hong Kong films, Tai Seng also releases cinematic masterpieces from all over the Asia region in a variety of languages. Tai Seng brings to your home the best in class from high-octane action to bone-crushing martial arts, from chilling horror to lush swordplay epics. We are proud to showcase with Google some of Asia's biggest hits like Johnnie To's <span style="font-style: italic;">Running On Karma</span>, Korea's sensuously emotional drama <span style="font-style: italic;">Addicted</span>, martial arts Master Yuen Wo Ping's highly acclaimed <span style="font-style: italic;">Tai Chi Master</span>, and Michelle Yeoh's violently elegant <span style="font-style: italic;">Butterfly Sword</span>.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=Teen+Kids+news">Teen Kids News</a>: A dynamic television news program for teens and pre-teens, by teens. The half-hour weekly program provides 10 eyewitness news segments to students in a way that's educational as well as entertaining. Thirty shows with kids reporting on camera are available on Google Video.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=Trinity+Broadcasting+&so=0">Trinity Broadcasting Network</a>: The world's largest religious network and America's most watched faith channel, TBN offers 24 hours of commercial-free inspirational programming that appeal to people in a wide variety of Protestant, Catholic and Messianic Jewish denominations. <span style="font-style: italic;">The Praise the Lord Program</span> is the only live two-hour Christian program in the world. The program brings the highest caliber of guests from well-known celebrities to laypersons for interview, as well as, singers, musicians, evangelists and the coverage of revivals and crusades from around the world. This award-winning program has been on each week night for over 30 years.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videoplay?docid=8592392906577495616&q=in_label%3Aowner%3Dunion">Union</a>: Offers the best of breed from the world of action sports, including snow, skate, bmx, moto, and surfing. Union is owned by Quiksilver Entertainment, Inc. and Global Media Ventures, LLC.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=wilderness+films+india">WFIL</a>: Wilderness Films India Ltd. is a leading producer and library of stock footage captured in India and across Asia. WFIL will offer 100 hours of high quality video, both free and for sale, on Google Video. Topics vary from helicopter skiing in the Himalaya, broadcast coverage of an Everest climb, and rare wildlife such as the takin and the clouded leopard to imagery spanning India's art, culture, technology, peoples, cities, and rural areas.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=wgbh+boston">WGBH</a>: WGBH Boston is America's preeminent public broadcasting producer, the source of fully one-third of PBS's prime-time lineup, along with some of public television's best-known lifestyle shows and children's programs and many public radio favorites. Programming available includes <span style="font-style: italic;">Nova</span>, <span style="font-style: italic;">La Plaza</span> (the longest running Latino program in the country), <span style="font-style: italic;">Thinking Big</span>, and <span style="font-style: italic;">Basic Black</span>. WGBH is the number one producer of Web sites on pbs.org, one of the most trafficked dot-org Web sites in the world. WGBH is a pioneer in educational multimedia and in technologies and services that make media accessible to the 36 million Americans who rely on captioning or video descriptions. WGBH has been recognized with hundreds of honors: Emmys, Peabodys, duPont-Columbia Awards.even two Oscars. In 2002, WGBH was honored with a special institutional Peabody Award for 50 years of excellence.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=WheelsTV&so=0">WheelsTV</a>: Serves both the general audience and the enthusiast with a wide spectrum of vehicle-based entertainment, news and information. WheelsTV Network, WheelsTV On Demand and WheelsTV.net have been developed by the producers of multi-awarding winning automotive programming for Discovery, PBS, Speedvision, Fox and Outdoor Life Networks including <span style="font-style: italic;">Wild About Wheels</span>, <span style="font-style: italic;">Wheels</span>, and <span style="font-style: italic;">Motor Trend Television</span>. WheelsTV Network’s valuable consumer programs include <span style="font-style: italic;">Top 200™ New Vehicle Test Drives</span>. With <span style="font-style: italic;">Top 200</span> on Google, consumers will be able to download virtual test drives of the best selling and most exciting cars on the road today, saving time and money.<br /><br />• <a style="font-weight: bold;" href="http://video.google.com/videosearch?q=in_label%3Aowner%3Dtwi">Wimbledon</a>: Official programs from the Wimbledon Tennis Championships such as <span style="font-style: italic;">Legends of Wimbledon: Bjorn Borg</span>.falseA Googler2006-01-09T06:27:00-08:002006-01-09T14:30:23Z2005-12-18T23:47:55Ztag:blogger.com,1999:blog-10861780.post-113494967528450491The 2006 Anita Borg Scholarships
Posted by April Yu, University Programs Team, and Emily Nishi, Diversity Program Manager
The wonderfully-named Dr. Anita Borg (1949 - 2003) was a rebel with a cause: ensuring that technology itself has positive outcomes, and dismantling barriers that keep women and minorities from entering computing and technology fields. Today the Anita Borg Institute for Women and Technology carries on her vision. And because Google shares that passion, we are pleased to sponsor the 2006 Anita Borg Scholarship program. We are inspired by the past scholarship recipients -- and in hopes of finding more, the program is expanded this year to accept applications from students entering their senior year of undergraduate study as well as those enrolled in a graduate program. Last year we awarded 23 scholarships; this year we'd like to do more.
Tell your friends, or apply yourself - the deadline is January 20.
falseA Googler2006-01-06T16:51:00-08:002006-01-07T00:54:51Z2005-12-31T18:24:44Ztag:blogger.com,1999:blog-10861780.post-113605348414874975Make your computer just work<span class="byline-author">Posted by Jesse Savage, Google Pack team</span><br /> <br />So you bought a new PC for yourself or a relative during the holidays. There was the initial excitement about its speed and the nice screen – and then it came time to actually get it running. Which meant embarking on some real work -– downloading a browser, a couple of multimedia players, a PDF reader, a toolbar, and maybe something for voice and instant messaging. Don’t forget the anti-spyware and anti-virus apps – you’ve got to have those. Hours, maybe even days, go by. How many wizards have you clicked through, not to mention license agreements and preference pickers? And then you have to ask: did I get everything? And how am I going to keep all of this up to date?<br /> <br />This was the experience both Sergey and Larry had a year ago. And they’re computer guys, after all. Which led them to ask more of us to make it easier for everyone. So we created the <a href="http://pack.google.com">Google Pack</a> -- a one-stop software package that helps you discover, install, and maintain a wide range of essential PC programs. It’s yours today – and it’s something we hope you find to be painless, easy, and even fun (if computer setup can ever be called that). And it’s free. <br /> <br />We worked with a number of technology companies to identify products that are the best of their type to create <a href="http://www.google.com/support/pack">this suite</a>. (We didn’t pay them, and they aren’t paying us.) For PC users running Windows XP, it downloads in minutes and installs in just a few clicks. There’s only one license agreement – and no wizards. And there’s a new tool called the <a href="http://www.google.com/support/pack/bin/answer.py?answer=30252&topic=8326/">Google Updater</a> that keeps all the software in the Google Pack current. Even if you already have some of the software in the Pack, you can use the Google Updater to update and manage it.<br /> <br />There’s one more thing in the Pack that we think you’ll like. The Pack team asked people what kind of screensavers they like best. They kept saying, “I want my own photos as a screensaver, why can’t I do that?†Good question -- lots of people have trouble with this. So we made the <a href="http://www.google.com/support/pack/bin/answer.py?answer=28076&topic=8315">Google Pack Screensaver</a>, which is the easiest possible way to make your photos into an animated photo collage. And now the question for you is: what will you do with all that time you've saved?falseA Googler2005-12-30T17:18:00-08:002006-01-05T21:52:34Z2005-12-31T01:31:39Ztag:blogger.com,1999:blog-10861780.post-113599269991367646A year of Google blogging
Posted by Karen Wickre, Google Blog team
This is the 201st post to be published on the Google Blog in 2005. In closing out the first full year of our company-wide effort to share news and views, we thought you might be interested in a few factoids. Since we've had Google Analytics running on this blog since June, some of these numbers reflect only half a year. In that time, 4.3 million unique visitors have generated 8.7 million pageviews. Readers have come from all over the world, not just English-speaking countries: 53,001 visitors from Turkey have stopped by, for example; so have 155,691 from France, 29,614 from Thailand and 8,233 from Peru.
The most popular posts? Here are a few that have yielded scores of backlinks:
During the year, we've published 38 how-to tips, announced 77 new products and services, and addressed policy questions and legal matters 17 times. We've featured 11 guest bloggers. Forty posts have illuminated something about day to day life at Google; 19 have offered some international perspective.
In 2006, we'll keep up the Google Blog with more posts, more bloggers, and even more topics. Meanwhile, we really appreciate your interest and feedback, now visible through "Links to this post." We know some of you would like to offer comments directly, and we would like that too, when we can add resources to the blog crew. Meanwhile, our best to you and yours for the New Year.
false
php-horde-feed-2.0.1/Horde_Feed-2.0.1/test/Horde/Feed/fixtures/AtomTestMozillazine.xml 0000664 0000000 0000000 00000042074 12060425040 0030155 0 ustar 00root root 0000000 0000000
mozillaZine.org2006-01-23T04:04:45-08:00Your Source for Daily Mozilla News and Advocacytag:mozillazine.org,2004:1Copyright (c) 2004, The Mozillazine OrganizationMinutes of the mozilla.org Staff Meeting of Monday 9th January 20062006-01-22T20:04:42-08:002006-01-22T20:04:42-08:002006-01-22T20:04:42-08:00tag:mozillazine.org,2004:article7935mozillaZine.org
The minutes of the mozilla.org staff meeting held on Monday 9th January 2006 are now online. Issues discussed include Firefox 1.5.0.1 release schedule, Thunderbird 1.5 release and Marketing.
]]>
Talkback]]>
Minutes of the mozilla.org Staff Meeting of Wednesday 4th January 20062006-01-12T09:29:47-08:002006-01-12T09:29:47-08:002006-01-12T09:29:47-08:00tag:mozillazine.org,2004:article7895mozillaZine.org
The minutes of the mozilla.org staff meeting held on Wednesday 4th January 2006 are now available. Issues discussed include Upcoming Releases, Marketing, Thunderbird, 1.9 Roadmap, Firefox 2 Process and Calendar.
The minutes have been posted to the new mozilla.dev.general newsgroup, which is accessible via news.mozilla.org. The previously announced newsgroup migration is in progress. Once mozilla.dev.planning is created, minutes will be posted there.
]]>
Talkback]]>
Thunderbird 1.5 Released2006-01-11T18:19:13-08:002006-01-11T18:19:13-08:002006-01-11T18:19:13-08:00tag:mozillazine.org,2004:article7892mozillaZine.orgScott MacGregor writes: "The final release of Mozilla Thunderbird 1.5 is now available for download from getthunderbird.com. Users of RC1 should see the update soon. If you are using RC2, then you already have 1.5 final."
"Thunderbird 1.5 introduces several new features including a software update system, spell check as you type, built in phishing detector, auto save as draft, and support for deleting attachments from email messages. Message filtering has also been improved with new filter actions for replying and forwarding. Saved search folders can now search folders across multiple accounts."
"I wanted to thank everyone in the mozillaZine community who helped test the alphas, the betas, and the release candidates that went into this release. Thank you for trusting Thunderbird with your email throughout the development and release cycle for 1.5. I'm looking forward to working with all of you on 2.0 and beyond!"
]]>
Talkback]]>
Firefox Smoketest Day Planned for January 6, 20062006-01-04T14:14:20-08:002006-01-04T14:14:20-08:002006-01-04T14:14:20-08:00tag:mozillazine.org,2004:article7859mozillaZine.org
The Mozilla QA team has announced a community test day with focus on smoketesting nightly Firefox 1.5.0.1 builds.
Litmus tool will be used for this testing event. There is a FAQ posted on the QA community wiki that will have specific instructions on how this testing day will run.
]]>
Talkback]]>
Camino 1.0 Beta 2 Released2006-01-02T15:23:18-08:002006-01-02T15:23:18-08:002006-01-02T15:23:18-08:00tag:mozillazine.org,2004:article7850mozillaZine.org
Camino 1.0 beta 2 has been released. This latest version of the native Mac OS X browser is replacing 0.8.4 as the stable Camino release on all systems 10.2+. See the Camino 1.0 Beta 2 Release Notes for more details.]]>
Talkback]]>
Mozilla Newsgroups Migration Scheduled2006-01-02T15:07:27-08:002006-01-02T15:07:27-08:002006-01-02T15:07:27-08:00tag:mozillazine.org,2004:article7849mozillaZine.org
Frank Wein has announced that the migration and reorganization of Mozilla newsgroups will take place in January 2006. As announced earlier, the new newsgroups will be hosted by Giganews. Access to the news server news.mozilla.org will remain free. The new groups will only be propogated to news.mozilla.org, Giganews Servers and Google Groups in an effort to combat news spam. For more information, refer to the FAQ and the list of new newsgroups.
]]>
Talkback]]>
Mozilla Thunderbird 1.5 Release Candidate 2 Available2005-12-21T13:58:07-08:002005-12-21T13:58:07-08:002005-12-21T13:58:07-08:00tag:mozillazine.org,2004:article7823mozillaZine.orgScott MacGregor writes: "The second release candidate of Mozilla Thunderbird 1.5 is now available for download. Mozilla Thunderbird 1.5 RC2 is intended to allow testers to ensure that there are no last-minute problems with the Thunderbird 1.5 code. "
"RC2 contains several key bug fixes that were identified during the RC1 testing cycle. There are no new features or enchancements from RC1. Users of Thunderbird 1.5 RC1 will be offered RC 2 through the software update system."
"I'd like to single out all of the folks who participated in our QA testing day and our localization testing day. We wouldn't have been able to release RC2 before the holidays without all the volunteers who pitched in. Thank you!"
]]>
Talkback]]>
Interview with Mike Beltzner2005-12-20T23:00:29-08:002005-12-20T23:00:29-08:002005-12-20T23:00:29-08:00tag:mozillazine.org,2004:article7820mozillaZine.orgDavid Tenser has posted an interview with Mozilla Foundation's User Experience Lead, Mike Beltzner. The interview was conducted over instant messaging sessions during the last week of November. Mike talks about usability studies, design of the Mozilla Developer Central, and the new bookmark system planned for Firefox 2.]]>
Talkback]]>
Gecko 1.9 Trunk and 1.8 Branch Management Plan Posted2005-12-20T18:08:36-08:002005-12-20T18:08:36-08:002005-12-20T18:08:36-08:00tag:mozillazine.org,2004:article7819mozillaZine.orgBrendan Eich has posted a draft plan for Gecko 1.9 Trunk and 1.8 Branch Management, including a FAQ at the mozilla wiki. Comments should be directed as followups to the newsgroup post.
]]>
Talkback]]>
Minutes of the mozilla.org Staff Meeting of Monday 12th December 20052005-12-20T18:04:08-08:002005-12-20T18:04:08-08:002005-12-20T18:04:08-08:00tag:mozillazine.org,2004:article7818mozillaZine.org
The minutes of the mozilla.org staff meeting held on Monday 12th December 2005 are now online. Issues discussed include Firefox Summit, Engineering, Upgrading, Awards and Newsgroups reorganisation]]>
Talkback]]>
Minutes of the mozilla.org Staff Meeting of Monday 5th December 20052005-12-20T18:02:08-08:002005-12-20T18:02:08-08:002005-12-20T18:02:08-08:00tag:mozillazine.org,2004:article7817mozillaZine.org
The minutes of the mozilla.org staff meeting held on Monday 5th December 2005 are now online. Issues discussed include Firefox Summit and Engineering.]]>
Talkback]]>
SeaMonkey 1.0 Beta Released2005-12-20T17:41:12-08:002005-12-20T17:41:12-08:002005-12-20T17:41:12-08:00tag:mozillazine.org,2004:article7815mozillaZine.orgRobert Kaiser writes: "Today, the SeaMonkey Council announces a new developer release, SeaMonkey 1.0 Beta. Compared to the Alpha version released in September, SeaMonkey 1.0 Beta enhances the product with new features like tab drag and drop, but also is the first release branded with the new SeaMonkey logo, which was unveiled earlier this month."
Here are some fundamental, well made JS goodies: Vectorgraphics Library, Drag'nDrop & DHTML Library, Tooltips with JavaScript Lib, and Rotate Image Lib. A pleasure to work with, and LGPL'ed. Also check out the JS Online Function Grapher.
There's been a lot of talk about the revolutionary change Web 2.0 promises, and it's time to look at the architecture that's leading to that change: a greater split between client and server logic.
Simon St. Laurent2006-01-23T08:15:34-08:00Don't Give us your Tired Your Poorhttp://www.oreillynet.com/pub/wlg/9083
Give us your vibrant, exciting, cool, open source Java submissions for this year's OSCON.
Daniel H. Steinberg2006-01-23T07:45:36-08:00Cutting Through the Patent Thickethttp://www.oreillynet.com/pub/wlg/9082
Good succinct summary of the anti-patent argument, including how VC's look at patents and get duped by them.
Damien Stolarz2006-01-23T00:45:30-08:00The addslashes() Versus mysql_real_escape_string() Debatehttp://www.oreillynet.com/pub/wlg/9081
Chris Shiflett2006-01-22T22:45:11-08:00RPM Rollback in Fedora Core 4/5http://www.oreillynet.com/pub/wlg/9080
Fedora's yum/rpm system includes a little-known capability: it can rollback a system to a previously-installed state.
Chris Tyler2006-01-22T13:15:12-08:00Shifting Gears: Switching to Djangohttp://www.oreillynet.com/pub/wlg/9075
I've been using TurboGears since its public debut around September of last year. I believe it has incredible potential, but I'm finding myself needing something a little different. That something is Django.
Jeremy Jones2006-01-22T12:15:19-08:00Are We In A Productivity Crisis?http://www.oreillynet.com/pub/wlg/9079
Are we in a new kind of productivity crisis, one in which there is not too little productivity, but too much?
Spencer Critchley2006-01-22T09:45:58-08:00What Happens When You Edit an Image Stored Outside of iPhoto 6http://www.oreillynet.com/pub/wlg/9078
Is the edited image stored inside or outside of your iPhoto 6 library?
Derrick Story2006-01-22T07:45:58-08:00Building emacs22 on Mac OS Xhttp://www.oreillynet.com/pub/wlg/9074
Emacs 22 is Mac OS X aware, and can be built either as a Carbon .app double-clickable, or as a typical X11 program. Problem is, the information about how to build it is pretty scattered. Here's what works for me.
Chris Adamson2006-01-21T19:45:53-08:00hip to bash web2.0, are we?http://www.oreillynet.com/pub/wlg/9034
It's hip to take some "diggs" at Web 2.0.
Timothy M. O'Brien2006-01-21T15:46:26-08:00My New Game Development Course at Tuftshttp://www.oreillynet.com/pub/wlg/9076
I am teaching a new course at the Tufts University, "Introduction to Game Development," this semester.
Ming Chow2006-01-21T12:46:56-08:00Tune in to Radio Babylonhttp://www.oreillynet.com/pub/wlg/9073
Hardware hacks we'd like to see in iPods, #1
Giles Turnbull2006-01-20T14:15:54-08:00A resource for Google maphacks and mashers now at Maphacks,nethttp://www.oreillynet.com/pub/wlg/9072
Glenn Letham2006-01-20T12:16:05-08:00UK film studio on the hunt for Google earth programmershttp://www.oreillynet.com/pub/wlg/9071
Glenn Letham2006-01-20T11:47:03-08:00
php-horde-feed-2.0.1/Horde_Feed-2.0.1/test/Horde/Feed/fixtures/AtomTestPlanetPHP.xml 0000664 0000000 0000000 00000057054 12060425040 0027457 0 ustar 00root root 0000000 0000000
Planet PHPPeople blogging about PHPhttp://www.planet-php.net/
Planet PHP Aggregator
2006-01-23T16:40:00ZeZ components in Gentoo LinuxSebastian Bergmannhttp://www.sebastian-bergmann.de/blog/archives/565-guid.html2006-01-23T16:40:00Z2006-01-23T16:40:00ZeZ components, which provide an enterprise ready general purpose PHP platform, are now available through Gentoo Linux's portage system:
wopr-mobile ~ # emerge -vp ezc-eZcomponents
These are the packages that I would merge, in order:
Calculating dependencies ...done!
[ebuild N ] app-admin/php-toolkit-1.0-r2 0 kB
[ebuild N ] dev-lang/php-5.1.2 0 kB [3]
[ebuild N ] dev-php/PEAR-PEAR-1.4.6 0 kB [2]
[ebuild N ] dev-php5/ezc-Base-1.0_rc1 0 kB [2]
[ebuild N ] dev-php5/ezc-Database-1.0_rc1 0 kB [2]
[ebuild N ] dev-php5/ezc-PhpGenerator-1.0_rc1 0 kB [2]
[ebuild N ] dev-php5/ezc-Configuration-1.0_rc1 0 kB [2]
[ebuild N ] dev-php5/ezc-ImageAnalysis-1.0_rc1 0 kB [2]
[ebuild N ] dev-php5/ezc-Archive-1.0_rc1 0 kB [2]
[ebuild N ] dev-php5/ezc-Translation-1.0_rc1 0 kB [2]
[ebuild N ] dev-php5/ezc-Cache-1.0_rc1 0 kB [2]
[ebuild N ] dev-php5/ezc-ConsoleTools-1.0_rc1 0 kB [2]
[ebuild N ] dev-php5/ezc-PersistentObject-1.0_rc1 0 kB [2]
[ebuild N ] dev-php5/ezc-ImageConversion-1.0_rc1 0 kB [2]
[ebuild N ] dev-php5/ezc-Mail-1.0_rc1 0 kB [2]
[ebuild N ] dev-php5/ezc-UserInput-1.0_rc1 0 kB [2]
[ebuild N ] dev-php5/ezc-Debug-1.0_rc1 0 kB [2]
[ebuild N ] dev-php5/ezc-EventLog-1.0_rc1 0 kB [2]
[ebuild N ] dev-php5/ezc-Execution-1.0_rc1 0 kB [2]
[ebuild N ] dev-php5/ezc-eZcomponents-1.0_rc1 0 kB [2]
Total size of downloads: 0 kB
Portage overlays:
[1] /usr/local/overlay/personal
[2] /usr/local/overlay/cvs
[3] /usr/local/overlay/php/testing
[4] /usr/local/overlay/php/experimental
[5] /usr/local/overlay/gentopia
[6] /usr/local/overlay/xgl
]]>PHP InsecurityChris Shifletthttp://shiflett.org/archive/1852006-01-23T16:15:00Z2006-01-23T16:15:00ZAndrew van der Stock has written a strong criticism of PHP's insecurity. Andrew is a seasoned security expert and a major contributor to OWASP, and he states:
After writing PHP forum software for three years now, I've come to the conclusion that it is basically impossible for normal programmers to write secure PHP code. It takes far too much effort.
He continues, citing specific areas where he thinks PHP is weak and asserting that "PHP must now mature and take on a proper security architecture."
Many of the insecure features he cites (register_globals, magic_quotes_gpc, and safe_mode) are slated to be removed in PHP 6, but his core complaint seems to revolve around the fact that PHP makes too much power too easily accessible, often granting developers more power and flexibility than they realize (e.g., wrappers).
Aside from minor language features like taint mode, I don't see what other platforms offer to help prevent inexperienced developers from writing insecure code. Anyone care to enlighten me? :-)
]]>Beta release of mobile webmail client (MIMP)Horde Newshttp://janschneider.de/cweb/home/index,channel,25,story,255.html2006-01-23T10:01:00Z2006-01-23T10:01:00ZMeet me at php|tekThinkPHP /dev/blog - PHPhttp://blog.thinkphp.de/archives/81-guid.html2006-01-22T22:34:00Z2006-01-22T22:34:00Zphp|tek, the next conference from the php|arch
guys around Marco Tabini who already organized the php|cruise and php|tropics
conferences, will be from April 26th to 28th at Orlando, Florida. As
you can read on the recently published schedule
I'll hold two talks. The first talk will be about PHP on the command
line, showing PHP's strength beyond the web which can be helpful to
build, deploy and scale your web-application and even for building apps
completely independent from anything on the web. My second talk will be
about PHP's reflection API. In that session I'll give an introduction
into the API and show how to use it to build modular, dynamic
applications.
If you're in reachable distance you should take the chance to listen and meet PHP developers from all over the world. (Hint: Till January 31st you can get early-bird rates!)
johannes
]]>Quick LookupJohn Coxhttp://wyome.com/index.php?module=articles&func=display&ptid=10&catid=29-31&aid=5072006-01-22T19:23:00Z2006-01-22T19:23:00ZQuick lookup is a very nice little reference tool for lookups of web development documentation. It installs as a simple bookmark which can be changed to your sidebar for look ups of php / css / javascript / mysql documentation. It has a limited scope of features (which isn't a bad thing in my mind):
* Multiple tabs
* PHP / MySQL / CSS / JS reference (MySQL is 55% complete)
* Examples
* Search as you type
* Fast results
* Remembers your last tab on your revisit
* Access keys, [alt + (p, m, j, c)]
I did a cursory install, and it appears to be pretty fast. I think it might be better as part of the Web Developer Extension for Firefox, but as is, I can see the uses.
]]>mysql_real_escape_string() versus Prepared StatementsIlia Alshanetskyhttp://ilia.ws/archives/103-guid.html2006-01-22T18:03:00Z2006-01-22T18:03:00ZChris has written a compelling piece about how the use of addslashes() for string escaping in MySQL queries can lead to SQL injection through the abuse of multibyte character sets. In his example he relies on addslashes() to convert an invalid multibyte sequence into a valid one, which also has an embedded ' that is not escaped. And in an ironic twist, the function intended to protect against SQL injection is used to actually trigger it.
The problem demonstrated, actually goes a bit further, which even makes the prescribed escaping mechanism, mysql_real_escape_string() prone to the same kind of issues affecting addslashes(). The main advantage of the mysql_real_escape_string() over addslashes() lies in the fact that it takes character set into account and thus is able to determine how to properly escape the data. For example, if GBK character set is being used, it will not convert an invalid multibyte sequence 0xbf27 (¿’) into 0xbf5c27 (¿\’ or in GBK a single valid multibyte character followed by a single quote). To determine the proper escaping methodology mysql_real_escape_string() needs to know the character set used, which is normally retrieved from the database connection cursor. Herein lies the “trick”. In MySQL there are two ways to change the character set, you can do it by changing in MySQL configuration file (my.cnf) by doing:
CODE:
[client]
default-character-set=GBK
Or you can change on a per-connection basis, which is a common practice done by people without admin level access to the server via the following query:
CODE:
SETÂ CHARACTERÂ SETÂ 'GBK'
The problem with the latter, is that while it most certainly modified the charset it didnÂ’t let the escaping facilities know about it. Which means that mysql_real_escape_string() still works on the basis of the default charset, which if set to latin1 (common default) will make the function work in a manner identical to addslashes() for our purposes. Another word, 0xbf27 will be converted to 0xbf5c27 facilitating the SQL injection. Here is a brief proof of concept.
// change our character set mysql_query("SET CHARACTER SET 'gbk'", $c);
// create demo table mysql_query("CREATE TABLE users (
    username VARCHAR(32) PRIMARY KEY,
    password VARCHAR(32)
) CHARACTER SET 'GBK'", $c); mysql_query("INSERT INTO users VALUES('foo','bar'), ('baz','test')", $c);
Truncated by Planet PHP, read more at the original (another 2694 bytes)
]]>The addslashes() Versus mysql_real_escape_string() DebateChris Shifletthttp://shiflett.org/archive/1842006-01-22T04:15:00Z2006-01-22T04:15:00ZLast month, I discussed Google's XSS Vulnerability and provided an example that demonstrates it. I was hoping to highlight why character encoding consistency is important, but apparently the addslashes() versus mysql_real_escape_string() debate continues. Demonstrating Google's XSS vulnerability was pretty easy. Demonstrating an SQL injection attack that is immune to addslashes() is a bit more involved, but still pretty straightforward.
In GBK, 0xbf27 is not a valid multi-byte character, but 0xbf5c is. Interpreted as single-byte characters, 0xbf27 is 0xbf (¿) followed by 0x27 ('), and 0xbf5c is 0xbf (¿) followed by 0x5c (\).
How does this help? If I want to attempt an SQL injection attack against a MySQL database, having single quotes escaped with a backslash is a bummer. If you're using addslashes(), however, I'm in luck. All I need to do is inject something like 0xbf27, and addslashes() modifies this to become 0xbf5c27, a valid multi-byte character followed by a single quote. In other words, I can successfully inject a single quote despite your escaping. That's because 0xbf5c is considered to be a single character, not two. Oops, there goes the backslash.
I'm going to use MySQL 5.0 and PHP's mysqli extension for this demonstration. If you want to try this yourself, make sure you're using GBK. I just changed /etc/my.cnf, but that's because I'm testing locally:
[client]
default-character-set=GBK
Create a table called users:
CREATE TABLE users
(
username VARCHAR(32) CHARACTER SET GBK,
password VARCHAR(32) CHARACTER SET GBK,
PRIMARY KEY (username)
);
The following script mimics a situation where only addslashes() is used to escape the data being used in a query:
$_POST['username'] = chr(0xbf) .                      chr(0x27) .                      ' OR username = username /*'; $_POST['password'] = 'guess';
Truncated by Planet PHP, read more at the original (another 4165 bytes)
]]>PHP ConferencesJason E. Sweathttp://blog.casey-sweat.us/?p=692006-01-22T04:04:00Z2006-01-22T04:04:00ZBack from NorwayTobias Schlitthttp://www.schlitt.info/applications/blog/index.php?/archives/407-guid.html2006-01-22T00:30:00Z2006-01-22T00:30:00ZNorway is a somewhat strange country. When I got there - 2 weeks ago to work with Amos, Derick, Fred and Ray on the eZ components - it had the expected amount of snow. A few days later, there was nothing anymore. We had positive celsius values and the weather was really crappy... until Monday. Since then it has been snowing all the time and yesterday we left when it looked like this:
Nice to watch, but not real fun to walk onto. :) Anyway, it's been another great stay in Skien, where the eZ headquarter is and I'm pretty much looking forward to our summer conference, where we plan to have the complete eZ team there and lots of people from the PHP world. Thanks for the great time, folks!
]]>Solar 0.10.0 ReleasedPaul M. Joneshttp://paul-m-jones.com/blog/?p=1922006-01-21T21:44:00Z2006-01-21T21:44:00Z
php-horde-feed-2.0.1/Horde_Feed-2.0.1/test/Horde/Feed/fixtures/AtomTestSample1.xml 0000664 0000000 0000000 00000001216 12060425040 0027153 0 ustar 00root root 0000000 0000000
Example FeedInsert witty or insightful remark here2003-12-13T18:30:02ZJohn Doejohndoe@example.comurn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6Atom-Powered Robots Run Amokurn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a2003-12-13T18:30:02ZSome text.