Archive for the ‘Trips’ Category

TechEd BCN 2007 – Securing Your High-Risk ASP.NET Web Applications: A Case Study

november 13, 2007

Predavatelj: Dennis Vroegop, Detrio Consultancy b.v.

Dennis je predstavil svoje izkušnje pri izdelavi spletne aplikacije za prodajo hipotek za eno od nizozemskih bank. Predstavil je napake, ki so jih naredili in priporočil nekaj stvari, ki jih je treba narediti, da bomo imeli varno spletno aplikacijo:

  • Razdeli sistem na nivoje
  • Najemi ekipo strokovnjakov za varnost (po možnosti za vsak nivo v sistemu drugo)
  • Za vsak nivo izdelaj analizo tveganj
  • "Outsource"-aj vse kar lahko
  • Vsak korak naj pregleda zunanji revizor
  • Natančno opiši vse procedure delovanja

Povzetek: zagotavljanje varnosti je zapleteno in drago.

 

Povezave:

Open Web Application Security Project

Microsoft Baseline Security Analyzer

TechEd BCN 2007 – Real World Experiences in System.AddIn

november 10, 2007

Predavatelji: Jack Gudenkauf, Architect, Microsoft; Jesse Kaplan, Program Manager, Microsoft; Thomas Quinn

Šlo je za interaktivno predavanje, kjer so predavatelji v glavnem odgovarjali na vprašanja, tako da sem izvedel še nekaj novosti:

  • Arhitektura je zasnovana tako, da o v prihodnje lahko gostitelj napisan v eni verzijo .NETFX, add-in pa v drugi
  • Če hočemo odstraniti add-in iz pomnilnika (odnaložiti), mora biti v drugi appdomeni (appdomain). Tudi na splošno priporočajo (tudi zaradi varnosti), da je vsak add-in v svoji appdomeni. Nekje do 2000-4000 appdomen je še sprejemljivo.
  • Tehnologijo že uporabljajo v VSTO (Visual Studio Tools for Office) in VSTA (Visual Studio Tools for Applications), uporabljala pa ga bo tudi naslednja verzija VS.
  • Za namestitev lahko uporabimo tudi ClickOnce.
  • Če želimo npr. add-inu izpostaviti svoj toolbar ali menu to storimo preko objektnega modela (npr. metode AddToolbarButton, AddIcon, DoThisWhenUserClicksTheButton).
  • Prikaz UI-je add-in-a v gostitelju dela bolje, če je narejen z WPF
  • Imeti Out-of-process add-in je bolj varno in zanesljivo, pa tudi bolj počasi.
  • Add-in lahko najprej teče in-process in ga lahko šele naslednjič naložimo out-of-process
  • Do metapodatkov add-ina imamo dostop ne, da bi sam add-in sploh naložili. Tako lahko preverjamo ali ga sploh želimo naložiti.
Sytem.AddIn.Pipeline.QualificationData
  • Imeti “put-of-process” add-in je bolj varno in zanesljivo, pa tudi bolj počasi.
  • Add-in lahko najprej teče “in-process” in ga šele kasneje, če nam dela probleme naložimo “out-of-process”

Povezave:

http://blogs.msdn.com/clraddins

http://blogs.msdn.com/jackg

http://blogs.msdn.com/TQ

TechEd BCN 2007 – Bringing Extensibility to the Managed World: Using System.Addin to Find and Activate Add-ins in 3 Lines of Code

november 10, 2007

Predavatelja: Jack Gudenkauf, Architect, Microsoft; Jesse Kaplan, Program Manager, Microsoft

Zakaj razširljivost?

  • Omogočimo uporabnikom, da programu sami dodajo dodatno funkcionalnost
  • Spremenimo aplikacije v platformo
  • Lastno aplikacijo elegantno razbijemo na komponente

Tipi razširljivosti

  • Ponujanje storitve gostitelju (browser plugins, file type handlers, media player).
  • Gostitelj lahko nudi storitve add-in-u (automation, office-like extensibility)

Problemi, ki se pojavljajo v prvi verziji

  • Discovery (Odkrivanje)
  • Activation (Aktiviranje)
  • Isolation (Izolacija)
  • Lifetime Management
  • Sandboxing
  • Unloading

Problemi v drugi verziji (problemi za katere nisi vedel do te verzije)

  • Backward Compatibility
  • Forward Compatibility
  • Adding new isolation levels

Kaj je System.AddIn?

Prihaja z .NETFX 3.5 in nudi rešitve za probleme verzije 1 in 2. Ima arhitekturo, ki močno olajša izdelavo razširljive aplikacije.

  • “Moji” podatkovni tipi niso nikoli naloženi v “tvojo” domeno.
  • Gostitelja (Host) in add-in lahko verzioniramo ločeno (vsak imata svojo verzijo).

Gostovanje v 3 vrsticah kode

  • Namesti: dovolj je, da datoteko lahko skopiramo v določen direktorij
AddInStore.Update(path)
  • Najdi
IList<AddInToken> tokens = AddInStore.FindAddins(typeof(IMyAddin), path);
  • Aktiviraj
IMyAddin addIn = token.Activate(AddIn.SecurityLevel.Internet);

Implementiranje add-inov

  • Implementiraj interface
public class MyAddin: IMyAddin
  • Poimenuj add-in
[AddIn("MyAddin")]
public class MyAddin: IMyAddin

Arhitektura metulja

Da se izognemo problemom verzije 1 in 2 moramo tako na strani gostitelja kot add-ina imeti 2 stvari: pogled (view) in adapter. Med gostiteljem in add-inom pa je pogodba (contract).

Razno

  • V gostitelju lahko prikažemo uporabniški vmesnik add-ina.
  • Če je nek plug-in problematičen (počasen, rabi preveč pomnilnika), ga lahko odstranimo.
  • Če se nek add-in usuje, to lahko zaznamo in ga naslednjič ne naložimo
  • Add-inu lahko omejimo količino pomnilnika in CPU prioriteto, prav tako mu lahko določimo različne nivoje varnosti (internet, full trust)
  • Enkrat v naslednjih mesecih bodo izdali orodje (koda bo na voljo), ki bo na podlagi pogodbe (contracta) izdelala vso kodo (ogrodje), potrebno za implementacijo (adapter in pogled).
  • Zankrat stvar še ni podprta na Compact Framework-u, me je pa prosil, če mu pošljem mail in razložim v kakšnih primerih bi mi to prišlo prav.
  • V eni datoteki je lahko več add-inov.

Povezave:

http://blogs.msdn.com/clraddins

TechEd BCN 2007 – Test Driven Development in Practice – How does it really work?

november 10, 2007

Predavatelj: Mark Seemann, Senior Consultant, Microsoft Services

Predavanje je bilo bolj antireklama za TDD, ker je predavatelj kazal komplicirane primere/tehnike, ki v realnem življenju pridejo prav, vendar je 1 ura premalo, da bi jih lahko pameno razložil. Je pa omenil nekaj koristnih razredov in namespace-ov:

RecordExpectations
System.Configuration.Install

Povezave:

http://ayende.com

spring.net

Rhino Mocks

TypeMock

Castle Project

TechEd BCN 2007 – Understanding ASP.NET Internals

november 10, 2007

Predavatelj: Rob Howard, Telligent Inc.

ASP.NET je polna spletna request/response infrastruktura in razširljiva platforma (za dodatke skrbi aspnet_isapi.dll).

Za registriranje ASP.NET v IIS uporabimo ukaz:

aspnet_regiis.exe -i

HttpRuntime

HttpRuntime omogoča razširljivost in prilagajanje ASP.NET kot npr. izvajanje specifične avtentikacije (v ta namen bi lahko napisali HttpModule) ali, da prevzamemo nadzor nad slikovnimi datotekami – če bi radi na vsako sliko dali npr. svoj copyright (za take stvari se napiše HttpHandler). Je infrastruktura za procesiranje zahtev in odgovorov (request/response). Lahko teče v različnih gostiteljih (IIS 5, IIS 6, lahko napišemo svojo aplikacijo. Predavatelj je pokazal primer konzolne aplikacije, ki iz dinamične strani naredi statično (“file flattening”). To so naredili, ko so potrebovali boljše performanse. Primer take aplikacije je tudi spletni strežnik Cassini za katerega je na voljo tudi koda.

Interception Events

Podobni so ISAPI filtrom in omogočajo preusmerjanje odgovorov (repsonce-ov), prav tako pa lahko prekinejo zahtevo (request). Lahko ga implementiramo kot IHttpModule (priporočena metoda) ali pa v global.asax. Ker imamo lahko več modulov, se vrstni red izvajanja določi v web.config.

HttpHandler-je lahko implementiramo direktnov .ashx datoteki in ne rabimo posebnega razreda, ki bi implementiral IHttpHandler.

HttpContext

Vsebuje vse informacije o zahtevi (request) in za vsako zahtevo se naredi nova instanca. Lahko mu dodajamo svoje podatke (npr. custom session state).

Ideja: implemntacija poročil v obliki HttpHandler-ja.To tehniko uporabljajo v Community Server-ju za lažji izvoz poročil (.csv, .pdf).

Povezave:

http://weblogs.asp.net/rhoward

TechEd BCN 2007 – The Next Release of ASP.NET

november 9, 2007

Predavatelj: Matt Gibs, ASP.NET Development Manager

Čeprav ASP.NET 3.5 sploh še ni uradno zunaj, že delajo na novih stvareh (ASP.NET Futures). Naslednji CTP naj bi prišel ven enkrat decembra.

Novosti, ki prihajajo:

“Astoria” Data Services

Tu gre za REST dostop do podatkov. Podatki so identificirani z URL-om. Vse skupaj deluje neodvisno od formata.

http://localhost/sample.svc/ProductCategory(5)/Product

ASP.NET AJAX

V Visual Studiu 2008 so posodobili validatorje, TreeView, menu in web parte, da delajo z AJAX-om. Prav tako so dodali ListView.

V CTP-ju, ki prihaja bodo dodali logično navigacijo, kar omogoča npr. da imamo za vsak korak v čarovniku svoj zapis v zgodovini v brskalniku.

V verziji, ki bo izšla enkrat naslednje leto bodo dodali še možnost združevanja skript (če imamo na strežniku skripte na večih mestih, npr. datotekah, se bodo lahko prenesle na klienta kot ena sama skripta), kar naj bi močno izboljšalo performanse.

ASP.NET Silverlight gradniki

<asp: silverlight>

avtomatizira namestitev na klientu in kreiranje Silverlight plug-in-ov. Prav tako so dodani AJAX razredi za delo s Silverlight-om.

ASP.NET Dynamic Data

Gre za “application scaffolding”, kar v bistvu pomeni, da nam VS omogoča izdelavo polno funkcionalne CRUD spletne aplikacije v nekaj sekundah, saj sam izdela vse na podlagi podatkovne zbirke, ki jo imamo. Preverjanje podatkov, obliko in format izpisa nadzorujemo z definiranjem metapodatkov.

ASP.NET MVC (Model-View-Controller) Framework

MVC omogoča ločitev podatkov od uporabniškega vmesnika, kar zelo olajša testiranje. Prav tako imamo lahko bolj “čiste” URL-je, ki so “search engine and REST friendly”. Nad samim HTML-jem, ki ga izdela, imamo popoln dostop. Je popolnoma razširljiv, podpira tako statične kot dinamične jezike (IronPython, IronRuby). Še vedno lahko uporabljamo klasične ASP.NET storitve kot so “caching, session state” in podobno.

MVC se mi zdi zelo uporaben, vendar ima implementacija, ki so jo kazali še kar nekaj pomanjkljivosti (npr. vsi gradniki še niso podprti).

Povezave:

http://www.asp.net

TechEd BCN 2007 – Continous Integration with and without Visual Studio Team System

november 8, 2007

Predavatelj: Roy Osherove, SELA Group

S tega predavanja si velja zapomniti tri stvari:

  • Avtomatiziraj vse kar je mogoče.
  • Če začneš dovolj zgodaj, ni toliko dela, kot če začneš pozno.
  • Več kot integriraš, manj trpiš.

Povezave:

http://www.cruisecontrol.net

TechEd BCN 2007 – LINQ to XML

november 8, 2007

Predavatelj: Mike Taulty, Developer and Platform Group Microsoft UK

LINQ to XML je “DOM like” API, kar pomeni, da nalozi celotno XML drevo v pomnilnik in ga nato maniplira. Dela tako s celimi dokumenti kot s fragmenti. Dva kljucna razreda sta XElement in XAttribute.

Kreiranje

XElement root = new XElement("root");
XElement child = new XElement("child");
XAttribute attr = new XAttribute("attr", 104,5m);
root.Add(child);
root.Add(attr);

Branje

XElement.Load();
XDocument.Load();

Obe metodi podpirata branje iz URL-ja, XmlReader-ja, TextReader-ja. XElement ima več metod za navigacijo po “oseh”:

XElement.Descendants();
XElement.Ancestors();

LINQ pozna dva načina izvajanja poizvedb: del za delom (nad razredi, ki implementirajo IEnumerable) in vse v enem kosu (nad razredi, ki implementirajo IQueryable). LINQ to XML uporablja prvega (del za delom). Podpira vse lastnosti LINQ-a, kot so uporaba metod, kot je Distinct(), group by, join in podobno.

XElement data = XElement.Load(fileName);
var query = from c in data.Descendants("custmer")
    select (string) c.Attribute("id");

Spreminjanje

XML drevo ni samo za branje. XElement ima cel kup zanimivih metod, ki pridejo zelo prav pri manipuliranju drevesa:

XElement.Add();
XElement.Remove();
XElement.ReplaceWith();
XElement.AddBeforeSelf();
XElement.AddAfterSelf();
XElement.RemoveAttributes();
XElement.RemoveNodes();

Visual Basic ima še boljšo podporo za XML, saj je XML postal del jezika. VB sedaj tako pozna “XML literals”. Le ti omogočajo, pisanje kode, kot je ta:

Dim root = <root>
              <child>Value</child>
           </root>

Za boljšo podporo pri delu z velikimi XML dokumenti obstaja razred XStreamingElement.

Delo s shemami

Validacijo drevesa v XElement-u in XDocument-u lahko izvedemo s pomočjo metode .Validate.

XmlSchema schema = LoadSchema("file.xsd");
customers.Validate(schema, ValidationErrorHandler);

Oznake in dogodki (Annotations and events)

XML drevo lahko označimo s poljubnim objektom. Prav tako lahko s pomočjo “event handler”-jev zaznavamo spremembe v drevesu.

Povezave:

http://mtaulty.com

TechEd BCN 2007 – Unit Testing Tips, Tricks and Common Sense

november 7, 2007

Predavatelj: Roy Osherove

Dnevni red predavanja smo ustvarili udeleženci sami s predlogi in glasovanjem zanje. Ker je bilo premalo časa, smo predelali le 5 tem.

Testiranje uporabniškega vmesnika

Ne priporoča avtomatiziranega testiranja uporabniškega vmesnika, ker zahteva preveliko vložka za premalo rezultatov. To testiranje naj bi opravljali ljudje. Priporoča pa uporabo vzorcev kot sta MVC (Model-View-Controller) in MVP (Model-View-Presenter).

Testiranje podatkovnega nivoja (DAL) in podatkovne zbirke

DAL naj bi vedno testirali skupaj s podatkovno zbirko, ker le na ta način lahko stestiramo tudi stvari, ki so v sami zbirki (triggerji, stored procedure, …).

Pri tem testiranju se tudi pojavlja problem zagotavljanja neodvisnosti testov (kako zagotoviti, da en test ne bo vplival na drugega). V ta namen svetuje uporabo razreda TransactionScope (je v .NET 2.0 in naprej). Prav tako priporoča uporabo osnovnega razreda v katerem implementiramo to logiko transakcij (in drugo, ki je skupna vsem testom), in iz katerega podedujemo vse ostale, ki implementirajo teste.

Nekaj časa je porabil tudi za priporočila glede poimenovanja testnih metod. Ime naj bi bilo sestavljeno iz treh delov:

  • imena metode, ki jo testiramo
  • scenarija: pod kakšnimi pogoji naj se prej omenjena metoda izvede
  • obnašanja: kaj naj se zgodi ob takih pogojih
[Test]
public void DoSomeLogic_NullMsg_ThrowException();

Testiranje večnitnih aplikacij

Na njegovi spletni strani je na voljo knjižnica (ThreadTester), ki olajša to delo. Pri testiranju niti pravzaprav ne gre za “unit testing” temveč za integration testing, ker zadeve niso 100% ponovljive (zagotoviti želimo samo, da ne pride do “race condition-ov”).

NUnit Vs. MbUnit Vs. MStest 2008

MSTest < NUnit < MbUnit

Za začetnika priporoča uporabo NUnit-a, ko pa naleti na omejitve oz. ga že dovolj obvlada, pa naj preide na MbUnit.

Povezave:

http://www.iserializable.com

http://www.nunit.org

http://www.mbunit.com

http://www.testdriven.net

TechEd BCN 2007 – Microsft Visual C# Under the Covers: An in-depth Look at C# 3.0

november 7, 2007

Predavatelj: Luke Hoban, Program Manager, Microsoft

Auto-implemented properties

Namesto

public Class Point {
   private int x;
   private int y;
   public int X { get { return x; } set { x = value; } }
   public int Y { get { return y; } set { y = value; } }
}

sedaj lahko pišemo

public Class Point {
   public int X { get; set; }
   public int Y { get; set; }
}

Object initializers

var r = new Rectangle {
   P1 = new Point { X = 0, Y = 1 },
   P2 = new Point { X = 2, Y = 3 }
};

Collection initializers

var contacts = new List<Contact> {
   new Contact {
      Name = "Chris Smith",
      PhoneNumbers = { "206-555-0101", "425-882-8080" }
   },
   new Contact {
      Name = "Bob Harris",
      PhoneNumbers = { "650-555-0199" }
   }
};

Local variables type inference

// namesto
Dictionary<int, SomeType> myCol = new Dictionary<int, SomeType>();

// sedaj lahko napišemo
var myCol = new Dictionary<int, SomeType>();

Query expressions

from c in customers
group c by c.Country into g
select new { Country = g.Key, CustCount = g.Count() }

Anonymous types

var p1 = new { Name = "Lawnmower", Price = 495.00 };
var p2 = new { Name = "Shovel", Price = 26.95 };
p1 = p2;

Lambda expressions

x => x + 1                     // Implicitly typed, expression body
x => { return x + 1; }         // Implicitly typed, statement body
(int x) => x + 1               // Explicitly typed, expression body
(int x) => { return x + 1; }   // Explicitly typed, statement body
(x, y) => x * y               // Multiple parameters

Extension Methods

Omogočajo razširitev že obstoječih tipov z dodatnimi metodami. Spodaj je primer razreda z dvema takima metodama:

  namespace Acme.Utilities
{
   public static class Extensions
   {
      public static int ToInt32(this string s) {
         return Int32.Parse(s);
      }
      public static T[] Slice<T>(this T[] source, int index, int count) {
         if (index < 0 || count < 0 || source.Length – index < count)
            throw new ArgumentException();
         T[] result = new T[count];
         Array.Copy(source, index, result, 0, count);
         return result;
      }
   }
}

Expression Trees

Omogočajo, da so lambda izrazi predstavljeni kot podatki in ne kot koda.

Func<int,int> f = x => x + 1;                  // Code
Expression<Func<int,int>> e = x => x + 1;      // Data

Partial Methods

Implicitly-Typed Arrays