2006/08/24

HOWTO: Calculate MD5 checksum in Windows (and other checksums, too)

On Linux that's trivial - there is the md5sum program.

Windows does not come with such a tool, but you can use md5deep package.
md5deep is a cross-platform set of programs to compute MD5, SHA-1, SHA-256 Tiger, or Whirlpool message digests on an arbitrary number of files. The programs run on Windows, Linux, Cygwin, *BSD, OS X, Solaris, and should run on most other platforms. md5deep is similar to the md5sum program found in the GNU Coreutils package (...)

2006/08/12

HOWTO: Perform a scheduled shutdown without installing additional software

The easiest way of performing a scheduled shutdown of a Linux computer, that came to my mind, was executing something like this:

  sleep 3600 && poweroff

However, this couldn't work, since root privileges are necessary to run poweroff command. So you have to use:

  sleep 3600 && sudo poweroff

But this will cause the computer to wait for 1 hour (3600 seconds) and then prompt for the root password. And what we are trying to avoid is sitting in front of the computer at that time.

But there is a very simple solution:
  1. Type sudo visudo to edit the /etc/sudoers file.
  2. Add the following line:
    your_username ALL= NOPASSWD: /sbin/poweroff

Now you can execute sudo poweroff without typing the password.

2006/08/09

ISNULL, implicit conversion and integer data type

SELECT ISNULL(CAST(NULL as int), '+')
0

SELECT ISNULL(CAST(NULL as int), '-')
0

SELECT ISNULL(CAST(NULL as int), '/')
Server: Msg 245, Level 16, State 1, Line 1
Conversion failed when converting the varchar value '/' to data type int.

To explain the above one must to remember that:
  1. ISNULL returns the same type as the check expression (that's the 1st parameter),
  2. varchar and char data types can be implicitly converted to int (if you don't know what it means, try executing SELECT 2 + '2'),
  3. SQL Server treats '+' and '-' characters as a number - 0.
So this is what happens - ISNULL tries to return int data type and it converts the replacement value (that's the 2nd parameter); it succeeds in 2 cases, but fails in the 3rd one, because '/' is not a numeric expression.

2006/08/08

Linux applications - languages

If a Linux application starts and the interface is translated into some language that you don't want to use (or even worse - it is partly translated, as it was in my case, so names in the menus were a mix of English and Polish words), you can go to:

/usr/share/locale/[language_folder]

and delete [application_name].mo file.

Rather a dirty hack, but it works.

You will need root privileges, of course.

2006/07/22

Querying a view in another view, column datatypes & a 'String or binary data would be truncated' error

When you query a view (a child view) inside another view (a parent view), always remember to recreate the latter one when you change a datatype of a column in the former one.

An example:

-- a child view
CREATE VIEW dbo.FOO
AS
  SELECT 'a' AS A
GO

-- a parent view
CREATE VIEW dbo.BAR
AS
  SELECT *
  FROM dbo.FOO
GO

sp_help BAR
-- column A has a datatype of varchar(1)
-- Column_name  Type       Computed   Length
-- ------------ ---------- ---------- ------- [...]
-- A            varchar    no         1

DROP VIEW dbo.FOO
GO

CREATE VIEW dbo.FOO
AS
  SELECT 'aa' AS A
GO

sp_help BAR
-- sp_help still shows that column A has a datatype
-- of varchar(1), although it is now varchar(2) - see
-- the SELECT statement below
-- Column_name  Type       Computed   Length
-- ------------ ---------- ---------- ------- [...]
-- A            varchar    no         1

SELECT *
FROM dbo.BAR
-- A
-- ----
-- aa

If you now try to run the following query:

  SELECT *
  INTO dbo.NEW_TABLE
  FROM dbo.FOO

it will fail with an String or binary data would be truncated error.

2006/07/19

Visual Studio 2003 sets a breakpoint in another file

There is a bug in Visual Studio 2003 that sometimes makes setting a breakpoint in certain files impossible. When you try to set it, the breakpoint is set, but not in the file that you opened - the moment you hit F9, VS jumps to another file and sets the breakpoint there.

I struggled with this problem for quite a long time. I tried using the mouse instead hitting F9, setting the breakpoint on different lines, reopening the file, reloading the project, restarting VS, using another machine. Nothing helped.

Finally, I discovered that I could open a Breakpoints window (Crtl+Alt+B), press New button and create a new Function Breakpoint - a breakpoint of this type was created successfully.



Note that you can copy the full name of a function from the Class View window.

2006/06/27

Querying a view takes ages - really weird SQL Server 2005 behaviour

There is a view called VIEW_TITLES. It is quite complicated. Executing a SELECT query against it returns 189 rows.

A query:
  SELECT TOP 200 *
  FROM dbo.VIEW_TITLES
takes 13 seconds to execute.

However, executing an identical, when it comes to the returned rows, query:
  SELECT *
  FROM dbo.VIEW_TITLES
takes an indefinite amount of time - I cancelled the execution after 5 minutes.

I have no idea how to explain this behaviour. It looks like a bug in the optimizer to me.

The only workaround I found looks like this:
  SELECT TOP (SELECT COUNT(*) FROM dbo.VIEW_TITLES) *
  FROM dbo.VIEW_TITLES

I know it's a pretty dirty hack, but it works. And it is still better than hard-coding some fixed number in the TOP expression.

2006/06/21

Debugging a Windows service

OnPause, OnContinue and OnStop methods can be debugged by simply attaching to the [WindowsServiceName].exe process and setting breakpoints in the appropriate places.

The problem gets a little bit harder when it comes to debugging OnStart method, since there is no process that can be attached to, because the service is not running. There are many ways to solve this problem, but, in my opinion, the easiest one is to
call a System.Diagnostics.Debugger.Launch() method within the OnStart method in order to start a debugger programmatically.

A detailed description of this problem can be found here.

2006/06/08

How to format USB flash drive on Linux

You can use mkdosfs command.

For example:
  sudo mkdosfs /dev/sdb1

2006/06/05

SSIS package execution fails when you run it from a SQL Server Agent job

I created a SQL Server Integration Services (SSIS) package. It was pretty simple and it worked fine. After testing it, I created a SQL Server job with a single step that was supposed to execute the package.

And it took me two days to make it work. Unfortunately, documentation dealing with this topic is pretty poor.

I was getting different errors - for example:

Executed as user: SOME_DOMAIN\sqlagent2005. The package could not be found.
The step failed.

Unable to start execution of step 1 (reason: Could not get proxy data for
proxy_id = 2). The step failed.

This is a method I found (I am positive that there are other ways to get the same result, too).

1. Create a credential (make sure that the chosen account can execute jobs).

2. Create an SSIS proxy using this credential.

3. Set the proxy in the 'Run as' combo in a job step definition.

4. Grant access to C:\Program Files\Microsoft SQL Server\90\DTS\Packages (or wherever you deployed your SSIS package) to the domain account that you used to create the credential.

UPDATE:

Later I found a good article about this problem - An SSIS package does not run when you call the SSIS package from a SQL Server Agent job step.