Thou shalt have no other Search Engine before me, neither Yahoo nor Lycos, AltaVista nor Metacrawler. Thou shalt worship only me, and come to Google only for answers.
..way too much free time on their hands
what!? you are going to join?
My thoughts, articles, findings, etc. mainly about programming and computers in general.
Thou shalt have no other Search Engine before me, neither Yahoo nor Lycos, AltaVista nor Metacrawler. Thou shalt worship only me, and come to Google only for answers.
..way too much free time on their hands
what!? you are going to join?
I propose we adopt a Programmer's Bill of Rights, protecting the rights of programmers by preventing companies from denying them the fundamentals they need to be successful.
...is just weird that the link is 666...
I just fixed some code (not written by me!) that went something like this:
transaction = connection.BeginTransaction();
try {
try {
//***.... database operations here...
} finally {
transaction.Commit();
}
} catch {
transaction.RollBack();
}
First of all, there is a bug there, if an exception is ever raised, it will raise a new exception because it cannot rollback a transaction that was committed (the message will not be that clear, but that's what it means, the exception says something about unable to complete the operation due to the current state of the object), and you'll lose the original exception that you got
Second, it's just wrong, it defeats the purpose of using a transaction, is like you are saying
//*** delete some records
//*** update some records
//*** some db operation that caused some exception
//*** finally, commit what I had done so far
leaving your data in an unknown state because you commited all the operations up until it failed
hint: always use "using" for any DB related stuff (connections, commands, transactions, etc)
On my last post I showed you some wicked use of generics, Ayende says he can't read code like that and provided an alternative; I agree with him, it is very ugly code, but there is hope!
here's the equivalente code for the first section (note that I'm still using generics, even if it doesn't look like it), where we wanted to store a list of file names:
FilesList filesList = GetFilesList();Then we have the bidimensional generic, to store folder name and the files in it:
ListFiles(filesList);
FoldersWithFiles foldersWithFiles = GetFoldersWithFiles();
foreach (FoldersWithFilesPair kv in foldersWithFiles) {
Console.WriteLine(string.Format(" Folder: [{0}]", kv.Key));
ListFiles((FilesList)kv.Value);
}
And finally where we store computer names, with the folders, with the files in it:
ComputerFiles computerFiles = GetComputerFiles();And my last example would now look like this:
foreach (ComputersWithFoldersPair kv in computerFiles) {
Console.WriteLine(string.Format("Computer: [{0}]", kv.Key));
foreach (FoldersWithFilesPair kv1 in kv.Value) {
Console.WriteLine(string.Format(" Folder: [{0}]", kv1.Key));
ListFiles((FilesList)kv1.Value);
}
}
ComputerFiles computerFiles = new ComputerFiles();instead of this:
Dictionary<string, Dictionary<string, List<string>>> ComputerFiles =
new Dictionary<string, Dictionary<string, List<string>>>();
Now, if the code is equivalente and I'm still using generics, what did I do?
I am using aliased generics (yup, invented here too J) which give me friendly names, instead of the ugly multidimensional generics syntax
Here's the aliases declaration:using System.Collections.Generic;
using FoldersWithFilesPair = KeyValuePair<string, List<string>>;
using ComputersWithFoldersPair = KeyValuePair<string, Dictionary<string, List<string>>>;
using FilesList = List<string>;
using FoldersWithFiles = Dictionary<string, List<string>>;
using ComputerFiles = Dictionary<string, Dictionary<string, List<string>>>;
The best of both worlds, you can use complex generic data structures and keep your code readable.
You put all the uglyness in a simple place, and you are able to use friendly names which look like normal classes, plus you get more extensibility because you could change the signature of the aliased generics without breaking the code.
On my next post I'll show you another technique to accomplish the same thing, and some gotchas, then I'll put the full source code in a zip file so you can download it.
some people have just been blogging for too long
(oh yeah, and I wanted to test the Live Writer image uploading capabilities...)
You can think of Generics as Arrays on steroids or Collections on steroids or a combination of both, they offer an extensible list of items with type safety; or as MSDN puts it:
Generics allow you to define type-safe data structures, without committing to actual data types.
One thing that I haven't seen much is how you can use multidimensional generics (yup, invented here J), let me explain what I mean
let's say we wanted to store a list of file names, we could do something like:
List<string> filesList = GetFilesList();
ListFiles(filesList);
Dictionary<string, List<string>> foldersWithFiles = GetFoldersWithFiles();
foreach (KeyValuePair<string, List<string>> kv in foldersWithFiles) {
Console.WriteLine(string.Format(" Folder: [{0}]", kv.Key));
ListFiles(kv.Value);
}
Dictionary<string, Dictionary<string, List<string>>> ComputerFiles = GetComputerFiles();
foreach (KeyValuePair<string, Dictionary<string, List<string>>> kv in ComputerFiles) {
Console.WriteLine(string.Format("Computer: [{0}]", kv.Key));
foreach (KeyValuePair<string, List<string>> kv1 in kv.Value) {
Console.WriteLine(string.Format(" Folder: [{0}]", kv1.Key));
ListFiles(kv1.Value);
}
}
static void ListFiles(List<string> filesList) {
filesList.ForEach(new Action<string>(delegate(string s) { Console.WriteLine(string.Format(" {0}", s)); }));
}
and you can see it if you did something like:
Dictionary<string, Dictionary<string, List<string>>> ComputerFiles = new Dictionary<string, Dictionary<string, List<string>>>();
I got this error:
Warning 6 'System.Runtime.Remoting.Channels.ChannelServices.RegisterChannel(System.Runtime.Remoting.Channels.IChannel)' is obsolete: 'Use System.Runtime.Remoting.ChannelServices.RegisterChannel(IChannel chnl, bool ensureSecurity) instead.'
It threw me off for a little while because System.Runtime.Remoting.ChannelServices.RegisterChannel doesnt' really exist
the problem there was that they just missed the .Channels part of the namespace, so it should've been:
"use 'System.Runtime.Remoting.Channels.ChannelServices.RegisterChannel(IChannel chnl, bool ensureSecurity) instead"
ok, that was the first part, now if this overload is obsolete, which one is the equivalent?
RegisterChannel(chnl, true)
or
RegisterChannel(chnl, false)
Reflector to the rescue, the equivalent is to use false as the second parameter, that's what the current function does right now when you call
RegisterChannel(chnl);
it calls:
ChannelServices.RegisterChannelInternal(chnl, false);
This happens when you add multiple blogs accounts, on the last dialog if you uncheck the "switch to this blog now" (or something like that) the new blog won't appear in your list of blogs, so you are not able to switch to that
restarting the app refreshes the list
This thing is pretty cool, it allows me to write to my multiple blogs just fine, check out their blog too
We just coded something like (please disregard the variable names, I'm just illustrating the point)
return myCollections.Services ?? (myCollections.Services = dbLayer.GetServices());
one-liner to do a bunch of stuff, and it's still clear what you are trying to do, if you know the ?? operator you can stop right here, if you don't let me explain a bit more
the ?? operator returns the left-hand operator if it is NOT NULL, else it returns the right operand
so this code is the equivalent of:
if (myCollections.Services == null)
myCollections.Services = dbLayer.GetServices();
return myCollections.Services;
To create a log file in Notepad:
1. Click Start, point to Programs, point to Accessories, and then click Notepad.
2. Type .LOG on the first line, and then press ENTER to move to the next line.
3. On the File menu, click Save As, type a descriptive name for your file in the File name box, and then click OK.
When you next open the file, note that the date and time have been appended to the end of the log, immediately preceding the place where new text can be added.
You can use this functionality to automatically add the current date and time to each log entry.
How to Use Notepad to Create a Log File
Pretty cool, everytime you open the file after that (in Notepad), it adds a timestamp
and you can enter some text
Turbo Delphi, Turbo Delphi for .NET, Turbo C++ and Turbo C# will be generally available in the third quarter of 2006. The Turbo Explorer editions of these products will be free. Pricing for the Turbo Professional editions will be under $500. Student academic pricing for the Turbo Professional editions will be under $100. For more information, visit www.turboexplorer.com.
August 8, 2006 - Turbos Press Release
We'll see what they can do against the Microsoft Express versions which have been out and free for a while, right now I don't see how they could compete but we'll see; if they run (and probably will) against the .NET Framework 1.1 that will discourage a lot of people
Points For Style
Again, to be a hacker, you have to enter the hacker mindset. There are some things you can do when you're not at a computer that seem to help. They're not substitutes for hacking (nothing is) but many hackers do them, and feel that they connect in some basic way with the essence of hacking.
* Learn to write your native language well. Though it's a common stereotype that programmers can't write, a surprising number of hackers (including all the most accomplished ones I know of) are very able writers.
* Read science fiction. Go to science fiction conventions (a good way to meet hackers and proto-hackers).
* Train in a martial-arts form. The kind of mental discipline required for martial arts seems to be similar in important ways to what hackers do. The most popular forms among hackers are definitely Asian empty-hand arts such as Tae Kwon Do, various forms of Karate, Kung Fu, Aikido, or Ju Jitsu. Western fencing and Asian sword arts also have visible followings. In places where it's legal, pistol shooting has been rising in popularity since the late 1990s. The most hackerly martial arts are those which emphasize mental discipline, relaxed awareness, and control, rather than raw strength, athleticism, or physical toughness.
* Study an actual meditation discipline. The perennial favorite among hackers is Zen (importantly, it is possible to benefit from Zen without acquiring a religion or discarding one you already have). Other styles may work as well, but be careful to choose one that doesn't require you to believe crazy things.
* Develop an analytical ear for music. Learn to appreciate peculiar kinds of music. Learn to play some musical instrument well, or how to sing.
* Develop your appreciation of puns and wordplay.
Specially at Microsoft, technology names change and some times they change often, I've seen quite a few blogs named after MS technologies that later change the name, some recent examples include Windows Vista and PowerShell
You can't know it all. No matter how smart you are, no matter how comprehensive your education, no matter how wide ranging your experience, there is simply no way to acquire all the wisdom you need to make your business thrive.Donald Trump - Learning - Business - Knowledge
In the programming world we hear this more and more often, frameworks have thousands of classes, functions and features, even the people behind those frameworks don't know other parts of the framework, what makes you think you can know it all
It's key to be comfortable with your own ignorance. Understand that you can't know it all and stop trying to or pretending that you do. Understand that other people are ignorant too, and help educate them when you can rather than resenting their shortfall. On the same track, don't resent someone who's trying to teach you something either, swallow your pride and better yourself for it.
The Critical Path / eMail Newsletter / Issue 6.1
My approach to this issue is to learn the language features as good as I can, then on the features of the frameworks I make a distinction on technologies that I'm interested in learning right now and learn them, and as many others that might be useful at some point, but the point is to be aware that such features exist and what they do; that way when you actually need them you can find them a lot faster because you know there is something to do just that and you avoid reinventing the wheel in many cases
services like del.icio.us can help you with this problem, if you see something cool that you might be interested in the future you can save a link and tag it with something like "future" and you can build a list of things to learn or that you can posibly use some time later
You can't put everything in your brain, so use the existing tools to do some of that work for you
Is just like in soccer, is always good to win, but if you can't win is good to tie, if you can't tie is good to lose for as little difference as possible

One of those things that not many people know, most modern browsers these days allow multiple home pages.
Firefox/Flock

Internet Explorer

Opera also allows you to do it, quite a bit more complicated, but can be done
Multiple home pages in OperaI use 5 different browsers approximately as:
70% - Flock - This is like a Firefox on steroids (actually based on the Firefox engine), allows me to blog from it, integrates with flickr, etc, Any firefox extension that I use, I load on this browser
10% - Firefox - I use this browser pretty much clean of all extensions, when I want to load a site and leave it running on the background I use this browser.
10% - Internet Explorer 7 - Beta 3 at this point, so far I like it a lot, but there are a bunch of sites that just refuse to work with it, once it becomes a release version I'm sure I'll use it more
5% - Internet Explorer 6 - On the other hand, there are some sites that only look good or only allow Internet Explorer 6, I use this browser for IE specific sites and/or sites that I trust (e.g. intranet)
5% - Opera - Since out of my list of browsers, this is the least used, this kinda gives me more "protection" when I'm visiting sites that I don't trust that much (e.g. sites about hacking)
SqlConnectionStringBuilder Class Note: This class is new in the .NET Framework version 2.0.Provides a simple way to create and manage the contents of connection strings used by the SqlConnection class
SqlConnectionStringBuilder Class (System.Data.SqlClient)
once you create an instance of that class, you can read/write to the individual items of the connection through properties or through the indexer as:
//you could pass the connection string in the constructor too
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
//using the indexer
builder["DataSource"] = "someDataSource";
//or using the property
builder.DataSource = "someDataSource";
this would be useful in a number of cases, for example if you had two connection strings that were different only by the server name
Those of us in user support had a pet peeve: there was no single place that held all of Google's help information at your fingertips. So we decided to build one -- and now you can visit Google Help to find tips, tricks, and troubleshooting solutions for just about every Google product and service. We don't want you to have to work hard to find anything, so we also added an A-Z guide in case you do know exactly what you're looking for.
Official Google Blog: A roadmap for Google help
technorati tags:google
Just found about this cmd-let that captures all the input/output in Powershell
to start it simply type:
Start-Transcript
it will tell you where the transcript is being stored, by default it creates a text file on your "c:\documents and settings\user\..." folder, but you can specify where you want the transcript to be stored just passing a file name after the cmd-let, you can also pass -append so that if the file exists, it keeps adding to it
To stop it:
Stop-Transcript
technorati tags:PowerShell
For the first time, we're making the MSDN Library freely available for download from Microsoft Downloads. Previously, the Library was only available for download to MSDN subscribers. The current download is the May 2006 Edition and future editions will also be available when we release them.
Rob Caron : Free Download: MSDN Library May 2006 Edition
now this is great news!
CRAZY COMPUTER BUG
Ruby in Steel for Visual Studio 2005Posted by: Regina Lynch on July 25, 2006SapphireSteel Software will be releasing Ruby in Steel, a Ruby add-in allowing developers to take advantage of the Visual Studio IDE. The product will include debugging, Intellisense, code completion, code snippets and support for Rails.With the 1.0 release, both a free personal version and a developer version will be available. The developer version will include more advanced functionality, such as a fast debugger. SapphireSteel is planning to release several beta versions prior to release in order to implement further VS features and fix reported bugs.Ruby in Steel version 0.7 is currently available for download. It includes a Rails New Project Wizard, import capabilities, integrated SQL Server development, automated database setup and syntax error checking.
Ruby in Steel for Visual Studio 2005
check it out
First of all, to get access to a variable from the environment you run:
$env:[variableName]
so, to get the PATH you do:
$env:path
on my machine, I get something like this:
PS C:\> $env:path
C:\oracle\product\10.1.0\Db_1\bin;C:\oracle\product\10.1.0\Db_1\jre\1.4.2\bin\c
lient;C:\oracle\product\10.1.0\Db_1\jre\1.4.2\bin;C:\Oracle\product\10.1.0\Clie
nt_1\bin;C:\Oracle\product\10.1.0\Client_1\jre\1.4.2\bin\client;C:\Oracle\produ
ct\10.1.0\Client_1\jre\1.4.2\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\Syst
em32\Wbem;C:\Program Files\Microsoft SQL Server\80\Tools\BINN;c:\Program Files\
Microsoft SQL Server\90\Tools\binn\;C:\Program Files\QuickTime\QTSystem\;C:\Pro
gram Files\Support Tools\;C:\Program Files\Windows PowerShell\v1.0\
PS C:\>
that's kinda hard to read, so you can use this method instead:
$env:path.Split(';')
PS C:\> $env:path.Split(';')
C:\oracle\product\10.1.0\Db_1\bin
C:\oracle\product\10.1.0\Db_1\jre\1.4.2\bin\client
C:\oracle\product\10.1.0\Db_1\jre\1.4.2\bin
C:\Oracle\product\10.1.0\Client_1\bin
C:\Oracle\product\10.1.0\Client_1\jre\1.4.2\bin\client
C:\Oracle\product\10.1.0\Client_1\jre\1.4.2\bin
C:\WINDOWS\system32
C:\WINDOWS
C:\WINDOWS\System32\Wbem
C:\Program Files\Microsoft SQL Server\80\Tools\BINN
c:\Program Files\Microsoft SQL Server\90\Tools\binn\
C:\Program Files\QuickTime\QTSystem\
C:\Program Files\Support Tools\
C:\Program Files\Windows PowerShell\v1.0\
PS C:\>
ah... much better
what? you need the list on a file?
$env:path.Split(';') > list.txt
technorati tags:microsoft, powershell
I found this document: Microsoft Terminology Translations, via Edgar
the document contains almos 15,000 terms in 47 different languages, so if you speak another language, chances are you'll find it there
This is something I have answered several times to many people, anything from production personnel to network administrators
is quite easy (the yucky using the mouse way)
You go to the control panel, Add or Remove Programs, wait forever for that to populate the list, then go find "Microsoft .NET Framework X.X"
if you want to do it quicker than that, you can use this method instead:
open a folder to:
c:\WINDOWS\Microsoft.NET\Framework\
or whatever the equivalent on your machine is, like
c:\WINNT\Microsoft.NET\Framework\
first of all, if the folder c:\windows\Microsoft.NET doesn't exist, then you don't have any .NET framework version installed
Then, if you do get to that folder, you should see some folders like
v1.0.3705
v1.1.4322
v2.0.50727
That's the version of the .NET framework installed (the first two digits matter the most)
It's also important to note that just because the folders exist there it doesn't mean that version is installed, to make sure you would actually have to go inside the folder and see that it has a ton of files (100+) and about 6-10 folders
for ~95%+ of the cases though, I just type c:\WINDOWS\Microsoft.NET\Framework\v at the "run" window and see what shows up and that works just fine
I’m very pleased to announce that Microsoft has acquired Winternals Software and Sysinternals. Bryce Cogswell and I founded both Winternals and Sysinternals (originally NTInternals) back in 1996 with the goal of developing advanced technologies for Windows. We’ve had an incredible amount of fun over the last ten years working on a wide range of diverse products such as Winternals Administrator’s Pak, Protection Manager, Defrag Manager, and Recovery Manager, and the dozens of Sysinternals tools, including Filemon, Regmon and Process Explorer, that millions of people use every day for systems troubleshooting and management. There’s nothing more satisfying for me than to see our ideas and their implementation have a positive impact.
Mark's Sysinternals Blog: On My Way to Microsoft!
technorati tags:microsoft
Blogged with Flock
While playing with PowerShell I noticed that it has pretty good support for the behavior found in "old" CMD and/or "DOS", all the function keys work just as expected
Now, in case you don't know how to use the function keys in "DOS" here are some pointers:
F1 - will repeat the last command one character at a time, so if your last command was "dir", you will get "d", "i", "r" as you press F1 multiple times
F2 - "Copy up to char" function (of the last entered command): Not used much, it allows you to copy up to the character you enter after pressing F2, e.g.
If you previously entered: dir "program files"
on the next line you could enter: dir [F2]m
and it would complete it as: dir "progra
F3 - repeats the last command
F4 - "delete up to", I can't really remember how to use this one, but is rarely used I guess
F5 - iterate backwards through the list of previously entered commands (same as using the up arrow key)
F6 - ^Z or text file terminator: I can't see how to use this in PS, but if you were entering a text using "copy con [filename]" you can get out of it and save the file by pressing F6, which by the way, PS doesn't have support for "copy con" but supposedly this guy wrote something equivalent to it:
http://tfl09.blogspot.com/2005/10/monad-and-command-console.html
F7 - Provides a list of the previously entered commands and you can select one using the arrow keys
F8 - Iterates in a loop backwards (when it gets to the first one it goes the last one) through the previously entered commands
F9 - "Enter command number": allows you to enter the command number you want to execute, to find out the command numbers you would have to use F7 first
technorati tags:microsoft, powershell, command, compatibility
Blogged with Flock
I have a story of being a keyboard guy and a "command line guy", recently I have been interested in PowerShell; thanks to the secret geek I was encouraged to download it and try a few things, so far I'm loving it!, it's awesome... of course this is definitely not for everyone, specially not for programmers =o(, at least the great mayority of the ones I know don't really like command line stuff, anyway (is not like you are required to be an expert on it, PowerShell is oriented at System Administrators, I just happen to prefer command line when working at a computer, is just so much faster to accomplish things).
I was reading on the secret geek blog about one of the cmd-lets:"Get-PSDrive":
Once Upon A PowerShell i went looking for a cmdLet to display a list of all the current drives.I found one, 'Get-PSDrive' which does exactly that... but i was gobsmacked at what else it revealed!'Power shell drives' are not just your boring old 'C:' etc -- they can be all sorts of hierarchical structures, such a registry keys, environment variables, functions(!) and more.
Babysteps in PowerShell part deux: Variables! Real Proper Variables!
on mi machine it displays something like:
PS C:\> get-psdrive
Name Provider Root
---- -------- ----
A FileSystem A:\
Alias Alias
C FileSystem C:\
cert Certificate \
D FileSystem D:\
E FileSystem E:\
Env Environment
F FileSystem F:\
Function Function
HKCU Registry HKEY_CURRENT_USER
HKLM Registry HKEY_LOCAL_MACHINE
Variable Variable
PS C:\>
notice those Function, HKCU, HKLM and Variable at the end...
you can do a "cd Variable:" then do a "ls" or "dir" and it will list the variables declared, you can do "cd Alias:", then "dir" will list the aliases in the system (alias for the different cmd-lets")
anyway, I was playing with those and for a few seconds I was stuck when I did "cd Alias:", after finding out what was there, I wanted to go back, so I immediatly did "cd ..", didn't work, "cd \", nop... "cd /" nothing... panic!
quite simple actually, we just need "c:" or "cd c:"
(uff, that was close)... and now I have a new category to blog about
technorati tags:powershell, command
This Information Disclosure vulnerability could allow an attacker to bypass ASP.Net security and gain unauthorized access to objects in the Application folders explicitly by name. Note that this vulnerability would not allow an attacker to execute code or to elevate their user rights directly, but it could be used to produce useful information that could be used to try to further compromise the affected system.
public static SingleTon GetObject(){
if(instance == null)
instance = new SingleTon();
++m_nNofReference;
return instance;
}
don't use it, it is not thread safe, you can read this instead if you want to learn about the singleton pattern
technorati tags:google
the point is simple:
.9 (repeating) = 1
not just close to 1... it is 1, if you don't believe it go check it out
To set multiple startup projects
1. In Solution Explorer, select the solution.
2. On the Project menu, click Properties. The Solution Property Pages Dialog Box opens.
3. Expand the Common Properties node, and click Startup Project.
4. Click Multiple Startup Projects and set the project actions.
How to: Set Multiple Startup Projects
This is more of a note for my self, but I'm sure a lot of people doesn't know about this feature, supposedly even the debugger attaches to the multiple projects, that's really useful when developing multi layered projectstechnorati tags:visual-studio, tips, tricks
this is a little trick I hadn't heard of, some items in the Visual Studio IDE have animation, e.g. when you open/close the properties, solution explorer, etc windows, there is some animation to make the windows appear/dissapear, sure is visually nice, but if you're like me, you don't want little whistles taking up your computer resources, I've seen those animation get quite slow specially when I have my machine loaded with a bunch of other stuff
there is a way to speed up those animations or even disable them completly
in the menu Tools, Options, Environment, General
bump "animation speed" all the way up, or uncheck the "animate environment tools" checkbox to disable this feature
this applies to both VS2003 and VS2005
Yesterday Edgar posted about a little program written by Microsoft to keep track of scores and stuff on the World Cup, and I just noticed that google has created something similar, but right into their web page
nice!
for those of you who can't type fast intellisense lovers
