Wednesday, October 17, 2007

We have been using XLS file for managing localization string in our projects. With some custom macro, we have generated resource files from worksheets (which corresponded to each form in our ASP.NET application). Quite comfortable for translators, but when using in distributed environment with more programmers sharing the work through SVN repos, conflicts often appeared.

So we need to split this Excel workbook into separate files (one for each worksheet), keeping macros intact.

Saving files according to sheets name was quite easy (found it here).

Sub SplitSheets()
Dim W As Worksheet
For Each W In Worksheets
W.SaveAs ActiveWorkbook.PATH & "/" & W.Name
Next W
End Sub

Second problem was removing redundant worksheets from all files. So I have written something like this (must have all files opened).

Sub RemoveSheetsFromWB()
Dim W As Worksheet
Dim B As Workbook

For Each B In Workbooks
For Each W In B.Worksheets
If W.Name & ".xls" <> B.Name Then
Application.DisplayAlerts = False
W.Delete
Application.DisplayAlerts = True
End If
If B.Worksheets.Count = 1 Then Exit For
Next W
Next B
End Sub

Tuesday, September 18, 2007

Back again ... removing LINQ

Sorry for being our for quite a long time, but I broke up with my girlfriend and had too much work.

Last week I was facing a problem - removing Microsoft(r) LINQ from our project's solution. We didn't wanted to use it anymore. After the code was rewritten and all references removed, we still weren't able to load the solution on fresh new computer.

After some digging, I found out, that in our .vbproj files, we still have something like:
<Import Project="$(ProgramFiles)\LINQ Preview
\Misc\Microsoft.VisualBasic.LINQ.targets" />


So I removed this line, the solution was loaded into our VS.NET 2005 (SP 1), but could not compile. Again, after some digging (this line seems quit undocummented), I tried to replace this line with the following one (contained in normal .vbproj files).
<Import Project="$(MSBuildBinPath)
\Microsoft.VisualBasic.targets" />


Ok, finally it worked. But on our old machines after LINQ uninstallation, the WebDev server started to crash (immediately after starting debug mode) with some out of memory exception. Every second try worked. Reinstalling Visual Studio solved this issue(I was amazed that the reinstall of VS took half less time then reinstall of its service pack).

Another problem appeared, when the VS hit a breakpoint - the whole application disappeared, leaving simple message in the Windows event log (sry for czech language):

.NET Runtime version 2.0.50727.832
- Závažná chyba spouštěcího modulu (7A2B8F82) (0)


Unregistering and reregistering the regmon.dll helped:

regsvr32 urlmon
regsvr32 /u urlmon.dll


Sorry for being quite brief today, had to work :).

Sunday, June 24, 2007

Finished my cursors

Today I have finished my first mouse cursor set. I had a little bit more time, so I made version for windows (posted it here) and for X11 and the other systems (posted it here).

So I suppose, that next few days I will look at these sites, whether the users will like it or no. I have tested some preliminary version of these cursors for a few weeks on my notebook and they seems (for me) quite usable. Hour ago I noticed, that they look a bit worse on my CRT (then on my both TFTs), I'll give it a day and see, whether it's a problem or not.

While designing this cursor set I have stated some rules for me. Feel free to comment them on.

1. No colors in cursors - only black, white and shades of gray. I think, that users have on their desktops many various themes, and are using computers for many purposes (incl. computer graphics), so the cursors should be color-neutral (not to change the color feeling of the image).

2. 3D effect (and quite high contrast) will be fine, because it will look like not being a part of the UI (user interface) and the user can notice the cursors position sooner.

3. Minimum of animation - animation can lower users vigilance, so I used animation only when I wanted to attract the user's attention - for "busy" cursors and for "action running in background" cursor.

4. You can be original, but the users should immediately recognize the meaning of the current cursor.

5. Try to test the cursors for a quite long time. Some shapes sooner or later can start to bore you in an unbelievable way.

Project website can be found here.

Thursday, June 21, 2007

ASP.NET GridView Locale Issues

Last month we had strange problems using ASP.NET GridView component (accompanied with ObjectDataSource). String fields were O.K., but when creating or updating double field, exceptions arised.

The problem was, that GridView in this configuration (didn't tried with different type of DataSource), ignored locale settings, so typing numeric values with comma (or dash if you want) instead of period (point) produced exception. Using period caused this problem (when editing stored values, which where in business automatically converted to commas) also.

One quick solution was to switch the whole thread to the US locale, but that later caused some interferences with different parts of the code.

Luckily, I have somewhere (sorry, couldn't remember where) found the way to customize the conversion of data in GridView. It goes as follows (in VB.NET):

Simply create an ItemInserting event handler for the GridView and for all problematic values make the conversion as you need.


Protected Sub GridView_ItemInserting
(ByVal sender As Object,
ByVal e As System.Web.UI.WebControls.DetailsViewInsertEventArgs
)
Dim myconverter As System.ComponentModel.TypeConverter =
System.ComponentModel.TypeDescriptor.GetConverter(
GetType(Double))

e.Values("FieldName") =
myconverter.ConvertFromString(
CType(e.Values("FieldName"), String))
End Sub


That's all folks.

Wednesday, May 30, 2007

ASP.NET File Upload

Yesterday I had some problems with uploading files in ASP.NET. I've did this maybe thousand times before in PHP, CGI and some other systems, but now, it simply didn't worked.

I have used the classical FileUpload control, selected the file, pushed the button, but after Postback, the Request.Files variable has been entirely clean.

Form encoding was fine, generated HTML code looked ok. After some digging I found the ground of this problem. The FileUpload control has been placed in AJAX Update panel. After clicking the upload button, the panel (not the browser itself) tryied to send this request. And probably didn't knew how to send the file.

Placing the FileUpload outside of the UpdatePanel solved this issue. There is some kind of a workaround in this forum, but I hadn't enough time to test it. Maybe next time.

Sunday, May 20, 2007

RCP Keybinding Issues

Currently I'm developing some RCP application (using Eclipse 3.2 and 3.3M6) and I noticed, that some keyboard shortcuts aren't working well.

By the way - sometimes it seems to me, that there must exists one secret URL containing complete and actual RCP documentation, which every developer - except me - knows.

Back to the problem - we were using older way (deprecated, but still functional) to specify key bindings in plugin.xml

<keyBinding
commandId="yournamespace.command.newempty"
keyConfigurationId="org.eclipse.ui.defaultAcceleratorConfiguration"
keySequence="Ctrl+N" />


It works fine, but not for keys, that are normaly used by RCP (common shortcuts like Ctrl+N, Ctrl+S, etc.). This combinations needs to override (of course, you can implement the corresponding actions, but sometimes you may don't want to do that) the default RCP setting, but how?

The way I found is as follows:
1. Create some context for your app in plugin.xml:

<extension point="org.eclipse.ui.contexts">
<context id="yournamespace.context" name="Default Context"
parentid="org.eclipse.ui.contexts.window"
description="..."></extension>


2. Move problematic keybindings into this context (by specifying contextId in the keyBinding element):

<keyBinding
commandId="yournamespace.command.newempty"
keyConfigurationId="org.eclipse.ui.defaultAcceleratorConfiguration"
contextId="yournamespace.context"
keySequence="Ctrl+N" />


3. Active this context at run-time somewhere in the app init:

PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
public void run() {
((IContextService) PlatformUI.getWorkbench()
.getService(IContextService.class))
.activateContext("yournamespace.context");
}
});


That's all folks. I suppose the command you have specified in commandId already exists (if not, create it). The same stands for action binded to this command.

Actually, not all actions are always specified in plugin.xml, but are created at runtime. Wiring this action (to command and its keybinding) through following methods worked for me.

undoAction.setId("yournamespace.action.undo");
undoAction.setActionDefinitionId("yournamespace.command.undo");
this.getActionBarConfigurer().registerGlobalAction(undoAction);

Hope this post might have helped someone. The presented solution isn't very clean, but functional for me. If you have something better, please feel free to post it here.

Sunday, May 13, 2007

IE Troubles

I don't like Internet Explorer. Nothing special now - if you don't like it, simply don't use it. Right, I'm using Firefox for quite a long time. But sometimes I need IE for a little while (actually I use IE Tab, but that's completely different story).

But IE 6 started to make troubles (and it's really good in that). Every time I launched it, IE disappeared (after showing its main window for a second). So, my first guess was some kind of malware (although using IE only at safe pages and never had this problem with Firefox, just wanted to be sure). Scanned the system with Spybot, but nothing special.

Spent some time googling, again nothing special. Later I found some workaround - started explorer.exe ("This computer"), typed URL there, and the IE launched well.

This worked for a week or two. Finally I decided to update to IE 7. When Microsoft spent so long time developing this thing, it should be better than the old one. Well, IE7 worked for a week or two, then the same problem appeared.

My last solution (for last week or two :)) is as follows:
  1. Go to your Internet Options (Start, Control Panel, Internet Options)
  2. Tab Programs
  3. Button Manage add-ons
  4. Check all add-ons on this page. The one that was causing problems to me was called SSVHelper Class (published by Sun Microsystems, Inc.). So I disabled it and everything is fine since then.

Maybe that your case is slightly different, so you may try disabling all add ons and trying to launch IE. Then enabling one per try you should be able to figure out the "bad one".

Monday, May 7, 2007

Problems with D-Link DI-524

Today I bougth new router D-Link DI-524 (see d-link.de or dlink.com). I'm posting also link to germany website, because there are maybe five revision of this hardware (A to E) and the revision sold in Czech Republic (namely here) is the revision B4. Global website (well, precisely said, the US website) contains info only about the other revisions. So, the latest firmware for rev. B I have found, is here.

First, let me explain, why I wanted to flash the firmware. Because I wanted to lower the antenna transmit power - I have the router next to my computer, near my head and I'm quite sensitive to this waves. Also I don't want my neighbours to try to hack it. The emulator of DI-524, which is available on the D-Link site has this feature. Well, I was quite surprised, when this was the only feature missing in my revision (in comparison to the emulator). So I thougth, that upgrade could make it.

Unfortunately, the actual firmware in my device was 2.04, and the newest on the net is only 2.05b02. And there is no changelog. Well, I tried (with a lot of hope in my hearth) it, but after regular upgrade (everythink went well), the router stopped responding. I could not connect to the webadmin (192.168.0.1), nor ping this ip. Hard or soft reset (holding the reset button down for 10 seconds with or without power on) didn't helped. Interesting thing was, that the inner switch still worked.

The status led flashed very quickly (according to some sites, they say it's the normal - ready - state. According to me, it's some kind of failure. The normal state is, when the led blinks - say - once per second).

I was afraid, that my new D-Link DI-524 is dead. Luckily, I have found this recommendations.
Shortly: If you are having troubles upgrading your firmware (crashed router or st.), try this:
  1. Connect your PC through LAN to your router (only your PC, nothing else).
  2. On your PC, set IP adress 192.168.123.253 (thx Borge for correcting this typo), mask 255.255.255.0, Gateway and DNS to 192.168.123.254
  3. Reboot your PC (maybe optional)
  4. Use the flash utility (can be downloaded bundled with the firmware from forementioned sites) to force some version of firmware (maybe some older one) to your router
  5. Wait for some while, until upgrade process finishies
  6. Disconnect your router from power source for a minute
  7. Reboot your PC (maybe optional)

Yipee! This worked for me. On the second try, also the newer firmware (2.05) worked.

But, the transmit rate settings was still missing. Then I googled this.

It seems, that the router has some secret settings (or I missed something :)), where you can find some useful things. There are many I don't understand at all, bud there ore some I know. Yes, including the antenna transmit rate. The pages with settings can be found under following URLs (replace the IP address with yours)

http://192.168.0.1/wlape.htm
http://192.168.0.1/extra.htm
http://192.168.0.1/rtab.htm

I have used the first one and lowered the antenna transmit power to 13%. Saved, rebooted, everything went ok. According to my girlfriends notebook (and my subjective feelings) it realy worked.

Sorry for my english, and don't forget - everything you get here, is without any warranty or liability ;). Do it on your risk.

Be welcomed

Wow, this is my first blog post ever. Well, sorry for my english.

I'm planning to use this blog mainly as a storage for those little IT problems (and some nifty solutions, I hope) I meet sometimes in my life. So, don't be frustrated if there will be only a few posts per month. We'll see.

Maybe you know this situation - some ugly HW/SW makes troubles. You're trying to solve it. Then you spend a few hours on it and then ... yupii, the solution is here. Half a year later, the problem is back and you cannot recall yourself, what have you done. So I hope, that if I write the solution down to this blog, I will be able to find it a reuse it. I'll be glad, if this blog will be useful to someone else.

Also, please feel free to post any comments. So, be welcomed and ... sorry for my english.