Showing posts with label computer. Show all posts
Showing posts with label computer. Show all posts

Sep 30, 2022

A small C# 10 programming puzzle.

Leia este post em português

Lire cet post en Français.

Are you a developer using C# in a day to day basis? Are you following the latest development, mainly in the C# 10 version? Are you interested in puzzles? 

If so, given the following program, can you, changing only the  type of the parameter msg in Foo() method,  change the output of the program to print only the lines containing even numbers?

I.e printing:

instead of:

Summarizing, the rules are:

  1. You cannot change Foo's  implementation in any way other than changing its msg parameter type.
  2. You cannot change the implementation of the for loop in any ways.
  3. You cannot rely on IL post-processing in any way (but it would be a nice exercise 😃)
  4. Any other changes to the source are acceptable

Some tips, in case you don't know the answer yet:

  1. The solution for the proposed challenge (at least the one I am interested) depends on a C# feature that has been improved in version 10
  2. Inspect the source with attention and look for suspicious code, they do contain some clues on how to achieve your goal.

In the next posts I'll show, and discuss, my solution to that. I am curious to see what other solutions exists.

Have fun!

Adriano

Mar 11, 2016

Showing mercurial current branch in ConEmu prompt

As a long time git user, I had a relatively hard time when I started using mercurial CVS; one of the things that I really missed (this one goes to the list of annoyances) was the lack of support for showing the current branch in the console. In the following screenshot you can see that GIT console does show me the current branch (in the example, ofx)


Considering that I have a terrible memory and usually have at least 5 ~ 6 consoles open at any given time, it is not hard to conclude that, from time to time, I simply forget which is the current branch in each console. 

Since mercurial do not provide any help (other than keeping issuing hg branch command all the time ;), it happened, not once, but many times, that I found myself working in one console under the assumption that I was operating on branch Foo when in fact I was working in a completely different one.

Some days ago I had the idea of using mercurial hooks to detect when I am changing branches and setting the console prompt accordingly, but that did not worked out very well. To be fair, mercurial hooks worked as expected; the problem was that my hook was run by hg.exe process which itself is spawned from the console when one type, for instance, hg up -r Foo to change to branch Foo and this process (hg.exe) would need to change the PROMPT of its parent console, which is not allowed (at least AFAIK).

My next step was check whether ConEmu (it is not a secret that I'm in love with ConEmu ;))  had some support to achieve my goal and bingo! ConEmu support some extended ANSI codes, more specifically $E ] 9 ; 7 ; ”cmd“$E\  which allows one to execute the command specified in the string (cmd) and use its output as part of the PROMP string. 

With that information, I just created the following batch file:

@echo off
IF NOT EXIST .hg GOTO NOT_A_MERCURIAL_REPO
hg branch
GOTO END

:NOT_A_MERCURIAL_REPO
@echo !repo
:END

and set the PROMP to:

SET PROMPT=$E[32m$E]9;8;"USERNAME"$E\@$E]9;8;"COMPUTERNAME"$E\$S$E[1D$S$E[92m$P$E[90m$E[38;5;14m $Q$G $E]9;7;"path_to_above.bat"$E\$E[90m$G$E[m$S

and voalá!



In the picture above you can see that when the current directory is not a mercurial repository the string "!repo" is shown (I'll probably change that later and in this case will show nothing); also, as soon as I initialized a local repository the PROMPT changed to indicate that I was in the default branch. 

Now, the only missing bit was to configure ConEmu to automatically set that prompt when it creates a new console, which can be done by specifying a custom batch file (in my case I created a file named ConEmuInit.cmd):




Basically I copied the original file (that can be found in "%ConEmuBaseDir%\CmdInit.cmd") and change it accordingly.

Now I am happier ;) The changes of making mistakes are small now :)

Edit:
If you are using CONEMU  Build 160609 or newer you'll need to include you bath in a white list in order to CONEMU to run it:



EDIT (06/Feb/2018)
The path set above is case sensitive! (I've spent 3 hours hunting ghosts) i.e, if you use D:\utils\branch.bat in the PROMPT variable, adding d:\utils\branch.bat will not work.
 
Happy coding

Leia este post em Português!

May 24, 2014

Useful utility: doskey

Leia este post em Português

If you use the Windows console in your everyday tasks you probably is a very sad person :)

Let me explain, you should move to a better console ;) And we have a couple of options (as I stated here).

But this is not the focus of this post. My point is, if you rely on a console on Windows (whenever cmd.exe, ConEmu, whatever) and you want to be able to create aliases to applications you can use a built in command (at least on Windows 7 / 8) called doskey (you can find it in %windir%\System32\doskey.exe) (it probably exists on all Windows versions all way down to Windows 3.0 and even to DOS 4.2 - I remember using it on such OSs :).

For instance, if you want to make it more convenient to open a text file in Sublime (or any other text editor) type the following command at your console (replacing the path to sublime executable with the path to your text editor:
doskey subl = "%ProgramFiles%\Sublime Text 2\sublime_text.exe" $* 
and from now on, on that console, you can simply type:
subl my-text-file.ext
and your file will open in Sublime!

Hope you find this info useful.

Happy coding.

Feb 26, 2014

Useful command line utility: Clip

Are you a heavy Windows console user? Have you ever copied the output from a program to the clipboard by using the context menu? Well, are you aware of clip.exe that comes with Windows (at least it is present on Windows 7 and newer) ? 

It simply copy whatever it gets from the standard input to the clipboard! So you can do things like:


c:\temp>dir | clip

And get the contents of dir output to the clipboard (and of course, now you can past it wherever you want)!

Of course you can also redirect the standard input:
c:\temp>clip < file.txt

Happy coding!

(this post in portuguese)

Sep 17, 2013

Useful utility: ConEmu

Have you ever used cmd.exe (a.k.a Windows Console)? In my day to day tasks usually I have from 2 ~ 3 consoles open, which brings me to this post.

Lets be fair: Anyone that has used any *nix based shell (bash comes to my mind), usually considers (seriously) moving to Linux or some *nix based OS ;)

Even though I do recommend using a different OS, such a radical change is not required all you want is a better experience when using a console; on Windows, there are some alternatives to cmd.exe; for instance, I have used console2 for some time and recently I switched to ConEmu (mostly because it has been updated more frequently); in any case I do recommend you to take the time to check both to see which one you adapt better, if any :).

Since I started using such console replacements I don't miss cmd.exe even for a second ;)

(Este post em Português)


Happy coding.

Aug 3, 2013

Interesting tricks with value types in .Net

A while back I was pairing with a team mate hunting a memory allocation that should not be happing (it was not a leak but it was in a method called thousands of times per second and we do believed it was not required (or at least we should try to avoid it at all costs).

After some code inspection we nailed it down to a foreach loop, something as simple as:

var list = new List<int>();

// the code bellow allocates memory. 
foreach(var item in list)
{
}
Interestingly enough, when compiled against C# 3.5 / 4.0 compilers we could not reproduce this behavior; it was only when compiling on Mono 2.6 (on mono 2.10 it didn't happened).

After some investigation (and head banging) we found the issue; for reasons that I'll not explain here (basically to avoid gc allocations) the enumerator returned by List is a value type but it happens that in order to fulfill the foreach contract it also implements IDisposable. On .Net (at least on 3.5) it happens that the compiler completely avoids boxing this enumerator but when compiled with gmcs (the mono cs compiler) 2.6.5.0 a box gets generated for the code that calls IDisposable.Dispose()! (see the code bellow):

finally
{
     IL_0048: ldloc.2
     IL_0049: box valuetype [mscorlib]System.Collections.Generic.List`1/Enumerator< int32>
     IL_004e: callvirt instance void [mscorlib]System.IDisposable::Dispose()
     IL_0053: endfinally
}
Well, it happens that MS C# compiler (and newer mono ones also) emit different IL for that finally block:
finally
{
     IL_004b: ldloca.s 3
     IL_004d: constrained. valuetype [mscorlib]System.Collections.Generic.List`1/Enumerator< int32>
     IL_0053: callvirt instance void [mscorlib]System.IDisposable::Dispose()
     IL_0058: nop
     IL_0059: endfinally
}
See, no box instruction. Instead of boxing, the compiler loads the value type address and then asks the runtime to handle that address as a reference to IDisposable.

Really interesting (at least IMHO)

Happy codding!

Aug 2, 2013

Getting Windows 8 on a Macbook Pro

I am typing this post on a new, shine Mac Book Pro with a retina display, a big SSD and lots of memory ;)

But instead of using Mac OS I decided to go through the bootcamp route and install Windows 8 (sorry, I cant't code in C# without Resharper anymore :)

Well, since this solution is an official solution (from Apple) I expected everything to go really smoothly and without any major issues (other than the Windows 8 ones... :). This was my first disappointment with Apple; first I tried 3 different flash disks (pendrive) but bootcamp just hangs without any information why (no one can blame Windows for this ;). Some times it just said "an error occurred while copying windows files to the flash disk" (or something like that). 

I even tried 2 different external hard drives with the same outcome. In the end I decide to do it the way the "pros" does, i.e, I manually created a bootable flash drive using a Windows 8 x64 image, used bootcamp to install it (but not to install the drivers) and as soon as Windows booted after the installation finished I downloaded and installed the bootcamp drivers manually.

Finally I had an working machine (hey, it is really fast) (moving from an old Q9400  to a new I7 machine makes a huge difference) and was happy... until trying to close the notebook lid (expecting to put Windows to a good sleep) and noticing it just turned the computer off. 

While googling trying to understand what went wrong I realized this is a relatively common issue with this setup (at least lots of people was asking similar questions in various online forums); the problem is that it looks like some device driver don't support sleeping. You can confirm this by running the following command in the command line:

powercfg -a

In my case I just got this:

The following sleep states are available on this system:
    Hibernate
    Fast Startup

The following sleep states are not available on this system:
    Standby (S1)
The system firmware does not support this standby state.

    Standby (S2)
The system firmware does not support this standby state.

    Standby (S3)
The system firmware does not support this standby state.

    Standby (Connected)
The system firmware does not support this standby state.

    Hybrid Sleep
Standby (S3) is not available.

Notice the line saying the system do not support S3 sleep state; this is exactly the state the machine should enter when its lid is closed.. 

Later I found this joy in a FAQ on Apple site:


23. My Macintosh running Windows 7 or 8 does not sleep when a Thunderbolt device is plugged in.  Is this normal?
Yes. Sleep is disabled in Windows 7 or 8 while a Thunderbolt device is plugged in.
Well done! Anyway, it looks like I do have an workaround; do not use thunderbolt devices. I'll try.

What do you think?

May 7, 2013

Once again

Hi

Well, I have been busy lately but I can't refrain myself from posting this; recently I have got tons of phishing emails claiming they are from local banks. In most of those financial institutions I'm not even a customer! Anyway, it doesn't hurt to try :)

Bellow you can see the original message, but pay attention to the email sender (xxxhrs@webxc31s05 and goes on). They don't even bothered to use something more realistic. There is only a single link at the bottom of the page pointing basically to www.djentachi.kz which definitively does not sound as a valid web address for this bank :)


The bottom line: as always be careful with everything coming into your email box.

Adriano

Mar 8, 2013

SSH: using specific keys with specific hosts

First of all, I have never thought I'd post something Unix related (not that I have anything against it; it just because I am more a Windows user :)

It just happens that for personal reasons I have some VMs running Ubuntu and from time to time I need to transfer files from my host computer to the guest, i.e, from my Windows machine to Ubuntu running on the VM. Since the virtualization solution I am using has some issues regarding file/folder sharing between host/guest OS, I am using scp to do the job.

Until today I used to have a single RSA key pair to authenticate me when connecting to my Ubuntu VM and also to github and bitbucket but this has proven to no be an optimal solution. You see, when I am copying files to Ubuntu I'd like to not be forced to type any password, after all this VM has no sensitive data and is off limits since it is not connected to the internet, but since I am using a single RSA key pair for most of my authentication  needs I don't want do leave it unprotected so every time I want to copy something to the guest OS (my Ubuntu running on the VM) I find myself typing a huge, complicated password - actually very often mistyping it :(.


Today I took the time and decided I'd find out how to setup multiple RSA key pairs and use one with no password at all to authenticate me with my VM and one with a strong password for each online service I use.


Actually it was easier than I thought ;). Basically the utilities I rely on (ssh and scp) allows one to specify which identity file (the RSA file containing your private key) (-i file_path) is to be used.


if you don't want to specify which file should be used every time or if the utility you use don't allow you to specify this file (but uses ssh behind the scenes) you can use ~/.ssh/config file!

Happy codding.

May 9, 2012

Free (open source) RAM disk for Windows (x86 / x64)

Hi


Have you ever had the need to perform some I/O intensive operation on a relative small set of files? I do, usually when I need to compile some application.

In order to speed up this operation I've recurred to the so called "RAM Disks", applications that takes part of your computer's main memory and pretends that it is an actual disk. As you can imagine read/write/etc (I/O) operations against this virtual disk are much faster than operations against your actual hard disks (be it a traditional magnetic HD or a shine new SSD).

In the past 3 years I've used at least 3 different solutions and was happy with none. My main complain is that most of them were not capable (or it was really clumsy/hard to accomplish) of creating RAM disks dynamically, i.e, one is required to create it at OS start up time. Since my needs are dynamic (I may need more disk space at some points in time during the day) it is really hard to come up with a disk size that work for me: choose a to big disk and I am wasting precious RAM space; create a disk that's to small and I may find myself facing "out of disk space" errors (then cleaning up some junk and restarting my build tasks).

Fortunately some time ago I stumbled upon a RAM disk implementation that allows me to mount and unmount disks dynamically! Since then my work flow has been much more smooth ;) The not so good side is that it is not very easy for the "not computer savvy" user.

Bottom line is: if you need a stable and flexible (but maybe not so easy to start with) RAM disk solution you can't go wrong with this one.







Mar 30, 2011

Do as I say, not as I do

It has been a long time since my last post ...


As usual I have been busy taking care of my kids (if you have two kids you have an idea how much time they require :)), studying, playing with may pet projects and what not.


But something happened and motivated me to stay late and to write this post. To make a long history short, yesterday night I was working on one of my pet projects, binboo (basically a skype plugin that I and other team mates use to add/update issues on our bug tracker) and I spot some code that looked pretty useless to me.


Since I have unit tests (yeah, some of you would argue that strictly speeking they are not unit tests, but anyway, I have automated tests in place) I was not scared of changing the code, so in the next step I just removed the "dead" code running the tests after that. To my happiness, I saw only green in the unit test runner screen. 
Perfect, I though, proud of myself.
After that I just committed my changes and went (happy) to bed only to be embarrassed in our meeting today with an ugly, idiot, ridiculous bug in the exact same code I have touched yesterday. It became clear to me that my unit test coverage can be improved.


After my normal work day I just loaded the project in VS to look at the specific test case that should have failed due to my change but, to my surprise, I had no test case for this particular scenario. Hum... stupid developer.


Lesson learned, I have written a test case before reverting the changes (and of course, I'll study the code to understand why it is required after all).


Ok, let me get back to my other pet projects.


Have fun!


Adriano

Jun 10, 2009

How to not ask for help on online forums


Hi.

Well, you know, being a software developer automatically entitles you as your "family IT manager"; there's nothing we can do about it:). That's the way life is.
But if you are involved with an open source project chances are that you participate in that community either asking or answering questions (or both) in project's forums, mailing lists, etc. In the following lines I want to present some points I believe may make the difference between getting an effective answer or getting your question forgotten in some dirty corner in the internet.
  • Screaming for "help" like the good girls on movies is not effective.

  • Don't expect people to do your work. Don't get me wrong, but how many times, for whatever reason, we just cry for help without even trying to figure the problem out first?

  • A simple search in the internet before asking will at least allow you to be more precise or even eliminate the need to ask at all (chances are that someone else already faced the same problem/doubt we are facing). In the open source world there are lots of different places we can look for more information, for instance:
    • Project forums
    • Bug tracker / Issue system
    • Mailing lists
    • Source code (why not :)
    • etc.

  • Focus on what you are trying to achieve not in the problem: consider the possibility that you may be attacking the wrong problem.

  • Provide as much context as possible:
    • Calling your mechanic and saying: "You know what? may car isn't working" is a little bit vague and won't be that helpful. Probably saying: "I turn on the ignition but nothing happens" would be a little bit better (but not that much); providing more information, something like: "I checked it out and I can see that I am not out of gas; also I can see that the battery looks to be ok, but when I try to start the engine nothing happens other than the indication lights turning on" would be much better. I think that you got the idea :)

    • Environment (software version, etc)

    • If you have a stack trace, please, don't hide it from your buddy.

  • Be friendly (in general people is earning nothing, other than personal satisfaction, by helping you). Above anything, don't behave as if the person trying to help you had the obligation to provide you an answer/fix.

  • Reproducible behavior is a lot easier to debug / fix, so, if possible, prepare the smallest test case that triggers the problem. Even better, if you really want to rise the chances of people helping you, use the same test framework used in the project.
I do believe these "principles" apply equally well whenever you are about to submit a new bug/issue report to your favorite project bug/issue track system. I mean, I doubt that filling such systems with duplicated and/or misleading, inconsistent, etc. entries will help anyone in making a better project. 
So, next time we fell compelled to ask for help let's refrain ourselves and first try a little bit harder; I am a fierce believer that this is the best way to learn (trying to fix it ourselves instead of just asking); as a side benefit we'll not disturb other developers letting them to use their time to improve the project  instead of scanning / answering questions that was already answered before.

Last but not least, I don't want to give the false impression that I am against asking for help; I just think that we ought to keep this approach as our last resort, i.e, to situations where it's really not possible to figure out the problem alone (for instance, when a specific behavior/API/whatever is not documented and no information can be found, at least not easily found).

Of course this is not an exhaustive list, so, feel free to comment :)  

Best regards (and lets have fun !)

Adriano

Jan 7, 2009

First impressions of Windows 7

Hi,

As a computer addicted I decided to download Windows 7 Beta 1 (32 bits) and give it a try (if you are interested, just search for "Windows 7 Beta1" in your favorite search engine and I am sure you'll find your way :)

In this post I want to present my first impressions about it. Please, note that I am not an expert in this subject and also that this is just my opinion based on my perception without any pretension regarding "data" accuracy.



I need to admit that I am impressed about it. My first impression is that it is way faster than Vista when running on the same machine; at least it is pretty responsive. Bellow you can find a list of items that caught  my attention and won my respect (at least for now):



  • Fast Installation: ~ 20 min for a full install.

  • Few prompts during installation.

  • No problems with device drivers at all (Video, audio, keyboard, etc)
    • Some devices already have preliminary versions for Windows 7
      I guess that this is more a result of not introducing deeper changes to the driver model (Vista introduced really deep changes there).

  • There are some compatible antivirus already.

  • Looks really fast on a relatively old hardware

  • I really liked the UI changes (even being minor changes).
     
  • Just a few UAC prompts
    • Using it for some time I have seem UAC prompts only for software installation.

  • IE 8 is not as fast as I'd like it to be. (But I've already installed firefox)
 Bellow you can see a screen shot.


Well, that's it for now.


Adriano

Oct 22, 2008

Never give up

At least this seems to be the main approach of hackers.

In the last couple weeks I received at least 7 messages from the same sender, with the exact same contents:


It's in portuguese (at least) and says something like: "Hey dude, here are the photos!".

What photos? I don't remember asking any friend called "gabriel" to send me any photo ;) even more with supposedly annexed photos linked to files like "fotos_237.com" on a very suspicious server (at least the guy wrote my name correctly)! No thanks !!!


In this same time range I got other "phishing" emails like:


Another email in Portuguese, pretending to be from hotmail trying to foolish me to get in panic and click on a link. 



This one (also in portuguese) is supposedly a "Virtual Card" from a girl named "Carla". It even includes a "copyright" notice in the end of the email.

Well, maybe may mommy would be tempted to clink on these links but not me. Anyway, this kind of threat is getting more sophisticated as time passes so pay attention where you put your mouse :).


Best.


Adriano

Oct 5, 2008

Back to Vista x64

Hi,

Some time ago (sometime around 10/2006) I installed Windows Vista (a release candidate at that time) on my home machine in order to "try" it (to be sincere I've installed various Vista beta/release candidates).

Performance was not impressive but since I'm a software developer (and I didn't used the machine to work anyway) I decided that it worths to be able to experiment with new API / functionality so I kept it.

Some time after that it was released so I got a copy and installed in the same machine.

On 10/2007 I joined db4o and started to work from my home which means that my machine now plays an important role in my development productivity and I decided that I'd rather go with Windows XP (x86 or 32 bits) again (due to the performance impacts I got with Vista x64).

Well, one year passed and I got a new machine (a pretty fast one, lets say) and so I decided to give Vista x64 a try again.

In the first days I do got some BSODs (which made me feel frustrated) but after spending some time searching I found some suggestions regarding memory configurations; after applying such changes (I just set the times after memory manufacturer specifications and increased memory voltage by 0,1 volts) it became stable (no BSOD since them). 


I can say that I'm satisfied up to now; no hardware or software conflicts, performance is pretty good (much faster than my previous machine running Windows XP - I know, XP would run even faster on this machine).

See you.


Adriano

Sep 10, 2008

Here we come again :) - Part III - The end

Well, after some time researching and comparing prices I've ordered my new toy with the following configuration :
ComponentDetail
MotherboardGIGABYTE GA-EP45-DS3R
ProcessorINTEL Core 2 Quad Q3300 2.66GHz 12MB 1.333MHz
Memoty8 Gb - OCZ DDR2 800
CoolerCooler Master Vortex
Power550W - Corsair
KeyboardMicrosoft Wireless Desktop 2000
Video CardGeforce XFX 9600GSO 384MB
HD750GB Samsung
I do hope that this machine can keep up with my needs ;) Also, I ordered a really big
(at least for my standards) monitor .... Now I need to wait more or less one week to put my hands on this and starting installing (probably Windows Vista x64 and some Linux x64 distro also). OMG, I am to anxious! Adriano

Aug 11, 2008

Extracting files from a MSI file.

Today I was looking for a way to extract files from a msi installation package when I found a blog just explaining how to do it:

msiexec /a filepath to MSI file /qb TARGETDIR=filepath to target folder
Despite the original blog title it does work with XP :) Adriano

Aug 4, 2008

Here we come again :) - Part II

Just a little bit more information on my new toy (the one I am planning to get)
ComponentDetail
MotherboardGIGABYTE GA-EP45-DS3R
ProcessorINTEL Core 2 Quad Q9450 2.66GHz 12MB 1.333MHz
Memoty8 Gb - G.SKILL DDR2 800
CoolerARCTIC COOLING Freezer 7 Pro
Power550W - Seventeam
KeyboardMicrosoft Wireless Desktop 2000 Optico
Video CardGeforce XFX 8600GT 256MB
HD750GB SEAGATE
Even not being the fastest possible configuration it is a pretty good one :) Why did I need such a beast: Well, working as a software developer sometimes I find myself running Eclipse, Visual Studio as well a guest OS within Virtualbox (running VS and some other programs there also ;). So I do believe (I'm not a expert in hardware) that a 4 core processor will be helpful; in the same way, 8 GB of memory doesn't seem that much :) I considered to get a WD Raptor but it's too expansive here; also, I'll install 2 other HDs (that are sitting in my current machine) so I'll get some performance gains due to a more distributed load. Do you have a raid 0 configuration? How does it perform? Is it reliable?
Right now I am considering to build a Raid 0 array also but I'm not sure. My past experience wih Raid 0 was not so good. Adriano

Aug 1, 2008

Here we come again :)

For some time now, my computer started to give me signs that its time is coming. It's a pity since it is only 2 years old and has a not so bad configuration. For me, it's always a dichotomy between a pain and a pleasure when I need to figure out a new configuration. Should I go for a brand computer or should I build it myself? Should I by the latest/fastest/expansive(est) :) processor/memory/whatever (in a useless try to protect my investment) or should I stick to more affordable parts? Please, keep in mind that I live in Brasil and here computers are not so cheap as in some other places. Anyway, just for fun, I am dumping all my previous computer's configuration along side my wishes for the new one:
Year Processor Freq. # Core RAM Hard Disk Graphics Card Internet
1989 6502 0,75 Mhz 1 256 Kb NA OnBoard NA
1992 Ciryx 486 DLC 40 Mhz 1 4 Mb 100 Mb Trident NA
1996 Pentium 100 100 Mhz 1 16 Mb 1.0 Gb ? 28 Kbps
1999 Athlon 400 400 Mhz 1 128 Mb 30 Gb 4 Mb 56 Kbps
2002 Athlon XP 2.1 1.8 Ghz 1 512 Mb 60 Gb AGP 64Mb 350 Kbps
2006 Athlon 64 3.8 X2 2.0 Ghz 2 2.0 Gb 370 Gb PCI-X 256Mb 2.0 Mbps
2008? Core 2 Quad 9XXXX > 2.50 Ghz 4 8.0 Gb 500 Gb PCI-X 256Mb 6.0 Mbps
Well, what can I say? Current PC, RIP :) What do you think? Adriano

Jul 23, 2008

My mind is about to blow

Hi. That computer technology evolves day by day and the amount of information in this area is gigantic many of you already know (so do I), but today I was talking to a friend of mine and I realized how many books I want to ready (only in the subject Windows + .Net). If you are curious you can see the list here but most of them were not published yet (and here you can find a list of some books I've already read / I'm reading). What do you think about them? Is there any other book related to .Net / Windows development you consider a must? PS: Feel free to give some of them as a gift when they get published :) Adriano