woensdag 12 september 2007

Vervelende Internet Explorer gedrag

Ik browse regelmatig op het internet honderden linkjes af, daarvoor gebruik ik altijd Opera als browser. Helaas heeft opera geen mooie XML file rendering gedrag. Internet explorer doet dat veel beter.

Internet explorer geeft echter vele overbodige warnings af als ik een XML bestand met DTD of XSLT open. De warning "Your current security settings put your computer at risk" is reuze irritant als ik een les probeer te geven of een flash filmpje wil tonen.

Daarom hierbij hoe je die foutmelding kan verwijderen.

windows toets + r
gpedit.msc
Bij zowel computer als user:
Administrative Template
Windows Components
Internet Explorer

Dan de Turn of the Security Settings Check feature op ENABLE zetten.

Zo weer een probleem opgelost.

Meer informatie op http://www.eggheadcafe.com/software/aspnet/28900007/-how-do-i-remove-the-b.aspx

woensdag 22 augustus 2007

Wanneer is een dataset geen dataset?

Als je in .Net een typed dataset aanmaakt en deze wegschrijft met typedDataSet.WriteXml("c:\xml",XmlWriteMode.WriteSchema)
Dan schrijf je een TYPED diffgram weg. Een typed diffgram is geen normale DataSet en als je dan probeerd hem in te lezen met untypedDS.ReadXml("pad" XmlReadMode.DiffGram) dan krijg je een dataset zonder tables.

Dit komt vast omdat de diffgram teveel informatie bevat, een hacky oplossing is als volgt:

XmlDataDocument dd = new XmlDataDocument();
dd.Load("c:\pad.xml");
string info = dd.FirstChild.NextSibling.InnerXml.ToString();
byte[] byteArray = new byte[info.Length];
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
byteArray = encoding.GetBytes(info.ToCharArray());
MemoryStream ms = new MemoryStream(byteArray);
ds.ReadXml(ms);

Hier leest de code de diffgram in een XmlDataDocument en maakt vervolgens van de Firstchild.nextsibling een dataset.

maandag 23 juli 2007

Webscreen scraping III

Een httpwebrequest is een bijzondere klasse.
Het http protocol is geen makkelijk protocol en kan afhankelijk van de protocol instellingen zowel als server en client verschillen gedrag vertonen.

Bij het herhaaldelijk gebruiken van een webrequest ging er ergens iets mis.
System.Net.WebException: The underlying connection was closed:

Oplossingen die niet werkten:
System.Threading.Thread.Sleep(2000)
--1000 verbindingen direct achter elkaar vind geen enkele server/router leuk
ServicePointManager.DefaultConnectionLimit = 10
--meer dan standaard 2 (mischien een connectie die busy was oid)
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 Or SecurityProtocolType.Tls
--we werken via HTTPS mischien helpt dat
lHttpWebRequest = CType(WebRequest.Create(url), HttpWebRequest)
lHttpWebRequest.SendChunked = True
--mischien een fout in certificaat handeling(incomplete transmissie) daarom chunked ipv streamed
lHttpWebRequest.Method = "GET"
--get ipv post ivm met certificaat fout (de fout lag zeker bij een post aktie)
lHttpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 1.0.3705; .NET CLR 3.0.04506.30; MEGAUPLOAD 1.0)"
--een moderne browser string (alles anders dan IEXplore deed het zowiezo niet)
lHttpWebRequest.Timeout = 30000
--timeout maakt geen verschil
lHttpWebRequest.KeepAlive = False
--keep conneciton alive (als de verbinding open blijft kan .Net denken dat hij open staat terwlijk de server hem allang dicht heeft gegooid)
'lHttpWebRequest.ProtocolVersion = HttpVersion.Version11
currentServicePoint = lHttpWebRequest.ServicePoint
currentServicePoint.MaxIdleTime = 5000
--max idle time for connectie daarna moet hij opnieuw gemaakt worden
currentServicePoint.Expect100Continue = False
--er is een fout in .Net dat een 100 continue en een 100 close melding door elkaar gehaald worden

'vanaf hier standaard code
'url = "https://blablabla.com
lHttpWebResponse = CType(lHttpWebRequest.GetResponse, HttpWebResponse)
lHttpWebResponseStream = lHttpWebRequest.GetResponse.GetResponseStream
str = lHttpWebResponseStream

donderdag 19 juli 2007

Webscreen scraping II

Soms, is het leven moeilijk.


Screenscraping via .Net werkt met de HttpWebRequest class.

Dim lHttpWebRequest As HttpWebRequest
Dim lHttpWebResponse As HttpWebResponse
Dim lHttpWebResponseStream As Stream
lHttpWebRequest = CType(WebRequest.Create(url), HttpWebRequest)
lHttpWebResponse = CType(lHttpWebRequest.GetResponse, HttpWebResponse)
lHttpWebResponseStream = lHttpWebRequest.GetResponse.GetResponseStream

Zoals ik in mijn vorige post heb verteld werkt dat niet altijd goed. Nu blijkt dus het probleem te zijn dat mijn HttpWebRequest geen user string meegeeft die geaccepteerd word.

De oplossing:
lHttpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)"

ps.
Bij een httpwebrequest altijd een WebException afvangen kijken naar de status en vervolgens de response stream uitlezen waar meestal de server foutmelding in staat

lHttpWebResponseStream = ex.Response.GetResponseStream

dinsdag 17 juli 2007

Web screen scraping

Bij Twice werk ik als docent ook als importeur van een aantal websites. De meeste websites benader ik met de WebRequest class en kan ik via strings en regular expressions alles vinden. Meestal ben ik met
een druk op een knop en een kwartiertje wachten klaar. Soms vinden websites het echter nodig om zichzelf een nieuw uiterlijk aan te meten en dan werken mijn regex niet meer goed.

Eens in de zoveel tijd veranderd er een website zo heftig dat het niet meer leuk is.
Sommige moderne websites werken met sessies en als dat nog niet erg genoeg is zijn sommige websites gebaseerd op javascript en .Net technologien (ajax ben ik nog niet echt tegen gekomen)

Bij sommige websites kan ik niet met de webrequest aan de gang maar moet ik met de WebBrowser control werken. De webbrowser control biedt de mogelijkheid om in de DOM van het html document te werken en javascript goed uit te voeren. Verder zorgt de webbrowser er voor dat post en put informatie automatisch goed terecht komt.

Voor de selectie van een dropdown list en het klikken van een A link heb ik de volgende code gebruikt:

'Laad het juiste element (id=quickCountry)O
Dim countryList As HtmlElement = wbsap.Document.GetElementById("quickCountry")
'deselecteer alle elementen
For Each s As HtmlElement In countryList.All
s.SetAttribute("selected", "")
Next
'selecteer NL ->element 23
countryList.All.Item(23).SetAttribute("selected", "True")


Het direct aanpassen van de countrylist naar een element
countryList.InnerText = "

dinsdag 10 juli 2007

Microsoft Download Center

Microsoft heeft op het grote web de volgende website met heel veel downloads, patches en service packs : http://www.microsoft.com/downloads/

Een van mijn grote problemen met het aanbod is dat de meeste bestanden heel slecht genaamd zijn. Ik ben momenteel Microsoft Virtual PC aan het downloaden en de naam het installatie programma is setup.exe, een naam die nog niet in mijn download folder stond(...).

De naam van de .Net framework 1.1 is dotnetfx.exe
De naam van het .Net framework 2.0 is dotnetfx.exe

Ze kiezen voor een duidelijke naam!....

Een betere naam voor de VPC setup had VPSsetup.exe geweest (desnoods met MS ervoor)
Een betere naam voor het framework: dotNetFx10.exe en dotNetFx20.exe

Nu begrijp ik wel dat visual studio projecten standaard de setup.exe naam aangeven en het lastig is aan te passen, maar moeilijk is het niet.

maandag 9 juli 2007

Office 2007 (double line breaks)

Hoi Daar,

Sinds ik vista heb geinstalleerd werk ik ook met Office 2007. Kort voordat ik mijn laptop kreeg heb ik kort met 2007 gewerkt maar nu werk ik er full time mee.

Een punt dat me erg irriteerde was een dubbele "line break" na een enter.
De meeste html/visual studio ontwikkelaars zullen het wel herkennen dat de enter toets een nieuwe paragraaf/alinea start die dus een extra regel ruimte reserveerd.

Na het formuleren van een 100 tal word help en google zoek opdrachten kwam ik niet uit het probleem. Verder kijkend op google kwam ik uit op computer idee forum waar het antwoord staat.

Hier de menu opties die je kan gebruiken om de dubbele line breaks te verwijderen

Op de Home ribbon bij de Styles
Rechts klikken op Normal en dan Modify
Dan links onder format -> paragraph
Spacing after op 0 zetten (ipv 10)

Daarna even alles selecteren en op normal zetten