Ako neko još uvek nije uradio ovu migraciju, a pita se zašto bi to uradio, šta će mu nešto drugo, ili šta su razlike (pošto sam dosta pitanja dobijao na ovu temu kada se TFS pojavio), Brajan Heri (Brian Harry) je nedavno napisao jedan članak na tu temu, koji možete da pregledate na Microsoft sajtu.
Out.
B.D.
Kao poslednji u nizu blog postova oov Full Text Search-u i FILESTREAM podršci, želeo bih da predstavim nove stvari koje dolaze sa SQL Server-om “Denali”, sledećem izdanju SQL Servera. Kao što verovatno znate, isti je trenutno u CTP1 fazi; CTP je pušten u opticaj na PASS konferenciji u Sijetlu, početkom novembra prošle godine. Uskoro će izaći i CTP3 (ne smem da kažem kada tačno, naravno), tako da je ovaj post već odavno trebalo da se desi; mnogu samo da okrivim puno posla koji je ceo SQL tim u MDCS-u imao oko dodataka u dotični CTP3 za “Denali”.
FTS – šta je novo?
Kao i mnoge druge stvari u SQL Server-u, FTS je doživeo neka poboljšanja.
FTS Property Lists
“Denali” je dodao jednu prilično lepu stvar kada govorimo o FTS-u. Međutim, pre nego što dođemo do zanimljivih detalja, moram da pokrijem još malo teorije o tome kako rade filteri koje FTS koristi.
Sigurno ste do sada primetili kada ste radili sa bilo kojim Office dokumentom, da postoji određen broj meta-podataka koji se skladište zajedno sa fajlom, kao što su autor, ključne reči, apstrakt i slično. Neki filteri koji rade pretragu ovih fajlova, umeju da “izvuku” te meta-podatke i da dozvole pretragu i po njima. Integrisana pretraga u Vistu i novije Windows sisteme je jedan primer; ako me sećanje dobro služi, i stariji Windows Search kao i desktop izdanje Google Search-a su to isto mogli.
Pošto znamo da se dotični filteri koriste i kod FTS-a da bi se indeksirali binarni fajlovi, jedno od pitanja je do sada bilo “kako pretraživati te meta-podatke?” U verzijama pre “Denalija”, to jednostavno nije bilo moguće na jednostavan način, ako I uopšte. Od “Denali”-ja naovamo, tačnije od CTP-a 1 naovamo, ta mogućnost postojo tako što se za svaki indeks može konfigurisati da li se liste čuvaju ili ne. Naravno, zavisno od Filtera koji se koristi; neki Filteri tokom obrađivanja fajlova za pretragu ne ekstrakuju ove meta-podatke.
Pretraga se vrši konfigurisanjem tzv. "”search property” listi. Svaka lista se sastoji od onih meta-podataka koje želite da pretražujete. T-SQL komanda koja se koristi uz ove svrhe je CREATE SEARCH PROPERTY LIST, i ona zahteva nekoliko podataka iz samog meta-podatka. Više o ovome svemu možete saznati na uvodnoj strani.
Posle uspešnog kreiranja liste meta-podataka, potrebno je asocirati full-text indeks sa listom, i pustiti repopulaciju. Repopulacija indeksa je jedina stvar koja mi se lično ovde ne dopada, mada efekti zavise uglavnom od scenarija korišćenja; ako je indeks poveći, repopulacija može trajati duže vremena. O istom trošku da napomenem, uključivanje meta-podataka u indeks dovodi i do povećanja veličine indeksa. Koliko povećanje, zavisi od filtera i količine meta-podataka.
Sama pretraga se vrši uz pomoć nove opcije unutar CONTAINS predikata, koja se zove, očekivano PROPERTY:
1: SELECT Document FROM Production.Document
2: WHERE CONTAINS(PROPERTY(Document,'Title'), 'Maintenance OR Repair');
FILESTREAM (nestruktuirani podaci)
Sam FILESTREAM je ostao nepromenjem u “Denali-ju”, ali je unapređen dodatkom FILETABLE pobošljanja.
FILETABLE – dvosmerna komunikacija sa fajl sistemom
FILETABLE je logično ishodište FILESTREAM podrške. Kao što smo napomenuli u prošlim serijama, a I kao što trenutno stoji u BOL na MSDN-u, FILESTREAM omogućava samo jednosmernu komunikaciju između fajla I baze podataka, od baze ka fajlu; ukoliko izmenite fajl na hard disku, baza podataka neće moći jednosatvno da se oporavi I SQL Server će je smatrati dovoljno oštećenom da je stavi u corrupted stanje.
FileTable koristi FILESTREAM da bi obezbedila aplikacijama ne-transakcioni pristup jednoj tabeli u kojoj se nalaze nestruktuirani podaci. Ovim načinom, obezbedilo se i funkcionalnost koja je već postojala sa FILESTREAM-om, dakle da se koriste mehanizmi oji su ugrađeni u SQL Server za upravljanje tim podacima, kao i da se obezbedi da aplikacije mogu da koriste standardne (kako za koju platformu/jezik) načine pristupa tim fajlovima kao “običnim” fajlovima na fajl sistemu.
FileTable se sastoji od sledećih kolona:
- Kolona sa FILESTREAM atributom koja skladišti sam fajl.
- stream_id kolona koja je GUID za jedinstveno označavanje FILESTREAM-a.
- Radi podrške FTS-u (jer sam već pokazao koliko su ove dve osobine SQL Servera zajedno dobra kombinacija) postoje dve kolone, Language i Type.
- Dve kolone tipa hiearchyid, path_locator i parent_path_locator koje omogućavaju da se dobije tačna hijerarhija lokacije fajla.
- Još tačno 10 kolona koje pokazuju razne atribute fajlova.
Sve ovo se da videti na strani sa osnovnim opisom FileTable-a.
Kreiranje ovakve tabele se radi preko CREATE TABLE T-SQL komande, sa dodatnom klauzulom “AS FileTable”. Primera radi:
1: CREATE TABLE DocumentStore AS FileTable WITH FileTable_Directory Document
2: FILESTREAM_ON FILESTREAMGroup1;
Pristupanje podacima se radi ili preko T-SQL-a ili preko Win32 API-ja:
- Postoje tri funkcije koje se mogu pozvati iz T-SQL-a da bi se dobile informacije o podacima uskladištenim u FileTable objektu: AllocationSize, GetFileNameSpacePath i GetPathLocator.
- Pristup i izmena podataka u FileTable se radi kao sa svakom drugom tabelom, dakle preko običnih DML komandi. Međutim, postoji i nekoliko stvari na koje se mora obratiti pažnja, kao što je prikazano u dokumentaciji.
- I kao poslednja, ali nikako najmanje važna opcija se javlja i Fajl sistem API-ji, preko kojih se može “sa druge strane”, van SQL Servera pristupati fajlovima koji se nalaze u FileTable-u.
Out.
B.D.
Pošto smo u prethodnoj “epizodi” videli kako se uz pomoć T-SQL interfejsa radi sa FTS-om i FILESTREAM-om, vreme je da se pozabavimo i zanimljivijim delom ovih mogućnosti, a to je pravljenje aplikacija koje koriste ove mogućnosti.
Postoji mnogo scenarija koji bi mogli da se implementiraju uz ove dve osobine SQL Server-a, ali da bih mogoa ikada da završim ovaj blog post, pobratiću pažnju na jednu: repozitorijum tekstova, koji omogućava skladištenje istih, kao i pretragu ne samo meta-podataka (recimo, imena autora i sl.), već i samog teksta.
Osnovne postavke
Pre nego što krenem u objašnjavanje aplikacije, želim samo da prođem kroz nekoliko osnovnih postavki od kojih sam krenuo, i na kojima je aplikacija zasnovana:
- U pitanju je veoma jednostavna ASP.NET MVC, dakle web, aplikacija
- U aplikaciji se neće koristiti “čist” T-SQL u svim slučajevima, samo tamo gde je neophodno.
- Pošto je u pitanju ilustracija, ona nije napravljena da bude preterano performantna.
- Šema baze je relativno prosta, i prati šemu iz prošlog posta.
- Meta-podaci se čuvaju pored samog fajla kao dodatne kolone u tabeli (ne postoji automatizacija njihovog prikupljanja, što bi moglo biti urađeno)
- Aplikacija trenutno podržava samo DOCX (Word) fajlove, mada tu niste ograničeni; dovoljno je samo instalirati dodatne IFiltere na mašini gde se “vrti” SQL Server, i drugi fajlovi mogu da se podrže.
Aplikaciju, inače, možete da preuzmete sa mog SkyDrive foldera.
Apstrakcije i ostali demoni
Raditi preko “običnog” T-SQL-a ovih dana nije baš in, iako postoje ljudi koji i dalje vole da pišu takav kod, i kao što ćemo videti, nećemo moći da izbegnemo dotičan jezik u svim situacijama. Međutim, pošto su ORM-ovi ovih dana veoma popularni, aplikacija će za pristup podacima koristiti primarno Entity Framework 4.0, mada većina stvari koje ću napisati ovde se odnose na sličan način i na LINQ to SQL.
EF 4.0 mapira FILESTREAM kolone u objekte na veom jednostavan način, kao property tipa byte[]. Dodavanjem vrednosti u osobine ovako mapiranog tipa, EF će automatski praviti potreban T-SQL upit. Naravno, pošto se radi o fajlu, moramo da pazimo da dodamo Stream koji sadrži fajl poslat na server:
1: [HttpPost]
2: public ActionResult Upload(ArticleInputModel input)
3: {
4: if (input.ArticleContent.ContentLength <= 0)
5: throw new ApplicationException("You need to upload a valid file");
6:
7: Article a = new Article();
8: a.artGUID = Guid.NewGuid();
9: a.Title = input.Title;
10: a.Abstract = input.Abstract;
11: a.Keywords = input.Keywords;
12: a.ArticleFile = new byte[input.ArticleContent.ContentLength];
13: a.Type = Path.GetExtension(input.ArticleContent.FileName);
14: input.ArticleContent.InputStream.Read(a.ArticleFile, 0, input.ArticleContent.ContentLength);
15:
16: // Add to database
17: _entities.Articles.AddObject(a);
18: _entities.SaveChanges();
19:
20: return RedirectToAction("Index");
21: }
Bitne za shvatanje su sledeće linije:
- #4 – proveravamo da li je fajl uplodovan, ako nije, bacamo exception
- #12 – pravimo novi byte[] niz koji ima istu dužinu kao i duižina fajla koji nam je poslat
- #14 – preko standardnim Stream metoda učitavamo sadržaj fajla koji je uplodovan na server
- #17 –18 – dodajemo novi Article objekat u ObjectContext (pod nazivom _entities) i pozivamo SaveChanges() metod da bismo ga perzistirali u bazu podataka
Korak br. 2 u apstrakcijama: FTS
FTS, nažalost, nije dobro podržan od strane ORM alata. Ukoliko pogledamo gornje objekte, ako na bilo kom property-ju koji je tipa string pozovem metod Contains(), dobiću T-SQL upit koji koristi LIKE predikat. Ovakvo ponašanje imaju i EF 4.0 i LINQ to SQL (nisam siguran za ostale ORM-ove, ali pretpostavljam da je ponašanje isto/slično i sa njima). Dakle, da bismo koristili FTS, imamo nekoliko opcija:
- Generisanje “čistog” T-SQL koda koji šaljemo serveru. LINQ to SQL je naročito dobar za ovo, pošto ima metod ExecuteQuery<T>, koji prima tekst T-SQL upita, i radi projekciju rezultata u tip T kojim smo specijalizovali metod.
- Pisanje TVF-a, odnosno SPROC-a, kojem ćemo proslediti ključnu reč kao upit, ik zatim vratiti rezultat.
- Zaobilaženje ORM-ova kompletno, i pisanje specijalnog repoziturijuma za pretragu sa ručnom projekcijom u tipove koji su nam potrebni.
Od svih gore navedenih opcija, ideja TVF-a ili SPROC-a mi se čini kao zaista najbolja, pogotovo jer ne želim da izgubim moć projektovanja rezultata iz baze podataka u objekte. Pošto koristim EF 4.0, moraću da napišem SPROC i da je mapiram; iz meni nepoznatog razloga, EF 4.0 ne podržava TVF-ove koji bi mi bili generalno preferirani način da uradim ovako nešto. Ukoliko koristite LINQ to SQL )(ili neki drugi ORM koji ume da mapira SQL Server-ove TVF-ove), ovo možete da uradite veoma lako.
Sama procedura je užasno jednostavna, naravno, jer sve što mi je potrebno jeste da uradim pretragu i da vratim nazad rezultate. Izgleda otprilike ovako:
1: CREATE PROCEDURE [dbo].[SearchArticlesContents]
2: @keyword nvarchar(4000)
3: AS
4: BEGIN
5: -- SET NOCOUNT ON added to prevent extra result sets from
6: -- interfering with SELECT statements.
7: SET NOCOUNT ON;
8:
9: SELECT * FROM dbo.Articles WHERE FREETEXT(ArticleFile, @keyword)
10: END
Naravno, pošto je ovo samo primer, malo “varam”, pa koristim u startu FREETEXT predikat, pošto znam da će potencijalno doći više ključnih reči unutar @keyword parametra, i ne želim da pišem kod, niti klijentski, niti serverski da bih detektovao da li postoji potencijalnpo više reči i slično.
Za EF 4.0, moraćemo da upakujemo upit koji sadrži FTS predikate u stored proceduru. Zatim ćemo projektovati dotičnu proceduru kao metod na standardan način za EF. Zatim ćemo koristiti dotičnu metodu iz našeg SearchController-a da bismo uradili pretragu, projektovali rezultate nazad u listu članaka i zatim prosledili metodu:
1: [HttpGet]
2: public ActionResult Search(string id)
3: {
4: List<Article> result = _entities.SearchArticlesContents(id).ToList();
5:
6: return View("Search",result);
7: }
Veoma jasan kod, pozivamo SearchArticlesContents metod na _entities kolekciji, i prosleđujemo ključne reči koje je korisnik ukucao u formular, dobijamo kolekciju članaka nazad, prosleđujemo kao ViewData našem View-u.
Sa ovim malim dodatkom, imamo komplenu aplikaciju koja:
- Dozvoljava korisnicima da unesu meta-podatke
- Pošalju članak na server
- Pretraže sadržaj tog istog fajla
Memorija i bolji načini
Iako se ovaj primer aplikacije fokusirao na jedan način kako se može napraviti ovaj scenario, on nije preterano efikasan, jer alocira memoriju na serveru odjedanput u količini koja je jednaka veličini poslatog fajla. Šta ako je fajl, recimo, više gigabajta?
Za veoma velike fajlove možete da radite streaming sadržaja fajla koristeći sasvim normalne Stream metode, i alocirajući u memoriji odgovarajući bafer. Primer toga možete da vidite u istom solution-u u kojem se nalazi i web aplikacija, nalazi se u projektu za CLI aplikaciju. Objašnjenje koda nije teško, ali ostaje za još jedan blog post. 
Out.
B.D.
Pozdrav svima, i unapred izvinjenje na podužem postu, kao i na činjenici da dugo vremena nisam ništa postovao. U ovom postu ću pokazati kako se može integrisati podrška za indeksiranje i pretragu tekstualnih podataka i binarnih fajlova koja je integrisanja u SQL Server 2008 / R2 sa novim tipom kolone koji je dostupan od iste verzije, čuvenim FILESTREAM-om.
FTS i kako se pravi
FTS je skraćenica od Full Text Search i predstavlja servis unutar SQL Servera koji omogućava pretragu nad tekstualnim podacima.
Naravno, “pretraga nad tekstualnim podacima” nije baš sjajno objašenjenje. Do sada su progameri rešavali problem pretrage tekstualnih podataka unutar relacione baze ili korišćenjem LIKE predikata ili obavljanjem pretrage unutar aplikacije (korišćenjem f-ja za manipulaciju stringovima, regularnim izrazima, pravljenjem sopstveng ili korišćenjem gotovo full-tekst indeksa kao što je Lucene/Lucene.NET). Naravno, sa svim ovim rešenjima postoje određeni problemi, sa LIKE ponajviše. FTS unutar SQL Servera pokušava reši ovaj problem korišćenjem, s jedne strane, full-text indeksa, a s druge strane uvođenjem dva nova predikata koji daju mogućnost daleko bogatije pretrage od LIKE-a ili nekog sličnog rešenja.
FUll-text indeksi su bili standardna pojava već od SQL Servera 2000. Međutim, od te verzije, do verzije 2008 (pa samim tim i do verzije 2008 R2 koja je sada aktuelna), full-text indeksi su bili čuvani van SQL Server baze. Sam proces koji je koristio te indekse da bi pretraživao tekstualne podatke je takođe bio eksteran SQL Serveru. Od verzije 2008 SQL Servera, i indeksi, kao i proces koji ih pretražuje se nalaze unutar baze podataka. Pored pravljenja struktura u memoriji koji omogućavau daleko brži dolazak do sadržaja polja, omogućava i pretraživanje dokumenata.
Kada kažem “dokument”, mislim upravo na ono što vam pada na pamet: binarni fajlovi u, recimo, PDF, XPS, DOCS ili nekom trećem formatu. Ideja je da uzmete jedan dokument, smestite ga u varbinary(max) kolonu i pored njega postavite još jednu tekstualnu kolonu koja određuje ekstenziju. SQL Server FTS će koristiti kolonu u kojoj se nalazi ekstenzija (tip) fajla da učita filter koji može da otvori i pročita taj fajl. Filter je binarni kod koji implementira IFilter interfejs, i sličan je onome koji se koristi unutar Windows desktop pretrage.
Dakle, ako napravite ovakvu tabelu i napravite full-text indeks na njoj, FTS će umeti da izvuće tip fajla koji je skladišten u tabeli, da učita, ako je na raspolaganju, odgovarajući filter, otvori dokument i indeksira njegov sadržaj. Gornje “ako je na raspolaganju” je jako bitno jer ne dolaze svi filter OOB sa SQL Serverom. Da bi ste videli koji su filteri trenutno na raspolaganju u vašoj instalaciji SQL Servera, iskoristite sys.fulltext_document_types, a ako želite da vidite koji su filter učitani na SQL Serveru, pogledajte izlaz sp_help_fulltext_system_components storke sa ‘filter’ parametrom:
1: exec sp_help_fulltext_system_components 'filter'
FILESTREAM tip podatka
FILESTREAM tip je novina koja je uvedena u SQL-u 2008. U pitanju je tip koji rešava jedan poznat scenario. Imam potrebu da skladištim binarne fajlove u bazi podataka. Ukoliko krenem da rešavam taj problem, imam dva moguća rešenja:
- Smestim ceo fajl u neki BLOB u bazi. Iako na prvi pogled dobro rešenje, ima dosta problema, na prvom mestu to što su BLOB-ovi ui SQL Serveru ograničeni po pitanju prostora na čuvenih 2 GB po redu. Isto tako, rad sa ovim BLOB-ovima nije najsrećnije rešenje.
- Smestim ceo fajl na fajl sistem, a u bazi samo putanju do njega. Rešili smo problem prostora i “urednosti”, ali sada imamo problem držanja podataka u konzistentnom stanju, jer nam je jedan deo van baze podataka. Kada radimo, recimo, ROLLBACK transkacije, kada da izbrišemo fajl sa fajl sistema?
FILESTREAM radi tako što sa jedne strane skladišti u tabeli unutar SQL Servera pointer ka fajlu, a s adruge strane sam fajl fizički drži na fajl sistemu, na lokaciji na kojoj mi kažemo da bi trebalo da se drži pod nekim jedinstvenim GUID-om. Ideja je da se dobije najbolje od oba sveta: fajl sistem za skladištenje fajlova (što je njegov posao, na kraju krajeva) i relaciona baza podataka za rad sa njim transparentno. SQL Server se i dalje brine o tom fajlu, on učestvuje u svim transakcijama i tome slično.
Povezivanjem FTS-a i FILESTREAM-a, možemo da napravimo prilično zanimljive aplikacije.
Neke osnovne postavke
Pošto radimo sa bazom podataka, prvo ćemo da ustanovimo na kojoj bazi podataka radimo, odnosno koje su nam strukture tabela. Ime baze ovde nije toliko bitno, ali ono što jeste bitno jeste struktura tabele:
1: CREATE TABLE [Articles](
2: [artGUID] UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL UNIQUE,
3: Title nvarchar(max) NOT NULL,
4: Abstract nvarchar(max) null,
5: [Resume] nvarchar(max) null,
6: [Keywords] nvarchar(max) NULL,
7: [Type] varchar(5) NOT NULL DEFAULT '.docx',
8: [ArticleFile] [varbinary](max) FILESTREAM NOT NULL,
9: [CreateTimestamp] [timestamp] NOT NULL,
10: CONSTRAINT [PK_FTS_Articles] PRIMARY KEY CLUSTERED (artGUID ASC)
11: )
Iako prosta, ova tabela će nam poslužiti da ilustrujemo sve osnovne koncepte koji su nam potrebni. Primetite u liniji 8 FILESTREAM opciju. Ovo govori SQL Serveru da će ta kolona biti FILESTREAM. Stoga imamo i liniju 2, odnosno određivanje GUID kolone u tabeli, koja je nenophodna da bi FILESTREAM radio.
Korak 1: pravljenje full-text indeksa
Kreiranje full-text indeksa (od sada skraćeno FTI) je veoma prosto, i počinje prvo od kreiranja full-text catalog-a. Full-text katalozi sadrže u sebi sve indekse koje budete kreirali. Kao i sve druge T-SQL komande, ni ovo nije preterano teška:
1: CREATE FULLTEXT CATALOG TestFtsCatalog
Zatim možemo da krenemo sa pravljenjem indeksa na tabelama koje nas interesuju. FTI-evi se mogu praviti jedan po koloni, ali jedan indeks može sadržati više kolona; tipovi koji su dozvoljeni su bilo koji veliki tekstualni tipovi (NVARCHAR(MAX), TEXT, NTEXT), binarni tipovi (VARBINARY(MAX)) kao i XML tip. Kreiranje ove vrste indeksa se radi sledećom T-SQL komandom:
1: CREATE FULLTEXT INDEX ON
2: dbo.Articles(Title,Abstract,[Resume],[Keywords],ArticleFile TYPE COLUMN [Type])
3: KEY INDEX PK_FTS_Articles ON TestFtsCatalog WITH CHANGE_TRACKING = AUTO
Veoma jednostavno objašnjeno:
- Kreiramo indeks na tabeli, i prosleđujemo kolone na kojima želimo da napravimo indeks. Specijalna stvar ovde je TYPE COLUMN direktiva, koja određuje koja kolona će FTS-u dati informaciju o tipu fajla.
- KEY INDEX deo komande daje FTS-u ime indeksa koji jedinstveno određuje svaki red. U pitanju je ime indeksa, ne ime kolone.
- WITH CHANGE TRACKING je jasna sama po sebi, i određuje dinamiku populacije indeksa. Sa ovako postavljenom opcijom (AUTO), indeks će se populisati automatski sa promenom podataka u tabeli.
Sa ovom komandom imamo gotov indeks. Ono što je sada ostalo jeste da ubacimo nekoliko redova i da radimo
Korak 2: ubacivanje redova (fajlova)
Iako će se ovo činiit kao “varanje”, generalno nećemo sad apokazati verbatim komande za unos fajlova, pogotovo zato što bi se za to zahtevao programski kod. Umesto toga, pretpotavimo da sam ubacio jedan Word (DOCX) fajl. Ono što je jedino bitno jeste da se u tom fajlu nalazi nekoliko ključnih reči koje bi trebalo da potražim.
Korak 3: pretraga
Kada jednom imamo fajl unutar baze podataka, pretraga se radi na identičan način kao i kada pretražujemo “generalno” kolone sa FTS-om. Za to su nam ostavljena dva nova predikata, CONTAINS i FREETEXT, odnosno CONTAINSTABLE i FREETEXTTABLE ako želimo da dobijemo i rangiranje.
Sama pretraga se radi veoma jednostavno, uz pomoć gornjih predikata:
1: SELECT * dbo.Articles WHERE CONTAINS(ArticleFile,’query’)
CONTAINS predikat, kao što će dokumentacija pokazati, prima samo jednu reč, ali u sebi sadrži i omanji pod-jezik za pretragu. Ukoliko bismo želeli da dodamo i reč “performance” u pretragu, mogli bismo da kažemo sledeće:
1: SELECT * FROM dbo.Articles WHERE CONTAINS(ArticleFile,’query OR performance’)
Ali ako baš želimo OR logiku, možemo da iskoristimo i FREETEXT predikat, pošto on prima više ključnih reči, i podrazumeva OR logiku:
1: SELECT * FROM dbo:Articles WHERE FREETEXT(ArticleFile,’query performance’)
Kako god da želimo da uradimo, efekat je isti. FTS će iskoristiti indeks, pročitati iz njega da li imamo te ključne reči bilo gde, i ako imamo iste u fajlu, vratiće nam record sa tim fajlom. Ništa lakše, zar ne?
Sledeći koraci
Ovo je bio samo uvod u FILESTREAM i FTS mogućnosti SQL Servera 2008 / R2. O istima možete pročitati daleko više u odgavarjućim sekcijama BOL-a na MSDN-u ili TechNetu. U sledećem delu blog postova, prikazaću jednu prostu aplikaciju, i o istim trošlu pokazati kako možete da u VS2010, koristeći Entity Framework 4 i ASP.NET MVC napravite veoma jednostavnu aplikaciju za rad sa ovim mogućnostima.
Out.
B.D.
Posle dugo vremena nepostovanja ničega, ukratko smao da postavim linkove ka slajdovima i kodu koji sam koristio na ovogodišnjoj Sinergiji.
Slajdove (PPTX fajl) i demoe (.sql fajlove i zip sa VS2010 solution-om) možete naći na SkyDrive-u.
Naravno, ovde je kod sma za FILESTREAM i FTS deo. Isto tako, konačno mislim da sam našao vremena da završim blog post o korišćenju i jednog i drugog zajedno, tako da ako niste bili na predavanju, imaćete prilike da pročitate u čemu je poenta uskoro.
Out.
B.D.
OK, postoje trenuci kada zaista mislim da tamo “gore” (severno) sede neki ljudi, koji nešto kapiraju…kanda.
nuPack je komad softvera koji vam olakšava da pakujete bilbioteku u vašu .NET aplikaciju. Odete na http://nupack.codeplex.com/documentation?title=Getting%20Started, i pratite šta tamo piše. Kada instalirate ovu VS2010 ekstenziju, dovoljno je da u VS-u odete na View –> Other Windows –> Package Manager Console. Dobijete PowerShell konzolu i onda možete da krenete da radite sa njom. Možete i preko GUI-ja, naravno, na desni klik, ali ko još želi tako? (Pored toga nećete, ako ste ikada radili u ActiveState Perlu, osetiti oštru žaoku nostalgije jer sve ovo podseća na ppm). Reference za CLI komande se nalaze na http://nupack.codeplex.com/documentation?title=Package%20Manager%20Console%20Command%20Reference.
O istom trošku, možete da odete i na link za installer za MVC 3 beta i da njega skinete. Ovo još uvek nisam stigao da pogledam, ali sam čitao kod Breda Vilsona da je dodato dosta DI/IoC koda u sam MVC programski kod, radi lakšeg testiranja i kasnije, eventualne, izmene/zamene od strane korisnika.
Nadam se da imate da odvojite vikend…hm…moram da uradim nešto povodom ovoga… 
Out.
B.D.
WebMatrix je ime koje vraća uspomene. U vreme kada je .NET 1.1 bio aktuelan, Nikhil Kothari je napravio lagani alat, koji se mogao besplatno preuzeti, i koji je služio kao malo razvojno okruženje za ASP.NET razvoj. Imao je neke fine stvari, recimo radnu površinu sličnu kao i tadašnja verzija Visual Studia (2003 je bila aktuelna), bojenje sintakse, neki rudimentarni Intellisense ako se dobro sećam, i tome slično. Naravno, pojavom Express izdanja, WebMatrix je izgubio na značaju i tome slično. Ako vas interesuje malo istorije, onDotNet ima članak.
WebMatrix u novom ruhu
Juče smo izdali WebMAtric u novom ruhu. U pitanju je itegrisani alat za sve ljude koji žele da veoma brzo i jednostavno naprave web sajt, doteraju neki ili iskoriste postojeću web aplikaciju, a sve to na Microsoft web platformi. Više o njemu možete naći na WebMatrix matičnoj stranici.
Hteo sam da napišem svašta nešto korisno na ovu temu, ali sam onda pogledao i skapirao da “The Gu” ima jedan od svojih “epskih postova” u kojem imate sve detaljno opisano. Dovoljno je da odete na dotični post, i da pogledate o čemu se radi.
Pored toga, preporučujem da pogledate i tri druga blog posta koja je napisao, a koji predstavljaju pojedinačne prikaze nekih od kompomentni novog WebMatrix-a:
Out.
B.D.
Zabavno šta sve moja korporacija ume da napravi…http://msdn.microsoft.com/scriptjunkie, novi MSDN sajt fokusiran na CSS, HTML i JavaScript.
Out.
B.D.
I recently had the immense pleasure of presenting Microsoft’s PHP story in Tallinn, Estonia for around 2.5 hours. Since this blog post is also for the people who attended, it wil be in English (most of my other blog posts are in Serbian).
In case you didn’t know, Microsoft has done a lot in the past 4 years in terms of getting PHP running smoothly and speedely on Windows. This is not just to say that we wanted to improve the dev/test cycle of developing PHP apps, since Windows is used as a development operating system, but also the deployment part of the things. In order to do that, we implemented a lot of features in IIS 7.0 and onwards to that regard. The main one is FastCGI, an extension to the venerable CGI protocol, that allows the server to pool external processes, thus decreasing the cost of starting new PHP interpreter process, which on Windows is slow.
On top of that, we have developed a huge amount of stuff around PHP, like WinCache, the caching solution for PHP opcode, or the new SQL Server drive (currently in 2.0 development, you can get the CTP) to target SQL Server.
I have made the deck I presented available on my SkyDrive, and I would just like to provide several important links to all those who are interested in this topic.
That’s it from my side. Remember, make Web, not War. :)
Out.
B.D.
Ova priča će početi malo zaokolno. Kao što ste sigurno svesni, Microsoft je već nekoliko puta tokom (veoma intezivnog) testiranja Visual Studia 2010 objavio virtuelne mašine za testiranje proizvoda. Brian Keller je, međutim, izdao pravi dragulj, a to je jedna vrituelna mašina (u tri različita formata), sa sve podacima i napakovana do vrha svim mogućim softverom radi testiranja ALM mogućnosti VS2010 familijie proizvoda. Istu možete da skinete na ovom linku.
Gdin. Keller nije još uvek izdao refresh, a pošto svi znamo da se Visual Studio 2010 lako instaslira, odlučio sam da prosto napravim svoju kopiju ove mašine i da na nju instaliram RTM verzije svih potrebnih alata (uglavnom VS2010 Ultimate i TFS 2010).
Šok #1: TFS 2010 se deinstalira i instalira za oko 20-ak minuta!
Zaista za razliku od prethodne verzije (2008), TFS 2010 se deinstalirao dok sam rekao “keks”, a instalacija je trajala sveukupno 10 minuta. Jedan confg wizard posle instalacije, dobio sam kompletne podatke, pošto TFS 2010 sada konačno ima “upgrade” opciju koja radi savršeno.
Šok #2: web deployment zaista radi kako je reklamirano!
Naravno, da je sve prošlo kako treba, ne bi bilo ovog posta. Da bih se uverio da sve radi kako treba, pokrenuo sam Test Manager i pregledao postojeće testove za web aplikaciju koja se isporučuje uz ovu virtuelnu mašinu (radi oprobavanja svih novih funkcionalnosti, naravno).
Pokrenuo sam test, sve je lepo krenulo, do…recimo 2 koraka, kada mi je test runner javio da ne može da nađe link koji je potrebno da “pritisne” da bi se test nastavio na sledeći korak. Zbunjen, pogledao sam šta je došlo u instanci browser-a, i video samo prosto error stranu. Posle par pokušaja, shvatio sam da bi popravka tog web sajta, odnosno podešavanja, previše drugo trajala. Uostalom, isti taj projekat postoji i u source control sistemu, pa prema tome…krenuo sam ovako:
- Otvorio source control, i iz Main grane otvorio ceo solution.
- Lokalni build, ok, sve naizgled radi na development serveru.
- Pogledao podešavanja za publish/deploy za web projekte
- Napravio deployment package
- Napravio novi sajt u IIS-u, kliknuo desnim dugmetom na njega i rekao “Import application…”
I…novi sajt naravno radi. Jednu smicalicu kasnije, u kojoj sam prosto promenio binding-e dva sajta, svi testovi prolaze.
Koristite normalne alate
Naravno, cela pouka posta je u tome da se koriste normalni alati. Odnosno, koristite sisteme za verzioniranje koda i ako radite sa web aplikacijama, koristite web deployment alate koji su došli sa Visual Studiom 2010 pošto zaista olakšavaju život.
Out.
B.D.
Kao što svi verovatno znate, i kao što vam vaše MSDN pretplate mogu reći, Visual Studio 2010 je lansiranj 12. Aprila 2010. godine širom sveta. U Beogradu smo imali zvanični Launch događaj 27. Aprila 2010. godine, pa tim povodom želim da obavestim ljude da su prezentacije dostupne preko zvaničnog sajta VS2010 Launch-a. Ukoliko biste drugačiji pregled, iste možete da preuzmete i sa mog SkyDrive-a.
Slike i video fajlovi će biti dodati uskoro, dobićete obaveštenje blagovremeno.
Errata
Ko radi taj i greši, a u najboljem maniru izdavaštava želeo bih da dodam nekoliko ispravki, odnosno komentara na pitanja koja sam dobio tokom svojih sesija.
- RedirectPermenant() metod koji sam pominjao da je nov u ASP.NET Web forms 4 šalje HTTP zahtev 301, “Moved”, ne 302. 302 status kod označava standardnu redirekciju, odnosno šalje se kada server “nađe” resurs. 301 klijentu kaže da se resurs permanetno pomerio sa starog URL-a, te da stoga uvek taj resurs treba da traži na novom. Wikipedia vam je primarni resurs ako želite da se upoznate sa ostatkom HTTP status kodova.
- Web routing engine koji je deo .NET sveta još od 3.5 SP1 izdanja je sasvim sposoban, da se tako izrazim, da podnese i URL-ove koji su sa srpskim dijakriticima, odnosno u ćirilici. Ovo je imalo smisla i kada se malo bolje razmisli, jer se “šema” URL-a koji želimo da mapiramo uskladištena kao string, za kojeg znamo da je po default-u Unicode enkodovan. Naravno, ostaje da koristite i adekvatni URL, kao i da u RouteData.Values kolekciji ključ koristite u onom enkokdingu u kom ste definisali i šemu URL-a.
- TFS2010 “Basic” mod može da se instalira i na serveru. Ovo nisam napomenuo, odnosno nisam bio dovoljno jasan. Međutim, ideja je da ako već želite da imate dedikovan server za TFS, onda ne postoji razlog zašto ne biste instalirali i Reporting Services, odnosno SharePoint (WSS) i imali pune pogodnosti koje TFS donosi.
Out.
B.D.
Konačno…APS.NET MVC 2 je stigao do RTM faze. Više o ovome možete pročitati na blogu čuvenog Gatrija, Skota. Slede linkovi za preuzimanje, ali samo da napomenem da su ovo dodaci za Visual Studio 2008. Konačna verzija za Visual Studio 2010 će izaći kao deo samog VS-a i neće biti potrebna nikakva dodatna instalacija. Frameworko možete preuzeti:
Moja iskrena preporuka je da koristite WebPI, pošto je zaista sjajan alat i olakšaće vam život. Pre ovoga skinite ranije verzije framework-a ako ih imate instalirane.
Sledeći Code Camp event u Beogradu će sigurno imati jedno predavnaje posvećeno MVC-u, i verovatno ćemo pokriti baš verziju 2, odnosno novine koje dolaze sa njom. Naravno, bićete obavešteni na vreme.
Out.
B.D.
Ako kojim slučajem ne znate, Visual Studio 2010 je doživeo još jedno izdanje pre izlaska konačne, RTM verzije. U pitanju je RC, koji je sada dostupan svima (početkom nedelje je bio dostupan samo MSDN pretplatnicima). Glavni razlog izdavanja još jedne verzije posle Bete 2 su bile performanse. Naime, glavni feedback šire zajednice je bio da je VS2010 Beta 2 spora, odnosno da postoje određeni problemi sa performansama. “The Gu” ima detaljnije objašnjenje na svom blogu.
Za sada sam primetio da build, rad sa većim solution-ima i pokretanje testova zaista brže rade u RC-u nego ranije u Beti 2. Rad sa Web Forms dizajnerom je takođe dosta bolji, mada aplikacija na kojoj sam probao nije preterano kompleksna. Moraću još malo da probam, pogotovo build proces na TFS-u 2010.
Ako instalirate na računar koji već ima Betu, istu pre instalacije uklonite. Ono što je zabavno jeste instalacija TFS 2010 u “Basic” modu o kojem sam već pričao, ako ste pre toga koristili Betu 2 u istom modu.
Kada deinstalirate TFS preko Control Panel-a, wizard će ukloniti samo aplikativni sloj i bits sa mašine. Baze koje TFS koristi će ostati srećne i vesele u SQL Server instanci u kojoj su bile. Ovo je Jako Dobra Stvar (tm). Naime, kada sam krenuo u instalaciju TFS-a 2010 RC, uradio sam deinstalaciju Bete 2. Sama instalacija je protekla glatko, zatim sam pokrenuo wizard za konfiguraciju i odabrao opciju “Upgrade”. Jedino pitanje koje sam imao jeste da odaberem bazu koju je TFS koristio za skladištenje konfiguracije. Posle nekoliko next klikova, dobio sam 100% gotovu instalaciju TFS-a u Basic modu, sa očuvanim projektima, artefaktima u sors kontroli itd. Isti ovaj proces će biti upotrebljiv i za RTM verziju, i za “veće” instalacije TFS-a i druge verzije, dakle ne samo za Basic mod i ne samo prilikom prelaska sa pre-release na RTM verziju TFS-a 2010, već i prilikom prelaska sa 2008 na 2010 verziju TFS-a, recimo.
Morao sam da podelim sa širim svetom koliko sam impresioniran trudom koji je tim u Redmondu (i ostalim lokacijama u US gde se TFS pravi) uložio da (konačno) srede instalaciju, konfiguraciju i upgrade TFS-a.
Out.
B.D.
XSS je jedna od najopasnijih ranjivosti web-a, kada pogledamo šta je sve moguće s njom. Iako bi neki stručnjaci (kao recimo Blind Injection), sigurno daleko bolje i podrobnije objasnili o čemu se ovde radi, za potrebe ovog posta dovoljno je reći da je u pitanju iskorišćavanje jedne od osovnoh osobina browser-a, a to je da izvrši skript koji postoj ina strani. Zlonamerni korisnik ubacuje (“injektuje”) skript koji može da ima razne efekte, od krađe cookies koje korisnik ima, pa do redirekcije na neku stranu pravljenu za phishing.
OK, a kako to nastaje?
Postoje različiti načini kako da se skript “ubode” u HTML stranu, čak i ako ne koristite Rich Text editore. Problem nastaje kod ispisa onoga što je korisnik uneo, pogotovo ako to radimo bez ikakve provere. Recimo, imamo jedan textarea u koji želimo da korisnik upiše komentar koji posle prikažemo na strani. Ukoliko je ono što je korisnik napisao nešto bezazleno, to je OK, ali šta ako odluči da sadržaj textarea polja bude u stvari neki JS kod koji će uraditi nešto zlobno? Ja ga prosto ispisujem na strani, i presto!, nastaje problem.
Rešenje je prosto!
Enkodujte output. Ukoliko koristite ASP.NET, možete da koristite različite biblioteke, AntiXSS bilbioteka od Microsoft-a je jedna od boljih. ASP.NET MVC koristi helper metod Html.Encode() koji to isto radi. Isto tako, ASP.NET engine ima direktivu koja automatski baca exception ako se pojavi bilo kakav HTML kod u input stream-u, a koje se zove ValidateRequest.
Enkodovanje prosto zameni svaki karakter HTML kodom, tako da “<” postaje “<” i slično. Ovo omogućava da se HTML kod prikaže kao običan tekst u browser-u. Problem rešen.
Pa čemu onda blog post?
Jer ponekad postoji potreba, kao što je sada imam, da se korisnicima dozvoli da unose HTML kod. Pored toga, nije svaki HTML kod opasan; ne postoji ništa opasno kod sledeće kombinacije:
1: <p>Ja sam <b>boldovan</b>.</p>
Nedavno sam naleteo na problem da mi se traži da omogućim sređivanje dužih tekstova na web-u. Ništa specijalno, samo da se omogući pravljenje paragrafa, osnovna stilizacija teksta, dodavanje linkova…dakle, ništa “fancy”. Međutim, kada sam pogledao čak i minimalne RTE-ove, svaki od njih omogućava editovanje HTML koda direktno. Još gore, kada jednom omogućim ovako nešto korisnicima, ne mogu više da se oslanjam na Html.Encode(), jer na nekim ispisima moram da ga namenski isključim. Dakle, potrebna mi je sanitizacija.
Trenutno, ako pokušate da nađete rešenje za ovaj problem, verovatno ćete naići na razna rešenja koja koriste regex-ove. U poslednje vreme, ovakav pristup se smatra lošim, uglavnom jer ne pokriva sve slučajeve, recimo atribute na tagovima (pored toga, setimo se šta se priča za programere i regex-ove). Drugo rešenje je da imate neke od pseudo-markup editora, odnosno dijalekata, kao što su Markdown ili Textile. Ukoliko su vam korisnici sposobni da ovo koriste, problem je rešen. Na moju štetu, ovako nešto nije bilo moguće.
Posle pretrage, naleteo sam na verziju 3.1 AntiXSS bilbioteke. Na moje čudo, ta verzija je dodala dva nova metoda za sanitizaciju GetSafeHtml() i GetSafeHtmlFragment(). Prvi služi za sanitizaciju celih HTML strana, dok drugi služi za sanitizaciju fragmenata. Ono što će ova dva metoda uraditi je da uklone sve “štetne” tagove, odnosno, tačnije rečeno, sve tagove koji su u whitelist-u koji bilbioteka koristi interno. Korišćenje je veoma prosto:
1: string HtmlFragment = "<b>Some good input.</b><script>document.write('some bad input');</script>";
2: string sanitized = AntiXss.GetSafeHtmlFragment(HtmlFragment);
Posle ovoga, sanitizied string neće više sadržavati <script> tagove. Slično tome, kao dodatak, HTML će biti well-formed, u smislu da će svi nezatvoreni tagovi biti zatvoreni i slično. Nažalost, trenutno je dokumentacija pomalo škrta; kada jednom instalirate bilbioteku, imate test harness ali koji ne pokazuje sanitizaciju, kao i sample projekat k(web forms aplikaciju) koja vam daje ideju kako se AntiXSS bilbioteka i ceo security engine koji dolaze sa njom koriste. Da bih probao bilbioteku, napisao sam par (veoma) jednostavnih unit testova koji pokazuju kako se koristi bilbioteka. Projekat na SkyDrive-u, i možete ga preuzeti odatle.
Tema XSS-a je svakako daleko veća od ovog blog posta, ali sam želeo da dam odgovor ljudima koji možda takođe tragaju za pametnijim i robustnijim načinom sanitizacije nesigurnog HTML koda koji dolazi od korisnika, ali bez da ukinemo kompletno mogućnost korisnicima koji nisu toliko vešti u korišćenju računara da imaju lepo formatiran tekst na sajtu.
Out.
B.D.
Web-Fu! je još jednu godinu sa nama! :) 2009. godina je treća godina održavanja događaja (ili, kako mi to u Microsoft-u volimo da kažemo, event) koji je namenjen izlaženju iz formi standardnih Microsoft konferencija i događaja, i stavljanju fokusa isključivo na web platformu, alate, tehnike i rešenja koja se koriste ili tek dolaze iz Redmonda. Naravno, akcenat nije samo na prezentovanju novih proizvoda, već i praksi za razne probleme sa kojima se web developeri (i developeri koji se bave, u ma kolikom procentu, web-om) susreću svaki dan.
Ove godine smo se potrudili da agenda bude raznovrsna i da poseduje malo noviteta, malo praksi, malo naprednijih tema, a malo i stvari kojih možda niste bili svesni ni da postoje. Janko će, recimo, podeliti najbolje prakse u pravljenju web formi. Danijel će preći nove osobine Siliverght-a 4, čija je beta izašla prošlog meseca tokom PDC-a. Srđan i Nenad će zaroniti malo “ispod haube” dok predstavljaju REST tehnike i alate, kao i “Velocity”, respektivno. Sergej će prikazati većinu AJAX tehnika koje su dostupne tokom izrade ASP.NET aplikacija na primerima iz prakse. Konačno, moja malenkost će prikazati šaroliku lepezu “sitnih” alata za koje možda i niste znali da postoje, a mogu vam pomoći kada pravite web aplikacije.
Registracija, kao i sve ostale informacije, se nalaze na http://www.webfu.rs/. Naravno, događaj je, kao i prethodnih godina, besplatan, a dešava se 23.12. ove nam tekuće godine u Ateljeu 212 (centar Beograda, Svetogorska ulica).
Vidimo se tamo!
Out.
B.D.
More Posts
Next page »