Posts tagged Code
Javascript Ninja!
Nov 17th
Thank you, John Resig. Because of you, I’m learning about Javascript the way Andy Gadiel taught me HTML. In the days before server-side scripting, I learned my first bits of HTML largely by viewing the source of Andy Gadiel’s Phish page (which, for some reason, remains largely unchanged since ~1997). By reading Gadiel’s HTML, I slowly pieced together my own understanding of HTML. It was Joe Burns’ fantastic Javascript Goodies that first had me dipping my n00b fingers into client side active scripting. I picked up CSS all over the web.
Resig’s jQuery is so powerful and so easy that even with basic knowledge of CSS and Javascript, anyone can be a virtual scripting master. It’s so easy, that I’ve slacked on learning about javascript objects, inheritance, closures, anonymous functions, prototypes, and scores of other Javascript staples that I should’ve long since mastered. I just discovered John’s new web app, cleverly titled “Learning Advanced Javascript“, and so far, so good!
I wrote this myself and understand why it works, which is much more than I could say yesterday.
var ninja = { walk: function(steps,turn) { toDo = 'Walking '+steps+' steps forward, then turning '+turn; return this; }, star: function(action,distance) { toDo = toDo+' '+action+'ing star '+distance+' feet'; return this; }, then: function() { toDo = toDo+', then '; return this; }, doIt: function() { log(toDo); } } ninja.walk('7','south').then().star('throw','50').doIt();
Output:
> Walking 7 steps forward, then turning south, then throwing star 50 feet
It’s clear to me – and has been for some time – that the future of the web, for better or for worse, rests heavily on the mighty shoulders of client side scripting. Building on powerful, extensible frameworks like jQuery and MooTools, the next generation of web apps is sure to compete with the desktop. The ability to understand how to utilize the frameworks when necessary and hack together powerful scriptlets for other purposes seems essential to success in the future web. I know I’ll be investing in “Secrets of a Javascript Ninja” just as a result of this tutorial.
Behind the Scenes at OSNews
May 4th
I just started putting together a series of articles I will be publishing on OSNews. I’ve only roughly sketched it out, but in short, it’s going to discuss how OSNews works, how the PHP is structured, why we made certain architectural decisions, why we don’t use tried-and-true CMSes like WordPress, Slash, or Joomla!, and how, during peak traffic times, we have survived 30,000 unique visitors per hour on a single server. OSNews didn’t happen by mistake: over a series of months, arguably years, we took a constant read of performance, hits, server load, and usability with the mission to continually improve load time, performance, and UX. We’ve just recently begun testing some new data presentation methods that I intend to include in my little exposé.
If you’re interested in some revealing behind-the-scenes info, feel free to ask questions now.
Flip 3.0.1
Mar 31st
I never expected to release another version of my old weblog project Flip, but while searching my own name in a new search engine, I came upon several vulnerability reports for Flip 3.0. I’ve known about them for awhile now, but having dropped Flip in favor of another project (which I’ve since abandoned, for the most part, in favor of WordPress), it seemed pointless to bother. However, since there is an active exploit, I thought I’d release an update and a patch.
I don’t believe anyone out there is still using Flip, but if there is, this is how to defeat the script: simple add this line at line 102 of account.php:
if(strstr($_POST['em'],"][")) { die('Fail'); }
and this at line 162:
if(strstr($_POST['nem'],"][")) { die('Fail'); }
Alternatively, you can download the modified file here or download Flip 3.0.1 here.
It may sound odd, but I would highly recommend that you do *not* use this code. It’s now 7 years old and the web is a much different place. The code here is really not suited for running a website today. That said, it was odd to unzip and install it and see that it actually works. The rendering of most of the “themes” is weird (Fudge works great), but otherwise, everything worked.
If you are still a Flip user, I recommend you update your account.php page immediately, and if you have the time and inclination, upgrade to 3.0.1. The following files have some minor changes:
- account.php
- index.php
- inc/config.php
- README.html
Once again, this code is aged not particularly well suited for today’s web. If you want a simple weblog, I recommend WordPress.
Posting Your Latest Tweet in Wordpress
Feb 19th
Although I posted yesterday how to add your latest tweet to Wordpress without a plugin, I made several changes to the script before I posted it to make it more “generic” and re-usable. Since I’ve changed it quite a bit, I decided to repost it. This new script also autolinks @usernames and #hash tags.
Directions are this easy: set the path of $tw_File with a static, writable file. Set $tw_userid to your Twitter user id. Done.
How to Add Latest Tweet to Wordpress (Without a Plugin)
Feb 18th
I decided to add my latest “tweet” from Twitter to the sidebar of my Wordpress blog. Rather than use yet another plugin that adds yet another hook – and there are many that do this with lots of code, I decided to use a homegrown solution, dependant only on PHP4+ and cURL (most webhosts already have cURL compiled in, if not, you should request it). Adding the following to any of the files in your Wordpress theme will print out your current Twitter status and cache the results so you don’t hammer their system.
First, snag your Twitter user id. Then, open up your theme file. I put mine in sidebar.php found in /wp-content/themes/<THEMENAME>/. Use the below code. If you want the output wrapped in a list, you would need to put <ul> and <li> tags around this code.
Carefully set your variables. The cache file should be writable. Note that you can use a decimal value for $tw_BlankAfter and $tw_Minutes if necessary. That’s it.
Due to what must be a bug in Wordpress, please ignore the closing “</text></created_at>” at the end of this post. It’s trying be smart and “fix” broken tags, but the code is right.
NOTE (2/20/09): I have updated the below code. The new version can be found at “Posting Your Latest Tweet in Wordpress“.
/* ~~~~ Custom Twitter Bit ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ /* ~~~~ Adam S, firsttube.com, twitter @sethadam1 ~~~~~~~~~~~~~~~~~~~~ */ $tw_File = '/path/to/a/static/writable/file/twitter.html'; $tw_Userid='XXXXXXX'; //set to your Twitter user id $tw_BlankAfter = 30; //blank out status if it's older than this many days $tw_Minutes = 10; //minutes between reloads $tw_Offset = FALSE; //leave as is // uncomment below time if you want to allow a manual reset via ?twitter-reset // if($_SERVER['QUERY_STRING']=='twitter-reset') { $tw_Offset=0; } /* Do not edit below this line */ if(filemtime($tw_File)>time()-floatval($tw_Offset)) { include $tw_File; } else { if(is_writable($tw_File)) { $tw_iswritable=1; } $tw_time = (86400*floatval($tw_BlankAfter)); if($tw_Offset) { $tw_time=$tw_Offset; } $tw_hyperlinks = true; $tw_c = curl_init(); curl_setopt($tw_c, CURLOPT_URL, "http://twitter.com/statuses/user_timeline/" .intval($tw_Userid).".xml"); curl_setopt($tw_c, CURLOPT_RETURNTRANSFER, 1); $tw_src = curl_exec($tw_c); curl_close($tw_c); preg_match('/(.*)< \/created_at>/', $tw_src, $tw_d); if(strtotime($tw_d[1]) > time()-$tw_time) { preg_match('/(.*)< \/text>/', $tw_src, $tw_m); $tw_status = htmlentities(str_replace("&","&",$tw_m[1])); if( $tw_hyperlinks ) { $tw_status = ereg_replace( "[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]", "<a href="\">\\0</a>", $tw_status); } $tw_output = $tw_status; } else { if($tw_iswritable==1) {file_put_contents($tw_File,''); } } if($tw_iswritable==1) { file_put_contents($tw_File,$tw_output); } echo $tw_output; } /* ~~~ /Custom Twitter Bit ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
Please note that portions of this code come from the twtter_status() function that was not written by me, but is available from various sources online.
Update: Removed function and put code inline.
Wordpress “Press This” 404 Problem
Jan 22nd
WordPress › Support » Press This 404 issue.
“Press This” hasn’t worked for me for ages. I am so happy to have it back!
Sorting a Multi-Dimensional Array with PHP
Jan 16th
Every so often I find myself with a multidimensional array that I want to sort by a value in a sub-array. I have an array that might look like this:
//an array of some songs I like $songs = array( '1' => array('artist'=>'The Smashing Pumpkins', 'songname'=>'Soma'), '2' => array('artist'=>'The Decemberists', 'songname'=>'The Island'), '3' => array('artist'=>'Fleetwood Mac', 'songname' =>'Second-hand News') );
The problem is thus: I’d like to echo out the songs I like in the format “Songname (Artist),” and I’d like to do it alphabetically by artist. PHP provides many functions for sorting arrays, but none will work here. ksort() will allow me to sort by key, but the keys in the $songs array are irrelevant. asort() allows me to sort and preserves keys, but it will sort $songs by the value of each element, which is also useless, since the value of each is “array()”. usort() is another possible candidate and can do multi-dimensional sorting, but it involves building a callback function and is often pretty long-winded. Even the examples in the PHP docs references specific keys.
So I developed a quick function to sort by the value of a key in a sub-array. Please note this version does a case-insensitive sort. See subval_sort() below.
function subval_sort($a,$subkey) { foreach($a as $k=>$v) { $b[$k] = strtolower($v[$subkey]); } asort($b); foreach($b as $key=>$val) { $c[] = $a[$key]; } return $c; }
To use it on the above, I would simply type:
$songs = subval_sort($songs,'artist'); print_r($songs);
This is what you should expect see:
Array ( [0] => Array ( [artist] => Fleetwood Mac [song] => Second-hand News ) [1] => Array ( [artist] => The Decemberists [song] => The Island ) [2] => Array ( [artist] => The Smashing Pumpkins [song] => Cherub Rock ) )
The songs, sorted by artist.
Using the abbr tag
Oct 2nd
Kroc Camen, long time OSNews reader and frequent IM buddy of mine, has an interesting piece examining the use of the <abbr> HTML tag. Kroc is one of those people who is very serious about the presentation and efficiency of his code, a trait I do not share, at least in practice, at least, to the same degree that he does, and it makes us good companions. My focus is typically on clean, fast, scalable code that forsakes beauty in favor of performance. My code, in the form of OSNews, has sustained a simultaneous Digging and Slashdotting, something of which I’m very proud.
But my CSS isn’t going to win any awards, my javascript could be collapsed a lot and made much more efficient, and my HTML often suffers from “div-itis” and “class-itis.” Enter Mr Camen, whose motto, “code is art,” is evident upon initial inspection. Kroc’s code is not only well written, the source itself is actually beautiful. We have collaborated on both CSS and PHP in the past and both are the better for it.
That said, we have strikingly different positions about publshing on the web. Kroc writes his website for himself, and as a result, publishes in HTML 5; his site doesn’t work in IE, his mindset being “if you choose to use a subpar browser, you will have a subpar experience. ” Indeed, his site is a complete mess in IE 7, the fault only of IE and its abysmal CSS support, not the code itself. I, conversely, attempt to code with a much more conservative bend, coding to the masses, at the expense of using several great tricks.
Getting back on track, when it came to discussing the <abbr> tag, both of us found ourselves remarkably on the same page. Although one can get into the nitty-gritty details and find the whole conversation trivial, I think there’s something to be said for using tags properly and getting your information properly parsed. After all, screen readers exist with regularity today, XML is very popular (most commonly in the form of RSS), and search engines spider the majority of popular websites several times times a day if not every hour. Using tags, and using them properly, should be important to content publishers and republishers.
I also agree with Kroc’s point that it’s not your job to educate your reader like an encyclopedia. The <abbr> tag is not so much about education as it is about properly marking up your code.
As the second wave of the browser war heats up – as Tracemonkey, Squirrelfish Extreme, and V8 start really setting themselves apart from IE in even larger ways, coding to standards will become even more important. Understading lesser used tags is elemental in writing the best, most concise code and ranking well in search engines.
