Recently, to save myself sometime after having renamed some interfaces/classes in the ClipFlair project sourcecode, I right-clicked one of the class diagrams (.cd files) in it at Visual Studio’s “Solution Navigator” (this is an enhanced Solution Explorer addon) and using “Open With…” I opened up the diagrams with the XML editor to do a rename-all operation for the respective class names.
However, after saving the project I found out that from then on, that specific .cd file was opening up as XML file when double-clicked instead of opening up as a Class Diagram in the respective designer pane. Using Open With dialog would open it as a Class Diagram when asked to specifically, but using the checkbox to always open up as Class Diagram wouldn’t help fix the double-click problem for that specific .cd file (others would open up fine as class diagrams, not as XML files, when double-clicked).
I just managed to fix that issue by right clicking the file node in solution navigator’s tree and and excluding that file from the project (not deleting!), then saving the project, closing the solution containg the project and adding the file (via “Add existing file”) again after having reopened the solution. I could also possibly have right clicked selected “Unload project” after saving it and then select to reload it again, think that would have worked too.
Using VisualHG addon for Visual Studio I commited the changes to the Mercurial repository used by ClipFlair on Codeplex, which showed me that the file difference that did the fix was the following in the .csproj project file:
<None Include="Diagrams\Windows.cd" />
- <None Include="Diagrams\Windows.Views.Interfaces.cd">
+ <None Include="Diagrams\Windows.Views.Interfaces.cd" />
<None Include="Diagrams\Windows.Views.ViewModels.cd" />
That is instead of that marked-as-bold entry above (marked by the diff tool with – prefix), the line marked with + prefix should be used instead. This is obviously some bug in Visual Studio 2010, it’s nice to know though that you can easily take the project offline and edit the .csproj to fix it (or remove the .cd file, save the project, reload it and add the file again).
Πρόσφατα το Taxisnet έδωσε άτυπη παράταση χρήσης της εφαρμογής περιουσιολογίου για τον έλεγχο και διόρθωση (χωρίς πρόστιμο) των παλαιότερων δηλώσεων E9 (μεταβολών περιουσιακής κατάστασης) για τις ημερομηνίες 1-1-2009, 1-1-2010, 1-1-2011, που κανονικά έληγε τέλος Μαρτίου. Προφανώς όλοι μπήκαν τελευταία στιγμή στο σύστημα και “γονάτισε”. Τα μηνύματα σφάλματος πάντως που έδινε δεν ήταν καθόλου φιλικά στο χρήστη. Δύο παραδείγματα φαίνονται παρακάτω:
Hello Microsoft, can you count? In the image above you can see the Windows 7 taskbar showing THREE (merged) icons/instances of Internet Explorer, although I only have ONE windows open (they seem to use multiple processes internally when you have many tabs, but why should the user care?). More importantly, in the popup shown when left-clicking the pinned Internet Explorer button, you can count 18 entries for open tabs, however in the Internet Explorer window there are many-many more open tabs.
This occurs both in Classic Windows theme and in Aero theme (using Windows 7 Ultimate – a courtesy of Microsoft to active testers of Windows 7 beta) and shows both when you see a list of titles (for many tabs) and when you’d see previews (shown when that bug makes it “THINK” you have few tabs – you might have lots more of course as shown above)
This brings to the surface the bad practice of some Microsoft teams on Microsoft Connect (former Product Feedback Center). They tend to close bug submissions very easily without checking who I the submitter (e.g. a current or former Microsoft MVP like me) and what is their past record of bug submission resolutions in all Microsoft products over the years.
Especially the many open tabs scenario that really makes IE9 crawl to its knees both in performance and usability, which is really sad given the effort Microsoft has spent on it. Not to speak of the many-many favorites (gathered over several years or from many synced machines – e.g via Windows Live Mesh) scenario and the very poorly designed, folder-based Favorites dialog which takes a long-long time to open up and has a miserable scrolling UI with no embedded Search filter.
Speaking of multiple tabs, in Mozilla Firefox you can set an option to remember tabs that were open at last application run so that you can shut down your PC and continue later. With IE9 only if it crashes it suggests to reopen previous tabs at next run, so unless you use the Add Current Tabs to Favorites (Folder) option of the very-very slow (if you have many favs like me) IE9 Favorites tab, you are forced to keep IE9 and your PC running if you want to checkout those multiple tabs you’ve opened, but don’t have the time to do it all in one go.
Ahem, Microsoft Connect says I can’t Connect (sign-in) to it for the moment. The Microsoft bug reporting site probably came upon some bug itself?
Πήγα και εγώ χθες στην εφορία μου κι έλαβα τον κλειδάριθμο για να πιστοποιήσω το λογαριασμό που είχα από παλιότερα (στο παλιό TAXISnet) – έδωσε και νέο password όπως μου ζήτησε και μπήκα να δώ τι καλούδια έχει.
Φαίνεται ενδιαφέρον (απ’ότι κατάλαβα πλέον τα βιβλία θα τα κρατάμε ΜΟΝΟ ηλεκτρονικά), αλλά έχει τα bug-άκια του ακόμη απ’ότι φαίνεται. Παραπάνω φαίνεται ένα “Error 500–Internal Server Error” στο νέο TAXISnet.
Mου χτύπησε όταν πήγα στο “Εφαρμογές φορολ. προφίλ” που σου δείχνει ποιές εφαρμογές υπάρχουν, σε ποιές έχεις πρόσβαση και σε αφήνει να πας σε αυτές από εκεί στα γρήγορα. Το πρόβλημα εμφανίστηκε όταν εκεί διάλεξα “Εφαρμογή Τελών και Ειδικών Φόρων” και πάτησα “Εύρεση” (γιατί άραγε να πρέπει να πατήσω καν το κουμπί και να μην αρκεί να διαλέξω στο dropdown list τι θέλω να δώ;)
If you type
at the Windows 7 command-line (can launch this by searching at Windows Start menu search box for “Command” or by typing cmd there and pressing ENTER), you get in one of the help pages printed out for the batch files’ IF command:
%ERRORLEVEL% will expand into a string representation of
the current value of ERRORLEVEL, provided that there is not already
an environment variable with the name ERRORLEVEL, in which case you
will get its value instead. After running a program, the following
illustrates ERRORLEVEL use:
echo Program had return code 0
echo Program had return code 1
If a program you launched from the batch file returns error code 0 (meaning usually no error), then you jump to label (using “goto” command) answer%ERRORLEVEL% that is answer0 (labels are prefixed with : in DOS/Windows batch files) and it prints out (using echo command) on the console “Program had return code 0”.
Fine till here, but then it will proceed to next commands (the block labeled :answer1) and also print out “Program had return code 1”. Obviously the correct example should be:
echo Program had return code 0
echo Program had return code 1
Could also have a goto finish after the last echo, but its needless since we don’t have :answer2 etc. labels after that and proceeds to finish by itself anyway.
Thinking of this example again, it’s a pretty silly one since one could do instead:
echo Program had return code %ERRORLEVEL%
BTW, to output an empty line to the console you can use echo:
And speaking of batch file tips, you can use :: for comment lines instead of REM command.
500 Internal Server Error
Λυπούμαστε, κάτι δεν πήγε καλά.
Η διευθέτηση του ζητήματος έχει ανατεθεί σε μια άρτια εκπαιδευμένη ομάδα μαϊμούδων.
If you see them, show them this information:
IH6pYV6uW08aEw7RTmh2nctOCLKwYBoSQTT250UKk1Aq9OGTSu0MO16kB8kH IX8I1EZVDq2NHuva2SRpXGL6hG38xdffPCV3YBYJu8LVe1L9r7vz_fQrTavV aEsYIAILDGIATDB2OC78kZeqDUS9jeQzQqBiA6_Q7RDGkivkzT6XcaChvBAI TVWzwDPaNPJV8J7m2aqxgprbkCwzzcIfMD1toWoe4cbls7NqoBvCYAEsfZKD HlQ_3ylykRbFkJfi1HapcCFYJvnFB-6wyNYtgciyVuTEcieOHUq3-6zSAHk9 jzA1y2nndSZdSonvl5QTyCxWlrUzJR-ILxQuCmLI7iJgjl6r6rJCiR0G4ETR 4saaalM-MS2GGaikabqbENBLmtcerB5ZM37s-CgMgfbgxjTDb6__Te4_hveU H0mFIVTykRF3KkJKNTbKnXgzZ8l3OxU1KFiPL3Qsbnk5XADrMx1ThvgRWS-C wANkQ3C7EM0TDm0Xfwl4lVg2tE_eGmdktkmSzIpK3mnzZMUJ5TPhpchuoE_H kSIcV16f_p2phAfJsjbwKs11szwt_HLlEyeH1MUizpvNcrMh8qzDcd2H8siN mtkBjG0NrRjPyh2Cv8VIxfY__LpSJQ5J-V8t7ee9wFgmRrwL0MbzOopueiV_ SccnIpDai8vLFWAnAUr_AsNKKmHMd8BMEb2tiPinyoZUspbc1ad8cmn0_QUm EeXVbx0G3pSdnESz-5zD0gg2xCmtJg3xKIaYSF5rKAGS5nnDLoneX3D5SPoQ aIpRDo_-edF48zLYG5hmI2QSrUKiIuZreHmdw7YELfs5J6JJcWHDXfFTrHaY Irm6IGuf8-P9XmgbaRbSH8Do-p2Q5-Jpr2ZlzcESPusTn2ZG-qu6Ootp3g9n v0tNtWeV9FJN9_BPUNuQUZ8OzFwR3m92UuFQbP91wrhTcf3GI8aO8aQInR0H OjVNyUM_xfy7LVcaZM3wE7Q109fIa0wjoOT5-YgwM39YqFp850lCdCCGQ_6E L_0YPv_J0x9ICvFRS1H00CpkAE4umSnqMgIXNyGQvXLCEyVR-sgNlZmSdgK1 CWSmjq7FQAB2g-6xiBHYpFLCSn3GQiaZDdhBw1hSKpqwcbl-WpjP8Dr9_eiP 52HOndQj2dIYwsyqk7NpFWY7yqneAYApZfr062sC9UggAFfW3f3hW0LalNvp 6gtogSkhpkx_ZgTkbqg3AVZT7VdEJ0cD_MFGBwIQ93HfTJKXVfXvDPPw70H4 WlyvuHFB9x7PR-ZWwftrR_PDsgKL31aVnR5VB328YalCHZbcX6vCv2Sg7X2N mCo1TwAOx0tPf0R85Z0_PjqhkhQp91xEMZlDEHDZ0QAPyDaR1Ud4mnMcKf5v UjMxY0D4HNknezAOa7iUYzySU_dUinT9U9YC1bSSFEcAkDluIi_BP-z8nyzb 2UYfOJrbVa6kFmNbno3cK5xYQk7VxBp2SDTowexy0MVxuCPF9sWye8vkHKXx WoQUgJ8xM7t0-uUfv4OUWVo4NVh7YTUZAbMrnSI1B17nJseXYBO7KeJxARIs ZpmsKLDQgi-OPhdICGl_VQ1u5MW3DWGdKCzplSHJVS_aqHM0hXjHVMOjWhdU 3bbV82b7QLMwzVsain7gq__Xu3ELz9b6LwyIGWuEWHQ_JXRqC28GHNP3DQuE _rBbjRhz2rT8TsCz0-ytw51mwMj8GMDXlPrWe_rIRmGeTZycjdnSMtpMKsAI EHzXZV4it2ueblqufGfNsq85haQgLJ6h7z0OlNgAaUDIlvatUwNZ1bFd8FlG 7p9R5tCv5zHNCZlgm4ckrZnPrLmMoeevZOIpT_DHBc_BDufz377CQIXV296Z f_UKhYgval991AmqBIr6z_Pn_5YBnMW-ab1Ofs_TknLGQRDEw0GIBIjDoYpY oYvVcnS6X16jg4zajlfRJUITSrljGQWjbg0O12acB-P_SzcLZBUo5toKKvqw aXTQO64PXrkqI0qB1olJEJ9dCzwOWvRTy8EUxUpzdUwTcfVsanwyLh4iHbND JNVXUUELdi6-ufbhaRbge7x9KDMywHHayq9E6oQQNQIZ9aU_crS6x0JJDtxQ Vu0Go2XSmQWM1-1o-IkXZDnhqPBJMSYgnePeg5op-q50vPpdUZtYZsuCkytU MX6zEqe5SQU7wRL7xAyCLnMG4q-5oykERg7wYBdbk5GJ6bLtzNof24zBrCMH H-L0pBSrFagcz9HlAvQ2PjmQMOc1Bh-ymOBs9iJt2NyCfcZcG9AOb9KzDto1 VUavWLVDWfcmmxcwOjuQjQwGz2Riqpa-mxCADuFe6ISTv2MJ2dLqMK19Byho 95fo66KT_cLl0jxm70z-NLsunBmlIW5O9zjZv5uySrptMIIFQUOPS2xFBBqT VRrEAg9vpsEYx8h9H2xjOjHVdOpsoCDi4CkSKLmczZ-IMzvx6eajUWuaZMT5 01a-vSK_dis7lHtI_2UWydC_eZN2HGRP-4meXByQ8AupsSoWrz0eUhdIMFSe uQzEPRMOrMJ7yBxobSFYnubs6CRNWwxiV7r6HT_RIjaql6j6wvCBSWtT6Ko3 Gz7hoShAjBRMwNROLUMtFt1VrDbH5VvmZ8UEPNbeY4hyNLIQOWyA3gcgHtZZ Zl3_H72IAed12gK9S_R7zEj7Dxb66vfLUDlE8yK7a50lO4BdOgS4tPZcY9TU cA5iWzHiPVtXcvr9dga8K3dHm6a75vzyfFDU2DcB630PPWBu8IJoGUdVZKRF TrcmQkH4W4rXLT2rixMaNDkLCPIZxHzpo9raSYsLayElyLLeJciCvguqtbfv CpmGFuRYAxoFH49-_LO3vl4DSSGENleRoxAUpAIevoBl4KCpTacEZ9xHLMLw IHFYr1Unj3GWZiAidjQaSFD8Me4uGM7tXbYt_RJUAhFb9O-xmHIrOHgWNhsh icxG8rAH-kkgycoDF5tYlv-4UTsQtkffgWGK8PltToYgDfSfL_b0ah42qg==
Just got bitten by the following:
Dim takeN As Integer = If(Integer.TryParse(EdTake.Text, takeN), takeN, itemsCount)
I had used that instead of writing in 2 lines:
Dim takeN As Integer
If not Integer.TryParse(EdTake.Text, takeN) then takeN = itemsCount
However, there’s an important difference:
“If” is a function, so its arguments are evaluated at call-time. The “If” signature is:
I guess the default is to pass arguments ByVal (by value) and not ByRef (by reference), although I’d expect the signature to specify it explicitly to avoid confusion. When one passes a literal value (say 15) to TruePart or FalsePart it just gets “boxed” into an Object, whereas if one passes an expression (e.g. “takeN+1” or even just “takeN”) it gets evaluated first, then result is boxed and passed as an Object.
So, whereas one might think (esp. if coming from the ALGOL “Call-By-Name” era) the 1st line to be equivalent to:
Dim takeN As Integer
If Integer.TryParse(EdTake.Text, takeN) then takeN = [RESULT OF TRYPARSE] else takeN = itemsCount
in fact it’s equivalent to:
Dim takeN As Integer
If Integer.TryParse(EdTake.Text, takeN) then takeN = [ANY] else takeN = itemsCount
where ANY is whatever the takeN variable one had defined contains.
I thought the VB compiler was warning when using a variable before having assigned a value to it, but it seems in this case it misses to issue a warning. In fact I just tried:
Public ReadOnly Property Take As Integer
Dim takeN As Integer
and it still doesn’t complain. Strange, probably it sets new local variables to 0 by default, but it shouldn’t encourage a programming style that relies on implicit default values – such syntax usually means there’s a mistake in the source code that can lead to a nasty bug.
The moral of the story? Avoid such shorthand expressions and stick to classic keyword-based syntactical structures – after all structured programming had been introduced as an alternative to the many times incomprehensible programs written in functional programming languages (e.g. due to overuse of nested function calls).