tag:blogger.com,1999:blog-8754051672781150902024-03-04T22:31:45.314-08:00Software Solutions LeonesRobert Wagenaar (Leones)http://www.blogger.com/profile/06816892092265950127noreply@blogger.comBlogger16125tag:blogger.com,1999:blog-875405167278115090.post-961295021591543082009-11-16T01:24:00.000-08:002009-11-16T01:46:25.127-08:00An error was discovered processing the <Security> headerBij de SoCard-koppeling kregen we een foutmelding door. De foutmelding was als volgt: An error was discovered processing the <Security> <security>header.<br /><br />De koppeling maakt gebruikt van WSE van Microsoft en stuurt in de aanroep dus iets mee voor de beveiliging.<br /><br />Nu blijkt dat de aanroep mislukte doordat de tijd van de server waar de aanroep vandaan gedaan wordt, niet in overeenstemming was met de server waar de aanroep naartoe gestuurd werd.<br /><br />De fout is de wereld uit door de tijd aan te passen op de server.Anonymousnoreply@blogger.com0tag:blogger.com,1999:blog-875405167278115090.post-50028574020551810682008-12-04T09:55:00.000-08:002008-12-04T10:21:42.127-08:00Software ontwikkelen met Firefox: DEEL 1<p>Firefox is een browser welke steeds vaker gebruikt wordt door software ontwikkelaars. Dit komt door de ondersteuning van verschillende tools, soms in vorm van een add-on, welke het ontwikkelen en debuggen van de front-end van een webapplicatie veel efficienter maken. In deze serie van blosg zal ik van een aantal features van firefox en een aantal add-ons bespreken hoe deze gebruikt kunnen worden tijdens de ontwikkeling van applicaties. </p><p><span style="font-size:100%;"><span style="color:#000000;"><strong>Simpele tips en tricks</strong></span></span></p><p><strong><span style="font-size:100%;"><span style="color:#000000;"><em>View-source</em></span></span></strong><span style="font-size:100%;"><span style="color:#000000;"><br />Met Firefox is het mogelijk om de <strong>bron van een pagina te bekijken </strong></span></span><span style="font-size:100%;"><span style="color:#000000;">zonder deze pagina eerst te bezoeken. Waarom zou je dit willen? Nou allereerst zijn er soms pagina's waarin je meteen wordt doorgestuurd naar een andere pagina, voordat je de pagina te zien krijgt. In dat geval kan het lastig zijn om het met een browser als Internet Explorer te verkrijgen. Stel je wilt de broncode zien van deze pagina, dan kan je simpelweg in de adresbar de volgende tekst typen:</span></span></p><p><span style="font-size:100%;"><span style="color:#000000;"><strong>view-source:</strong></span></span><span style="font-size:100%;"><span style="color:#000000;">http://softwaresolutionsleones.blogspot.com </span></span></p><p><span style="font-size:100%;"><span style="color:#000000;">view-source geeft aan dat je de broncode van dit bestand wilt bekijken. Dit opent dan netjes de broncode van de pagina in het scherm. </span></span></p><p><span style="font-size:100%;"><span style="color:#000000;"><em><strong>Error Console</strong></em><br />In tegenstelling tot Internet Explorer heeft Firefox een <strong>uitgebreide javascript debugger.</strong> Foutmeldingen welke in IE vaak cryptisch en onduidelijk zijn, worden beter omschreven in Firefox. Je kunt de error console vinden via Tools > Error Console</span></span></p><p><span style="font-size:100%;"><span style="color:#000000;">Behalve dat deze javascript foutmeldingen geeft, zijn hier ook HTML en CSS warnings te vinden. Deze foutmeldingen blijven hier staan totdat ze verwijderd worden, dus het kan zinvol zijn om gewoon eens door een webapplicatie te browsen, om vervolgens te kijken wat voor meldingen de Error Console geeft.</span></span></p><p><span style="font-size:100%;"><span style="color:#000000;">Ik heb nu twee simpele features van firefox belicht, welke mij ontzettend helpen bij het ontwikkelen van applicaties. Toch is dit nog maar het topje van de ijsberg. In een aantal volgende blogs zal ik het bijvoorbeeld nog hebben over Javascript Breakpointing, Preformance Analysis, DOM manipulatie en veiligheid van de applicaties. </span></span></p>Timohttp://www.blogger.com/profile/08371899725241514671noreply@blogger.com0tag:blogger.com,1999:blog-875405167278115090.post-57823046663262104022008-10-24T01:48:00.001-07:002008-10-24T02:05:16.865-07:00Probleem bij het valideren van een bankrekeningnummer en burger Service Nummer (BSN)Om te controleren of een gebruiker een geldig BSN of bankrekeningnummer heeft ingevoerd kan je de elf rpoef uitvoeren. De elfproef is een standaard waaraan alle Bankrekeningnummers (Niet Giro) en BS-nummers in Nederland aan moeten voldoen. De Elf proef voor het BSN kan worden uitgevoerd aan de hand van de volgende formule.<br /><br />(9*A + 8*B + 7*C + 6*D + 5*E + 4*F + 3*G + 2*H + (-1*I)) % 11 == 0<br /><br />IN deze formule corespondeerd A met het eerste getal van het nummer, B het tweede getal van het nummer, .. , I met het negende en laatste getal van het nummer. Als de rest deling van de som gelijm is aan nul is het een geldig BSN nummer. Dit heeft een manco, namelijk dat het BSN 000000000 ook als geldig wordt gezien (0 % 11 = 0).<br />De ElfProef voor een bankrekening nummer wijkt op één punt af van de elfproef voor de BSN. Het laatste cijfer in het nummer wordt dan niet vermenigvuldigd met -1 maar met 1.<br /><br />Hier onder staat een stukje code dat ik gebruikt heb voor de ElfProef van een BSN in de codebehind van een InfoPath formulier. Over het gebruiken van c# codebehind in combinatie met een infoPath formulier heb ik al een post gechreven. Klik <a href="http://softwaresolutionsleones.blogspot.com/2008/10/probleem-met-het-gebruiken-van-c.html">hier</a> om de post te bekijken.<br /><br /><br />public partial class FormCode<br />{<br />public void InternalStartup()<br />{<br />EventManager.XmlEvents["/my:mijnVelden/my:BSN"].Changed += new XmlChangedEventHandler(BSN_Changed);<br />}<br />public void BSN_Changed(object sender, XmlEventArgs e)<br />{<br />String bsnXpath = "//my:BSN";<br />XPathNavigator bsnBox = MainDataSource.CreateNavigator().SelectSingleNode(bsnXpath, NamespaceManager);<br />String BSN = bsnBox.Value;<br />String messageXpath = "//my:Message";<br />XPathNavigator messageBox = this.MainDataSource.CreateNavigator().SelectSingleNode(messageXpath, NamespaceManager);<br />if (BSN.Length == 9)<br />{<br />int A = int.Parse(BSN.Substring(0, 1));<br />int B = int.Parse(BSN.Substring(1, 1));<br />int C = int.Parse(BSN.Substring(2, 1));<br />int D = int.Parse(BSN.Substring(3, 1));<br />int E = int.Parse(BSN.Substring(4, 1));<br />int F = int.Parse(BSN.Substring(5, 1));<br />int G = int.Parse(BSN.Substring(6, 1));<br />int H = int.Parse(BSN.Substring(7, 1));<br />int I = int.Parse(BSN.Substring(8, 1));<br />int checkInt = 9 * A + 8 * B + 7 * C + 6 * D + 5 * E + 4 * F + 3 * G + 2 * H + (-1 * I);<br />if (checkInt % 11 == 0)<br />{<br />messageBox.SetValue("geldig");<br />}<br />else<br />{<br />messageBox.SetValue("ongeldig");<br />}<br />}<br />else<br />{<br />messageBox.SetValue("Een geldig BSN nummer bestaat uit 9 cijfers");<br />}<br />}<br />}Ferry Keesomhttp://www.blogger.com/profile/17506335854503393533noreply@blogger.com3tag:blogger.com,1999:blog-875405167278115090.post-5874824447219682982008-10-24T00:02:00.000-07:002008-10-24T00:47:37.250-07:00Probleem met het gebruiken van C# codebehind in combinatie met InfoPathOm meer geavanceerde functies toe te voegen aan een InfoPath formulier kan gebruik gemaakt worden van visual studio. De codebehind voor InfoPath kan geschreven worden in C# en VB. Om dit mogelijk te maken moet er een onderdeel van Microsoft office worden geinstalleerd (zie plaatje, Configuratiescherm>software>programma's wijzigen of verwijderen>Microsoft Office).<br /><br /><br /><br /><br /><img id="BLOGGER_PHOTO_ID_5260616678727377890" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 337px; TEXT-ALIGN: center" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifAupw0EplcCuvOQDAUWzYRnS5S7bGSjX4uAxIF-nkOpcpyNA4z4EXJbT3kYlTyD0_6ZOg6XiMQp3-xEkEXUAWxK2GiHpsU20TI3xmmd1IfoSHuDR4KMrwSV2sxroUScmBX1LhU6gfKog/s400/Hulpprog_instalatie.bmp" border="0" /><br /><br /><br /><p>Na de instalatie kan je op een control rechter muis knop drukken en vervolgens onder de knop Programmeren een functie van het onderdeel aanklikken. Hierdoor wordt als het goed is Visual studio geopend met wat gegenereerde code. Wordt de Microsoft Script Editor geopend dan kan je bij Extra>opties>Ontwerp of bij Extra>Formulieropties>Programmeren de programmeer taal waarin de codebhind wordt geschreven aanpassen (C#, VB, JScript of VBScript)</p><br /><br /><p>Als de 'Visual hulp-programma's voor toepassingen' zijn geinstalleerd en de gewenste programmeer taal is geslecteerd is er nog een instelling in InfoPath die geweizgd moet worden. Deze instelling is het beveiligings niveau van het InfoPath formulier. Deze instelling moet op Volledig vertouwen worden gezet. Als dit niet is ingesteld krijg je als je de codebehind uitvoerd een security exception. Je kan het beveiligings niveau aanpassen in Extra>Formulieropties>Beveiliging en vertrouwen.</p><p><img id="BLOGGER_PHOTO_ID_5260619873446074578" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 309px; TEXT-ALIGN: center" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj81_nZ4RL2XxiA1G7LGTt0GMvL4S0aSwN2eguFhk1S2OAvI4ZkEDqaQn-FdaLCV1VrReiSXSn_vS2VsHCbCOiHWGEtViBQTFpxLIzCK2wI2ugtkVFAljJca_FqICiqPfsaPnyJSsfUNJU/s400/Beveiliging+en+vetrouwen.bmp" border="0" /></p><p>Als je het InfoPath Formulier ook wil gebruiken moet er ook een handtekening worden toegevoegd aan het formulier. Dit gebeurd op de zelfde plek als het aanpassen van het beveiligings niveau.</p><p>Als je de stappen hierboven gevolgd heb kan je een InfoPath formulier aanmaken waarbij gebruik gemaakt kan worden van C# codebehind. Hieronder geef ik een aantal code voorbeelden voor het aanroepen en manipuleren van de controls op het InfoPath formulier.</p><p>Aanroepen van een control van het InfoPath formulier:</p><p>String controlXpath = "//my:Coltrol"; // 'Control' is de variabele naam van de control.<br />XPathNavigator control = MainDataSource.CreateNavigator().SelectSingleNode(controlXpath, NamespaceManager);</p><p>Opvragen en Aanpassen van waarde van een control</p><p>String value = control.Value;<br />control.SetValue("Een string") // In dit voorbeeld gaat het om een TextBox.<br /><br />Het is ook handig om te weten dat als je een in een Validatie event van een Control zit er geen anpassing gedaan kunnen worden bij andere controls (control.CanEdit = false).<br /><br /></p>Ferry Keesomhttp://www.blogger.com/profile/17506335854503393533noreply@blogger.com0tag:blogger.com,1999:blog-875405167278115090.post-88585269384401721502008-10-20T22:37:00.000-07:002008-10-20T23:20:22.161-07:00Problemen met PDF als Response in ASP.NET 2.0 (en hoger) en IE6<span style="font-family:verdana;">Met het downloaden van PDF-bestanden als Response in je ASP.NET-pagina's kun je nogal wat problemen tegenkomen. Wij hadden een goed werkende manier hiervoor, maar die wilde plotseling niet helemaal goed meer werken.</span><br /><span style="font-family:verdana;"></span><br /><span style="font-family:verdana;">Het volgende stukje code laat grofweg zien wat wij altijd hebben gedaan om een Stream als PDF-Response te versturen in ASP.NET:</span><br /><span style="font-family:courier new;"><span style="font-family:courier new;"><span style="font-family:courier new;"><span style="font-family:courier new;"><blockquote><span style="font-family:courier new;"><span style="font-family:courier new;"><p><span style="font-family:courier new;"><span style="font-family:courier new;">Response.Clear();<br /></span></span><span style="font-family:courier new;"><span style="font-family:courier new;">Response.ContentType = "application/pdf";</span><br /><span style="font-family:courier new;">Response.AddHeader("Content-Disposition", "attachment; filename=" + filename;</span><br /><span style="font-family:courier new;">Response.BinaryWrite(outputStream.ToArray());</span></span></p><span style="font-family:courier new;"><span style="font-family:courier new;"><p><span style="font-family:courier new;">// filename is een string met de bestandsnaam<br />// outputStream is een MemoryStream met daarin de PDF-inhoud</span><span style="font-family:courier new;"><br /></span></span></span></p></span></span></blockquote><p></span></span><span style="font-family:verdana;">We krijgen we dan een venster met daarin de vraag of we het bestand willen openen, willen opslaan of dat we willen annuleren.</span></p><p></span></span></p><span style="font-family:Verdana;">Bij een recent project dat we van ASP.NET 1.1 hebben omgezet naar ASP.NET 3.5 begonnen plotseling de problemen. In IE7 werkte alles nog goed, in Firefox werkte het ook nog naar behoren, maar in IE6 traad een vreemd probleem op. Bij het direct openen van het bestand kregen we de volgende foutmelding in Adobe Reader: <em>"There was an error opening this document. This file cannot be found."</em>. Als we het bestand echter eerst opsloegen en daarna openden dan was er geen vuiltje aan de lucht.</span> <p><span style="font-family:Verdana;">De oplossing bleek achteraf erg simpel. Slechts één regel code toevoegen:</span></p><span style="font-family:courier new;"><blockquote><span style="font-family:courier new;">Response.ClearHeaders();</span></blockquote></span><p><span style="font-family:Verdana;">De volledige code zier er dan als volgt uit:</span></p><span style="font-family:courier new;"><blockquote><p><span style="font-family:courier new;">Response.Clear();<br />Response.ClearHeaders();<br /></span><span style="font-family:courier new;">Response.ContentType = "application/pdf"<br />Response.AddHeader("Content-Disposition", "attachment; filename=" + filename;<br />Response.BinaryWrite(outputStream.ToArray());<br /><br />// filename is een string met de bestandsnaam<br /></span><span style="font-family:courier new;">// outputStream is een MemoryStream met daarin de PDF-inhoud</span></p></blockquote></span>Anonymousnoreply@blogger.com2tag:blogger.com,1999:blog-875405167278115090.post-84970375804772816472008-10-02T00:37:00.001-07:002008-10-02T00:37:47.218-07:00PDF-icoontje gebruiken in Sharepoint<span xmlns=''><p>Om PDF-icoontjes te kunnen gebruiken in je Sharepoint moet je voor de content query webpart al een bestandje icpdf.gif hebben aangemaakt in de images map.<br /></p><p>Om deze ook in de documentenlijsten te kunnen tonen moet je het volgende doen:<br /></p><ol><li>Save the image you wish to see as the PDF document icon to "\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\Template\Images\pdf.gif" - Images should be 15x15 pixels in size. (However the 17 x 17 icon from <a href='http://www.adobe.com/misc/linking.html'>http://www.adobe.com/misc/linking.html</a> works fine) <br /></li><li>Edit "\Program Files\Common Files\Microsoft Shared\Web server extensions\12\Template\Xml\DOCICON.XML" <br /></li><li>Add the following line <Mapping Key="pdf" Value="pdf.gif"/> <br /></li><li>run iisreset <br /></li></ol><p> <br /> </p><p>Hier gebruiken ze pdf.gif, maar dat kan natuurlijk wel worden gewijzigd in icpdf.gif, aangezien je niet tig dezelfde bestanden in die map wilt hebben staan.<br /></p></span>Michael Barendshttp://www.blogger.com/profile/01330753042392179974noreply@blogger.com0tag:blogger.com,1999:blog-875405167278115090.post-65146349172683707272008-10-02T00:24:00.001-07:002008-10-02T00:24:03.002-07:00Hide empty fields in sharepoint<span xmlns=''><p><strong>Probleem:<br /></strong></p><p>Voor een project waar we mee bezig zijn liepen we tegen het volgende probleem. Een detailpagina met cursusinformatie bevat enkele lege (niet ingevulde velden) welke niet moeten weergegeven worden. Deze pagina is opgezet als template in Sharepoint Designer zodat wij niet direct in de code-behind dingen hoeven aan te passen<br /></p><p><br /> </p><p>Hieronder een voorbeeld van een cursus<br /></p><div><table border='0' style='border-collapse:collapse'><colgroup><col style='width:121px'/><col style='width:490px'/></colgroup><tbody valign='top'><tr><td style='padding-left: 7px; padding-right: 7px; border-top: solid black 1.0pt; border-left: solid black 1.0pt; border-bottom: solid black 1.0pt; border-right: solid black 1.0pt'><p>Naam cursus:</p></td><td style='padding-left: 7px; padding-right: 7px; border-top: solid black 1.0pt; border-left: none; border-bottom: solid black 1.0pt; border-right: solid black 1.0pt'><p>Javascript voor gevorderen</p></td></tr><tr><td style='padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid black 1.0pt; border-bottom: solid black 1.0pt; border-right: solid black 1.0pt'><p>Doelstelling:</p></td><td style='padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid black 1.0pt; border-right: solid black 1.0pt'> </td></tr><tr><td style='padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid black 1.0pt; border-bottom: solid black 1.0pt; border-right: solid black 1.0pt'><p>Locatie:</p></td><td style='padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid black 1.0pt; border-right: solid black 1.0pt'><p>Almere</p></td></tr></tbody></table></div><p><br /> </p><p>De cursus wordt weergegeven in een tabel en op de plaats waar normaal de doelstelling wordt ingevuld staat nu een spatie ( )<br /></p><p><br /> </p><p><strong>Oplossing:<br /></strong></p><p>Je kunt in je template (of in je masterpage) wel JavaScript laten uitvoeren. De JavaScript functie doorloopt de tabel en kijkt voor ieder cel (td) of het leeg is, is het leeg dan wordt de rij (tr) niet weergegeven met behulp van CSS.<br /></p><p>Hieronder een voorbeeld:<br /></p><p><br /> </p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'><</span><span style='color:#a31515'>table</span><span style='color:blue'>><br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'> <span style='color:blue'><</span><span style='color:#a31515'>tbody</span><span style='color:blue'>><br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'> <span style='color:blue'><</span><span style='color:#a31515'>tr</span><span style='color:blue'>><br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'> <span style='color:blue'><</span><span style='color:#a31515'>td</span><br /> <span style='color:red'>class</span><span style='color:blue'>="CursusVeld"><br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'> Doelstelling<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'> <span style='color:blue'></</span><span style='color:#a31515'>td</span><span style='color:blue'>><br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'> <span style='color:blue'><</span><span style='color:#a31515'>td</span><br /> <span style='color:red'>class</span><span style='color:blue'>="CursusWaarde"><br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'> <span style='color:blue'></</span><span style='color:#a31515'>td</span><span style='color:blue'>><br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'> <span style='color:blue'></</span><span style='color:#a31515'>tr</span><span style='color:blue'>><br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'> <span style='color:blue'></</span><span style='color:#a31515'>tbody</span><span style='color:blue'>><br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'></</span><span style='color:#a31515'>table</span><span style='color:blue'>><br /></span></span></p><p><br /> </p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'><</span><span style='color:#a31515'>script</span><br /> <span style='color:red'>type</span><span style='color:blue'>="text/javascript"><br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>function</span> removeEmptyRows()<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'>{<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'> <span style='color:green'>//vraag alle td elementen op<br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'> <span style='color:blue'>var</span> e=document.getElementsByTagName(<span style='color:#a31515'>"td"</span>);<br /></span></p><p> <br /> </p><p><span style='font-family:Courier New; font-size:10pt'> <span style='color:blue'>for</span>(<span style='color:blue'>var</span> i=0;i<e.length;i++) classname =<span style='color:#a31515'>"="</span> innertext =<span style='color:#a31515'>"="</span> p =<span style='color:#a31515'>" e[i].parentNode;"</span> display =<span style='color:#a31515'>" 'none';"</span>><br /></span></p><p><span style='font-family:Courier New; font-size:10pt'>}<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'></</span><span style='color:#a31515'>script</span><span style='color:blue'>><br /></span></span></p><p><br /> </p><p>Vervolgens kun je of onderaan het template of in de onload functie van de body-tag het script laten uitvoeren en worden de lege rijen automatisch verborgen.<br /></p></span>Michael Barendshttp://www.blogger.com/profile/01330753042392179974noreply@blogger.com0tag:blogger.com,1999:blog-875405167278115090.post-90665430288131212032008-07-10T04:23:00.000-07:002008-07-10T04:45:02.297-07:00MOSS and editing user profiles!<div><strong>What is the problem?</strong></div><div><br /></div><div>When you go to to my settings in MOSS you see your profile details but when you click on edit you only see your account.</div><div> </div><div>MySettings userdisp page:</div><div></div><div><br /></div><div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjBkBSGrZha9s82P2nPkR2ZeiX1-9DBDl_5wnIF0vJA-2HMVi-6Cb-eDlEiNd5T3A3fZeWooDT7_Kr86f27clhRmiFQklNOZHgmOaeuDYPrKpA1S9G_ww7zhBc9-EpNM8M2V97dZ5st2w/s1600-h/userdisp.JPG"><img id="BLOGGER_PHOTO_ID_5221348614200600722" style="CURSOR: hand" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjBkBSGrZha9s82P2nPkR2ZeiX1-9DBDl_5wnIF0vJA-2HMVi-6Cb-eDlEiNd5T3A3fZeWooDT7_Kr86f27clhRmiFQklNOZHgmOaeuDYPrKpA1S9G_ww7zhBc9-EpNM8M2V97dZ5st2w/s320/userdisp.JPG" border="0" /></a><br /></div><div><br /></div><p>MySetting useredit Page:</p><div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3G4icTyV5xyuTTTio8hp6NUkSytAUdufzRdqF-42u2dc-Xru2G2U-XuHsgrgI7Ihm-rq6b2Ec7MkmcMNdGhKnQIG_qQvrpzCWoG6SPIengOyRWatv0J_w1qONc3S6b_TN4cKSzLOhspQ/s1600-h/useredit.JPG"><img id="BLOGGER_PHOTO_ID_5221348797778722530" style="CURSOR: hand" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3G4icTyV5xyuTTTio8hp6NUkSytAUdufzRdqF-42u2dc-Xru2G2U-XuHsgrgI7Ihm-rq6b2Ec7MkmcMNdGhKnQIG_qQvrpzCWoG6SPIengOyRWatv0J_w1qONc3S6b_TN4cKSzLOhspQ/s320/useredit.JPG" border="0" /></a><br /><br /></div><p></p><div><strong>What is the cause of this problem?</strong></div><div> </div><div>When i searched on the web for this problem i came accross this <a href="http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=2231241&SiteID=1">thread</a>:</div><div> </div><div>Rachel gave a good idea on why this problem occors she said:</div><div><br /></div><div>"There are actually 2 user profiles - one is a WSS profile and one is a MOSS profile. The WSS profile you access from Welcome user > My Settings page. The MOSS profiles are created when users are imported into the system from AD or LDAP. They are access from People Search or from a link off of your MySite.<br /><br />The reason there are 2 is that you can install WSS without MOSS and they wanted a basic user profile. If you installed WSS without MOSS, you would see the profile (again, accessed through Welcome user > My Settings page) with about 3 properties.<br /><br />If you install MOSS, do an import, and go to the WSS profile, you'll see a bunch of properties added that MOSS adds. We now depricate the WSS profile. If you want to add property values to your profile, you need to go to your MOSS profile from your MySite (MySite > Details). You'll be on the editprofile.aspx page. Add your properties. We then sync your properties to the WSS user list. You will see the values show up on the WSS profile after the sync happens."</div><div><br /></div><div>So i thought do i really need to use MySite some off our customers mayb don't want to use it and then this means they can't edit user info.</div><div><br /></div><div>But when i read what what rrdp said about that you can come in the editing page by directly going to editprofile.aspx.<br /></div><div><strong>So what is the solution?</strong><br /></div><div>The solution is simpler then you think go to the layouts map and copy your useredit.aspx page as a backup.<br /></div><div>then go to editprofile.aspx and copy the content of it. Open your useredit.aspx and past the content you just copied into the file save it. And your done!</div><div> </div><div>now when you click on edit you see this page:</div><div><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiojdyhyOPWXDRu1WA9g44cudRhZfi9RJRwzCJOa4DIMu8d5BAKJAt01TQ9m9RQ78ofQgEwWKzRor0VPn4qHedwBNFL2vV0N4sE859CmY03wR02OB3VyysZW7h4-Mu5sujdCwyXJH2nTdw/s1600-h/usereditafter.JPG"><img id="BLOGGER_PHOTO_ID_5221348954999316978" style="CURSOR: hand" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiojdyhyOPWXDRu1WA9g44cudRhZfi9RJRwzCJOa4DIMu8d5BAKJAt01TQ9m9RQ78ofQgEwWKzRor0VPn4qHedwBNFL2vV0N4sE859CmY03wR02OB3VyysZW7h4-Mu5sujdCwyXJH2nTdw/s320/usereditafter.JPG" border="0" /></a><br /></div><div><br /></div><div><br />Keep in mind to put the correct settings for this fields in the SharedService provider because it will overwrite field values when SSP imports the user profiles if you dont change the settings.<br /></div><div></div><div><br /><br /></div><div><br /></div><div><br /><br /></div><div></div>Michael Barendshttp://www.blogger.com/profile/01330753042392179974noreply@blogger.com2tag:blogger.com,1999:blog-875405167278115090.post-44669175013916409622008-05-26T10:38:00.000-07:002008-05-26T10:42:31.454-07:00DevDays 2008 (vrijdag) volgens Jan V<p style="font-family: arial;" class="MsoNormal"><span style="">Afgelopen vrijdag was het mijn beurt om ook eens naar de DevDays te gaan. Ik had mezelf redelijk goed voorbereid door al een paar weken vantevoren de sessies op te schrijven waar ik heen wilde gaan. </span><span style="" lang="EN-US">De sessies die mij het meest interessant leken waren:<br />1. Data protection with .NET Framework 3.5 and Cryptography Next Generation (Rafal Lukawiecki)<br />2. Is LINQ your data access layer? (<i style="">Anko Duizer</i>)<o:p></o:p></span></p> <p style="font-family: arial;" class="MsoNormal"><span style="" lang="EN-US">3. Understanding ADO .NET data services (<i style="">Mike Taulty</i>)<o:p></o:p></span></p> <p style="font-family: arial;" class="MsoNormal"><span style="" lang="EN-US">4. More intelligent applications using data mining (<i style="">Rafal Lukawiecki</i>)<o:p></o:p></span></p> <p style="font-family: arial;" class="MsoNormal"><span style="" lang="EN-US">5. Leveraging C#3.0 and LINQ (Best practice) (<i style="">Krishnan Subramanian</i>)<o:p></o:p></span></p> <p style="font-family: arial;" class="MsoNormal"><span style="">De ene sessie leek me wel leuker als de andere, maar dat blijf je toch houden.<o:p></o:p></span></p> <p style="font-family: arial;" class="MsoNormal"><span style="">Gelukkig stonden er afgelopen vrijdag nagenoeg geen files richting Amsterdam RAI, dus was ik nog net op tijd om de eerste sessie te volgen.<o:p></o:p></span></p> <p class="MsoListParagraphCxSpLast" style="text-indent: -18pt; font-family: arial;"><!--[if !supportLists]--><!--[endif]--><!--[if !supportLists]--><!--[if !supportLists]--><span style="">Rafal begon hier eerst met een ‘basis’ van cryptografie. Voor m’n MCTS examen heb ik hier ook het een en ander voor moeten leren, dus de basis begreep ik redelijk goed. Hij had het over wat momenteel de meest veilige manier was om je applicatie te beveiligen, bijvoorbeeld met smart cards. Ook noemde hij nog de twee functies <i style="">ProtectData</i> en <i style="">ProtectMemory</i> die je zeker moet kennen als je heel eenvoudig stukken code van je applicatie wilt beveiligen. Deze twee functies zijn beschikbaar vanaf versie 2.0 van het .Net Framework.<br />Vanaf versie 3.5 van het .Net Framework zijn er echter veel betere encryptie methoden beschikbaar. Verder kwam er nog een lijstje met methoden die je nu nog wel en niet meer mag gebruiken voor encryptie.<br />Het <b style="">wel</b> lijstje bestond uit:<br />Rijndael / AES 128<br />RSA 3072</span><span style=""><br />SHA-2 (als het moet)<br />DSA<o:p></o:p></span></p> <p class="MsoListParagraphCxSpLast" style="text-indent: -18pt; font-family: arial;"><span style="">Wat je <b style="">niet</b> meer moet gebruiken is:<br /><span style=""><span style=";font-size:7;" ></span></span></span><!--[endif]--><span style="">DES (Kerberos)<br /></span><!--[endif]--><span style="">IDEA<br /></span><!--[endif]--><span style="">RC2 / RC5<br /></span><!--[endif]--><span style="">Blowfish, Twofish (nou ja, deze zijn wel goed, maar niet standaard)<o:p></o:p></span></p> <p style="font-family: arial;" class="MsoNormal"><span style="">Ook noemde hij nog 2 functies welke je tegenwoordig kunt gebruiken voor encryptie. In het 3.0 Framework is dit bijvoorbeeld <i style="">RijndaelManaged</i> en het 3.5 Framework is de functie <i style="">AesManaged</i> geintroduceerd. Van wat ik begrepen heb zijn het beide implementaties van Rijndael.<o:p></o:p></span></p> <p style="font-family: arial;" class="MsoNormal"><span style="">Dit bovenstaande was echter nog maar het begin en er waren ook nog maar 20 minuten voorbij. Het leek trouwens wel alsof Rafal aan speed-talking deed zo snel ging het.<br />Nu begon het moeilijke gedeelte van de sessie. Hij begon ineens over <i style="">Suite-B</i>, een ‘nieuwe’ encyryptie methode welke onder andere is ontwikkeld door de NSA. De NSA zelf maakt gebruik van <i style="">Suite-A</i> wanneer iets boven het level ‘top-secret’ komt. Hierop maakte hij nog de opmerking dat Suite-B dus eigenlijk helemaal niet zo veilig was, maar gewoonweg het beste was wat er momenteel door het publiek kan worden gebruikt.<br />Suite-B maakt gebruik van ‘Elliptical Curve Cryptography’. Dit houdt in het kort in dat het sneller is, je hebt minder bits nodig en is minstens zo veilig als ‘oude’ methoden met meer bits. Vanaf dit moment werd het me allemaal een beetje te technisch en heb ik het niet meer zo goed kunnen volgen.<br />Wel heb ik nog een aantal aantekeningen kunnen maken van de stukken die ik wel snapte, maar het hele Suite-B verhaal heb ik zelf een beetje overgeslagen.<o:p></o:p></span></p> <p style="font-family: arial;" class="MsoNormal"><span style="">Tegen het einde aan noemde Rafal nog dat het gebruik van hashes helemaal niet zo veilig meer is, als je dit tenminste voor cryptografie wilt gebruiken. Hij stelde voor om een heel bericht te encrypten en dat dan te gebruiken als ‘hash’. Het nadeel hiervan is dat wanneer je een bericht van 1GB hebt, je ook een ‘hash’ van 1GB hebt. <o:p></o:p></span></p> <p style="font-family: arial;" class="MsoNormal"><span style="">Ik was blij dat dit bijna het einde was van die sessie, zodat ik even kon bijkomen van wat hij allemaal te zeggen had.<br />Een kort filmpje van de sessie is op Tweakers.net te vinden: <a href="http://tweakers.net/advertorials/devdays/video/20/data-protection-with-net-frameworks-35.html">http://tweakers.net/advertorials/devdays/video/20/data-protection-with-net-frameworks-35.html</a><o:p></o:p></span></p> <p style="font-family: arial;" class="MsoNormal"><span style="">De tweede sessie was voor mij al een stuk eenvoudiger om te volgen. Zelf ben ik namelijk al een tijdje bezig met LINQ te implementeren in m’n data access layer, dus was ik wel benieuwd wat anderen hiervan vonden.<br />Anko vertelde hier over de twee verschillende maniere hoe je L2SQL kunt gebruiken in je n-tier applicatie. Ten eerste als data layer en ten tweede als toevoeging in je data layer. <o:p></o:p></span></p> <p style="font-family: arial;" class="MsoNormal"><span style="">De eerste methode ben ik zelf niet zo’n enorme fan van. Het kwam er op neer dat je je dbml-bestand als DAL gebruikt en zo dus gelijk (in welke laag dan ook) je wijzigingen kunt wegschrijven. Hij gaf zelf ook al aan dat dit meestal niet echt gewenst is, aangezien je overal in je project DA code hebt staan en je bij wijzigingen dus je gehele project moet doorlopen. Het was daarentegen wel snel te implementeren.<o:p></o:p></span></p> <p style="font-family: arial;" class="MsoNormal"><span style="">De tweede methode, L2SQL gebruiken [b]in[/b] je DAL, vind ik zelf de beste oplossing voor nu. Je kunt zo beter je objecten afstemmen op wat je wilt gebruiken in je applicatie en je hebt maar op 1 plek in project de DA code staan. Het kost echter wel weer meer tijd om te maken in vergelijking tot de eerste methode.<o:p></o:p></span></p> <p style="font-family: arial;" class="MsoNormal"><span style="">Tijdens deze sessie kwam ik nog enkele leuke opties tegen die je kunt gebruiken met L2SQL. Dit waren bijvoorbeeld de mogelijkheden om <i style="">ContinueOnConflict</i> te gebruiken, een soort <i style="">On Error Resume Next</i>, <i style="">ResolveAll</i>, om een soort rollback te doen en <i style="">ChangeConflicts</i>. Deze waren volgens Anko nodig omdat L2SQL er van uit gaat dat het opslaan goed gaat en dat hoeft natuurlijk niet zo te zijn, aangezien het systeem aan dirty-reading doet, sowieso wanneer je een n-tier applicatie hebt.<o:p></o:p></span></p> <p style="font-family: arial;" class="MsoNormal"><span style="">Zelf was ik het niet met Anko op alle fronten eens, maar daar was ik er ook voor, om te kijken wat andere ontwikkelaars nou precies vinden van L2SQL en hoe te gebruiken.<o:p></o:p></span></p> <p style="font-family: arial;" class="MsoNormal"><span style="">De derde sessie ging over ADO.Net. Dit vond ik een enorm leuke sessie om bij te wonen. Mike kon het allemaal goed vertellen en ik werd enorm enthousiast om dit systeem te gaan gebruiken in een van mijn projecten. Waar het in het kort op neer kwam is dat je via een soort webservice (via WCF) queries kon doen via je webbrowser. Niet alleen simpele queries, maar ook behoorlijk geavanceerde queries. Als je je data service enigszins goed opzet dan kun je via foreign keys zo alles opzoeken van iemand. Wanneer ‘medewerker y’ bijvoorbeeld enkele klanten heeft die op hun beurt orders hebben geplaatst bij het bedrijf waar ‘medewerker y’ werkt, dan kun je via de querystring in je browser alle orders opzoeken die bij ‘medewerker y’ zijn geplaatst. Ook kan er worden gegroepeerd en derdelijke. Dit werkt allemaal met collecties die <i style="">AsQueryable</i> zijn. Je wilt natuurlijk niet altijd via een browser naar informatie zoeken en aangezien de collecties queryable zijn, kun je ook met het <i style="">Entity Framework</i> of L2SQL/L2O je gewenste objecten zoeken. Ik vond dit de meest interessante sessie van de dag. Rodi zat ook bij deze sessie, hij zag echter gelijk al de nadelen van de methode die Mike aan het vertellen was. Een van die nadelen was het beveiligen van je WCF webservice. Dat kan natuurlijk niet en je wilt niet je hele data omgeving blootleggen aan de buitenwereld. Dit is zeker een valide punt om het niet te gebruiken. Misschien dat ze daar nog over na gaan denken, of dat hier al lang een oplossing voor is. De techniek is in ieder geval ontzettend gaaf. Enkele links met meer informatie die Mike nog gaf waren <a href="http://www.datadeveloper.net/">http://www.datadeveloper.net</a>, <a href="http://www.miketaulty.com/">http://www.miketaulty.com</a> en <a href="http://blogs.msdn.com/astoriateam">http://blogs.msdn.com/astoriateam</a><br />De sites heb ik zelf nog niet bekeken, maar zodra ik weer eens tijd over heb zal ik dat zeker doen.<o:p></o:p></span></p> <p style="font-family: arial;" class="MsoNormal"><span style="">Mijn vierde sessie werd weer gegeven door Rafal, dit keer ging het over data mining. Eigenlijk wist ik niet precies wat ik moest verwachten, maar dat werd al snel duidelijk. Het ging er namelijk om dat door de gebruiker ingevoerde gegevens strookt met de werkelijkheid. Rafal gaf als een voorbeeld een formulier met soortgelijke gegevens als deze:<o:p></o:p></span></p> <p style="font-family: arial;" class="MsoNormal"><span style="">Naam: John<br />Geslacht: Female<br />Leeftijd: 900<br />Thuissituatie: Zoon van ouders<o:p></o:p></span></p> <p style="font-family: arial;" class="MsoNormal"><span style="">De <i style="">Analysis Services</i> van SQL Server geven nu een melding dat de gegevens waarschijnlijk niet kloppen. De leeftijd is bijvoorbeeld veel te hoog en het is onwaarschijnlijk dat iemand een vrouw is en tegelijk een zoon.<o:p></o:p></span></p> <p style="font-family: arial;" class="MsoNormal"><span style="">Deze onwaarschijnlijkheden worden niet zo uit de lucht gevist, maar worden berekend door Analysis Services aan de hand van honderden/duizenden/tienduizenden records die als verificatie dienen. AS vind namelijk patronen in die records en aan de hand daarvan berekend hij hoe waarschijnlijk het is dat de ingevoerde data klopt.<o:p></o:p></span></p> <p style="font-family: arial;" class="MsoNormal"><span style="">Het grote voordeel van dit systeem is dat je je logica voor een formulier niet meer zelf hoeft te maken, dat doet SQL wel voor jou. Dit scheelt uiteraard enorm veel ontwikkeltijd, omdat je dus niet meer tig if-statements hoeft te schrijven.<o:p></o:p></span></p> <p style="font-family: arial;" class="MsoNormal"><span style="">Het nadeel dat ik al snel kon bedenken is dat wanneer je een paar grapjassen hebt die een paar keer foute data in je database stoppen, je AS denkt dat dit valide is en op een gegeven moment dus niet meer meldingen geeft bij situaties als hierboven beschreven. Hier zul je dus alsnog alert om moeten zijn.<o:p></o:p></span></p> <p style="font-family: arial;" class="MsoNormal"><span style="">Dit is dus een leuke techniek, maar ik denk niet dat je het nu al kunt gebruiken in een productie omgeving bij een druk bezochte website.<o:p></o:p></span></p> <p style="font-family: arial;" class="MsoNormal"><span style="">De laatste sessie die ik heb gevolgd ging weer over LINQ en C# 3.0. Deze sessie vond ik wel iets interessanter dan die van Anko eerder die vrijdag. Je kon wel merken dat Krishnan een ontwikkelaar is en geen vertegenwoordiger of iets dergelijks, dat hoop ik tenminste, want het ontbrak hem een beetje aan presentatie skills. Dat geeft verder niet, want z’n verhaal was wel goed. Hij gaf enkele voorbeelden hoe je je partial methods kunt gebruiken met LINQ. Zelf gebruik ik die ook al, maar met de hij gaf ook als voorbeeld om de <i style="">OnValidate</i> functie te gebruiken in je partial method. Hier had ik zelf nog niet aan gedacht, maar is wel een goede suggestie. Je kunt dan tijdens het valideren al zien of de data in een object wel of niet juist is.<br />Ook gaf hij een mooie oplossing om N:N-relaties te maken met L2SQL. Officieel kan dit niet, maar hij gaf er een mooie work-around voor. Hierdoor heeft hij wel wat credits van me gekregen. Wat wel jammer is, is natuurlijk dat hij de gegevens alleen maar ophaalde uit de database en niet weer terug schreef. Echter, zal het in de praktijk waarschijnlijk niet vaak voorkomen dat je in 1 mutatie N:N inserts wilt doen, dus op zich was het wel te begrijpen. De oplossing die hij gaf was om een property te maken van <i style="">IEnumerable<t></t></i> en die in je partial class te zetten waar je dat object in wilde hebben. Dit was wel een goed idee van hem waar ik zelf nog niet aan had gedacht, dus was het toch ook weer nuttig om deze sessie bij te hebben gewoond.<br />Om je query dynamisch te maken maakte hij gebruik van [i]predicates[/i] in de where-clause van je L2SQL query. Dit is niet gelijk fout natuurlijk, maar het geniet toch mijn voorkeur om hiervoor echt Lambda expressies te gebruiken, waar ik al eerder over heb geschreven ( <a href="http://www.jan-v.nl/ViewPost.aspx?PostID=aeb2009d-2624-dd11-afa4-003048874dd5">http://www.jan-v.nl/ViewPost.aspx?PostID=aeb2009d-2624-dd11-afa4-003048874dd5</a> )<br />Een filmpje van een eerdere sessie van Krishnan is hier te vinden: <a href="http://tweakers.net/advertorials/devdays/video/21/linq-trekt-volle-zaal%21.html">http://tweakers.net/advertorials/devdays/video/21/linq-trekt-volle-zaal!.html</a><br />De mensen in het commentaar daar vinden hem een goede spreker, nou ja, meningen kunnen verschillen natuurlijk. Wat ze wel goed opmerken is dat het goed is dat hij live code klopt, je zou dit ook als nadeel kunnen opmerken trouwens.<o:p></o:p></span></p> <p style="font-family: arial;" class="MsoNormal"><span style="">Op zich was ik blij dat de dag voorbij was, want het was toch zwaarder dan ik had verwacht. Al met al heb ik behoorlijk wat informatie opgedaan. In eerste instantie ga ik waarschijnlijk niet gelijk met alles aan de slag, maar het is wel goed om het in het achterhoofd te houden. Op naar volgend jaar!<o:p></o:p></span></p>Jan Vhttp://www.blogger.com/profile/06428672893342986534noreply@blogger.com0tag:blogger.com,1999:blog-875405167278115090.post-80919338492333346302008-05-26T01:50:00.000-07:002008-05-26T01:52:53.492-07:00DevDays 2008 volgens RodiBDonderdag is MartinS op mijn pas geweet en vrijdag was het dan eindelijk mijn beurt om een bezoekje te plegen aan de DevDays van dit jaar. De eerste sessie die ik op het programma had staan was van Alex Thissen over het ASP.NET MVC Framework. MVC staat voor Model-View-Controller en is een interessant design pattern waar Microsoft dus een eigen Framework voor aan het bouwen is. Dit Framework is nog niet af en kan in details nog wel veranderen, maar je kon er een goede indruk van krijgen. Omdat ik verkeerd was gelopen en aan de andere kant van de RAI bij een andere sessie uitkwam, kon ik geen plaatsje meer veroveren en moest ik de hele sessie staan. Mede daarom heb ik ook geen aantekeningen gemaakt.<br /><br />Als je gebruik maakt het MVC Framework, gooi je een hele hoop functionaliteit de deur uit en kun je niet meer vertrouwen op de Page Lifecycle; Page_Load en andere (postback) events zul je niet meer op de normale manier gebruiken; veel Server Controls werken niet. Een request komt binnen op de Controller, die bepaalt wat er precies gevraagd wordt en zorgt dat de juiste gegevens worden uitgewisseld met het Model om vervolgens de juiste View (pagina/aspx) op te starten en gegevens aan mee te geven. Een Request gebeurt wel met een mooie url in de zin van: <a href="http://www.mijnwebsite.nl/Artikel/Edit/67">www.mijnwebsite.nl/Artikel/Edit/67</a>. Deze ‘routes’ zijn helemaal te configureren met standaard waarden voor elk onderdeel uit de url en wat al niet meer, nu nog in de global.asax, maar wellicht straks ook in de Web.config. Wat wel een grote drempel voor mij en vele andere ASP.NET ontwikkelaars zal zijn, is dat de View (de aspx) erg veel gaat lijken op oude asp. Je ‘for loopjes’ komen tussen de html te staan en je maakt zelf je html op; wel zijn er veel hulpfuncties om html te genereren voor bijvoorbeeld dropdowns en textboxen, maar het wordt toch weer de ouderwetse wirwar van code en html. Een van de grootste voordelen die altijd worden genoemd, is dat dit design pattern de testbaarheid van je presentatielaag velen malen groter maakt en het wordt dan vaak ook aangehaald in combinatie met TDD (Test Driven Development), hoewel daar ook wel Model-View-Presenter voor wordt gebruikt, een iets andere variatie op MVC. Om dit te benadrukken wordt een MVC project in Visual Studio altijd automatisch voorzien van een testproject.<br /><br />De vraag blijft staan of dit Framework toegepast moet/kan worden in toekomstige projecten of niet. Sommige projecten zijn minder geschikt dan andere en er zal een grote omschakeling moeten komen van de ontwikkelaars. Wat de keuze nog moeilijker maakt, is dat het design pattern zo cool is en dat het heel goed bijdraagt aan ‘Seperation of Concerns’, dus het scheiden van code met elk een ander doel in de applicatie.<br /><br />De tweede sessie had als titel ‘Is LINQ your Data Access Layer’ en werd gepresenteerd door Anko Duizer. Wederom was ik te laat voor een stoel, maar hier kon je redelijk relaxed achteraan op de grond hangen en toch nog wat volgen. Twee stellingen werden er voorgelegd: LINQ to SQL is de DAL en LINQ to SQL wordt gebruikt in de DAL.<br /><br />Als LINQ to SQL (vanaf nu gewoon LINQ voor het gemak) de DAL is, dan zal eventuele business logica ook in deze laag moeten zitten en is het dus eigenlijk twee lagen in één. Voordelen zijn o.a. simpel en snel om te gebruiken, dus goed voor RAD, binding is heel goed geregeld. Nadelen zijn o.a. dat er nagenoeg een 1 op 1 mapping is tussen Relationele DB structuur en Object structuur in code en dat je dus een mix krijgt van Presentatie, Business en Data Access. De uitbreidingen die je maakt (business logica) zijn wel mooi weg te stoppen in Partial Classes/Methods. Van 1 tabel met een soort Type-veld is het mogelijk om obv dat veld onderscheid te maken en er een base-class van te maken met meer dan één afgeleide classes (BaseUser -> Author en Publisher).<br /><br />Als LINQ wordt gebruikt in de DAL zul je een betere scheiding kunnen realiseren, maar is er ook veel meer werk nodig. Voordelen zijn o.a. dat je een echte DAL hebt, dat je een betere mapping hebt naar je eigen Domain Model (Business Entiteiten / Information Packages), dat het mogelijk is om nog te switchen naar andere techniek, omdat het een eigen laag is. Nadelen zijn o.a. dat er veel meer code nodig is en dus veel meer tijd zal kosten; bovendien moet er veel meer nagedacht worden over bepaalde obstakels die je zal tegenkomen. Omdat alles in een DataContext zit opgesloten is het lastig om de objecten naar de Presentatielaag te serialiseren en weer terug te deserialiseren. Hier zijn 3 methoden voor: LNQ to SQL Entities (de meest simpele), POCO’s (Plain Old CLR Objects, meeste werk, maar ook meest clean door gebruik van eigen Domain Model / Information Packages) en DataSets (veel support, maar ook beperkingen). Normaal wordt gebruik gemaakt van Deferred Loading, wat inhoud dat er pas iets uit de DB wordt gehaald op het moment dat je het in je code (in een loop bijvoorbeeld) nodig hebt. Dat is na serialisatie naar de Presentatielaag natuurlijk niet meer mogelijk, dus je moet van te voren bepalen wat je nodig hebt: heb je bijvoorbeeld alleen de Orders nodig of wil je ook alle Orderregels erbij hebben?<br /><br />Algemeen zijn er nog wat opmerkingen te maken. LINQ to SQL is standaard optimistisch qua concurrency, wat inhoudt dat je zelf conflicten moet afhandelen als Dirty Reads e.d. Het is mogelijk om een cache mismatch te krijgen, doordat de DataContext los van de database staat. Een gebruiker zal dan vreemde resultaten te zien krijgen.<br /><br />Het antwoord op de vraag die in de titel van de sessie wordt genoemd, is niet anders te beantwoorden dan met iets als: “Het kan, maar het hangt ervan af.” Als je je eigen Domain Model wilt behouden, dan moet je het gebruiken in je DAL en kan het niet de DAL zijn. Wat je je dan wel goed moet afvragen, is of LINQ to SQL je dan voordeel oplevert t.o.v. gewoon ADO.NET. In mijn eigen beleving is dit niet het geval, zeker niet als je je bedenkt dat we al een hele opzet hebben voor een DAL. Het voordeel van LINQ to SQL zou dan vooral zijn dat er heel veel wordt gegenereerd en je dus minder (steeds weer dezelfde) code hoeft te schrijven.<br /><br />Na de lunch stond “Understanding ADO.NET Data Services” op het programma. Dit gaat over een tegenhanger van Web Services en worden ook wel RESTful Services genoemd. Data Services gaat volledig over http en maakt gebruik van het pure http-protocol. Het is dus geen SOAP. WCF kan onderliggend gebruikmaken van REST en van SOAP, dus je blijft de keuze houden; Microsoft gooit SOAP niet weg na zoveel investeringen.<br /><br />Elk soort data kan gebruikt worden over deze Data Services. Ophalen van gegevens is eenvoudig, maar voor een update moet er veel moeite gedaan worden. In het toekomstige Entity Framework zal een ObjectContext beschikbaar zijn; als je daarvan gebruik maakt is ook het updaten weer eenvoudig geworden.<br /><br />Wat erg mooi is, is dat je je volledige datasource al kan zien/testen via de url van je browser. Je krijgt dan alles wat je opvraagt (inclusief query-achitge zaken als top, startpositie, filter etc.) in XML. Ook in de code is het erg makkelijk om een query te schrijven tegen een Data Service; dit is zelfs mogelijk met LINQ: de LINQ query wordt dan vertaald naar een Data Service query. En wat ook erg handig en makkelijk is, is dat dit ook erg eenvoudig vanuit Javascript is te doen, dus voor AJAX.<br /><br />De vierde sessie was moeilijk te kiezen, want eigenlijk spraken de titels me allemaal niet aan. Ik heb gekozen voor Parallel Extensions to the .NET Framework, gepresenteerd door een echt grappige kerel: Daniel Moth. Deze Extensions zijn nog in de maak en er is nu pas een eerste openlijke beta/ctp uit; het enige wat zeker is, is dat het niet dit jaar uitkomt. Ook zullen wij er als Web Developers niet veel mee te maken krijgen. In het begin stonden er quotes op het scherm die we konden lezen; wel interessant wat men denkt over de toekomst van normale desktops pc’s: meer Hz is niet goed meer te doen door de beperkingen in koeling van de chips; in de laatste twee jaar zijn we daardoor heel snel al naar Quad cores gegaan voor de normale consument. Volgens de wet van Moore verwachten ze dat we binnen tien jaar al mainstream pc’s hebben met 80 cores (dat hoeft niet perse 1 cpu te zijn natuurlijk). Het is daarom belangrijk om je te richten op het efficiënt gebruiken van de cores. De Parallel Extensions moeten dat makkelijker gaan maken. Het biedt een laag niveau API dat je niet hoeft te gebruiken, maar wel beschikbaar is en twee meer bruikbare/simpele API’s die daarop gebouwd zijn. De ene is slimmer dan de Thread Pool class, maar minstens zo uitgebreid en bruikbaar als de Thread class, de tweede is een uitbreiding op LINQ en kan LINQ query’s heel makkelijk uitbreiden voor multiple cores.<br /><br />De laatste sessie was: “Leveraging C#3.0 and LINQ (Best Practice)”, en beetje saai en de spreker probeerde grappig te zijn, maar was het niet. Misschien lag het ook deels aan mijzelf, maar ik kon mijn gedachten er niet goed bijhouden. Toch heb ik nog wel een paar dingen genoteerd. Voor de rest kun je bij JanV zijn, want die heeft deze sessie ook gevolgd.<br /><br />Met Partial Classes kun je goed uitbreiden. Wil je in LINQ op een mooie manier n op m relaties leggen (dus relaties die een koppeltabel nodig hebben), dan kun je zelf een property maken in de ene class die een List van e andere teruggeeft. De getter van de property loopt dan door de ‘koppeltabel’ heen om de juiste items terg te geven. Het is ook mogelijk om met een extra property enkele properties samen te voegen in 1 nieuwe property van een eigen type. Als je bijvoorbeeld adresgegevens los hebt staan in een tabel, dan kun je deze private maken in LINQ. Vervolgens kun je een Adres-Class maken en een nieuwe property van het type Adres. In het adres geef je dan de afzonderlijke (private) adresgegevens terug.<br /><br />In LINQ is paging standaard ingebouwd! Je doet in een LINQ query gewoon heel gemakkelijk “.skip(x).take(y)” om x items te skippen en vervolgens y items op te halen. LINQ zal er dan zelf voor zorgen dat de meest optimale query wordt uitgevoerd. In SQL2005 zal dit vaak met ROW_NUMER() zijn (behalve op de eerste pagina (optimaal dus)) en in SQL 2000 zal de query een stuk ingewikkelder zijn. Het mooie is dus dat je daar zelf niets meer mee te maken hebt.<br /><br />Al met al was het dus een interessante dag. Ik vond het minder dan vorig jaar, maar misschien komt dat doordat er vorig jaar nog allemaal spannende onbekende nieuwe dingen waren die heel erg uitgebreid belicht werden, maar er nog niet waren. Nu ging het vooral wat dieper op de dingen in de nu al uit zijn, maar dan soms ook weer niet diep genoeg, niet met de juiste uitgangspunten (voor mij) of een beetje te chaotisch (zoals de laatste sessie). Maar dat betekent niet dat het geen geslaagde dag was; ik heb toch weer wat geleerd.Anonymousnoreply@blogger.com0tag:blogger.com,1999:blog-875405167278115090.post-20156841308832578862008-04-02T01:32:00.000-07:002008-04-02T03:21:47.637-07:00Search Engines & ASP.NET 2.0Een hoge notering op zoekmachines willen we natuurlijk erg graag, maar om in de resultaten van zoekmachines voor te komen, moet de zoekmachine de site wel kunnen indexeren. Dat lijkt allemaal vanzelfsprekend, maar is dat ook zo? Met ASP.NET 2.0 kan daar een addertje onder het gras zitten.<br /><br />Sommige sites maken standaard gebruik van cookies, bewust of onbewust. Zonder aanpassingen wordt voor <em>Session state</em> gebruik gemaakt van een cookie met daarin het ID van de <em>Session state</em>, zodat deze terug te leiden is naar een specifieke gebruiker. Dat is op zich geen probleem voor de meeste zoekmachines, maar kan toch gevolgen hebben voor een slechte indexering in combinatie met ASP.NET 2.0.<br /><br />Crawlers van zoekmachines identificeren zichzelf vaak als Mozilla/5.0. Ze doen dit om ervoor te zorgen dat meer sites ze op een goede manier accepteren en er dus meer sites geïndexeerd kunnen worden. Ook Google doet dit sinds 2006:<br /><ul><li><span style="font-size:85%;">Voor: Googlebot/2.1 (+http://www.googlebot.com/bot.html)</span></li><li><span style="font-size:85%;">Na: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)</span></li></ul><br />In ASP.NET 2.0 wordt gekeken naar de <em>User agent</em> en wordt vervolgens in de browserdefinities, die bekend zijn, gekeken welke mogelijkheden worden ondersteund, zoals javascript en cookies. Als de <em>User agent</em> niet herkend wordt, wordt gebruik gemaakt van de standaard browserdefinitie (<em>default.browser</em>), waarin beschreven staat dat cookies worden ondersteund. In het geval van de zoekmachines wordt de browserdefinitie van Mozilla (<em>mozilla.browser</em>) gevonden en wordt daarin opgezocht welke versie en welke variant wordt gebruikt. Er is echter geen definitie voor de generieke Mozilla/5.0, dus wordt de meest relevante definitie gebruikt, wat neerkomt op Mozilla/1.0 en er dus voor zorgt dat ASP.NET 2.0 vindt dat er geen cookies ondersteund worden en zorgt er dan voor dat het ID van de <em>Session state</em> in de url wordt meegestuurd.<br /><br />Als je hier problemen van ondervindt en je site wordt niet goed geïndexeerd door zoekmachines - zoekresultaten naar je site bevatten de ID's van de Session state en werken daardoor niet, er worden niet of nauwelijks pagina's geïndexeerd of de crawler stuit op foutmeldingen bij het indexeren - dan is het mogelijk om zelf een browserdefinitie op te geven die ervoor zorgt dat de zoekmachines wel worden herkend met mogelijkheden als cookies.<br /><br />In de speciale map <em>App_Browsers</em> kun je het bestand met de juiste browserdefinites opslaan. Het is niet nodig om de applicatie opnieuw te compileren, dus het kan zonder problemen in bestaande, draaiende applicatie toegepast worden.<br /><br />Bij bestaande, draaiende applicaties kun je de map zonder problemen aanmaken en het bestand naar deze map kopiëeren. In de ontwikkelomgeving is het verstandig om het op de volgende manier te doen:<br /><ol><li>Om de map <em>App_Browsers</em> aan te maken, klik je met de rechter muisknop op het betreffende <em>Web Application Project</em> en kies je voor <em>Add > Add ASP.NET Folder > App_Browsers.<br /></em><a href="http://bp0.blogger.com/_KGsJ4xMiKVM/R_NdzH5HvOI/AAAAAAAAAAU/MF632Abv_Vo/s1600-h/App_Browsers.jpg"><img id="BLOGGER_PHOTO_ID_5184590728906915042" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_KGsJ4xMiKVM/R_NdzH5HvOI/AAAAAAAAAAU/MF632Abv_Vo/s200/App_Browsers.jpg" border="0" /></a></li><li>Vervolgens kopiëer je het bestand met de juiste browserdefinitie in Visual Studio (dus niet de verkenner) naar deze map.</li></ol>Je kunt het bestand met de browserdefinities <a href="http://www.leones.nl/leones/browserdefinities.zip">hier</a> downloaden.<br /><br /><br /><br /><br /><br /><span style="font-size:85%;">Oorspronkelijke blogpost waar het meeste van deze informatie gevonden is: <a href="http://www.kowitz.net/archive/2006/12/11/asp.net-2.0-mozilla-browser-detection-hole.aspx">http://www.kowitz.net/archive/2006/12/11/asp.net-2.0-mozilla-browser-detection-hole.aspx</a></span>Anonymousnoreply@blogger.com0tag:blogger.com,1999:blog-875405167278115090.post-39922617968817802932008-02-23T04:16:00.000-08:002008-02-23T04:27:08.277-08:00Korte introductie van verschillende LINQ soorten<p face="verdana" class="MsoNormal">Met de komst van het nieuwe .Net Framework 3.5 kunnen ontwikkelaars nu ook gebruik maken van een nieuwe feature welke schuil gaat onder de naam LINQ.</p> <p face="verdana" class="MsoNormal">LINQ is een verzamelnaam voor, momenteel, 3 verschillende onderdelen. </p> <p face="verdana" class="MsoNormal">Ten eerste is er <b style="">LINQ to Objects</b> (<b style="">L2O</b>).</p> <p face="verdana" class="MsoNormal">Met L2O kunnen ontwikkelaars met behulp van LINQ-queries zoeken in verzamelingen van objecten. Een voorbeeld hiervan is een <i style="">ArrayList</i>. Tot op heden moest men altijd gebruik maken van for-loops om objecten in zo’n verzameling te zoeken, dit is met de komst van L2O verleden tijd. Met een LINQ-query kun je namelijk een selectie maken van de objecten die aan je eisen voldoen.</p> <p face="verdana" class="MsoNormal">Ten tweede hebben we <b style="">LINQ to XML</b> (<b style="">L2XML</b>).</p> <p face="verdana" class="MsoNormal">Net zoals met L2O, is het met L2XML mogelijk om te zoeken naar objecten, elementen of bijvoorbeeld waarden, dit doormiddel van een LINQ-query. Dit heeft ook weer als voordeel dat je niet meer zelf code hoeft te genereren om een XML-document in te lezen in een XMLDocument en hier stap voor stap door te lopen, net zo lang totdat je iets hebt gevonden dat je zocht. Met L2XML schrijf je een query met de LINQ-syntax en .Net zorgt voor de rest. Behalve dat dit vele regels code scheelt, bespaard het ook veel ontwikkel tijd.</p> <p face="verdana" class="MsoNormal">Ten derde kunnen we nu gebruik maken van <b style="">LINQ to SQL</b> (<b style="">L2SQL</b>).</p> <p face="verdana" class="MsoNormal">Zelf vind ik het werken met SQL en databases in het algemeen leuk en interessant werk, vandaar dat L2SQL mij het meest aanspreekt en ik hier ook iets verder over ga uitweiden. Met behulp van L2SQL wordt het mogelijk gemaakt om vanuit je .Net code dynamische queries te genereren welke op de database worden uitgevoerd. De queries zijn het beste te vergelijken met de aloude dynamische SQL statements welke men vroeger vaak ook in de code had staan. De afgelopen jaren is er een trend geweest om dynamische SQL in code niet meer te gebruiken en alleen nog maar gebruik te maken van stored procedures. Deze verschuiving van werkwijze was ook meer dan logisch, aangezien dynamische SQL statements behoorlijk veel veiligheidsrisico’s met zich mee kunnen brengen. In een tijd waar veiligheid hoog in het vaandel staat kun je dat dus niet gebruiken.</p> <p style="font-family: verdana;" class="MsoNormal">Het voordeel van L2SQL is dat je de flexibiliteit van dynamische SQL statements hebt, maar de veiligheid van stored procedures. Wanneer je een LINQ-query maakt, dan wordt deze ‘vertaald’ naar een <i style="">parameterized query</i> welke wordt uitgevoerd op de database. In figuur 1 is een voorbeeld te zien hoe een LINQ-query wordt vertaald in een SQL-query</p> <a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG5KXb1-7tT5pZb62yU-VbURWc5rPTDvEeBxrLzk2x_D3fZjXH-849JBqnzlmqN_YVH5ON3mPQxDK2D_Gj4B8hbrpr_iQQvog2BO3NS0sqwm-Urh-igHp2wgB0A9acDvf2nk8rObBFRGY/s1600-h/query.jpg"><img style="cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG5KXb1-7tT5pZb62yU-VbURWc5rPTDvEeBxrLzk2x_D3fZjXH-849JBqnzlmqN_YVH5ON3mPQxDK2D_Gj4B8hbrpr_iQQvog2BO3NS0sqwm-Urh-igHp2wgB0A9acDvf2nk8rObBFRGY/s400/query.jpg" alt="" id="BLOGGER_PHOTO_ID_5170149597517724354" border="0" /></a> <p class="MsoNormal" style="text-align: center; font-weight: bold;font-family:verdana;" align="center"><span style="font-size:78%;">Figuur 1</span></p> <p class="MsoNormal" style="text-align: center; font-family: verdana;" align="center"><o:p> </o:p></p> <p style="font-family: verdana;" class="MsoNormal">De queries die ik zelf heb gemaakt zijn redelijk eenvoudig en ook goed te bevatten voor een ontwikkelaar die nog niet eerdere een LINQ-query heeft gezien. Een voorbeeld alhier:</p> <p class="MsoNormal" style="font-family:courier new;"><span style=";font-size:85%;color:blue;" >var</span><span style="font-size:85%;"> <span style="color: rgb(1, 0, 1);">query</span> = <span style="color:blue;">from</span> <span style="color: rgb(1, 0, 1);">item</span> <span style="color:blue;">in</span> <span style="color: rgb(1, 0, 1);">dataContext</span>.<span style="color: rgb(1, 0, 1);">GetTable</span><<span style="color: rgb(1, 0, 1);">Information</span>.<span style="color: rgb(43, 145, 175);">Item</span>>()<o:p></o:p></span></p> <p class="MsoNormal" style="font-family:courier new;"><span style="font-size:85%;"><span style=""> </span><span style="color:blue;">select</span> <span style="color: rgb(1, 0, 1);">item</span>;</span></p> <p style="font-family: verdana;" class="MsoNormal"><span style="font-size:100%;">Deze LINQ-query heeft nog behoorlijk veel weg van een ‘normale’ SQL-query, echter zijn de verschillen ook duidelijk zichtbaar.</span></p> <p style="font-family: verdana;" class="MsoNormal"><span style="font-size:100%;">Als eerste valt op de term </span><span style=";font-family:courier new;font-size:85%;color:blue;" >var</span><span style="font-size:100%;">. Dit is een nieuw type dat is geintroduceerd in het .Net Framework 3.5. Heel kort door de bocht is het type </span><span style=";font-family:courier new;font-size:85%;color:blue;" >var</span><span style="font-size:100%;"><span style="font-size:85%;"><span style="font-family:courier new;"> </span></span>niets anders als een declaratie voor een generic object. Uiteraard zijn er vast wel verschillen op te noemen, maar zelf vind ik het wel een prettige gedachte om het zo te benoemen. <o:p></o:p></span></p> <p style="font-family: verdana;" class="MsoNormal"><span style="font-size:100%;">Verder is in deze query te zien dat men nu gebruik kan maken van de termen </span><span style=";font-family:courier new;font-size:85%;color:blue;" >from</span><span style=";font-family:courier new;font-size:85%;" > </span><span style="font-size:100%;">en </span><span style=";font-family:courier new;font-size:85%;color:blue;" >select</span><span style="font-size:100%;"><span style="font-size:85%;"><span style="font-family:courier new;"> </span></span>in Visual Studio, welke we eerder al kenden van SQL-queries. Met LINQ hebben beide termen eigenlijk dezelfde functie behouden, namelijk bij </span><span style=";font-family:courier new;font-size:85%;color:blue;" >from</span><span style="font-size:100%;"><span style="font-size:85%;"><span style="font-family:courier new;"> </span></span>wordt gekozen uit welk object er een selectie moet plaatsvinden en bij </span><span style=";font-family:courier new;font-size:85%;color:blue;" >select</span><span style="font-size:100%;"><span style="font-size:85%;"><span style="font-family:courier new;"> </span></span>wordt aangegeven wat er moet worden geretourneerd.<o:p></o:p></span></p> <p style="font-family: verdana;" class="MsoNormal"><span style="font-size:100%;"><o:p> </o:p></span></p> <p style="font-family: verdana;" class="MsoNormal"><span style="font-size:100%;">Het bovenstaande is nog redelijk eenvoudig, maar het moge duidelijk zijn dat met de komst van LINQ er behoorlijk veel tijd kan worden bespaard in de ontwikkeltrajecten. <o:p></o:p></span></p> <p style="font-family: verdana;" class="MsoNormal"><span style="font-size:100%;">Door L2SQL hoeven er immers niet meer tientallen, danwel honderden, stored procedures te worden gemaakt/gegenereerd voor eenvoudige CRUD-acties. Door L2XML is het niet meer nodig om tientallen regels code te schrijven om een XML-document te doorzoeken en door L2O hoeven ontwikkelaars niet meer tig </span><span style="font-size:100%;">foreach</span><span style="font-size:100%;">-loops te maken in de code. Over het algemeen betekend minder code ook dat er minder bugs gemaakt kunnen worden, wat dus automatisch resulteert in stabielere applicaties.<o:p></o:p></span></p> <p style="font-family: verdana;" class="MsoNormal"><span style="font-size:100%;"><o:p> </o:p></span></p> <p style="font-family: verdana;" class="MsoNormal"><span style="font-size:100%;">Een goede bron van informatie over LINQ is het weblog van Scott Guthrie. Hier heb ik zelf veel kennis opgedaan van de mogelijkheden over LINQ: <span style="font-size:85%;"><a href="http://weblogs.asp.net/scottgu/archive/tags/LINQ/default.aspx">http://weblogs.asp.net/scottgu/archive/tags/LINQ/default.aspx</a></span></span></p><span style=";font-family:verdana;font-size:100%;" ><br /></span>Jan Vhttp://www.blogger.com/profile/06428672893342986534noreply@blogger.com1tag:blogger.com,1999:blog-875405167278115090.post-50971971591399864552008-02-21T10:26:00.001-08:002008-02-21T10:28:16.903-08:00SharePoint features deel 1<div><span xmlns=""><br /><p><span style="font-family:Verdana;font-size:9;"><strong>Wat is een Feature?<br /></strong></span></p><br /><p><span style="font-family:Verdana;font-size:9;">Bij het ontwikkelen van op maat gemaakte oplossingen voor Windows SharePoint Services of Microsoft Office SharePoint Server 2007, is het van belang dat de ontwikkelaar goed begrijpt wat features zijn. Hiermee worden niet de standaard features bedoelt die in SharePoint geïntegreerd zijn, maar functionaliteiten/Features die de ontwikkelaar wil toevoegen aan de SharePoint oplossing.<br /></span></p><br /><p><span style="font-family:Verdana;font-size:9;">Feature of functionaliteiten geven de ontwikkelaars de kans om elementen aan SharePoint sites toe te voegen. Deze elementen kunnen automatisch geactiveerd worden binnen een gekozen SharePoint Site of zelfs binnen een hele Site Collectie. Voorbeelden van elementen die gedefinieerd kunnen worden zijn onder andere lijst types, lijst instanties, menu commandos/links, pagina templates, pagina instanties, Event handlers, workflows etc.<br /></span></p><br /><p><span style="font-family:Verdana;font-size:9;"><strong>Hoe zitten Features in elkaar?<br /></strong></span></p><br /><p><span style="font-family:Verdana;font-size:9;">Een Feature bestaat uit een folder die aangemaakt is in een speciale WSS systeem folder binnen het filesysteem van elke front-end Web server. De folder van een feature bestaat uit één of meerdere xml gebaseerde bestanden die Collabarotive Application Markup Language of kort gezegd CAML bevatten. Elke Feature folder bevat een manifest file genaamd feature.xml. Dit bestand definieert de hoge-level attributen zoals zijn ID en de Naam.<br /></span></p><br /><p><span style="font-family:Verdana;font-size:9;">Naast een feature.xml bestaat een feature meestal nog uit andere xml bestanden zoals element.xml die de eigenlijke elementen van de feature beschrijft. Ook zouden er nog andere bestanden in kunnen staan voor templates, bijvoorbeeld een document template voor je lijst instantie/type of resources met afbeeldingen etc.<br /></span></p><br /><p><span style="font-family:Verdana;font-size:9;">Om een betere indruk te krijgen van de opzet van een feature zou je naar de voorgedefinieerde features kunnen kijken die in WSS/MOSS aanwezig zijn. Hieronder zie je In <strong>Figuur 1 </strong>bijvoorbeeld de voorgedefinieerde features van WSS. De feature directory van MOSS zal er heel anders uitzien omdat deze meer dan 100 voorgedefinieerde features bevat.<br /></span></p><br /><p><span style="font-family:Verdana;font-size:9;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEis47URdERPiPBdGof1QextwHnXW2cnX-765cIKNuL8mibX-neYHQ0R8coVN7Ob8zSIvJjpO5aDiXKT4J6H33KSz_oH1NwPbaAmpAYyjpjm1DN__Yyl-BNBloTTP-PN8b60oyyIwRACnQ0/s1600-h/wssstandardfeatures.gif"><img id="BLOGGER_PHOTO_ID_5169501835328982354" style="CURSOR: hand" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEis47URdERPiPBdGof1QextwHnXW2cnX-765cIKNuL8mibX-neYHQ0R8coVN7Ob8zSIvJjpO5aDiXKT4J6H33KSz_oH1NwPbaAmpAYyjpjm1DN__Yyl-BNBloTTP-PN8b60oyyIwRACnQ0/s320/wssstandardfeatures.gif" border="0" /></a><br /></span></p><br /><p><span style="font-family:Verdana;font-size:9;"><strong>Hoe maak ik een feature?<br /></strong></span></p><br /><p><span style="font-family:Verdana;font-size:9;">Een Feature is op verschillende manieren te bouwen. Hieronder vindt u 3 bekende methodes:<br /></span></p><br /><ol><br /><li><span style="font-family:Verdana;font-size:9;">Je maakt een folder aan binnen de feature map van SharePoint(C:/Program Files/Common Files/Microsoft Shared/web server extions/12/TEMPLATE/Feature. Nadat de feature is aangemaakt installeer je de feature via de command line tool van Visual Studio. Deze methode heeft natuurlijk als groot nadeel dat er in de directory van je server wordt gewerkt, en dit is niet altijd wenselijk.<br /></span></li><br /><li><span style="font-family:Verdana;font-size:9;">Je maakt voor je Feature een lege Visual Studio class library aan en ontwikkelt hierin de feature. Er zijn op internet tal van blogs/sites te vinden die hierbij kunnen helpen. Zelf heb ik veel aan <a href="http://www.codeproject.com/KB/sharepoint/ExtendingSPS.aspx">deze site</a> gehad. Op dezelfde pagina is nog meer info te vinden over wat features zijn. Er is tevens te lezen dat het erg veel werk is om op die manier een feature in je SharePoint omgeving te krijgen. Een voordeel is echter dat je niet direct binnen je server directory hoeft te werken.<br /></span></li><br /><li><span style="font-family:Verdana;font-size:9;">De laatste methode die ik hier beschrijf is via Windows Services extentions voor Visual Studio 2005. VS2005 versie 1.1 genereert automatisch de xml bestanden, "signed" de feature en via het build menu kan de site direct naar de server worden ge-deployed. Hoe je precies een feature maakt met behulp van deze tool zal ik later meer over vertellen. Als je niet kan wachten en er nu al mee aan de slag wilt, vindt je <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=19F21E5E-B715-4F0C-B959-8C6DCBDC1057&displaylang=en">hier</a> de WSS extension manual inclusief een voorbeeld.<br /></span></li></ol><br /><p><br /></p><br /><p><span style="font-family:Verdana;font-size:9;"><strong>URL's<br /></strong></span></p><br /><p><span style="font-family:Verdana;font-size:9;">WSS/MOSS demo en informatie:<br /></span></p><br /><p><a href="http://www.wssdemo.com/default.aspx"><span style="font-family:Verdana;font-size:9;">http://www.wssdemo.com/default.aspx</span></a><span style="font-family:Verdana;"><br /></span></p><br /><p><span style="font-family:Verdana;font-size:9;">WSS downloads:<br /></span></p><br /><p><a href="http://www.microsoft.com/downloads/browse.aspx?displaylang=en&productID=2EBD3A50-CDBC-4519-A254-D6E2A281743D"><span style="font-family:Verdana;font-size:9;">Klik hier</span></a><span style="font-family:Verdana;font-size:9;"><br /></span></p><br /><p><span style="font-family:Verdana;font-size:9;">WSS Visual Studio 2005 Extensions Manual:<br /></span></p><br /><p><a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=3E1DCCCD-1CCA-433A-BB4D-97B96BF7AB63"><span style="font-family:Verdana;font-size:9;">Klik hier</span></a></p></span></div>Michael Barendshttp://www.blogger.com/profile/01330753042392179974noreply@blogger.com0tag:blogger.com,1999:blog-875405167278115090.post-67346217597707684482008-02-14T23:41:00.001-08:002008-02-17T04:15:34.798-08:00Workflow met MOSS en SharePoint Designer<span style="font-family:verdana;font-size:85%;">Microsoft Office SharePoint Server (MOSS) heeft ‘out-of-the-box’ workflow zoals het goedkeuren van documenten. Het nadeel van deze standaard workflow is dat het geschikt is voor één enkele taak, als deze is goedgekeurd stopt deze workflow.</span><br /><br /><span style="font-family:verdana;font-size:85%;">Om een workflow uit te breiden zodat deze na een goedkeuring een volgende workflow start kan SharePoint Designer gebruikt worden. Hoe dit werkt wordt hieronder beschreven.</span><br /><br /><span style="font-family:verdana;font-size:85%;">Maak een bibliotheek of lijst aan zoals bijvoorbeeld een lijst voor de aanvraag voor een laptop.</span><br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrzYK7una5KFnmAEcdvJA2jBy66Rlwggv8d4JbZTpOHuEFwMXMi8qat4rpZqujyRVxVonU0qjavxrschJav-kluxsvDju_DI9F_u5h6yPv1t_wIs6bYdbt_9N55yGpDbWVOmoIJJJ57MYA/s1600-h/001.jpg"><span style="font-family:verdana;font-size:85%;"><img id="BLOGGER_PHOTO_ID_5167145229019011458" style="CURSOR: hand" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrzYK7una5KFnmAEcdvJA2jBy66Rlwggv8d4JbZTpOHuEFwMXMi8qat4rpZqujyRVxVonU0qjavxrschJav-kluxsvDju_DI9F_u5h6yPv1t_wIs6bYdbt_9N55yGpDbWVOmoIJJJ57MYA/s400/001.jpg" border="0" /></span></a><span style="font-family:verdana;font-size:85%;"> </span><br /><span style="font-family:verdana;font-size:85%;">Stel een workflow (MOSS) in op deze lijst die start als er een nieuw item wordt aangemaakt.</span><br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjCdWhoBQjETi2Bt5kLq2_HvTQ3G8Gbe0RtvL1EnQLiyobGluEWEy1_LII8AosfCyY831n1QyxtK0Btc0YocKt3usVYBqTqkKrh-q4QE0Fg0Edtn574ombKfongIQ9aBGgTzxmIEVsIxIS/s1600-h/002.jpg"><span style="font-family:verdana;font-size:85%;"><img id="BLOGGER_PHOTO_ID_5167145302033455506" style="CURSOR: hand" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjCdWhoBQjETi2Bt5kLq2_HvTQ3G8Gbe0RtvL1EnQLiyobGluEWEy1_LII8AosfCyY831n1QyxtK0Btc0YocKt3usVYBqTqkKrh-q4QE0Fg0Edtn574ombKfongIQ9aBGgTzxmIEVsIxIS/s400/002.jpg" border="0" /></span></a><span style="font-family:verdana;font-size:85%;"> </span><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBhS-HGhwKvOticSAzI7WkzV5BHcNtUS02VoFX3RdgGtZX0N2sLYPOP03lyNKj8FBARfYZSPhNrfDKReq2SlzCAZoL7M5jYBIEPft_Rh_ihiFHEFvjVWsyZ9s9ZQ_TlLSlyyiG6jT85HUS/s1600-h/003.jpg"><span style="font-family:verdana;font-size:85%;"><img id="BLOGGER_PHOTO_ID_5167152796751387042" style="CURSOR: hand" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBhS-HGhwKvOticSAzI7WkzV5BHcNtUS02VoFX3RdgGtZX0N2sLYPOP03lyNKj8FBARfYZSPhNrfDKReq2SlzCAZoL7M5jYBIEPft_Rh_ihiFHEFvjVWsyZ9s9ZQ_TlLSlyyiG6jT85HUS/s400/003.jpg" border="0" /></span></a><span style="font-family:verdana;font-size:85%;"><br /><br />Maak een workflow met SharePoint Designer die start wanneer de aanvraag voor de laptop wordt goedgekeurd. Deze workflow maakt een nieuw item aan in de lijst Bestellingen.</span><br /><span style="font-family:verdana;font-size:85%;"><br /></span><span style="font-family:verdana;font-size:85%;"></span><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-YPVO6Ws2hcZPtZ_XcmbhaJ6GaZsW0EJykx0yhUiu15LqV9L0lX58IMZQUMSZ-EJAWH94q1Wm9R4nMNa7eOeQk1CIAlEvyz424akqckX0QDig_dt3oVJ5J-LtWVN4q4tL1yYW2Yyf7opX/s1600-h/004.jpg"><span style="font-family:verdana;font-size:85%;"><img id="BLOGGER_PHOTO_ID_5167152977140013490" style="CURSOR: hand" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-YPVO6Ws2hcZPtZ_XcmbhaJ6GaZsW0EJykx0yhUiu15LqV9L0lX58IMZQUMSZ-EJAWH94q1Wm9R4nMNa7eOeQk1CIAlEvyz424akqckX0QDig_dt3oVJ5J-LtWVN4q4tL1yYW2Yyf7opX/s400/004.jpg" border="0" /></span></a><span style="font-family:verdana;font-size:85%;"> </span><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhssV8gfRsAvRM-v4mC4enjnxXIz13EpFocpFfDSPcxrYL39BZbWyABAuQazNeEx8GmNxipN6xeXWBTrKkA1Q3WvPN30zcDrwoNwF2700AYe0QY7_cUsgfX4PlMehNNYgzPteA9wn-MNauO/s1600-h/005.jpg"><span style="font-family:verdana;font-size:85%;"><img id="BLOGGER_PHOTO_ID_5167153093104130498" style="CURSOR: hand" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhssV8gfRsAvRM-v4mC4enjnxXIz13EpFocpFfDSPcxrYL39BZbWyABAuQazNeEx8GmNxipN6xeXWBTrKkA1Q3WvPN30zcDrwoNwF2700AYe0QY7_cUsgfX4PlMehNNYgzPteA9wn-MNauO/s400/005.jpg" border="0" /></span></a><span style="font-family:verdana;font-size:85%;"><br /><br />Op de Bestellingen lijst kan dan weer een workflow (MOSS) worden ingesteld zodat de juiste persoon weer een taak krijgt toegewezen. Hieronder staat het overzicht voor één bestelling workflow.</span><br /><span style="font-family:verdana;font-size:85%;"><br /></span><span style="font-family:verdana;font-size:85%;"></span><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRt5tr3EaQMSaahOHVHBCOn417dKbxwWD1P6sgWgJ7tPLkgRlykLQJbri5W1D66pF-eQdKQgjQ1x2KMLOfePrZv9OXpemuqA5RlkL3ZiCih7lQdJV_3SRn7U2VRhxoPfCI1ztdTSeNpYYa/s1600-h/006.jpg"><span style="font-family:verdana;font-size:85%;"><img id="BLOGGER_PHOTO_ID_5167153488241121762" style="CURSOR: hand" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRt5tr3EaQMSaahOHVHBCOn417dKbxwWD1P6sgWgJ7tPLkgRlykLQJbri5W1D66pF-eQdKQgjQ1x2KMLOfePrZv9OXpemuqA5RlkL3ZiCih7lQdJV_3SRn7U2VRhxoPfCI1ztdTSeNpYYa/s400/006.jpg" border="0" /></span></a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-875405167278115090.post-43039117201366191952008-02-13T06:42:00.000-08:002008-02-17T04:15:10.351-08:00MOSS SharePoint 2007: Dynamische afmeting van de structuurweergave (treeview)<span style="font-family:verdana;font-size:85%;">In SharePoint (zowel WSS 3.0 en MOSS) kan er gebruik gemaakt worden van de structuurweergave (Tree View). Het activeren van dit handige navigatiehulpmiddel kan via de Site-instellingen.</span><br /><span style="font-family:Verdana;font-size:85%;"></span><br /><span style="font-family:verdana;font-size:85%;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjviJsoz-DhQRQTBAQShUWylUFnqpTHA2Rcm0lv2IdY3DJqT9j0U-gXVC1KEz8HWMfNNgFShadc5AT0FKAIC27xykZyDGXuoWf37X1UfcPdkPKUsluVG9Q0zbaR-WMA64yW5xBvufLz7jrl/s1600-h/001.jpg"><img id="BLOGGER_PHOTO_ID_5167110478438619458" style="CURSOR: hand" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjviJsoz-DhQRQTBAQShUWylUFnqpTHA2Rcm0lv2IdY3DJqT9j0U-gXVC1KEz8HWMfNNgFShadc5AT0FKAIC27xykZyDGXuoWf37X1UfcPdkPKUsluVG9Q0zbaR-WMA64yW5xBvufLz7jrl/s400/001.jpg" border="0" /></a></span><br /><span style="font-family:verdana;font-size:85%;"><br /></span><span style="font-family:verdana;font-size:85%;"></span><span style="font-family:verdana;font-size:85%;">Als voorbeeld zijn de volgende mappen geplaatst: Afdelingen, Software Solutions en SharePoint implementaties waadoor we drie niveaus krijgen.</span><br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKnBcTzf9PXQtEq5cDZMB63ll5qIt8awi5B9hzaeeKDmX67cqpZodmX-XqG-McCH7Ps_cy0C7OE2oE_RoRx3Rm297p8HPP4GGAOW15tXxVtUGqPvrMiRYaNib9SXEnEtQBoalFLzkiIDGT/s1600-h/002.jpg"><img id="BLOGGER_PHOTO_ID_5167110968064891218" style="CURSOR: hand" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKnBcTzf9PXQtEq5cDZMB63ll5qIt8awi5B9hzaeeKDmX67cqpZodmX-XqG-McCH7Ps_cy0C7OE2oE_RoRx3Rm297p8HPP4GGAOW15tXxVtUGqPvrMiRYaNib9SXEnEtQBoalFLzkiIDGT/s400/002.jpg" border="0" /></a><br /><br /><span style="font-family:verdana;font-size:85%;">De navigatie heeft een vaste breedte en hoogte waardoor er scrollbalken verschijnen. Om de breedte en hoogte dynamisch te maken, zodat deze zicht aanpast aan de inhoud, moet het volgende gebeuren:</span><br /><span style="font-family:Verdana;font-size:85%;"></span><br /><span style="font-family:verdana;font-size:85%;">-> Open de desbetreffende masterpage zoals default.master in bijvoorbeeld SharePoint Designer</span><br /><span style="font-family:Verdana;font-size:85%;"></span><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuCnG1L-IrnkBHZsxE8Lpjyg3gZuoYp3Wve9rPsMh0iokma6qA7HNF9SNowkQQdHpwvVDwsvccK2low8E6O_NkzsfUxg1LOMXMV34JGLJJrbCiM4kg8AI1p7Egxwm_CZ83ZIaUsSqfOMpV/s1600-h/004.jpg"><img id="BLOGGER_PHOTO_ID_5167111182813256034" style="CURSOR: hand" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuCnG1L-IrnkBHZsxE8Lpjyg3gZuoYp3Wve9rPsMh0iokma6qA7HNF9SNowkQQdHpwvVDwsvccK2low8E6O_NkzsfUxg1LOMXMV34JGLJJrbCiM4kg8AI1p7Egxwm_CZ83ZIaUsSqfOMpV/s400/004.jpg" border="0" /></a><br /><br /><br /><span style="font-family:verdana;font-size:85%;">-> Zoek de volgende tag:<br />sharepoint:sprememberscroll runat="server" id="TreeViewRememberScroll" onscroll="javascript:_spRecordScrollPositions(this);" style="overflow: auto;height: 400px;width: 150px; "</span><br /><br /><br /><span style="font-family:verdana;font-size:85%;">-> Vervang de vaste height en width met auto:<br />sharepoint:sprememberscroll runat="server" id="TreeViewRememberScroll" onscroll="javascript:_spRecordScrollPositions(this);" style="overflow: auto;<span style="color:#ff0000;">height: auto;width: auto;</span></span> "<br /><span style="font-family:verdana;font-size:85%;">Nu krijgt de structuurweergave een dynamische afmeting:</span><br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8Cfn8pOV1fwfrp9rGpT2bovZQckJ5jUT6in8y7UQyECvZJABplTmuuvy9gMNsZuW33Q89-qFLdM8-qRSnaDBwkUb3RE9gpaEbjeLfC9dO2tuJ2T9JIDupJECsWNnQANgO6VVagEjTAuXi/s1600-h/005.jpg"><img id="BLOGGER_PHOTO_ID_5167111565065345394" style="CURSOR: hand" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8Cfn8pOV1fwfrp9rGpT2bovZQckJ5jUT6in8y7UQyECvZJABplTmuuvy9gMNsZuW33Q89-qFLdM8-qRSnaDBwkUb3RE9gpaEbjeLfC9dO2tuJ2T9JIDupJECsWNnQANgO6VVagEjTAuXi/s400/005.jpg" border="0" /></a>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-875405167278115090.post-76043583223581040662008-01-21T03:13:00.000-08:002008-02-17T04:14:51.363-08:00Tips voor opschonen server (bestanden/database)<span style="font-family:verdana;font-size:85%;">Hieronder staan een aantal praktische tips voor het opschonen van een server om te voorkomen dat actieve ontwikkelingen verloren gaan.<br /><br />Voor het opschonen van bepaalde mappen is het handig om te controleren of deze map nog actief gebruikt wordt. Een eenvoudige manier om dit te controleren is:</span><br /><ul><li><span style="font-family:verdana;font-size:85%;">Rechtermuisknop op de map</span></li><li><span style="font-family:verdana;font-size:85%;">Klik op “Search…”</span></li><li><span style="font-family:verdana;font-size:85%;">Vul “*.*” in bij “All or part of the filename:” en klik op “Search”</span></li><li><span style="font-family:verdana;font-size:85%;">Als het zoeken klaar is klik dan op de kolom “Date Modified” om te zien wanneer de laatste wijziging heeft plaatsgevonden</span></li></ul><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikZCQbhHr8s1VDQM19qtH7d0Ms8t-y3TNKqeSX7llceDL4R8Oq9h3ykHTIlpl94yqb1JYIZyPn9x5kSqLfzChBamXAsTII_tyL5OQdPidl6AvivOlKwXkXwLTMtqDJVh2ickyOxHbVYNpf/s1600-h/00001.jpg"><img id="BLOGGER_PHOTO_ID_5157895275015163346" style="CURSOR: hand" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikZCQbhHr8s1VDQM19qtH7d0Ms8t-y3TNKqeSX7llceDL4R8Oq9h3ykHTIlpl94yqb1JYIZyPn9x5kSqLfzChBamXAsTII_tyL5OQdPidl6AvivOlKwXkXwLTMtqDJVh2ickyOxHbVYNpf/s400/00001.jpg" border="0" /></a><br /><br /><br /><p></p><p><span style="font-family:verdana;font-size:85%;">Voor het opschonen van bepaalde databases kan bijvoorbeeld de volgende controle gebruikt worden:</span></p><ul><li><span style="font-family:verdana;font-size:85%;">Open een tabel die in het systeem waar de meeste acties in plaatsvinden zoals een logging tabel of bijvoorbeeld de Atoom tabel in KR.</span></li><li><span style="font-family:verdana;font-size:85%;">Gebruik bijvoorbeeld de query “SELECT * FROM Atoom ORDER BY MutatieDD DESC” om te sorteren op de laatste mutatie.</span></li></ul><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf-kHiDTUuAXsqnvkbDQlxg51SFTXEMox5SJGTd418ccrs1CQkqGYzDKy0WOiPkpMBd_KTzJ7sENYGrlK0wz7sYAkSNvGi-XWemKxv3lAAmkEQiJ-acZNH3CvQacLJPQGX3xKCLQZGS6G1/s1600-h/000002.jpg"><img id="BLOGGER_PHOTO_ID_5157896172663328226" style="CURSOR: hand" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf-kHiDTUuAXsqnvkbDQlxg51SFTXEMox5SJGTd418ccrs1CQkqGYzDKy0WOiPkpMBd_KTzJ7sENYGrlK0wz7sYAkSNvGi-XWemKxv3lAAmkEQiJ-acZNH3CvQacLJPQGX3xKCLQZGS6G1/s400/000002.jpg" border="0" /></a>Unknownnoreply@blogger.com1