Sellest kuidas bindingRedirect tööle saada..

Juhul kui sul on assembly, mille puhul on vaja jõuga määrata, millist versiooni peaks rakendus tarbima (näiteks versiooni 1.0.1.32 asemel 1.0.1.35), siis abiks on kas PolicyFile või bindingRedirect. Viimane siis tähendab lihtsalt config-faili millegi sarnase kirjutamist:

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Uptime.Some.Assembly" publicKeyToken="YourKeyTokenHere" />
        <publisherPolicy apply="no" />
        <bindingRedirect oldVersion="1.0.1.32" newVersion="1.0.1.36" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

Kui versiooni suunamine ei õnnestu, siis põhjuseks võib olla mingi xml nimeruumi konflikt. Vähemalt minul hakkas asi maagiliselt tööle, kui web.config failis eemaldasin nimeruumi configuration tagi tagant. Hinti sain siit.

Sellest et WinFormsi designer seob arendajate käsi-jalgu..

Seoses hiljutise vajadusega Winforms rakenduse UI'd programmeerida, sai pisut komistatud Winformsi piirangute otsa..

VIsual Inheritance on puudustega

Visual inheritance on siis graafiliste elementide pärimine - näiteks kõikide vormide baasvormile logo panemine võiks käia VI kasutades vormide pärimisega, kus esimene vorm sisaldaks ainult logo ja kõik pärivad vormid saaksid õige logo kohe õigesse kohta. Baasvormi muudatused (näiteks logo vahetamine, mõõtmed jms kajastuks automaatselt kõigil vormidel. Ilus näide koodi korduvkasutatavusest ja UI standardiseerimisest. Paraku, nagu selgus, on enamasti kaval VI'd vältida

Visual inheritance töötas kenasti kuni Visual Studio.NET versioonini. Pärast seda ehitati asju niipalju ümber, et kadus tugi konteiner-komponentidele. VI kannab need pärija-vormile küll kenasti üle, aga nende property'd ei saa enam muuta. Control-id, mis seetõttu muutuvad üle VI tarbides kasutuks on näiteks:

  • Panel, FlowLayutPanel, TableLayoutPanel - mis kasu on paneelist designeris, kui sa ei saa sinna midagi sisse panna ?
  • DataGridView - ei mingid Designeris propery'te sättimist.
  • ... (neid on veel).

Käesolevas projektis ma leidsin, et eeltoodu põhjustel polegi mul VI'd vaja. Logo-control'i lohistamine on lollikindlam kui VI kõigi oma lollide piirangutega. Selle asemel võiks ju kasutada tavalist pärimist .. Selgus, et seegi ei ole nii lihtne:

 

Winforms vormid ei saa pärida generic-klassist

Kusjuures pärida tegelikult saab. Kood kompileerub kenasti ja isegi töötab kenasti. Paraku aga kaob sellega ära Designer-vaade ja asendub koleda ja segase veateatega. Kuna töövahenditega kaklemine ei ole lõbus siis seega on soovitatav Winforms vormide generic baasklasside kasutamist vältida või kasutada triviaalset häkki: luua proxy-klass vormi ja generic-klassi vahele. Sellest räägitakse ka näiteks siin.

Oluline näib olevat ka see, et baasklassil oleks parameetriteta konstruktor, kuna VS2008 Designer loob designeri avamisel baasklassist instantsi. Praktikas tähendab see seda, et sa ei saa pärida abstract markeriga baasklassist. Sama funktsionaalsus on küll saavutatav vastavad komponendid virtualina deklareerimisega, aga loomulikult ei ole see nii ilus lahendus. Samuti tuleb praktikas hoolitseda et baasklassi käivitamisel exceptionit ei visataks. Vajadusel on kaval design-ajal koodi üldse mitte jooksutada wrappides vea andva koodi näiteks nii:

   1:  if (LicenseManager.UsageMode != LicenseUsageMode.Designtime)
   2:  {
   3:      //this is called only in NOT design-mode:    
   4:  }

Tasub veel märkimist, et kuigi eelpool-toodud koodirea asemel saaks kasutada ka controli DesignMode property väärtust, siis see ei ole väga hea mõte, sest see ei tööta konstruktoris ja aktiivse designer-akna user-controlite koodis..

Design-time'i on võimalik debugida

Kuidas teada, mis koodi Visual Studio designTime'is käivitab ?
Lihtne.
Pane breakpoint sind huvitavasse kohta ja määra, et debugimisel käivitataks programmina VS devenv.exe, mis avab uue Visual Studio akna, kus saad õige solutioni laadida, ja erinevaid design-time aknaid avades breakpointidesse joosta.


Testid tehtud : VS2008 Professional Edition + Windows Server 2003

Sellest kuidas puhtas WS2003 masinas Asp.Net rakendus tööle saada..

Tõstnud äsja kõik oma arenduse asjad vanast Windows XP SP2 süsteemist üle uude Windows Server 2003 masinasse keeldusid mu ASP.Net rakendused ootamatult töötamast. Või noh, ootamatu see just ei olnud, sest ma oleks olnud üllatunud kui IIS oleks suutnud out-of-the-box asjadega hakkama saada. Enivei, mind tervitas veateade:

The current identity (NT AUTHORITY\NETWORK SERVICE) does not have write access to 'c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files'.

Väga napakas on panna vaikimisi koodi käivitatavaks kasutajaks Network Service ja mitte anda sellele õigust seda koodi käivitada. Niiehknii, lahendus oli lihtne. Visual Studio command-line'i kirjutada:

> aspnet_regiis -ga "NT AUTHORITY\NETWORK SERVICE"

Seepeale sain ma uue ja huvitavama veateate:

Mutex could not be created.

Abiks oli Visual Studio sulgemine ja korraks Asp.Net lehe poole pöördumine otse IE abil. Magic, kui keegi sai aru miks see viga juhtus ja miks see nii lahenes, siis palun andke mulle ka teada.

Sellest kuidas käsitsi Show Desktop linki taastada..

Simple as pie:
1) Loo uus tekstifail, sisuga:

[Shell]
Command=2
IconFile=explorer.exe,3
[Taskbar]
Command=ToggleDesktop

2) anna sellele faililaiendiks scf

.. ja voilà paiguta kuhu tahad.

(testitud OS: Windows XP SP2)

Sellest kuidas käsurealt MSSQL andmeid kätte saada..

KL soojal soovitusel uurisin pisut MSSQL2005 utiliiti nimega bcp (loe: Bulk Copy), mis võimaldab otse käsurealt vahendada andmeid baasi ja andmetega failide vahel. Süntaks on mõõdukalt lihtne, kuid omab siiski paari twisti. Paar näidet kasutamisest allpool:

1) Väljastada tabeli X_USER sisu faili bcpTest.txt

C:\>bcp SomeDb..X_USER out bcptest.txt -c -C RAW -Usa -Slocalhost

Tähelepanu tuleks pöörata siis kindlasti vajadusele määrata kuidas kooditabelitega hakkama saada (-C RAW), muidu komistad sa pikalt ja pidevalt järgmise veateate otsa:

Starting copy...
SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver][SQL Server]Code page 775 is not supported by SQL Server
SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]Unable to resolve column level collations

BCP copy out failed

Antud lahendust ja põhjuseid kirjeldatakse ka siin.

2) Väljastada üks baasis hoitab pdf faili bcptest.pdf (image andmetüübist)

C:\>bcp "select DATA from SomeDb..DATA_FILE where ID=1281" queryout bcptest.pdf -Usa -localhost -N

Andmete sisestamiseks on samuti vahendid. Samuti saab seadistada veel tulesid-vilesid. Näiteks muuta veeru- ja reaeraldajaid.

Sellest kuidas tegelikult Transaction timeout'ile ära teha..

Inimene õpib kogu elu.. Kui ma palju aega tagsi rõõmustasin, kuidas debugimisel transaktsiooni aegumsist vältida ja pakkusin sära silmis koodilõiku:

   1: <system.transactions>
   2:     <defaultSettings timeout="00:15:00" />
   3: </system.transactions>

Tegelikult selgus, et machine.config on suurem ja tugevam ja eesoleva skripti peale jääb timeout'iks ikkagi 10 minutit. Ehk vaikeväärtus väljale maxTimeout. Abiks seega järgnev hell suunamine masina tasemel:
   1: <system.transactions>
   2:     <machineSettings maxTimeout="00:30:00" />
   3: </system.transactions>
Nagu ikka soe soovitus machine.config failist hullamise ajaks koopia teha..

Sellest kuidas Enterprise Library konfigureerijat kasutada VS2008-siseselt..

Ennemuistsel ajal (loe: siis kui kasutamisel oli Visual Studio 2005) oli Enterprise Library seadete muutmine mugavalt otse IDE's. Visual Studio 2008 ei taha neid paraku automaatselt tunda, mistõttu peab huviline kas käsitsi XML'is hullama (võimalusega pisut rohkem näpukaid teha) või järgida Scott Densmore juhiseid siin.

Lühidalt lugu järgmine:
Eeldused:

  1. installitud VS2008
  2. installitud Enterprise Library 3.1 (May 2007)

Tegevused:

  1. pane faili sisu registrisse. NB! kui su install on mittedefault-kaustas, siis heida vastav pilk ka registry faili sisse ja tee vajalikud parandused.
  2. VS2008 command-prompt'is : 
    > devenv /setup

Jei, mul toimis probleemideta.

Sellest kuidas mugavalt regulaaravaldisi luua ja debugida..

Leidsin selle tarbeks täna sellise utiliidi, nagu:
Rad Software Regular expression Designer

Välja näeb pmslt selline:

RegexDesignerMainScreen

Mõned kasulikud featuurid:

  • hea help samas rakenduses
  • RegexOptions seadmine (SingleLine, MultiLine, IgnorePAtternWhitespace jms)
  • Lihtne kuid kustomiseeritav UI (dokitavad alamaknad)

Ehk teeb kõike mis vaja ja on seejuures väike ja lihtne.

Sellest mida programmeerijad rahast rohkem tahavad..

Vana post, mida ma olen kunagi uptime's ka ringile lasknud, aga väärt ka jäädvustamist välismällu:

http://www.softwarebyrob.com/articles/Nine_Things_Developers_Want_More_Than_Money.aspx

Kui sa ei oska täpselt arvata, mis võiks progejat õnnelikuks, rahulolevaks ja jätkuvalt sinu kaastöötajaks teha, siis loe seda artiklit - saad üldjoontes õige pildi ..

Sellest kuidas Transaction Timeout'ile ära teha..

Testimise ajal on vahel pisut rohkem aega vaja.. App.configisse lisada selline blokk:

   1: <system.transactions>    
   2:     <!-- default timeout to 15 minutes for debugging-->    
   3:     <defaultSettings timeout="00:15:00" />
   4: </system.transactions>


Edasi on elu juba palju ilusam ..