Older blog entries for tnt (starting at number 44)

FBI Now Decides What Americans Legally Can And Can't Do On Their Computers
2005-09-30T19:12:33-07:00
Topics: Civil Rights  

news.com has an article titled: FBI to get veto power over PC software. Basically the FCC -- an unelected body -- has given the FBI the power to legally tell people in the USA what they can and cannot do on or with their computers. (If you're thinking something like "yeah right"... I'm serious!)

The FBI now gets to choose what software you are allowed to install. They now get to choose what you do with that software. The now get to choose how you do that too. And they can change their mind at any time and even make different rules for different people. And if you don't do what they say, you are breaking the "law". (I strongly suspect that this new power the FBI has been given is unconstitutional. But with stuff like the USA Patriot Act and DMCA, no one in the government seems to care if a "law" breaks the consitution or not. I.e., no one in the government cares if a "law" is illegal or not.)

It is pretty disturbing to see that the FCC once again has put "laws" into place outside the democratic process. There's a rule with government and laws that I have said over and over again: whatever can be abused will (probably) be abused eventually. So no "law", "rule", or "regulation" should be made that allows for any kind of abuse; or at the very least minimizes it. To put this in language like I hear politicians and law makers use:

The government is where the power is. And it will attract the "bad guys" to it. They'll try to take control of it. And all you need is the "bad guys" to gain any level of "power" in the goverment to abuse the powers the government has to do "bad things" to decent people.

(Note, I hate using the phrase "bad guys". I just wanted to use language that I think some people need to hear it in to understand.)

RSS and Atom Feed Rediscovery #
2005-09-23T01:10:30-07:00
Topics: Syndication  RSS  Atom  

How does a machine -- a piece of software, a web crawler, a feed aggregator -- find a blog's RSS or Atom feed‽ Human's might be able to figure out that the feed's URL is behind one of those orange "RSS", "Atom", or "XML" buttons; or behind one of the many other colorful button types out there. But how does a machine figure this out‽ The answer is RSS and Atom autodiscovery.

Matt Griffith had a great idea for RSS autodiscovery that was refined in Mark Pilgrim's article on RSS autodiscovery. A way for a machine to easily figure out the RSS (or Atom) feed of your blog. But what happens if your RSS or Atom feed moves‽ Maybe you moved it to somewhere else on your site; maybe you moved it to a different server (with a different domain); or maybe you want to have it hosted using a third party feed management system (because they provide you with nice reports or something), or maybe you are even changing which third party feed management system you are using. What do machines do that already autodiscovered your feed‽ How do they find the new URL of your feed‽ That's where RSS and Atom feed rediscovery comes into play; a complement to the RSS and Atom autodiscovery technology. RSS and Atom feed rediscovery helps fix some problems we are facing with feeds. RSS and Atom feed rediscovery makes it so that bloggers can change the URL of their feed without having to worry about loosing subscribers.

The problem is that when software subscribes to these feeds, alot of them only save the URL to the RSS or Atom feed. The problem is that alot of the software out there is neglecting to save the URL of the home page of the blog. This can be a major problem if a blog changes the URL of its RSS or Atom feed.

Consider it, what happends if I change the URL of my RSS or Atom feed‽ How do machines and people's software which are subscribed to my old RSS or Atom feed URL find the new one‽ How do they even know it's been moved‽ That's where RSS and Atom feed rediscovery comes in. And it's just a rule for machines to follow. The rule for this is:

When machines subscribe to an RSS or Atom feed, in addition to caching the URL of the RSS or Atom feed, they also save the URL of the blog's homepage. That way, if the URL they have cached for the RSS or Atom feed stops working, they can go to the URL of the blog's homepage, and perform RSS or Atom autodiscovery (again) to find the new URL of the blog's feed.

Also, periodically, even if the feed URL is working, they should go to the blog's homepage and rediscover feed's URL. That way bloggers can gracefully migrate users to a new feed URL. And not loose any subscribers.

The question that may be coming to your mind now may be: how does a machine figure out the URL of the blog's homepage‽ Well, there's alot of different ways you could do it. But I'll provide you with just one easy way.

When you initially subscribe to a feed, you can find the URL to the blog's homepage via the RSS <link> element (under the <channel> element). For example:

    <?xml version="1.0">
    
    <rss version="2.0">
    
        <channel>
            <title>Joe Blow's Blog</title>
            <description>The weblog for Joe Blow</description>
            <link>http://joe-blow.example.com/</link>
    
            <item>
                <title>First Post!</title>
                <link>http://joe-blow.example.com/log/9778afc5-43b6-4ab5-a5d5-558290502bc3</link>
            </item>
    
        </channel>
    
    </rss>
            

Or if it's an Atom feed, then:

    <?xml version="1.0">
    
    <feed xmlns="http://www.w3.org/2005/Atom"
          xml:base="http://joe-blow.example.com/"
    >
        <id>c63590c5-c0a4-48ce-ab99-1f2a5cf2a794</id>
        <title>Joe Blow's Blog</title>
        <link href="/" />
    
        <link rel="self" href="/feed" />
        <updated>2003-12-13T18:30:02Z</updated>
    
        <entry>
            <id>9778afc5-43b6-4ab5-a5d5-558290502bc3</id>
            <title>First Post!</title>
            <link href="/log/9778afc5-43b6-4ab5-a5d5-558290502bc3" />
            <updated>2003-12-13T18:30:02-05:00</updated>
        </entry>
    
    </feed>

First Impressions on Using Ubuntu Linux
2005-09-19T02:47:50-07:00
Topics: Linux  Ubuntu  

I just installed Ubuntu Linux for a friend of mine. (I actually have alot of my friends using Linux. And even the ones using Windows still are using Firefox and OpenOffice. Actually, the reason that some stick with Windows are PC games. And that's the only reason. But, I think that as PC gaming disappear more and more... as seems to be the trend... and more and more people only play games on the console systems (or on the Web) you'll see more and more people switching over to Linux if they're presented with the opportunity. They'll be nothing to hold them back. But anyways, back to Ubuntu.)

I've been actually planning on installing it on my new laptop... once I get it. (I've wanted to try it for a while. And I really like that, like most Debian-based Linux distributions, you don't have to reinstall it to do an upgrade.) But he got a new laptop before I did. So he got Ubuntu first. These are my first impressions on using Ubuntu. (Note, I have NOT thoroughly gone through Ubuntu yet. So some of these impressions may be way off. So please keep that in mind, and feel free to correct me if you see any erroneous statements.)

I found the instillation part of Ubuntu to be be very nice. Ubuntu is a Debian-based Linux distribution, however, the Ubuntu instillation is nothing like what I remember a Debian instillation being like. The last time I installed Debian (back in January 2002) it was very user un-friendly. It asked me all sorts of questions that the computer was certainly able to figure out for itself. (Mind you this was more than 3 years ago, so Debian may have changed since then.) I'm glad Ubuntu was nothing like that. I was very straight forward. The only complaint I have is that I think that the installer could have been made a bit more aesthetically pleasing and added more eye candy. But that's only a cosmetic issue.

Once everything was installed, most of the things my buddy wanted was there: Firefox for the web, OpenOffice for word processing, and (a GNOME-based) BitTorrent (client) is even built in and pre-configured. (He doesn't do instant messaging, but I did notice Gaim was there, which was very nice too.) However multimedia support in Ubuntu is somewhat lacking. Specifically:

  1. people want to watch movies, so support for MPEG, AVI, WMX, and Ogg Theora is needed;
  2. people want to listen music, so support for MP3 and Ogg Vorbis is needed;
  3. people want to play (encrypted) DVDs.

And these things need to be better or more easily supported. Now I know there are legal issues. Even though some countries consider these activities to be perfectly legal, including support for these activities in Ubuntu in some countries is illegal. Many of these laws are "bad laws". And there are good people trying to get these laws fixed. But it's going to take time to fix these laws and make these activities legal again. (And yes, these types of activities were once legal.) In the meantime though, there are many people who choose to go ahead with acts of civil disobedience and make their computers support these activities anyways. For these people, setting up their computer to do this needs to be made much much easier. You should be able to do it with a few clicks.

Overall though, except for the multimedia stuff, I was pleased with Ubuntu. And it will be going on my new laptop once I get it. But, like I said, better multimedia support would improve it much. Also, including a file sharing application, like Limewire, to be pre-installed would also be nice. (I'll have to install that on his computer the next time I'm at his place. I know he's going to be asking for it.)

del.icio.us is working again... Oh and Happy Birthday del.icio.us
2005-09-15T15:28:06-07:00

Topics: del.icio.us  Thank You  

I e-mailed Joshua Schachter at del.icio.us about not being able to access del.icio.us for the past 3 days. And got a very quick response back. It turned out that what was preventing me and many others in my area from accessing del.icio.us was some kind of issue between my current ISP -- Shaw Cable -- and del.icio.us' hosting provider. In Max Michaels' words,

there was a stale route between Shaw and our provider.
Anyways, thanks to Joshua Schachter and Max Michaels for getting the problem so fast and being so responsive like this. Oh and, after connecting to the site, I noticed that del.icio.us is 2 years old today. Happy Birthday del.icio.us!

15 Sep 2005 (updated 15 Sep 2005 at 09:01 UTC) »
del.icio.us down?
2005-09-15T02:04:52-07:00

OK, what's happened to del.icio.us? It's been down for 2 days now. The del.icio.us blog is available, but I haven't been able to access the main site; and more importantly, haven't been able to access my bookmarks.

Does any one know? Is it working for anyone else?

Microformats Proposal for Reputation and Trust Metrics
2005-09-12T00:09:47-07:00

Topics: Microformats  Trust Metrics  rev-tag  rel-peer  rel-meme  XFN  rel-tag  P2P  

I've known about the Microformats movement for a while. (Probably before it first started gaining traction.) But I was only really sitting on the sidelines watching things develop. In fact, it was only really recently that I really understood Microformats. (The confusion wasn't really what a Microformat was but more what a Microformat wasn't. I thought they included much much more than they actually do. Like XML namspace based paradigms like the XML modules commonly used with RSS, Atom, and RDF. They don't.)

One of the key points of Microformats is who they are made to be accessible by. This is NOT a technology that requires you to have a B.Sc. in Mathematics to use. This is NOT a technology that requires you to be a Computer Scientist to use. This is NOT even a technology that requires you to be a software engineer to use. Microformats are meant to be accessible to people with only basic HTML knowledge. If you know more than this -- if you have more than basic HTML knowledge -- then great. Good for you. It will be super easy for you to make use of them. But... let me stress again that you only need basic HTML knowledge to use them. If markup like the following makes sense to you, then you should be comfortable using Microformats in your in your day to day web development work:


This is <b>bold</b> and this is a <a href="http://changelog.ca/">link</a>.

(This accessibility is in part enforced by requiring that all Microformats to be in pure-HTML... well pure-XHTML... but you get the idea.)

The other key point to Microformats is that machines can figure out what you are trying to say too. Machines can figure out what you mean. And that is powerful!

This article proposes 3 new Microformats that together and with other Microformats and possibly other non-Microformat technologies let people and machines deduce trust metrics and answer questions with degrees of certainty. Yeah, I know, it sounds complex. But the whole concept is actually pretty simple and probably intuitive. Basically, it let's me and you (and machines) get answers to questions like:

  • What music do my friends "like" to listen to?
  • What people are "knowledgeable" about car engines?
  • What people, that one of my friends knows personally, is "knowledgeable" about car engines?
  • What are some "good" rap songs that I have never heard before?
  • Who "should" I be listening to about RSS?
  • What are some "good" places to eat in Surrey?
  • Was <u>The Island</u> a "good" movie?
  • What's "good" on TV?
  • Know of any new "good" jokes?
  • Where's a "good" place to get my car serviced in Kitsilano?
  • If I want to drive from Surrey to Langley what's the "best" way to take to avoid traffic, speed traps and all the other crap?
  • Is it "safe" to order this t-shirt online, from this guy in Texas?
  • What music is "popular" among people who go to Guildford Park Secondary School?
  • How many people would "like" to hear the song <u>Back Then</u> by Mike Jones played today?
  • How much "support", in the Surrey-North riding, does this proposed bill have for becoming law?
  • Who would "like" this law to be repealed?
  • How many of my friends would "like" this law to be repealed too?
  • What "good" apartments are for rent in Kitsilano?
  • Who "should" I allow to post comments to my artilces without poisoning their links with rel-nofollow?

And it let's you answer these questions by "asking" your friends, co-workers, acquaintances, colleagues, fellow-members, and peers. Which is how most do it in "real life". (We tend to ask people who we know. Or ask people who we think know something about the topic our question is on. Or directly or indirectly get information from a friend-of-a-friend. Etc.) Technically though, we are not really verbally "asking", but using Microformats (and possibly other technologies) to figure out these answers. Also, it let's you "judge" how much value you put on each person's opinion or advice.

Of course, this list is not even close to being complete. I'm only scrathing the surface. There are an infinite number of questions that can be answered. And others will likely use this technology in some very creative and important ways to have questions that are meaningful to them or others to be answered. But, hopefully this list will give you an idea of what trust metrics are about.

26 Aug 2005 (updated 3 Sep 2005 at 11:24 UTC) »
Microformats
Tags: Microformats , XHTML , HTML , XML

Until just now I didn't really get Microformats. The following section from their website is what made me understand it:

What are microformats?

Designed for humans first and machines second, microformats are a set of simple, open data formats built upon existing and widely adopted standards.
This is what made me realize that Microformats are implemented using existing XHTML or HTML elements. That way they are something that can always be viewed by humans (since they're implemented using existing HTML elements) but can also be parsed by software (like web crawlers) to extract semantic knowledge.

I used to think Microformats were simply a new name for things like:

  • XML Namespace based extensions. (Like RSS modules.)
  • Attribute based extensions. (Like Atom link extension mechanism.)
And other things such as that. (But they are not.)

In some cases I think Microformats work great. Things like rel-license and rel-tag are examples of great Microformats. However, I see problems with some. (Although maybe I'm missing something.) For example things like the hCalendar and hCard Microformats are identified by the class attribute. That seems to like a bad idea to me. Here's an example hCard:

    <div class="vcard">
        <a class="url" href="http://changelog.ca/">
            <span class="n" style="display:none"> <!-- hide this from display with CSS -->
                <span class="family-name">Krempeaux</span>
                <span class="given-name">Charles Iliya</span> 
           </span>
           <span class="fn">Charles Iliya Krempeaux</span>
       </a>
    </div>

You can't force people not to use your magic class name. It's common practice to apply the class attribute everything to apply CSS styles to them. And this may confuse we crawlers and any other type of software trying to obtain semantic knowledge.

Instead of using the class attribute I think what I'd do is bring in a new attribute through a new namespace. (Although that will only work for XHTML and not HTML.) For example:

    <html
       xmlns:vcard="..."
    >

...

<div vcard:name="vcard"> <a vcard:name="url" href="http://changelog.ca/"> <span vcard:name="n" style="display:none"> <!-- hide this from display with CSS --> <span vcard:name="family-name">Krempeaux</span> <span vcard:name="given-name">Charles Iliya</span> </span> <span vcard:name="fn">Charles Iliya Krempeaux</span> </a> </div>

Also, this nice thing about this is that if you follow the normal RSS Module style of doing things, the URL for the XML Namespace will point to a document that details the extension.

But, strictly speaking, that wouldn't really work with HTML. (Although I wonder if it would break web browsers to use it anyways.)


24 Aug 2005 (updated 3 Sep 2005 at 11:28 UTC) »
Normal People Won't Take DRM Being Forced On Them

Tim Bray put what I've been saying for a while into eloquent words. That normal people aren't going to take DRM being forced on them.

For time to time I tell my friends and clients about things like DRM and what it will do and means. About some of the things that people have patented (with software patents and life patents) and they're disgusted. Without someone like me telling them about it, they just don't know about this kind of stuff. I think if more people knew about some of the stuff that goes on, that things would change. But they don't. This kind of information doesn't get to them.

But DRM is going to be right in the face of normal people. Even if supporters of DRM lobby politicians to get laws in place to enforce it, all that is going to do is turn the majority of the people into pirates and criminals. And in a democracy, should laws be created that turns the majority of the population into criminals? Shouldn't laws be created that reflect the will of the people?


27 Jul 2005 (updated 3 Sep 2005 at 11:37 UTC) »
Why Can't I Hear The Music I Like on the Radio... Bribing, Payoffs, and Scandals... WiMax/802.16 May Be the Answer

In the past, for the Vancouver area in BC, Canada, the music radio landscape has been dominated by 2 radio stations. The Fox for rock music and Z95 for pop music. Fans of rap and r&b music had no station to call their own. Some listened to Z95 until they played a rap or r&b song (which was rare). Some listened to CDs. And some put up with the staticy signal and listened to the Seattle based rap and r&b station Kube93 (that is, if they were in a location where they got any reception at all).

In 2001 or 2002 (I think) a couple of warehouse workers, knowing that there was a large rap and r&b fan-base, became entrepreneurial and created a new rap and r&b radio station called The Beat. (At least, that's the story I heard.) The move shook up the airwaves. Listeners from Z95 flocked to The Beat. Z95 was forced to completely change what their motif, and became a 80's and 90's soft-pop station. Obviously The Beat was playing what a lot of youth, teenagers, and adults in their 20's and early 30's wanted to hear. There was obviously a large fan-base for rap and r&b music (in addition to the very large rock fan-base that the pacific northwest is known for).

Not too long ago though -- earlier this year (I think) -- The Beat completely changed its tune. In what shocked many rap and r&b fans, they became a pop station; claiming to play "all the hits". Exactly what Z95 was. Exactly what many music fans demonstrated they didn't want to really hear, when they made their switch to The Beat. Why did they do this‽ Why can't I hear the music I like on the radio‽ Why have rap and r&b fans been forced to go back to listening to CDs and trying to listen to Kube93 (when we can get a strong enough signal)‽ The answer, I'd conjecture, seems to have a lot to do with the current state of the music industry. The bribing, payoffs, and scandals that various players in the music industry are using to get radio stations to play their artists music. It would seem that it can be lucrative for radio stations and DJ's to play pop-music.

Although radio stations and DJs don't admit to these payoffs, many have been suspected them. (And some in privileged positions have known about them.) These payoffs have even made news headlines recently.[1]

While The Beat made this switch, alot of weird and annoying things went on. Rap and r&b songs have been weeded out. And have continued to get less and less airtime. (Which has alienated much of The Beat original listeners.) Also, The Beat has something called "Battle of the Beats", where 2 songs will compete against each other; and listeners call in and vote for the winner. (The winner then gets onto the regular playlist.) Some of the winners of this have left listeners thinking "what the f---" or "you've gotta be f---ing kidding me". Some of these supposed winners generated so many complaint calls that they actually put the songs up for a re-battle,... which is really unheard of. And some of the contenders have left listeners saying, "I want to vote no for both of these". (But generally people are voting against the one they dislike the most.)

So where does this leave us‽ Some stations do infact play music to their fan-base. Some don't; and are more like one long commercial for record labels. And you may or may not be able to listen to the music you want to listen to. Will things change‽ They might.

There is disruptive technology coming that has an opportunity to change things. The technology is WiMax.

Like Wi-Fi, WiMax is a wireless networking technology. However, WiMax operates on a much much larger scale. Where Wi-Fi gives wireless networking to a house. WiMax gives wireless networking to a city. Specifically, WiMax can give city wide broadband wireless Internet access.

WiMax opens up the door for an explosion of "radio stations" that you can listen to in your car. Imagine this. Instead of having a regular radio in your car, you have a device -- an IPradio -- that is connected to the Internet via WiMax. With this IPradio you can connect to any of the tens of thousands Internet radio stations. And listen to the music you want to listen to. You could even listen to music stored on your home computer. Or music from other places.

There is something that could hold this back though. WiMax may be held back by large teleco's who don't want WiMax to succeed for various reasons. Also, music licensing organizations so far have not given Internet radio stations the same kind of "fair" licensing deals they offer classic radio stations. And music licensing pricing has been set to, in effect, kill Internet radio. (Which seems to be the intent.)

I'd like in-car IPradio to get mass adoption though.


PHP SimpleXML CDATA Problem... and My Solution
PHP5 has a new built in way of handling XML. It's called SimpleXML.

Using this object for "working with" XML can make development alot faster. SimpleXML parses an XML document, and turns it into an object. So if we had a document like:

<?xml version="1.0"?>

<tvshows> <show> <name>The Simpsons</name> </show>

<show> <name>That '70s Show</name> </show>

<show> <name>Family Guy</name> </show>

<show> <name>Lois &amp; Clark</name> </show> </tvshows>

Then SimpleXML would give us a (PHP) object something like:
object(SimpleXMLElement)#1 (1) {
  ["show"]=>
  array(4) {
    [0]=>
    object(SimpleXMLElement)#2 (1) {
      ["name"]=>
      string(12) "The Simpsons"
    }
    [1]=>
    object(SimpleXMLElement)#3 (1) {
      ["name"]=>
      string(14) "That '70s Show"
    }
    [2]=>
    object(SimpleXMLElement)#4 (1) {
      ["name"]=>
      string(10) "Family Guy"

} [3]=> object(SimpleXMLElement)#5 (1) { ["name"]=> string(12) "Lois & Clark" } } }

(The output above would be what you get if you called var_dump() on the object. It probably looks more complex than it really is. Basically, to get at "The Simpsons" part, we would write "$simplexml->show[2]->name".)

This is useful because: #1 we save alot of time not having to use the old XML parsing methods (... which isn't difficult, just time consuming), #2: we can "use" this in a "foreach" structure, and #3 it's easier for newbies to learn with.

The one big problem is, SimpleXML does not handle CDATA!

(If you don't know what XML CDATA Section is, look at: http://en.wikipedia.org/wiki/CDATA_section)

Look at the last entry:

        <name>Lois &amp; Clark</name>

What if we used CDATA instead to represent this, and had:

        <name><![CDATA[Lois & Clark]]></name>
Well then too bad! SimpleXML just skips all that. It just pretends that it wasn't even there! (Note that when we put the text in the CDATA block, we were able to change the "&amp;" to a "&".)

So in other words, if we had:

<?xml version="1.0"?>

<tvshows> <show> <name>The Simpsons</name> </show>

<show> <name>That '70s Show</name> </show>

<show> <name>Family Guy</name> </show>

<show> <name><![CDATA[Lois & Clark]]></name> </show> </tvshows>

Then we'd get:
object(SimpleXMLElement)#1 (1) {
  ["show"]=>
  array(4) {
    [0]=>
    object(SimpleXMLElement)#2 (1) {
      ["name"]=>
      string(12) "The Simpsons"
    }
    [1]=>
    object(SimpleXMLElement)#3 (1) {
      ["name"]=>
      string(14) "That '70s Show"
    }
    [2]=>
    object(SimpleXMLElement)#4 (1) {
      ["name"]=>
      string(10) "Family Guy"
    }
    [3]=>
    object(SimpleXMLElement)#5 (1) {
      ["name"]=>
      object(SimpleXMLElement)#6 (0) {
      }
    }
  }
}
Note that the "Lois & Clark" part isn't even there!

So, what's the solution. Well, we can turn the CDATA into XML "escaped" text before giving the "XML data" to SimpleXML. In other words, take to CDATA and do the following conversions...

&    becomes    &amp;
"    becomes    &quot;
<    becomes    &lt;
>    becomes    &gt;
(And of course, drop the "<![CDATA[" and "]]>" too.)

I tried doing this with regular expressions but just couldn't figure out the proper way to represent "not a string". (I tired it with POSIX regular expressions are Perl-compatible regular expressions. But couldn't get anything to work.) So, eventually I just decided to write a function for it. (Which is tedious.) So, here it is. Hopefully it will help everyone else to not get frustrated with SimpleXML being too simple:

    function uncdata($xml)
    {
        // States:
        //
        //     'out'
        //     '<'
        //     '<!'
        //     '<!['
        //     '<![C'
        //     '<![CD'
        //     '<![CDAT'
        //     '<![CDATA'
        //     'in'
        //     ']'
        //     ']]'                                                                                                                                                            
        //
        // (Yes, the states a represented by strings.) 
        //
  
        $state = 'out';
                                                                                                                                              
        $a = str_split($xml);
                                                                                                                                              
        $new_xml = '';
                                                                                                                                              
        foreach ($a AS $k => $v) {
                                                                                                                                              
            // Deal with "state".
            switch ( $state ) {
                case 'out':
                    if ( '<' == $v ) {
                        $state = $v;
                    } else {
                        $new_xml .= $v;
                    }
                break;
                                                                                                                                              
                case '<':
                    if ( '!' == $v  ) {
                        $state = $state . $v;
                    } else {
                        $new_xml .= $state . $v;
                        $state = 'out';
                    }
                break;
                                                                                                                                              
                 case '<!':
                    if ( '[' == $v  ) {
                        $state = $state . $v;
                    } else {
                        $new_xml .= $state . $v;
                        $state = 'out';
                    }
                break;
                                                                                                                                              
                case '<![':
                    if ( 'C' == $v  ) {
                        $state = $state . $v;
                    } else {
                        $new_xml .= $state . $v;
                        $state = 'out';
                    }
                break;
                                                                                                                                              
                case '<![C':
                    if ( 'D' == $v  ) {
                        $state = $state . $v;
                    } else {
                        $new_xml .= $state . $v;
                        $state = 'out';
                    }
                break;
                                                                                                                                              
                case '<![CD':
                    if ( 'A' == $v  ) {
                        $state = $state . $v;
                    } else {
                        $new_xml .= $state . $v;
                        $state = 'out';
                    }
                break;
                                                                                                                                              
                case '<![CDA':
                    if ( 'T' == $v  ) {
                        $state = $state . $v;
                    } else {
                        $new_xml .= $state . $v;
                        $state = 'out';
                    }
                break;
                                                                                                                                              
                case '<![CDAT':
                    if ( 'A' == $v  ) {
                        $state = $state . $v;
                    } else {
                        $new_xml .= $state . $v;
                        $state = 'out';
                    }
                break;
                                                                                                                                              
                case '<![CDATA':
                    if ( '[' == $v  ) {

$cdata = ''; $state = 'in'; } else { $new_xml .= $state . $v; $state = 'out'; } break; case 'in': if ( ']' == $v ) { $state = $v; } else { $cdata .= $v; } break; case ']': if ( ']' == $v ) { $state = $state . $v; } else { $cdata .= $state . $v; $state = 'in'; } break; case ']]': if ( '>' == $v ) { $new_xml .= str_replace('>','&gt;', str_replace('>','&lt;', str_replace('"','&quot;', str_replace('&','&amp;', $cdata)))); $state = 'out'; } else { $cdata .= $state . $v; $state = 'in'; } break; } // switch } // // Return. // return $new_xml; }

So to use this, you'd do something like:

    // Get the XML data, with possible CDATA sections in it.
    $xml_data = file_get_contents('http://changelog.ca/feed/rss/');

// Convert the CDATA sections using the un-cdata function. $xml_data = uncdata($xml_data);

// Create the SimpleXML object (not having to worry about loosing info due to CDATA) $simplexml = simplexml_load_string($xml_data);

Just an extra note. I'm not sure how efficent this is with the use of the str_split() function (to turn a string into an array of characters). But if you are using SimpleXML, you're probably not really worried about that. (Or at least not at that stage of development.)

Hopefully someone will find this useful. (If you find any errors or bugs with it, send me an e-mail and let me know.)

The Proper Way to Use PHP's eval()
Many people say it is bad practice to use the eval() procedure in any language. That there is always a better way to do it. I disagree.

I think that some situations can warrent the use of the eval() procedure. Esspecially if you use it properly and carefully.

The PHP eval() procedure is no different. There are two important rules to remember when using PHP's eval().

  1. Always check the the return value from eval().
  2. Make it so you "code" returns an "OK" signal when it is done.

Let me explain this more. Since you are using "executing" unknown code and really don't know if the code has any syntax errors, or and other errors. You should be making an effort to check for this.

The PHP eval() procedure will return FALSE if there us an error. Therefore, you should check to see if it returns FALSE. So, you should be doing something like:

    if (  FALSE === eval($code) ) {
        // Error.
        // ... handle the error ...
    }
However, it is possible that eval() could return FALSE, even if it did not have this kind of error. So, you must set up your code so returns something other than FALSE when there is no error. I suggest it returns TRUE. You can do this by doing something like:
    $code .= 'return TRUE;';

if ( FALSE === eval($code) ) { // Error. // ... handle the error ... }

That way you know if everything went OK, then it will return TRUE.

So, for a fuller example we might have something like:

    // This procedure returns a string that is legal PHP expression.
    $variable_code = get_variable_code();

$code = '$a = ' . $variable_code . ';'; // $code = "\$a = $variable_code;";

$code .= 'return TRUE;';

if ( FALSE === eval($code) ) { // Error. // ... handle the error ... }

You can do alot more interesting things with eval() too.

35 older entries...

New Advogato Features

New HTML Parser: The long-awaited libxml2 based HTML parser code is live. It needs further work but already handles most markup better than the original parser.

Keep up with the latest Advogato features by reading the Advogato status blog.

If you're a C programmer with some spare time, take a look at the mod_virgule project page and help us with one of the tasks on the ToDo list!