Who’s On Phirst

Official blog of Phurnace Software.

Archive >> June 2008

Posted by: Pete Pickerill on

Even though it’s been available for a few months, I only recently had time to check out the latest and greatest free virtualization offering from VMWare. I haven’t run it through the wringer completely, but from what I’ve seen there are several new features and improvements that will definitely hasten the upgrade process in our test environment once it clears Beta. Here’s what I like so far:

  • A vastly better web console. The console obviously came under some major scrutiny. The 1.0 version wasn’t unusable, but it wasn’t as feature rich and intuitive as the 2.0 console. Everything you need to manage your virtual machines is easily accessible in a clean web app.
  • More detailed event reporting. This helps you keep track of changes made to your virtual machines. It also helps you find who started, stopped, or reverted your virtual machines. So now instead of cursing the Void when a VM is reverted out from under you and you lose weeks of unsaved test data, you can find the culprit and break their coffee cup or mess with their chair settings late at night when no one else is around.
  • If you are not a late night saboteur and would rather avoid the situation altogether, virtual machine permissions are a lot easier to manage in this release.
  • Instead of assigning a single ‘Default Virtual Machine Location’ as you do in 1.0, you organize your virtual machines in one or more datastores. You can then set access permissions on your datastore to keep others from interfering with your diabolical machinations…or software development.
  • Virtual Machine memory allocation ceiling has more than doubled. 1.0 capped per virtual machine memory allocation at less than 4 GB. 2.0 bumps this up to 8 GB as long as you have the memory to spare. This is a very big deal for anyone that plans on running multiple virtual machines hosting WebSphere Portal.
  • Updates to the VIX API. 2.0 includes support for an updated API (VIX 1.5) with some exciting new features. I am most anxious to get my hands on the Record and Playback features.

The only thing that I hoped was going to be available in 2.0 was support for multiple snapshots per virtual machine. This would make it a lot easier to switch between WebSphere and WebLogic patch levels when tracking down configuration bugs. All in all, I’m very pleased and excited about digging deeper.

In Vmware Server 2.0Virtualization
Comment (0) Read More...


Posted by: Daniel Nelson on

I spent most of last week in hotter-than-the-sun Las Vegas at the HP Software Universe trade show. Here are some quick observations:
 

  1. Hewlett Packard Software is all about the data center. Really. All they talk about is making data centers run more efficiently – from test to deployment to performance metrics. Up and down the stack. It was nice to see such a big company have such a singular focus. There is no confusion in the HP ranks as to what their goal is.
  2. As for web application servers that attendees used, WebLogic, WebSphere and Jboss were all about equally represented. Only one attendee we talked to was on Oracle OAS. Also, very few of the WebLogic prospects we talked to were on release 9.2 or 10. Most of them were on 8.1. I would have thought more companies would have migrated up by now.
  3. The HP staff was pretty awesome. Lots of engineers from HP roaming around and looking at what new technology their partners had to offer. We must have talked to 8 different engineers from the Opsware group alone that wanted to learn more about what we do – and they were just as forthcoming in helping us with the questions we had about OpsWare. (Disclosure: Phurnace is coming out with an integration to Server Automation soon – that’s one of the reasons that we were at the show).
  4. Finally, the Palazzo and Venetian are pretty swank.

In Server AutomationOpswareHP
Comment (0) Read More...


Posted by: Wesley Willard on

The Spring Framework has become the most popular open source application framework in the Java space in recent years. One of its most powerful features is its ability to allow developers to create Spring Beans, which can be configured together to create an application's object graph, or data structure. The framework provides a consistent interface to accessing these beans which avoids unnecessary dependencies between components.

JMX (Java Management Extensions) is a technology that enables the configuration, instrumentation, and monitoring of Java applications of all sorts, both J2SE and J2EE. It has gained wide-spread acceptance in the Java community as the standard API for these tasks. JMX provides access to MBeans (JMX's version of Spring's Beans), which compose its management interface. This is handled through a software layer known as the MBeanServer.

One useful piece of the Spring Framework is its direct support for JMX. Spring provides the ability to register its Beans in an MBeanServer, which can then be interrogated and modified by management applications by Spring Bean interface methods. The interface to Spring Beans is more intuitive and easier to use than the MBean interface, and abstracts many complicated details.

The follow example shows how Spring JMX can be used to provide remote management capability of its Beans. It will illustrate both server and client configuration and code. It will assume some Spring and JMX knowledge.

First, I create the Spring server-side application context configuration:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 
 "http://www.springframework.org/dtd/spring-beans.dtd"> 
 
<beans>
    <bean id="registry" class=
"org.springframework.remoting.rmi.RmiRegistryFactoryBean">
        <property name="port" value="1090"/>
    </bean>
    
    <bean id="exporter" 
class="org.springframework.jmx.export.MBeanExporter" 
lazy-init="false"
         <property name="beans">
             <map>
                 <entry key="spring:name=jmxBean">
                     <ref local="jmxBean"/>
                 </entry>
             </map>
         </property>
         <property name="assembler" ref="assembler" />
         <property name="server">
             <ref local="mbeanServer"/>
         </property>
    </bean>
 
    <bean id="mbeanServer" 
        class="org.springframework.jmx.support.
MBeanServerFactoryBean"/> <bean id="jmxBean" class="com.phurnace.JmxBeanImpl"> <property name="name"> <value>Daffy Duck</value> </property> <property name="rating"> <value>5</value> </property> </bean> <bean id="jmxAttributeSource" class="org.springframework.jmx.export.annotation.
AnnotationJmxAttributeSource"/> <bean id="assembler" class="org.springframework.jmx.
export.assembler.MetadataMBeanInfoAssembler"> <property name="attributeSource" ref="jmxAttributeSource"/> </bean> <bean id="serverConnector" class="org.springframework.jmx.support.
ConnectorServerFactoryBean"> <property name="objectName" value="connector:name=rmi"/> <property name="serviceUrl" value="service:jmx:rmi://localhost/jndi/rmi://localhost:
1090/myconnector"/> </bean> </beans>

The MBeanExporter class is used to specify the Spring Beans that are to be exposed via JMX by the MBeanServer. The MBeanServer is implemented by the Spring MBeanServerFactoryBean class. In this example, it will expose the specifed Beans via RMI. If there is an existing MBeanServer, such as in a web container like Tomcat or JBoss, Spring JMX will use that one. Spring also allows for the specification of an RMI registry for the MBeanServer. It will be started when the application context file is loaded.

The AnnotationJmxAttributeSource and MetadataMBeanInfoAssembler classes are used allow Java 5 Annotations to indicate which classes and methods which will be exposed in the MBeanServer.

The final bean in the configuration file configures a ConnectorServerFactoryBean to provide remote access to the Spring Beans. This connector will be running over RMI, on port 1090.

Now, I configure the Spring Bean (jmxBean), which looks a whole lot like a standard Java Bean:


//
// Interface class
//
package com.phurnace;

public interface JmxBean {
    public String getName();
    public void setName(String name);
    public int getRating();
    public void setRating(int rating);
}



//
// Implementation of JmxBean interface
//
package com.phurnace;

import org.springframework.jmx.export.annotation.ManagedAttribute;
import org.springframework.jmx.export.annotation.ManagedResource;

@ManagedResource(objectName=
"spring:name=jmxBean", description="Managed Bean")
public class JmxBeanImpl implements JmxBean {
    private String name;
    private int rating;

	
    @ManagedAttribute(defaultValue="animal")
	public String getName() {
		return name;
	}
     
    @ManagedAttribute
       (description="Name Attribute",
        defaultValue="animal")
	public void setName(String name) {
		this.name = name;
		System.out.println("Setting name to " + this.name);
	}

	@ManagedAttribute
	    (description="Rating Attribute")
	public int getRating() {
		return rating;
	}

	public void setRating(int rating) {
		this.rating = rating;
	}
}

As I indicated before, Spring allows usage of Java 5 Annotations to specify which classes and methods will be loaded into the MBeanServer, as well as metadata about them. Annotations are straight-forward to use, and provide great visibility to the developer as to which methods are exposed.

Finally, here is an example server, which loads up the Spring application context file.


package com.phurnace;

import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.
ClassPathXmlApplicationContext; public class SpringJmxServer { private static Logger logger =
Logger.getLogger(SpringJmxServer.class); /** * @param args */ public static void main(String[] args) { org.apache.log4j.BasicConfigurator.configure(); ApplicationContext ctx = new
ClassPathXmlApplicationContext("/com/phurnace/server-jsr160.xml"); if (ctx != null) { logger.info
("Successfully loaded ApplicationContext"); } JmxBean jmxBean = (JmxBean) ctx.getBean("jmxBean"); String name = jmxBean.getName(); logger.info("Name is " + name); while ( !name.toUpperCase().equals("EXIT") ) { try { Thread.sleep(5000); name = jmxBean.getName(); } catch (Exception e) { logger.error("Trapped error " +
e.getMessage()); System.exit(1); } } System.exit(0); } }

Now, on to the client-side of things. First, I will show how to access the Spring Bean as a standard JMX client:


package com.phurnace;

import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

import org.apache.log4j.Logger;

public class TestJmxClient {
	private static Logger logger = Logger.getLogger(
TestJmxClient.class); private final String objectNameStr = "spring:name=jmxBean"; private final String jmxRmiStr = "service:jmx:rmi://localhost/jndi/rmi://localhost:1090/
myconnector"; private ObjectName objectName; private JMXServiceURL jmxUrl; private JMXConnector jmxConnector; private MBeanServerConnection mbsc; /** * @param args */ public static void main(String[] args) { org.apache.log4j.BasicConfigurator.configure(); if (args.length == 0) { logger.info("Usage: java com.phurnace.
TestJmxClient "); System.exit(0); } TestJmxClient jmxClient = new TestJmxClient(); jmxClient.init(); jmxClient.accessBean(args[0]); System.exit(0); } public void init() { try { objectName = new ObjectName(objectNameStr); jmxUrl = new JMXServiceURL(jmxRmiStr); jmxConnector = JMXConnectorFactory.connect
(jmxUrl); mbsc = jmxConnector.getMBeanServerConnection(); } catch (Exception e) { logger.error("Error initializing
connection"); } } public void accessBean(String newName) { String name = getName(); if (name == null) { return; } logger.info("Original name is " + name); logger.info("Setting new name to " + newName); setName(newName); // // Access the name again to check it's value // name = getName(); if (name == null) { return; } logger.info("New name is " + name); } private void setName(final String name) { final String operationName = "setName"; try { Object[] params = new Object[1]; params[0] = name; String[] signature = new String[1]; signature[0] = new String("java.lang.String"); mbsc.invoke(objectName, operationName, params, // no parameter signature ); } catch (Exception e) { logger.info( "Error setting name value in bean "
+ e.getMessage()); } } private String getName() { final String operationName = "getName"; try { final String status = (String) mbsc.invoke(objectName, operationName, null, // no parameter null ); return status; } catch (Exception e) { logger.info("Error getting name value from
bean " + e.getMessage()); } return null; } }

This example does not need any Spring classes to access the MBean, even though it is created on the server as a Spring Bean. The test client accesses the MBeanServer via the RMI protocol.

You may notice that in order to make a connection to the MBeanServer, several intermediate objects must be created, such as a JMXServiceURL, a JMXConnector, and a MBeanServerConnection. In the process of creating these objects, checked exceptions must be handled.

This leads me to my final piece of code, which illustrates the same functionality, but is implemented using Spring.

First, here is a client-side Spring configuration file:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
 "http://www.springframework.org/dtd/spring-beans.dtd">
 
<beans>
 
<bean id="clientConnector" class=
"org.springframework.jmx.support.MBeanServerConnectionFactoryBean">
  <property name="serviceUrl" value=
"service:jmx:rmi://localhost/jndi/rmi://localhost:1090/myconnector"/>
</bean>
 
<bean id="proxy" class=  
"org.springframework.jmx.access.MBeanProxyFactoryBean">
  <property name="objectName" value="spring:name=jmxBean"/>
  <property name="proxyInterface" value="com.phurnace.JmxBean"/>
  <property name="server" ref="clientConnector"/>
</bean>
 
</beans>
This configuration file configures an MBeanServerConnectionFactoryBean to provide the client with a connection to the server, via the RMI protocol. Then, an MBeanProxyFactoryBean is configured to create a proxy for the MBean registered under the specified ObjectName. Finally, the client connection bean is referenced, to allow remote access. Finally, here is the the Spring client:

package com.phurnace;

import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.
ClassPathXmlApplicationContext; public class TestSpringJmxClient { private static Logger logger = Logger.getLogger
(TestSpringJmxClient.class); private ApplicationContext ctx; private JmxBean jmxBean = null; /** * @param args */ public static void main(String[] args) { org.apache.log4j.BasicConfigurator.configure(); if (args.length == 0) { logger.info("Usage: java com.phurnace.
TestSpringJmxClient "); System.exit(0); } TestSpringJmxClient jmxClient = new TestSpringJmxClient(); jmxClient.init(); jmxClient.accessBean(args[0]); System.exit(0); } public void init() { ctx = new ClassPathXmlApplicationContext
("/com/phurnace/client-jsr160.xml"); if (ctx != null) { logger.info("Successfully loaded
ApplicationContext"); } jmxBean = (JmxBean)ctx.getBean("proxy"); } public void accessBean(String newName) { String name = getName(); if (name == null) { return; } logger.info("Original name is " + name); setName(newName); name = getName(); if (name == null) { return; } logger.info("New name is " + name); logger.info("Rating is " + jmxBean.getRating()); try { jmxBean.setRating(10); } catch (Exception e) { logger.warn("Unable to set rating -
attribute is read-only"); } logger.info("Rating is still " +
jmxBean.getRating()); } private String getName() { return jmxBean.getName(); } private void setName(String name) { jmxBean.setName(name); } }

You might notice that the code is much more concise and clean. Except for the loading of the application context file, and the Bean access, there are no references to Spring code needed.

A try-catch block wraps the call JmxBean.setRating(10), as this method was specifically not exported by the server-side. This essentially makes this property read-only.

Hopefully, this code might encourage you to investigate Spring JMX as a technology worth incorporating in your next application. Providing external access to applications can pay off in valuable, unforseen ways after the it has been deployed.

In Untagged 
Comment (0) Read More...


Posted by: Alexander Bibighaus on

Switching IDE's has always been something I feel is important to keep an open mind about. I learned this early on when I was an emacs fanatic. I started software development in a Unix/C environment where emacs and vi were the two editors of choice (or debate). Despite all of the vi/emacs wars , my experience was that both came in handy, but at different times.

I recently feel this way about Netbeans vs Eclipse in the Java IDE world. Both IDE's contribute different tools to a Java developer that are extremely useful.

Let's take Eclipse for example. I like Eclipse's efficiency. Everything takes less clicks! In addition, the SWT toolkit still feels and performs better than any Java application out there. Netbeans continues to have small quirks about it that cause discomfort for the user because the application does not behave as a normal native application. Something as simple as managing the cursor in the code does not feel natural to me. So, the “Everyday IDE” still goes to Eclipse.

On the flip side, Netbeans has far more integrated tools and wizards than Eclipse. Netbeans has a rich set of wizards and tools for mobility, J2EE, Web development etc. Moreover, the Java Profiler is excellent! The best part about Netbeans is that it is one coherent tool from a single vendor. The “Most Complete IDE” goes to NetBeans.

Netbeans Visual Development tools are the first visual tools for Java I can say I enjoyed. The best part is the ability to integrate manually written code with the visual designer and vice-versa. In addition, the visual designer generates simple code. The generated code is straightforward Java that anyone unfamiliar with the visual tools would understand. The “Most Innovative IDE” goes to NetBeans for finally giving Java a set of useful visual tools.

Eclipse has a one big leg up on Netbeans. Eclipse RCP is a fantastic development framework. It is rich in features and has a unifying effect on product development. Anyone thinking about developing a desktop application should seriously consider Eclipse RCP. The “Best Application Development IDE” goes to Eclipse because you should be developing RCP applications in that case.

In conclusion, just as vi and emacs both brought different ideas as an editor, it is worth the effort to learn both. You will find that rather wasting your time arguing for one or the other, you just have more tools in you tool chest since you tried them both!

In NetbeansIDEEclipse
Comment (0) Read More...


Posted by: Robert Reeves on

MCC

Phurnace Software makes its home at the MCC building, which is owned and managed by the Unversity of Texas at Austin . Quite a few really neat companies are located here, including Bigfoot Networks . But, there is no company in the building named MCC. So, what the heck does MCC stand for? Short answer: Microelectronics and Computer Technology Corporation

Wikipedia has a brief article on MCC . Here's a brief snippet:

"In late 1982, several major computer and semiconductor manufacturers in the United States banded together and founded MCC ... as an American answer to Japan's Fifth Generation Project, a large Japanese research project aimed at producing a new kind of computer by 1991."

Most of the projects they worked on involved Artifical Intelligence. A really cool project, InfoSleuth which was a very early web search engine. This focus on AI can still be seen, to some degree, at the University's CS department. Of course, the good times couldn't last forever. Mainframe companies began to get pushed aside by IT companies, but when the bubble popped, the members support for external R&D evaporated. MCC ended in 2000.

So, what happened to the Fifth Generation Project? Total and complete failure . They got their butts whipped by Sun and Intel processors. Cheap and fast beats expensive and fast. Always.

The reason I began thinking about this is because of the NY Post article yesterday about the Abu Dubai Investment Council purchasing the Chrysler Building. Of course, Drudge picked up on it and has had it in RED as the top link all of yesterday. Seeming to say that our most treasured symbols of America are being purchased by a foreigner. OH NOES!

 Please. Sony bought Columbia Pictures. Matsushita bought Universal Studios. Mitsubishi bought Rockefeller Center. From my perspective, when a foreign investor starts investing in the US, they are typically 12 months from a fall . You read it here first, folks.

So, what is the difference between Sun and Intel versus MCC in the 1980s? Profit. Pure and simple. By allowing the companies that researched and developed x86 and RISC to directly profit, we have provided them a strong incentive to create jobs and wealth.
 
Thankfully, profit is a better motivator than hand-wringing, chicken-little jingoism.
 

In Untagged 
Comment (0) Read More...


Posted by: Shawn Spiars on

It seems like there are more visual GUI builder products available on the market today than ever before. Visual GUI builders propose an easier way to design and create user interface components. They usually consist of a palette from which you select and drag controls or widgets onto a window, frame, or dialog. Then they provide a table or list where you can manipulate the properties of your controls (size, font, color, coordinates, etc) without requiring the user to know the subtleties’ of the syntax or layout managers. Here is a really good link if you are interested in Java GUI Builders.

Call me old fashion, but I always prefer a language editor (HTML, XML, Java, etc…) over a visual editor because I want to understand the commands I write, and I want to format and organize the code in a way that is meaningful to me so I can easily edit the code later. A good language editor will have syntax highlighting, syntax checking, command completion and various other features to assist you in developing the code, but it won’t generate the substance of the code for you.

Another type of code generation tool falls into the Model Driven Development (MDA) category. With MDD, logical models are used to capture design decisions and generate code, and sometimes the generated code is user interface code. The problem I have with user interfaces generated from models is that there is no consideration by the machine for who the user is, their technical aptitude, or the way they approach a task (workflow). The entire human experience is missing and the user interface has been reduced to a bunch of domain objects and business rules.

For example, the Eclipse Modeling Framework (EMF) can use a model to quickly generate a cool looking prototype consisting of a relational tree, object listeners, pop-up menus, and a properties view, but this in no way resembles a complex, well designed, user friendly application. And don’t be fooled into thinking you can easily tweak the generated code to get it to behave the way you want it to. I’ve spent hours and hours digging thru layers and layers of cryptic machine generated code trying to find the one line that needs to be changed to get the desired behavior.

There are plenty of MDD advocates out there who will disagree with me. Most of them are experts in modeling, but I’ve never met one who is an expert in user interface design. Since most project leads and architects today are very familiar with UML and modeling tools they often buy into the promise that MDD will save them time on their UI development. This has not been my experience.

If you do choose to use a modeling tool to generate UI code – I recommend you decouple the UI model from the back-end model. Just imagine a project where every time the back-end architect decides to change a relationship in the model the UI mysteriously breaks with no warnings.

“And that’s all I have to say about that.”

-Shawn

In Java GUIEclipse
Comment (0) Read More...


Posted by: Pete Pickerill on

I dream of buying a dilapidated shack in Middle-Of-Nowhere, Texas. All this shack needs is a small kitchen, a BBQ Pit, a sturdy lawn chair, and a butcher’s block. I would spend the wee hours of the morning prepping brisket after brisket, chicken after chicken, coercing a steady fire into life. When the time was right, the meat would hit the pit, I would plant myself in the lawn chair, and wait. The remainder of my workday would be spent checking the heat, tending to my meaty charges, and whipping up the occasional batch of sauce. I’d close up shop at 2:00 PM or when the meat sells out, whichever comes first.

Unfortunately, this is just a dream and it doesn’t show any signs of turning into a reality any time soon. Until that happens, I have to take solace in the occasional opportunity to cook for friends and family. Phurnace had such an occasion yesterday and I jumped at the chance to spend a day fighting the smoky beast instead of testing software.

 

HOW I COOK A BRISKET:

The Rub:

  • 1 cup Paprika
  • ¼ cup Kosher or Fine Sea Salt
  • ¼ cup Fresh Ground Pepper
  • 1 tbsp Granulated Garlic
  • 1 tsp Cayenne Pepper

Prepping the meat:
An untrimmed brisket is pretty fatty. I usually trim the fat down to a thickness of about ¼ inch wherever I can. Once it’s trimmed, I’ll flip it over and score the top of the brisket perpendicular to the grain. This kind of gives me a guide for cutting the brisket after it’s done. After it’s trimmed comes the seasoning. I usually coat the entire brisket with a thin layer of mustard. This gives the crust that develops during cooking a little tang and crunch and helps the rub adhere to the brisket. Sprinkle the rub liberally over all surfaces but don’t feel like you need to cram it in every little nook and cranny.

Cooking the meat:
I won’t get into how you build and maintain an indirect fire here because it differs from cooker to cooker. The most important thing to remember is you want to maintain as steady a temperature as possible. I usually shoot for a temperature of 240. Put the brisket on your cooker and add some wood chunks to the fire. I usually use oak and/or apple wood chunks. Check the fire once an hour. Add more charcoal and wood chunks as needed.

Typically the brisket will take about 1.5 hours per pound to cook at this temperature. About halfway through cooking time, I start rotating my brisket every 2 or 3 hours and basting it every hour on the hour. The baste I use is pretty simple and will make your heart explode if you drink it straight. It’s 2 cups of beef broth, a stick of butter, ¼ cup of Worcestershire, ¼ cup of lemon juice, and a couple tablespoons of leftover rub.

When’s it done? Whenever the internal temperature reaches about 160 or you can pierce it with a fork easily and it pulls out with little to no resistance. Let it sit for about a half hour and then slice it, using the score marks you made during prep time as a guide. Slicing against the grain yields the most tender results.

In BrisketBBQ
Comment (0) Read More...


Posted by: Daniel Nelson on

Working at a small software company like Phurnace is kind of like surfing. Well, actually, - since I have never surfed - it’s kind of like what I imagine surfing to be like. You are either on top of the world or at the bottom of the ocean, and you spend very little time in between. When Robert and I first started full time with Phurnace, I was only as good as my last meeting. If the meeting had gone well, then I was convinced that our success was all but inevitable. If the meeting went poorly, then I was crushed. Sometimes I would feel both ways in the same day - or the same hour. The ups and downs were extremely hard to deal with – and if I were to be honest, they still are.

Now, before everyone starts in on how much of an emotional weakling I am (which may indeed be the case), keep in mind that it’s not just me who has had these feelings. I have talked to a lot of people who have done similar things and feel that same way. So, either this is a common experience, or I hang out with a bunch of wimps. Take your pick.

Over the years I have found a few ways to deal with this. One is just to become numb to it and be cynical about everything. Another is to go all Mr. Spock and just try to deal with it as everything as analytically as you can. Both of those can work at times, and I’ve used them to good effect.

But you know, I think that kind of misses the point about working at a small company (and especially a software company). And that point is that it is suppose to be fun. It’s supposed to be exciting. And, while the downward plummet to the abyss can be quite terrifying, ultimately it will be those times that destruction looked the most certain but was somehow avoided that will be the most poignant, and the best remembered. The trick is to be able to enjoy the downslides as much as the upswings; to be able to laugh at both of them - whether gleefully or manically.

In Untagged 
Comment (0) Read More...