Friday, August 7, 2009

I'm moving...

this site in the next couple of weeks. Been wanting to restart the blog and I think a new location that is a little more under my control is better. I also want to get back into the Zilch research that I was doing when life decided to interrupt.

I think I've come to terms with my nerdiness at any rate, and a new website will signal that change in direction.

Monday, November 10, 2008

Wow... (update on Zilch research)

I grossly underestimated the size of the game space. I was thinking it'd be in the billions. It turns out to be about 64 trillion states. Searching the space will require some memoization to speed up the time (because the expected value nodes are 55,987 branches wide) , but I can't memoize the entire space unless I had an exabyte of RAM available (need someone to get on that real quick :D). I'll use some strategies to reduce the size of the space, and maybe a caching strategy to only memoize the states that are needed at the moment. More updates as I progress tomorrow. I need my sleep.

Sunday, November 9, 2008

I officially dislike Blogger's formatting...

It is impossible to format code in Blogger without Blogger ripping it apart... is there a solution for this or do I need to move to WordPress?

Saturday, November 8, 2008

Study of the game Zilch part 1

You know you're a math nerd when you analyze a game to determine the best strategy. Be forewarned, the following post is really math intense; abandon all hope of avoiding nerdhood ye who enter here...

I have been introduced to a wonderful game called Zilch on Kongregate. If you want to lose hours of your life, go to Kongregate and check out all of their cool flash games, all of which you can play for free. :) The reason I wanted to talk about Zilch is that it is a great game that illustrates some of the interesting corner cases of game theory. I will be breaking up this analysis into several segments in order to discuss different aspects of the game, and the process one could go through in order to come up with a winning strategy for the game. This first segment will discuss the scoring and expected value of a hand, and will end with an analysis of an interesting situation in the game that has an unexpected strategy.

Let's start with a quick summation of the rules. Players play in turns, and attempt to score points by rolling dice for a hand. Once one player gets to 10,000 points, the other player has one more turn in order to attempt to beat the crosser's score. Scoring for a hand works as follows: you roll 6 dice, and every turn you have to score something and either bank or roll. You score based on the following scoring rules:
  • 1 one: 100 points
  • 1 five: 50 points
  • a set of three or more dice: 12.5*base*2^dice. The base is the die value in points or 10 points for a one. For example a set of 4 sixes, it scores 12.5*6*2^4=1200 points. 6 ones is the largest score in the game worth 8000 points.
  • a long straight 1-6: 1500 points
  • three pairs (not necessarily unique): 1500 points
  • nothing: if a roll of 6 dice results in no scorable dice, then it scores 500 points instead.
After each roll you take dice off and score them, keeping the points in a "bank". You may score any of your dice that you want, but you must score at least 1 die or get a Zilch for the round, scoring 0 points. After scoring dice, you get the option to either roll again with the remaining dice or taking your points from the bank and ending your turn. This is called "banking" and it requires that you have at least 300 points in your bank. If you are lucky enough to score all your dice then you get all of your dice back and it constitutes a free roll, which can be repeated as many times you can manage to pull it off. If you are unlucky enough to zilch three times in a row, then you score -500 points (this does not stack).

After the first few playthroughs, some interesting strategies seem to jump off. Firstly, if you have a single die remaining, and you can bank, it's usually a good idea to do so, for the probability to zilch in that position is 2/3. If you have two zilches against you, then you want to bank at your first opportunity in order to avoid the zilch penalty. When scoring, it's not always the best thing to score everything available to you, especially in the case of 3 twos. Your daring is really more of a function of what your opponent's score is in relation to your own.

So what does it mean to know the perfect strategy for a game? A perfect strategy is to know based upon any game position the proper play to make that maximizes some quality of the game state. This quality is usually to win the game, but in the case of the online game there are also strategies to obtain some of the achievement badges, such as winning a game without zilching, playing a game with the least number of turns, or scoring over a certain value for each non-zilched play. At first I will be analyzing the basic question of best play to win the game.

Therefore, we need to start by defining the game state. Since we at first do not care how many turns it takes, or whether or not the win is zilch free, or any other qualities of the game other than winning, a lot of historical values can be discarded. The remaining qualities of the game break down as follows:
  • Whose turn
  • Your score
  • Opponent's score
  • Your zilch run (number of consecutive zilches before this turn)
  • Opponent's zilch run
  • Current bank value
  • Dice state
My approach to determining the proper strategy is similar to how blackjack was analyzed. I start off by determining a "book strategy" which is the proper strategy in a turn based on the state of the game and the dice. From there I'll want to come up with some ground rules that aggregate that strategy into a set number of rules. This will boil down into something like "double down on 11, or 10 if dealer's not showing an Ace".

I could approach this from an elegant mathematical angle, using clever reasoning to determine each step in the process. Instead I decided to brute force the numbers, and get the elegance later when summing up the results. My tool in this quest is Java. Later on I will see how much faster this would have been in a language like Haskell, where this kind of search is better structured.

I represent my dice as an integer array. I then write a function that evaluates a set of dice for the score you'd get if you took everything (no banking instituted yet). After writing some tests to assert that I was good, I then wrote a clumsy for loop to evaluate across all dice:

int dice[]=new int[]{1,1,1,1,1,1};
int fullscore=0;
Map<Integer,Integer> scorecount=new TreeMap<Integer,Integer>();
for(dice[0]=1;dice[0]<=6;dice[0]++)
for(dice[1]=1;dice[1]<=6;dice[1]++)
for(dice[2]=1;dice[2]<=6;dice[2]++)
for(dice[3]=1;dice[3]<=6;dice[3]++)
for(dice[4]=1;dice[4]<=6;dice[4]++)
for(dice[5]=1;dice[5]<=6;dice[5]++){
int sc=calculateScore(dice);
if(sc<300)continue;
if(scorecount.containsKey(sc)){
scorecount.put(sc, scorecount.get(sc)+1);
}else scorecount.put(sc, 1);
fullscore+=sc;
}
double avgscore=(double)fullscore/46656.0;
System.out.println("Average score:"+avgscore);
boolean medflag=false;
System.out.println("Breakdown:");
int ssf=0;
for(int x:scorecount.keySet()){
ssf+=scorecount.get(x);
System.out.print(x+":\t"+scorecount.get(x)+"\t"
+(double)scorecount.get(x)/466.56
+ "\t" + ssf
+ "\t" + (double)ssf/466.56);
if(!medflag && ssf>=23328){
medflag=true;
System.out.println("<=== Median");
}else System.out.println("");
}

My goal here was to get the average and median scores from the first throw. This data would be useful later in understanding strategies and would allow me to develop the infrastructure needed to walk the state space of this game.

Results? You can execute the code yourself to get the score layouts. :) Here are the highlights. I get an average score from the first throw of 426.60. That's a lot of potential... what that tells me is that with average throws I should be able to score my 10,000 points in about 23 turns. The median of the first throw is 250 points, and your chances of having a bankable score at the start are 44.58%. If I only count bankable throws, and take worst case scenario of zilching otherwise, I get an average score of 341.78.

That told me a lot of info, but not everything I needed. I now wanted to evaluate based on the second and subsequent throws, meaning I'd have to evaluate with less dice. The idea of writing that horrendous for-loop structure was scary, so I decided to go a bit more functional. And man, Java didn't make it easy. :D

In order to evaluate across all dice of any number, I decided to stay with my int[] strategy. I started by writing a couple of generic interfaces:

public class ZilchCalculations {

public interface DiceCalculation<X>{
public X evaluate(int[] dice);
}

public interface TreeCollate<X,Y>{
public X collate(X values, X nv);
public X ret(Y st);
}

The first interface allowed me to make a calculation across dice. The second allowed me to collate that calculation across those dice combinations. Notice how I've abstracted the evaluation structure and the Collation structure. Essentially these interfaces will act as containers for function objects, much like a C# delegate structure. Next is to do the actual evaluation and collation:

public static <X,Y> X acrossAllDice(int numdice,DiceCalculation<Y> eval,TreeCollate<X,Y> coll){
int[] dice=new int[numdice];
Arrays.fill(dice,-1);
return acrossDice(0,dice,eval,coll);
}

public static <X,Y> X acrossDice(int make,int[] dice,DiceCalculation<Y> eval, TreeCollate<X,Y> coll){
if(make<dice.length){
X res=null;
for(int d=1;d<=6;d++){
dice[make]=d;
if(d==1)res=acrossDice(make+1,dice,eval,coll);
else res=coll.collate(res,acrossDice(make+1,dice,eval,coll));
}
return res;
}else return coll.ret(eval.evaluate(dice));
}

This allows me to evaluate across all dice combinations for an arbitrary number of dice. The acrossAllDice function creates a holder array for the dice states, and recursion causes the numbers in dice to be updated in order. When I am at the root of the tree, I call the evaluate function in the DiceEvaluator to get my evaluation object, and then the TreeCollate's ret function to put that into a singleton collation object. It then continues to collate as it goes up the tree. I can easily wrap my scoring function in an evaluator:

public static final DiceCalculation<Double> SCORE_CALC
=new DiceCalculation<Double>(){
public Double evaluate(int[] dice){return (double)calculateScore(dice);}
};

and then my collation function for now will just sum the results:

public static final TreeCollate<Double,Double> SUM_UP
=new TreeCollate<Double,Double>(){
public Double collate(Double values, Double nv){
return values+nv;
}
public Double ret(Double x){return x;}
};

Now to get the average score for 6 dice? acrossAllDice(6,SCORE_CALC,SUM_UP)/Math.pow(6.0, 6.0). For 5 dice it's just acrossAllDice(5,SCORE_CALC,SUM_UP)/Math.pow(6.0, 5). That seems like a lot of work just to be able to make a small change like that. Let's show the power of this approach. Say I want to collect all the scores into a list for stat evaluation:

public static final TreeCollate<List<Double>,Double> COLLECT
=new TreeCollate<List<Double>,Double>(){
public List<Double> collate(List<Double> values,List<Double> nv){
values.addAll(nv);
return values;
}
public List<Double> ret(Double x){
return Collections.singletonList(x);
}
};

and change SUM_UP to COLLECT above to reap the benefits. Say I wanted to calculate the chances of zilching on a throw?

public static final DiceCalculation<Double> ZILCH_CALC
=new DiceCalculation<Double>(){
public Double evaluate(int[] dice){return calculateScore(dice)>0?0.0:1.0;}
};
}

and substitute ZILCH_CALC for SCORE_CALC. To get a tabluar evaluation:

System.out.println("Number of dice\tAverage Score\tZilch Prob.");
for(int ndice=1;ndice<=6;ndice++){
System.out.println(ndice+"\t"
+(acrossAllDice(ndice,SCORE_CALC,SUM_UP)/Math.pow(6.0, ndice))+"\t"
+(acrossAllDice(ndice,ZILCH_CALC,SUM_UP)/Math.pow(6.0, ndice))+"\t");
}

which gives me the wonderful table:

Number of dice Average Score Zilch Prob.
1 25.0 0.6666666666666666
2 50.0 0.4444444444444444
3 86.80555555555556 0.2777777777777778
4 143.5185185185185 0.1574074074074074
5 225.7908950617284 0.07716049382716049
6 426.60108024691357 0.0

This table explains a great generic rule that's originally counterintuitive. Say you're under two zilches and you rolled 2-2-2-5-3-4, a rather unpleasant roll. Do you score the 5, the 3 twos, or both? If you look at the table, it'll make sense that you score only the 5. Scoring the 5 gives you the possibility of scoring an average of 225.79 points over those last 5 dice, meaning your average score is 275.79 (still not that good) but your chances for zilching are only 7%. If you take the three 2s, you do have 200 points, and your average is slightly higher now (286.81) but you've now quadrupled your chances to zilch (at ~28%). If you take both, your average is at 300, but your chances to zilch are now 4 in 9, an unhealthy prospect. It makes sense to reroll as much of this crappy roll as you can.

However, this isn't a soundproof argument for maximizing your score, only a good hunch based on some statistical calculations. The soundproof argument will come from calculating across the entire space, and that will happen in the next installment.

Wednesday, October 15, 2008

Blog Action Day -- Absolute Poverty

It's been another three weeks and I felt like flexing my writing muscles again, so I saw the announcements about Blog Action Day and went to the website. Since it is an important topic that needs more focus than beauty pageants can give it, I decided to give it a try. The problem is that I am absolutely no expert on the topic. In fact, after thinking about it for a bit I had very little knowledge of what poverty really is. It has grown to become one of those big ideal words of bad things in my head like unemployment, genocide, starvation, illiteracy.

I have really been damned lucky in my life. I've always had a place to live, never had to go starving, almost always had a job, never been persecuted due to any protected classes, and I've always been able to read and been around people in my life that can do the same. When I grew up my parents never had a lot but they were never truly impoverished and I was pretty lucky to never really experience that.

At the same time all of this fortune also makes one not so observant of not having a job (well right now for me that's kind of an issue, but my prospects are better than most) or lacking the ability to read, or being homeless, or experiencing discrimination, or what true hunger really feels like.

It seemed that my ignorance was showing.

One good place to fix displays of stupidity is to research. I started at the base level with the Wikipedia article and scaled outward. The definition of poverty depends on the setting of a threshold that must be achieved in order to self-sustain, so the first thing that the article does is to differentiate between absolute and relative poverty by classifying these thresholds.2 An absolute poverty threshold is defined in terms that do not vary between human beings, whereas a relative poverty threshold takes into account the economic and cultural situation of the society that you live in.

I've decided to focus on absolute poverty, since relative poverty will bring into the conversation philosophical arguments that betray the actual crisis at hand. Where relative poverty varies from country to country and depends on being able to define a standard of living, absolute poverty is defined as the inability to provide for 2 of the following life necessities (according to a UN report by David Gordon):
  • Food: Body Mass Index must be above 16.
  • Safe drinking water: Water must not come from solely rivers and ponds, and must be available nearby (less than 15 minutes' walk each way).
  • Sanitation facilities: Toilets or latrines must be accessible in or near the home.
  • Health: Treatment must be received for serious illnesses and pregnancy.
  • Shelter: Homes must have fewer than four people living in each room. Floors must not be made of dirt, mud, or clay.
  • Education: Everyone must attend school or otherwise learn to read.
  • Information: Everyone must have access to newspapers, radios, televisions, computers, or telephones at home.
  • Access to services: This normally is used to indicate the complete panoply of education, health, legal, social, and financial (credit) services.
It seems to me that many of these basic necessities should be at least achievable no matter what society you ascribe to. However, some disturbing things came to light when I started looking into each requirement on the list.

A BMI of 16? That's practically anorexic. Recently there was a mandate by many fashion boards to prevent models from modeling if their BMI was under 18. Median BMI in the US is around 24. Keep that in mind when you look at David Gordon's charts at the end of that talk to see how critical the situation is. There's something wrong with culture where we can eat whatever we want when we want while models do hunger art to "entertain" us knowing full well they're getting paid well enough to recover afterwards when poor people out there are starving for real and don't even have the opportunity to get the job to earn the food to keep them well.

It gets worse. We as a society can drink water sold in bottles but outside of the US there's many places where 10% or more people don't meet this standard (some places like sub-Sarahan Africa are at 48%). It also looks like I'm preaching to the non-impoverished: 95% of the worlds computers are in 20% of the people, and this creates an information gap in science and education that is much more disturbing than the disappearance of the middle class that we seem to fret about in the US. The housing crisis is a big ticket item in the US, but the unspoken conclusion of the financial situation is the eventual increase in homelessness that it will produce; already 700,000 to 2 million people experience homelessness on any given day in the US (something many of us do see), but that's only 2% of the world total. Finally, in a country with a 98% literacy rate, we don't see many people who are illiterate, whereas the moment we step out of our borders the rate is at 82%. Some places in the world have 50% literacy.

Keep in mind that these issues are also within our borders, and I don't make light our our own poverty problems in the US. I'm looking at absolute poverty here, where there are no houses not made of mud or clay, no running water or water resource for miles, with a lack of food, employment, education, clothing, health care, and information. These are people who don't have a society from which to ask for assistance. Honestly, it's hard to picture such a dire situation in the United States. We have running water and electricity in this country. Libraries are open to whomever want to enter, and after filling out the right forms you can use their computers, which 98% of you are able to do because someone taught you to read. People here do provide food and shelter to those in need (although more need to take the call to arms).

I guess the point is that I'm not alone for not seeing many of these issues. I live in a country that comparatively has not seen absolute poverty (at least not yet, depending on the markets), and have lived my life never truly being at the point where I was deprived of any of the above. Therefore, I have no true focal point.

And neither does the world. Interestingly enough, people argue so much over the statistics that I couldn't find an absolute answer to how many people suffer from absolute poverty. I guess that it's a hard question, mainly because of those 8 conditions above no one seems to have drawn up the necessary Venn diagram and counted the intersections. One way to estimate the problem is the World Bank's threshold of extreme poverty, which is living on less than $1.25 a day (based on 2005 Purchasing Parity Power). No matter what part of the world in which you live, it seems difficult to be able to maintain 7 of the 8 conditions above on a salary of less than $37.50 a month. (Wow, I have $40 in my wallet currently. How much money do you have in your wallet? Could you live on only $40 over the course of a month? Anywhere?) From the World Bank:
Using improved price data from the latest (2005) round of the International Comparison Program, new poverty estimates released in August 2008 show that about 1.4 billion people in the developing world (one in four) were living on less than $1.25 a day in 2005, down from 1.9 billion (one in two) in 1981.
I guess we're doing better? It still seems pretty horrific that 25% of people in the developing world suffer from extreme poverty. I'd be willing to bet that at least the majority of those suffer from absolute poverty, per my arguments above. Do we see any of these people? How about in the US? In my research today, I couldn't find a US indicator of extreme poverty by the World Bank rules, because here we define it at less than $10,000 a year, which is more than 20 times the World Bank standard. Using that threshold we have 6% "extreme" poverty. Again, I don't want to lessen the horrible situation of the impoverished in America; rather, I simply want to convey how hard it is to find people who experience extreme poverty by World Bank standards and how incomprehensible of a problem it is.

In that same talk by David Gordon where we got the 8 requirements for human sustenance, there's a summation statement (oddly enough in the middle of the talk):
Fundamentally, poverty is a denial of choices and opportunities, a violation of human dignity. It means lack of basic capacity to participate effectively in society.
This is pretty profound. I couldn't even imagine how it feels not to be able to provide for my most basic needs, and there are so many people at this critical level. Not only that, the purpose of society is to assure their members that these choices and opportunities are being met, that it is possible to satisfy these 8 necessities. Anything less of that is inhumane and undignified. And to think how large this problem is.

Really, 1.4 billion? I can't imagine 1.4 billion dollars, let alone 1.4 billion suffering people that need that money on a daily basis. And I had to research how bad the problem is? It's no wonder that those in absolute poverty feel voiceless in society and why it's important for the relatively wealthy to speak up and act on their behalf and for the support of their welfare.

Monday, September 22, 2008

On speculation...

I have not posted in three weeks. I reckon that I will be fixin' this now.

I decided to start a book club for speculative fiction. The idea formed over coffee on a Sunday with a good friend of mine and her friend. We got together for Scrabble and conversation (I did tell you I was a nerd, right?) and had a long discussion about 3-letter words and science fiction.

It's real hard to convince a book club to discuss science fiction. This is due to a bad rap the genre has received. Some of it is deserved; good science fiction depends on not only a modest understanding of the science, but also a sharp understanding of fiction. This makes it at least twice as hard to write as other forms of fiction. Now a great sci-fi novel will also take in elements of sociology, history, anthropology, psychology, and common sense in realistic amounts just to rattle your bones. The best sci-fi will do this to make you really think and learn from it. It's so easy to fall short of this mark, thus no wonder that there's so much crap out there to sift through.

I decided upon starting not a science fiction group, but a speculative fiction group. There is a slight distinction; speculative fiction centers more upon the concept of speculation, or the forming of hypotheses. These are predictions, and are notoriously fickle. The key is that it doesn't need to be about technology, just a hypothesis with a fleshing out of the consequences of what that hypothesis entails. This includes books like 1984 and A Handmaid Tale which are more about utopian and dystopian futures than about science, books like the Difference Engine and The Man In The High Castle which are more about alternative history than science. The thread that connects all of these books is the idea of asking "What if?" and not the science, even if the act of forming hypotheses is at the root of science.

I call the group S3 and we're listed under meetup. I won't link directly due to google's nosiness and my persona firewall.

It is SO important to ask this question, especially in our times. I just listened to this wonderful Web 2.0 seminar about the information overload being more about the failure of filters than the sensory overload. He goes one step further in the talk to conclude that the shift in economics caused by the Internet (a post-Gutenberg economy) changes the responsibility of a filter on content that breaks many social systems that now need repair. Our technology is changing so fast that we need to think ahead of it to make sure we're ready for it when it gets here. And that's where speculation will save us. At the speed we're going, we can no longer afford to be blindsided.

I read 1984 when I was a teenager and it changed my life. I would never believe that people would fall into such a regime, or allow themselves to be so brainwashed. Then I read the book and was crestfallen at Winston's prediciment. Orwell really knew how to ask "What if?" and how to make you feel for the main character and understand his points on an emotional level. We use the term "Big Brother" now in honor of Orwell's work.

The only thing I felt that was missing from 1984 was a lesson. It wasn't meant to have one of course; "He loved Big Brother" says much more to force you to get your own conclusions. However, it doesn't give good instruction to fight the dystopia. Nowadays, we need it spelled out. Our society is facing the abyss of a Eurasian totalitarianism due to the very filter failure mentioned two paragraphs ago. It's just as serious as the impending crash in the markets, and will blindside us just as quickly, even though people have been talking about it for years before it happened.

Tonight I read a WONDERFUL speculative fiction novel written by Cory Doctorow called "Little Brother". I can link to the entire text because Doctorow in his wisdom released it under Creative Commons. This (advanced) juvenile novel tells of a totalitarian state caused by a second terrorist attack. It was one of the quickest reads I have ever encountered. The story parallels and evokes many 1984 themes; even the protagonist starts off with a handle "W1n5t0n". It grows wildly from this trope though, and extends into many subjects that touch on the state-of-the-art. It hits some very serious subjects in an intelligent manner. The biggest plus though is that it forces you to ask "What if?" and feel it on an emotional level. You really get to care about Marcus and his situation, and compare it to real life. Finally, Doctorow gives us some really good lessons, some of them highly subversive. This is one of the most patriotic novels I've ever read, and it really is a MUST read in our times. I'll be dedicating another post to just reviewing many of the topics of this book in the next couple of days.

These are the kinds of books that need to be discussed in book clubs. Fervently. With high amounts of disagreement. And lots of growth in knowledge, wisdom, and character. We will be discussing this kind of fiction in the S3 (maybe not as heavy, but just as playful).

Okay, now to get some sleep. The markets should prove to be interesting, as there was some aftermarket activity that makes me think tomorrow will be a really down day. Of course the real fun occurs when the short-selling rules are no longer in effect on October 2nd. That day will be filled with a completely different form of speculation, and it won't be good.

Saturday, August 30, 2008

And that reminds me...

It's raining like mad outside
and that reminds me that I need to write in my blog
and that reminds me that I walked home tonight
1 and a half miles
and that reminds me that I copied "and that reminds me" with ctrl-c
because I'll use it a lot
and that reminds me that I composed this poem while walking home
and that reminds me that I'm still creative
and that reminds me why I went out drinking tonight
and that reminds me that one of my great friends got fired today
and that reminds me that today is yesterday
and that reminds me that I recited the poem I'm typing in while I walked home
and that reminds me that I'm blogging after a night of debauchery
and that reminds me that I should be more cautious after I drink
because I am publishing this and I have responsibility
and that reminds me of this great XKCD comic
and that reminds me that CTRL-C allows me to repeat "and that reminds me"
and that reminds me that what happened to my friend was totally not fair
and that reminds me to polish my resume
because companies aren't fair, regardless of how cool they are
and that reminds me that someone could find this poem
and that reminds me that I don't care
and that reminds me that I was yelling this poem
soaking wet
while walking home
and that reminds me that I ran into two people while walking home
also soaking wet at the time
holding hands
and it was sweet
and that reminds me that people in this world are still honest and good
and that reminds me that I forgot half the poem
because I was drinking
and that reminds me that I don't care what I say
and that reminds me that I walk home which is the responsible thing to do when you drink
and that reminds me that my wet clothes are strewn across the apartment drying off
and all of that reminds me that I'm alone
and that reminds me that I shouldn't care
because I'm still known and cared for
and that reminds me that I remembered that people cared about me while I was walking home
soaking in the rain
and that reminds me that people are good in this world
and that reminds me that I have more to write in order to inspire others
and why does that reminds me that I've been drinking?
and that reminds me that I don't drink often, only during life events and social gatherings
and that reminds me how few of those events there are
and that reminds me of how honest I'm being
and that reminds me of how much I've lost
and that reminds me of how hard I'll have to work to gain it back
and that reminds me that I just walked 1.5 miles in the pouring rain to get home
and that reminds me of how sobering an experience that was
and that reminds me of how far I am from everyone that I love
and that reminds me of how fragile and short life really is
and that reminds me of how much harder I need to work
and that reminds me that my sister called me at 1 am to ask me what song that was
and that reminds me that my phone randomly dials people while I'm dancing
and that reminds me that I was dancing
to get my mind off of troubles, to get my mind back in focus
and that reminds me that I was also singing
and that reminds me that my voice will be sore tomorrow
and that reminds me of how many thoughts are wandering in my head right now
and that reminds me of how many thoughts were wandering in my head when I was walking home
soaking in the rain
and that reminds me that I work for a great company
and that reminds me that a great company can do shitty things
to good people
for bad reasons
and that reminds me that I really should keep my mouth shut
but I don't care
because I do care too much
and that reminds me that our lives are forever lived two-faced
to keep a dream alive, to tell the truth to a dream at the same time
in order to kill it
and that reminds me that i've been typing "and that reminds me" out after a while
because I want to feel it, because I want to feel life again
and that once again reminds me of how lonely it is to live alone
and that reminds me that I have a lot of friends that care about me
and that reminds me of my good friend who got fired today
who told me that the most powerful drug in the world
is Denial
and that reminds me that I need to figure out what my life is all about.

that's it. I'm going to bed. Talk to you tomorrow.