vrijdag 19 oktober 2007

Converteer afbeeldingen naar grijswaarden in .Net 2.0

Wanneer je in .Net afbeeldingen wil converteren naar grijswaarden, moet je GDI+ gebruiken. GDI (Graphics Device Interface) is hét component in het .Net framework wat gebruikt kan worden voor image processing.

Hieronder de code om afbeeldingen met behulp van GDI om te zetten naar afbeeldingen in grijswaarden:
public static Bitmap ConvertToGrayscale(Bitmap source, Color transparencyColor)
{
Bitmap bm = new Bitmap(source.Width, source.Height);
for (int y = 0; y < bm.Height; y++)
{
for (int x = 0; x < bm.Width; x++)
{
Color c = source.GetPixel(x, y);
int luma = (int)(c.R * 0.3 + c.G * 0.59 + c.B * 0.11);
bm.SetPixel(x, y, Color.FromArgb(luma, luma, luma));
}
}
if (transparencyColor!=Color.Empty)
bm.MakeTransparent(transparencyColor);
return bm;
}
public static Bitmap ConvertToGrayscale(Bitmap source)
{
return ConvertToGrayscale(source, Color.Empty);
}

De optionele parameter transparencyColor wordt gebruikt om deze kleur in de afbeelding te converteren naar Transparant!
Het grote nadeel van GDI+ is, is dat het niet erg snel is, omdat GDI+ nog niet voldoende gebruikt maakt van hardware acceleratie.

Een goed alternatief in het .Net 2.0 framework is de statische methode CreateDisabledImage in the ToolStripRenderer klasse. Deze methode heeft mij geholpen een groot aantal afbeeldingen in een User-Interface te converteren naar afbeeldingen in grijswaarden, met een hoge performance. Deze methode roep je als volgt aan:
public static Image CreateDisabledImage (
Image normalImage
)

Deze klasse is onderdeel van de System.Windows.Forms namespace. Je moet dus wel een reference naar deze assembly aan je project toevoegen.

Bronnen:
Wikipedia
Microsoft MSDN
Bob Powel (GDI guru)

donderdag 18 oktober 2007

Kolliger Mühle

Als je zin hebt om een weekendje of een weekje naar de Eifel te gaan, dan heb ik de perfecte lokatie gevonden. Kijk hier maar eens...

Kolliger Mühle

vrijdag 12 oktober 2007

Blogger Labels weergeven als Tags

De Labels die je aan elk bericht toevoegd kan je met behulp van het Labels widget tonen op je Blogpagina. Nadeel van dit widget is, is dat je alleen maar een opsomming van de Labels krijg met het aantal keer dat het Label gebruikt is in je Blog, terwijl tegenwoordig veel gebruik wordt gemaakt van een Tag overzicht.

Op de website van phydeaux3 staat een voorbeeld van zo'n Tag overzicht en hij (of zij?) geeft ook nog prijs hoe je zelf dit overzicht kan maken. Ik ben zo vrij geweest om een vertaalde versie op mijn Blog te zetten.

Let op: je moet gebruik maken van de Layout Templates om dit te laten werken en je dient, voordat je begint, het Label widget toegevoegd te hebben op je Blogpagina
Stappen
  1. Maak een backup van je huidige HTML pagina, zodat je nog altijd terug kan indien het niet lukt.
    - Ga naar je Blogger dashboard en klik op Indeling en daarna op HTML bewerken
    - Selecteer alle tekst in het vak onder Sjabloon bewerken en kopieer deze naar een bestand op je lokale PC en bewaar het bestand
  2. Voeg de HTML styles toe
    - Zoek naar de tekst ]]></b:skin> in hetzelfde tekstvak
    - Kopieer de tekst hieronder en plak deze vóór de gevonden tekst in het tekstvak
    /* Label Cloud Styles */
    #labelCloud {text-align:center;font-family:arial,sans-serif;}
    #labelCloud .label-cloud li{display:inline;background-image:none !important;padding:0 5px;margin:0;vertical-align:baseline !important;border:0 !important;}
    #labelCloud ul{list-style-type:none;margin:0 auto;padding:0;}
    #labelCloud a img{border:0;display:inline;margin:0 0 0 3px;padding:0}
    #labelCloud a{text-decoration:none}
    #labelCloud a:hover{text-decoration:underline}
    #labelCloud li a{}
    #labelCloud .label-cloud {}
    #labelCloud .label-count {padding-left:0.2em;font-size:9px;color:#000}
    #labelCloud .label-cloud li:before{content:"" !important}

  3. Voeg het HTML script toe
    - Kopieer de tekst hieronder en plak deze ná de gevonden tekst in punt 2
    <script type='text/javascript'>
    // Label Cloud User Variables
    var cloudMin = 1;
    var maxFontSize = 20;
    var maxColor = [0,0,255];
    var minFontSize = 10;
    var minColor = [0,0,0];
    var lcShowCount = false;
    </script>

  4. Vervang de huidige HTML code voor het widget met nieuwe HTML
    - Zoek naar het huidige widget voor het Label overzicht. De HTML code hiervoor ziet er ongeveer zo uit: <b:widget id="'Label1'" locked="'false'" title="'Labels'" type="'Label'/">
    - Kopieer de tekst hieronder en plak deze over de HTML van het huidige widget (deze begint in ieder geval met <b:widget en eindigt in ieder geval met />)

    <b:widget id='Label1' locked='false' title='Label Cloud' type='Label'>
    <b:includable id='main'>
    <b:if cond='data:title'>
    <h2><data:title/></h2>
    </b:if>

    <div class='widget-content'>
    <div id='labelCloud'/>
    <script type='text/javascript'>

    // Don't change anything past this point -----------------
    // Cloud function s() ripped from del.icio.us
    function s(a,b,i,x){
    if(a&gt;b){
    var m=(a-b)/Math.log(x),v=a-Math.floor(Math.log(i)*m)
    }
    else{
    var m=(b-a)/Math.log(x),v=Math.floor(Math.log(i)*m+a)
    }
    return v
    }


    var c=[];
    var labelCount = new Array();
    var ts = new Object;
    <b:loop values='data:labels' var='label'>
    var theName = &quot;<data:label.name/>&quot;;
    ts[theName] = <data:label.count/>;
    </b:loop>

    for (t in ts){
    if (!labelCount[ts[t]]){
    labelCount[ts[t]] = new Array(ts[t])
    }
    }
    var ta=cloudMin-1;
    tz = labelCount.length - cloudMin;
    lc2 = document.getElementById('labelCloud');
    ul = document.createElement('ul');
    ul.className = 'label-cloud';
    for(var t in ts){
    if(ts[t] &lt; cloudMin){
    continue;
    }
    for (var i=0;3 &gt; i;i++) {
    c[i]=s(minColor[i],maxColor[i],ts[t]-ta,tz)
    }
    var fs = s(minFontSize,maxFontSize,ts[t]-ta,tz);
    li = document.createElement('li');
    li.style.fontSize = fs+'px';
    li.style.lineHeight = '1';
    a = document.createElement('a');
    a.title = ts[t]+' Posts in '+t;
    a.style.color = 'rgb('+c[0]+','+c[1]+','+c[2]+')';
    a.href = '/search/label/'+encodeURIComponent(t);
    if (lcShowCount){
    span = document.createElement('span');
    span.innerHTML = '('+ts[t]+') ';
    span.className = 'label-count';
    a.appendChild(document.createTextNode(t));
    li.appendChild(a);
    li.appendChild(span);
    }
    else {
    a.appendChild(document.createTextNode(t));
    li.appendChild(a);
    }
    ul.appendChild(li);
    abnk = document.createTextNode(' ');
    ul.appendChild(abnk);
    }
    lc2.appendChild(ul);
    </script>

    <noscript>
    <ul>
    <b:loop values='data:labels' var='label'>
    <li>
    <b:if cond='data:blog.url == data:label.url'>
    <data:label.name/>
    <b:else/>
    <a expr:href='data:label.url'><data:label.name/></a>
    </b:if>
    (<data:label.count/>)
    </li>
    </b:loop>
    </ul>
    </noscript>
    <b:include name='quickedit'/>
    </div>

    </b:includable>
    </b:widget>

  5. Klik op de knop Voorbeeld om te bekijken of het Tag overzicht goed weergegeven wordt. Indien dit niet het geval is, dan zou ik de backup terugplaatsen in het tekstvak onder Sjabloon bewerken, zodat je Blogpagina in ieder geval weer normaal functioneert. Als je vragen hebt kan je me altijd mailen of een reactie op dit bericht plaatsen.
    Indien het Tag overzicht er goed uitziet kan je het Sjabloon opslaan.

Het HTML script, toegevoegd in punt 3 biedt de mogelijkheden om nog wat aan te passen aan de layout van het Tag overzicht. Hieronder een uitleg:

  • var cloudMin= 1
    Indien je dit op 1 laat staan worden alle Labels getoond in het Tag overzicht, maar als je het nummer aanpast naar een hoger getal, dan zullen alleen die Labels worden getoond die minimaal zoveel keer voorkomen in je Blog
  • maxFontSize en maxColor
    Hiermee geef je de grootte van het lettertype en de kleur van de letter voor het Label welke het vaakst op je Blog voorkomt (zie onder Bronnen voor een RGB kleurenoverzicht)
  • minFontSize en minColor
    Hiermee geef je de grootte van het lettertype en de kleur van de letter voor het Label welke het minst vaak op je Blog voorkomt
  • lcShowCount = false
    Indien je de waarde false vervangt door true, dan wordt het aantal keren dat een Label voorkomt op je Blog, weergegeven bij de Tag. Over het algemeen zie je dit nooit terug in Tag overzichten, dus ik zou dit op false laten staan

Verder is het nog mogelijk om je Tag overzicht nóg meer te tweaken door het aanpasen van de HTML styles, toegevoegd in punt 2. Hier wil ik verder niet op in gaan en is bestemd voor de meer ervaren HTML ontwerpers.


Bronnen:
Setup and configuration for New Blogger Tag Cloud / Label Cloud
RGB kleurcodes

donderdag 11 oktober 2007

Gek wordt je van die telefonische verkopen

Vandaag was het weer zover... voor de zoveelste keer werd ik telefonisch benaderd met de vraag of ik over wilde stappen op een ander energiebedrijf. Nu is de maat écht vol!

Ik heb ooit eens gehoord dat je je ergens aan kan melden, zodat je niet meer telefonisch benaderd zal worden (of in ieder geval minder vaak). Ik ben hier even naar op zoek gegaan en heb het volgende gevonden:
Stichting Infofilter registreert je gegevens en hierbij kan je aangeven wat je allemaal wilt laten blokkeren. Geen telemarketing meer door bedrijven die zich hieraan houden.
Infofilter werkt eigenlijk als een JA/NEE of NEE/NEE sticker op uw brievenbus voor ongeadresseerd drukwerk. Op dit moment kan je het volgende laten blokkeren:
  • Telefonie (vast en mobiel)
    - Auto's & Toebehoren
    - Boeken & Muziek
    - Energie Financiën (banken en verzekeringen)
    - Goede Doelen (fondsenwerving)
    - Horoscopen (esoteriek)
    - Kranten & Tijdschriften
    - Loterijen
    - Telecommunicatie & Computers
    - Thuiswinkelen - Postordering
  • Post
    - Auto's & Toebehoren
    - Boeken & Muziek
    - Energie
    - Financiën (banken en verzekeringen)
    - Goede Doelen (fondsenwerving)
    - Horoscopen (esoteriek)
    - Kranten & Tijdschriften
    - Loterijen
    - Telecommunicatie & Computers
    - Thuiswinkelen - Postordering
  • Telefonisch Marktonderzoek

Ik hoop dat ik iedereen, met dezelfde frustraties als ik, geholpen heb met dit artikel. Allemaal aanmelden dus !!!

Bronnen:
Consumentenlijn Telemarketing
Infofilter

Nikhil's Web Development Helper

Een handig tooltje voor webontwikkelaars is de Web Development Helper van Nikhil Kothari. Ik heb als webontwikkelaar regelmatig de behoefte aan wat meer informatie over het resultaat van de webpagina die ik aan het ontwikkelen ben. Denk bijvoorbeeld aan het Document Object Model of informatie over ASP.NET in je pagina.

Een hulpmiddel om dit soort informatie te verschaffen is de Web Development Helper. Hieronder een aantal screenshots met beschrijving van dit tool. Je kan het tool downloaden via de website van Nikhil. Na installatie kan je de toolbar in Internet Explorer aanzetten via het Tools menu.

Wanneer je Enable logging aanvinkt en naar een website surft, dan krijg je informatie over de Response te zien:


Via het menuitem Page / DOM Inspector krijg je de DOM informatie van de betreffende pagina te zien in een hiërarchische weergave. Als je op een element klikt kan je in het rechter frame de attributen, styles en markup van het element bekijken:


Als je achter Console op HTTP Logging klikt kan je het Script Console selecteren. In dit console kan je javascript invoeren en direct op de huidige webpagina uit laten voeren. Hieronder een voorbeeld van een simpele alert:


Indien ASP.NET Ajax op de webpagina wordt gebruikt kan je via het menuitem Script / Script Class Browser het class model van ASP.NET Ajax bekijken:


Als je op je lokale PC ASP.NET aan het ontwikkelen bent, dan kan je via het menuitem ASP.NET wat informatie hierover opvragen. Je kan bijvoorbeeld de Viewstate bekijken in een wat meer leesbare vorm dan de werkelijke Viewstate tekst:


De objecten die de webserver in cache heeft opgeslagen kan je bekijken en eventueel verwijderen:


Indien je Tracing op de ASP.NET pagina hebt aangezet kan je de Trace Output in een apart venster bekijken:

Bronnen:

woensdag 10 oktober 2007

Toegang tot SQL Server 2005 vanaf een andere PC

Toegang tot een SQL Server 2005 op een remote PC heb je niet standaard. Je moet het e.e.a. instellen voordat je dit kan bereiken.

In de vorige versies van SQL Server kon je, zonder problemen, een SQL Server op een server benaderen vanuit de Enterprise Manager. Om dit ook in SQL Server 2005 te kunnen, dien je de volgende stappen te zetten:
  1. Enable TCP/IP connecties via de Surface Area Configuration Utility:
    - Start de Surface Area Configuration Utility
    - Klik op Surface Area Config. for Services and Connections
    - Ga onder de betreffende Instance naar Database Engine\Remote Connections
    - Selecteer Local and Remote connections
    - Selecteer Using TCP/IP only
  2. Enable TCP/IP connecties via de SQL Server Configuration Manager:
    - Start de SQL Server Configuration Manager
    - Ga onder SQL Server 2005 Network Config. naar Protocols for INSTANCE
    - Dubbelklik op TCP/IP en zet Enabled op Yes
  3. Start de SQL Browser service
    - Start de SQL Server Configuration Manager
    - Klik op SQL Server 2005 Services
    - Dubbelklik op SQL Server Browser
    - Zet de Start Mode op Automatic onder de tab Service
    - Klik op Apply
    - Klik op Start onder de tab Log On
  4. Zorg ervoor dat je Firewall (als je die één hebt draaien) SQL Server en SQL Browser ‘vrijsteld’. Dit doe je door sqlservr.exe en sqlbrowser.exe als een uitzondering aan de Firewall toe te voegen

dinsdag 9 oktober 2007

Search.Net - Google .Net sites

Ik denk dat elke softwareontwikkelaar het met me eens zal zijn dat we veel... heel veel... tijd kwijt zijn aan het zoeken naar de oplossingen voor de problemen (nou ja, uitdagingen noemen we dat dan ;-) ) waar we tegenaan lopen tijdens de ontwikkeling van de software.

Meestal zoek ik dan door een aantal favoriete .Net sites naar de oplossing. Regelmatig probeer ik te Googlen naar het antwoord, maar daar kom je helaas veel bagger tegen waar je op dat moment helemaal geen behoefte aan hebt.

Dan Appleman heeft waarschijnlijk hetzelfde gedacht en heeft daarom een .Net zoekmachine ontwikkeld op basis van Google Custom Search technology. Het mooie aan deze zoekmachine is, is dat het alleen door de beste .Net sites zoekt en probeert niet-gerelateerde en dubbele links te verwijderen.
De link naar deze site is: http://www.searchdotnet.com/

Hieronder heb ik mijn Google Gadget toegevoegd welke direct toegang biedt tot de zoekmachine...

Ghostdoc

Ghostdoc is een superhandig tooltje waarmee je automatisch commentaar kan laten toevoegen aan je C# klassen, methodes, enz. Het commentaar wordt automatisch gegenereerd op basis van de naam van de klasse/methode óf op basis van het commentaar van de geërfte klasse.

Ghostdoc kan je downloaden via http://www.roland-weigelt.de/ghostdoc/ en is voor Visual Studio 2003, 2005 en 2008 beschikbaar.

Hieronder een voorbeeld:
1.
2.
3.

Smallweb webmail (Smallmail)

Overal ter wereld kan je je email uitlezen... op vakantie, op je werk, enz. Als je maar een internetverbinding hebt.
Check http://www.smallmail.nl voor de Smallweb webmail applicatie.

HTML layout met Visual Studio 2005 DocType

Wanneer je in Visual Studio 2005 een tabel met een hoogte van 100% (volledige pagina hoogte) wil gebruiken, kom je in de problemen. De hoogte van 100% lukt nog wel, maar daarna de hoogte van de rijen instellen geeft problemen. Dit heeft te maken met het DocType wat Visual Studio automatisch aan een webpagina toevoegd:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">.
In Visual Studio 2003 heb je dit probleem niet, omdat daar gebruik van het DocType <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> wordt gemaakt. Zie http://www.smallweb.nl/ voor een voorbeeld hiervan.

De oplossing om dit toch op een juiste manier voor elkaar te krijgen is om gebruik te maken van DIV's. Hieronder een oplossingsvoorbeeld:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<style>
html, body
{
margin: 0;
padding: 0;
height: 100%;
max-height: 100%;
overflow: hidden;
}
.Content
{
height: 100%;
max-height: 100%;
overflow: scroll;
}
.Header
{
position: absolute;
top: 0px;
height: 40px;
right: 18px;
background-color: whitesmoke;
margin: 0px;
width: 100%;
}
.Footer
{
position: absolute;
bottom: -1px;
right: 18px;
height: 30px;
background-color: whitesmoke;
width: 100%;
margin: 0px;
}
.HeadFootPadding
{
display: block;
float: left;
width: 18px;
height: 100%;
max-height: 100%;
}
.ContentPadding
{
display: block;
height: 40px
}
</style>
</head>

<body>

<div class=Header>
<div class=HeadFootPadding></div>
<b>Header</b>
</div>
<div class=Content>
<div class=ContentPadding></div>

Dit is de content van de pagina...<br><br>
Dit is de content van de pagina...<br><br>
Dit is de content van de pagina...<br><br>
Dit is de content van de pagina...<br><br>
Dit is de content van de pagina...<br><br>
Dit is de content van de pagina...<br><br>
Dit is de content van de pagina...<br><br>
Dit is de content van de pagina...<br><br>
Dit is de content van de pagina...<br><br>
Dit is de content van de pagina...<br><br>
Dit is de content van de pagina...<br><br>
Dit is de content van de pagina...<br><br>
Dit is de content van de pagina...<br><br>
Dit is de content van de pagina...<br><br>
Dit is de content van de pagina...<br><br>
Dit is de content van de pagina...<br><br>
Dit is de content van de pagina...<br><br>
Dit is de content van de pagina...<br><br>
Dit is de content van de pagina...<br><br>
Dit is de content van de pagina...<br><br>
Dit is de content van de pagina...<br><br>
Dit is de content van de pagina...<br><br>
Dit is de content van de pagina...<br><br>
Dit is de content van de pagina...<br><br>
EINDE
<div class=ContentPadding></div>
</div>
<div class=Footer>
<div class=HeadFootPadding></div>
<b>Footer</b>
</div>

</body>
</html>


Het voordeel van de HTML in dit voorbeeld is dat de daadwerkelijke content gaat scrollen binnen de DIV container, wanneer de content de hoogte van de DIV overschrijdt. Bij de meeste voorbeelden, zoals in de bronnen hieronder, functioneert het scrollen niet goed.

Bronnen:
http://www.xs4all.nl/~peterned/examples/csslayout1.html
http://css-discuss.incutio.com/?page=CssLayouts
http://www.webtoolkit.info/css-centered-layout.html
http://www.cssplay.co.uk/layouts/basics2.html

ASP.NET 2.0 Page LifeCycle

Handige grafische weergave van de Page LifeCycle van ASP.NET 2.0


Bron:
http://www.richardsoeteman.net/PermaLink,guid,a7eeef0e-a10f-4ad3-806e-a6c7cb3574a9.aspx