Friday, December 29, 2006

Being there, again

I watched Being There again with my sister a while ago. I can't help noticing how faint is our relationship with reality and with what we consider to be true. Ah, the endless times it becomes evident every day.

The way in which we react automatically to certain words. The default way of interpreting things. The same gestures, the same ideas, the same thoughts, the same manner of speech.

And then you see it in older people whom you knew when younger. I cannot escape the feeling that when we get older and our behavior becomes a bit strange, it's not really weird or foreign. The behavior patterns were always there, only now they are not modulated as well as before. Thus, they do not resonate as well with the environment... a bit as if more debuggers came up, but more and more with a default handler that just proceeds.

Some experiments I've done this year seem to confirm this line of thought. The contest was about creating a program that followed extremely simplistic rules. Other simulations I wrote in the same framework confirm the power of proper modulation of even naive behavior tendencies.

Life... what a strange phenomenon.

Wednesday, December 27, 2006

Two presentations at Buenos Aires

Still with barotrauma, I gave two presentations last week. Last Thursday, I presented Writing Truly Efficient Smalltalk to an audience of 10-15 people. You can see some pictures here (thanks go to Esteban Maringolo for making them available). There is Spanish speaking footage recorded in a MiniDV tape, but I have not had a chance to make a proper video out of it yet.

On Friday I presented a beta of a new presentation which I hope I will have a chance to share soon. Alas, I cannot talk much about it yet --- so, for now, let's say it's very attractive :).

Monday, December 25, 2006

When greed turns against you

Of course, we live in a society that rewards making money through innovation. But what happens when, in the case of Microsoft, you are unable to produce true innovation?

Without going through the technical reasons, such as "Vista builds in 24 hours" and "the tests run in 3 months", the issue here is that when you cannot come up with a new idea, then sometimes you end up doing things that in the long run just damage you.

For instance, this lovely description of the content protection mechanisms in Vista. You should read it thoroughly, paying close attention to details. To summarize,

  • All PC hardware will be more expensive, and their drivers more bug prone, due to Vista. In particular, if a flaw is found in a hardware design that could allow you to access premium content when you shouldn't, then Microsoft can revoke your rights to use such hardware remotely. This means that if you make a big investment in, say, a video card, it can become worthless overnight due to a glitch. And OBTW, do you remember those disclaimers now? The price hike has been estimated at about 20% --- and this will apply to you whether you use Vista or not. Mac user using standard PC hardware? I am sorry for you too!
  • Part of the price hike you will pay in hardware is to support end to end encryption of premium content. This means your motherboard, your video card, your audio card... pretty much everything, will have to support AES. This means increased power consumption and decreased hardware functionality (as you pay more to get the same, plus AES capable hardware). In some cases, this means increased CPU usage due to e.g. playing a CD in the background. When the CPU can't cope with video decoding plus encryption, then encryption will have to be handed off to the video card --- which means further obfuscation of the bus channel between the CPU and the video card. The list of places where your dollars will have to do extra work goes on and on. And mind you, some hardware devices have been made incompatible with each other to support this.
  • This offers a perfect opportunity to make a mess of Windows based servers. A worm just needs to make sure the copy protection is tripped, and then performance goes down the drain. The secrecy that blocks details about how the copy protection is enabled prevents you from figuring out what the heck is wrong with the box. I am sorry for you, but Vista always knows better.
  • In addition, hardware must support tilt bits (just like in pinball machines, which detect excessive rocking). Drivers will have to wake up 30 times per second to confirm everything is fine --- that's more useless CPU usage for your high performance box to take care of. And what if there's a hardware glitch that trips a tilt bit every so often, such as "voltage such and such is off by more than the threshold"? Then your box will perform horribly and Vista will get angry with you.
  • There is much more in there, to the point that content providers are dictating the layout of motherboards.
  • Also, I am sure businesses will like a 20% productivity tax on new hardware which will underperform and thus be a bad investment, when employees aren't supposed to be watching movies at work anyway.
All of this mess so I couldn't just purchase a stupid HD player for $50? You have to be so much smoking illegal stuff to come up with such garbage.

Thus, the responsibility comes to us. Because it will be our fault, and our fault alone, if we let this approach succeed by spending even $1 on those abominable shiny new products full of glass beads. So which one will it be? Are we too addicted to the latest stuff that we can't stop shooting ourselves in the foot?

We shall see, my friend.

Thursday, December 21, 2006


So what happens if you take a plane trip when you're congested? Well, of course, your eustachian tubes may get clogged. That means that your ears will not be able to regulate their internal pressure to match that of the environment.

Thus, the plane goes up and the pressure goes down. The internal pressure in the ears is higher than that of the environment, thus the excess comes out through the tubes into the cloggedness. So far so good.

Then the plane goes down and the pressure goes up. The internal pressure in the ears is lower than that of the environment, thus the deficiency should be replenished via the tubes. But since they are clogged because you're congested, you are out of luck. As pressure mounts, it becomes uncomfortable. Then you stop being able to hear properly because your ears feel plugged. Nothing fixes it. Then, as air still cannot fill in the relative void in your ears, it starts pushing more and more against anything that stands in the way --- such as your eardrums. Thus, now you are in pain.

Once on the ground, your ears are still clogged. But not so fast my friend, you still have a 10 hour plane ride to go. So once more, up there you feel great, and when you come down this time is extra painful because the pilot goes down much quicker. Lovely.

The doctor advised me that this abuse could have easily resulted in busted ear drums (hence your ear bones and other parts are exposed to air, but more importantly to bacteria, thus the continuous infection etc --- time to heal 2 months, and perhaps you can still hear after that), or busted circular membrane (my ignorance prevents me from elaborating further on this one)...

... but that in my case, it simply meant that assorted liquids had flooded the inside of my ears. This happened between Sunday and Monday. Only today, Thursday, I can hear more or less properly. Fortunately, there is no permanent damage.

So my friend --- do not fly when congested!!!

Tuesday, December 19, 2006

Seaside Parasol --- Smalltalk Web Hosting!

Check it out here --- Smalltalk web hosting, all for you!

Sunday, December 10, 2006

FTP mirror available!

I will be gone for three weeks starting next Sunday. During this period, and until January 6th, the main FTP server will be shut down. However, Anthony Lander is generously providing a mirror site at this address:

The files will soon be available for download over there as well. Thank you Anthony!

FTP news

By popular demand, I am preparing lower resolution versions of the videos so they are more hardware friendly. These new files will have their resolution cut by 4, so instead of being 960x480, they will be 480x240.

Although the resolution is lower, DivX is doing a great job of keeping the file size down while still maintaining relatively high quality. The consequence of lower resolution, however, is that the projected slide/code will become more unreadable. I am happy I read it aloud while pointing at it!

These new files, along with a .gif set of slides for the presentation Writing Truly Efficient Smalltalk (so you don't need powerpoint), will be available for download within a couple hours or so.


The 20-80 rule

I have come to think that the 20-80 rule does not help us get in a mood in which we can do our jobs most effectively. Only when 100% of the features are implemented, we can call ourselves successful. But obviously, implementing 100% of the features is going to take 100% of the time. Who cares which features take more or less time, or which ones are fun or boring to implement?

Therefore: whining forbidden --- go back to work!

A matter of bandwidth

My mom is a professional pianist, and she insists that for her music does not translate into words. However, when I listen to things she suggests, I find no problem in coming up with some lyrics or explanations for what I am listening to.

For example, I described the Spanish Dance no. 5 by Granados in terms of "people carrying out their duties, feeling honored in their obligation to do so, and yet... longing for the times of fun they desire, even though they know such entertainment is to be unavailable to them".

I commented this to Blaine a long time ago, and he urged me to blog about the explanation I came up with. I do not think it's perfect... it might be horribly wrong... but hopefully it is of use, and if it turns out to be defective hopefully a helpful reader will gracefully provide a proper correction.

So what is this ability, how does it work, and why could it matter? Well since structured language is left brain work, and emotions are right brain work, it seems to me that to put music into words or viceversa, one has to have good bandwidth between the two hemispheres. In other words, it appears to works best when there is a detailed map between certain areas of the left hemisphere the activation patterns of which result in certain words, and certain areas of the right hemisphere the activation patterns of which are caused by the music being listened to.

That leaves the matter of why does this matter at all. Well how am I supposed to feel that a program that I write is beatiful if I do not have a map between the part of the right hemisphere that evaluates beauty and the part of the left hemisphere that produces Smalltalk code? How could I tell, before writing it, that a certain approach is attractive or repulsive? How could I use this subjective sense of art to guide the rational process of writing programs, so that the proper decisions can be made when there are many choices available? Even more profoundly: how would I know if the options I have are enough, or acceptable at all as a whole?

I went to a concert a couple nights ago, and well... some of the compositions made me remember chimpanzees: when they talk with sign language, their sentences are very short and only use a few words. The longest sentence on record, spoken by a chimpanzee, has 14 words and it goes more or less like this: "orange orange give me orange give me orange give give me orange orange give me!". And in the same way that some of the compositions did not have elaborate musical phrases, each of the bars in the music sheet felt like a sentence consisting of a single word. Sad? Set of minor key chords. And what do the lyrics say? This: "... sadness this that...". Well, of course!

But the fact that the music is being literal towards the text is not what I found deficient. After all, great composers such as Ravel have produced very literal music such as the first piece of Sheherazade, called Asia. But what sets Ravel apart is that his musical phrases last for several seconds. His musical sentences have many words, and they are connected to each other artfully. If you have not listened Sheherazade, I'd suggest that you get a recording sung by Jessee Norman... most enjoyable.

And then, how does that relate to code, what I think is one of my arts? Indeed: I write code using a thesaurus. I look for the right words when I do not know them. I do not use selectors that denote meaning vaguely. I only write methods and classes after long consideration. I try to do most of the work, the design of the pieces so that the system has interesting emerging properties, in my mind --- before I press any key on the keyboard.

This, finally, brings me to the conclusion. If, in order to be artful, one has to use thinking bandwidth properly and efficiently, then how should we work to begin with? Let's play the renaming game once more. Think about how modern computers work, and what affects their performance. In short, the following bullets summarize most of the patterns we observe. The closer the information needed to carry out an operation is to the place where the operation is performed, then:

  • the less room there is to store such information, and
  • the faster the execution of the operations will become.
As you can see, this follows Zipf's law. You have a cpu, then you have registers, caches of various levels, RAM, hard drives, tape backups, and so on. In particular, we also have ethernet --- far removed from the cpu.

Then, let's rename things and see what happens. First, CPU becomes brain. Registers become the 7 plus minus 2 slots of scratch ram. Caches become our short term memory. Ram becomes our mid term memory. Hard drives etc become our long term memory. And, critically, we do not even have ethernet. We have these serial ports to communicate with our environment. Thus, if we are to be productive, we need to be truly efficient when communicating with our surroundings!

That immediately leads to concluding that most of the work should be done in our minds. When you first think of a problem, the worst thing you can do is to immediately write code. Because guess what: it will force you to think through your serial ports. Hacking things together, a calculated tradeoff between quality and speed, is caused by our first action: to write code we know to be deficient.

No, my friend. Think it all up in your mind, and when you have stable parts that tend to stay fixed as you design more and more of the solution, then write those parts only. Things that change should stay as close as possible to your cpu, in the 7 plus minus 2 scratch ram slots. It is almost obvious to state, but aren't computers inefficient when they thrash the paging file? Imagine now thrashing the paging file via a serial port. No way!

Finally, which language are you going to use through your serial ports? Something that makes you write tons and tons of syntax sugar? Of course not, because that will make you pervasively inefficient! It is bad enough that we have to communicate over a serial port. Why do we need to saturate the serial port and fool ourselves into thinking 100% average utilization is progress?

Excuse me, but have you seen the latest incarnations of generics? No, no, and one thousand times no. Why do I need to replicate everything I am thinking about over the serial port? That will also make me inefficient! Sorry man, I do not want a journaling thought system running on a serial port. Not only it is slow --- then it also has to have error correction. And when that is not enough, then I will also need version control of the external journaling thought system. All this overhead over an extremely low bandwidth connection causes me to waste time into things that have nothing to do with thinking about my problem!

So, my friend. Give me something like Smalltalk, where if I want generics I just implement a message and let the generic function be defined implicitly by means of polymorphism. That is so much cheaper and less costly! And yet, the access to the whole generic function can be accessed on demand via a menu item called implementors. That is it, no extra costs, and no overloading of my serial ports.

Then, with all the free time I will have when I do not have to stare at the serial port traffic completion dialog crawling from 0% to 100%, I will have the time and energy to do something much more valuable: make sure that the stable code that coalesces from the fog in my mind is both beautiful in terms of aesthetics, and beautiful in terms of its ability to withstand change. Only in my mind, with all the important things sitting in scratch ram slots and memory caches, I will be able to do that efficiently.

If code can resist change, then it is less likely that I will have to rewrite later on. And if I can find tiny code that is beautiful, artfully written in all the ways I described, then you can see what is going to be the development efficiency of version 5.0.

As the title of this post suggests, addressing these issues properly is a matter of bandwidth.

Monday, December 04, 2006

NYC SUG video available for download!

The video for the presentation Writing Truly Efficient Smalltalk, together with the slides, are available for download at the FTP server. Enjoy!

Grotesque does not know frontiers

I just read* about a judge that, in a case of manslaughter due to negligence while driving a vehicle, reduced the amount of damages to be awarded to the family of the 19 year old deceased by a factor of 7.5 --- exclusively because the dead teenager was born poor, and "obviously" he was not worth as much as someone else born to a richer family.

But it gets better. What were some of the reasons given by the plaintiffs as to why damages similar to those of other equivalent cases should have been awarded? Not because of the loss of life, nono. Because now, after adopting the kid and bringing him up, the investment of the parents would not be rewarded with their son's potential help after they retire and stop working.

Gross, man... absolutely gross.

And where did this happen, you ask? In the lovely country where I was born, Argentina. There is talk already about sanctions to be applied to the judges on the grounds of discrimination. But as much as I want proper punishment to become true and proper damages to be awarded in a non discriminatory manner, I also wish loss of life was considered to be more important than getting money from your sons when you're old. Is cash what matters the most, even when it comes to your kids being dead or alive?

Alas, this kind of thinking is so pervasively common these days. Have no decent job? Then you don't have health insurance either. Can't pay under minimum wage? Move the jobs to a more poor country (and still do not provide decent benefits to your slaves I mean staff). Poor country with a lot of oil**? Hmmm...

No, my friend. We are not any better.

* Know Spanish? Here is the link.
** Name at least three.

Sunday, December 03, 2006

More video editing coming up

The 17.3gb file is now sitting on my main computer hard drive. From there, it needs to go to the much faster laptop for editing and compression. Thus, the footage from NYC's Smalltalk User Group meeting this last Wednesday should be available in the FTP within about 4 to 5 hours. Stay tuned!

Update: it is taking longer than expected, but it will be worth it. Tomorrow is the day.

Saturday, December 02, 2006

Shameless energy environmental label

So here I am, and about a year ago I received this silly PSE&G piece of paper with my bill. It has a beautiful bird picture on the green background front. On the back, there are some numbers and things I'd like to share with you today.

First comes the energy source, from where one finds that 3.54% of the energy produced came from renewable sources. The big contributors are nuclear at 45.17%, and coal at 38.42%.

Then comes another tab called Air Emissions. It shows that PSE&G is at 96% of COx emissions, 100% of NOx emissions, and 281% of SOx emissions --- where 100% is this "NJ benchmark". These figures are shown in a bar graph, which has two horizontal lines. One is marked 0%, the other one is marked 100%. None of the bars match the 100% line, which is strange because NOx is labeled as 100%.

In fact, if the figures were normalized against the graph in which they are shown, none of them would remain the same. 96% would become something like 80%, the bar labeled 100% should have to be labeled 85% or so, and the 281% bar would be about 125%. Lies, lies, and more lies. Right in our face. This so called graph should get an F in K-12 school.

Finally, comes the tab called Energy Conservation. It reads "Electricity generation and associated air emissions avoided through PSE&G's investments in conservation measures". On the right, we can read:

  • Avoided generation: 0 KWh.
  • Avoided emissions: 0 COx, NOx and SOx tons.
In other words, nothing.

The graph, in particular, is not a bug. This is not the first time it happens. In fact, a previous post of mine shows the graph in full detail. It has not changed one bit, except for the figures.

I am reminded of all the people who dream of running an empire through their work, of having all this importance in the speck of dust we call Earth, of somehow having the right to assume this is a distinguished place in all of creation or whatever else.

I have news for you: this is no way to run an empire, and we will bankrupt very soon because of things like this graph. Because when the same kind of thinking is applied to slides at NASA, we get the Columbia disaster. When the same kind of hubris is employed at nuclear plants, we get Chernobyl and Three Mile Island. When the same kind of irrationality is used to run the world, we get mass murder.

And we are all accomplices, because we know these things happen but decide to look away. We just find emotional excuses as to why this is fine or sometimes just acceptable, and move on. Hopefully, our negligence-induced death will be quick and painless. It doesn't look like we will get even that.

Regardless of how miserable the situation looks like, however, the truth remains: that this universe is capable of self observation. If by our actions we prove that we do not deserve that ability, because given the choice we decide to look more towards our belly button, towards our ego, and towards all the fantasies about ourselves which we will defend with religious faith and if necessary to countless meaningless deaths of others, then hey... the reality in which we live is even better. Our own defects, those things we know very well despite our best efforts to deny their existence, will interact with the environment in which we live and lead us astray into mass suicide.

The universe, like the monolith beings of 2001, could not care less. So cruel, so merciless, so inappropriate for us spoiled children to tinker with... and yet, so extraordinarily beautiful because of exactly the same reasons...

Tuesday, November 28, 2006

Poor man's VOIP

  1. Get one of the VOIP solutions from TinyApps. You don't need to register, all is well.
  2. Go here and get yourself a free account, then register a dynamic DNS address.
  3. Get a copy of DeeEnEs, and set it up so that it updates the dynamic DNS address you got above.

Then, just give your dynamic DNS address to others, and there: free, server-less, account-worry-free VOIP.

Pong game servers available for download

Well, Arden left me a comment in the original post asking for the game servers. Sigh... please excuse this rather large omission! A new file is now available for download in the FTP. Sorry!

To play, start up one of the game servers and, in a workspace, evaluate the code below.

[ContestPlayer fork].
[ContestPlayer fork].


Monday, November 27, 2006

More and more speedups

I posted a small change that speeds up opening paragraph editors in VW by a factor of about 3x (in the particular test case I had). It is in the VW NC list.

Enjoy --- there is more coming, too!

Up pipe is still red hot!

So I came back from work and I found my cpu box hdd light going off all the time. Ah, but of course: the upload pipe was sending one megabyte per second out to 7 people. This goes far beyond any expectations I had, and then far beyond again. The videos are still being furiously downloaded!

I hope you like them! Thank you thank you thank you!

Sunday, November 26, 2006

A bit of foreign law

Discussing with a friend, it came up that in Argentina there is an interesting bit of law. The act against this law is called "apology of crime" (translated literally). In other words, this means that it is a crime to offer excuses or justifications for other crimes.

For example, if John Doe claimed that Unabomber was right to mail bombs etc because of whatever reason, then John Doe would become a criminal in Argentina. He could argue that Unabomber had been irritated in some way or the other and that this irritation was wrong. Fair enough. But John Doe would not be able to argue that this bad justified the other, because otherwise he'd end up in front of a judge.

So, my friend, if you still watch TV, turn it on and watch carefully. Painful, isn't it? Then, consider that a significant amount of people just repeat what is said on TV without giving it a second's worth of thought. Hmmm...

But I digress. What we do not know is whether there are similar laws in other places. Is there a counterpart of "apology of crime" in your country?

Saturday, November 25, 2006

Old notes shining as new

As I was going through some old files, I found some notes I took down while at Smalltalk Solutions 2006. I think I posted on them already, but three paragraphs that I am almost sure I didn't use jumped at me. I wrote this only 7 months ago, and yet it seems like new to me.

So, what is this bunch of words that keep repeating themselves? Massive. Multiplayer. Global. Connection. Stuff. Out there. Play with. What is it that we want? Is it interaction because we're isolated? Because in our $ based society people don't matter? Because the idea we get to fix this is to use computers?

Difficult things to do... you have two inspectors, are the objects being inspected == or not? Global variables vs the identityHash lottery.

As there are demo competitions, do we need Smalltalk competitions? What would be the equivalents of demo, 64k, 4k and so on?

Man, I really need to get going with my stuff.

By the way, footage downloads are still going on without pause...

Video going out the door non stop!

Just 15 minutes after I posted the link to the ftp, the downloads started. They have been going out straight for the last 3.5 hours. The minimum upload speed has been around 100kb/sec, but most of the time it has been 300kb/sec or more --- such as now, when data is flowing at about 500kb/sec. In addition, outgoing traffic has spiked up to 796kb/sec, reaching 100% of the bandwidth capacity.

I am absolutely amazed --- I didn't expect this amount of interest at all! I had thought well perhaps you know 3 or 4 downloads today, then a trickle for a couple months and so on. I was happy with the video being useful for someone already. But this? Wow.

Thank you so much for this. I hope that you like the videos as much as I enjoyed making them. If you have any comments --- neutral, good, bad --- please please let me know so I can make them better.

Enjoy, and thanks again!

Smalltalk footage available for download!

The footage from my previous presentation at NYC's Smalltalk User Group is now available for download! Here is how to get to it.
user: smalltalkVideo
password: now

And if you go there, you may even get a bonus track...

Thursday, November 23, 2006

Video processing unit back in business

I caught up with the queue of raw video files to process, and after crunching about 40GB of stuff it finally came to the recording of the NYC SUG talk on the coding contest. The result will be a 700mb file (roughly speaking), lasting almost 83 minutes, and with very good resolution: 960x480!

No video editing was done on the footage*. I am not sure as to what to do with the illegible source code being projected on the wall, but on the other hand there is not that much source code to begin with.

I am still in doubt as to what to do regarding distribution... Google video? Just put it in an FTP server? Whatever ends up happening, the footage from next Wednesday's talk should be processed sooner now that the backlog is taken care of.

* The sound track was left verbatim as well, other than some postprocessing.

The highest high

If you take an aspirin, that is ok. If you drink tons of coffee to stay awake at work, I'd guess that is ok on de facto grounds. So what is it that makes something like steroids wrong?

You have these sports people that earn money based on how much and how well they perform. Take steroids, better (?) performance, better sports people, and better salaries as well. Why not? Well, because something does not sound quite right, does it? What is that thing that bothers you in the back of your mind?

Then you have things like baseball, where the player union itself seems to have an interest in that there are no doping tests. Why not? What exactly would be wrong with finding that whatever percentage of players use steroids? Let's say the number is 10%. What's wrong with that? Does it change the sport? And if the number is 50%? Does it change the sport? And if the number is 90%? Does it change the sport now?

Of course not. Steroids or no steroids, drugs or no drugs, cork bats or no cork bats, the sport remains the same. But what is wrong with that kind of proposition? Why is doping something that must be hidden? Why cannot it be in the clear?

And that question gives the answer. It must remain covered so that whoever is doping can claim that the achievements are the result of sportsmanship work. But if reality is that, roughly, any Joe Doe taking pills can achieve similar results... hey, all of a sudden the salaries of these sports people look way too high, don't they? Why would you pay anybody tons of millions of dollars to take pills, go win championships, and dedicate the victory to the pharmaceutical lab?

That is the problem: sports like this are bullshit (quite literally) because the players who dope do the following two things. First, they have a complete disregard for whether something is proper or not (believe it or not, doping can do things like getting you out of the sport forever). And second, they have a complete disregard for whether something has any connection with reality or not. In other words, they are psycopaths and liars, because they do not care what is it that they have to do as long as they can collect ever growing mountains of money.

When they celebrate, they take all the glory. We like to believe they persevered because of skill and effort. And, to a point, we are also accomplices because even when we have some hint that perhaps there was doping involved, we brush it aside so that we can also celebrate. Because we need to celebrate, we need to win too. And thus we also lie to ourselves so we can give ourselves a fake high.

So what is going to happen when getting a fake high takes more and more efforts on our part? What is going to happen when the dope of yesterday is not enough for tomorrow? Well, things like drugs that will allow you to work 24 hours a day. And obviously, the work day will be extended to 18 hours, and whoever works "half a day" quite literally will be punished with a lower salary, etc etc etc. Note how the article is written in almost fatalistic terms: it is here, it will happen, I am sorry for you, and so on. And clearly, if you are convinced that it must happen, then it surely will.

Welcome to the high life, I mean life on a high. And welcome to a Brave New World. Being a complete slave of work, a complete slave of money, of these tokens you will not keep when you die. A life full of gla$$ bead$, of doing things we really do not believe in so we can think we have things which have no intrinsic value.

Sometimes, the way in which we lie to ourselves may seem a bit innocent, or even childish. I had a plane conversation once with this lady that was very religious. Although which religion it was exactly does not matter, out of curiosity I asked her about these religious things she was describing. She went on to tell me about what she did because of her religion, and why these acts had a lot of value because they were done in the context of her religion.

I guess my straight face and lack of reaction made her see I was not buying any of it, so she said the following: "Well, I know that all of these things I believe in are more or less like believing that Santa Claus exists, but life would be too hard if I could not believe that there is something after death... life would be meaningless, so even though I know very well that all of this is foolish I choose to believe in it anyway because I would not be able to cope with life otherwise". I had not asked a single question, I had not uttered a single word, and there she was confessing her sin: knowingly lying to herself.

But some other times our lies have nastier consequences. For example, what is going to happen when getting an ever stronger high requires that some species goes extinct? Or that someone else dies? Or that many other people die? Or that some ethnic cleansing must occur? Or that we completely ruin this planet in less than 100 years? Or that we commit global suicide, so we can finally get the highest high of all highs: experiencing death in a horrific and terrifyingly slow manner, just so that we can finally bring on to ourselves what we are typically so afraid of?

Oh, you mean, you open the newspaper and read?

Thus, there is no choice other than to conclude that, on aggregate, we are such pathetic monkeys. And even though life like this is absolutely 100% bullshit, the more important fact is that it is also an option. So thanks, but no thanks --- I will take something else instead.

Wednesday, November 22, 2006

More speedups for Store

Yet another round of Store speedups. This time, reconciling against the database was made about 20% faster with two sets of changes. Hopefully these modifications prove to be correct and free of defect. To try them out, go to the VW NC list.

Tuesday, November 21, 2006

Spam comments

So finally I got comment spam in this blog, all related to Skype stuff. To make it more challenging, whoever or whatever did this decided to sprinkle my old posts with spam. Given that Blogger doesn't tell you which post the comment was posted to, this could have been a problem...

... nah. Use my web spider, update the snapshot of my blog that I keep for my own purposes, and then simply look for the right keywords. This made finding the spam very easy because Blogger produces a file per post. Go to the post in question, delete delete delete.

From now on, comments will be moderated as I'd rather not have to waste time with this again. I hope you understand.

Monday, November 20, 2006

Of DRM and addictions

Recently, James Robertson linked this page that lists 10 reasons why DRM is bad. But more than once, I've gotten the impression that DRM is supposed to work because there is this assumption that consumers will not be able to control themselves, and they will compete buy any kind of glassy bead shown to them (PS3, anyone?).

But if that is the case, and consumers are being seen in terms of being addicted to stuff, let's play word replacement with the following rules.

  • "DRM" = "Illegal drug enforcement"
  • Instances of "media", "files", etc on which DRM is desirable, but that do not have DRM applied to them yet = "illegal drugs"
  • Instances of "media", "files", etc that are only available with DRM = "prescription drugs"
  • "media", "files", etc on which there is no DRM ever = "drugs"
The idea here is that, in the same way that people addicted to illegal substances typically pay for each high they get, DRM will force us to pay for every "enjoyable experience" we live. Therefore, let's rewrite the 10 reasons why DRM is bad in these terms and let's see where this takes us.
  1. Drug enforcement doesn't prevent illegal use of drugs, it just makes it a bit more difficult to access them.
  2. All it takes is one person to give the right seeds and instructions, and then drugs can be made available to everyone.
  3. Anyone selling prescription drugs is selling drugs anyway.
  4. Illegal drug enforcement adds a lot of costs to drug manufacturers.
  5. There is a huge hidden cost in trying to sell illegal drugs.
  6. Often the costs of the illegal drugs are passed along to the consumer as well.
  7. Drugs will give you a high today and tomorrow.
  8. In the future, your body will be significantly different from what your body is today.
  9. Illegal drug enforcement fundamentally changes who is in control of your drugs.
  10. Whenever you buy legal drugs, you support the system of illegal drug enforcement.
... perhaps the analogy can be refined a bit, and I really do not want to spend too much time polishing this post, but... wow...


So... interesting times, my friend...

James had used Powergramo to record the output of the conversation between Avi, Michael and himself --- the making of last week's intended podcast. But the audio got bent out of shape, so he passed on the .ogg file exported by Powergramo to see if anything could be done.

He said the original conversation had been a bit under 40 minutes. And here was this .ogg file lasting 9:36. As I listened, it became clear: about 75% of the audio data was missing.

I asked James if there was any large file in the TMP folder, and he found a .pga file of 33mb --- about the size of the ogg file. But that was a Powergramo file, and apparently was unplayable with anything else. I suspected it was tagged .ogg data, so I asked James to pass it over.

At first, it didn't seem to make sense. Until I saw that where the exported file said "Ogg", the .pga file said "Nff". Where the exported ogg file said "vorbis", the .pga file said "wnschr". Where the exported file said "20030909", the .pga file said "31121818". Ah, so the .pga file was the original ogg data xored with 1h. Very nice. And as for the slightly larger .pga file size, there was a header at the end that said, among other things, "MVOGG [...] Encrypt1.0".

But xoring the whole .pga file with 1h didn't result in a proper .ogg file. So I xored the exported file against the .pga file and found that not all of the .pga file was xored. Only the first and last 20480 bytes (20kb) of the .ogg data were xored with 1h. Simple enough, Smalltalk takes care of that no problem.

Alas... because the, um, "decrypted" file is identical to the .ogg file exported by Powergramo, the data defect still remains. Hence, Powergramo managed to lose 75% of the sound information.

I don't know why this happened. Perhaps it's a known bug, or a known bad interaction with other software... thus, I will not claim anything else. But... "Encrypt1.0"???...

Sunday, November 19, 2006

Speedups in the public repository

I just had a chance to check my email, and it turns out that Joachim Geidel has published the Store speedups I wrote into Cincom's public repository. The packages are Tools-Speed patches and Store-Speed patches (although in the case of the Store one, I'd like to clarify Joachim added just Store.Package>>addClasses:andMetaclasses:).

I am very glad and grateful that Joachim did this. I have been extraordinarily busy as of late, and I have not had much time to do anything other than to catch up on sleep debt. Thank you so much Joachim!

Saturday, November 18, 2006

Polymorphism at its best --- NYC SUG 11/29!

I have been given the honor of giving another presentation at NYC's Smalltalk User Group. This time, it's going to be on the amazing consequences of using polymorphism to increase execution performance, and in this case, how sending regular messages beats heavily optimized things like ==.

Yes, there is no typo in the paragraph above. Normal message sends running faster than ==. And not just by a hair, no no no. I mean up to 60% faster!!! This is serious stuff.

And besides, the half-optimized, non-inlined version runs, on average, within 74% of the original unmaintainable inlined and already optimized version. But if you can get that performance without large chunks of code and things like ==, are you sure you really need to inline everything into a blanket method?

These matters and more, including some of the most absolutely beautiful code I've written, it will be all for you my friend. The one hour, extended, enhanced, polished, encore presentation of the original OOPSLA 2006 demo, "Writing Truly Efficient Smalltalk". November 29, at NYC's Smalltalk User Group meeting.

Don't miss it --- and see you there for a great fun time!

Tuesday, November 14, 2006

To publish, or not to publish: of love, overrides, and everything else

I've been asked to publish the speedups I've been making to VW in the public repository. Thank you so much for the interest!

Alas, this brings me a problem. I had decided to just publish updated versions of the base VW code in my local repository because then, when I update to a new version of VW, I can just merge stuff into the new version. In this way, I treat my changes as a branch that needs to be remerged...

... and it also saves me from dealing with overrides. Personally, I guess I have not learned to see their advantage, or that I am missing the point somehow. I tend not to use them because of two reasons.

First, Store tends to become more brittle --- my image has overrides due to loading parcels that came with VW, and now I cannot publish the parcel as a package and the modified bundle into my local repository without having at least one of them become dirty.

Second, overrides held in a separate package don't show you where the code was to begin with, and then loading them into a new version of VW just stomps over the other stuff. It becomes much harder to, say, compare the code before and after the potential changes.

But now that I am asked to share via the public repository, I can't simply publish new versions of VW 7.2.1nc, which is what I am using now. What to do...

... hmm, I wish there was some sort of "unit of work package" idea, something like a package in which you could say "all these changes are because of this reason". This unit of work would not own the changed code, which would still be published as versions of the base pundles. However, it would provide a good mechanism to load pieces of code into many different pundles in a controlled way, without owning the code by itself.

If units of work existed, I could simply publish them into the public repository, and upon loading others would get their base pundles modified. Or there could be an option on load: "load & modify", or "load & override" (in which case the unit of work would own the code).

One could even have these things have particular load requisites --- if the code in the image does not match what the unit of work expects to change, then provide a warning before loading the changes. And then, instead of talking about ARs, we could talk about "units of work" that improve a particular version of the system. Let's call these particular units of work "updates", put them in the Update Store Repository, and then you could simply invoke "Get Updates" from the menu because VW would come with a read-only anonymous account for the update repository.

I have a feeling that is what is missing here. In the meantime, I guess I will have to figure out some way to emulate it.

Saturday, November 11, 2006

Regarding online bill pay

I had always thought that paying bills online was something that would benefit the people collecting the money, rather than the people paying the money.

For instance, if you pay with checks, the company receiving the check has to process it, and either them or the bank will send you confirmation that the check has been cashed.

But with online bill pay, in particular if you go to each company website to pay, you have to print your own receipts with your expensive toner/ink cartridges. You also have to file individual pieces of paper in their corresponding hanging folders or whatever arrangement you use. And to top it off, you still have to do your own accounting, just like you did with checks!!!

In addition, I also had a feeling that all this alleged automation was actually slower than writing checks. For example, I timed myself at 2 minutes to not even successfully pay my cellular phone bill because somehow the username and password got "upgraded" or whatever. In about half that time, I wrote a check, I wrote the duplicated paper trail in case my computer files blow up, and I also updated my computer file so now my accounting is up to date as well.

In summary, it took me something like half the time, I didn't have to go get any plastic card to type in the account number, the security code, the expiration date, the funny number, the strange number, and the randomized password from my RSA keychain. Moreover, I did not have to print paper with the ridiculously expensive consumables, I did not have to file single pieces of paper, etc.

So. Who should do the secretary work? You, or the other guys? I'd rather pay 39 cents and have them spend the time I would like to use in a productive way instead.

Of course you could have your bank program to pay all these things automatically from your checking account. Alas... for most of these services you have to pay a monthly fee that is usually higher than your expenses on stamps, and in addition you still have to tell the bank how much to pay, etc.

Monday, November 06, 2006

Observation regarding sound recordings

Something I noticed when cleaning up audio recordings is that, usually when they are recorded by a computer, there are noise spikes at frequencies like 60hz, 120hz, 180hz, etc. One could say well, all multiples of the base 60hz AC current frequency, so there is some sort of leakage.

But when I analyzed mastered CD tracks with the same mechanism, I also found such spikes. What's going on here? Why should there be frequency spikes like that coming from professional equipment?

Incidentally, the CD I looked at was Behavior, by Pet Shop Boys. Besides the spikes at multiples of 60hz, I had always (although barely) noticed a very high frequency hiss in the background of the tracks of this CD. Indeed, analyzing it found the spike showing very clearly, at about 20-22khz. Slowing down the music only made it much more obvious.

Grrrr... why are there such defects in CDs?!?! As if they weren't expensive enough already!!!!

Update: ah, now I see what the hiss could be... perhaps the tracks were mastered with a resolution higher than 16 bits, and the hiss is the noise dithering that was done when converting the originals to 16 bits. Grrr!!! I just learned what not to do.

Many times faster Winamp DSP plugin

And since I was on an optimizing mood from yesterday, I also made my Winamp DSP plugin many many times faster by reducing the clutter I had from the first time I wrote it. Before: up to 20% CPU usage. Now: no more than 9%. CPU usage without the DSP plugin running: no more than 7%. Good stuff!

4 simple changes => 65% faster RB!

Sometimes, having a slow computer makes inefficiencies more obvious. I was renaming classes, and renaming selectors... a lot of them... and hey, the Refactoring Browser was making me wait. Not a whole lot, but like 5 seconds plus a garbage collect for every one of them.

I interrupted one of the operations, found a good place to install a TimeProfiler, let it finish by proceeding in the debugger, and then installed the TimeProfiler after the run was done (yet another big advantage of debuggers in which you can stop and continue, hehe!).

Then, I continued working and started getting TimeProfiler outputs after the operations were done. Based on this information, I made 4 simple changes that resulted in about 65% faster* execution. Very nice! Check out the VWNC list for the details.

* Faster refers to an increase in speed, which is typically defined as amount of work divided by amount of time (e.g., miles traveled per hour, or revolutions turned per minute). Thus, the speed of a program can be seen in terms of iterations/second, and therefore 65% faster means that the new implementation can run 65% more iterations in the same amount of time. If we compare times instead, this speedup means that the new implementation runs in about 60% of the time, because 1/1.65 is about 0.60.

Sunday, November 05, 2006

Recommended RB extension of the year

You must absolutely load RBHierarchicalClassesExtension from Cincom's public repository so you can have the partial hierarchy tab in the Refactoring Browser. Do it now, I would definitely be irritated if this feature was taken away from me.

Big thanks go to Anthony Lander for creating it!

Saturday, November 04, 2006

Farbrausch has more demos

I watched fr48 a while ago... how absolutely beautiful. Quite different was fr49... very surprising! Then there was also a couple of fr-minus releases. You should watch them too.

Get them here and enjoy!

With a friend --- first byte: post #256

I had a conversation with a friend, and among other things we commented on the state of education, mankind's level of achievement these days, and so on. I heard the following characterization, which I think is very good.

That is the distinction between "education" and "training".

Hold the thought and consider it. Train, perform repetitions... if you are to do the same thing many many times, then you might as well train for it so your defect rate is low... and then why not just build a tool to do the repetitions for you --- oh right, then we could have a code generator so it writes the program automatically for us, etc.

And you know where that goes. No thought, zero creativity, and very expensive cost of change.

Trained people put things in, because that is what they are trained to do.

Then you have to consider this. It is well known that as new parts of our brain develop, they will die off or not activate later on if they are not stimulated at the right time. In other words: do a lot of multiple choice tests while your brain is still developing, and guess what will you train yourself to do. Even worse: what you are causing yourself not to be?

So, go with an unchallenging education, and no wonder: now you have many many people having to live their lives with what in a different kind of society might be considered to be something close to irreversible brain handicap. No matter how you slice it, the point is that you just have to miss the train once, and then it's gone forever.

What is worst is that if you miss it, how would you know the difference? Your particular experience of the world will be fixed and handicapped forever. Any sort of more sophisticated perception would be something you would not even be able to think about, because you would have no direct experience of it. In other words,
  1. these more educated ways to perceive the world would not exist, as judged by whoever makes such decisions,
  2. the people that claim there are such things, and that it is possible to achieve them with proper stimulation, would be out of touch with reality, and
  3. the very few exceptional people that go through the training process, survive, and still have this ability to perform their incomprehensible "magic", are called geniuses* --- who happen to exist just by mere chance, without the slightest attribution to the nurturing environment in which they develop.
It makes me sad to realize that there is all this potential gone into the trash, all these unnecessarily handicapped lives for no good reason, just because we do not care for life enough. Besides, there is always an excuse to justify what should be seen as almost criminal. And criminal it might as well be. For example, if your kid is given a medicine and becomes cronically ill, or if a drunk driver causes life lasting paralysis because of the unspeakable negligence, wouldn't you sue the hell out of the perpetrator? Then why exactly is brain underdevelopment ok?

Alas... for when it would be convenient for us to believe whatever is wrong is actually normal and acceptable, we humans have these special gla$$ bead$ towards which we are trained to turn our heads, wag our tails and look the other way. That scene from The Wall, in which kids in school benches fall from the conveyor belt into the meat grinder, gains new meaning.

We just suck.

* Please read Brave New World, by Aldous Huxley.

Another great quote...

"We have a habit in writing articles published in scientific journals to make the work as finished as possible, to cover up all the tracks, to not worry about the blind alleys or describe how you had the wrong idea first, and so on. So there isn't any place to publish, in a dignified manner, what you actually did in order to get to do the work." --- Richard Feynman

Automatic Google results cleanup

Just by accident, I found a way to obtain much cleaner results out of Google. Enter your query terms, and just suffix them with this:


Magic: the answer size was reduced by two orders of magnitude!!!

G. H. Hardy's quotes

I was looking for the "90% of everything that has been published is wrong" quote, which I think was written by Hardy. I could not find it with Google... but I remember having read it so vividly, perhaps from An Introduction to Number Theory... if you have it, would you mind posting a comment with it?

At any rate, I found this other quote that I like very much as well.

"It is not worth an intelligent man's time to be in the majority. By definition, there are already enough people to do that." --- Godfrey Harold Hardy

If my memory serves me right, this was said during or right before World War II began. So appropriate...

Monday, October 30, 2006

Happy birthday and thanks

Today is Diego Maradona's birthday. Thank you so much for your art, and for being a source of inspiration.

Saturday, October 28, 2006

Getting to know Mr. Warhol

I lost myself at Powell's main branch, looking for the new postcards they have, each with a different design based on the room they are in. And in the Pearl Room, I found a book about Andy Warhol. Well, I had heard a lot about Mr. Warhol, but had never done research on my own. Therefore, I looked at this book which was extraordinarily large, both in page count and page size.

The thick paper reproduced his art, which I have to say did not impress me much. More interestingly, however, the paper also reproduced quotes. Soon enough, I was flipping pages looking for the quotes and skimming over the glossy prints. Out of all the ones I read, besides the famous 15 minute one, here are three that called my attention.

They always say that time changes things, but you actually have to change them yourself.

When you think about it, department stores are kind of like museums.

It's the movies that have really been running things in America since they were invented. They show you what to do, how to do it, when to do it, how to feel about it, and how to look how you feel about it.

Alas... I find them to be so true... especially the last one, in particular when one replaces "movies" with "TV shows"...

Friday, October 27, 2006

Life Index Lyrics --- Update

So... listening to FR-034 again, I filled a couple blanks since last time.

  1. From simplicity into complexity.
  2. From singular cell into freewill.
  3. As my heart beats, I feel the seconds less.
  4. I shall cherish it where others don't understand.
  5. Violent nectar [?] of life, something you never knew.
  6. This rose is for you only, Kammi my absent friend.
  7. It has bloomed in the garden of my subconsciousness,
  8. in the tragedy I wish not to comprehend.
  9. We slow down.
What a beautiful work... if you have not seen it yet, check it out.

Update: here are the actual strings used for the synthesizer.
  1. !frAAm 1 sIHmpl2IHsI1HtIY !IHntOW kAAmpAXlEHksIHtIY
  2. !frAAm sIHNGgyUWlER sE2Hl !IHntUfrI2YwIHl
  3. !AEs mAY hAArtbI1Yts !AY fI3Yl DHAX sEHkAOnds 1 llE2Hs
  4. !AY 4 SHAOl CHEHrIHSH IHt WHEHr !AHDH1ERz !dOWnt3AHnd2ERst2AEnd
  5. !vAYWlEHnt 1 nEYtCHER !AXv l2AYf !s1AHmTHIHNG yUW 2 n2EHvER nUW
  6. !1DHIHs !rOWz IHz f1AOr 2 yUW 3OWnlIY kAAmmAX mAY 2AEbsEHnt frIYEHnd
  7. !IHt hAEz blUWmd IHn DHAX g1AArdEHn !AXv mAY sAHbkAAnSHAXsnEHs
  8. !IHn DHAX trEYjEHdIY 6 AY wIHSH nAAt tUW k1AAmprIHhEHnd
  9. !w3IY sl2OW d4AWn
If somebody could please verify the beginning of line 5, I'd be very grateful. Thanks in advance! See here for more details, data files, and a winamp plugin that plays V2 synthesizer files.

Lambda calculus, Smalltalk, and you

So... after thinking about the whole issue of types for quite a bit... I have to say that I am happy I work with Smalltalk. But the reason why is interesting, because I think it's more than just some sort of "it struck my fancy".

From the label experiment and the conversations with Dan Ingalls, I gathered the fact that when designing a language, it is important that it does not have too much stuff in it. This is because whatever you put in the language, you will have to mess with via a computer interface. And this makes interacting with it slower, in the same way that hard drive access causes considerable lag for a modern CPU.

In short: the more stuff a language has, the slower the interaction with it will become.

Now, since productivity is one of the values I care about, I cannot help reaching the conclusion that I want a language with the least possible stuff so I can be most productive with it.

So what is this least possible stuff? Well, if a language had nothing, then everything would be in our mind, and this is an issue because then we don't take advantage of the computer, and we also overflow the rather scarce 7 plus minus 2 slots of scratch ram we come with.

Therefore, a balance must be chosen such that what stresses our scratch ram the most stays there, and what stresses our scratch ram the least goes into the computer. Language design is a register allocation issue.

Consider then lambda calculus. If we're reasonably trained to do natural deductions in logic, then adding lambda calculus does not seem like that much of an additional imposition. Putting lambda calculus annotations in the computer however causes human interface traffic because in order to think in one's mind, one has to make reference to stuff in the computer. We can cache all we want by remembering, but eventually we will hit the hard drive and then our overall productivity will go down just because of the particular register allocation model we chose.

Therefore: do lambda calculus in one's mind together with the logic. Then, simply store the results of all this calculation in the computer. And do it in a way that makes it easy to reconstruct the deductions and lambda calculus annotations on demand, but without resorting to verbose artifacts that cause human interface chatter. In other words, be intention revealing.

Enter Smalltalk. No type explicit annotations of things we do in our minds, just one of the places where expressing results of deductions with type annotations is easy. Because, as we know, when we write Smalltalk we think about types in the sense that we have to keep track of what messages will be sent to what objects.

I insist that by designing a network of objects such that each local evaluation context fits in our scratch ram, and such that the chaotic interaction of the parts is designed in such a way that the overall system has the emergent property of solving the problem at hand, is (one of) the most efficient ways to get things done. This is just because working this way implies taking advantage of a human friendly scratch ram register allocation strategy.

Watch how you think, run a time profiler in your daily work, and see where the time is going. If most of it goes to clicks, typing and reading, then you have a register allocation issue. Then, solve it by allocating your registers more appropriately, and then training yourself to take advantage of the new register allocation. Most brain cycles should be going into design anyway.

Eventually this will drive the language you choose to work. And the good thing is that Smalltalk is just one option... and even if it were and you happened not to like it, you can change it to your heart's content.

I find myself very productive in Smalltalk. How about you? :)

Thursday, October 26, 2006

Smalltalk Solutions 2007

So... where's the STS 2007 website? Does anybody know the submission deadlines?

OOPSLA 2006 is over!

As all things do, OOPSLA 2006 has also come to an end. What a good experience it has been! But now, it is the time to work so we will have cool things to talk about at the next OOPSLA.

Fourth demo went well

So, finally... the fourth demo is done. It was cool, some C/C++ guys came by and had a great time (I think!) seeing an alternate approach make code run really really fast. I am happy because, overall, I had a varied audience --- which is one of the things I was hoping for.

It was also good to go through the motions of giving talks again. It is so much fun, but I was so rusty! I need to do this kind of thing more often.

The last OOPSLA keynote: Philip Wadler

So there is this guy with a Lambda superman suit talking about stuff... what is this stuff? It certainly tickles my curiousity! Well, I have been exposed to the type system in Haskell. And, in addition, I have been exposed to generics in Java. Both of them are based on lambda calculus, which is types for natural deduction.

Hmmm, to summarize, generics in Java is incredibly verbose and, according to the presenter, even cumbersome. Enough said about that.

Haskell's type classes are, as I understood them, a way to pass a sort of "method dictionary" so that type inference works. However, the type inference breaks when not all sends are "monomorphic". Well right, if all sends are monomorphic, then types are essentially method lookups --- hence my previous claim that good type inference engines are hard to come by*.

What struck me again, just like with the experiment I did yesterday, is that you can think about typed lambda calculus all you want and that's fine... but you should never explicitly write any of it down. Just the sheer amount of typing and manipulation required to prevent, say, comparing apples to oranges, is disappointing. Because if the problem is that the comparison does not make sense, one should not do it --- period.

Even from a pragmatic point of view, what are you going to fix? The type declarations to prevent the comparison if and only if you run into the particular problematic scenario, or think of issues when you imagine what could possibly go wrong before anything actually happens? I do not think this is particularly productive because we all have known many a great problem, most of which did not occur.

Incidentally, doing refactoring work on type classes is, according to the Lambda guy, nearly impossible. Hence, cost of change is high even with type classes.

So, to me, it comes down to two paths so far. You can try the guessing and adivination game, or you can just fix the bug if and only if it occurs, or as shown by functional testing. Currently, I feel I am more productive with functional testing, so that's what I choose for myself.

However, I wish there was some proper research done to clarify this issue so this decision can be made more rationally. Alas, according to the Lambda guy there's no scientific research available to answer this question properly once and for all.

So, given the material available to me at this point, I have to fall back to my previous position. I can use all that in my head, should I choose to do so, but there should be no explicit manifestation of such artifacts.

As I close the lid of the laptop, I cannot help feeling that types, described this way, remind me too much of the "warning a baby could drown in this recipient if it is filled with water" labels printed on 5 gallon buckets.

Then again, as far as Haskell goes, it is certainly a huge improvement over Java.

* I have a feeling I might have gotten this wrong somehow the first time, please excuse my trying to take down notes as the presentation is still going on. I wish I could have updated this sooner, but Wifi had gone down after a power system failure that tripped the fire alarm and caused everybody to end up on the street.

Update: I changed the title because I didn't choose the first one very well, and reworded a couple things that did come out to reflect what I intended. Please excuse the mess :(.

Firefox and Mozilla

I can't help noticing... the more time goes by, the more old quirks of Netscape appear in Firefox. Here are a few that keep coming up:

  • Pages do not load and seem to get stuck. Retrying the request works just fine...
  • Sometimes, for no apparent reason, pages render incorrectly. If you reload, things looks fine.
  • The web cache is too persistent. You update your blog, and it fails to update. You hit refresh, and it shows fine. Sometime later, you bring up your blog again and you get a 2 day old cached version. Some other times, comments are missing too. Hitting refresh fixes the problem... at least for a while...
Hopefully these are glitches that are about to go away with Firefox v2.0.

Wednesday, October 25, 2006

Stormless lightning

So lunch was more or less over, and I had had a lovely discussion with Rik Smoody and Rebecca Rikner, the lady who designed the logos for the next OOPSLA... art, Sweden, style when programming, the state of the school system, even Perelman books... fantastic conversation.

And then I went with Rik to the lightning talks scheduled at 1:30pm. But there was no chairman. And only one person from the schedule was there to give talks. What in the heck?...

... so we simply self-organized into giving spur of the moment talks. I shamelessly decided to go first, and spoke for about 5 minutes about JP Morgan's Kapital project and how Smalltalk and GemStone enable us to deliver exceptional value to our customers. I hope I can do this one more often and with more material because working on Kapital is really exciting :).

Then this physicist gave a talk about how the same geological feature can be seen differently by different people, and how one can abstract a quite informal but working model of movement and spatial constraints...

... and then he said something that I found suspicious. He said that in order to get outside the room, one had to exit. Seemingly innocent. But in my mind, that got reformulated as "to change position with regards to the room, one has to cross its boundary". And there was that funny wording in his slide, "form follows from function"...

So I had to ask. Had he read Laws of Form? And the answer was yes! So he goes "hey, I've never been around people that have read Laws of Form, how many of you read Laws of Form?". Many hands go up. Astonishing.

Then this guy Evan Phoenix came up to the stand and gave another improvised talk, based on a talk he had given at RubyConf a few days ago. In brief words, he described the following.

  • Ruby stole from Smalltalk... but it has all this mixture of stuff...
  • So what if we steal from Smalltalk and Lisp even more?
  • So he took the Blue Book, shuffled the stuff, and got a first working prototype of a more proper VM for Ruby.
  • But it was crap so he ditched it and did another one.
  • And another one.
  • And another one.
  • With the idea that the first working models would be implemented in C by hand translation, but eventually the working model would generate C instead.
Astonishing. Just like that, "oh yeah I took the Blue Book and implemented the stuff" --- !!!.

After he was done, since there was interest in Laws of Form, I gave a quick demo of my Reference Finder. Some guy had this almost gutural reaction when a browser uncovered the classes Form and Distinction on the big screens... I wish I had recorded his almost diabolical laughter... something proper of uttering "and now I control the world!!!". Strange, but so fitting...

I had to hurry up because I had to go give my 3rd Writing Truly Efficient Smalltalk demo. At first there was nobody... sigh...

I thought that well, yesterday the 2nd demo had quite an audience... not only in quantity but also in quality. Like, what am I doing talking about these things to Mr. Wirfs-Brock? This is insane! So I assumed people had decided to see other things... and there was this keynote going on, so I just took advantage of there being nobody and put up more 64kb Farb-Rausch demos on the projector.

Then this guy comes over... Australian researcher, and I start the demo. Then another guy came by. And they really liked it! I had another two guys come in a bit later, and I had to replay the debugger section that shows the efficient code in action. It was very good overall because I could have a closer relationship with the audience, something that is more difficult to do when 50 people are listening to you.

The feedback on the previous demos is working great. I would like to thank Vassili and the GemStone guys again for their invaluable and honest suggestions. Really, good suff.

So now... after the OMSI dinner with Starwars troopers, Darth Vader, Luke, and Han Solo walking around, it is finally time to sleep.

Update: I finally got the names right --- sheesh!

A longer chat with Mr. Ingalls

Dan was gracious enough to entertain a discussion about his new project --- besides the work he's doing at Sun.

He would like to mount a new and refactored framework for authoring visual content over a standardized language (e.g.: Javascript), so the following goals can be achieved:

  1. Make a uniform web content authoring platform, instead of all this aggregation of different technologies one on top of the other (http, css, flash, graphics, layout, floating objects, etc etc etc) --- which raise the creativity tax for no good reason.
  2. Make this thing run independently of the web browser. All of a sudden, all your UI painters become easier to deal with --- and you get consistent cross platform results inside and outside Explorer, Firefox, etc.
  3. Make creation of content easy for everybody.
Ian's talk at the Dynamic Language Symposium, in particular the claim that with no optimization a self-bootstrapping implementation of Javascript was faster than Firefox makes so much sense. But then, there is this guy that got hired by Google to make fast Javascript implementations, so who knows. Intrigue, intrigue...

Saw a Java demo based on Eclipse

What to say. It was about this tool to automatically add more or less repeated code to methods, like some sort of "unrefactor" tool. No parse tree, just text based. All in Eclipse, based on files, etc.

Man... we are so spoiled with stuff like our debuggers and things like the Refactoring Browser... that I think sometimes we take it too much for granted... I wish others were more open to taking a look at them, so they would stop all that suffering for no good reason!

Follow up on types

I got a comment that started by quoting a question I made in the original post, "And why do type systems cause so much grief?". What I meant by that question was why talking about types causes so much friction.

The comment went on saying that lack of precision when talking about type systems can be misleading (my own paraphrasing). However, the rest of the original post talks about specific characteristics of type systems. For example, if they explicitly appear in your development work, they cause grief because it's more stuff that you need to take care of.

I wondered last night about the fraction of the developer time that is spent dealing with explicit type systems as opposed to doing the work. What could it be in languages like Java?

Let's say it's 10%, for illustration purposes. Now, go to a manager and tell her/him that 10% of the development resources are going into a system that addresses a particular kind of simple mistakes. Not even the hard ones, not even most of the simple ones, but just a particular variety of the simple ones. So, out of 10 months of work, 1 goes into (essentially) fluff.

I do not think the realization would be well received. Does anybody know the actual time percentage?

An experiment

So finally I decided to implement what I dreamt some time ago... an environment in which there is a soup of labels out of which you distinguish blobs, on which you mount behavior by means of name maps... but then of course behavior is also a name map, and so are blobs, so it's very clear that all of these are just functions from the label manifold into itself.

I knew that this was equivalent to Smalltalk. What I didn't expect was to see how Smalltalk could be derived from that interpretation, and how much more compact and concise Smalltalk is. The only thing "missing" from Smalltalk is more refactoring to take advantage of similarity of behavior patterns more effectively.

Even then, it's interesting to look at Smalltalk from that point of view... a "user optimized" implementation of an information manifold manipulation framework.

Update: I commented what happened to Dan Ingalls, who promptly responded that right, that is what Smalltalk was designed to do.

Tuesday, October 24, 2006

Oh the implications

I am sure you have heard how Vista builds take 24 hours to be created. But that's nothing.

Running the tests takes weeks.

Talk about lack of timely feedback to help our natural abilities to correlate cause and effect, man...

Conversations about types

Today, as yesterday, the issue of whether explicit/early type declarations are a Good Thing or a Bad Thing came up. Sometimes, I even saw how the discussions got a bit too personal. Besides the fact that talking about people is not going to address technical issues, the observation remains: clearly, it is a tough issue to discuss. But why? And what is it about types that causes so much grief?

I had great exchanges about this topic... and I came to the following summary that I would like to write down before going to sleep.

Overall, the issue of whether to use types or not is a matter of which values you want to emphasize. Do you care about preventing errors from occurring at run time? Do you care about cost of change?

When I work with Smalltalk, I think mostly about the problem at hand because Smalltalk has this tendency to become a mirror for my thoughts. As I put more stuff into it, I get feedback that I can apply to converge to the solution I am looking after more quickly.

As with numerical integration of differential equations, the key here is the size of each integration step. Shorter feedback cycles will lead to better overall results because they allow more fine adjustments to occur more frequently. And since finding a valuable solution to pretty much any problem more difficult than a CS homework assignment requires a Serious Amount of Thought, I think it is a good idea to make the feedback cycle lag as short as possible.

Immediately, this implies that an explicit type system is detrimental. I only have 7 plus minus 2 slots in my mind's scratch ram, and the more I need them for thinking about things other than my problem is going to cause me grief. If I need to swap out parts of my problem to think about explicit type declarations, then I am going to spend time and energy

  1. thinking about the problem of specifying explicit types, which also comes with rules and process to follow etc, and
  2. forgetting and remembering how I was thinking about my actual problem,
instead of thinking about what I should be thinking about: how am I going to express and manifest my (vague) ideas about something in a formal system of computation.

Since I only have so much time to achieve my goals, I'd rather spend time with my problems rather than with manual tools for finding simple errors. In particular, since explicit type tools are typically associated with "write-compile-run-crash-post mortem debug" programming cycles, my feedback cycles would be much more longer. This will inevitably lead to decreased solution accuracy, or at best, to increased energy expenditure to obtain an equivalent result.

Plus, of course, type systems do not let us fix problems in an execution context, thus making us imagine how things would break instead of seeing the actual bug in action. And we know how wrong we can be when we imagine things. So it seems to me that debugging in a debugger is more valuable.

Therefore, if we are to get value out of a type system, it must be of the kind that does not cause us additional work when we are writing actual code --- such as in the form of a button that we press when we so desire.

But good type inference engines are hard to come by. So instead of writing a better tool, let's cause tolerable manual work for the developers and use type annotations instead. In other words, you write your code first, then you annotate and run a type checker.

And it seems like an ok thing to do. You do not pay when you write the code, and whatever amount you pay seems reasonably bounded. Until, of course, comes change and new version 2.0 requirements. The moment you start changing the code again, all those type annotations become invalid. So now you have two options.
  1. Maintain type annotations as you change code... but that gets you into the situation where your actual development process is hindered with productivity taxes, or...
  2. Forget about the type annotations until you are about to release, then fix them all.
Since the first option seems undesirable, one would go with the second one. But then you ask... why put so much work into something that you are going to throw away? Why can't we put our intentions into a place where they do not lose value so quickly when the slightest change occurs? And why should overall cost of change be allowed to increase? Because the more time you spend type checking version 2.0, the further out version 3.0 is pushed into the future.

So, in conclusion, a type system that provides actual value to developers must
  1. be non intrusive with respect to developer work, and
  2. not need manual maintenance from developers.
I get to these conclusions because I think what developers should do is this most difficult thing of materializing a computer expression of a problem such that a process running through this expression can produce valuable answers. That is what is difficult about being a software developer, not this "secretary work" about filling type declaration forms, complying with syntax sugar, and smuggling our work through the compiler customs so we can see it crash sometime later.

Thus, given the following two options,
  • A mandatory, early declaration type system, or
  • No type system at all,
I am forced to take the no type system at all option because I think spending considerably more time trying to find an elegant solution will make it far easier to fix whatever simple errors slip through my fingers only to be almost certainly caught by functional testing.

I simply cannot waste time working on anything else than my problems. I only have one life to find elegant solutions to problems. I do not need to think about blame. I do not need to think about shame. I do not need something to tell me I didn't comply. I need something that helps me be more creative. Mandatory type systems do not help neither bring overall value to this endeavor.

Now, for the times when I really want a safety net, I'd rather write a framework that lets me express what those safety nets are. This, of course, is also covered in my book.

A little chat with Mr. Ingalls

I saw Dan again today, and I asked him about the previous post. After all these years of Smalltalk, hadn't it happened to him to become a bit, "bored", by it?

The answer was no, because to him Smalltalk is a vehicle for exploration, for understanding new things, for learning new stuff. For him, what is fun is how to put down what characterizes a problem into a computer so it can be solved, and Smalltalk is a good canvas for doing so.

In a way, he is interested about the meta aspect of it. How to put down what characterizes the problem of helping to put down what characterizes a problem so one can be productive.

How refreshing. And how true. Let's not forget that.

The surprise factor

There has been some conversation today about how, over time, one seems to lose interest in the language one uses. I think to a point it might be boredom, or perhaps it's a feeling of "yeah I see how that can be done" because you have a lot of experience... and then perhaps what follows is some sort of disappointment because it's not exciting as the first time used to be.

As if we needed a dose of dopamine as strong as the first one.

I think that if we stagnate because we do not get as excited anymore, it's not because the language isn't as exciting, and it's not because the venue at which we meet isn't as exciting. To a point it might be because the low hanging fruit has already been picked, and the hard problems make more time go by between the dopamine doses that come with success.

But perhaps, to a certain extent, it's because we keep looking at the same tree. So what do we do?

  • We can start a new language where no matter which tree we pick, there will be lots of low hanging fruit.
  • Or we can build ourselves a ladder so higher hanging fruit becomes closer.
I am starting to get a feeling that we need more ladders. We keep fixing the same old problems, and we keep running into the same relatively fruitless spots. Seaside was such a ladder. We need more of that.

And... above all... we need to remain able to be surprised. Here is a small story.

Some guy had been studying the teachings of the masters for many many years. No book had gone unread, no anecdote had gone by, this person knew everything there was to know. Finally, he got to meet one of the masters at the master's house. So the guy started telling the master all he had learned. The master got some tea prepared. The guy just kept talking, telling the master as to how he had learned what things and so on. The master started serving the tea, and... well, he just kept pouring and pouring in the same cup and it started overflowing. The guy kept talking though, worrying to embarrass the master if he pointed out the mess that was quickly spilling everywhere. But finally, he couldn't put up with it anymore, he stopped and asked "master, the cup is overflowing... why don't you stop pouring?". And the master answered "if you are full, you cannot take anything further in".

Another amazing day at OOPSLA

The second demo went better with the feedback from Vassili, and it's still running in its alloted time. But of course it can still use some improvement. So this time I got feedback from some GemStone folks that, quite obviously, have been doing Smalltalk for a long time. Tomorrow's demo should be even better.

Here is something that I really appreciate about OOPSLA. If you are open to learning new stuff, if you are open to searching something that can make you better, and if you are open to finding how astonishingly wrong you can be about something... then this is a place to be. Personally, I'd rather get criticism from people with a lot of experience. Because otherwise, how am I going to get where these people got in less time than what it took them? Why should I go down a doomed path when I can avoid it?

More of the same, please.

Next demo coming up...

So... after lunch and enough time for my brain to perform a good scavenge of the new space... the time for the next demo is coming up. Just 75 minutes to go. Hopefully the laptop won't keep thinking it got disconnected from the projector every so often. Also, I am hoping to put some of Vassili's feedback to good use. We'll see how it goes, v2.0 should be better than v1.0.

First demo shown! Three more to go

Man... the jitters... it's so much fun, but after you're done you have the semi-sweaty hands and all that. Particularly nice was how the laptop's video card would keep thinking there was no projector attached --- but only during the slides! For fun, I showed a 64kb demo while we waited for the time to come, and it worked perfectly. I think it has to do with the background of the slides being black. Silly NVIDIA driver...

Three more stress tests to go :).

Off to a good start at OOPSLA today

So... I was sitting on the E tables updating the slides for the first showing of my demo... in about 45 minutes... and the topic of the book came up, and then whether I had a publisher or not. Then, Göran mentioned the book counterpart of cdbaby. I will definitely have to check it out.

Update: compared to the printing costs I had checked out not long ago, Lulu's are more than 4x cheaper! Thanks Göran!!!

Monday, October 23, 2006

Low Space Notifier keeps coming up

Conferences like OOPSLA always do this to me. It's not even beginning to be late, and I already feel like I seriously need to do a compacting GC on my brain because of the information overload.

For example, I had many conversations about the nature of behavior today. They're rather abstract so I cannot quite put them in a blog without writing a booklet, but man... it's great to be able to have many such conversations in a single day!!!

OOPSLA is great. It just makes me want to sleep...

Assembly for Python

At the Dynamic Languages Symposium, the current talk is about exposing the CPU to Python programs in a way consistent with Python. Interestingly, they exposed all instructions of the CPU to Python.

While on one hand this gives great power, it also opens the door to bugs that are rather difficult to track down. I wonder if the risks outweigh the benefits... ???...

Dynamic Language Symposium at OOPSLA

I saw a very interesting talk a while ago, given by Ian Piumarta. Essentially, what is the least possible set of machinery that you need to build dynamic (e.g., modify objects at runtime, modify behavior at run time, etc) languages.

Just as an example, it was surprising to see things like a full Javascript implementation in 400 lines of code.

The necessary material you need is Meta-II, written in the early sixties. Or, on the other hand, ask Ian for their implementation which they will release in 1-2 months.

Very very iiiiiiiinteresting, my friend.

Sunday, October 22, 2006

Note about Camp Smalltalk

Good idea: bring power cords and power strips. With wifi, hubs and switches are no longer needed. Also, good thing, wifi is free at OOPSLA.

Those Smalltalk shirts

So how come when I come to these places I see Those Smalltalk Shirts, the ones that have particular vintage such as "this is from OOPSLA 1992" or something like that, but such things cannot be obtained anymore? We should set something up at Cafe Press.

Sunday at OOPSLA so far

Well... since this morning, many things have been going on.

I met with Vassili Bykov this morning, eventually Roger Whitney came by, then Travis, Martin McClure, Eric Winger, John Brant, and others. We went to have lunch and we had a great time. Some of the conversations included: optimization of 32-bit GemStone performance of GbxLargeDictionaryBucket, Smalltalk being used for generating code for sensors running on tiny hardware (900mhz Crossbow CPU, 4kb ram, 512kb flash), Smalltalk being used at JP Morgan, performance of VisualAge GC when the old space is almost full (the new space won't get tenured leading to spending most time copying between the semispaces), performance of Smalltalk code, John Brant's torture tests for RB (e.g., go to String and inline basic methods over and over again and make sure the image doesn't crash), a P2P approach to using shared page caches in GemStone to avoid overloading the Stone with traffic, and many other things.

I insist --- if you are not here, then you're missing all the fun.

We're currently by the E rooms as the wiki conveniently informs. Come on by and join the fun :).

Saturday, October 21, 2006

Saturday, Starbucks, and Beyond

I just got back to the hotel. I was at a Starbucks this afternoon, updating the OOPSLA wiki and writing the book (248 pages now). But as there was no movement on the wiki page, I thought that people would get in late today so I wouldn't get a chance to see anybody.

Eventually I decided to go to Powells bookstore. I made two blocks on 9th instead of 10th because I decided 10th looks a bit less happy before getting to Powells. I got to a corner, and I saw this guy walking towards me from the other end of the street. Like any other guy. I could have just let him stroll by.

Not this time. I asked him if I hadn't seen him before, perhaps at a Smalltalk Solutions or an OOPSLA. He turned out to be Roger Whitney, who was coming back from buying an AC adaptor for his laptop as the one he had was at home. Needless to say, we had never met each other before. Now I think I got confused with Hans-Martin Mosner, who I had met in STS 2006...

We went back to the Starbucks, we updated the wiki page, and we had an interesting conversation about artful Smalltalk. In particular, Roger teaches Smalltalk at SDSU (as you can see from his link). Here are some interesting things I did not know.

  • Enrollment is way down, there are 4,000 students for about 10,000 places. Computer science, in particular, is down 40% since the dot com bubble bust. This figure is consistent with other campuses.
  • Universities train students into writing comments for even the simplest methods because instructors do not read the students' work. Therefore, comments are perceived as a feature by the instructors who grade work by skimming, reinforcing the notion that even "x := x + 1" needs a comment.
  • Students think that "console output" is enough of a good way to obtain a result out of an object oriented program. Get every 2nd node out of a doubly linked list is interpreted as dumping the stuff into the Transcript. The inspector is unused.
  • A full 25% of the grade Roger assigns to students is based on the comments. Are they bad comments? Sorry, now you get markdowns. Even after careful instruction, on average about 1 student every 40 will do their homework assignments properly.
Welcome to reality --- we really need to do something about that.

So Starbucks was closing down at 8pm. I updated the wiki again because we were going to have dinner at Mandarin Cove. I was putting the laptop away to leave and at that instant John McIntosh walked in through the door. He had arrived with Tim Rowledge a while ago and they were starving.

Off to Mandarin Cove we went and we had a great conversation about the status of our projects. If you were not there, then I am really sorry for you my friend because what you missed is simply too much to be put down in a blog.

What a great start for OOPSLA 2006. More of the same, please. See you tomorrow!

Enjoying PDX

Portland is such a nice city... if you're in and you'd like to meet, come on over to the Starbucks at SW 9th and Taylor (don't forget to check out the wiki as well).

Welcome to Brave New World

But yes, what a good idea... manufacture babies. And what happens when one neglects a nourishing environment and wants to exercise the warranty? A complete mess and an exercise in misinformation, coming from this article in New Scientist. Shameful.

Now go read Brave New World by Aldous Huxley.

Friday, October 20, 2006

OOPSLA --- Red Lion Hotel Hint

If you will be staying at the Red Lion hotel across from the conference center, ask for a room facing North. According to Marisa (helpful lady at the front desk), rooms facing North experience much less noise due to traffic.

OOPSLA Wiki Page

If you are coming to OOPSLA, check out this Wiki page. See you here :).

Sunday, October 15, 2006

OOPSLA is coming up --- no wiki page?

OOPSLA is essentially next week. Did I miss something or is there no wiki page somewhere so that Smalltalkers can synch up with each other? Personally, I think missing the chance to see each other outside the context of OOPSLA would be a shame.

I think we should get something going --- here are my 2 cents. If there are better alternatives, then by all means let's use them!

Update: people are signing up! This is great stuff!

Saturday, October 14, 2006

How these things begin

I had a chance to wonder about the circumstances in which I learned Smalltalk. To a point, they were a bit miraculous.

I did not like a university, I went to another. I realized how much I disliked how Computer Science was being taught, so I shifted to Mathematics. The Algebra instructor I had was not fun at all, so I decided to change to another Algebra class. The guy there also knew how to program computers, very nice. I started talking to him about computer programming things, and eventually he insisted so much about this thing called Smalltalk. I was curious, and in time he spent 3 hours and taught me the basics. I paid attention to what he had to say. Although my Pascal/Assembler past was not the best background for it, I took a more or less unbiased look at it. And I liked Smalltalk because you could have things that behaved in a much more real sense than a bunch of bits thrown somewhere.

I saw my old programs, in which I had invested so much time and energy, become obsolete overnight. It didn't bother me. I had something new and better to learn.

Had I insisted with any of the things I did not like, I do not think I would have heard about it. Had I determined that Smalltalk was bad because I couldn't do xor ax, ax or any other far fetched thing, or had I been too attached to what I had done already, I would not have paid attention to it.

So what is the mechanism that draws people to Smalltalk? These small miracles? Or something else? What is your story with Smalltalk?

Saturday, October 07, 2006

More and more Smalltalk blogs

Going through blog comments, I found Tim's blog called Pintside Thoughts. Welcome!

Us vs. Them mentality

I went over the page Blaine linked, the one with the quotes about Smalltalk people being arrogant and such.

Let's assume all that is true. After all, even today I meet Smalltalkers that are nearly intractable because they won't listen, or they will be unnecessarily aggressive, and in general will care more about themselves than about getting the job done.

But wake up and smell the coffee, my friend:

The Smalltalk community does not have exclusive rights to such people.

There are people like that everywhere! In fact, how about the people you meet every single day, all those with whom you cannot even utter certain words because otherwise you get judged as guilty of all possible crimes? Isn't doing that equivalent to assuming that "this person has idea X, I do not like idea X, therefore I do not like this person"? Isn't that awful close to concluding that "I do not like this person, therefore I do not like any of this person's ideas either"? How's that for being arrogant?

What should happen is that the arrogant people should get ostracized for being obnoxious, and that some other less arrogant people should take their place. Fortunately, that has a healthy tendency to occur over time. But by far the most important thing that should happen is that people become able to listen to each other. And please note that listening is much more than hearing some sound coming off from some mouth nearby.

In the mean time, why do we have to mix whether the arrogant person knows Lisp, Java, or Cobol with the fact that we cannot stand the person to begin with? What in heck do the qualities of whatever programming language have to do with how unbearable the person that knows such languages is?

Computer programming issues are perpendicular to how beautifully people look in a mirror.

This whole so-called issue is pointless, and a complete waste of energy. The lesson we should learn once and for all is to let go of people issues when we deal with technical problems. Because it's not like if Moe, Larry and Curly are pissed off at each other, all of a sudden their development tasks become easier to accomplish.

Once we ditch all this nonsense away, we will be more able to just do our best. And that would be bad because... ???...