Tuesday, June 19, 2007

Tale of two (three) platforms: a precursor

Let me finish this post as a precursor of the thesis writing... have been stalling for a while but today I feel like writing...

Recently, there are several blog posts that again try to dissect the trend and the collision between Microsoft and Google, and how the trend starts to shift to the GOOG side not only on the search front but in other domains such as enterprise app, web contents and cloud computing.  Here are the several that I recommend:

An anecdote: while Microsoft is far from bankrupt (which is a case made in by Don and MS Jobsblog), it is not interesting anymore.  I guess I only have around 1 month to trump whatever I dislike about MSFT publicly so please bare with me...

1. MS is still trying its best to court the developers, its technology just isn't what a programming prospect (a.k.a. alpha geeks such as Mr. Gate himself) would use to build killer app such as Ruby on Rail or facebook...

2. Well there's the naming confusion problem... but besides the unappealing name, and despite the efforts to court enterprises, MS app are just not the most elegant to use anymore.  The simplicity and elegance now belong to GOOG.  Besides the Windows and Office, it's difficult to find an average user who use other MS services. 


IMHO, GMail still trumps Hotmail

  • in terms of mail organization (conversation-based and tag is certainly easier to read and retrieve),
  • free of banner ads that takes up some important spaces and quirks me.  Please...I'd rather have textual/relevant ad than display ads that keeps flashing and quirks my eyes... and... if you cannot get rid of it please... put it either at the side or the bottom instead of the VERY TOP!  Putting animated ads on top is just plain distracting.  You know... I DON'T NEED TO PAY to have good mail services, so stop making me pay!
  • ease of use (no keyboard shortcut in hotmail).  I guess hotmail is not designed by the ribbon team...

RSS Reader

I stick with MS Live even though I never use the Live Search (it's just not good enough).  I was used to start.com and then switched and got too lazy to reorganize the page.  Last time I checked... in terms of RSS feed MS Live is still better than iGoogle because I can add feeds easier.  But neither technologies get much attention... the talk of the town is Google Reader.  One day if I have enough free time I will do the switch.

Word processor/spreadsheet

While Google App is no where as competent as Office (and probably will never be), it is the most promising online office suite and with Google Gears in in maturity, the platform will gradually migrate from desktop to the cloud, at least for users like me who don't want to pay $500 for a full-fledge Office 2007.  Office 2007 will remains dominant... but the web platform will be lost.

Yes, it's all about the platform.  The control of the platform will determine the relevancy of both companies in the Web 2.0 era.  So far Google has the edge as being the command line of the Internet.  It is unlikely to change unless Microsoft builds a search engine that is not only as good but way better than Google.  While it's certainly not impossible, Google will remains dominant.  (Ask a friend which search engine he/she will choose: Google or Live Search.  I bet you the answer will be: "what Live search?  isn't it called MSN?  Well that's the answer Caryn gave me).

While it's certainly impossible to take on Google now, search is definitely NOT the platform... it's only a gateway to the web.  There are a few suggestions I have to win back the platform:


What is the reason the IE is most bloated (in terms of memory), slowest, and the one most prone to attack among the big three browsers.  For me, my IE 7 could never get pass the http://runonce.msn.com/runonce2.aspx site and it only shows error on page in the status bar.  Eventually I was fed up and I never used it (not even for experimenting) since it cogs memory and is slower.  Most of the ppl I know from school use firefox... that's certain an evidence of lost of alpha geeks...

Now Joel Spolsky has spoken up: Safari is just loads faster and although it's not perfect, but sure that by October Apple will release a polished product that can compete head-to-head with firefox .  MS has conceded the music market to iTune, but the lost of the browser market will be detrimental.

Now it is time to rally the best talents again for IE 8.  Make it easier to use and faster; make it less coupling with other MS products to make it more flexible; and... make it a cross-platform browser please... Linux is a small community but nevertheless a powerful one.  And if you believe IE is really better... why not give it to the Mac user who have been thirsting in hell? (for those who don't get the joke please see here)

Online app and synchronization

Yes popfly is nice, but it's time to step out of these small pilot project and build a killer app for the Web 2.0 world.  At least be prepared to release an online MS Office (not the Office Live) suite that contains sufficient functionality for normal users who used the pirate version of Office.  Given MS's experience in productivity suite, if the online version is not too entangled with other MS services (like Office Live or Sharepoint which... yea... I have NO IDEA what it's about even after some wiki-ing), and perform as well as Google App, then MS will surely win.  Yes it will mean some deference from the Office cash cow but you gotta take a risk to do some great.  It's again a dilemma between dominance and revenue.  Revenue is great but once you lose your dominance the revenue will eventually diminish... don't believe it?  Just look at IBM...

With Google Gears, the synchronization problem will be solved and the need for desktop application will diminish.  I won't reiterate the points, but MS still retains the two greatest assets will let it win the war: the browser and the operating system.  Solve the problem (the most difficult part), then embed it as a window updates.  Then release the API so that third parties can use the tool to develop synchronized online app.  Here is the platform!  Well I know it's easier to be said than done... but I gotta say it now!  Well no one reads the blog anyway... so let me abuse my freedom of speech while I still can!

Community platform

Unless one day WLS gets rid of the banner ad, blogger will still be my favorite blog tool.  Well WLS integrates better with WLW (and it seems I cannot post pictures on blogspot with WLW).  But blog is so yesterday.  Today, the platform is facebook.

Btw... here is my profile.  I'm not sure if anyone will see this blog and add me... but let's see.

My recommendations?  Buy it before it's too late.  Facebook has the potential to be the next platform.  I guess since Bill and Mark are both Harvard alumni there is a chance.  Certainly, MSFT can afford $6 billion.  Google is going strong and Yahoo! is looking to regroup.  Losing facebook to either of them or let it become another platform is a serious threat.

I have in mind how to extend the facebook platform... maybe another post.  (Not that anyone will care enough to read it and take it seriously anyway :D )

P.S. Well it took 2 hours... which meant a whole day of work.  I guess I will have to resume the thesis writing tomorrow :(

Problem with startups using MS products

This is a response to Don Dodge's post of Microsoft - a friend to startups.

I guess there are several problems with building-on-top-of/relying on MS technology.  Some are technological and the others are philosophical:

1. Technological: By using MS technology, you place a bet on the proprietary software.  Indeed there are advantages such as supports.  But you also have to rely on the company to fix the bug/release patches.  You need a strong faith that MS produce great products because  you will not be able to fix the bugs on your own.

2. MS technology are tightly integrated, which means I usually have to use the whole package.  MS products are not always the easiest to use (for me... I still have no idea what Sharepoint server is even though I spend a long time reading the wikipedia entry) and will I be willing to sacrifice this flexibility?

3. Economical: although there are incentives, the support cost of MS products will take a toll, esp for startups.  I always thought... maybe the best solution is MS develop a VC branch (like Y combinator) that invests in startups... allow them cheap access to MS products (but not mandatory).

4. Licensing. since most MS products are propriety you might run into the licensing fiasco like TestDriven.NET.

5. MS has to tendency to extend into its customer market.  Nice that you mention the Antivirus market, because MS now directly competes in the market with OneCare.  Now can a startup owner sure if MS will not compete with me one day, esp. since MS is so big and pervasive.

Sunday, June 17, 2007

My recent frustration + another Live Search vs. Google face-off

Well there are some big changes in my life recently. Some of the brothers and sisters in Montreal have been notified already and let me just say that for the next month I will be concentrating on my thesis and not much else. My mind sometimes still wanders off to the la-la-land to reminisced about the lost chances and past sweet memory, so the only way out is sidetrack myself with some works. Unfortunately, I have reached a bottleneck in the thesis project: one of the tools (FINT) that I relied on (but unfortunately not written by me) does not scale well on large test subjects. Before I left for the Ephesus retreat during the weekend I left two machines on to test 3 reasonably big software projects (> 100,000 LOC). I was hoping that after the weekend I would be able to obtain some decent data. When I returned on Monday the machines were still running at full capacity. I waited one more day, hoping that I could eventually obtain the result. Well Monday was a bad day already, but to add insults to injury, McGill shut down the power supply on Monday night. When I came in on Tuesday all the machines were dead. For the past two days I was putting some final efforts to obtain the result from the large projects (azureus and soot) but if the machine is still running tomorrow, then it is time to think of an easier approach so I can actually start analyzing the data.

Honestly I am feeling lost... don't know what I'm fighting or what is the purpose of going to the lab each day. To take my mind off things, I decided to pick up the Python Challenge again. Since I feel my own reluctance to touch the Java language and the Eclipse project maybe python can get me started again.

I'm now reworking all the challenged and I remember reaching level 5. Today I was reworking a piece of code that uses pickle. However, the code needs to open a file and I want to catch the IOError exception better this time. Unlike Java SDK, python lacks a central/organized library for documentation so I decided to search it with both Microsoft's live search and Google.

Although my friends have been telling me recently that I am slowly being converted into a MS-philic and an invisible evangelist of MS technology, I have one recommendation for those friends of mine (probably 0) who want an alternative and free themselves from the Google-centric life:

Forget about it. Google has won. Now move on.


Round 1: "python errror"... well I unintentionally misspell the word. But it reveals the AI prowess of Google search.

From live search

From Google.image


Who won: Google

Why: Google is smart enough to detect my mistake. Live search is stupid and it just retrieves whatever I typed. It shows the vast amount of data that Google possesses and the prowess of the internal inference engine that detects wrong words and correct word. It is especially cunning since IOError is syntactically not an correct English word. It is just a name. But Google knows that most people would have typed IOError and thus when you misspell the word it is able to correct you. Its data IS the dictionary.

Round 2: "Python IOError" and "python IOError library". Well now I want to check if given the correct directives the search engines, it actually returns what I want.

From live search: Well it returns some posts from the python news group (right?). I don't know... it looks garbage to me so I didn't bother to find out.


From Google: Right on! It pinpoints to exactly where I need to go.


Give you one more chance Microsoft! Let's try a more precise "python IOError exceptions"

This time Live is more promising. Although the first two options are not optimal the third and the fourth ones lead to the right direction. However, you need to take some points off since it still thinks IOError is a misspell.


Google: result is less relevant this time. Honestly I tend to skip links that direct to email exchanges or usernet posts since they tend to be unstructured and not authentic enough.


Who won: Google

Why: Google is able to point me to the right direction given a small part of information while live needs more help. Just as an aside, it kind of shows the philosophical difference between two companies.

Google: less is better

Microsoft: more is better

However, both are still better that ask.


Hey, where is the Algorithm?

P.S. If you still keep track of techcrunch (which I kinda picked up again since I temporarily lost my purpose and now try to sober up and work again), you might have come across with a rumor that MS is sending a team of rockstar developers led by Sanaz Ahari to rebuild the live search engine. I saw Sanaz's video from Scoble show, and I have been using both start.com and personalized live (another confusing misnomer from MS) as my RSS feed reader. Hopefully they can produce something decent cuz I'm now sticking with google. (searching for "techcrunch live search sanaz" for the link proves me right again (sigh~) )

Google Calendar Surprise


A new surprise today!
I was using google calenadra calendar and trried tried to add an entry. The event is at 4:13 so I put:
"Mom arrives @ 4:13 (AC XXX)"

When I created the event , the tThe the entry on the calendar becomes:
Mom arrives ACXXX)$
So the time and a brackelt bracket got eaten up!. When I tried to correct it manually I saw th etime the time was adjsuted adjusted to $1;3 - 5:13! Google Clandar Calendar was so smart! But maybe it got TOO smart and ate the bracklet bracket as well. It didn't behave the way I anted it to and I had to manually correct it. It's good that an application is smart...but iwhen when it tries to outsmart you and do something that you don't want, doesn't it quirk you?

When it MS going to make its own Windows Live/MSN//whatever-name-it-becomes Calendar too? But I guess it will have those annoying banner ad on top that makes me throw up so I maybe have to stick with tGoogle Google Calendar again. But I don't like the idea of having mall my data in Google server so I don't use it much anyway. A goo'-old good-ol' notebook is just enough for me :)

OP.S. Blogger is EXTREMELY slow on Linux/Firefox 2. That's why you see all the spelling mistakes! There's IS a reason to love the Windows Live Writer...


Update: Finally fixed all the spelling mistakes with WLW.  Pity though... I was searching for the url using Live Search and it fails to return this url in the first spot (the first spot was occupied by WLW blog in Live Space).  In fact, it fails to show up on the first page.  Google returns the WLW url in the third spot instead.  Guess there's still a few catch to do.

Thursday, June 14, 2007

Google Calendar Surprise

A new surprise today!

I was using google calenadra and trried to add an entry. The event is at $:13 so I put:

"Mom arrives @ 4:13 (AC XXX)

When I created the event , the tThe entry on the calendar becomes:
Mom arrives ACXXX)

So the time and a brackelt got eaten up!. When I tried to correct it manually I saw th etime was adjsuted to $1;3 - 5:13! Google Clandar was so smart! But maybe it got TOO smart and ate the bracklet as well. It didn't behave the way I anted it to and I had to manually correct it. It's good that an application is smart...but iwhen it tries to outsmart you and do something that you don't want, doesn't it quirk you?

When it MS going to make its own Windows Live/MSN//whatever-name-it-becomes Calendar too? But I guess it will have those annoying banner ad on top that makes me throw up so I maybe have to stick with tGoogle Calendar again. But I don't like the idea of having mall my data in Google server so I don't use it much anyway. A goo'-old notebook is just enough for me :)
OP.S. Blogger is EXTREMELY slow on Linux/Firefox 2. That's why you see all the spelling mistakes! There's IS a reason to love the Windows Live Writer...

Tuesday, May 15, 2007

Fiddling with Eclipse: Editing Updating button in a WizardDialog with multiple WizardPage

Well it's my first entry in the wiki.

Today I will go into a problem with update buttons in a WizardDialog that I fixed today and thought maybe it would be useful to share with others.


In my project, I need to show a WizardDialog that contains two WizardPages. However, in Eclipse's architecture, a [http://help.eclipse.org/help32/index.jsp?topic=/org.eclipse.platform.doc.isv/reference/api/org/eclipse/jface/wizard/WizardDialog.html WizardDialog] object does not directly control the pages it shows. It manages the pages through the [http://help.eclipse.org/help32/index.jsp?topic=/org.eclipse.platform.doc.isv/reference/api/org/eclipse/jface/wizard/Wizard.html Wizard] object. In fact, the [http://help.eclipse.org/help32/index.jsp?topic=/org.eclipse.platform.doc.isv/reference/api/org/eclipse/jface/wizard/Wizard.html Wizard] object controls the transitions between pages and the completion of the WizardDialog. WizardPage objects are added to the Wizard, not WizardDialog.

Well that is simple enough...something that you can find out with [http://help.eclipse.org/help32/index.jsp Eclipse Help], so what makes you keep reading all the nonsense?

Please be patient and let me explain

Well, my problem is, I want to add a WizardPage that contains two checkboxes, such that:

* If checkbox A (''Apply filter for isomorphic snippet of the selected cluster'') is checked, the Wizard can be completed (by setting WizardPage.setPageComplete(true) such that the Wizard can finish up and the '''Finish''' button is enabled.

* If checkbox B (''Apply statement aggregation to non-consecutive isomorphic clusters'') is checked, then, depending if checkbox A is checked also, the '''Next''' button can be enabled as well.

[[Image:Ce-screenshot1.png| AnalyzeClusterWizardPage |500px]]

The problem is, I didn't know update the buttons such that, if checkbox B is unchecked, then the '''Next''' button is disabled, but if checkbox A is unchecked, both buttons should be disabled.

Calls WizardDialog.updateButtons() to refresh the status of the dialog buttons inside a WizardPage

==Details Solution==
I always run into the problems when I started unchecking the checkboxes. For instance, if I unchecked checkbox A and then checked it again, the ''Next'' botton does not always get enabled.

I tried various methods by modifying SelectionListener of checkbox B but no avail:

fReaggregateCheckbox.addSelectionListener( new SelectionAdapter() {
public void widgetSelected(SelectionEvent e)
if ( isPageCompleted()) {
isNonconsecutiveRefactored = ((Button)e.widget).getSelection();


public boolean canFlipToNextPage()
return super.canFlipToNextPage() && isNonconsecutiveRefactored;

Well the problem is, I did not know where how to enable/disable the '''Next''' button in the WizardDialog, and I assumed that the calling canFlipToNextPage() will automatically enable the '''Next''' button since the first click always works.

Luckily, Eclipse provides source code, so with several F3 and Ctrl-Alt-H, I discovered that IWizardPage.canFlipToNextPage() is usually called by WizardDialog.updateButtons()! So WizardDialog.updateButtons() is the master control of the buttons in the dialog!

So I modifided the SelectionListener of the checkbox:

fReaggregateCheckbox.addSelectionListener( new SelectionAdapter() {
public void widgetSelected(SelectionEvent e)
isNonconsecutiveRefactored = ((Button)e.widget).getSelection();

And now everywork works perfectly :)

Monday, April 16, 2007

Fiddling with Eclipse (Day 14) : bashing the documentation

Well finally I've witnessed the traffic of my blog dwindling from 50 to 0 (and mysteriously rising back to 5) this week.  I guess the trick that uses the 102 class to generate traffic is not a long term strategy.  A long time strategy would involve me blogging daily which I still find pretty difficult...

What have I been doing between my last entry and now is a full throttle in the thesis project.  I slacked during this weekend but in general I have been working pretty hard and I aim to have most of the tool finished by May 1!  Sounds too ambitious?  Well if I don't finish the tool by then I'm totally doomed (doomed = not able to work at the new place!... not exactly apocalyptic yet).

My secret ambition though, however, is to blog about my project during this time.  I have been wanting to do it since Apr 1, but it got delayed since I was too lazy to do it.  But I guess by 1) not cooking my dinner (and not my lunch and perhaps even breakfast, 2) by not watching Youtube or my feed at www.live.com or the NHL playoff it's indeed a feasible goal!

So... ready for my Eclipse blasphemy?

The Eclipse IDE, although sponsored by the Eclipse Foundation (IBM in disguise) and provides one of the best support among all the open source projects, sucks in documentation!

An Eclipse expert may say, "What is this guy talking about?  Can you go to help.eclipse.org to find out everything you need to know!"

This is 50% true...until you reach the internal API.  Then, unfortunately, you're on your own...

One of the objectives of the project is to reuse and expand the Eclipse refactoring API.  In particular, I was very interested in the Extract Method Refactoring.  However, Extract Method Refactoring is part of the internal API.  No documentation... so I have to resort to my F3 strategy.

Normally, F3 strategy works quite well because the associated is documented and you can also peel away the most-often-vague javadoc comments by looking at the source itself!

However, the internal API does not provide you with that luxury!  Most horribly, the code itself has NO documentation!  Which makes me wonder: did the Eclipse team purposely stripe away the comments (cuz it's also impossible to work collaboratively without comments and eclipse is not a one-man show), or... the developers just don't comment the code?  But it's the I-B-M that we are talking about, not a 2 people SourceForge project!

I remembered spending the first 5-6 days in the end of March just peeling away the internal refactoring API.  And days were waste because 1) reading code is not fun and make you sleepy 2) I constantly get distracted by the intricacy (I didn't use the ConcernMapper :'( )  Those were the days when I coded nothing and felt a total despair.

It was only when I found a refactoring tutorial of Eclipse that I grasped a glimpse of hope.  Mind you, the refactoring code described is NOTHING like what it is in the actual eclipse code.  Not only is it a stripped down version but the code structure is completely different!  Luckily, this article, which was published on February 5, 2007, gave me enough of a headstart to bootstrap myself (which also implies that had I started earlier it would take me much longer to generate this info...).  But those folks at UT, and UCS must have a real hard time.

Eclipse Hint #1:

Well here is a problem that took me around 2 hours to get around.

I was trying to highlight some text inside a SourceViewer.  One natural way is to use TextPresentation object to store the change and apply to the SourceViewer:


The trick is... I need to highlight some of the text in red, then inside this chunk of text, a subset will then be encode in blue.

So my trick was...

TextPresentation t = new TextPresentation();
for ( ... a selected group of text ...)
   t.addStyleRange(...red font...);
// then
t = new TextPresentation(); // recreate t again 
for ( ... a subset which overlap the original text ...)
   t.addStyleRange(...green font...);

This strategy, although looks innocent, didn't work out, because some texts that were supposedly highlighted in red appear in black.  However, if I comment out the second part, then the highlight goes back to normal.

The interest thing is, the texts that were highlighted in red but appeared in black, did not overlap with the texts that were highlighted in green.

I played around with this code for 2 hours trying to peel/debug the problem is but since the code doesn't crash (it just doesn't 'appear' nice for me) I had a hard time solving the bug.

In the end, I found out that it's not wise to call changeTextPresentation() twice.. it's essentially redrawing the source viewer twice... so I only called changeTextPresentation()  once instead when I put all the changes into the TextPresentation object.  Since that TextPresentation crashes if you add overlapping changes to it, I used replaceStyleRange() instead of addStyleRange()..

Then... everything... just....works...

Morale: Make the code works first and think about optimizing it later.  I avoided using replaceStyleRange() because it's multitudes more complex than addStyleRange().  But once I used it, it saved me a whole night of work!

More to come: how-to-code-a-function: side-effect???

Wednesday, April 04, 2007

Brain Teaser: Solve This Math Word Puzzle

I came across this piece of puzzle today and then I decided to abandon my project and write a solution for it:

Each letter stands for a 1-digit number. No two letters may stand for the same number. Find a value for each letter from the following set: 0, 1, 4, 5, 6, 7, 8, 9.

'' ASK




The answer can be found here.

The concept is simple but the code is more verbose than what I thought... here is my python solution. Can anyone achieve one that is less verbose?

def permutation(num_list):

if (len(num_list) == 1 or len(num_list) == 0):
return [num_list];
permutation_list = [];

for i in range(len(num_list)):
list_copy = num_list * 1 # deep copy
item = list_copy.pop(i)
one_less_perm_list = permutation(list_copy)
for j in range(len(one_less_perm_list)):
permutation_list.append([item]+ one_less_perm_list[j])
return permutation_list

def solve_puzzle():

combination = permutation([0, 1, 4, 5, 6, 7, 8, 9])
var_list = ['A', 'S', 'K', 'G', 'V', 'E', 'D', 'U']

for i in range(len(combination)):
assignment = combination[i]
set_of_answer = dict([(var_list[j], assignment[j]) for j in range(len(var_list))])
if set_of_answer['G'] + 1 != set_of_answer['U']:
if (set_of_answer['A']*2)%10 != set_of_answer['S'] and (set_of_answer['A']*2)%10 != set_of_answer['S']-1 :
if set_of_answer['K']==0 or set_of_answer['E']==0:
ret = set_of_answer['K'] + set_of_answer['E']
if (ret%10 != set_of_answer['D']):

carryover = ret/10
ret = set_of_answer['S'] + set_of_answer['V'] + carryover
if (ret%10 != set_of_answer['E']):

carryover = ret/10
ret = set_of_answer['A']*2 + carryover
if (ret%10 != set_of_answer['S']):
print set_of_answer

print solve_puzzle()

But amazingly the PowerShell solution is so elegant! Too bad that it's not yet available to Vista and...wouldn't be open-sourced to Unix. Or else we can get ride of Bash or C-shell! Guess that this day won't come in near future...

Monday, March 26, 2007

Can Codeplex make your code prettier too?

Disclaimer: the following is a part of comments that I posted on Josh Ledgard's new post Google makes your code prettier.  Since I have some pretty bad experience with posting long replies on MSDN site now I always save a copy.  I thought that since I haven't updated my site for a while, I will also post a part of my response here.

I took notice of Google Code a lot earlier than Codeplex because of its Summer of Code project. It is obvious that Google is very good at garnering the attention of (young) developers and keeping its reputation as the coolest place for developers.  For instance, on reddit the prettifier got 259 points.

Instead the last entry of FoxPro got released on CodePlex, got almost no attention.  (P.S. I always think that MS should release VB6, the latest obsolete/non .NET version of VB to codeplex.  VB6 is a lot more popular than FoxPro...)

It is not a popularity contest, but in general Google Code is the place where cool ideas come up.  Even if I have a cool .NET project I want to publish SourceForge is probably a better place for now.  Codeplex only hosts MS-sponsored project and is a PR machine.  That's the impression I get, is that true?

Below is my comments on Josh's blog

1. what makes google code more popular than codeplex besides publicity? well first of all they did a fine job at publishing their ideas. second, googlers are allowed to devote some of their own time into their own interesting projects. I guess it's not possible in MS but, I am sure you guys have written a lot of cool (little) tools that won't monetize but will be very useful. So maybe it's time to encourage Softie to publish their ideas (esp the ideas/prototype that aren't funded) into codeplex.

An open source playground where Softies (some of the smartest and most experienced coders in the world) publish their own cool gadget will get a lot of attention.

2. Re-amp the interface of codeplex: now it is a bit lame. The search bar should be in the middle, and i still prefer a directory of project types instead of popular tags. Popular tags should go to the right side (much like channel 9 where it lists the videos based on popularity).

3. What is the goal of codeplex? A place where "ideas" converge or a place where "Microsoft-published" ideas converge? If it's the latter then codeplex must expand to allow Java/Firefox plugins/eclipse plug-in to get hosted.

4. One thing that Google Code does better is to designate a person (not a no-name PR announcement) to introduce a cool idea in code.google.com. Too bad they haven't done it for their Open Source projects. But this is an opportunity for codeplex. Codeplex really needs a host who can communicate important ideas to the community. It's most vital for important projects like IronPython to garner attention!

5. although the MSDN website is very overloaded, it saddens me to not able to find a (obseravable link between msdn and codeplex. That really signifies the "importance" of codeplex within MS' priority list. If MSDN is the focal point of Windows developer, then it should be an entry point to codeplex, no?

Update: the comments never made it to Josh's blog.  It keeps rejecting them and I guess my voice wouldn't be heard :P

Thursday, March 22, 2007

COMP 102 Temporary Wiki

I am too lazy to have a wiki and newsgroup is something that is obsolete anyway. So for all the helps you need, please post it here, and I will answer them to the best of my ability.

Help for assignment 4:

I have received some questions about question 2 in the assignment, so I will post some clarifications from the instructor here:

From the instructor:

The "model the peers" part for 4pt is about describing how they modelled the
network, and why. This can be done on the graph, or in a few sentences. The
second part for 2pt is for only drawing the graph itself.

In this question we are talking about a P2P network where peers talk DIRECTLY
to one another.

Hope it helps..

Update: I will not be here at 1 pm but I will be back at 2 so the office hour is delayed for 1 hr.

Help for assignment 3:

1. Truncating an floating point:

Try: var truncated_value = Math.round(my_initial_floating_point_val)
reference: http://www.javascriptkit.com/javatutors/round.shtml for help.

2. loop to infinitity?

Take a look at how to use break in loop.
Cheap shot: try, while(confirm("you wanna keep playing?"))

Update: skeleton code of question 2 is available! Check the TA page!

3. Hard Way to code Tic-tat-toe.

I tried to put up a sample code in the blog but it interprets the code as valid HTML and tries to parses it. So i could not display the code probably on the blog. Let me put it this way: if you use HTML table it will requires a lot more knowledge than what you have learned in class. Better to keep things simple by not touching the HTML layout at all.

Of course, if anyone is really interested in doing that, then reply here and I will try to create the sample code.

4. Multidimensional Array

Unlike Ruby or Python, there is no built-in support for array / list type in JS. Everything is treated like an object.

Therefore, to declare a 3x3 2-dimensional array you need to do this:

a = new Array[3];
a[0] = new Array[3];
a[1] = new Array[3];
a[2] = new Array[3];

Well you get the idea. Not the most elegant way to construct it and I will avoid it as much as possible.

Again, please post your questions HERE instead. I don't check my email too often so please use this wiki. It also benefits others who may have the same questions in mind.

Update: I have made the following list to Greg as the submission format requirement. But I have not received any news so I will post the following as the preferred guildline for this submission.

1. Each assignment should be submitted electronically through a ZIP file.

(Very important!!!) The name of the zip file should be: c102-a3-lastname-firstname.zip . Files not adhered to this format is not accepted.

2. The zip file MUST contain 3 html files with the following names:


I will run a script that tests for these three files. File names other than the ones I specified will not get tested.

3. Each file MUST COMPILE: a blank screen means automatically a zero for the specified question.

4. Each script MUST contain a comment that specifies the name of the author, and if they used the skeleton code provided. Submissions that use the skeleton code but did not specify the source is considered plagiarism.

5. All files MUST BE SUBMITTED to this email address: iyuen@cs.mcgill.ca or isaac.yuen@mail.mcgill.ca . Submissions to any other places will not be accepted.

6. Submission deadline March 27th 11:59 pm.

Wednesday, March 21, 2007

Best language to teach computer newbies

I have been TA-ing an elementary computer class for this term.  Initially I chose the class because I thought: "the basics of the basics, how tough (to mark the assignments) can it be?"  Turned out that I was very very wrong.

Well I have lots stuff to say but I will keep my mouth shut for now, until everything is done.  After all, I think I have not done a perfect job, although I tried to help the students as much as possible.

But recently the students (who are mostly computer newbies who are majoring in Art/Media Studies) are asked to do a programming assignment.  Guess what language they are asked to program in?


A. Python (dynamic language, the one that I use for fun programming)

B. Scheme (default language to learn for MIT undergraduates)

C. Java (unfortunately the most popular language for now)

D. JavaScript (the backbone of Ajax and the language of tomorrow)

Answer: out of all the languages available, the students are asked to program in D!

Disclaimer: it has nothing to do with the instructor of the course.  He's a good man and does not have a choice.

Wow, I'm amazed by the foresights of McGill SOCS.  They must have read the Steve Yegge's Next Big Language and decided that Web+dynamic language+OO = the language that everyone should learn tomorrow!  Let's go with JavaScript.

Problem: the students don't even know how to host/where to host an HTML page and you expect them to know how to use JavaScript?  And program a Tic-tat-toe?

Honestly, I didn't know JavaScript maybe until last year (although it wasn't hard to pick up!)  Out of all languages that have runtime-environment, and more simplified data structure and syntax, why would they choose JavaScript!

If you really like the Java syntax then why don't just go for Java instead?  Well, yeah, the declaration is not something that you can learn in a day and most of the students would probably spend 90% of the time trying to compile the code.  And when they submit the assignment and it doesn't work, you have to deal the "but it compiles" questions.  And Java is pretty much useless for day-to-day use.  With JS at least if you have your own site you can do some small JS tricks or write a greasemonkey script to make your site better.  But, JS does not survive on its own and to use it the students will have to learn all the intricacy of HTML and DOM!  Not that they are hard to learn, but just not something you expect from students who just want to take an easy course for a good grade.

So... what's your language for teaching the basics of programming to newbies?  Do you agree with me?

Saturday, March 17, 2007

Summary and thoughts of the AOSD Panel

I'm now back in Montreal. I still have a post about AOSD Conference Day 2, which I hope to publish soon. But I left my notes at home and there were some really witty John Lamping's quotes (mostly Googly and AOP unrelated) that I believe I must share. So please be patient...

But the AOSD Panel (Title: Panel: Beyond AspectJ: AOP languages in 2017) was pretty entertaining and was one of the highlights in the conference. Although the panel discussion eventually degenerated into a pointless debate between 1. dynamic v.s. static AOP languages and 2. how to involve the industry, there were some provoking thoughts in the first 30 minutes when each panelist presented their ideas about the future of AOP languages.

Theo D'Hondt, the fathor of logical pointcut: In what I think as the perfect prelude of the panel, Professor D'Hondt launched his attacks on two problems he sees in most young AOP researchers today: 1. too much concerns of the relevancy in the industry, and 2. obsession with bytecode (both are pretty evident in the AOSD conference). It is really up to the industry to decide if the ideas are applicable, and researchers are the worst ones to make a judgment on that. He also emphasized the most important factor in research should be the originality of the idea, not about its appeal to the industry (“Amen” from Gregor Kiczales). Not surprising from the place that produced logic pointcut (in Prolog), and other relatively abstract ideas. Although what he said was nothing new, it was refreshing at that time when most people think about how to extend the pointcut-language/annotation to make AOP more appealing to the industry and increase the adoption (maybe more funding). Although I wasn't able to attend as many research presentations or demos as I liked, I witnessed there were a lot of works that tried to replicate the AOP idea into other languages or platform, or tweaked the VM to do other crazy ideas. Has AOP reached maturity yet that no other more new ideas can be proposed and we should only be extending/porting AOP now? What kind of questions that have been asked but deemed too difficult to answer right now?

I also had some reflections on my own work too: is my idea of refactoring bits and pieces of program elements lacking in originality and I'm merely redoing the work that has been done (albeit separately) by others? I guess its a bit late to change now, but I think I am more inspired than before on the AOP idea.

The rest are summaries from other featured panelists:

Ramnivas Laddad, the "father" of AO refactoring

  • AspectJ is sufficient for industry and it is getting more prevalent
  • Java is not the most ideal platform for AOP. Future development should aim at another language that uses the JVM (i.e. Jruby, Jython)

  • “obliviousness” does not matter as much as we think

  • Criticizing JHotDraw as the primary AOP benchmark: shouldn't we use more real examples and a larger project rather than something that nobody actually uses? (Ya-hoo! That is one of the best quotes in the conference.)

  • Trend of language development: AOP is in fact an evolution of most significant languages features: procedural → functional → OO → AO. Future AO languages should not replace these ideas.

Hidehiko Masuhara from Tokyo U: In a series of slides, Sensei Masuhara from Tokyo U expressed his ideas of crosscutting indicators:

What AspectJ provides: modularization mechanism by using names (i.e. lexical data such as method names, simple type names). Therefore, names are crosscutting indicators (metadata where crosscutting may occur). AOP moves names from a metadata-level (a string) to a base-level (such as a pointcut descriptor in the code level). However, names is insufficient and in the future we should aim to move more crosscutting indicators (i.e. Types) to the base level.

Klaus Ostermann, creator of Caesar:

  • AOP should move from localization to modularization (Caesar, anyone?)

  • Should we keep dragging on with weaving? AOP is NOT code transformation!

  • Real modularization should involve removing secondary functionalities into separate modules. (Again, Caesar???)

  • We don't need anymore semantics sugar into AOP languages such as AspectJ.

Finally, Yannis Smaragdakis of U Oregon:

What is AspectJ today?

  • An advice language

  • A static analysis language

  • Intrusive transformation language

  • Automata merging language (through cflow()...)

But... AspectJ clouds the vision! A general purpose AOP language should be like AspectJ but has more power and yet more discipline (an oxymoron?). We should pursue something that cannot be done in AspectJ, such as having aspect co-existing with normal class, not as a special oblivious class.

However, he then got into his latest idea called Morphing (see ECOOP 2007) and spent quite some times explaining his ideas. As much as I liked inspirations, I really think that the panel should not be a place for idea advertisement and at that point I really didn't keep notes anymore.

Great quotes that I remember from the panel...

I believe that static language...is dead” -- Dr. Theo D'Hondt

If you guys don't use the tools that you developed, shame on you!” -- Dr. Prem Devanbu , in questioning if it is valid for researchers to pursue an idea, then leave it in the dark and not touch it anymore...

I use it... when it is appropriate...” -- Klaus Ostermann, in responding to the previous quote...

Anymore that I missed?

Thoughts and suggestions on the future panels

As much as I enjoyed the discussions in the panel, it was evident that it got really sidetracked from the original topic and the audience only had a good laugh. The direction of AOP language still doesn't get any clearer (or closer) than before. I think it's the problem when you packed a whole bunch of experts (much like the joke about packing a bunch of evangelicals) in the same room.

I genuinely think, if the panel wants to be something more than a political debate, it is much better to mix people from different spectrum (not just researchers who research the same field in opposite direction, or else it would be like having a francophone and an anglophone discussing about sovereignty!). Why not invite people like James Gosling, Anders Hejlsberg (from C#), Steve Yegge (from Google), Guido von Rossum (from Python)? Hear about what other languages designers think and why they think the AOP idea is applicable or not. Experts like Bjarne Stroustrup, Anders Hejlsberg remain critical of the idea and they have some very good reasons. Why not hear from them and stimulate a technical but fruitful debate about the future direction of AOP?

Also... can AOP morph out of academia (see Stroustrup in MIT Tech Review) and become a real force? I guess AOP can really learn from Ajax, in that the idea can only be spread if 1. enough people know about it, 2. some start-ups (like Glassbox) apply the technology and become successful, thus become the poster child (much like Paul Graham with Common Lisp), 3. corporate mammoths like Microsoft, Google, Yahoo, start endorsing the ideas. I'm glad that both MS (Research) and Google are sponsoring the research, and Google will be in a much better position to endorse to technology just because of John Lamping, but the AOP community needs to produce students who go to somewhere other than IBM. I look forward to the days when MS Research and Google are submitting papers to AOSD.

Finally, I would say that if AOP really wants to step out of the ivory tower (which it's...), the most effective way is throught the blogsphere. I wasn't aware of the power of the blogsphere until the second day of the conference (after the impromptu open-source birds-of-features session), when I bravely approached Ron Bodkin to politely ask him if he would update his blog. Ron, who is it the founder of Glassbox, asked me if my name was Isaac and told me that he saw my not-so-favorable review on my blog. Of course, I was extremely flattered and surprised since I didn't expect it would get read by anyone except myself. (Note: my point in the previous entry was that the audience didn't comprehend the tool well because they were (me included) mostly students working on languages or VM.) Later I found out that Ron is actually a McGill alumnus :) But besides the McGill connection, what made him, a founder of a Silicon Valley startup, notice a virtually unknown student like me was nothing but the blogsphere (and Google...). I guess there are more people who know the subject much deeper, and write much better than me. The blogsphere is more connected than most people think (even when you have 0 comments). So the conference should encourage people to not only talk about it, but write about it, in the most simplistic if not totally idiotic manner. Although it is unrealistic to expect bloggers such as Robert Scoble, Jon Udell, Niall Kennedy, and Mike Arrington to come (it's a research conference after all, and you don't want it to be treated like CES), if some of us who are most intimate with the technology are able to articulate the AOP idea in a simple sense (remember: simple IS beautiful), they are bound to get noticed and talked about. Only when will the AOP idea tick off into the mainstream, I think...

Remark: well, it took way longer than I thought to finish the whole post and I learned that 1. the Firefox on my lab machine is extremely slow , 2. open office sucks at editing blog posts. So I will only use WL writer to write my post from now on, and I will try to do it only during my spare time (not during Sat afternoon when I'm supposed to work). Also, thank you for those who keep reading... now I know how hard it is to become a tech blogger and I will really think twice before switching from being a developer to a blogger :)

Wednesday, March 14, 2007

AOSD Conference Day 1

The AOSD conference finally starts today! I am currently sitting in the Glassbox framework demo. Glassbox is a AOP framework for monitoring performance and application behavior. It is incorporated with Apache server and allow administrator to diagnose some problem of your web application. You can incorporate it with AspectJ and Spring framework. The downside is the 20%-80% of overhead, because of the heavy user of AspectJ Load-Time weaving, which is unavoidable. Judging from the reaction of the audience (most of which are students), an industrial AOP framework is not very attractive. The next presentation will be about AO (web?) service composition and it will be interesting to see how the framework idea is developed.

I believe we will be seeing more and more AOP frameworks for performance/correctness monitoring and diagnosis. Besides the unavoidable runtime penalty that it incurs, I guess we will be seeing more and more application that take use of the load time weaving facitility for performance monitoring. AOP as an architectual design remains or programming paradigm too elusive: does it really make sense for code your project from the AOP perspective? Does it make it harder/easier to code? Also, crosscutting concerns are often not refactorable (as I stated in my LATE paper)

However, I guess AOP is very useful from the runtime-verification/debugging perspective. I'm looking forward to Rick Chern's paper on the control-flow based debugging in the late afternoon! However, the most significant problem is the dynamic-runtime-weaving penalty incurred.

Well, but backtrack and talk about the keynote given by Gerald Jay Sussmen though. Dr. Sussmen is the creator of Scheme (along with Guy Steele Jr.) and the co-author of SICP. The topic of his talk is Buliding Robust System but it has nothing to do with the program correction/bug-free or even AOP. I would rather argue that he did not talk about AOP at all!

To summarize his talk: the idea of robust system is a system that goes beyond its original objective in its evolution and can be easily extensible with minor changes. (Emacs, anyone?) He used Scheme language and biological system as examples of robust systems. For instance, Scheme only has a very small set of program predicates, is built in such a way that a function does not necessary have a specific objective, but serves as a link between other functions. Operators can also be overriden in different circumstances (like non-commutable matrix multiplications).

The professor used a overhead project for his slides and his slides contained a lot of Scheme examples which most attendees may not be familiar with (not if you haven't read te SICP). That surely generated a lot of yawns... He also made the bold claim that a softward should not have a clear-cut purpose in mind (for it restricts the extensibility) and people surely talked about it. The purpose of his examples, however, is to demonstrate that a robust system (like Scheme/Emacs) should have extensibility and customizability in its architecture. When I heard the talk, I found there were a lot of similiar points made in Steve Yegge's The Pinocchio Problem, minus the analogy to Frogs and Scheme and in terms of readability, is a lot more entertaining.

Due to the incompatibility problem between Windows Live Writer and Blogger I'm not able to post any pictures yet but I will find a way to post them later!

I will continute keep my blog updated for the next few days. Of course I'm scared of talking with famous people like Sussman, Coyler and Kiczales but in the meantime I will keep blogging and taking pictures!

New famous people whom I met: Arie van Deursen and Maja D'Hordt, both of them were invited to the Barbedos workshop but chose to come to AOSD!

Sunday, March 11, 2007

Arriving at AOSD

Finally I arrived at AOSD in Vancouver.

The first thing I realized is the depth of the people who're attending the conference. I'm only one of the few who are still at Msc. level. The rest (of the SVs I've met so far) are PhDs. Also, when I think of it, my paper isn't that difficult (technically speaking) and tomorrow I will be performing in front of a room full of experts who know the stuff way better than I'm. It's one thing to be presenting in front of the Sable/SERG lab, but it is another thing when the room are full of people who really know what you talk about and you cannot BS your way throught. I am never very good at answering questions, and now Martin (and Bart and Eric) are not there to help me out...

Speaking of Martin my supervisor, I just received the poster for AOSD '08 and guess who's in the organizing committee! So for all the students of Martin, AOSD maybe the conference to aim for!

Most of the people went to the brewery to have a good time, but I decided to stay at the room. Bram Adams, a PhD from Belgium, has gone for a drink and if I want to get any substantial last minute work done now is the time.

As a last minute revision, I've decided to keep the hierarchal diagram drawn by FreeMind though, because that is the most effective way to explain the implicit relationship between the class that share the crosscutting concern. Hopefully that wouldn't make the talk too long...

Lastly, an interesting thing that I've seen. Guess who are the corporate sponsors of AOSD this year? There are 3 of them!

Well, if you answer IBM Research you're correct. IBM has invested tons of money and manpower in Eclipse and now in AJDT and the survival and the adoption of AOP is almost vital to its now half-open-source/SaaS business approach.

But the other two are a bit more... weird.

No, not Siemans, although they do have tons of people working on AOSD.

One is Google! I guess the reason is that John Lamping is one of the keynote speakers and Lamping was one of the pioneers in the AOP research. (He co-wrote the first AOP paper with Gregor Kiczales at XEROX...)

But the other one is... Microsoft Research! I really wonder what they are doing down here. Yes, Vancouver is very close to Redmond, MS has tons of money to burn, and they are fighting the talent war with Google and so they have to make a face at anywhere Google shows up. But I don't see any people from Microsoft Research presenting at AOSD '07. Are the MS folks working on a AOP add-on for Visual Studio? Will we witness a A#/AB.NET/Managed AC++ shortly? Anyone???

Enough ranting... let's now really start working on the slides...

Wednesday, March 07, 2007

Introducing "What goes into a great technical presentation?" by Don Box

Don Box, the software architect at Microsoft, talked about how to make great presentation at channel 9. I came across it when I was searching for technical evangelist in wiki. I don't know why Don is listed in the prestigious list of 4 most important software evangelist wiki thinks you should know, but I digged deeper and found this buried video from channel 9. Well... how much I wish I know more about this (instead of youtube/dailymotion).

But I strongly encourage anyone I know who has done or is going to do a technical presentation, to watch this video and see if what he says changes how you plan your powerpoint content.

Best quote: "Powerpoint is at best, at best, a mean..."

Now I'm going to spend less time on my powerpoint for the presentation tomorrow. That means... no more animation!!!

Btw, I will be doing a talk in LATE 07! My first (and hopefully not last) real technical presentation! Let's hope that I won't get grilled...

Thursday, March 01, 2007

Doing charity using your IM

I don't know how many are still reading my blog, but today you can doing charity with no cost if you are a Windows Messenger owner!

Check the link for details!

Wednesday, February 28, 2007

Thoughts on Python Challenge

This afternoon was supposed to be action-packed since I needed to submit a paper for AOSD and finis my last piece of work at NCS but I got myself totally addicted to Python Challenge.

After almost 2 hours of playing around with it I have reached level 4. Of course you need to go pass the previous 3 levels to get the url of level 4 so I will not post it here. But man, it took me time.

One of the most interesting things I have observed is that my code is too "big". There are some very elegant solutions out there. Each time after I finished a level I went to check how others crack the problem and discovered some very elegant solutions. It's especially true with Level 3 when I did not realize it was a regular expression problem and went my own way to check the characters manually. I had multiple solutions and none of them were correct. So I got frustrated and checked the re solution. Only after I played with the "elegant" solution, did I realize that I had the solution all along, just that I didn't know how to use it. How stupid.

Belows are my solutions for the first three levels. Don't look if you plan to solve it in python or your favorite language.

[Begin spoiler]

def caesar_decipher(str, shift):

"""Python Challenge Level 1 solution"""

ret_str = ''
for x in str:
if x in string.ascii_lowercase:
ret_str += chr((ord(x)-ord('a')+shift)%26 + ord('a'))
elif x in string.ascii_uppercase:
ret_str += chr((ord(x)-ord('A')+shift)%26 + ord('A'))
ret_str += x
return ret_str

def find_alpha_in_file(file):
"""Python Challenge Level 2 solution"""
f = open(file, 'r')
return ''.join(ch for line in f for ch in line if ch in string.ascii_letters)

def find_bodyguard_char_in_file(file):

"""Python Challenge Level 3 solution"""
ret_str = ""
f = open(file, 'r')
for line in f:
for index in range(len(line)):
if line[index] in string.ascii_lowercase
and index-3 > 0
and len(line[index-3:index])==3 and len(line[index+1:index+4])==3
and reduce(lambda x, y: x and y in string.ascii_uppercase, line[index-3:index], True)
and reduce(lambda x, y: x and y in string.ascii_uppercase, line[index+1:index+4], True)
and line[index-4] in string.ascii_lowercase and line[index+4] in string.ascii_lowercase:
ret_str += line[index]
except (IndexError):
return ret_str

[End spoiler]

However, a solution that uses regular expression for level 3 has only 3 line!!! And luckily there is generator expression and lambda function in python or the solution would be much more verbose.

I was also tempted to solve the FizzBuzz problem in codinghorror.com in python too, just to demonstrate my new prowess in python but, Jeff posted a rebuke subsequently and seeing how stupid it is, I dropped the idea. But nevertheless I got to admit that I couldn't quite solve swap-without-temp problem (I didn't know how to use XOR) and I'm quite ashamed of it. It tells me that even though I have a master degree (almost) and going to work at a very big software company later, there are still things I need to learn,and the fundamental arithmetics and bit operations remain as relevant as ever.

Update: My code got complained to be too unreadable but I blame it on the formatting. I spent hours trying to get the indentation to work with no result. If blogger keeps doing that I will switch back to Window Live Spaces.

Monday, February 12, 2007

Google Founders' Awards... another Googlegate?

Disclaimer: This is a response that I gave to Dare Obasanjo's post about the his view of the Google Founders' Awards. Dare is an engineer at Microsoft and he maintains one of the most educating and entertaining blog. Highly recommended.

While there are always people who will exploit the system for their own greeds, the idea is actually pretty neat. You award the people (and hopefully engineer) who create a successfully product with a large sum of money, just as the way you would buy from a start-up company. The amount is of course considerably less, but that is compensated by the job security the company has already guaranteed. Not a bad idea.

I don't know all of those who actually won the award but it has been given to some brilliant engineer (i.e. Niniane Wang, a formerly Softie herself). And it also gives you the impression that the company is willing to share its wealth with the employer.

One of the reason there are so much grief in MSFT is that the executives got the perks while the engineers are not earning their due. I don't know how much of it is true, but after reading a bit of Mini you get the sense that employees are treated better at Google. That's how you generate the morale in the team.

And I don't know how you compare it with the notorious Ship'it award at MSFT. But while the GFA certainly sounds better, I believe the GFA also carries some monetary values while the Ship It is just a trophy. Which one would you choose? Go figure....

Tuesday, February 06, 2007

Saving Principal Ponosov

A teacher in middle Russia is prosecuted just because he cannot afford a real Microsoft Windows...

As much I dislike raising Bill Gates in reddit yet again, I do hope that we can generate enough awareness such that Mr. Gates will take some action...

Yes, piracy is not to be discouraged...but when you live in the mountain of Ural, living off $5 US per month, how can you afford a Windows Vista! Especially when MS has raised the price so much that most ordinary folks like me cannot afford it...

The MS PR has already said that it won't intervene! Are we going to sit back and let this happen?

I posted the BlueJ post on reddit and realized that once enough people agree with you, the giant would take action. So please, I beg you, please raise some awareness to the issue.