Malacandra.me

Latest Posts

WordPress Plugin Development – Relate Posts as a Series Part 2

So, we started our dive into WordPress plugin development with the first part of this tutorial where we talked a little about planning, basic plugin structure, custom post types, metaboxes and how to add custom functions to WordPress’s defaults actions.

Today we will talk a little more about metaboxes and jQuery, shortcodes, and front-end functionality.

All these things with a pretty practical example of how to make a plugin that will relate posts as a series.

So, let’s rock!

A little recap… and download!

Last time we completed the first three steps:

  1. Planning – We’ve made our entity-relationship diagram to know which data we would have to store
  2. Create our plugin and custom post type – We’ve created the basic file for our plugin, and registered our series custom post type
  3. Post functionality – We’ve made some metaboxes to store custom data, and added them to WordPress’s default post saving function via actions.

If you didn’t read the first part of this tutorial, I highly recommend you to do this now, but if you don’t want to, you can still understand the functions and logic we are using here and make use of it.

Well, for people who are in a hurry, you can download the fully working plugin and make use of it without having to copy/paste all this code wink.

Step 4 – Series functionality

Registering our metabox

After we have control over all our posts related to series, we need to be able to manually edit the series itself.

In order to do this, we will need some metaboxes on them also. So, let’s edit our plugin with this code (here is just the additional code to avoid any confusion with the code that I explained last time, and won’t explain now):

<?php<br /-->//this function will register our metabox for wd_series custom post type
	function wd_call_meta() {
		add_meta_box(
			'series-data', // id of the <div> we'll add
			'Series Custom Data', //title
			'wd_series_options', // callback function that will echo the box content
			'wd_series', // where to add the box: on "post", "page", or "link" page
			'side', //positioning
			'low' //positioning
		);
	}
//with this we call it!
add_action('admin_menu', 'wd_call_meta');
?>

Our HTML metabox and jQuery enhancements

So, as you can see this function doesn’t have the metabox itself, it just says “Hey, WordPress, you should add function wd_series_options as a metabox for this guy!”. So we now need the metabox itself.

This is a tricky part since this box will give the user the ability to add “fake” posts to the series, so our readers could be interested in this series content. So what do we have now is:

  • Standard posts for a series, added via post editing screen
  • Fake posts for a series, added via series editing screen
  • Delete option, to remove a post from a series

We have also the opening / closing option for a series, and a really important attribute, the size of the series, so we don’t get lost in all our counters.

To get this working we will need some jQuery. We will have a “model” row, and when the user wants to add more lines we will get this model and duplicate it inside our form. We have to pay attention in regards to recovering data. We have to dynamically add rows as they are needed by one series. And we have, of course, some CSS for that.

Let’s do it this way:

<?php

function wd_series_options() {
		global $post;
		//get saved data
		$custom    = get_post_custom($post->ID);
		$open      = $custom["open"][0];
		$numFields = $custom["size"][0];

		$openNo = $openYes = "";
		if ($open == "yes") {
			$openYes = "checked = 'checked'";
		} else {
			$openNo = "checked = 'checked'";
		}

		$series_items = array();
		$i = 0;
		while($i < $numFields) {
			$i++;
			$key = "name_".$i;
			$series_items[$i] = $custom[$key][0];
		}
		$numFields++;
?>

<table>
<tbody>
<tr class="space">
<td><label>Open?</label></td>
<td>
				<label><input id="wd_open" name="wd_open" type="radio" value="yes" /> /> Yes, it is open.</label>

				<label><input id="wd_open" name="wd_open" type="radio" value="no" /> /> No, it is closed</label></td>
</tr>
</tbody>
</table>
	<table class="default-line">
		<tr>
			<td><input id="order_K" name="order_K" type="text" value="" size="5" /></td>
			<td><input id="name_K" name="name_K" type="text" value="" /></td>
			<td class="check"><input id="remove_K" name="remove_K" type="checkbox" value="remove" /></td>
		</tr>
	</table>
	<input type="hidden" id="NumFields" name="NumFields" value="<?php echo $numFields; ?>" />
	<table>
		<tr>
			<td>Order</td>
			<td>PostName</td>
			<td class="checkboxTd">Remove?</td>
		</tr>
	</table>
	<div class="ins">
	<?php
		foreach($series_items as $key => $name) {
			echo "<table>";
				echo "<tr>";
					echo "<td><input id='order_$key' name='order_$key' type='text' value='$key' size='5' /></td>";
					echo "<td><input id='name_$key' name='name_$key' type='text' value='$name' /></td>";
					echo "<td class='check'><input id='remove_$key' name='remove_$key' type='checkbox' value='remove' /></td>";
				echo "</tr>";
			echo "</table>";
		}
	?>
	</div>
	<table>
		<tr id="addItem">
<td colspan="3"><a id="clickLink" class="link" onclick="addLine();">Add new line</a></td>
</tr>
</tbody>
</table>
<style type="text/css">
	.default-line {
		display: none;
	}
	#series-data table {
		width: 100%
	}
		#series-data tr.space td {
			padding-bottom: 10px;
		}
			#series-data .space label {
				padding-right: 20px
			}
		#series-data .check {
			text-align: center;
		}
		#addItem td {
			padding-top: 10px;
			text-align: right;
		}
	.checkboxTd {
		width: 20px;
	}
	.link { cursor: pointer; }
</style>
<script type="text/javascript">
	function addLine() {
		jQuery(".default-line").clone().appendTo(".ins");
		var numElem = jQuery("#NumFields").attr('value');
		jQuery(".ins .default-line").fadeIn().removeClass('default-line');
		correctsLine(numElem);
	}
	function correctsLine(nID) {
		//goes switching K to correct number of line
		fieldName  = "order_" + nID;
		jQuery(".ins input#order_K").attr('value', ( parseInt(nID)+1) ).attr('id', fieldName).attr('name', fieldName);

		fieldName  = "name_" + nID;
		jQuery(".ins input#name_K").attr('id', fieldName).attr('name', fieldName);

		fieldName  = "remove_" + nID;
		jQuery(".ins input#remove_K").attr('id', fieldName).attr('name', fieldName);

		//corrects number of fields
		nID++;
		jQuery("#NumFields").attr('value', nID);
	}
	jQuery(window).load(function(){
		addLine(); //adds first (blank) row
	});
</script>

With this code you should see something like this as your series metabox:

Edit our default post saving function

And when you click on “Add new line”, believe me, it should create a fresh and brilliant new line.

Now we have this pretty box, but when you click “Update” nothing happens. This is why we haven’t prepared our WordPress insert post function to treat this data. What we have to do now it to say to WordPress “Hey, when you see this field in wd_series post type, delete all old data and save this new one for me, ok?”.

One important thing to note here is that we must delete all previous data and use some logic to reorder the series when needed.

Our magic here relies on ksort php function, so we save a temporary array and save all the items in the correct order after run this function.

Well, let’s do it:

<?php //we need a function that recieves post_id and $_POST data
function wd_meta($post_id, $post = null) {
//gets our POST custom data and saves it as meta keys, when needed
/* we have to save this metafields: open = Yes / No for open / closed series
size = how many items do we have in this series, so we can adjust our order counter
name_ORDER = the name of the ORDER'th item
post_ORDER = ID of the ORDER'th item
order_POST = Order of the ID (post) */
if( $post->post_type == "wd_series"  ) {
			//update series state (open / closed)
			$open = @$_POST["wd_open"];
			update_post_meta( $post_id, "open", $open );

			$size = @$_POST["NumFields"];
			$i = 0;

			$organize = array();
			while ($i < $size) {
				//let's pre-organize all posts
				$survive = $key = $remove = $order = $name = $post = null;

				$key = "remove_".$i;
				$remove = @$_POST[$key];

				if (empty($remove)) {
					//we won't delete this guy, and we'll put he in his right order
					$key = "order_".$i;
					$order = @$_POST[$key];

					$key = "name_".$i;
					$name = @$_POST[$key];

					$key = "post_".$i;
					$post = get_post_meta($post_id, $key, true);

					if (!empty($name)) {
						$organize[$order] = array( 'name' => $name, 'post' => $post);
						$survive = true;
					}
				}
				//we will pre delete everybody, to prevent trash in here
				$key = "name_".$i;
				delete_post_meta($post_id, $key);

				$key = "post_".$i;
				$post = get_post_meta($post_id, $key, true);
				delete_post_meta($post_id, $key);

				$key = "order_".$post;
				delete_post_meta($post_id, $key);

				//if it won't survive, we delete series_id from post_id
				if(!$survive) {
					$key = "series_id";
					delete_post_meta($post, $key);
				}
				$i++;
			}
			//let's correctly order this
			ksort($organize);
			$i = 0;
			foreach($organize as $item) {
				$i++;

				$key = "name";
				$nam = $item[$key];
				$key = "name_".$i;
				update_post_meta( $post_id, $key, $nam );

				$key  = "post";
				$post = $item[$key];
				if(!empty($post)) {
					$key = "post_".$i;
					update_post_meta( $post_id, $key, $post );
					$key = "order_".$post;
					update_post_meta( $post_id, $key, $i );
				}
			}

			$size = count($organize);
			update_post_meta( $post_id, "size", $size );
		}
	}
	//it's me saying to wordpress "Hey guy, don't forget to save this data when you insert or update posts!"
	add_action("wp_insert_post", 'wd_meta', 10, 2);
?>

Now we have our plugin working, let’s improve it.

Step 5 – Shortcodes and theming functions

Before we can output our posts we have to prepare two kind functions:

  • Common theming functions – Something like wd_series($args), so we can use for theming and widgets
  • Shortcodes – Something like [wd-series] so we can insert it directly from content edit mode.

Common functions

We will need to run a get_post loop, because probably our series will be shown inside another WordPress loop, so we can’t use WordPress’ default loop. Think about it this way: we will show a series when we are INSIDE a post, right? Thus the best way is via get_post.

Then we will just prepare a simple output function based on current post’s ID so it will show all items for the series related to it.

As we store the series related to this post inside “series_id” custom field, we just need to run a get_post for this series_id and output all metadata about series items.

Since for every item the output function is potentially the same, we will create two functions this time, one for items output and other for complete series output, as follow:

<?php //display item with or without link
function wd_item( $name, $postItem ) {
	if ( ! empty ( $postItem ) ) {
		$link = get_permalink($postItem);
		echo "<a title="$name" href="$link">$name</a>";
	} else {
		echo $name;
	}
}
//output!
function wd_series ($series) {
	$title = get_the_title($series);
	$meta  = get_post_custom($series);

	echo "<h3>$title</h3>";
	$size = $meta["size"][0];
	$i = 1;
	echo "<ol>";
	while ($i <= $size) {
		$key = "name_".$i;
		$name = $meta[$key][0];

		$key = "post_".$i;
		$post_item = $meta[$key][0];

		echo "<li>";
			wd_item( $name, $post_item);
		echo "</li>";

		$i++;

		$name = $post_item = null;
	}
	echo "</ol>";
}
?>

Shortcodes

So with the function above we can output our series in our template, and it is pretty customizable as you can see. But what if you want to give your writers the ability to decide where the series content should appear? Well, to do this you will need a shortcode.

Long story short, they give the ability to call functions via post content. So while I’m writing this post I could write [wd-series] and BAM! our series content would have to appear just above this text.

It is pretty easy to register a shortcode, and as long as we have our output function defined it will be even easier. With no more than six lines you can do it:

<?php // [wd-series]
function wd_series_shortcode() {
              global $post;
              $series = get_post_meta($post--->ID, "series_id", true);

              wd_series($series);
}
add_shortcode( 'wd-series', 'wd_series_shortcode' );
?>

After all this code, you will see something similar to this when you write [wd-series] in your content box:

Are you hungry yet?

This code surely could be improved and I know that some of our brilliant readers could point out some things to make it better. So why not leave a comment and share your thoughts?

And finally, I recommend you dig a little deeper into the  Shortcodes API, since it is a great tool when well used!

comments

Terrafugia Transition aircraft gets DOT roadworthiness sign-off, can now drive you to the airport


For most experimental aircraft, earning an airworthiness certificate is enough of a challenge. But the Terrafugia Transition is a unique type of flying machine, requiring approval not only from the FAA, but also from the USDOT's National Highway Traffic Safety Administration (NHTSA), since this air / land hybrid is likely to spend just as much time cruising down the highway as it will flying 5,000 feet above. The Transition is now slightly closer to takeoff, with the NHTSA granting exemptions for absent airbags, a missing electronic stability system, and the plane's lightweight polycarbonate windows (polycarbonate is lighter than automotive safety glass, and won't shatter and obscure a pilot's vision in the event of a bird strike). Unfortunately the Transition still has other hurdles to fly over -- its cabin is limited to carrying 330 pounds when fully fueled, including passengers, and the price has jumped 41 percent, to $250,000. In the meantime, Terrafugia hopes to move forward with production later this year, bringing the 'flying car' slightly closer to a runway (and highway) near you.

Terrafugia Transition aircraft gets DOT roadworthiness sign-off, can now drive you to the airport originally appeared on Engadget on Tue, 05 Jul 2011 04:02:00 EDT. Please see our terms for use of feeds.

Permalink The Register  |  sourceAOPA  | Email this | Comments
comments

What is Francis Collins doing speaking to the Society for Integrative Oncology? [Respectful Insolence]

I saw this story on Friday and almost couldn't wait the weekend to blog about it. However, since the conference that was brought to my attention isn't until November, I ultimately decided that it would keep. At least until now.

This story is about Francis Collins, the director of the National Institutes of Health. Unlike some bloggers, personally, as a physician and scientist I don't much care about what religion Dr. Collins ascribes to. Unlike some writers such as Sam Harris, most definitely do not consider his strong Christian faith a disqualification for holding the position that he now holds. All I care about in an NIH director is how well he or she shepherds the scientific mission of the NIH and runs the organization. As a supporter of science-based medicine, I just want the NIH to fund and support only the most rigorous science and to be a well-run organization. Thus far in Dr. Collins' tenure, I haven't seen any anything major to worry about on that score, although I have had some disagreements with Dr. Collins' five themes for the NIH.

Recently, however, I was very disappointed to discover that Dr. Collins will be the keynote speaker at the 8th International Conference of the Society of Integrative Oncology (SIO) in November. I rather suspect that he didn't know just what it is that what he was accepting or what the Society for Integrative Oncology is, other than a professional society. At least, I hope that is the case. From my perspective, "integrative oncology" is a discipline that, at its core, is dedicated to "integrating" pseudoscience with science, and by agreeing to speak to the SIO Dr. Collins will be unwittingly providing it with the imprimatur of his position as NIH director.

Read the rest of this post... |

Read the comments on this post...

Also check out the featured ScienceBlog of the week: Inside the Outbreaks on the ScienceBlogs Book Club


comments

Google slides Prizes into beta, helps you get real paid

Come on down! You can be the next contestant on the Prizes site. That was overkill, we know, but it's a necessary introduction into a new world of online solution-based social gaming pioneered by the Slide team. Acquired by the Goog back in 2010, the low profile entertainment-driven app developer has been hard at work making the web 'more social' and filling its Big Daddy's pockets. Debuting in classic Google beta form, Prizes takes your Twitter or Facebook accounts and signs you up for cash prize-winning, user-created contest shenanigans. In case you missed that fine point, we'll reiterate -- users design the challenges, you post a solution (or vice versa). Like the $40 "Give my Dad a makeover!" competition we're completely unqualified to enter, or the $30 "Comprehensive 'get healthy' plan for living in a large, polluted city" game we're sure Al Gore could win in his sleep. It's a kooky idea, but we can definitely see the service having widespread appeal. Let's be frank here: Google + social gaming + prize money = solid user gold.

Google slides Prizes into beta, helps you get real paid originally appeared on Engadget on Tue, 05 Jul 2011 03:11:00 EDT. Please see our terms for use of feeds.

Permalink TechCrunch  |  sourcePrizes  | Email this | Comments
comments

As His Batshit Chickens Come Home To Roost

brooks_david2
A certain member of the GOP's chickenshit Brain Caste has the fucking nerve to feign surprise.

Here is the key paragraph from David Brooks' latest 800-word embarrassment:

"But we can have no confidence that the Republicans will seize this opportunity. That’s because the Republican Party may no longer be a normal party. Over the past few years, it has been infected by a faction that is more of a psychological protest than a practical, governing alternative."

Here is how it would have read is David Brooks had a shred of honesty:

But we can have no confidence that the Republicans will seize this opportunity. That’s because the Republican Party may no longer be a normal party. Over the past few years, Over the past 40 years, it has been infected by a faction that is more of a psychological protest than a practical, governing alternative.

The first version -- favored by every professional Beltway ball-washer in the media -- permits the David Brookses of the world continue to play the role of the reasonable, rbjective witness, merely Observing-With-Alarm the final stages of the complete (and completely unpredictable) psychotic implosion of his Republican Party.

No one could have foreseen...!

The second version -- the honest version -- puts Our Mr. Brooks (and the rest of his ilk) at the scene of the crime, squarely behind the wheel and driving the getaway car for the Party of God for virtually his entire adult life.

So while much of the rest of what Our Mr. Brooks has written is perfectly true
"The members of this movement do not accept the logic of compromise, no matter how sweet the terms. If you ask them to raise taxes by an inch in order to cut government by a foot, they will say no.
..."

The question remains, where were you, Mr. Brooks, when Reagan was instructing them that the government is always wrong, always evil? Where were you when the leaders of your Movement were teaching them that everyone not in the Movement was a Commie? That compromise was treason?

"The members of this movement do not accept the legitimacy of scholars and intellectual authorities."

Yes, but where were you, Mr. Brooks, when the yahoo, bigot, militia-nuts and Fundy votes were being aggressively courted by your Party? When Young Republican gatherings became occasions the endless verbally burning of East Coast elites in effigy? When anyone in the press not mindlessly spewing paranoid wingnut bile was denounced by your Party and Movement leaders as part of the Liberal Media Conspiracy?
"The members of this movement have no sense of moral decency."
But where were you, Mr. Brooks, when Ronald Reagan and George H.W. Bush openly and vigorously played the race card to win the White House? When the Right was rising to power on the backs of the poor, the weak and the powerless? When Newt Ginrich and GOPAC taught Republicans to call Democrats "traitors" and "liars" and "unAmerican" in every speech? Where were you when your Dear Leader lied us into a catastrophic war and then lied to us to keep us there? Where were you when Terri Schiavo's mortal remains were being tossed around like a puppy's chew to for pure, partisan political advantage? Where were you when New Orleans drowned? When Reagan killed the Fairness Doctrine and gave birth to Rush Limbaugh?
"The members of this movement have no economic theory worthy of the name."
But where were you, Mr. Brooks, when voodoo economics was hollowing out the middle class and destroying our industrial base? Where were you when radical banking regulation was setting us up for the kill?

You see Mr. Brooks, as hard as you try to pretend otherwise, you are not an alarm bell in the night warning a sleeping nation of impending disaster.

You just another symptom of that disaster.

Because, Mr. Brooks, the answer to the question "where were you?" is a simple one : you have been fatally and loudly and very, very profitably wrong about your Party and your Movement your entire fucking life.

And worse -- oh so much worse -- the decadent, America-hating Left has been right all along.







comments

Japanese scientists discover massive rare earth deposits, China bristles

China's control over the rare earths market hasn't faced too many challenges over the past few years, but that may be changing, thanks to a major discovery in Japan. Geologists say they've uncovered expansive new deposits of rare earth minerals, buried within a seabed some 20,000 feet below the Pacific Ocean surface. Research leader Yasuhiro Kato estimates that the deposits contain anywhere from 80 to 100 billion metric tons of rare earths, which, if commercially viable, could pose a serious threat to China's global hegemony. Supply shortages and aggressive Chinese export controls have combined to raise global prices in recent years, much to the chagrin of manufacturers who rely upon the metals to produce smartphones, tablets and a wide variety of other gadgets. But with analysts predicting a rare earth surplus within the next few years and Japan's mining industry now poised for a potential resurgence, the outlook is certainly looking a lot brighter.

Japanese scientists discover massive rare earth deposits, China bristles originally appeared on Engadget on Mon, 04 Jul 2011 21:01:00 EDT. Please see our terms for use of feeds.

Permalink   |  sourceBBC  | Email this | Comments
comments

Dark patriotism

So I just heard on NPR that they surveyed their members and found that the song they consider to be the most patriotic is "Born in the USA." Now, either people have a much more nuanced and ironic view of what constitutes patriotism or they have no clue what the song's about.

Born down in a dead man's town
The first kick I took was when I hit the ground
You end up like a dog that's been beat too much
'Til you spend half your life just covering up

[chorus:]
Born in the U.S.A.
Born in the U.S.A.
Born in the U.S.A.
Born in the U.S.A.

I got in a little hometown jam
And so they put a rifle in my hands
Sent me off to Vietnam
To go and kill the yellow man

[chorus]

Come back home to the refinery
Hiring man says "Son if it was up to me"
I go down to see the V.A. man
He said "Son don't you understand"

[chorus]

I had a buddy at Khe Sahn
Fighting off the Viet Cong
They're still there, he's all gone
He had a little girl in Saigon
I got a picture of him in her arms

Down in the shadow of the penitentiary
Out by the gas fires of the refinery
I'm ten years down the road
Nowhere to run, ain't got nowhere to go

I'm a long gone Daddy in the U.S.A.
Born in the U.S.A.
I'm a cool rocking Daddy in the U.S.A.
Born in the U.S.A.

It isn't John Philip Sousa.

comments

Google Videos rental app makes fleeting cameo in Market, portends of an imminent release

The original Google Videos is going to be mighty huffy about this. Not only has it endured repeated attempts on its life following Big G's acquisition of YouTube, but now its very identity has been humiliatingly copied and pasted onto an entirely different service. The new Google Videos is a movie rental app that will give Android users in the US mobile access to the 3,000+ premium titles that are already available to rent on a desktop. So far, no one has been able to break out the popcorn except a few lucky Xoom owners, but last night the app mysteriously became available to everyone else in Android Market, too. Unfortunately, those quick triggers who managed to install the app before it disappeared were rewarded with a riveting succession of server errors, but at least it gives us hope that the real-deal will be with the masses in short order. Google Videos is dead, long live Google Videos.

Google Videos rental app makes fleeting cameo in Market, portends of an imminent release originally appeared on Engadget on Mon, 04 Jul 2011 18:51:00 EDT. Please see our terms for use of feeds.

Permalink Phone Arena  |  sourceAndroid Central  | Email this | Comments
comments

Get the F*** Off Fossil Fuels [Casaubon’s Book]

Almost all conversations with every other parent of late includes "Have you read Go the Fuck to Sleep yet? Have you heard Samuel Jackson read it?...." It is safe to say that the book touches a nerve. And it is extraordinarily funny, and it does evoke precisely the reactions that most of us have trouble acknowledging publically. It is, all in all, an awesome book, and precisely the sort of thing I wish (and I suspect every other writer wishes) they'd thought of first. ("Hey, I've been sleep deprived and bitchy too! I can write doggerel! Why didn't I write it first?")

Sadly, Adam Monsbach beat us all to it, and he deserves a great deal of credit. But in the spirit of jumping on bandwagons (a fine American tradition) I feel that there are other potential humorous children's books on the same general theme that could be brought about. And before someone else publishes derivative parent books like "Just shut the fuck up and eat it already" and "Take your goddamn hand out of your pants right now, I'd like to get there first with a stolen sequel called "Get the Fuck off Fossil Fuels."

I know a few parents whose kids might want to read it to them - I give you permission to use profanity just this one time for good effect.

"Get the Fuck Off Fossil Fuels!"

The lamp glows bright in the darkness, my sweet.
As the Sara Lee pie on the windowsill cools.
The coal plant in the distance reminds us
To get the fuck off fossil fuels!

Daddy is on his commute now my darling,
On a packed interstate full of fools.
He'll be home in two hours - if you're still awake
Oh, we gotta get the fuck off fossil fuels!

A lone frog in the creek is croaking his song
A single calling bird pules.
The rest are all gone - its too warm here for them.
We really should get the fuck off fossil fuels.

Grandma is singing low songs in her rocking chair
Far away at the Senior Home pool.
No, we can't go to visit this year, I told you,
Because we can't afford the damned fossil fuel.

Your asthma medication is there on the table
Even though the a/c is on cool.
I'm sorry you can't breathe on hot nights, my baby,
It is all from this fucked up fossil fuel!

And yes, I have heard about Hubbert
That peak and his linear tools.
We're just hoping the gas lasts a few more years because
We can't get the fuck off fossil fuels!

The fracking is going all night now,
Offshore drilling sucks oil up from pools.
It is getting hard to pretend it isn't destroying us
But please drill me some more fossil fuels!

Some of the old trees are still there yet.
Some fish are still left in their schools.
We haven't killed everything yet dear,
That's why we're still on fossil fuels.

Great Grandpa went to war against slavery
Great-Grandma marched for self-rule.
But hey, I'm no hero, not like them,
To get us the fuck off fossil fuels

This room would be dimmer without power.
And the temperature not quite as cool.
You can't ask your Mom to give up stuff
I need my damned fossil fuel!

Yes I know that you'll want it for things too -
some medicine and metal tools.
But I need a flat screen right now dear,
And I'm eyeing a new pair of red mules.

We kept you safe in your carseat my love,
We followed the new Mom and Dad rules.
The SUV was for you, not for us, dear.
You should have mentioned you'd want fossil fuels!

For all that they cause global warming,
international conflict and duels,
are making us broke, send our babies to war,
We still love our sweet, sweet fossil fuels.

Your Daddy and I are much too old now
To be out there reducing our joules.
We're past 40 you know - now its your chance.
To get the fuck off fossil fuels.

The good news is that it'll be easy for you, love
When we're dead or so old that we drool.
They'll all be used up, so no trouble -
You'll get the fuck off fossil fuels!

In a world that's four degrees warmer
And poorer, with very new rules
I'm sure you won't mind that we used up the gas,
You'll be proud to be off fossil fuels.

When you are older we hope you'll be understanding,
Of the failures of parents and schools,
And governments, leaders and loved ones,
Who used up your last fossil fuels.

It pains us to see you bear this burden
It would be most awesomely cool.
To pass this shit on to our *GRANDKIDS*
Let THEM get the fuck off fossil fuels!

Happy fourth of July all!

Sharon


Read the comments on this post...

Also check out the featured ScienceBlog of the week: Inside the Outbreaks on the ScienceBlogs Book Club


comments

Ladies, Richard Dawkins knows how to protect you from being raped in an elevator [Greg Laden’s Blog]

Recently, Richard Dawkins said (full quote below) that a woman should not be concerned about her own safety if she finds herself in an elevator, because it is trivially easy to get out of an elevator if you are under attack. I'm sure Richard is a very smart guy and maybe he's write, but there is evidence to the contrary that women can just leave the scene if they are uninterested in being raped or groped.

For example:

Read the rest of this post... |

Read the comments on this post...

Also check out the featured ScienceBlog of the week: Inside the Outbreaks on the ScienceBlogs Book Club


comments

‹ First  < 2626 2627 2628 2629 2630 >  Last ›