Expresii regulate si Regulazy

Am avut de facut urmatoarea chestie : de citit fisiere dintr-un folder si updatat text-ul din ele ( erau niste csv-uri) cu portiuni din denumire( de exemplu, daca fisierul se numeste vinzari_123 sa pun in fisier 123 la fiecare rind) . Normal ca m-am gindit sa il fac cit mai “extensibil” – pentru ca nu stiu forma sub care vin fisierele – asa ca m-am gindit sa evaluez ceea ce obtin cu expresii regulate – si sa le pun intr-un fisier de configurare( despre ConfigurationSection intr-un post viitor). Dar nu mai tineam minte sintaxa – in schimb tineam minte ca Roy Osherove a facut un Regulazy ( vedeti pagina http://weblogs.asp.net/rosherove/pages/tools-and-frameworks-by-roy-osherove.aspx ).

Cum se utilizeaza : Pui textul in casuta si apesi Regex_edit

102153_ReguLazy by Roy Osherove Beta_active

Incepi sa subliniezi portiuni din text si dai click dreapta ( eu am facut asta cu vinzari –si am selectat “1 or more anything”. Apoi am selectat _ , am dat click dreapta si am selectat “exactly _”  . In sfirsit am selectat 123 ,am dat click dreapta si am selectat “digits”.Iar click dreapta pe 123 selectat si dau “rename”  – si ii pun numele “values”. Daca apas acum pe “test again input” se vede clar ca obtin in “values” ce am nevoie – si anume 123.

102804_ReguLazy by Roy Osherove Beta_active

Ce mai am de facut este sa apas pe “generate”  si a iesit codul :

public void SampleRegexUsage()
{
    string regex=@"^\w+?_(?<values>\d+)$";
    RegexOptions options = RegexOptions.Multiline;
    string input= @"vinzari_123";
    MatchCollection matches = Regex.Matches(input,regex,options);
    foreach (Match match in matches)
    {
        Console.WriteLine(match.Value);
        Console.WriteLine("values:" + match.Groups["values"].Value);
    }
}

( ma rog, trebuie sa scot multiline si sa scot ^ de la inceput … – dar fara asta e corect!)

Eu zic ca e un tool super rapid si usor de folosit( si free ;-)  – si bun pentru cazul cind nu folosesti de multe ori expresii regulate.

DasBlog si feedburner sau de ce e important in open source sa nu hard codezi API

Am vrut sa vad si eu citi cititori am pe blog-uri ( si sa le pun si reclame -  dar asta e deja o alta discutie … ) .

Asa incit am cautat “feedburner dasblog” – si am gasit o configurare usoara aici :http://mikeknowles.com/blog/2008/12/30/dasBlogAndFeedburner.aspx

OK  – am pus in site.config , am profitat de faptul ca acest blog este deja pe feedburner , am rescris web.config (am pus un spatiu ca para ca este nou) – si merge de minune – se duce la http://feeds2.feedburner.com/AndreiIgnatBlog

Eh – acum intervine problema : pentru blog-ul propriu am facut acelasi lucru – cu mentiunea ca l-am adaugat in feedburner. Problema a venit in momentul verificarii : se ducea la http://feeds.feedburner.com/blogpropriu in loc de http://feeds2.feedburner.com/blogpropriu  . Am inceput sa ma uit in cod – si vad intr-adevar:

if (siteConfig.FeedBurnerName != null && siteConfig.FeedBurnerName.Length >0)
            {
                return new Uri(new Uri("http://feeds.feedburner.com/"),siteConfig.FeedBurnerName).ToString();
            }

 

Naspa … Problema este ca feeds.feedburner.com NU mai merge pentru noile RSS-uri, ci doar pentru cele vechi. Daca era o intrare de ex, <FeedBurnerApi>http://feeds.feedburner.com/{0}</FeedBurnerApi> mergea de minune acum configurarea.Dar asa va trebui sa recompilez / sau sa contribui la http://www.codeplex.com/dasBlog/Release/ProjectReleases.aspx?ReleaseId=17989 – mai ales ca Google transfera feedburner si are un alt URL.

Am cautat pe feedburner   – dar nu am gasit sa faca redirectarea .Ma rog, o sa le scriu celor de la feedburner sa vad daca imi permit sa am si URL-ul cu feeds in loc de feed2.

Concluzie : Daca lucrati la on software OpenSource si vreti ca oamenii sa il foloseasca, nu hard-codati nici un API al unui third party – tot ce folosit adaugati in fisierul de configurare…

Creearea Bazei de date – si suport filestream in Sql Server 2008

Deocamdata o sa facem doar tabelele pentru detaliile/resursele care tin de un Angajat . Hai sa enumeram citeva :

  1. Un Angajat are nume( se poate schimba – prin casatorie, de ex.), prenume , poza – sa le numim proprietati UserRelated
  2. Un Angajat poate avea telefon , laptop – sa le numim proprietati JobRelated
  3. Un Angajat poate avea cont de Active Directory, email , Citrix , acces VPN – sa le numim ITRelated

(Daca aveti si alte sugestii,va rog sa imi scrieti)

Evident ca am putea creea o tabela prin care sa avem , ca si coloane, toate aceste proprietati – dar aplicatia nu ar fi destul de flexibila, in cazul in care cineva ar vrea sa mai adauge un detaliu/resursa ar trebui sa refacem aplicatia. Asa incit totul se rezolva cu un nivel de indirectare – o sa creez o tabela care sa contina gruparile de Proprietati (UserRelated, JobRelated , ITRelated) –, una care sa contina Proprietatile( nume, prenume, poza, telefon, laptop, email, etc) si una care sa faca legatura intre ele. De asemenea , trebuie ca tabelele sa contina date despre cine a introdus informatia si pina cind e valabila – acestea vor fi 3 cimpuri, continute tot timpul in (aproape) fiecare tabela , de tipul :

[DateModified<NumeTabela>] [datetime] NULL, –data modificarii

[NameUserModified<NumeTabela>] [nvarchar](150) NULL, – nume utilizator care a modificat

[IPModified<NumeTabela>] [nvarchar](150) NULL, — ip-ul de la care s-a produs modificarea

Deocamdata am ajuns la urmatoarea structura :

clip_image002

Pentru conformitate , iata scriptul de creere al tabelelor si scriptul de creere a resurselor/detaliilor Angajatului.

http://serviciipeweb.ro/iafblog/content/binary/net35/bd/1/db.zip

Ce vreau sa fac in continuare este sa fac coloana ValueBinaryUserGroupProperty de tipul FileStream – adica sa isi pastreze datele pe hard, de fapt.

Verificam ca serverul suporta filestream – click dreapta pe server, “properties”, selectati “Advanced” si verificati ca filestream este OK:

clip_image004

Apoi click dreapta pe baza de date, “properties”, selectati FileGroups si acolo adaugati un filestream(bifati si “default”)

clip_image006

Acum trebuie sa adaugam un file ca sa putem profita de acest filestream . Trebuie ales File_Type : “filestream data”, filegroup-ul si, cel mai important, folder-ul in care sa il punem (ca alegere usoara, este acelasi folder ca fisierul primar de date)

clip_image008

Acum putem sa construim tabela noastra cu filestream – stergem tabela accUserGroupProperty (drop table accUserGroupProperty ) si o creeam cu suport de FileStream :

CREATE TABLE [dbo].[accUserGroupProperty](

[IDUserGroupProperty] [uniqueidentifier] NOT NULL ROWGUIDCOL PRIMARY KEY,

ToDateUserGroupProperty datetime NULL,

[ValueTextUserGroupProperty] [nvarchar](max) NULL,

[ValueBinaryUserGroupProperty] [varbinary](max) FileStream NULL,

[IDUser] [bigint] NOT NULL,

[IDProperty] [bigint] NOT NULL,

[DateModifiedUserGroupProperty] [datetime] NULL,

[NameUserModifiedUserGroupProperty] [nvarchar](150) NULL,

[IPModifiedUserGroupProperty] [nvarchar](150) NULL,

)

Ce ne trebuie neaparat pentru o coloana de tipul FileStream :

  1. Suport Server, BD ( facut deja)
  2. O coloana in tabela respectiva de tipul NOT NULL ROWGUIDCOL PRIMARY KEY

Cu ce ne afecteaza : cu aproape nimic – dar e bine sa poti vedea fisierele pe hard * de ex., poza angajatului o sa fie direct pe hard in loc sa o stocam in BD.

Nu uitati ca tot ce am facut aici prin click-uri se poate face si prin script, cu ajutorul butonului “Script” – se poate gasi usor in toate pozele precedente

Tema pentru acasa : Creeati o baza de date cu support filestream, o tabela cu o coloana filestream si inserati un text. Observati modificarile de pe folder-ul unde ati spus sa se creeze FileStream.

Lecturi Recomandate:

FileStream cu SQL Server (pe scurt)

http://blogs.microsoft.co.il/blogs/bursteg/archive/2008/05/09/sql-server-2008-filestream-part-1.aspx

Database normalization

http://en.wikipedia.org/wiki/Database_normalization

Developing Time Oriented databases in SQL

http://www.cs.arizona.edu/people/rts/tdbbook.pdf

Separare mdf de ldf

Una din best practices ale SQL Server era sa separi mdf de ldf pe hard diskuri( vezi si SQL Server 2005 Best Practices Analyzer )

Asa ca a trebuit sa fac asa ceva pentru mai multe BD … si nu vroiam sa fac attach/detach manual si sa schimb manual locatia. Iar rezultatul este urmatorul script, care iti ia mdf-ul si il pune altundeva.

Observatii:

1 .Inchid toate conexiunile la BD brusc  la rularea scriptului  – fac SET  READ_ONLY

2. Nu ia in considerare mai multe mdf-uri pentru o BD

3. Am preferat sa fac output la instructiuni decit sa le execut – pentru ca nu toata lumea are enabled xp_cmdshell ( si nici nu ar fi bine …) ca sa fac automat miscarea

4. Stiu, ar fi fost de preferat un Powershell –sau un programel C# – dar mi-ar fi luat mai mult.

Iata si scriptul(poate va foloseste)

DECLARE @where VARCHAR(MAX)
SET @where = '<cale fizica pe PC-ul unde se afla sql server>'
DECLARE @nameBD VARCHAR(MAX)
SET @nameBD  = '<numele bazei de date>'

DECLARE @script NVARCHAR(MAX)

USE master
DECLARE @nameFile NVARCHAR(MAX),@PathFile  NVARCHAR(MAX)
-- aflare doar nume master - teoretic, ar trebui facut un cursor...
SET @script  = 'select  @nameFile = name , @PathFile= filename from ' + @nameBD+ '..sysfiles

where filegroup_name(groupid) is not null'
--print @script
EXECUTE sp_executesql @script,N'@nameFile varchar(max) OUTPUT, @PathFile varchar(max) output',@nameFile  output,@PathFile output

SET @script  = 'ALTER DATABASE ' + @nameBD + ' SET  READ_ONLY WITH ROLLBACK IMMEDIATE'
EXEC (@script)
SET @script  = 'ALTER DATABASE ' + @nameBD + ' SET  SINGLE_USER WITH ROLLBACK IMMEDIATE'
EXEC (@script)

SET @script  = 'ALTER DATABASE ' + @nameBD + ' SET  READ_WRITE WITH ROLLBACK IMMEDIATE'
EXEC (@script)
SET @script  = 'ALTER DATABASE ' + @nameBD + ' SET  MULTI_USER WITH ROLLBACK IMMEDIATE'
EXEC (@script)

DECLARE @dateNow VARCHAR(20)
SET @dateNow  = CONVERT(VARCHAR(20),GETDATE(),120)
SET @dateNow  = REPLACE(@dateNow,'-','')
SET @dateNow  = REPLACE(@dateNow,':','')
SET @dateNow  = REPLACE(@dateNow,' ','')
SET @script = 'BACKUP DATABASE ' + @nameBD + ' TO DISK = ''' + @where + @nameBD  + @dateNow + '.bak' + ''''

PRINT @script 

SET @script = 'ALTER DATABASE ' + @nameBD + ' SET OFFLINE'

PRINT @script 
SET @script = 'ALTER DATABASE ' + @nameBD + ' MODIFY FILE ( NAME = ' + @nameFile +

', FILENAME = ''' + @where  + @nameFile  + '.mdf' + '''' +' )'
PRINT @script 
PRINT '--move physically the ' + @PathFile   + '  to ' @where  + @nameFile  + ' then go to this alter database'
PRINT ' or xp_cmdshell with move ...'
SET @script = ' -- ALTER DATABASE ' + @nameBD + ' SET ONLINE'

PRINT @script 

Typemock Isolator

Roy Osherove este un blogger pe care il urmaresc – si tare vreau tool-ul lui, mai ales ca e facut special pentru VB.NET

Asa ca iata reclama:

 

 

Programming Visual Basic applications?

Typemock have released a new version of their unit testing tool, Typemock Isolator 5.2.
This version includes a new friendly VB.NET API which makes Isolator the best Isolation tool for unit testing A Visual Basic (VB) .NET application.

Isolator now allows unit testing in VB or C# for many ‘hard to test’ technologies such as SharePoint, ASP.NET MVC, partial support for Silverlight, WPF, LINQ, WF, Entity Framework, WCF unit testing and more.

Note that the first 25 bloggers who blog this text in their blog and tell us about it, will get a Free Full Isolator license (worth $139). If you post this in a VB.NET dedicated blog, you’ll get a license automatically (even if more than 25 submit) during the first week of this announcement.

Go ahead, click the following link for more information on how to get your free license.

Asp.NET Chart Controls

Pentru ca la nu imi mergea Reporting Services( un IIS pe o masina cu 64 de biti, cu Sql pe 32 si cu Web Extensions de aspnet exe pe 32 de biti disabled, ca altfel nu merge alt site) a trebuit sa fac un raport cu numere. Si, pentru ca un grafic spune cit 100 de cuvinte, am zis sa le fac si citeva grafice. Si am fost bucuros sa dau o sansa la noile controale de chart. In 15 minute am reusit sa fac ceva ok –sunt super

Citeva caveats, totusi :

  1. Downloadati NEAPARAT toate documentele, adica
  2. Download the free Microsoft Chart Controls

    Download the VS 2008 Tool Support for the Chart Controls

    Download the Microsoft Chart Controls Samples

    Download the Microsoft Chart Controls Documentation

    SI mai ales Download the Microsoft Chart Controls Samples – si rasfoiti exemplele.

  3. Vedeti ca in web.config baga o inregistrare de tipul
  4. <add key="ChartImageHandler" value="storage=file;timeout=20;dir=x:\inetpub\etc\log;" />

    Acolo x:\inetpub\etc\log trebuie sa fie calea catre un director in care IIS sa aiba dreptul de scriere….

  5. Daca nu aveti acces la masina de hosting ca sa instalati in GAC chart-urile, puteti copia de la voi de pe masina
  6. System.Web.DataVisualization.dll
    System.Web.DataVisualization.Design.dll

    ( folositi subst X %windir%\assembly – si copiati-le din X)

     

Daca vreti poze frumoase , gasiti la Scott . Oricum, sunt foarte bune – si mai bune decit vechiul Chart Control din VB6…Folositi cu incredere!

3 cani

 

Cele 3 capete ale mele:

 

RONUA – care ma defineste cel mai mult – pentru ca nu(mai) exista ROVBUA

Sql Server – pentru ca e BD pe care am folosit-o cel mai des

ITBoard – pentru ca IIS pe Windows Server 200X(X in {3,8}) e asa de diferit de IIS pe XP, pentru ca iti trebuie cunostinte de AD pentru ASP.NET si pentru alte multe lucruri pe care doar administratorul de sistem le poate configura si tu trebuie sa ii explici ca nu e problema ta 😉

Voi ce aveti ?

Boti

Mai intii, scuze: am incercat sa pun tutorialul de .NET 3.5 o data la 2 saptamini – si trebuia sa fie saptamina aceasta. Nu am fost in stare sa il continui – am avut o predare la servici care s-a dovedit a fi peste puterile mele de a duce doua aplicatii. Promit sa incep in forta dupa anul nou.

Revenind la boti :Folosesc

  1. encarta@botmetro.net – pentru orice de cultura generala
  2. mtbot@hotmail.com – pentru traduceri rapide din engleza in italiana si franceza
  3. en2ro@bot.talk.google.com si ro2en@bot.talk.google.com – pentru traduceri din RO in EN si invers
  4. reQall -pentru taskuri

 

No –sa vedem acum – primii 2 boti sunt de Live Messenger, nr 3 de gmail si 4 de yahoo messenger …Cred ca mi se impune un Pidgin

 

Alti boti, neverificati, gasiti aici :
http://www.labnol.org/internet/most-useful-google-talk-bots/4347/

 

Pentru a face un bot de google, http://code.google.com/p/xmppapplication/ sau cautati http://sourceforge.net/projects/garudamessenger/ (ma rog, la al doilea folositi reflector-ul …)

 

Voi ce boti folositi ?

Cum sa te testezi un WebSite cu 2 conturi

Pe scurt : foloseste 2 browsere.

Pe lung : e adevarat ca ar trebui facute teste separate pentru interfata – dar , de obicei, eu le fac in BL iar interfata o testez “manual”. Si , avind in vedere drepturile, exista cel putin 2 user-i: (l)user-ul simplu si admin-ul.

Daca e vorba de un site cu autentificare prin usernmae si parola, e destul de simplu – poti face log-off si logon din nou ca celalalt user.

Dar pentru un site cu autentifcare Windows(Active Directory) e un pic mai complicat. Internet Explorer te autentifica automat ca user-ul care esti logat. Doar browser-ul de Firefox te ajuta si iti cere Username+parola. Asa incit , daca le folosesti pe amindoua, si ai si un alt cont de user, poti vedea cum se comporta site-ul tau pe 2 user-i diferiti. Si, avind in vedere ca cookie-urile sunt diferite, e bun si pentru autentificarea forms.

Ca pont: chiar daca esti ispitit sa “ascunzi” niste optiuni in interfata grafica pentru un user mic, nu o fa de la inceput. Lasa-le acolo, pune cod in BL in care arunci eroare ca nu are dreptul, fa un unit test si verifica ca prinzi eroarea. Verifica si in GUI si apoi ascunde-le(visible sau enabled=false)