- Total page hits/unique visits snippet
3 years 52 weeks ago - Busy IRL, but happier than ever
4 years 6 days ago - Drupal page titles like breadcrumbs
4 years 10 weeks ago - Theming the Akismet spam counter
4 years 11 weeks ago - Akismet module v1.1.2 for Drupal 4.7
4 years 11 weeks ago
news aggregator
Donncha: Easy Setup for WP Super Cache
One of the things that has bugged me about the WP Super Cache settings page was how it was laid out. Well, the next version of the plugin will display a simplified settings page to new users. If you’re upgrading, you’ll get the same old page as ever, don’t worry.
This version also adds a new method of serving cache files. It uses PHP, but serves supercache files. So, it’s a halfway house between using mod_rewrite (difficult to install for some users), and the legacy caching of WP Cache. That caching will be what is activated for users who use the simplified settings page.
There are lots of other bug fixes. The cache tester works if WordPress is installed in a sub directory, the admin page is separated out into tabs now to make it easier to find things. Error messages show up as “update messages” at the top of the browser now, making it easier for new users to figure out when mod_rewrite rules need updating and when other house keeping tasks need doing.
The code is red hot, liable to bend and break and may cause problems but it works fine here and on a test multi site install but I need testers to hammer on it and do things I don’t expect. If you’re brave, grab the development version off the download page. Thanks!
Related Posts
SSH password authentication insight and analysis by DRG, (Tue, Sep 7th)
DRG (Dragon Research Group), which is a volunteer research organization dedicated to further understanding of online criminality and to provide actionable intelligence for the benefit of the entire Internet community, last month published a very nice paper about such SSH brute force attempts. Among the other things, the paper lists a whole bunch of tools that can be used in order to limit or block SSH brute force attempts, and configuration recommendations that will help you increase security of your SSH installations. Check the paper at http://www.dragonresearchgroup.org/insight/sshpwauth-tac.html
Additionally, DRG is also publishing a list of IP addresses of SSH attackers that were detected on various pods DRG uses, that are spread around the world. This list is available at http://www.dragonresearchgroup.org/insight/sshpwauth.txt.
DRG also created a very cool tag cloud showing most common usernames and passwords that have been tried in latest SSH brute force attacks. The cloud is available at http://www.dragonresearchgroup.org/insight/sshpwauth-cloud.html - check it make sure there arent any of your passwords there :). Both the list and the cloud are updated every hour.
More information about DRG is available at http://www.dragonresearchgroup.org/ and Im sure they could use more pod runners.
--
Bojan
INFIGO IS (c) SANS Internet Storm Center. http://isc.sans.org Creative Commons Attribution-Noncommercial 3.0 United States License.
WP Blackberry: WordPress for BlackBerry 1.4.3 Released
WordPress for BlackBerry version 1.4.3 has been released to BlackBerry App World.
Depending on your region or country, you might not see the latest version in the BlackBerry App World, but on your device the latest version 1.4.3 should be available starting now.
Many big improvements have been made for devices running OS5.0 or higher, including:- Improvements to the post GeoTagging feature. The app allows you to choose a location from a list of predefined options: GPS, contact entry in the address book, manually inserting an address, recently selected, clicking on a point in a map.
- Preview Improvements.
- Bug fixing.
Do you have questions or feedback that would enhance the app ? Please visit the WordPress for BlackBerry forums.
Weblog Tools Collection: WordPress Theme Releases for 09/07
The Mill is a simple, yet elegant, two-column WordPress theme.
Misty Morn is a grey-based WordPress 3.0 child theme for Purple Pastels with custom image and attachment templates, thickbox enabled image attachment pages, and additional page templates for pages without comments and pages without the sidebar.
My Valentine is a pink-based WordPress 3.0 child theme for Purple Pastels with custom image and attachment templates, thickbox enabled image attachment pages, and additional page templates for pages without comments and pages without the sidebar.
Steampunk is a steam punk inspired theme built under the Themeatic Theme Framework environment with clean and SEO friendly HTML/CSS code.
Sun City is a darker WordPress 3.0 theme that makes use of orange, green, blue and other primary colours to provide a visually rich display.
ZenLite Black Mandarin is a darker child theme for the single column ZenLite theme.
Tweet10.62 Release Candidate 2
Note: These packages have the old non-unified build numbers. However, 10.70 and above will continue to have unified build numbers. Also because this is the 10.6x line we still have PowerPC.
Download
...
Matt: Isreali Security Hates iPad
I had a pretty interesting experience going through security at Ben Gurion airport — I almost didn’t make it through. I had heard the airport security in Israel was different but I had no idea. They spent about an hour asking questions, turning on (and taking apart) every piece of the 20+ electronic items I travel with, with particular attention and questions around my iPad. They took it out of the Apple case, turned it on, scanned it, took it away for 10 minutes to scan somewhere else, asked if anyone else in Israel had used it, when I last used it, asked when I got it, and ultimately said that their “technology team” had not cleared it for carry-on and they would need to pack it in a special box, wrap it, tape it, and check it directly with Continental (I couldn’t touch it or the box except to put some WP stickers on so I could identify it later). Wowza! My Sony PC, though, is safe to fly with. No wonder I saw so few Apple products at WordCamp.
Beware of svctm in Linux’s iostat
I’ve been studying the source of iostat again and trying to understand whether all of its calculations I explained here are valid and correct. Two of the columns did not seem consistent to me. The await and svctm columns are supposed to measure the average time from beginning to end of requests including device queueing, and actual time to service the request on the device, respectively. But there’s really no instrumentation to support that distinction. The device statistics you can get from the kernel do not provide timing information about device queueing, only a) begin-to-end timing of completed requests and b) the time accumulated by requests that haven’t yet completed. I concluded that the await is correct, but the svctm cannot be.
I just looked at the sysstat website, and it has been updated recently to warn about this, too:
svctm
The average service time (in milliseconds) for I/O requests that were issued to the device. Warning! Do not trust this field any more. This field will be removed in a future sysstat version.
Related posts:
Weblog Tools Collection: Protect Yourself from Parasite Spam with Akismet
If you run a social network or any kind of online publishing service, you will be hit by spam, if you haven’t been hit already, and Akismet wants to help.
When most people hear about Akismet, they often think about WordPress, but Akismet is actually available for over twenty additional systems and platforms, including Movable Type, Drupal, phpBB, PunBB, and libraries for PHP, Python, and .NET.
If you’re running, or planning to run, a social network or online publishing service, the Akismet team wants you to know that they can not only protect you from direct spam, but from parasite spam as well, as long as you can give them a way to contact you.
Akismet’s pattern and volume monitoring abilities make direct spam easy to filter, but ever since the dawn of forums, spammers have opened accounts for the sole purpose hosting their spam on your site. Thanks to Akismet’s pattern monitoring, the Akismet team can easily track the source of these parasite spammers and notify the site’s owner, but there’s little they can do if they can’t get in touch with you. Since contact forms can break without warning, the Akismet team recommends that you provide a traditional abuse@yourdomain email address. If you don’t want to make this email address public, at least contact Akismet and have it placed on file.
Are you using Akismet on your social network or online publishing service? With so many options available, why not try it today? Parasite spam can hit almost any site driven by user content, so don’t forget to offer your contact information to the Akismet team.
TweetWordPress.tv: Jonny Allbut: WordPress Template Design and Theme Frameworks
Weblog Tools Collection: Doomed Vox blogger? WordPress to the Rescue!
If you know of someone, or are yourself a blogger on Vox, you should know already that Six Apart has announced plans for closing the service. Users have until the 30th of September to get their data our of Vox and into other blogging and/or CMS platforms if they so choose.
Mark Jaquith has a great suggestion on how to Import a Vox blog into WordPress or almost anything else. In short, he suggests that you import your Vox blog into a vanilla WordPress.com blog and then export it out as a WordPress export file. Then you actually have a bunch of choices of what to do with your blog. PS: Be sure to mark your WordPress.com blog as private before importing if you do not intend to make that your final destination.
TweetUS Department of Defense and National Policy, (Sun, Sep 5th)
The announcement by the DoD that within the last 24 months it had suffered it's worst compromise in history would seem embarrassing, but then to announce in the same week that they will become more involved in the protection of national critical infrastructure is disconcerting. The DoD is the US arm for defense of national interests, however I do not believe that makes the DoD the best agency for this role.
I welcome your comment,
tony . carothers at gmail dot com (c) SANS Internet Storm Center. http://isc.sans.org Creative Commons Attribution-Noncommercial 3.0 United States License.
Hilarious Video: Relational Database vs NoSQL Fanbois
This is so funny I laughed until I cried! Definitely NSFW. OMG it's hilarious, but it's also not a bad overview of the issues. Especially loved: You read the latest post on HighScalability.com and think you are a f*cking Google and architect and parrot slogans like Web Scale and Sharding but you have no idea what the f*ck you are talking about. There are so many more gems like that.
Thanks to Alex Popescu for posting this on MongoDB is Web Scale. Whoever made this deserves a Webby.
Weblog Tools Collection: WordPress Plugin Releases for 09/05
List Yo’ Files adds the ability to list files by file name for a given folder with hyperlinks to each file making it downloadable.
Readable Names forces commenters to write their names in the language that your blog uses.
WP-comment-master enhances your comments with AJAX posting and pagination.
WP-WikiBox allows you to get a Wikipedia article summary for a keyword in any language, inline with your posts and pages, with a simple shortcode.
Updated pluginsIE6 Upgrade Option displays a warning message, simply and politely informing the IE6 user that their browser is out of date, and provides links to download newer browsers.
Vimeo Quicktag enables the user to embed a customized Vimeo video into the blog content.
WP-Stats-Dashboard displays your blog’s stats graph plus your blog traffic, social engagement and social influence directly in your dashboard.
TweetWhat's not to Like about "Like?", (Sat, Sep 4th)
Get off of my lawn!
I admidt that I have a suspicous, curmedgeonly streak. I view every new feature-update from Facebook like like it's a vulnerability announcement from Microsoft. I'm concerned not only with what the people behind Facebook may be planning with a feature, but moreso with how other groups might repurpose that feature. The recent expansion of the facebook API is one of those things that gives me concern.
What happens when you click Like?
When you click the Like there's an announcement of this activity on your wall, and it's added to your Likes section. People who have common likes can see each other, but only as much as they would share with anyone else who had their Facebook username. That doesn't sound so bad.
What are people Likeing?
Normally, a Facebook user could create a group or page to support a product, business or idea such as: Rock Music, Gibson Guitars, or Billy-Bear's Bean Shop. With the update of the Facebook Platform (http://blog.facebook.com/blog.php?post=383404517130) now third party websites can place a Like button on their website. Is this a problem? If I like Nike shoes, why not like nike.com itself?
What has been triggering my spiedy sense is over the past couple of weeks, my facebook event log has been filling up with people likeing third party pages that are simple messages like: like if you want a long lasting relationship:)! or other simple plattitudes. The first thing that attracted my notice was that they were often mean-spirited, hateful, or had some sort of -ism in it. These were surprising messages to read on a friend or family member's page, so I suspected some sort of hijack or other foul play. Unfortunately I haven't turned up anything to support that theory, my frienda and family, are just mean people I guess.
There are a handfull of sites that have been recently set up to take advantage of this new feature in the Facebook Platform. Some that I have seen used recently are:
golikeus.org, 19-JUN-2010, privately registered
likealike.co.uk, registered 23-AUG-2010, privately registered
phrasely.net, registered 26-AUG-2010, privately registered
Each supports a user-created message feature where Facbook users can set up their own message and try to get as many folks to join as possible.
Recently they've updated their posts so that when the Like message appears on the users' wall the source is obfuscated behind a heart or musical symbol. I saw one that was even hiding behind a bit.ly link.
So other than the domains being recently registered with no contact information and the simple obfuscation, what evidence do I have that there's evil afoot? None, other than it fires a lot of my rules of thumb I've acquired over the years.
One last example.
This week, one of my family member's had this message pop up on my wall:
WOW, This GUY Went A Little To FarWITH His REVENGE On His EX GIRLFRIEND! (shocking)
I was certain that they'd be compromised this time. I set up a system and followed the links, capturing pcaps, just waiting for the prompt to download the fake video codec or whatever boobytrap they had waiting for me. The domain, shocking-revenge.info, was barely a day old, and the links went off to pull down content from other free-hosting providers. It had all the hallmarks of a psychological exploit. So I kept clicking like a sucker waiting for the big reward.
It never came.
Just more advertisements, and whoever's behind it has a nice bit of demographics for marketing purposes and a channel to distribute more lures and ads.
The Impact
So the short story is that there's nothing overtly evil about like links. I also don't see shadows of some large privacy violation or exposure when you click the like button on Facebook-hosted pages or sites that you trust.
However I do see some risk to clicking on un-trusted third-party likes not because I have any hard data from any cases, but because I've seen this movie before, and I will see it again.
I'm just disappointed that I have friends/family with *isms. I was really hoping it was malware.
(c) SANS Internet Storm Center. http://isc.sans.org Creative Commons Attribution-Noncommercial 3.0 United States License.
Investigating Malicious Website Reports, (Sat, Sep 4th)
This morning we received a report from Holger about a website that was triggering alerts in Google and his anti-virus applications. I wanted to share my response process.
My first step is selecting the right responder music. You can't have a good incident reponse montage without your jams.
Next, it's a bit of domain analysis. There are a number of helpful sites that host whois and dns details about a suspected site. I use domaintools.com, others swear by robtex.com. In this particular case, the domain was registered in 2004. As a generalization, long-lived domains like that do not raise red flags, but the domain expired 30-AUG-2010 (just a few days ago) which could indicate a window of opportunity for a criminal to acquire a nice bit of respectable internet real-estate.
If you want to interact with the suspected website, you should use something safe. It's a little harder to determine which tool-set is safest when dealing with malicious websites since you don't reliably know what they're targeting most of the time. I went with an OSX image that was pretending to be a windows box.
Malware authors are catching on to the old wget-with-a-spoofed-user-agent trick. I've taken to synthesizing victim behavior by first starting with some google-searches so that I can build a convincing referer URL. Googleing for the domain turned up mainly the main website and a lot of traffic analysis of the domain from places like Alexa and trafficestimate. I added the inurl: google syntax in the hopes of finding examples where an attacker may have been spamming out links to forums and such to drive attacks to the exploit site. The search didn't turn up many results (something that also didn't raise any red flags,) but when I tried to have Google translatethe site for me (a risky move but I can easily restart the image) I received the Google warning that Holger reported. At this point I have what I need to grab a copy of the potential-exploit. I still use wget, and spoof the user-agent to look like an IE request, and use the referer link from the Google search.
The request worked, but URL that allegely pointed to a .JPG returned HTML. That's a bit unexpected. By glancing through the HTML results the obfuscated javascript jumps out. A handfull of Math.* calls and document.write statements are a pretty solid flag that something odd is going on. In this case its intent was to create a pop-up to an ad-server.
The owners of the website claim that the Google and AV alerts about the site are false. I will grant that the intent behind the obfuscated script wasn't overtly criminal in this case, but I wouldn't call it a false-positive result. I would urge the advertising network to be up-front about what they're advertising and where they're advertising it from. There's no reason to use document.write games to set up your javascript calls to your ads.
(c) SANS Internet Storm Center. http://isc.sans.org Creative Commons Attribution-Noncommercial 3.0 United States License.
Why MySQL replication is better than mysqlbinlog for recovery
You have a backup, and you have the binary logs between that backup and now. You need to do point-in-time recovery (PITR) for some reason. What do you do? The traditional answer is “restore the backup and then use mysqlbinlog to apply the binary logs.” But there’s a much better way to do it.
The better way is to set up a server instance with no data, and load the binary logs into it. I call this a “binlog server.” Then restore your backup and start the server as a replication slave of the binlog server. Let the roll-forward of the binlogs happen through replication, not through the mysqlbinlog tool.
Why is this better? Because replication is a more tested way of applying binary logs to a server. The results are much more likely to be correct, in my opinion. Plus, replication is easier and more convenient to use. You can do nice things like START SLAVE UNTIL, skip statements, stop and restart without having to figure out where you left off, and so on.
Replication also has the ability to correctly reproduce more types of changes than mysqlbinlog does. Try this with statement-based replication:
insert into tbl(col) values(connection_id());That’ll work just fine through replication, because the SQL thread on the slave will change its connection ID to match the original. It won’t work through mysqlbinlog.
Related posts:
Weblog Tools Collection: Plans Laid for WordPress 3.1
The WordPress development team had a very successful meeting last Thursday, where they solidified their plans for WordPress 3.1.
The finalized goals for WordPress 3.1 are “to have a very short dev cycle, a decent amount of testing time, and a release in mid-December. Low on new features, heavy on ui and code cleanup, and avoidance of schema changes. Save the big ideas for 3.2 where we’ll have the liberty to implement those ideas in PHP5. No schema changes and no big new APIs.”
Besides bug fixes and code cleanup, users can look forward to a new wordpress.com inspired admin bar and theme browser, as well as post templates and styles, and a separate network dashboard.
The team plans to halt new feature submissions on October 15th, followed by a primary code freeze on November 1st, and a string freeze on December 1st. The beta period will begin November 15th until the estimated final release date of December 15th.
Keep in mind that this will be the last major release to support PHP and MySQL 4. If your hosting provider has not yet switched to PHP 5.2 or higher and MySQL 5.0.15 or higher, it’s time to start bugging them.
Personally, I’m really looking forward to seeing what will come of the development team’s focus on bug fixes and code cleanup with this release. What are you looking forward to in WordPress 3.1?
TweetAkismet: Defending your social network from spammers
If you’re planning to launch a social network or online publishing service, it’s important that you have a plan in place for dealing with spam. At some point the bad guys will find a way to take advantage of your hospitality, and you need to be ready to deal with them before they take over.
I’ve written about this before, but it bears repeating. If you’re launching a web site that allows users to publish content, you will very quickly be invaded by spammers. There are two basic types of spam that you need to be aware of:
1. Direct spam. Spammers will try to use your service to communicate directly with your users. They’ll send large volumes of comments, forum replies, direct messages, friend requests, contact forms, and generally abuse whatever messaging services are available.
This kind of spam is relatively easy to detect, because it involves making large volumes of form posts or api calls. You can catch it by monitoring for unusual patterns or volumes of submissions (and indeed Akismet can do this for you – ask us how). Contrast this with the second type, which is:
2. Parasite hosting. Spammers will use your service as an unwitting web host for their advertisements. They’ll create a handful of blog posts, forum threads, user profiles or wiki pages with images or links to their network of spam web sites. Spammers call these “buffer pages” or buffer sites. Importantly, they won’t spam your users with links to those buffer pages. They’ll be very careful not to do anything to draw your attention to them – often they’ll do their best to disguise them as harmless content. Instead, they’ll go elsewhere and send direct spam to the users of other services with links to the buffer pages on your site.
In other words, users on (say) Facebook and Twitter will be bombarded with spam messages containing links to pages on your web site. (Conversely, users on your site will be bombarded with spam containing links to buffer pages hosted elsewhere).
At Akismet we’re all too aware that few social sites are prepared for handling both types of spam. In fact some almost seem to go out of their way to make it difficult to report spam. Since Akismet monitors spam on millions of web sites, we’re able to detect both direct spam and parasite hosting. Sadly, even when we go out of our way to try to alert webmasters to spammers abusing their services as parasite hosts for porn and malware, many fail to respond.
Which brings me to the single best piece of advice I can give anyone who is planning on launching (or already runs) a social network or interactive web site:
Make sure you publish a working email address for abuse reports!
Don’t rely on a web contact form (when they break, failures often go un-noticed). Don’t rely on a flagging system that’s available only to your users (reports about parasite spam won’t come from your users). Don’t use a special form or button that only supports reporting a certain type of content or a single page at a time (spammers will hide in places you don’t expect them, and an important spam report might include hundreds or thousands of URLs). Use a good old-fashioned email address – abuse@yourdomain is best – and above all, make sure it’s monitored by people who are in a position to act quickly.
If you do run a social network, and you do have an email address for abuse reports (kudos!) then feel free to contact Akismet and tell us your address. If we do discover spammers hiding on your network we may be able to alert you, and of course we’re happy to provide advice for fighting the bad guys.
Same Markup: Using <canvas>, <audio>, and <video>
On this blog we’ve repeatedly discussed enabling the "Same Markup" for Internet Explorer 9. Part of making "Same Markup" a reality involves supporting the right features in IE9 to make the same HTML, JavaScript, and CSS "just work" the same way they do in other browsers. Part of how IE9 contributes to enabling the "Same Markup" is through support for the <canvas>, <audio>, and <video> elements from HTML5. These were introduced in the third platform preview and continue to be improved with each update.
In my first post on "Same Markup", I described the effort as an "n-way street". Each browser has a part to play by supporting the right features with the right behavior. Web developers also have a part to play in how they code for cross-browser differences where they unfortunately still exist. The most important part of working across browsers for web developers is to detect features, not browsers. So in this post I'll outline how to use feature detection for <canvas>, <audio>, and <video>.
Detecting Support from HTML MarkupUnlike other features, support for <canvas>, <audio>, and <video> can be detected directly from HTML markup. This involves simply using the desired element, then placing fallback content inside of it intended for browsers that don't have support for these elements. Browsers with support will hide this content from the user and display only the <canvas>, <audio>, or <video> element itself.
<!-- Example 1: Basic <canvas> fallback --> <canvas> This text only displays in browsers without canvas support. </canvas> <!-- Example 2: Basic <audio> fallback --> <audio> This text only displays in browsers without audio support. </audio> <!-- Example 3: Basic <video> fallback --> <video> This text only displays in browsers without video support. </video>One caveat to keep in mind is that fallback content is only hidden visually. <script> blocks and other items in fallback content will always execute, even in browsers that support these elements.
<!-- Example 4: <script> always executes in fallback content --> <canvas> <script> alert("This always runs, even when canvas is supported."); </script> </canvas>Of course, fallback content should also be useful. Exactly what qualifies as useful can vary depending on what you are trying to do. One approach is to point the user at a download for an upgrade, but in most cases it is a better experience for consumers to fall back to alternative approaches for delivering the content. For example, if you're drawing something that doesn't change much to a canvas, you may be able to fall back to an image that gets generated server-side. A better alternative could involve including a framework which implements canvas on top of existing web technologies or using a widely deployed plug-in.
The <audio> and <video> elements tend to have more options for fallback via plug-ins, whether through a media player or an app built on top of a widely deployed technology such as Flash or Silverlight. At the very least you can provide the user with a link to download the file so they can play it locally. The examples below provide a rough view of this type of fallback, though the <object> tag generally requires a number of varying parameters specific to the chosen plug-in.
<!-- Example 5: Provide useful fallback content for <audio> --> <audio src="myaudio"> <object type="audio-plugin-mime-type" data="myaudio"> <a href="myaudio">Download the audio file</a> </object> </audio> <!-- Example 6: Provide useful fallback content for <video> --> <video src="myvideo"> <object type="video-plugin-mime-type" data="myvideo"> <a href="myvideo">Download the video file</a> </object> </video> Detecting Support from ScriptIn addition to HTML markup, support for <canvas>, <audio>, and <video> can also be detected from script. This detection can be performed many ways, but one of the simplest is to check for the existence of the appropriate interface object off of window.
// Example 7: Simple feature detection for <canvas> if(window.HTMLCanvasElement) { // Code requiring canvas support } // Example 8: Simple feature detection for <audio> if(window.HTMLAudioElement) { // Code requiring audio support } // Example 9: Simple feature detection for <video> if(window.HTMLVideoElement) { // Code requiring video support }An alternative approach for detecting <audio> and <video> involves checking for the existence of the canPlayType method on a dynamically created <audio> or <video> element. This is used by a number of frameworks and is generally preferred if you also intend to use the canPlayType method to test for supported codecs (which will be covered in a future post). If you simply need to test whether <audio> or <video> is supported, then I find the approach outlined above in examples 8 and 9 to be more obvious and equally as effective.
// Example 10: Alternate feature detection for <audio> if(document.createElement("audio").canPlayType) { // Code requiring audio support } // Example 11: Alternate feature detection for <video> if(document.createElement("video").canPlayType) { // Code requiring video support }A similar alternative approach can be used for detecting <canvas> support. In this case, most frameworks have settled on checking for the existence of the getContext method. This makes sense for <canvas> given that this method is required in order to retrieve a context for rendering.
// Example 12: Alternate feature detection for <canvas> if(document.createElement("canvas").getContext) { // Code requiring canvas support } Next StepsIf you have previously used browser detection to decide whether to use <canvas>, <audio>, or <video>, now is the time to update to use feature detection instead. Also, make sure you have a DOCTYPE at the top of your page (e.g. <!DOCTYPE html>) so your content doesn't render in Quirks Mode. In IE9, Quirks Mode is used for compatibility and consequently the <canvas>, <audio>, and <video> elements will not work there.
Stay tuned for future posts covering how to detect supported codecs and specify multiple sources using the <audio> and <video> elements.
Tony Ross
Program Manager
Edit 9/3 - added link to earlier blog post in second paragraph


Recent comments
3 years 33 weeks ago
3 years 36 weeks ago
3 years 36 weeks ago
3 years 37 weeks ago
3 years 38 weeks ago
3 years 38 weeks ago
3 years 41 weeks ago
3 years 41 weeks ago
3 years 43 weeks ago
3 years 44 weeks ago