
Back to Blog index.
As an author, I'm naturally interested in the ventures of the publication companies that run the magazines I write to. As such, you might recall my earlier blog post late last year, that Pinnacle Publishing merged two of their Visual Studio / Visual Basic magazines into one, and at the same time, they changed the editor, my main contact for the magazine.
Of course, things change over time, but when I was yesterday contacting the new editor, I learned that Pinnacle Publishing has been sold to Eli Journals (formely Element K Journals) in Rochester, NY. This was news to me, since previously Pinnacle was owned by Lawrence Ragan Communications, Inc.
If everything would go as planned, setting up a new WLAN (Wireless LAN) connection at home would required something like simple four steps. Well, if you don't care about security, then it might be so. But if I'm going to set somebody's WLAN connection up, I don't want to leave it unsecured, even if it is a seldomly used home connection.
Now, I needed to setup one such connection few days ago, and the basic setup was pretty simple. But, once I enable security, the connection started to run into problems: the connection simply disconnected every 10 minutes.
As I'm no wireless connection expert (but could say I know at least something about IT), I couldn't immediately figure out the reason. But, since the disconnections were periodic and frequent, it was easy to conclude that some settings had gone wild. And indeed it had.
To fix this problem with the given ZyXel WLAN/DSL modem, I simply needed to go to the properties of the wireless connection in Windows XP, select Advanced properties, and then go to this dialog box tab:

From here, I unchecked the "Enable IEEE 802.1x authentication for this network", and the interruptions and connection failures stopped. And yes, the said connection uses WEP (Wired Equivalent Privacy), but not yet WPA (Wi-Fi Protected Access).
I was browsing the Internet today when I came across Daniel Wischnewski's blog. There's a nice entry about using Delphi 2006 (alias Borland Developer Studio 2006 or BDS 2006) to access .NET 2.0. This can be done by using the DCCIL.exe command-line compiler that ships with Delphi, and by using the --clrversion parameter.
Okay, that's nice, and lets you access the .NET 2.0 libraries, but still, the compiler itself only emits .NET 1.1 code, which means there's no support for generics, Edit & Continue, and so forth. That said, Daniel's post is good in that it raises awareness of this compiler and the said command-line switch, but other than that, I'm more interested in the next version of BDS, i.e. "Highlander".
For some reason, I've ran into two cases with different people that firewalls cause them problems with the FTP protocol. Now, firewalls can be tricky, especially if you don't need to configure them, or you don't exactly understand what ports you need to open and in which direction.
Now, speaking of the port issue, I found a great Microsoft Knowledge Base article (ID 832017) which combines a lot of information about which ports Windows operating systems need. For example, can you easily remember the ports you need to open to get file sharing to work? Or MSMQ? It is all in this document. Good luck!
Windows Live services are taking shape daily, and now Microsoft has announced what Windows Live means for developers, too. See the Microsoft Watch site for details.
Microsoft's strategy is to open "the Windows Live platform to third parties to create a virtuous ecosystem." I'm not sure yet what this will mean from a technical/programming perspective (except that they will be web/HTTP applications), but surely time will tell.
The Finnish Prosessori magazine has my latest programming article. This time, it is about the C programming language and the latest C99 standard, which unfortunately isn't supported that well by compiler makers as they prefer C++.
Today is an important day for Visual Studio, since the first production version of Team Foundation Server (TFS) are now officially available.
I'm excited to see how customers working with larger projects take this product. It might take a few years though, since it is the new process that one has to adapt that takes time to sink in, so to say.
I've spent the last three days in the warmth (comparatively speaking) of Nice, France. It was the Microsoft Connect Event 2006, to which I got an invitation from my local Microsoft D&PE team, Sampo to be precice.
This year, the focus of the event was in security. Thus, we had the chance to attend security related sessions (and some Windows Communication Foundation) and participate in related panel discussions. The most interesting sessions were held by Rafal Lukawiecki and Clemens Vasters.
During my trip, I also had the chance to meet Mika Seitsonen from FCSSovelto, who is also a MVP (Active Directory). Also, I met Chad Hower, who formely worked with the Indy project. He is now employed by Microsoft, which I wasn't aware of until this event. Plus, there was Brian Long from UK, it is always a pleasure to have a chat with him.
It was a nice event overall, so thanks got to Microsoft for arranging the event and letting MVPs and community activists participate.
Dino Esposito is at it again. The topic is Microsoft Windows Workflow Foundation (WWF) and how to use it from Visual Studio 2005 with the proper extensions installed. Recommended reading!
I had today the chance to meet with Jason Vokes from Borland here in Helsinki. Naturally, the subject of the new company ("NewCo" or "DevCo" as Jason would put it) was the most interesting subject we could have at this stage.
To me, the way things are going sounds good. There's a master plan, there's a roadmap and the R&D team members themselves are happy. Of course, it is very early yet to judge, but I guess we will know sooner than later. As always in the IT business, things are moving with rapid speed, so it will interesting to see the end results. But in the mean time, I think all Borland developer tool customer can stay firm with their choice.
In my last post, I promised to show some code that you could use to detect processor features. So here goes.
The Intel x86 ("IA32") processors since Pentium I support the CPUID instruction, which can be used to read processor information. For example, you can use this instruction to detect if your processor supports MMX, SSE, SSE2, SSE3, IA64 or HyperThreading, and most importantly, EMT64, which is Intel's name for 64-bit extensions to their 32-bit Pentium processors. By the way, Microsoft calls EMT64 simply "x64", since they also support AMD's 64-bit extensions that are very similar to EMT64.
Now, I won't be going too much into the details, since you can download a document called the "Intel Processor Identification and the CPUID Instruction" from Intel's developer web site. Instead, I want to show you some example code written with Delphi 2006. You cannot do the same directly from C#, but you could easily write an unmanaged DLL from the Delphi code, and then call that DLL from C#.
Here's my sample application named ShowCPUID:
program ShowCPUID;
{$APPTYPE CONSOLE}
{$OPTIMIZATION OFF}
{$ALIGN 4}
{
Source:
"Intel Processor Identification and the CPUID Instruction"
- Application Note 485, January 2006.
http://developer.intel.com/
}
type
ProcessorInfo = record
MaximumBasicFunction : cardinal;
MaximumExtendedFunction : cardinal;
VendorID : array[0..12] of Char;
Signature : cardinal;
SupportsMMX : boolean;
SupportsSSE : boolean;
SupportsSSE2 : boolean;
SupportsSSE3 : boolean;
SupportsHyperThreading : boolean;
SupportsIA64 : boolean;
SupportsXDBit : boolean;
SupportsEMT64 : boolean;
procedure Clear;
procedure Print;
end;
var
{ globals used by the ReadProcessorInfo function }
MBF,MEF : cardinal;
Sig : cardinal;
A,B,C : cardinal;
FF1,FF2,FF3 : cardinal;
function ReadProcessorInfo : ProcessorInfo; register;
begin
Result.Clear();
{$REGION 'cpuid'}
asm
{ save registers used by the register calling convention }
push eax
push ebx
push ecx
push edx
{ call CPUID }
xor eax,eax
cpuid
mov MBF,eax
{ vendor ID }
mov A,ebx
mov B,edx
mov C,ecx
{ signature & feature flags 1-2 }
mov eax,1
cpuid
mov Sig,eax
mov FF1,edx
mov FF2,ecx
{ extended functions }
mov eax,$8000000
cpuid
mov MEF,eax
{ feature flags 3 }
mov eax,$8000001
cpuid
mov FF3,edx
{ restore }
pop edx
pop ecx
pop ebx
pop eax
end;
{$ENDREGION}
{$REGION 'parse results'}
Result.MaximumBasicFunction := MBF;
Result.MaximumExtendedFunction := MEF;
Result.Signature := Sig;
Result.VendorID[0] := Chr((A and $000000FF) shr 0);
Result.VendorID[1] := Chr((A and $0000FF00) shr 8);
Result.VendorID[2] := Chr((A and $00FF0000) shr 16);
Result.VendorID[3] := Chr((A and $FF000000) shr 24);
Result.VendorID[4] := Chr((B and $000000FF) shr 0);
Result.VendorID[5] := Chr((B and $0000FF00) shr 8);
Result.VendorID[6] := Chr((B and $00FF0000) shr 16);
Result.VendorID[7] := Chr((B and $FF000000) shr 24);
Result.VendorID[8] := Chr((C and $000000FF) shr 0);
Result.VendorID[9] := Chr((C and $0000FF00) shr 8);
Result.VendorID[10] := Chr((C and $00FF0000) shr 16);
Result.VendorID[11] := Chr((C and $FF000000) shr 24);
Result.VendorID[12] := #0;
{$ENDREGION}
{$REGION 'flags'}
Result.SupportsMMX := (FF1 and (1 shl 23)) <> 0;
Result.SupportsSSE := (FF1 and (1 shl 25)) <> 0;
Result.SupportsSSE2 := (FF1 and (1 shl 26)) <> 0;
Result.SupportsSSE3 := (FF2 and (1 shl 0)) <> 0;
Result.SupportsHyperThreading := (FF1 and (1 shl 28)) <> 0;
Result.SupportsIA64 := (FF1 and (1 shl 30)) <> 0;
Result.SupportsXDBit := (FF3 and (1 shl 20)) <> 0;
Result.SupportsEMT64 := (FF3 and (1 shl 29)) <> 0;
{$ENDREGION}
end;
{ ProcessorInfo }
procedure ProcessorInfo.Clear;
begin
MaximumBasicFunction := 0;
MaximumExtendedFunction := $80000000;
VendorID := '';
Signature := 0;
SupportsMMX := False;
SupportsSSE := False;
SupportsSSE2 := False;
SupportsSSE3 := False;
SupportsHyperThreading := False;
SupportsIA64 := False;
SupportsXDBit := False;
SupportsEMT64 := False;
end;
var
PI : ProcessorInfo;
procedure ProcessorInfo.Print;
begin
WriteLn('MaximumBasicFunction = ',MaximumBasicFunction);
WriteLn('MaximumExtendedFunction = ',MaximumExtendedFunction);
WriteLn('VendorID = "',VendorID,'"');
WriteLn('Signature = ',Signature);
WriteLn('SupportsMMX = ',SupportsMMX);
WriteLn('SupportsSSE = ',SupportsSSE);
WriteLn('SupportsSSE2 = ',SupportsSSE2);
WriteLn('SupportsSSE3 = ',SupportsSSE3);
WriteLn('SupportsHyperThreading = ',SupportsHyperThreading);
WriteLn('SupportsIA64 = ',SupportsIA64);
WriteLn('SupportsXDBit = ',SupportsXDBit);
WriteLn('SupportsEMT64 = ',SupportsEMT64);
end;
begin
WriteLn('ShowCPUID application version 1.00.');
Write('Reading processor information...');
PI := ReadProcessorInfo();
WriteLn('');
WriteLn('');
WriteLn('Results');
WriteLn('-------');
PI.Print();
WriteLn('');
Write('Press Enter to exit...');
ReadLn;
end.
If you run this program, it will display something similar to the following:
ShowCPUID application version 1.00. Reading processor information... Results ------- MaximumBasicFunction = 5 MaximumExtendedFunction = 64 VendorID = "GenuineIntel" Signature = 3892 SupportsMMX = TRUE SupportsSSE = TRUE SupportsSSE2 = TRUE SupportsSSE3 = TRUE SupportsHyperThreading = TRUE SupportsIA64 = FALSE SupportsXDBit = FALSE SupportsEMT64 = FALSE Press Enter to exit...
Note that my processor is a Pentium IV, but it unluckily doesn't support EMT64. My bad.
I attended today Microsoft Finland's Technet Pro 2006 event at the Finland Hall. The event gathered about 1300 IT professionals (and some developers) to learn the latest technical information about new operating systems and applications, such as Windows Server 2003 R2, Windows Vista, Office 12, and so on.
To me, the most interesting sessions were about Windows Server 2003 R2 and Vista, and 64-bit processor architectures. I confess I've found difficult all those 64-bit related acronyms such as "x64", "EMT64" and "IA-64", but today I refreshed my memory what they were. The 64-bit extensions in 32-bit processors sounded interesting, so I decided to do a simple application to detect what features are present on a processor. Stay tuned for code.
› Blog Archive