Getting spam from Gmail

Today I received a phishing email from an account in Google.

What is sad is that Google wants to protect its clients so badly that there is no trace of the client’s IP on the email headers. All you see is the Google’s IP.

This, imho, is not right. I want to see the sender, if the sender is so concerned about his/her IP being exposed, he/she sure will know enough to hide it. This is not Google’s job…

You certainly don’t want to receive unsigned letters…
Yes, my anti-spam filter caught the message, but I want to see who sent it.

Here’s Google’s disclaimer:

User IP addresses

Protecting our users’ privacy is something we take very seriously. Personal information, including someone’s exact location, can be gathered from someone’s IP address, so Gmail doesn’t reveal this information in outgoing mail headers. This prevents recipients from being able to track our users, or uncover what may be potentially sensitive personal information.

Don’t worry — we aren’t enabling spammers to abuse the system by not revealing IP addresses. Gmail uses many innovative spam filtering mechanisms to ensure that spammers have a difficult time sending bulk emails that arrive in users inboxes.

What happens when their innovative system fails?

Yes, I filled out the form to report the spam, but I got the Hollywood answer, don’t call us, we’ll call you…

Sure…

On which AD group are you?

On Windows based enterprise with Active Directory it is very usual to use AD groups to reinforce access lists/authentication within enterprise applications/services/databases and mashups.

If you’re lost at why you cannot access some application to take a look at, and that application uses integrated security, you’re better off knowing which AD group your username is associated with…

On the OS command prompt type in this handy command:

NET USER “username” /DOMAIN

where “username” should be replaced with your windows login.

Handy links if you like to compare

VB.NET and C# Comparison

Java (J2SE 5.0) and C# Comparison

C# vs Ruby Smackdown!

log4net vs EL 1.0

SQL Server 2000 vs Oracle 9i

A Comparison of PL/SQL and Transact SQL

and last but not least:

Comparison of SOA Suites

Note there is an ESB implementation from P&P for BizTalk 2006 R2 that sort of leverage the missing functionality in the product: ESB Guidance for BizTalk Server 2006 R2

Ok, there’s nothing new here, just a personal cheat sheet :-p

Tips and tricks for applying SQL Server 2005 hotfixes

Tips and tricks:

  • You can install any hotfix in silent mode passing the parameter /quiet to the executable in the command prompt or in a batch file. This is extremely helpful if you want to push the hotfix installation with a third party tool and without the wizard interface
  • The /? parameter will give you the rest of the options for installing the hotfix. A very useful option is /allinstances
  • You might wonder why would you like to run any hotfix unsupervised, it might not make sense on a stand alone server but it makes sense when you have a few dozen of remote subscribers and/or you deploy SQLE as part of a SmartClient application. Your batch script can provide you with the installation log afterwards.
  • You cannot rollback a hotfix or a SQL Server Service Pack. The only option is to reinstall the SQL Server instance. Plan your testing very carefully…
  • If you have a virtual drive on the box where you’re applying the hotfix beware that it will try to unzip its files in it. If that virtual drive is read only or used for another purposes you might have troubles. To determine if there is a virtual drive on your box run the command subst. You can always delete the virtual drive apply the hotfix (it will unzip on c: or the drive where the windows installation is, as expected) and put back the virtual drive after the hotfix is applied.

Hope this helps and happy patching!

The ListView control in System.Windows.Forms 2.0 has a bug

Oh my, the end users are going to get really entertained with this bug.

I’m trying to present images as icons on a list view and the end user should drag and drop the image to the desired location inside the list view to have their list ordered. Unfortunately no matter to which position you drag and drop the image, the image is always placed at the end.
I found a forum post about this with no solution:
Inserting items at specific index in listviews (c# .net 2.0)

If anyone knows of a workaround, I would be more than happy to know. Poor end users will have to get a lot of training to realize the drag and drop only drops the items at the end…

Thanks for the connect program at MSDN.
There is a published workaround here:
MSDN Connect Issue # 115345

And at the end all the fault is on the Win32 List View implementation on which this .net control is based:

MSDN Connect Issue # 94685

Note the published workaround won’t work if you’re not using Groups on your ListView. I modified this to work directly with the ListViewItem Items collection. I might publish an extended version of the control here with this fix if time permits…

Happy coding!

Monday morning random rambling…

Now that caffeine is taking effect: I attended the Heroes Happen Here event in Toronto last week. The event was fun in general, lots of marketing going on so the developers get really biased, towards Microsoft technologies, of course…
Not that this is necessarily a bad thing, as long as you keep your mind open to what’s going on on other development niches and keep the constructive criticism.
I enjoyed the developer tracks in the morning but most of all I enjoyed two architecture presentations, they were light and fun, not too deep in content though, but very refreshing. Here are the blogs of the conference authors:
No Spin Architecture
Joel’s blog on architecture

Both blogs have tons of resources for aspiring architects.

There was a third presenter that raffle 4 architecture books, the raffle consisted on answering a question at light speed, doh! I’m planning on getting the books at amazon…

Overall, I got good software to try, saw that VS2008 has the split markup/code feature for web development that Macromedia had when I started doing web in 2000 and I should get a copy of Vista on my mail in the next few weeks. I’m excited about the JavaScript debugger and IntelliSense in VS2008. Hyper-V promises to be more secure than VMWare, SQL Server 2008 has the FileName type I wish I have now for my image archiving project…
I can’t wait to get my hands on Virtual Earth web service and bundle it with the new maps capabilities in SQL Server 2008, if time permits, there’s only 24 hours in a day and deadlines cannot be stretched :-p

Cheers!

The fix for batch deletions at Publisher when use_partition_groups is set to false In Merge Replication is indeed there!!!

Yay!

The fix for this bug is here. Microsoft published Cumulative Update 6 for SQL Server 2005 SP3. Please see previous post for the original bug description. We had problems when not using partition groups on our merge replication topology (see the TSQL Scripts below). When there were batch deletions caused by filtering at the Publisher, those rows were deleted at the publisher (published database) during the next replication (synchronization with subscribers)

The faulty stored procedure was sp_MSdelsubrowsbatch

The faulty line of code, believe it or not, was a single line
on the faulty SPROC and can be seen below in bold:

— change tombstone type for the non-original rows (the rows that got deleted via expansion).
update dbo.MSmerge_tombstone
set type = 1
from
(select distinct tablenick, rowguid from
#notbelong where original_row <> 1) nb,
dbo.MSmerge_tombstone ts
where ts.tablenick = nb.tablenick and
ts.rowguid = nb.rowguid
option (FORCE ORDER, LOOP JOIN)

On the sproc after CU6:
update dbo.MSmerge_tombstone
set type = @METADATA_TYPE_PartialDelete
from
(select distinct tablenick, rowguid from
#notbelong where original_row <> 1) nb,
dbo.MSmerge_tombstone ts
where ts.tablenick = nb.tablenick and
ts.rowguid = nb.rowguid
option (FORCE ORDER, LOOP JOIN)


Basically the deletions caused by filtering (Partial deletes) were marked as tombstone or user deletions.

Given the following variable declarations:

declare @METADATA_TYPE_Tombstone tinyint
declare @METADATA_TYPE_PartialDelete tinyint
declare @METADATA_TYPE_SystemDelete tinyint

and assignation:

set @METADATA_TYPE_Tombstone= 1
set @METADATA_TYPE_PartialDelete= 5
set @METADATA_TYPE_SystemDelete= 6

 

This caused deletions in the published database. Each subscriber had a subset of the published database. The merge replication was created with filters to allow having at one subscriber only the data pertaining to that subscriber and not the data pertaining to any other subscriber.

If you ever doubted the power of a single line of code… :-p

Happy coding guys!

 

Cumulative Update Number 6 for SQL Server 2005 SP2 is out!!!

Hi DBAs and Database Developers out there,
Finally the long awaited CU#6 was released on Feb 18th near mid night.

946608 Cumulative update package 6 for SQL Server 2005 Service Pack 2
http://support.microsoft.com/default.aspx?scid=kb;EN-US;946608

I’m currently testing our merge replication issues with this CU.

Even though the bug described in the DevX article is not in the KB article list, we got confirmation that the fix is on the CU#6.

So far the identity automatic management problem described on my previous post remains the same. If the user making the inserts is not a db_owner, automatic identity management ain’t going to happen on your publisher…

Identity Range not working for Merge Replication in SQL Server 2005

Back in Sept 2007 I blogged about the problem we were having with the identity range in merge replication:@@identity not working after SQL Server 2005 upgrade The problem continued until today, this post is to explain what we figured out.

The error message that describes this problem reads as follows:

[548] The insert failed. It conflicted with an identity range check constraint in database ‘DatabaseName’, replicated table ‘dbo.TableName’, column ‘ColumnNameId’. If the identity column is automatically managed by replication, update the range as follows: for the Publisher, execute sp_adjustpublisheridentityrange; for the Subscriber, run the Distribution Agent or the Merge Agent.

The identity range adjustment happens after every insert in the given article. The code responsible for the identity check adjustment is on the system trigger for the published article:
MSmerge_isn_GUID where GUID is the GUID for the given article.

if is_member(‘db_owner’) = 1
begin
— select the range values from the MSmerge_identity_range table
— this can be hardcoded if performance is a problem
declare @range_begin numeric(38,0)
declare @range_end numeric(38,0)
declare @next_range_begin numeric(38,0)
declare @next_range_end numeric(38,0)

select @range_begin = range_begin,
@range_end = range_end,
@next_range_begin = next_range_begin,
@next_range_end = next_range_end
from dbo.MSmerge_identity_range where artid=’BAEF9398-B1B1-4A68-90A4-602E3383F74A’ and subid=’0F9826DB-50FB-4F73-844D-AE3A111B4E1C’ and is_pub_range=0

if @range_begin is not null and @range_end is not NULL and @next_range_begin is not null and @next_range_end is not NULL
begin
if IDENT_CURRENT(‘[dbo].[TableName]’) = @range_end
begin
DBCC CHECKIDENT (‘[dbo].[TableName]’, RESEED, @next_range_begin) with no_infomsgs
end
else if IDENT_CURRENT(‘[dbo].[TableName]’) >= @next_range_end
begin
exec sys.sp_MSrefresh_publisher_idrange ‘[dbo].[TableName]’, ‘0F9826DB-50FB-4F73-844D-AE3A111B4E1C’, ‘BAEF9398-B1B1-4A68-90A4-602E3383F74A’, 2, 1
if @@error<>0 or @retcode<>0
goto FAILURE
end
end
end

As you might have noticed already, if the insertion is made by a user that is not member of the db_owner database role, the identity adjustment won’t happen. I believe this is a bug, not a feature. It forces the users that are allowed to do insertions to be owners of the database, or they will have the run out of identities error quite often and a manual adjustment will be required.

What the savvy DBA can do:

The template for all of the MSmerge_ins_GUID triggers are on the model database, these triggers are created by the system stored procedure: sp_MSaddmergetriggers_internal

If you change the code on this system stored procedure any new database creation will have the proper template for creating the merge insertion triggers. For the existing databases, you might like to modify the MSmerge_ins_GUID trigger manually, for now.

At the time I’m writing this post I’m not aware if this issue is addressed on any cumulative update. There is a similar case on the Cumulative Update released on January 15, 2008
http://support.microsoft.com/kb/941989

Happy coding guys!