Thursday, January 08, 2009

First post from Windows 7 beta



I'm running Windows 7 beta 64bit on my Mac using VMWare Fusion, even in this configuration things are looking pretty good, definitely a good improvement over Vista, they got rid of a lot of the UAC popups in areas where it just makes sense that way. The new task bar seems pretty good, it will take me a little bit getting used to, but mostly because I use it different than most users. My quick launch is gone!! I'm definitely going to need my quick launch back (I think).

I love the snipping tool, similar to the one found in Mac, users who have always used Windows will find it really nice, is like a print screen on steroids, you can capture free form, rectangular area, window, and full screen; very intuitive and very fast, pretty much instant

Perhaps this is what Vista should've been, so far all the reviews I have seen have been very positive in all areas, this post is just another "me too!"

Windows 7 beta available for MSDN and Technet subscribers

all the reviews say it is really good, what are you waiting for

oh that's right, no MSDN subscription, don't worry, it will be available to the public on friday

of course you could also find it on Bittorrent (just be careful)

Sunday, October 26, 2008

Apple products keep dissappointing me

My iphone is broken, I cannot charge it, plugging it to any computer does nothing, completely fried. I turned on the blue tooth on the Mac to connect to it, all I could do was connect to it, absolutely nothing else, shortly after I got the equivalent of a Blue Screen of Death on the Mac; the Mac has been freezing on my, Fusion has been getting slower...

I had to email every picture from the iphone to my self, everything else will be lost when the battery runs out, I will get a new iPhone tomorrow (went to the store and they confirmed it was fried)

I bought the latest and greatest equipment to avoid exactly these types of problems, I don't think I want any more Apple stuff now, not worth it so far

Tuesday, October 07, 2008

SVN playing jokes on me

I've had issues with SVN before, but this time it went a bit too far

icons started disappearing...

but then it got too far

you don't know how much icons do for you, 'til you don't have them =o(

Saturday, September 27, 2008

string format gotcha

here's a simple, inoffensive looking piece of code:

...
LogError(string.Format("some message, some variable value {0}" + ex.Message, varValue));
...

Can you spot the problem with this code?

Monday, September 08, 2008

poor's man way to mount images in WinXP

For those who don't know, you can mount an image (.ISO, .UDF, .CDFS, .JO, ROCK) in Windows XP and you don't have to burn to either CD or DVD, you can just load it and have it as a virtual drive and do everything you need to do with it from there

For those who do know about these tools but don't trust installing any tool you find on internet, there is a little tool from Microsoft that does just this in a very simple and effective way

just download the Virtual CDRom Control Panel tool from Microsoft and follow the instructions on the readme file:

1. Copy VCdRom.sys to your %systemroot%\system32\drivers folder.
2. Execute VCdControlTool.exe
3. Click "Driver control"
4. If the "Install Driver" button is available, click it. Navigate to the %systemroot%\system32\drivers folder, select VCdRom.sys, and click Open.
5. Click "Start"
6. Click OK
7. Click "Add Drive" to add a drive to the drive list. Ensure that the drive added is not a local drive. If it is, continue to click "Add Drive" until an unused drive letter is available.
8. Select an unused drive letter from the drive list and click "Mount".
9. Navigate to the image file, select it, and click "OK". UNC naming conventions should not be used, however mapped network drives should be OK.

You may now use the drive letter as if it were a local CD-ROM device. When you are finished you may unmount, stop, and remove the driver from memory using the driver control.

that's it

Tuesday, August 05, 2008

invisible CAPTCHA

I was checking the status of my iPhone order (yes!) on the AT&T site, and I came to this CAPTCHAI thought it would be easy, as I didn't see any characters, I just hit ENTER, but...



sigh... =o(

Tuesday, July 29, 2008

Recursively delete .svn folders the easy way

you can really use this to delete any given folder that you need to delete recursively, but I needed this today, and google only gives me the answer for linux, and some strange solutions to do the same in windows.

here's a simple solution that works from the command line (the easy way, right?):

for /f "usebackq" %d in (`"dir *.svn /ad/b/s"`) do rd /s/q "%d"

more than anything I know I will need this in the future, so here it is for me, hoping that it can help someone else out there J

Delta runs Linux on their planes

got this during a trip to Las Vegas this past weekend, these are the screens attached to the back of the seats

Friday, July 18, 2008

SQL: You can't update a function while debugging it

article applies to: SQL debugging
keywords: SQL, debugging, VS2005, functions, stored procedures

I learned this the hard way yesterday while I was RDing (Remote Desktop) into my computer, debugging a SQL function from VS2005; I then, found a bug on the function and proceeded to update the function externally using Microsoft SQL Server Management Express (uff, that was tiring), however when I would execute the alter function it would take forever and never actually come back, I thought it was something with my RD session, so I logged in to the SQL server directly and tried there with same results, after a few minutes of waiting for SQL to commit my changes I realized I was debugging, and had stopped on a breakpoint on that function, I then exited out of VS debugging, tried again and voila it worked instantly.

So, yes, it was my bad, but I never got a timeout or any message indicating what the problem was, what if two developers are working on the same thing?
perhaps some work could be done to fix that, I can't imagine that being too hard, it DOES know that is locked, why not just give the user a message?

anyway, just sharing my experience with you, hoping it helps

Sunday, June 22, 2008

Welcome to the family



I have joined the club, went to the store and bought the iMac 24" 3.06 GHz =o), the screen is awesome, makes my "old" 21" monitor look tiny

So far I have been quite a bit disappointed by the "usability" of the Mac, I guess I had really hight expectations for it, just the fact that the first application you have up there is the "finder", tells me something is not quite there, my biggest problems so far:

- short cut keys are different
- you install some application, then is just gone, you have to find it using the finder
- right click, where the #$%&** is my right click!!! - got it, you have to "ctrl+click"
- mouse buttons (or lack of)
- window resizing, why can I only resize from the bottom right corner??
- lack of "window restore", after maximizing the window

Right now I'm downloading Vista to install it on Fusion, we'll see how everything goes after I get familiar with it

the "welcome to the family" is what they told us at the store when we bought it, will keep you updated about my rants experiences

Wednesday, May 14, 2008

Twitter is down, I blame http://www.tweetwheel.com

Twitter is down again, at this pace is going to be pretty hard for another popular social network to take twitter off the #1 position as the worst social network (uptime); you can check it out here

Social network downtime Jan-Apr 2008

I blame it on tweetwheel.com, who do you blame it on?

Tuesday, March 25, 2008

No anchor member was specified for recursive query *

I got this error while working on a recursive CTE query, I entered the error message in google/live and got zero results so I had to do some more study on CTEs and I thought I'd share the answer to this problem.

From the MS documentation we read:
The first invocation of the recursive CTE consists of one or more CTE_query_definitions joined by UNION ALL, UNION, EXCEPT, or INTERSECT operators. Because these query definitions form the base result set of the CTE structure, they are referred to as anchor members.
CTE_query_definitions are considered anchor members unless they reference the CTE itself. All anchor-member query definitions must be positioned before the first recursive member definition, and a UNION ALL operator must be used to join the last anchor member with the first recursive member.

Basically you cannot make a recursive call before you have defined the initial data set, let's see with an example:

This would be valid:

with example(col1, col2, iteration) as
(
--first, we defined the base set
select col1, col2 from someTable where col1 is null
union all
--then we can make the recursive call
select t1.col1, t1.col2
from example t1 inner join SomeTable t2 on t1.Col2 = t2.Col1
)
select * from example

and this would generate the error

with example(col1, col2, iteration) as
(
select t1.col1, t1.col2
from example t1 inner join SomeOtherTable t2 on t1.Col2 = t2.Col1
--ERROR:we have not defined a base set before making the recursive call
union all
select col1, col2 from someTable where col1 is null
)
select * from example

Hope this helps someone out there

Thursday, March 13, 2008

Do you not want to exit? yes, no, cancel, FileNotFound

This article refers to UI best practices

The title of the post is of course an exaggeration of asking negative questions but serves as a perfect example for what I'm trying to tell you
I thought the title of this post was an exageration, but after seeing that dialog...

Don't ask the user negative questions

More often than not you'll confuse that crap out of the poor user; users are already too scared of answering questions to still bother them with the opposite of what they want, it's a simple and basic rule, but I still see a lot of software (and developers) that use negative questions/options for data input.

The most common use of negative options is probably disabled

just compare:
Label X visible?
Field X Enabled?

To:
Label X Invisible?
Field X Disabled?

That subtle change makes it much harder to answer the question correctly; so prefer Enabled over Disabled, Visible over Invisible, Active over Inactive, etc

The same concept applies when naming variables or methods, in very few cases the negative is a better option, so just go with the safer option, it's easier to process, we are used to answer "positive questions" and the opposite usually causes us to think which makes things not intuitive

Thursday, January 24, 2008

Puzzle

Justin came up with this problem as part of an actual project and it puzzled me the simplicity of the problem and definition of the solution in your head, yet the complexity of the expressiveness in code for the solution, maybe another language would be better suited to solve this problem?

you have an array of the Doc class which has a DocIndex property, for which the property is not set, some elements of the array may be null

//*** small version of the Doc class, just for the puzzle
class Doc {
public int docIndex;
}

Doc[] docs = new Doc[] { new Doc(), new null, null, new Doc() };

then you have an array of ints that represent the indexes that are already taken, e.g.

new int[] { 2, 3, 5, 7, 9 }

your job is to assign the indexes to the Doc[] that are not "taken" (exist in the array)

so, for these examples:



The expected output would be:
existing :
2 3 5 7 9
docs :
0 1 4 6 8

existing :
0 1 2 3 4
docs :
5 6 7 8 9

existing :
5 6 7 8 9
docs :
0 1 2 3 4

what do you think of this problem for a code interview?

Saturday, January 19, 2008

find all tables with column name *

Applies to: SQL
Tested on: SQL 2005
Keywords: SQL, column, all, tables

I'm going to need this quite often...

just execute these queries on the same database where the tables reside

--get all table names for a specific column name
SELECT o.name as TableName
FROM sysobjects o inner join syscolumns c on o.id=c.id
WHERE c.name = 'YOURCOLUMNNAMEHERE'

you can also perform like queries

--get all columns and table names for a 'like column' query
SELECT c.[name] as ColumnName, o.name as TableName FROM sysobjects o inner join syscolumns c on o.id=c.id
WHERE c.name like 'COLUMN%'

Thursday, January 10, 2008

C# vNext wishlist: comma less argument list

Mitch Denny has a post about his feature request for the next version of C#

he wants to have a shortcut to format strings, which would basically allow you to go from this
string s=string.Format(”{0}{1}{2}”, a, b, c);
to this:
string s=@(”{0}{1}{2}”|a|b|c);

I don't think I like the proposed alternative, all you are doing is replacing the "," with the "|" character and making the name shorter.
You could always write your own little wrapper:
//*** you could call it "f" if you wanted
static string fmt(string format, params object[] parameters) {
return string.Format(format, parameters);
}

and get
string s=fmt("{0}{1}{2}",a,b,c);

which is almost the same as the proposed solution

another problem is that this proposal solves a very particular problem which is string formatting and we can get pretty much the same by writing our own little wrapper

but anyway, it gave me an idea for my own feature request
comma-less arguments

string s=fmt("{0}{1}{2}" a b c);

The scope of this change is much wider and actually "desugars" the language

now this change will most likely not happen, since this is a C family language and would take a significant change to the parser but this is my own wish/feature request so there you have it

Monday, November 19, 2007

VS2008 download complete

now burning using the RKTools (poor's man cd/dvd burner tools)

downloading VS2008...

is not listed in the msdn subscriber downloads section yet, we got it through clicking "sign out", then we got to this page, (you you have to use IE) and down at the bottom you'll see a list of top subscriber downloads, you click there on the "Visual Studio 2008 * Edition...", you sign in, and are taken directly to the download

11% so far... have to go get some DVDs =o)

Sunday, October 21, 2007

This application has failed to start because js3250.dll was not found.

This has been a long known issue with Firefox, and so far it doesn't seem like there is an answer, the error messages are:

"This application has failed to start because js3250.dll was not found. Re-installing the application may fix the problem."
"The Procedure entry point in JS_HasInstance could not be located in the dynamic link library js3250.dll"

some suggest uninstalling/reinstalling Firefox, creating a new profile, removing FF completely before reinstalling, downloading a new js3250.dll file, deleting a trojan file ipv6monl.dll, etc; some solutions work for some people, some work for others, here's what worked for me

In my case the problem only happened under a restricted (non-admin) user, I looked in the C:\Program Files\Mozilla Firefox folder and the js3250.dll file was there, so I ran the firefox.exe directly from there and it ran ok, then I replaced the shortcut I had to point to that location and it's working so far

hopefully this will help some other soul

Wednesday, October 17, 2007

My predictions (about Leopard) for next week

- Apple will have their biggest software/hardware (MacPro, MacBookPro & Leopard) sale in history.
- There will be people camping out, waiting to be the first ones to get Leopard.
- They will run out of stock in a few stores.
- Adoption of Macs grows at least 25%.
- Very soon we'll start seeing problems (and updates) in a few applications.
- We'll also see quite a few (a lot?) security problems in the OS and applications for the rest of the year and there after actually

...and I hope to contribute to the cause! =0), and I know quite a few others in the blogosphere will too

Monday, October 15, 2007

small refactoring for working with nullable types

the article applies to: C# 2.0

C# 2.0 brought a new feature: nullable types, you already know they are cool and have been using them for a while, however, how many times have you seen (or written) something like:

//SomeClass.SomeObject.BoolProperty is of type bool?

if (SomeClass.SomeObject.BoolProperty.HasValue && SomeClass.SomeObject.BoolProperty.Value)...
//something

because you can't write:
if (SomeClass.SomeObject.BoolProperty)...

That will not compile

The problem I have with that code is that it is repetitive, and is long, so what can we do?
you can write this instead:

if (SomeClass.SomeObject.BoolProperty??false)

much better, isn't? if BoolProperty has a value and the value is true, it will return true, otherwise it will return false; now, of course you can use the same technique with other types:

string firstName;
public string FirstName { get{ return firstName??""; }}

this code would ensure that FirstName will never be null (I'm pretty sure you've seen lots of "object reference not set blablabla" because of this)

Other examples:
int? result;
...
return result??-1; //if result was not set, return -1
---------------------------------------------------
bool? result;
...
return result??false;
---------------------------------------------------

That's it, hope you find it useful
Remember that the best code, is no code at all

kick it on DotNetKicks.com

Thursday, September 27, 2007

Get last day of month

applies to: C#, .NET
In the spirit of sharing code, and I think this is the second time in this week that I need this function

DateTime GetLastDayOf(DateTime date) {
return new DateTime(date.Year, date.Month, DateTime.DaysInMonth(date.Year, date.Month));
}

Thursday, September 06, 2007

google (reader) search, finally

woohoo! you can finally search on your google feeds, plus 2 little features

  • you can see 1000 items (instead of 100)
  • you can hide the sidebar using the mouse
You can search all your feeds, the feeds from a folder or the posts from a single feed. In fact, you can perform two searches: one for a folder or feed and another search for the posts that contain some keywords and are from the folder or feed you've previously selected. The results are sorted by date and it takes a couple of seconds for them to show up.

This might not be available to all users right now, mine got updated on the fly (without the page being down or having to reset/reload at all), I saw the new features announced but mine was still on the old version, then started working on some code and went back to check my feeds and I had the new version

so when are you going to let me highlight stuff?
that would be a killer feature

Friday, August 10, 2007

I don't need any help!

But I do need my F2 key to rename stuff J

I had to use this keyboard because my pc broke, long story short, made me realize how much I use the keyboard

Wednesday, July 25, 2007

is my password too complex?

this post from Scott reminded of a few days ago, when I changed my msn (live?) password and the next day I wasn't able to log back in because the hotmail (msn/live) passwords only allow a length of 16 characters and for some reason I was double typing 2 characters without noticing, after a while I figured it out and realized that I am using the maximum length allowed for passwords, and of course I use upper case, lower case, numbers and symbols... and of course I have categories of sites and the passwords I chose for them, depending on the importance and the security they implement

no wonder a number of people have looked at me like I'm some weirdo when they've seen me typing my passwords... mmm...

am I a freak, or is this normal among geeks? maybe... but there is no security in this world, so all we can do is raise the bar a bit

Tuesday, July 24, 2007

blog.Resume();

wow, it has been over a month since my last post; at work we went live with our first customer and it got intense, we had some critical things that needed to be fixed for the particular environment, and we did it quickly and successfully, I am part of a great team and we're pulling it out together.
UAT anyone?... better not talk about it, it's almost back to normal now, we are finding new features that need to be developed, but things should slow down and this blog will continue it's "regular" operation, at the personal level I've had some rough situations lately as well, but is also pretty much over; I've been so busy that I even missed my 11th birthday at the company I currently work for.

So meanwhile I still need to catch up with my blog reading, you can see some of the stuff I have been reading as I catch up.

I did not get an iPhone, nor am I planning on getting one anytime soon, but I do hope to get a Mac when they release Leopard in October, I do have a feeling that we will start seeing a lot of vulnerabilities in the Mac OS soon though (just remember you read the prediction here J)... just like Firefox is getting hammered right now (you should actually go read this now, it's pretty bad)

'til next time

Friday, June 15, 2007

concatenating strings and nulls in SQL

let's start with a table from scratch

create table test(
firstname varchar(10) null,
lastname varchar(10) null
)

we then insert some data (sorry about people with these names)

insert into test values ('john', 'smith')
insert into test values ('john', 'doe')
insert into test values (null, 'perez')

we're ready to concatenate some strings:

select lastname + ' ' + firstname
from test

but we get:

1 smith john
2 doe john
3 NULL

what happened?

in SQL, when you concatenate strings, if one of the strings is null, the result of the concatenation is null.

At first you might think this is bad, but it can actually help you more than it hurts, you just have to know the trick, so what do we do to fix the query?

select isnull(lastname, '') + ' ' + isnull(firstname, '')
from test

now we get:

1 smith john
2 doe john
3 perez

ok, but how is that helpful?

well, let's suppose you want this format:

lastname, first name

but only if there is a first name, if the first name is null you just want the last name with no comma

let's say there is a rule on the database that the last name cannot be null, so we can write the query as:

select lastname + isnull(', '+firstname, '')
from test

and we get:

1 smith, john
2 doe, john
3 perez

see, I concatenated the comma with the first name, and if the first name is null, the the comma gets eliminated as well

Just one more trick for your bag of tricks

Tuesday, June 12, 2007

C# quiz #2: objects, strings, null

this is a continuation from the previous quiz; given this class definition:

public class Foo {
    public void Bar(object x) {
        Console.WriteLine("object x was called");
    }
    public void Bar(string x) {
        Console.WriteLine("string x was called");
    }
}

what will be output to the console with the following code:

Foo f = new Foo();
try {
    f.Bar(null);
}
catch {
    Console.WriteLine("no method was called");
}

Extra points for explaining why

Monday, June 11, 2007

how to tell google to NOT load the country specific page

Scoble is having this issue right now, I've had it in the past and forgotten to post this here, google tries to play smart and load the country specific page, so if you are in Mexico and you go to google.com, you'll get google.com.mx instead, to fix it just go to this url

google.com/ncr

Sunday, June 10, 2007

Cheap tricks to get a more popular blog

There are a few tricks that I have seen used more and more lately to try to get more attention to blogs

1) use adult content related words to refer to some technical topic (but not necessarily), some recent examples of such use recently:
  1. Computer Hardware Pornography
  2. ...What you're not getting about Ruby and why it's the tits
  3. "As a gay man and a gay journalist"
  4. "..Cierra la puta boca, gilipollas, Siesta, Fiesta, Cerveza, Real Madrid, RaĆŗl, Hijo de Puta y Mierda."
you are likely to get some "google love" for sure with those keywords

2) get in a debate with some "big guy", this technique is getting used more and more lately, we have
Jeff Atwood vs Petzold's
Ayende vs Ted Neward's
Ayende vs Sam
Rob Conery vs Ayende
Nick vs Sam
heck, Ayende vs the rest of the world, J

etc, all you have to do is talk trash about something a guy posted on his blog, or about some of the work (usually open source) the guy works on, if your blog is not very popular, make sure to leave a comment on the other blog so the guy notices you

3) ask for link love, this specific case actually has a merit, this should be listed under "how to get a popular blog in 10 days", but the idea is the same

sigh... boring stuff, but I guess it works if all you want is to get more people to your blog (inflate your numbers), even if what they find is not exactly what they were looking for (first case)

Saturday, June 09, 2007

programming practices: never say never

Jan Bannister wrote this post: bool considered harmful, and writes:
Never Use Bool, or more specifically never user bool as a parameter. It is the most foolish of datatypes and conveys the smallest amount of information possible.
I can disagree with that in a number of ways, but the culprit was the "never use bool as a parameter", the biggest problems I see
- you would end up with hundreds of enums to replace your bool parameters, and then
- where do you put all those enums?
- at some point you would probably duplicate some of the required functionality

so, what do we do, bool is still "harmful", but not always, that's the key, I can think of at least 2 situations where you don't necessarily need to replace your bools with enums
- private methods: they are (hopefully) only used in that class... and the method is not that big, and the class is not that big, and you added comments for the method/parameters... sigh...
- functions with a single parameter that is just an on/off thing, e.g. SetVisible(true)

there, now it doesn't sound that bad, bottom line, never say never, don't abuse any technique

C# Quiz #1: overloads, strings, nullable types

*This is also a test of the latest Windows Live Writer

given this class definition:

public class Foo {
public void Bar(string x) {
Console.WriteLine("string x was called");
}
public void Bar(int? x) {
Console.WriteLine("int? x was called");
}
}

what will be output to the console with the following code:

Foo f = new Foo();
try {
f.Bar(null);
}
catch {
Console.WriteLine("no method was called");
}

*update: I messed up the code while trying to upload another post, I recovered the original post from my RSS feed

Wednesday, June 06, 2007

Filemon saves the day once again

I'm back, I had a head injury during a soccer game, I was very dizzy for over a week, but it's all good now

This time it was an ActiveX control (we're still fighting with ActiveX controls), I thought I had done everything I needed to do to get it up and working, but it would simply not load, so I loaded Filemon to see if it was even referencing the dll file, and it found two references, one to the GAC folder, and one to the program files\Internet Explorer, but no reference to where we actually copied the dll.

So I decided to copy the dll to where IE was looking for it, I copied the file to
c:\program files\Internet Explorer\
and everything started working wonderfully

I guess I could've added it to the GAC too, but I was very frustrated at that point since I thought I had tried that before and still wasn't working.

anyway... I guess that's another trick you can try when you have tried everything else deploying your ActiveX control, use filemon to see where IE is actually trying to load your dll from, and copy it there

and if you still don't know what filemon is, you owe it to your self, it's an amazing tool, it will save you many hours of headache (just not the ones caused by injuries during a soccer game J)

Tuesday, May 22, 2007

how to: fix google reader when it reports new items that we cannot see


every once in a while (happened to me twice today) google reader (for different reasons) reports that we have new (unread) items, but we cannot see them (because they don't really exist), to fix this problem simply
- click "all items"
- click "mark all as read"

GPS mobile phone tracking system, track any cellphone, anywhere

wow... Found this via Aldoara, you thought cell phone tracking was only possible in the movies?... go check it out

Friday, May 18, 2007

.NET user control not loading under https

keywords: .net user control, activex, ocx, IE7, IE, https, http, secure

Justin and I just had a heck of a week fighting ActiveX controls developed using C# in .NET 2.0, so we will be blogging about some of the issues that we found and their solutions (so we can remember later), the first one is about ActiveX controls running under https.

We developed our control, everything was fine, one of our clients wanted to try that over a secure site, so we said no problem... until we tried, and tried, and tried, and nothing worked, the control would just not load.

the solution ended up being really stupid (as is usually the case); when you include your control, you usually do something like this:

<object id="someId" classid="SomeDll#Namespace.ClassName"></object>

that's the way you'll find it in all the examples around the web, and that will work just fine (once you get past all the other stuff that is required to make it work) under http, but when you move that to https, it will simply not work.

the solution?

when you create your control, you assign a guid to it

[Guid("CAE67AEA-F489-4e52-956B-CCC774F40A3A")]
[ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(IControlEvents))] // --Expose events
[ComVisible(true)]
public partial class MyControl : UserControl...

something like that...
well, to make it work on https, you simply have to use that GUID, not the class name, so you would just write this on your html code

<object id="someId" classid="clsid:CAE67AEA-F489-4e52-956B-CCC774F40A3A"></object>

done, hope we saved you hours of headache

Thursday, May 17, 2007

(humor) I'm a programmer...


a little humor

Tuesday, May 15, 2007

one hour of timezone difference doesn't always mean one hour of time difference

this is one of those "why didn't I know that?" stupid little things...

this caught me off guard as I was traveling, I went to a city that I knew was under the next timezone, so I adjusted my cellphone, but the time didn't change... I got confused for a little bit, then started changing to other timezones just to realize this fact

after that I verified the same behavior on my PC, if you still don't believe it you can try right now, switch your pc to different timezones, and you'll see the time changing unexpectedly

e.g. the actual time is the same at
(GMT-07:00) Mountain Time (US & Canada) and
(GMT-06:00) Central America

I know of at least one application where this actually causes a problem...

how to: easy way to see the methods and properties exposed in a TLB file

...just drag and drop the file in Visual Studio (at least in VS2005 it works), it will add it to the object browser and you can expand it to see it's methods and properties full definition

Wednesday, May 09, 2007

igoogle broken... again

a few days ago I saw that the google personalized pages (now called IGoogle) was broken, but mine was fine, so I laughed at all of those souls (just kidding), but today my igoogle is broken! aaarggh, nothing works, I can't minimize/close any gadgets, the gadgets are there but don't display anything, I can add new ones but they don't work

sigh...

fix your mom's computer for mother's day

I thought this would be all over the blogosphere by now, but is not, and I thought it was a good idea, this comes from Joel Spolsky

This Sunday is Mother's Day. Why not fix your mom's computer?

You know: remove the spyware and adware, install Firefox, and make it so that weird toolbar toast doesn't pop up every 15 seconds.

To make it easy, this Sunday we're making Fog Creek Copilot absolutely free.


for those of you who may not know, copilot is software that allows you to connect remotely to any computer, you don't have to worry about firewalls, etc, it just works

check it out

Monday, April 30, 2007

ActiveX control to load PNG files in IE7?


I just saved this SilverLight poster to my local machine and tried opening it with IE7; I was greeted with this message. I was surprised but I clicked on it to activate it, only to get this error message:


WOOT!?

Sunday, April 29, 2007

Windows.Vista.Downgrade();

my main reason to downgrade my laptop OS is because my Cingular 8125 won't work as a modem in Vista, and I really can't live without that now, which is the same reason (or so the rumors say) I won't be getting an iPhone when it comes out, being able to use my cell phone as a modem and have internet "anywhere on the road" (at least in USA) has been really great, I can't go back to not have that

other reasons are the many problems with VS2005 and Orcas on Vista, I really want to play with F# and don't want to deal with a beta product in a buggy IDE, yesterday Justin and I were playing with F#, expect posts on the subject soon

downgrading has been painful because XP didn't recognize a lot of the hardware, whereas in Vista everything just worked, for now I'm still keeping Vista on my PC though... XP feels old, but it works

Saturday, April 28, 2007

burning iso images to cd / dvd in Windows Vista

for my own reference and to help anyone out there looking for this
took me a while to find it because I was looking for "burndvd"... arrgh
keywords: cdburn, dvdburn, burn, rktools

you can use the Windows Server 2003 Resource Kit Tools, after you install this kit, you will get a couple command line utilities under c:\program files\windows resource kits\tools\

cdburn.exe
dvdburn.exe

usage:

cdburn image

Thursday, April 26, 2007

yahoo mail acting funny...




sigh...

...the attach files button doesn't work either

Oracle sucks, part 2 of 1000: setting variables

you don't use SET to set variables values
SET variable_name = value;

this will give you a "ORA-00922: missing or invalid option"

you set variables Delphi style

variable_name := value;

Oracle sucks, part 1 of 1000:executing queries vs scripts

I just have to blog this to remember in the future, and hopefully blog about other countless issues with Oracle

This applies to running multiple statements to create functions, views, etc

When running as a query:
when creating or replacing functions, include ";", at the end, then a "/" on the next line
when creating or replacing views, don't include the ";", but include "go"

otherwise you'll get things like
" Warnings: --->
W (1): Warning: execution completed with warning
<--- "

"[Error] Script lines: 639-664 ----------------------
ORA-06575: Package or function FUNCTION_NAME is in an invalid state"

and your functions/views won't be modified

when running as a script, everything needs ";" at the end

Thursday, April 19, 2007

Deploying .NET 2.0 security settings without SDK or caspol

This article applies to Microsoft .NET Framework 2.0 Security
keywords: CAS, full, trust, assembly, security, policy, mscorcfg.msc caspol.exe

When you want to adjust the security settings in .NET 2.0 you use the mscorcfg.msc tool (Control Panel/Administrative Tools/Microsoft .NET Framework 2.0 Configuration)

However sometimes in a production environment you might need to do the same thing in a bunch of machines, and the problem is that the mscorcfg.msc tool is only included in the SDK which is over 300 MB, another option is to use the caspol command line, but that will scare most people away, there are a lot of people having this problem, so I thought I would post an easier solution here.

I lied on the title of the article, you do need to the SDK, but only in one machine, since you are a developer (right?) I suppose you have Visual Studio, and that includes the SDK, if you don't have the SDK installed on any machine, then you need to download it and install it at least on one machine.

Once you have that you can use the mscorcfg tool, setup the machine with the permissions that you want, trust assemblies, adjust zone security settings, etc, then when you are done, use this option

Configure Code Access Security Policy







Create Deployment Package






you will see a new dialog, which doesn't have many options


this dialog is a bit weird and buggy, but all you have to specify is a file name in some valid folder, for example c:\SecuritySettings

the other thing you might want to change is the security policy level to deploy, if you are deploying to production machines you might need Machine or User
click Next, then finish.

What this little wizard does, it creates a package with all the security settings on that machine, and puts it in a simple small executable program that you can run in any machine to adjust the security settings to match that machine.

now all you need to do, is take that file to the machines where you want to deploy your new security settings, run it and you're done

When you run the file you are naturally tempted to wait for a dialog to come up and ask you to click next, next, next, finish, but no dialog will pop up, you'll see it flash for a second and then it will dissapear, that's all it does (you might need privileged rights to run that file), if you were able to run that file, the security settings have been changed.

now if "it works on my machine!", you can make it work in other machines too =o)

Everything you ever wanted to know about .NET garbage collection

or almost everything on garbage collection, the related CLR and BCL, you will find it on Chris Lyon's blog, I found his blog and read it all yesterday, I'm still digesting some of it, a lot of good stuff, I had to include most of his blog entries on my link blog

Sunday, April 15, 2007

everything you blog can and will be used against you

At some point or another almost every blogger writes a controversial article, some bloggers do it so frequently that it doesn't generate that much press now.

Some will try to dictate rules for the blogosphere, that kinda defeats the purpose of the blog, I think that's just people trying to create the next buzzword or leave their legacy which translates into popularity and everything that comes with that, if you are a "z list" blogger like me, it probably won't make a difference if you post something that is incorrect.

**see notes at the end
Today I see this post from Sam Gentile: "Wanted: A Windows Edition for Non-Idiots"; my whole issue with that is calling regular users idiots; if I use the keyboard and command line a lot does that make me an advanced user and makes you an idiot because you don't?

Be careful when blogging, regardless of your blog popularity, you never know when it can be used against you (in a job* interview for example), I'm not going to recommend a code of conduct, all I'm saying is use common sense, respect your readers and respect everyone in general

* fixed: thanks Sam
** Sam updated his blog and changed the "non-idiots" part to "Power and Pro Users.", kudos to him for doing that. I've wanted to blog about this a long time ago, my whole point is just watch what you write on your blog (book, speech, etc), it may come back and hunt you later

Saturday, April 14, 2007

hello world from FSharp

Justin and I are beginning to play with F# (1.9.1 has been released)

open System;
Console.WriteLine("hello world");
let name = Console.ReadLine();;
Console.WriteLine("hello "+ name);
Console.Read();

we'll see how this goes, hope to blog about it soon

updated Notepad is out

Notepad2 that is =o)

The most important changes in Notepad2 2.0.x compared with version 1.0.12 include support for ini-file storage of the program settings, modeless find and replace dialogs, multiline find and replace operations (using backslash expressions), optional file change notification, and many more.

There's also some regressions, i.e. ANSI code page support has been reduced to the system default, the bookmarks feature has been removed, a few syntax schemes have been dropped, and Notepad2 does no longer run on Windows 9x. If you need any of these features, you'll have to stick to Notepad2 version 1.0.12.

read the full list of new features here

if you are still using Notepad, you might want to give Notepad2 a chance, is just as light weight as Notepad, but much more powerful

Tuesday, April 10, 2007

no more screen saver for me, thanks McAfee


I've had the BSD screen saver for a long time... is gone now =o(

Monday, April 09, 2007

is not about the pattern, it's about the practice

There's a discussion going on in the blogosphere about "bashing patterns", Corneliu (parallel thinking) says:

This month seems to be the month of bashing the singletons and some of the other design patterns.

From posts like Singleton Considered Stupid to Singleton – the most overused pattern and Criticism on one the Patterns (Blog 3), the blogo-sphere is full of comments about why singleton is bad or evil.


I don't think the problem is with the use of the pattern, but with the abuse of them; but this has always been the problem in programming in general, most of the time programmers learn a few things just to "get things working", and as long as it works "if is not broken why fix it".
Is it all the programmers fault? I don't think so, I think it has to do a lot with management requesting things to be done by yesterday (bad estimates), but that's another topic which has been discussed quite a lot already

so this is not a new problem, is the same old problem (abuse of techniques) applied to the patterns, the patterns are good, the implementation may be correct, but the usage (the practice) of them is the problem

why the singleton? I think because that's one of the "easiest" ones, you can pretty much copy and paste it, you don't even need to understand the inner workings, you just know that "it will be a single instance of your class", and that's something you can't do with other patterns

we need to teach better usages, better practices.

Wednesday, March 28, 2007

time to update your PDF reader

If you are not using Foxit reader yet, do your self a favor and download it now; now if you had used it before and you had problems with some pdf files, this is the time to give it a second chance, version 2 just came out and at least in my experience I am able to open all the files now, including those that I couldn't open before

Foxit reader is a lot faster than acrobat reader, and it doesn't install any additional garbage, is just what you would expect from a "pdf file reader"... that's what it does, and (now) it does it well

Sunday, March 18, 2007

Fix RadWindow caching

This article applies to Telerik's RadWindow component

This is a nice wrapper to create popups in your asp.net applications, but it has a problem; it caches it's contents automatically; it took me a while to figure it out, but you can solve that with a simple property:

radW:RadWindow
ID="WindowAttachFile"
runat="Server"
NavigateUrl="AttachFile.aspx"
ReloadOnShow="true"
Height="230px"
Width="410px" Modal="true"

hope this is useful for any soul out there

Thursday, March 15, 2007

google reader is being updated... scary

They've changed some links to buttons and stuff and I just realized that I have so much stuff in google that "one day without google" would put me behind in a lot of things

Saturday, March 10, 2007

programming with a mouse considered harmful

I had a hard time deciding if the title should be "programming with a mouse considered harmful" or "real programmers don't use a mouse"; but I think you get the idea

I'm mentoring a guy right now, and he started using the mouse to move around in the code, I told him

"don't use the mouse, that's a bad practice"

It doesn't matter how many years you have been programming, if you use the mouse, you are implicitly slow, you can do things at least twice as fast using only the keyboard.

leave the mouse for things that you don't usually do, but for everything that you are doing in code there absolutely no reason to use the mouse; if you are new to programming it should be a lot easier to learn to use all the shortcuts, if you have been programming for a while is definitely harder (and you probably think you're better off without them at this point) but you would definitely increase your programming speed

I am known for being pretty fast (and they say I'm cocky for that matter), but one of the main reasons I'm fast is because I learn to use the shortcuts, I had a hard time switching from Delphi IDE to VS, but I did it without remapping the keyboard to use "Delphi IDE style", I think it's a bad idea to remap the keyboard to your specific style, specially is you do some type of pair programming (you are doing paired programming, right?)

you don't have to learn all of the shortcuts available, just the ones for all the little tasks that you do commonly when programming

use the keyboard, program faster

Wednesday, March 07, 2007

let's all just develop ASP.NET in notepad / is not about the tools

Jeremy Miller started a conversation on .NET testability (or the lack there of), Ayende agrees with him

I can definitely see this, I have suffered from this... but!

I don't think the problem is with the tools, in any case the problem would be of the TDD community, Ruby on Rails is open source, why can't we create asp.net on steroids?
seems like we know exactly what we want, the concept is there, the code is there, just needs to be implemented in .NET

there was a provocative comment to Jeremy's post:
"What if I want RAD and I don't want tests?"
there are some strong arguments against this, but the truth is for most developers that's all they want

everyone can say X sucks, Y in this other language is much better, why can't we say let's create Y for asp.net?

would people really use it? or is this just a TDD religion thing? (I'm gonna get in trouble for this)

I'll tell you what, that's exactly the reason why Microsoft didn't put something like that in ASP.NET, TDD advocates are not the broad audience, the majority of the "developers" don't really know or care about TDD or refactoring or patterns and practices, they just "want stuff to work", and yes, the rest of us have to pay the price, but nobody is forcing you to use RAD if it doesn't work, you have to use the right tool.

I can agree with this:
I really think the .Net community needs to reexamine and debate the merits and appropriateness of the Visual RAD approach.
the key here is the .NET community, people keep asking Microsoft to solve all these problems, are these problems really the developer's problem? or is it just TDD community problem? how big is that community?, where is the community? why can't that community do it? let's stop blaming it on something else

is kinda late, I was just kidding with Notepad and I've just hit another trip around the sun...

what are those S-1-5... things I see on the security tab?

sometimes you right click/properties/security on things like files and you see some garbled things like S-1-5-7blablabla...
They are called security identifiers (SID), I bet at some point you thought that they were just "messed up things" or garbage or something like that?

well, they actually have a meaning, here's a full list:

Anonymous Logon (S-1-5-7): A user who has connected to the computer without supplying a user name and password.

Authenticated Users (S-1-5-11): Includes all users and computers whose identities have been authenticated. Authenticated Users does not include Guest even if the Guest account has a password.

Batch (S-1-5-3): Includes all users who have logged on through a batch queue facility such as task scheduler jobs.

Creator Owner (S-1-3-0): A placeholder in an inheritable access control entry (ACE). When the ACE is inherited, the system replaces this SID with the SID for the object's current owner.

Creator Group (S-1-3-1): A placeholder in an inheritable ACE. When the ACE is inherited, the system replaces this SID with the SID for the primary group of the object's current owner.

Dialup (S-1-5-1): Includes all users who are logged on to the system through a dial-up connection.

Everyone (S-1-1-0): On computers running Windows Server 2003 operating systems, Everyone includes Authenticated Users and Guest. On computers running earlier versions of the operating system, Everyone includes Authenticated Users and Guest plus Anonymous Logon.

For more information, see Differences in default security settings.

Interactive (S-1-5-4): Includes all users logging on locally or through a Remote Desktop connection.

Local System (S-1-5-18): A service account that is used by the operating system.

Network (S-1-5-2): Includes all users who are logged on through a network connection. Access tokens for interactive users do not contain the Network SID.

Self (or Principal Self) (S-1-5-10): A placeholder in an ACE on a user, group, or computer object in Active Directory. When you grant permissions to Principal Self, you grant them to the security principal represented by the object. During an access check, the operating system replaces the SID for Principal Self with the SID for the security principal represented by the object.

Service (S-1-5-6): A group that includes all security principals that have logged on as a service. Membership is controlled by the operating system.

Terminal Server Users (S-1-5-13): Includes all users who have logged on to a Terminal Services server that is in Terminal Services version 4.0 application compatibility mode.

Other Organization (S-1-5-1000): Causes a check to ensure that a user from another forest or domain is allowed to authenticate to a particular service.

This Organization (S-1-5-15): Added by the authentication server to the authentication data of a user, provided the Other Organization SID is not already present.

that's it! now you still don't know what they are because you didn't read this thing, but you have a reference that you can keep in your bookmarks

Thursday, March 01, 2007

dude!, I'm not getting a dell, I'm getting a Mac


and one of the main reasons why is parallels. We have seen virtual machines in all the operating systems for quite a while now, where the guest operating system sits there in it's own window.

Parallels takes this to a whole new level, it allows you to integrate the Mac and the guest OS into the same workspace! such that you can switch applications from a Mac app to a Windows app all in the same workspace (desktop), that's amazing!

take a look at the picture to see more detail, both Mac apps and Windows apps "blend" seamlessly although the apps still live in a different OS,
The apps running in windows show up in the Mac "toolbar".
It even allows you to copy and paste between the two (and according to Justin you can also drag and drop)

that's good software.

dude!, I'm getting a Mac... just wait 'til Leopard comes out =o)

Monday, February 26, 2007

This is what happens when you forget to deploy your Telerik RadControls folder

This article applies specifically to applications developed using Telerik Rad Controls

I was having a stupidus momentus (tm) yesterday, I forgot to deploy the RadControls and I kept getting this error:

Object reference not set to an instance of an object.
at Telerik.WebControls.RadWindowManager.BuildTemplates()
at Telerik.WebControls.RadWindowManager.Render(HtmlTextWriter writer)
at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer)
at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
at System.Web.UI.Control.RenderChildren(HtmlTextWriter writer)
at System.Web.UI.HtmlControls.HtmlForm.RenderChildren(HtmlTextWriter writer)
at System.Web.UI.HtmlControls.HtmlForm.Render(HtmlTextWriter output)
at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
at System.Web.UI.HtmlControls.HtmlForm.RenderControl(HtmlTextWriter writer)
at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
at System.Web.UI.Control.RenderChildren(HtmlTextWriter writer)
at System.Web.UI.Control.Render(HtmlTextWriter writer)
at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer)
at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
at System.Web.UI.Control.RenderChildren(HtmlTextWriter writer)
at System.Web.UI.Page.Render(HtmlTextWriter writer)
at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer)
at Telerik.WebControls.RadAjaxManager.AJAX_Page_Render(HtmlTextWriter output, Control container)
at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
at System.Web.UI.Control.RenderChildren(HtmlTextWriter writer)
at System.Web.UI.Page.Render(HtmlTextWriter writer)
at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter)
at System.Web.UI.Control.RenderControl(HtmlTextWriter writer)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Telerik could do better with their exception handling, but anyway... I just needed another pair of eyes to see the issue

Tuesday, February 20, 2007

My name

Miguel de Icaza (one of the guys behind Mono) tells us how "english speakers" mispronounce his name (Mi-goo-elle), I don't think that's bad at all, in my case I get

ee-ber
Aber
A-bear
Heber

and let's not even try my last name

I have to explain that my name is like in "forever"... but most of the time I don't even bother now, you just get used to it

Thursday, February 15, 2007

time for a refactorer job title

from Jeff Atwood post code smaller
It's up to us to resist the natural tendency of any project to snowball into a giant rolling Katamari ball of code. Code smaller!
for the last 4-6 months I have eliminated about 3-5 times more code than I have written (maybe more than that!?), specially using generics, as everything else in life (hopefully) you get better at it the more you do it.

but I have seen this problem over and over again in many different teams, and the sad part is that the problem is not specific to new developers, experienced developers keep doing it the same way

It seems is time for a new job title whose primary responsibility is to refactor code, and the members of the team should learn from him and start to follow

of course the actual job title would have to be much cooler than "Refactorer"

Wednesday, February 14, 2007

Before you ask...

nowadays everyone thinks they know how to use google (pretty much in the same way people assume they know how to use Windows... sigh)

For a lot (most?) of things it works fine by entering a few words (although it helps to know which words you shouldn't put on your search), but sometimes is not so easy to find the stuff, that's when you need to use your google search skills, at minimum you need to know these ones:

- intitle:
- link:
- site:
- intext:
- inanchor:
- inurl:
- filetype:
- define:
- using quotes
- using wildcards
- using OR, AND
- using -
- using ranges

If you don't know how to use all the "commands" on this list, you are missing a lot.
There are many other interesting tools built right into google.com, like:

- calculator
- conversions
- UPS, Fed Ex, USPS tracking information
- VIN information
- movies
- etc, etc, etc

check this page for a very complete list of things you can do with google, included all of the items in my list

Tuesday, February 13, 2007

good bye username and password

Whenever you use user names and passwords in your applications, consider using System.Net.NetworkCredential to pass the information around functions, it encapsulates those fields, and allows you to extend in the future to maybe use a domain as well.

In my case we're using it in a plugin architecture to authenticate against any system, using this class encapsulates those fields and allows the plugin to authenticate against most standard systems as it is not tied specifically to username and password

Saturday, February 10, 2007

magic variables to help in exception debugging

This article applies to C#, J#, and Visual Basic.
I read about these variables a long time ago in some blog, but I could not find anything about those hidden little things, mainly the problem was that they are not called magic or hidden, they are documented and are called Pseudovariables;

Pseudovariables are terms used to display certain information in a variable window or the QuickWatch dialog box. You can enter a pseudovariable the same way you would enter a normal variable. Pseudovariables are not variables, however, and do not correspond to variable names in your program.

Anyway, I don't think many people know about them, here they are:
  • $exception: Displays information on the last exception. If no exception has occurred, evaluating $exception displays an error message.
    In Visual C# only, when the Exception Assistant is disabled, $exception is automatically added to the Locals window when an exception occurs.
  • $user: Displays a structure with account information for the account running the application. For security reasons, the password information is not displayed
when you are debugging an exception you might have some code like this:

try {
//some code
} catch (Exception e) {
//don't really need e here, just to get the exception information on the Watch window
}

you could write this code as:
try {
//some code
catch { } //put the breakpoint on this line, inspect $exception (Debug, Watch, Watch 1, type $exception there)

and get the same information.

The $user pseudovariable is pretty self explanatory.

in native code you have a few more pseudovariables available, check the link if you are interested.

those little things...

Friday, February 09, 2007

DOS attack on google using google tools?

just noticed this post on the Google Operating System blog that shows how to backup your blogspot hosted blog, it basically allows you to run a query like this:

http://ebersys.blogspot.com/search?max-results=N

that retrieves N posts for such blog

but what if the bad guys just decide to use that and query a bunch of blogspot pages all at the same time? that would be a lot of data coming from the google servers, I just tried this one

http://googlesystem.blogspot.com/search?max-results=2000

and it took quite a while to download

the fix would be easy, they can put restrictions on who can run the query, for example just require that the blogspot user is authenticated and you can only run the query on your blog

unless google doesn't care and they can handle that just fine, we'll see

As a general rule, unless you are part of google, don't allow your users to run queries that return all the rows in your tables... is not a good thing

Thursday, February 08, 2007

protected, internal, protected internal... are you sure you know them?

the code for this article applies to C#

We all take access modifiers for granted, but can you tell me what protected internal does?

I bet more than half .NET developers will get that wrong, let's review:
  1. private:
    1. This is the least permissive access level.
    2. Accessible only within the body of the class or the struct in which they are declared.
    3. Nested types in the same body can also access those private members
  2. public:
    1. This is the most permissive access level.
    2. There are no restrictions on accessing public members, they are visible anywhere the class is visible
  3. protected:
    1. Access is limited to the containing class or types derived from the containing class.
    2. which means you cannot create an instance of a class and have access to protected members.
  4. internal:
    1. Access is limited to the current assembly.
  5. protected internal:
    1. Access is limited to the current assembly or types derived from the containing class.
that last one is kinda tricky, it kinda "makes sense" that it allows access only in the current assembly and the current or derived classes, but the "or" there is what makes a difference, if you mark a property protected internal, it can actually be accessed outside the assembly. basically protected overrides internal and so I'm not even sure when it makes sense to use such modifier.

If you don't believe me go check it out your self:
Assembly1:
public class Test {
protected internal string prop1;
}

Assembly2://after adding a reference to Assembly 1
public class Test2: Test {
public string prop2;
public Test2() {
prop2 = prop1; //came from the other assembly's class protected internal member
}
}

if this is news for you, you might think, that's stupid, how do you get a property to be visible only the the current assembly, current class and derived classes?

quite simple, you mark your class as internal, so your class can only be accessed from the current assembly, and you mark your property as protected, thus giving access to the derived classes only in the current assembly:

internal class Test {
protected string prop1; //accessible only in this assembly in this class and derived classes
}

Sunday, February 04, 2007

VS2005, VS2007 (Orcas), XNA, LINQ, WPF in Vista

how is that for a title... =o)

Justin and I were playing today with these technologies, it wasn't so much fun as we expected, in short all those things don't work together in Vista, if you want more details read on
  • VS2005 doesn't work on Vista, it crashes randomly and very often
  • VS2007 works fine on Vista
  • XNA development is not supported on VS2007 or Vista, only in VS2005 Express
  • the latest WPF is not supported in VS2007, only in VS2005
  • LINQ works fine on VS2007
so if you're thinking about playing with any of those technologies in Vista, reconsider using Windows XP

Tuesday, January 30, 2007

The type initializer for * threw an exception

The type initializer for *insert your favorite class here* threw an exception

This was driving me crazy, there's not a whole lot of info out there about this error, I should've used my psychic debugging powers (yes, I have those too =op) before

my scenario is a web service (.net 2.0) calling (deep down) into some code that does reflection to instantiate some classes, the exact same code works just fine under a web application, that's what's bizarre, how's a web service different to a web app on regards to permissions and security?

anyway, almost from the beginning I suspected it had to do with permissions, but being a web service, and the same code running fine under the web app made me leave that as a last option, so I looked and didn't find any real answer, then decided to configure a different user (with more permissions than the default asp_net) in IIS to run my web service, it ran just fine after that

ok, now I know the problem is permissions but I'm not happy with the "fix", so I'll keep looking and trying for a more elegant solution

free tip for those of you who may not know this one
enter "The type initializer for * threw an exception" in google... it's a beautiful thing, Google takes wild cards as part of a search, it works with multiple wild cards in one phrase too

Monday, January 29, 2007

formatting 0, 1 as yes, no or whatever

This is something we all have done at some point, convert a 0,1 value into yes, no, on, off, etc string

turns out there is a function in the BCL that can do this, string.Format will do the job

Console.WriteLine(string.Format("{0:yes;;no}", 0)); //will output "no"
Console.WriteLine(string.Format("{0:yes;;no}", 1)); //will ouput "yes"


and just for the heck of it
Console.WriteLine(string.Format("{0:yes;;no}", -1)); //will output "-yes"

...one of those little thingies

Tuesday, January 16, 2007

xna programming: pre-requisites

A few moons ago (WOW, it has been a while) I promised I would write a small game and post all my experiences and source code here, we did the game design, set the goals and started writing the game, then after getting sick, the holidays, updates to the XNA framework, etc, kinda stopped working on the game. anyway, I decided to pick it up and started studying xna tutorials again to see what kind of things I had done wrong due to my lack of knowledge, it seems I wasn't doing so bad so I can actually update the tools (since there is an official xna release now), modify a couple things on my code and I'm good to go

however there are a couple (big) things you need to download and install before we can continue
- Visual C# 2005 Express, you might want to NOT download the MSDN help for it though, that's an extra 2GB or so, VC#2005 Express can be downloaded here, and if you have any firewall issues you could download an offline installation (CD) here
- DirectX Software Development Kit, which includes XACT, a tool that will help you create and work with sounds
- XNA GSE (Game Studio Express), this is the thing that will allow you to create a xna project and conect all the dots so you can easily write xna apps, however beaware of the following:
  • Only supported on Microsoft® Windows® XP SP2 (all editions) at this time. Windows Vista will be available only in a future beta release of XNA Game Studio Express.
  • Hardware requirements are identical to those for Visual Studio 2005 plus a graphics card that supports DirectX 9.0c and Shader Model 1.1 (Shader Model 2.0 support recommended).
  • This release requires Microsoft Visual C# 2005 Express Edition to be installed before proceeding. You can install Visual C# Express from the Visual C# Express Download Page. However, other members of the Visual Studio 2005 line of products, for example Visual Studio 2005 Professional, can co-exist with XNA Game Studio Express on the same computer.
  • Installation of the XNA framework is not necessary on systems with XNA GSE installed
once you get all that working, take a look at the basic tutorials out there, get familiar with the API, play with it, my code won't be about teaching you C# like some of the tutorials on the provided links, I will assume you are already familiar with the language, although you might learn a technique or two but I won't be explaining C# coding, just the use of the XNA API and the overall design of the game

'til next time

Saturday, January 13, 2007

dummy interview question

is this code:
A)
a1 = new SomeClass();
a2 = new SomeClass();

equivalent to:
B)
a1 = a2 = new SomeClass();

??
(explain why)

The trick is how you ask the question, if you asked "what's the difference between option a and option b?" you are already telling them there is a difference.

Friday, January 12, 2007

Thursday, January 11, 2007

Tuesday, January 09, 2007

suggestion for google reader

I can start items and share items, that's great, how about you allow me to highlight stuff?

Thursday, January 04, 2007

just got my old new thing

now if I could get this book autographed J

got some reading to do J

Wednesday, January 03, 2007

first geek joke of the year

I tried posting more stuff yesterday but blogger.com was down, I couldn't even leave comments to other blogger blogs =o(

anyway, happy new year everyone!!

Tuesday, January 02, 2007

first post of the year

I'm in El Paso right now, it's been snowing all morning in Juarez and here, hopefully my flight won't be delayed, and what's worst, I'm flying through Denver...
anyway, I have internet thanks to my Cingular 8125 =o), we'll see how it goes today, at least I'll be reading a lot of blogs and updating my reading list