Visio 2007

Van amikor az ember dolgozni szeretne, és azon kapja magát, hogy a szoftver amit használ ebben nem igazán támogatja.
Így jártam én a Microsoft Visio 2007-el, amikor adatbázist szerettem volna tervezni.
Természetesen a help, hibátlan magyarsággal, rövid és velős választ ad:


A Microsoft Office Visio programban Adatbázismodell-diagram sablonját használó személyek gyakori kérdése, hogy Mi történt a Létrehozás és a Frissítés parancsokkal?"
Röviden összefoglalva annyi, hogy a Létrehozás és a Frissítés parancs nem érhető el a Microsoft Office Visio 2003 Standard és Professional kiadásaiban vagy a Microsoft Office Visio 2007 alkalmazásban.
Az adatbázis-modellező szolgáltatások teljes körét, beleértve a Létrehozás és Frissítés parancsot is, a Microsoft Office Visio vállalati építészek számára készült verziójában találhatja meg. A Visio vállalati építészek számára az MSDN Premium Subscription része, mely a Microsoft Visual Studio Professional és a Visual Studio Team System szerepalapú kiadásaival érhető el.

Ezen a ponton látszik, hogy a help fordítói komolyan vették a munkát. Sebaj.
Tehát aki adatbázis modellből adatbázist akar generálni, annak szüksége van vállalatépítészeti visiora.
Mivel én komoly vállalatépítésznek gondolom magam, beszereztem egy Visio for Enterprise Architecht-et biztos ami biztos.
Nagy rutinnal a telepítő azt mondta, hogy Visual Studio nélkül ez nem telepíthető.
Szerintem meg igen, aki nem hiszi írja bele a registrybe az alábbi sort, és már működik is.

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\Setup\VS\VSTD]
"ProductDir"="."

Egyébként a 2007-es Visio teljesen ugyanaz az engine mint a 2005-ös EA edition. Picit módosítottak a guin, eladták ugyanazt, mégegyszer, és még db-t sem lehet vele generálni…
Ha valaki mindkettőt felrakja (akárcsak én), akkor amint a másik verziót indítjuk kedvességből kapunk 10 perc setup-ot…
MS

SVCgen batch processing, and parameters

Az SVC technológia kapcsán (ami egyébként kivételesen ötletes) az az érzése lehet az embernek, mintha nem lett volna rá idő rendesen beintegrálni a Visual Studio 2008-ba, ugyanis nincs módunk a kliens stub-ok generálására studióból. Vagy legalábbis én még nem jöttem rá erre. De sebaj, van megoldás. Írni kell két bat filét.

svc.bat

@echo off
echo Starting servicestub generation 
cmd /V:ON /C svcgen.bat

svcgen.bat

@echo off
set serviceList=system/system.svc,other/other1.svc,common/common.svc,admin/admin.svc

set serviceHost=http://localhost:3467/services/
set outputDir=.\client\serviceproxy\servicestubs\
set outputConfig=.\..\..\..\services_app.config
set resourceFile=.\..\common\bin\Debug\common.dll
set svcTool="c:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\SvcUtil"

set wsdlPostFix=?WSDL
set commonParams=/noLogo /target:code /l:cs /ser:datacontractserializer /importxmltypes

 
set cmdLine=%commonParams% /r:%resourceFile% /config:%outputConfig% /d:%outputDir%

del %outputDir%%outputConfig%
del /Q %outputDir%\*.* 

set firstrun=true

for %%a in (%serviceList%) do (        
  echo Processing service: %%a       
  echo ------------------- 
  rem echo %svcTool% %cmdLine% %serviceHost%%%a%wsdlPostFix%
  
  if "!firstrun!" == "false" (  
    %svcTool% %cmdLine% /mergeConfig %serviceHost%%%a%wsdlPostFix%   
 )
    
  if "!firstrun!" == "true" (
     %svcTool% %cmdLine% %serviceHost%%%a%wsdlPostFix%     
     set firstrun=false
 )  
)

A szolgáltatásokat a serviceList listába kell felvenni, vesszővel elválasztva.
A /r: paraméter arra szolgál, hogy azon osztályok, amik szerepelnek a megadott dll-ben nem kerülnek legenerálásra a kliens oldalon.

Ha igazán széppé akarjuk tenni a megoldást, akkor kell írnunk egy alkalmazást, ami a végeredményül kapott services_app.config fájlt bele tudja illeszteni az app.config fájl megfelelő xpath helyére.

C# Singleton

Generics mint fogalom létezik a .net-ben. És ez jó. Gondoltam csinálok egy singleton ősosztályt mert az legalább olyan jó mint a generics.

   public abstract class Singleton<T> System.Object, new()
    {
        private static T _instance;

        public static T get()
        {
            if (_instance == null)
            {
                _instance=new T();
            }
            return _instance;
        }
    }

Öröm boldogság, gondoltam. De a fordító nem örült, és ezt mondta:

Error 1 Constraint cannot be special class ‘object’

Ejnye. Megnéztem a helpet.

Compiler Error CS0702
The following types may not be used as constraints: System.Array, System.Delegate, System.Enum, or System.ValueType.

Szerencsére, mint a Microsoft termékeknél általában, mindig van egy alternatív megoldás.

    public abstract class Singleton<T>
    {
        private static T _instance;

        public static T get()
        {
            if (_instance == null)
            {
                _instance = System.Activator.CreateInstance<T>();
            }
            return _instance;
        }
    }

Szolgáltatás és a Timer

Naivan azt gondolhatnánk, hogy ha egy Timer komponenst használunk a szolgáltatásunkban az működni fog. Pedig nem. A .Net rendelkezik pár Timer osztályal számunkra most kettő érdekes (az ismertetés csak felületes, akit érdekel nézze meg msdn-en ügyesen):
System.Threading.Timer: mint neve is mutatja külön szálat hoz létre, és az végzi az üzemezést
System.Windows.Forms.Timer: ezt használja a gui, azon keresztül történik az ütemezés
A feladat csak annyi, hogy amikor a szolgáltatásunk elindul, eldöntsük azt melyiket is kell használnunk. Célszerű erre egy burkoló osztályt létrehozni, ami a külső használók elöl elrejti, hogy milyen timer is működik a háttérben valójában.
Az én implementációm nagyon egyszerű, egy szempont volt: működjön. Letölthető itt.

mstsc és tsclient

Ha az ember a windows beépített terminál szerverét használja (msts) akkor módja van arra, hogy a kapcsolódó gép fájlrendszerét elérje a bejelentkezés ideje alatt, ha ezt engedélyezi. Ezen elérés látszik explorer alatt, ellenben total commander alatt nem.
Ahhoz, hogy ezt a meghajtót el tudjuk érni, nem kell mást tennünk mint beírni ezt a parancsot total commanderbe:

cd \\tsclient

És már látszanak is a kliens oldali megosztot meghajtók ügyesen.

Alkalmazás kimenete log fájlba

Aki sokat használ konzolos alkalmazásokat, gyakran beleütközhet abba, hogy szüksége van az alkalmazás outputjára egy fájlban. Ez elég egyszerű feladat, és az alábbi módon lehet megoldani:
test.exe > out.log

Ha nem csak a sima kimenetet szeretnénk látni a fájlban, hanem a hibacsatornára kerülő dolgokat is, az alábbit kell tennünk:
test.exe 2>&1 > out.log

Egy picit elegánsabb megoldás, ha a kimenetet kiírjuk fájlba, ugyanakkor kiírjuk a képernyőre is:
test.exe 2>&1 | tee out.log

A log fájlok nézegetésére egy jó megoldás a less utasítás. Amennyiben úgy szeretnénk nézni a napló fájlt, hogy az új bejegyzéseket is azonnal lássuk, azt az alábbi módon tehetjük meg egyszerűen:
less +M out.log