Home
Olego's Journal [entries|friends|calendar]
Olego

[ website | My Website ]
[ userinfo | livejournal userinfo ]
[ calendar | livejournal calendar ]

Unknown Inheritance [07 Jul 2009|05:53pm]

1. Pointers-to-members

While a pointer to a member resemles a normal pointer, the two concepts are different enough to warrant a description. A traditional pointer to member points to a concrete object or a concrete function; dereferencing it will yield some data that you can use immediately. In contrast, a pointer-to-member is better thought of as an offset within a class. Here's an example to demonstrate it:

struct S
{
    int m_data1;
    int m_data2;
};

int g_data;

int main()
{
    int * pData = &g_data;
    int S::* pData1 = &S::m_data1;
}

So far, so good. pData points at the data, whereas pData1 points at... Well, this is where the analogy with an offset comes in handy. pData1 is an offset within a normal S object, that specifies which member to use; you still need an S object to use it:

S object;
object.*pData1 = 0;

".*" is a special dereference operator, which is more of an "add offset" operator. This works on pointers as well, so if you had a pFoo, you'd say "pFoo->*pData1" to refer to the member you want to access.

2. Inheritance

Technically, there are only 3 inheritance patterns in C++: single, multiple, and virtual. Single - inherit from 1 parent. Multiple: inherit from many parents. Virtual: inherit from parents that probably have the same root parent, and avoid carrying duplicate definitions of the base parent.

Unknown inheritance is not actually an inheritance pattern, but it's still something that the compiler writers need to implement--when they examine pointers-to-members.

3. Memory

Those of us who'd grown up on x86 (which is all of you, actually) feel pretty good about the number 0. 0 is NULL, and that's all there is to it. A NULL pointer is always 0, and calling ZeroMemory on a struct is considered an okay way to initialize it.

But this is a dangerous notion to carry, for a couple of reasons:
* First, code that doesn't run on x86 doesn't have to have its NULL pointers be 0 in memory. If you reinterpret_cast(pointer), you may discover some bits that are set to 1!
* Second, this is exactly what happens with pointers-to-members! A pointer-to-member is an offset, so if it's pointing to the first data element, the value of the offset will be 0. But it itself is a pointer, and pointers can be set to NULL. See the problem?

    int S::* p = &S::m_data1;
    int S::* q = NULL;

Since you can't reinterpret_cast from one to another, fire up your debuggers and examine the contents of p and q. P is 0, as promised; but q is the surprise: in Visual C++, it's 0xffffffff, which is a special value that the compiler uses to indicate a NULL pointer-to-member. See why you have to be careful about using ZeroMemory now?

4. Inheritance and sizeof()

If you take the sizeof the pointers to members in the previous sections, they'll all be 4 (on x86), which is expected. You may even wonder why you can't reinterpret_cast that value to an int.

Here's why: the more complicated the structure gets, the more bytes you need to represent it. If you have a pointer to member data, it almost always stays at around 4 bytes. If you have a pointer to a member function, it's also 4 bytes, until you involve inheritance. If your struct inherits from multiple parents, you'll need 8 bytes. If your struct involves virtual inheritance, you'll need 12.

And in one special case, you may need all 16:

struct S;

int main()
{
    cout << sizeof(int (S::*) ()) << endl;
}

In this case, S is not defined; but the compiler nonetheless needs to represent an offset to a member function that takes no parameters and returns an int. Since the definition of S is not available, you don't know if you have single, multiple, or virtual inheritance; you know nothing about the struct; so you better pack as much info as you can. At least, that's what VC++ does. And this is what's called "Unknown Inheritance".

Now, you may have noticed an inconsistency: if you have a definition of S, then the pointer takes only 4 bytes. If you don't, then it takes 16. So if you pass a pointer to a member function from one file with the definition to another without a definition, what would happen? The answer is that most people don't use unknown inheritance, and the compiler optimizes for the majority case by using fewer bytes. However, if you need strict compliance, you need to pass in the special flag (/vmg for CL.exe, see http://msdn.microsoft.com/en-us/library/yad46a6z(VS.100).aspx) to make sure that ALL pointers are 16 bytes, and that you never have an inadvertent size mismatch between your pointers.
[2 archived notes] [Drop a note]

Perks of Working at Microsoft [10 Jun 2009|01:21pm]
[2 archived notes] [Drop a note]

Answers [18 May 2009|03:10pm]
[ mood | awed ]

I've never been as shocked by technology as I am now:

http://www.wolframalpha.com/screencast/introducingwolframalpha.html

This isn't a Google killer (though it IS a Google Calc killer), but this is the most definitive step in the right direction in the field of "information retrieval" since Google.

[1 archived note] [Drop a note]

Separate Realities [15 May 2009|11:47pm]
[ mood | sleepy ]
[ music | DI.fm - Trance Channel ]

One interesting and difficult problem about constructing artificial intelligence is the fact that in reality, and in our heads, all information is tied to a specific domain. We, humans, are surprisingly good at discerning the topic being discussed: instead of storing all our memories sequentially, we categorize and tag them, and "write them out" into the appropriate database, a.k.a. domains. The complication comes from the fact that these databases themselves need to be categorized.

And different people have different ways of dealing with this task. Suppose you're reading Stephenie Meyer's latest noel, and you realise that instead of burning in the sunlight, the vampires simply shimmer. Being an avid vampirologist, you realise that it's bollocks, but you want to continue reading the novel nonetheless. While you have a couple of options, the route you'll take most likely will involve a construction of a separate reality. You'll say, "While usually the vampires burn, when I'm in the domain of Twilight, vampires shine." Upon closing the book, you'll tear down this new reality and return to the current one. And when someone asks you, "Why do vampires avoid the sunlight?", you will now first have to figure out which vampires the person is referring two, because there are otherwise two valid answers to the question.

The alternative, of course, is to deny the existence of multiple realities, and to choose only on truth to hang on to. It's much more succinct, requires less imagination, but can be limiting. If you can think of this as one extreme of the spectrum, then you'll be correct placing me onto the other.

I noticed this about myself a few months ago: almost every time I encounted some information that contradicts with what I accept as the truth, I split off a new thread of reality and incorporate the new factoid into it. I always try to minimise the imaginary reality, but I also try not to lose anything. More importantly, following the principle of lazy argument evaluation, I don't verify the validity of the statements in one reality against other realities: I can simultaneously be thinking two opposite forces, provided that they're contained in different worlds.

It's passive. It lets me play along and interact with people I wouldn't otherwise be interacting with. It allows me to build an adapter for others' thoughts, and communicate with them. Partially a defense mechanism, I communicate out of my world only with people I'm close to--since that would require me to reveal the truths that I hold dear. It does present philosophical dilemmas about truth and honesty, since those are no longer absolute. (Technically speaking, nothing has ever been absolute, but this is even less absolute.) At the same time, it helps resolve them.

A paradox? Not in the least. How many of you, Gentle Readers, have been frustrated and irritated in the past? Anger and willingness to break objects may seem like best responses at the time, but thinking back suggests that violence is not the best answer. Am I a different person when I'm annoyed? Am I unstable if my mood ever swings? No: I'm just subconsciously swapping one reality for the other... And so does everyone else... And since I can't be certain about what others believe, the only way I can understand them is by creating these realities.

Now, if only I didn't lose so much sleep to these musings...

[Drop a note]

Techy [30 Apr 2009|02:14am]
[ mood | sleepy ]
[ music | DI.fm - Chillout Channel ]

OMG, want! )

In other news, I've successfully installed a media player on my newly-acquired Magellan Maestro 3200. It's not as nifty as other Magellans (some even render buildings in 3D!), but after using it for a little while, I have great respect for the device. So far, there is only one feature that I don't like, and that is not being able to scroll the 3D map around while zoomed out--I need to switch it to 2D mode first. In all other aspects, it's great! And the Hacks made it even better: 10x the number of Points of Interest, a file manager, even an offroading GPS application. (Navigator.exe is just an app running on top of Windows CE Core 5.0 on an ARM920T processor.)

However, I took all of those off, and replaced everything, because they weren't rigorously tested by the hobbyists, and the unit kept rebooting (but not bluescreening!). Now, I have fewer POIs, but I can drive in peace.

[Drop a note]

Ill-Structured Problems [15 Mar 2009|03:17am]
I have a particular dislike for Ill-Structured Problems. (And please pardon me for skewing the definition of the term for my own needs.) The most famous one, of course, is the Nine-Dots problem: without lifting the pencil from the paper, draw four straight lines, so that they go through all of the dots?

But before discussing its solution, take a look at a different problem first.

The problem states that even a first-grader can solve it. It's not a fixed problem, and it goes something like that:
1017 = 1
2596 = 2
4153 = 0
6074 = 2
5153 = 0
0000 = 4
1111 = 0
2222 = 0
1259 = ?
I won't really torture you with this problem, because I don't think it's in any way remarkable. The solution is simple: count the number of little circles in the representation of each digit. 0, 6, and 9 are worth 1 point each, while 8 is worth 2 points. The answer is 1.


So why is this an ill-structured problem? Because when I see a math-related problem, I automatically assume that the it's related to, you know, math, and use Mastermind-like induction to solve it, without relying on looking at the shapes of the numbers. But that's not the actual reason for my disliking the stock solution. The actual reason is this: the solution is intrinsically tied with manipulating the assumptions. And what are these assumptions?

Maybe my brain is different from yours, but in addition to having a part dedicated to language, and a part dedicated to shapes, I have a part dedicated to numbers. Numbers and digits get put into their own category. Четырнадцать, fourteen, and 14 are three different entities, that are eventually tied into the same concept, but are processed separately. The numerical representation of 14 is devoid of words and shapes: it's concurrently 2*7, and 6+8, and 10+4. Since I grew up in base 10 (but of course, every base is base 10), I'm much slower doing calculations in other systems; but as long as there is a way to represent each digits from 0 to 9, I'm good to go.

So that means that if 2 were replaced with 'F', and 8 were replaced with 'Z', and I trained myself for a week to adapt to the new language, then I would transcribe the problem "1259 = ?" into "1F5Z = ?", and use the same logic to solve it. But those counting the circles would not, because they would be relying on this underlying assumption: "The problem is valid only when using Arabic Numerals."

The same discussion can be applied to the original 9-Dots problem. Here are two different solutions. I came up with a third when contemplating writing this entry: assume a non-Euclidean geometry: the nine dots are on a sphere, where the first three are on the 0° longitude, the last three are on the 90° longitude, and the middle three are, consequently, on the 45° longitude. The top and the bottom rows are on the +45° and -45° latitude, respectively, and the middle row is on the equator. Each of the three straight ("straight" as defined by the non-Euclidean geometry) lines goes from the north pole to the south pole; each of the three lines intersect at both end points, and cross all 9 dots. A fourth line isn't even needed.

Sure, I've just shown you many ways to hack the problem. But each of them requires removing some implicit assumption: either that the solution can extend past the square containing the nine dots, or that we're no longer planar. I'm pretty sure one can imagine a multiply-connected space, such that even 1 straight line would suffice. The real trick to arriving at a given solution is saying, "Okay, even though most puzzles require solution to fit inside the space provided, OR assume 0-dimensional points instead of 2-dimensional dots, OR assume Euclidean geometry, this one doesn't." So what's wrong with that?

What is wrong is that these puzzles are praised because they require "thinking outside the box", whereas in reality they are just eliminating an implicit assumption, and seeing whether the contestant is able to catch up. That's okay if it's disclosed beforehand, but since puzzles require highly-constrained hypothetical situations, clandestinely removing the constraints is just that: lying. Why such a strong disrespect?

Because most of those who use that phrase are usually looking for open-minded students or employees, and are usually unaware of the implications. While it's a given that talented people can come up with novel solutions, the converse--that novel solutions are created only by talented people--is just not true. A dramatization of this issues is in the famous setup of having two strings hanging from the ceiling about 10 feet apart, of the problem of having to tie them together, and of the solution of tying one of the strings around your shoe, swinging the shoe, and using the momentum to catch the first string and tie it to the second. Well, another solution is to pull on the first string, break it off, tie it to the second, and declare the problem solved. But is that what "talent" is about?

Actually, no. Talent requires grace, beauty. The best solution is usually the simplest one. In software engineering, it's also the one that runs the fastest, and is the easiest to maintain. A systematic approach will generate better solutions to 95% of all problems than hap-hazard "thinking outside the box". Hacking one thing here and one thing there, ignoring or bending the assumptions, can also lead to working code *now*, but if later someone tells you "non-Euclidean geometry prohibited", or better yet, "the digit 8 is replaced by Z", the methodical solution won't break down and give you a headache, stealing hours of your time. And the answer "given the constrains, there is no solution" is a lot more valid than "if we remove a constrain, then we can do it." Problems have constraints for a reason. If you want to see how well a person deals with removing the constraints, state so in advance; otherwise, the only people solving such puzzles won't be "open-minded" enough to solve anything requiring good old elbow grease.

P.S. This especially applies to all single-language, or "punny", problems. If the problem is valid only in English, then it doesn't belong outside a comedy club, where the rest of the puns live.
[6 archived notes] [Drop a note]

Infra-red [09 Mar 2009|01:04am]
While the infrared bar that must be placed on top of the TV is invisivle to the human eye, a camera equipped with a night mode can detect them quite well. This is what they look like. )
[5 archived notes] [Drop a note]

"Shortcut to" [05 Mar 2009|07:00pm]
[ music | Roger Shah presents Savannah - Body Lotion (Inspirations Mix) ]

The easiest method to prevent Windows XP / 2003 from adding the text "Shortcut to XYZ" for new shortcuts is outlined here: http://support.microsoft.com/kb/253212 And it works! Well, worked--they removed the feature in Vista. *sigh*

[Drop a note]

Tech Support [02 Mar 2009|11:56pm]
All software engineers should watch Medieval Helpdesk. If you don't have the patience for the whole 3 minutes, at least watch the last 30 seconds. It illustrates the not-well-enough-known "grandparents" problem: how do you explain the computer to your grandparents?

Take a concept of a window. Sure, a window, in Win32, is represented by a handle HWND, and is created using CreateWindow with a class registered using the RegisterClass() API. Too technical? Okay, then a window is a rectangular picture that can be dragged around, minimized, or closed. (My grandparents like to use the word "frame", because it certainly does not look like a window to them.) And a menu is... Wait, what's a menu? You sometimes have to right-click, sometimes double-click, but sometimes only single-click?

On a more philosophical level, only in the last two centuries has technology really advanced far enough that there is a divide between knowing how to use something and knowing how it works. Take the abacus: you learn what it is by learning how to use it. Same with a hammer, or a matchbook, or a mirror, or a musket that you have to clean and reload after every shot. Once you introduce the telephone, the radio, or the television, you must create concepts to describe the things that most people will no longer observe: electromagnetic waves, the electron gun, amplitude modulation. Computers are a few steps above that, with objects that don't even exist. On a typewriter, if you press a key, the hammer strikes the paper, and you see a letter. On a computer, if the "window" doesn't have "focus", then your text disappears into the void. By now your concepts are so abstract, that none of the things you do are actually real. Your brain is forced to carve reality out of these digital concepts.

Which is easy when you're young; but if you spent 60 years of your life with typewriters, a pop-up dialog box is something you'll have a hard time visualizing. So make UI as intuitive as possible!
[1 archived note] [Drop a note]

Acrobats [02 Mar 2009|11:37pm]
+1 to the monopolies: Adobe wins again. I've removed FoxIt and installed Acrobat.

Why would I do such a thing? Simple: FoxIt is written for viewing static documents, and does not handle filling out any forms. Unfortunately, I spend a lot of time on www.uscis.gov, and all the PDFs there happen to be interactive, with fillable text. FoxIt, even the most recent version, chokes on all of them. Be warned!
[1 archived note] [Drop a note]

Translation [20 Feb 2009|03:38pm]
I want to translate a book Metro 2033. Even though there are rumours of an actual translation, it won't be done by the end of the year, and if I can get some help, I can realistically translate it by summertime.

But I need help:
(1) A Wiki site to post the translation I have a Wiki: http://metro2033.wikidot.com/start
(2) Proofreaders, because my English is not perfect

What do you guys think?
[2 archived notes] [Drop a note]

Brilliant [04 Feb 2009|01:05pm]

This took me a second to get, but wow! :-)
[4 archived notes] [Drop a note]

π, e [25 Nov 2008|01:43pm]
[ mood | amused ]

Reading Wikipedia has reminded me of a couple of things from my college years. I present them here with a form of a poll. If you could request a historical do-over:

(1) Would you change the value of π to be 6.28, i.e. double the current value of π?
(2) Would you change e (the charge of an electron) to be +1.602 × 10-19, i.e. positive?

[5 archived notes] [Drop a note]

PSA [19 Nov 2008|11:52pm]
If you ever plan to sleep or have someone else sleep on an inflatable mattress, buy an electric throw today! Place the throw on top of the mattress but underneath the sheets, and turn the temperature to medium. The results are incredibly comfortable, almost like sleeping on a water bed.

(Walmart is currently selling Sunbeam electric throws without the 3-hour auto shut-off crippling mechanism. Both Target and Fred Meyer are lagging behind on their merchandise.)
[Drop a note]

Halloween [03 Nov 2008|12:12pm]
Damn it feels good to be a gangster. )
[7 archived notes] [Drop a note]

Perl + Batch? [08 Oct 2008|07:22pm]
I saw this trick today, and it totally blew my mind. Read the next few lines carefully.

@REM = ' = Perl in Batch = ';
@REM = ' = Read this carefully
@ECHO OFF
perl -w %~dpnx0 %*
goto :EOF
';
print "Hello, now I'm in Perl!\n";


While it's true that `perl -x` can be used to accomplish roughly the same, the trick above is just... beautiful.

(Source: http://www.informit.com/articles/article.aspx?p=29328&seqNum=5)
[Drop a note]

[04 Oct 2008|10:18pm]
Click! )
[Drop a note]

[04 Oct 2008|10:13pm]
[Drop a note]

Twinkling Thoughts: Into the Subconscious [08 Aug 2008|06:35pm]
[ mood | introspective ]
[ music | Airwave - Trilogique ]

(Possible mistranslation.)
Knives: Did you have fun living as a human?
Vash: Yeah! It was the greatest!
My first serious foray into my own mind happened in December 2000. I don't remember much besides the conclusion: after trapping myself in my own thoughts, I forbade myself to attempt to control my emotions in any way. My depression dissipated on its own, and the lesson I began to learn (but would continually fail to grasp for almost eight years) was that emotions express themselves regardless of how much I try to prevent them.

I would not address this issue until a few years later, when I would attempt to side-step the realisation to make myself happy. Though I knew that I could not affect my mood directly, I would try to build mental scenarios, recreating my present situations, and attempt to change certain "parameters" to figure out what exactly made me uncomfortable and unhappy. I was hoping to notice something obvious and resolve it quickly, but I was actually merely learning the skill of paying attention to my thoughts.

My final bit of understanding happened only recently. The insight came from a necessary ingredient that I was missing previously: confidence. I had an emotional reserve of emotional responses that I knew were "right"; knowing myself to not be a fickle man helped me understand that when my mood suddenly changed seemingly without any external causes, in order to figure out the causes I had to look more broadly and more carefully at my own heart and mind, letting go of my past preconceptions. I had to listen to the whispers of my thoughts.
Now that his attention was drawn. to it, he could make it out clearly. There was the tiniest tendril disarrayed — an abnormal disarray.
A complete discussion about 1984 and the importance of language belongs in another essay; but the general concept has come up a number of times when I tried to understand myself. Since the journey to self-awareness is still regarded as solitary by most societies, it is not widely discussed. It is hard to solidify my emotions into concepts, and pointless to condense them into words; but the concepts are there, whether or not I can explain them precisely.

I used to think that thoughts and emotions are the two fundamental categories that controlled everything about me. It made sense: I could logically analyse myself and come to wise conclusions; I would engage in various activities and experience consequent emotions; and there was nothing more to the story. This simplistic view was inadequate, since it could not explain low self esteem and procrastination; but I did not heed those for a long time, and thus had no need to update my outlook. When I did start paying attention to esteem, I had a really hard time discerning its source. I thought to myself: "Look, I'm a student at a prestigious university / I have a good job, my am I unhappy?" Since I never considered the possibility that the unhappiness stemmed from inside of me, I would always look for external aggressors, pointing fingers at individuals close to me, or at the collective society. I stopped doing that when people close to me would get hurt, and rationally explain to me that they are in no way the reasons for my moods. I'd agree with them, and be even more confused. I'd go back and try to hack at my mind, reversing the flow and pacifying myself. Since I didn't have a clear understanding of the causes, though, I never succeeded; I'd merely exhaust myself and start thinking about other issues.

One piece of insight I developed accidentally, when I was slicing the concept of love into different layers, such as "friendship", "attraction", "respect", etc. In order to become comfortable with the idea of love as a composition of various emotive groups, first I had to accept my lack of control over experienced emotions. If I enjoyed something (let's pick cookies as an example) even when some obscure bias would tell me that I shouldn't enjoy it, I would constantly seek ways to be near cookies, but still prevent myself from consuming them. This confusing struggle made sense only when I accepted that I like cookies whether I want to like them or not; and that it wasn't liking cookies that was wrong but trying to prevent myself from eating their delicious goodness.

I shed many chains as I applied that concept to my strange self-imposed limitations. I was happy - and free - letting my emotions flow freely, observing them from the side without interference. Happiness is a great medicine. But happiness doesn't last forever, and eventually my unresolved esteem issues took over, putting me back into an uncomfortable state. I was baffled by the change; I knew that I could not sustain any strong state, happy or sad, for a long time, but I still wanted to know how to undo the unfortunate plunge.

Now, armed with past experience, I once again dove into my mind and listened. This time, however, I no longer thought as thoughts and emotions as separate: just like love can be sliced into layers, so can thoughts, rendering four separate categories:

* Logical thoughts are the same as always. If I block everything else, I can still function with great efficiency, relying on my self-control to get through the week and figure myself out on the weekends. There is no joy to the logic; there is pure existance.
* Expectations. When someone asks me what I want for Christmas, I have no idea. Ignoring this part has placed me into a number of unfortunate situations; only paying attention to myself and actually doing the thing that I require leads to eventual happiness.
* Reactive thoughts are the tendrils that are extremely difficult to notice, but are a great way to discern your true expectations. They are the stars of the following paragraphs.
* Energy is what shields me from negative emotions when the negative emotions try to overwhelm me. The hour after I come home from work is the hardest: I'm too drained to feel happy, and only rest allows me to do something to eventually cheer myself up.
He was terrified to learn cause and effect, life and death, body and soul. There no longer were good and evil, right and wrong. There were concepts, concepts that could not me written on expressed.
The simplest way to understand concepts is to wait until the morning, before I'm fully awake. I listen to how I feel and present myself with a single, insignificant thought. Even when the thought is forming, before I can verbalise it or "launch" it, it slips into the sea of synapses and produces an immediate response. An interesting psychological experiment demonstrates a similar concept. Our brains process an immense amount of information; we are privy only to the results. Noticing reactive thoughts before they solidify as emotions is already incredibly difficult - and this is with a single mere thought. Imagine the silly (and utterly pointless) Game - whorever thinks of The Game, loses. Our brains leave us with no way to win: since the synapses process all your thoughts concurrently, you will reach the conclusion "I shouldn't be thinking about Subject X" only after you will have summoned a dozen flashbacks to a famous movie, some board games, your friends, your own mind, and who knows what else.

That is exactly the reason why my previous attempts to change my emotions would always fail. I'm be fighting a battle against my thoughts - perfectly valid thoughts that vastly outnumbered my intent - failing to catch up with myself, and merely exhausting my mental energy on nothing. The culprit would always be the current situation, and the solution (which I so often overlooked) was to peek into my own expectations to choose a new situation that would make me happy. I use the word situation vaguely. A situation is a set of commitments, actions, and expectations. Not all of those can be changed, but those that can be changed necessarily must be. Take esteem. Suppose that in an ideal world I would want to run 5 miles every day. I currently don't jog, and seldom think about jogging, but every time I would see a runner, a shimmering thought in my subconscious would trace back to me thinking that I should to that. Without detecting that thought, the chain reaction would continue to "I should do that, but why am I not?", "What did I do last night?", "Why was I so tired - I'm too weak", "Being weak is another unwholesome quality". After bouncing around a few more times, the thought would finally extinguish, but that part of my mind would generate a negative mood that would eventually make me frown.

In fact, sometimes my own thoughts would get so vicious that they would try to take over my logical thoughts, and prevent me from donning my running shoes! A drawn-out battle would lay waste to the planes of my mind, and result in discomfort and dissatisfaction. All because?

This is one of the remaining mysteries: what is the origin of these expectations that I seem to regularly fail? How do I find peace in myself, accept myself as "good enough", and move on? What is the set of good personal qualities that would pass a Quality Check? But the good news is that I finally have the tools to figure it out. By capturing the rogue thoughts, asserting myself that there is hope, and calming myself to contentment, I am making progress. Now, I just need time.
[4 archived notes] [Drop a note]

Power [08 Aug 2008|04:19pm]
Man, the build labs get all the toys! Screenshot )
[1 archived note] [Drop a note]

navigation
[ viewing | most recent entries ]
[ go | earlier ]

Advertisement