Feed
Contact
XING
LinkedIn
Twitter
ICQ
meebo.com

Mein aktuelles privates Projekt – www.EdelsteinKreationen.ch

by Roland Schumacher alias GENiALi 3. February 2010 -- 478 Wörter  -- 246 mal gelesen
Dieser Beitrag ist mir was wert:  

Neben meinem Job habe ich noch ganz wenig Freizeit. :-) Diese Freizeit wird von Frau, Kinder und PC in Anspruch genommen. Meine Frau hat auch ein Hobby, seit einiger Zeit. Und jetzt, jetzt folgt der logische nächste Schritt. Sie will eine eigene Webseite. Was liegt da näher als den Ehemann zu fragen der ja Programmierer ist. Was soll ich da bloss sagen. :-)

Jedenfalls gingen in den letzten paar Wochen etliche Stunden in das Projekt. Aber es macht Spass.

Meine Frau macht aus Edelsteinen Halsketten, Armketten, Bebehalsketten und noch ein paar andere nette Sachen. Ich bin ja nicht ein Schmuckfan, aber einige Sachen sehen echt gut aus. Bislang machte sie diese, wie wir sie nennen, EdelsteinKreationen für die Kinder, sich selbst, für Verwandte und Kolleginnen. Diese sind langsam aber sicher mit solchen Kunstwerken eingedeckt. Also, ab ins Web und versuchen die Kreationen zu verkaufen.

Ich darf also ein Web bauen mit einem kleinen Shop. Sehr einfach. Keine Kreditkarten oder so. Einfach per Mail. Ich wollte nicht das sie, meine Frau, alles irgend wie mit Expression Web oder so Pflegen muss. Dann wäre es ja eh bei mir hängen geblieben. Also suchte ich ein CMS. Fündig wurde ich bei N2 CMS. Das ist ein ASP.NET MVC Projekt. Es MUSSTE ein .NET CMS sein, vorzugsweise C#. So kann ich auch noch was lernen. Das Ergebnis ist unter www.EdelsteinKreationen.ch zu finden. Was mich noch am meisten erstaunte, die Domain war noch zu haben. Ich finde das eine absolut geniale Domain. Passt voll und ganz zum Thema.

Jetzt fehlen natürlich nur noch die Kunden. Aber das wird sich sicher noch geben. Vor zwei Tagen sagte ich meiner Frau, dass Google sicher mal wieder eine AdWords Kampagne starten wird und ich bekomme dann sicher wieder einen Gutschein. Was soll ich sagen. Heute kam ein solcher Gutschein über 125CHF mit der Post bei mir an. Was für ein Zufall. Das werde ich sicher noch nutzen.

Was sicher auch noch cool wäre ist so etwas wie virales Marketing. Hoffe der Begriff passt einigermasen. Es gibt immer wider Blogger die machen Wettbewerbe wenn man etwas dazu schreibt und einen Backlink auf ihr Blog setzt. Das gibt viele Backlinks und Google freut sich. Einen Wettbewerb kann ich nicht machen. Einen Preis in dem Sinn kann ich nicht zur Verfügung stellen.

Aber einen Backlink schon. :-D

Also. Wer etwas über www.EdelsteinKreationen.ch schreibt und es mir mitteilt, dem setze ich einen Backlink. Genau am Ende dieses Postings. Wie so sollte man das machen? Jetzt muss ich ein wenig prahlen. <prahlen> Backlink von einer Seite mit PR4!! Wisst ihr was das Wert hat?! 22Euro im Monat. Und der Link bleibt immer drin. Das kann also ein sehr guter Gewinn sein. :-D </prahlen>

Wenn sich jemand also darauf einlässt, dann ein Kommentar auf dem Posting hinterlassen. Dann setzte ich den Link. Natürlich ohne nofollow. Ist ja klar. :-D

Google wird’s freuen.

Tags: , , , ,

Allerlei

n-Besucher Online – Einfache Version

by Roland Schumacher alias GENiALi 16. June 2009 -- 346 Wörter  -- 109 mal gelesen
Dieser Beitrag ist mir was wert:  

Seit kurzem gibt es bei mir im Blog oben Rechts den Hinweis wie viele Besucher zur Zeit bei mir Online sind. Das Ding ist aber sehr einfach gestrickt, sollte aber relativ genau sein. Wer mehr Hintergrundwissen haben möchte kann sich bei Klaus Bock dieses Posting ansehen.

Klaus geht noch weiter. Er registriert ein Java Script auf dem Client das beim schliessen des Browsers noch eine Seite aufruft die nichts anderes macht als die Session auf dem Server zu beenden. Aber spätestens nach 20 Minuten wird die Session auf dem Server so oder so mit Session_End beendet.

Die Implementation in BlogEngine.NET, kurz BE, läuft in etwa wie folgt ab.

Bei BE sind die Sessions standardmässig ausgeschaltet. Ich habe sie einfach in der Web.config wieder eingeschaltet. 

<sessionState mode="InProc" cookieName=".geniali.ch"/>

Als nächstes muss noch bemerkt werden wann eine neue Session startet und wann eine Session beendet wird. Dazu gibt es in ASP.NET zwei Events die man in der Datei global.asax implementieren muss. Bei BE sind die Zwei noch nicht drin.

void Session_Start(object sender, EventArgs e)
{
    // User-Zähler erhöhen.  
    Application.Lock();
    Application["Viewers"] = (int)Application["Viewers"] + 1;
    Application.UnLock();
}

void Session_End(object sender, EventArgs e)
{
    // User-Zähler verringern.  
    Application.Lock();
    if((int)Application["Viewers"] > 0)
    {
        Application["Viewers"] = (int)Application["Viewers"] - 1;
    }
    Application.UnLock();
}

Das Application["Viewers"] Objekt muss aber zuerst noch initialisiert werden. Zudem muss auch sichergestellt sein das beim Start des Webs diese Variable auch wieder auf 0 gestellt wird. Dies macht man im Event Application_Start.

void Application_Start(object sender, EventArgs e)
{
    // Schlüssel Viewers in der Anwendung erzeugen
    Application["Viewers"] = 0;
		...

Danach muss nur noch sicher gestellt werden das die “Viewers” auch angezeigt werden. Dazu erstellt man ein neues UserControl. Ich habe das UserControl unter meinem Theme im Ordner Controls abgelegt.
UserOnline.ascx

<%@ Control Language="C#"
 AutoEventWireup="true" 
CodeFile="UserOnline.ascx.cs" 
Inherits="themes_GENiALi_Controls_UserOnline" %>
<asp:Literal ID="litUsers" runat="server"></asp:Literal>

UserOnline.ascx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class themes_GENiALi_Controls_UserOnline 
	: System.Web.UI.UserControl
{
	protected void Page_Load(object sender, EventArgs e)
	{
		litUsers.Text = Application["Viewers"].ToString() 
			+ " Besucher online";
	}
}

Das UserControl kann man einfach auf die site.master des Theme ziehen und dort platzieren. Mit CSS kann die Anzeige noch formatiert und ausgerichtet werden.

Unter dem Strich sollte es in etwa so aussehen. :-)

8 Besucher Online

kick it on dotnet-kicks.de

Tags: , , ,

Blog | Entwicklung

ASP.NET - MaxRequestLength auf der Webseite anzeigen

by Roland Schumacher alias GENiALi 27. May 2009 -- 133 Wörter  -- 161 mal gelesen
Dieser Beitrag ist mir was wert:  

Ich schraube zur Zeit an einer Anwendung rum die einem die Möglichkeit gibt Dateien hoch zu laden. Diese werden dann in einem SQL Server gespeichert.

Standardmässig begrenzt ASP.NET die Dateigrösse auf 4 MB (4096 KB). Das kann man mit diesem Eintrag hier ändern.

[...]
<system.web>
    <!-- Uploadgrösse anpassen. Standart ist etwa 4 MB in KB (4MB = 4096KB)-->
    <httpRuntime maxRequestLength="8192" />
[...]

Es macht deshalb auch Sinn das man die User über die maximale Grösse der Datei infomiert. Ich will also anzeigen wie gross eine Datei sein darf. Ich will aber nicht bei jeder Änderung des Wertes das HTML anpassen müssen. Also muss es im Code machbar sein.

Zum Beispiel so:

Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
HttpRuntimeSection section = config.GetSection("system.web/httpRuntime") as HttpRuntimeSection;
double maxFileSize = Math.Round(section.MaxRequestLength / 1024.0, 1);

labFileSize.Text = string.Format("{0:0.#} MB", maxFileSize);

Wenn es noch einfacher geht lasst es mich wissen.

kick it on dotnet-kicks.de

Tags: , ,

Entwicklung

ASP.NET – GridView – Datum nach Wunsch anzeigen

by Roland Schumacher alias GENiALi 17. March 2009 -- 123 Wörter  -- 140 mal gelesen
Dieser Beitrag ist mir was wert:  

ASP.NET ist einfach noch nicht so meine Welt. Das muss ich immer mal wieder merken.

Gerade vorhin. Ich habe ein GridView an das ich ein Objekt binde. Das Objekt hat einige Eigenschaften vom Typ DateTime. Diese Eigenschaften können mit DateTime.MinValue vorbelegt sein. Das sieht dann aber ziemlich blöde aus im GridView.

image

Ich dachte es gibt sicher eine Eigenschaft wo man das beim GridView einstellen kann. Na ja, es gibt die nicht. Lösen kann man es wie folgt.

Aus dem Feld ein ItemTemplate machen und mit einem if prüfen ob es ein DateTime.MinValue ist. Sieht dann so aus.

<ItemTemplate>
    <asp:Label ID="Label1" 
    runat="server" 
    Text='<%# ((DateTime)Eval("DateFrom")) == DateTime.MinValue ? "--.--.----" : Eval("DateFrom",  "{0:d}") %>'>
    </asp:Label>
</ItemTemplate>

Ergebnis:

image

Tausend dank geht an Thomas.

Tags: ,

Entwicklung

GENiALi’s Blog war lange offline

by Roland Schumacher alias GENiALi 5. August 2008 -- 474 Wörter  -- 77 mal gelesen
Dieser Beitrag ist mir was wert:  

Wie einige von euch sicher bemerkt haben, jedenfalls habe ich es bemerkt,
war mein Blog, meine Blogs, heute sehr lange offline. Eigentlich seit
gestern 19.00Unr bis Heute ca. 17.00Uhr.

Ich wusste, dass ich gestern nichts gemacht habe. Jedenfalls denke ich das.
Also war ich mir ganz sicher, dass es am Server liegen muss. Entsprechend
habe ich meinem Hoster geschrieben und wurde langsam aber sicher
nervös. Der freundliche Herr auf der anderen Seite hat dann mal den AppPool
neu gestartet, aber das Web war sofort wieder down.

Da hatte ich schon ein Déjà-vu. So ähnlich fingen die Probleme beim alten
Hoster an.

Nach der Arbeit eilte ich schnell nach Hause. Ich wollte dem Problem auf die
Spur kommen. Ich wusste, ich müsste eigentlich nur an die Eventlog's des Server's
kommen. Dann wüsste ich schnell was los wäre. Aber welcher SharedHoster lässt
das schon zu.

Ich versuchte es aber trotzdem. Ich nutzte eine Subdomain wo ich Änderungen an meinem Blog
teste. Dort habe ich alles gelöscht. Ich baute mir eine kleine Webseite die mir
das Eventlog ausliest, einwenig filtert und nach dem Datum sortiert.

Zu meiner Überraschung klappte das sogar. Ich konnte das Eventlog auslesen.
Allerdings war ich überrascht was den Schuldigen anbelangt. Das war ich selber. :-)

Log

Irgend wie habe ich am Testblog etwas geändert. Ich weiss einfach nicht
was und wann.

Und wie liest man nun das Eventlog aus? Hier einwenig Code.

default.aspx (aber nicht komplett)

<div>
        <asp:DropDownList ID="ddlLog" runat="server">
            <asp:ListItem>Application</asp:ListItem>
            <asp:ListItem>System</asp:ListItem>
        </asp:DropDownList>
        <asp:CheckBox ID="cboError" runat="server" Checked="True" Text="Error" />
        <asp:CheckBox ID="cboWarning" runat="server" Checked="True" Text="Warning" />
        <asp:CheckBox ID="cboInformation" runat="server" Checked="True" 
            Text="Information" />
        <asp:CheckBox ID="cboSuccessAudit" runat="server" Checked="True" 
            Text="SuccessAudit" />
        <asp:CheckBox ID="cboFailureAudit" runat="server" Checked="True" 
            Text="FailureAudit" />
        <br />
        <asp:Label ID="Label1" runat="server" Text="Items: "></asp:Label>
        <asp:TextBox ID="tbItems" runat="server">250</asp:TextBox>
        <br />
        <asp:Button ID="cmdLoad" runat="server" onclick="cmdLoad_Click" Text="load" 
            Width="108px" />
        <br />
        <asp:Label ID="labError" runat="server" Text=""></asp:Label>
        <asp:GridView ID="dg" runat="server" BackColor="LightGoldenrodYellow" 
            BorderColor="Tan" BorderWidth="1px" CellPadding="2" ForeColor="Black" 
            GridLines="None">
            <FooterStyle BackColor="Tan" />
            <PagerStyle BackColor="PaleGoldenrod" ForeColor="DarkSlateBlue" 
                HorizontalAlign="Center" />
            <SelectedRowStyle BackColor="DarkSlateBlue" ForeColor="GhostWhite" />
            <HeaderStyle BackColor="Tan" Font-Bold="True" />
            <AlternatingRowStyle BackColor="PaleGoldenrod" />
        </asp:GridView>
    </div>

default.aspx.cs (auch nur das Wichtigste)

protected void Page_Load(object sender, EventArgs e)
{
}

protected void cmdLoad_Click(object sender, EventArgs e)
{
	EventLog el = null;

	//Hier kommen alle Events rein damit sie sortiert werden können.
	List<EventLogEntry> entrys = new List<EventLogEntry>();

	try
	{
		//Das Eventlog laden das selektiert ist.
		el = new EventLog(ddlLog.SelectedValue);

		foreach (EventLogEntry entry in el.Entries)
		{
			if ((cboError.Checked) && 
				(entry.EntryType == EventLogEntryType.Error))
			{
				entrys.Add(entry);
			}

			if ((cboWarning.Checked) && 
				(entry.EntryType == EventLogEntryType.Warning))
			{
				entrys.Add(entry);
			}

			if ((cboInformation.Checked) && 
				(entry.EntryType == EventLogEntryType.Information))
			{
				entrys.Add(entry);
			}

			if ((cboSuccessAudit.Checked) && 
				(entry.EntryType == EventLogEntryType.SuccessAudit))
			{
				entrys.Add(entry);
			}

			if ((cboFailureAudit.Checked) && 
				(entry.EntryType == EventLogEntryType.FailureAudit))
			{
				entrys.Add(entry);
			}
		}

		//Die Logs nach Datum sortieren.
		entrys.Sort(EntrySorter);

		//Die Eventlog Einträge an ein DataGrid binden.
		dg.DataSource = entrys.GetRange(0, 
			entrys.Count > int.Parse(tbItems.Text) ? 
			int.Parse(tbItems.Text) : entrys.Count - 1);
		this.DataBind();
	}
	catch (Exception ex)
	{
		labError.Text = ex.ToString();
	}
	finally
	{
		el.Close();
	}
}

//Sortiert nach dem Datum
private static int EntrySorter(EventLogEntry x, EventLogEntry y)
{
	return y.TimeWritten.CompareTo(x.TimeWritten);
}

Der Code ist nicht über alles erhaben. Aber er tut. Das sieht dann etwa so aus.

So sieht das Ergebnis aus.

Das dürfte aber noch lange nicht überall funktionieren. Ich gehe mal davon aus
das die meisten SharedHoster das nicht erlauben.

Tags: , ,

Allerlei | Entwicklung

Übersetzen

Diverses

Seitwert

Locations of visitors to this page

Rating
Excellent - 97%overlay Icon

Statistik