Har gjort ett antal webb applikationer med .net & mysql under senaste året. Av nån anledning verkar ado.net & mysql inte riktigt vara överens vad gäller connection poolingen och emellanåt droppas vissa referenser till connections. Har gjort en hel del tester kring detta eftersom det i första hand brukar uppstå när en connection inte stängs efter en reader t ex. Problemet verkar ligga utanför koddelen enligt testresultaten i alla fall.
Funderade ett bra tag på en lösning och kom fram till att jag borde läsa på lite mer om mysql. Resultatet blev att jag skrev ett litet skript som man kan köra på t ex schemaläggning eller t o m vid varje page load om man vill. Hittills inte implementerat det skarpt i något projekt men troligtvis åker det in i ett under kommande vecka (som är den fjärde veckan av min semester som jag jobbar)
Exempelkod i C# / .Net 2.0 med SubSonic som DAL
// Usage
int[] killedConnections = KillOldConnectionPool(50);
litKilled.Text = "Killed " + killedConnections[0].ToString() + " of " + killedConnections[1].ToString() + " connections";
// Kills connections and returns numKilled/numTotal
private int[] KillOldConnectionPool(int maxConnectionTime)
{
QueryCommand cmd = new QueryCommand("show processlist");
ArrayList processesToKill = new ArrayList();
IDataReader r = DataService.GetReader(cmd);
int poolcount = 0;
while (r.Read())
{
int pID = Convert.ToInt32(r["Id"].ToString());
string state = r["Command"].ToString();
int time = Convert.ToInt32(r["Time"].ToString());
if (state == "Sleep" && time >= maxConnectionTime && pID > 0)
{
processesToKill.Add(pID);
}
if(pID > 0)
poolcount++;
}
r.Close();
foreach (int pId in processesToKill)
{
try
{
cmd.CommandSql = "kill " + pId.ToString();
DataService.ExecuteQuery(cmd);
}
catch (Exception ex){}
}
int[] ret = new int[2];
ret[0] = processesToKill.Count;
ret[1] = poolcount;
return ret;
}
torsdag 10 juli 2008
Veckans kod...
onsdag 11 juni 2008
måndag 28 april 2008
Wiiiiiiiii
Det finns de som är bra och så finns det de som är helt grymma. Gillar man Wii och är lite programmeringsnörd som jag så uppskattar man det arbete Johnny Lee gjort.
tisdag 8 april 2008
Annoying Vista...
Har pillat med en applikation under våren för windows XP & Vista. Det är i princip en dynamisk installer som beroende på vad man gjort på en webbsida innehåller olika saker. Allt lirar riktigt fint om det inte vore för den absolut otroligt nojiga UAC (User Account Control) som bara ställer till det. Om man har den påslagen kommer det hur många dialogrutor som helst där man måste bekräfta att man verkligen vill köra programmet - trots att man redan klickat "ja!"... flera gånger!
Slår man av UAC så funkar allt precis som vi vill men påslaget är det ett rackarns bekymmer. Nu hade ju allt varit väl om vi hade utvecklat en version för XP och en version för Vista för då hade vi troligtvis kommit runt problemet men det skall vara en enda app som funkar på bägge. Det är ju inte så att man är den gladaste på arbetstid just nu...
Har idag också insett att en kompis troligtvis numera är en fd kompis. Vet inte riktigt hur man kan bete sig som hon gör men efter några minuters funderande så tog jag helt enkelt sonika och raderade henne ur min mejl & telefonbok... Märkligt att en person kan vara en sån Dr Jekyll & Mr Hyde utan att man fattar det förrän det är försent.
söndag 10 februari 2008
00001000 dagar...
Börjar närma sig nu...
Annars händer det inte så mycket. Imorrn släpper vi en ny sajt. Kolla in morgon-tv runt sju-snåret så får ni veta lite mer om projektet "Ordet är fritt" som vi producerat på uppdrag av Ruth för Månpocket. Riktigt bra idé och vi hoppas att det kommer att bli en stor succé förstås. Har suttit hela helgen och gjort förändringar på kåden för det tillkom en del grejer i fredags. Inte så kul med tanke på att jag hade planerat hinna med en tur i skidbacken. Well... konsten får stå tillbaka för levebrödet helt enkelt.
onsdag 6 februari 2008
00001100 - en kort förklaring
Lite nördigt det där - att skriva att det är 00001100 dagar kvar tills jag drar utomlands. Precis så nördig är jag =)
Min fru undrade hur det riktigt funkade med ettor och nollor - jag försökte förklara.
"Det finns bara 10 typer av människor. De som kan räkna binärt och de som inte kan"
00000010 = 2
Alltså...
Åtta nollor som var och en står för en siffra enligt nedan.
128 64 32 16 8 4 2 1
Varje "etta" betyder att siffran används, "nolla" betyder att den inte används.
Innebär att...
00001100 = siffrorna 8 och 4 är "på" = 8 + 4 = 12
He lönsch' int förklara för en som int begriip...
Over and out...
onsdag 30 januari 2008
En dag närmare helgen...
Ja, idag var det minsann bra fart på jobbet igen. Snart är det dock helg igen... Känns gött.
Spelade match ikväll. Vann rätt enkelt de två första gemen men sen blev det koma i huvudet och jag förlorade tre på raken. Så kan det gå ibland...
Imorrn är det raka spåret ner i kod-djungeln igen. Skall försöka få klart det sista på en sajt som släpps nästa vecka. Inte speciellt mycket kvar men det är ju alltid lite pill innan det lirar på live-servern...
torsdag 15 november 2007
Hackar kåd...
Sista dagarna har det varit ett erbarmerligt hackande med olika saker. Widgetsar hit och webbar dit. Har inte haft en minut över känns det som. Efterskalven av att vi vann två månader på raken i Resumé (månadens webb) har infunnit sig och förfrågningarna ökar varje dag. Kul! Har precis intervjuat en ny kille som sökt jobb här. Han har hållt på med dataspel så det känns som om han kan komplettera och förgylla vår tillvaro. Han skulle återkomma om nån dag om han tar jobbet.
Det har verkligen blivit arbetstagarens marknad just nu...
söndag 11 november 2007
Request Parameters i .Net
Har länge tänkt dela med mig av sånt man gjort under årens lopp och som känns som att det sparar lite tid... en sån är en liten funktion i Asp.Net C# som löser vardagliga problem.
Nästan alla dynamiska sidor hämtar post & get parametrar av något slag. För att slippa skriva långa onödiga Request.QueryString["XXX"] eller Request.Form["XXX"] för varje hämtning så skrev jag en liten variant som även finns översatt till php och javascript.
GetRequestParam
När jag skrev den tänkte jag att den skulle klara att ta emot både get & post, kunna returnera ett definierat defaultvärde och kunna returnera en del av värdet.
I C# resulterade detta i en funktion med tre overloads.
Denna kallar på nästa overload med defaultvärdet ""
public string GetRequestParam(string key)
{
return GetRequestParam(key, "");
}
...som kallar på nästa overload med inskickat defaultvärde och -1 för antal tecken (dvs alla)...
public string GetRequestParam(string key, string defaultvalue)
{
return GetRequestParam(key, defaultvalue, -1);
}
...och slutligen funktionen som tar emot alla parametrar och returnerar värdet
public string GetRequestParam(string key, string defaultvalue, int max_length)
{
string val = Request.Form[key] == null || Request.Form[key] == "" ? null : Request.Form[key];
if (val == null)
val = Request.QueryString[key] == null || Request.QueryString[key] == "" ? null : Request.QueryString[key];
if (max_length != -1 && val != null && val.Length > max_length)
val = val.Substring(0, max_length);
return val == null ? defaultvalue : val;
}
Det är ungefär tre år sen den skrevs men det finns alltid mycket man kan lägga till. Har plan på att lägga till ytterligare en overload för att stoppa SQL Injections som blir allt vanligare. Det kan ju vara bra att ha det löst per automatik för alla mottagna parametrar en gång för alla...
måndag 22 oktober 2007
Web Services
Eftersom jag av någon anledning alltid glömmer bort hur jag skall generera C# filerna för en WebService lägger jag in en post om det här... Så jag kommer ihåg det ;)
wsdl.exe /l:CS /n:NAMESPACE /out:PATH_AND_FILE.cs http://webserviceurl.asmx?WSDL
söndag 21 oktober 2007
Spring och ställ dig i runda hörnet
Inspirerad av CssPlay's boxar med runda hörn utan att använda något annat än css beslutade jag mig att skriva ihop en WebControl som löste detta gång på gång utan att man behöver ha koll på alla klasser eller div'ar. Gjorde en ny WebControl "RoundedPanel" och lät den ärva den vanliga AspNet Panelen. Sen var det bara en fråga om att "overrida" renderingsmetoden och se till att det genererades korrekt html + css.
Jag gav RoundedPanel några egenskaper.
Text, innehåll. Såg till att fixa så man kan lägga ChildControls i den också.
PanelTextColor, textens färg
PanelBackColor, bakgrundsfärg
PanelBorderColor, ramens färg
PanelFloat, gjorde så den kunde flyta fritt för maximal layoutfrihet
PanelSquareBottom, rätt schysst att kunna ha runda hörn uppe och platt nertill
PanelBorderWidth, en "thick" och en "thinn" variant hann jag göra.
Har inte testat kontrollen särskilt mycket men den verkar lira fint i FF/IE i alla fall.
Kastade in en liten bild hur det såg ut när jag testade för fem minuter sen...
onsdag 17 oktober 2007
Mitt i en server...
... tillbringar jag kvällen.
Tillsammans med Jens så meckar vi ihop så att alla får det de skall ha innan midnatt - en bekymmersfri tillvaro *hoppas* Just nu lite geggig i huvudet och snabbpausar med ett inlägg.
Frun är på Yoga efter jobbet (tror hon håller i passet idag) och morgondagen ser ut att bringa lika mycket jobb som dagen. Lite tråkigt att vi knappt syns nuförtiden. Jag jobbar som en gnu mest jämt men nu när hon jobbar lika mycket och vi går lite omlott med tiderna blir det för lite gullande och man tar lätt till den berömda bitchiga tonen ;)
Well.. inget ont som inte för nåt gott med sig - vi nöter ju inte ut varandra i alla fall =)
tisdag 16 oktober 2007
Overtime & overdrive
Det är så skönt när det envisa brummandet från ventilationssystemet slutar vid fem. Då vet man att det bara är 3-4 timmar kvar innan man skall börja bege sig hemåt. Skönt också att telefonen slutar ringa och man kan börja knappa på riktigt. Känns nästan som ett av de få tillfällen jag haft fram gitarren faktiskt. Fingrarna knackar hårt, bestämt och frenetiskt över tangentbordet och det är en liknande smärta som den strängarna ger efter ett par timmars övande...
Synd bara att just det jag gör nu inte är så spännande. Bygger om en sak jag gjorde förra veckan för kunden hade ändrat vad de ville ha och det blev lite pajas över all kod med de nya kraven så det var bara att kavla upp skjortärmarna och börja om...
yeah right...
"Mr T-Shirt" definierad, med skjorta en vardag?
Knappast troligt. Det är ju inte byadans i Skäll-efteå idag väl?
Eller?
Visst var det tisdag fortfarande?
Skumt dag-minne just nu...
onsdag 10 oktober 2007
Dynamiskt laddade kontroller
Satt med ett litet problem jag skulle lösa idag. Tog en stund innan jag kopplade grepp om det.
Ville ladda en .net kontroll dynamiskt - skjuta in lite data från en databas och skapa strängen (body) till ett html mail. Hade som vanligt allt up and running på två röda men innehållet från databasen dök aldrig upp i mailet. Allt annat däremot funkade som det skall.
Det visar sig att när man laddar en kontroll dynamiskt så körs inte Page_Init, Page_Load etc utan man får casta typen och köra en egen metod.
En kodsnutt på löst problem:
MyControlClass ctrl = ((MyControlClass)LoadControl("~/controls/mycontrol.ascx"));
StringWriter sw = new StringWriter();
Html32TextWriter hw = new Html32TextWriter(sw);
// Casta kontrollen till korrekt typ innan man kallar på metoden
((MyControlClass)ctrl).RenderContent();
ctrl.RenderControl(hw);
string Body = sw.ToString();
Gott när man löser smågrejer sådär mitt på dan =)
