Im Firefox gibts das Plugin Firebug, und dann kann man mit
console.log("my trace"); im consolen Fenster logs erzeugen - internet explorer 8 bricht das javascript ab wenn copnsole.log erscheint
meine Sys/Db admin & Developper Notitzen - wer Rechtschreibfehler findet darf sie behalten ... my Sys/Db Admin and developper notes - I don't care about typos
Tuesday, August 31, 2010
Friday, August 20, 2010
Properties / Settings in C#
Wenn man in einem Windows Forms Projekt Settings hinzufügt (über Projekteigenschaften Settings oder Ordner Porperties Settings.settings)
wird in der App.config ein je nach Einstellung ApplicationSettings bzw. UserSettings Abschnitt erzeugt. Ist dieser nciht vorhanden, oder fehlen Settings darus, ist auch die Klasse dann im c# Code nicht über den Namespace Properties.Settings zu erreichen. Weiters werden Connectionstrings, also Settings vom Typ Connectionstings in die appconfigsection Connectionsstrings geschrieben (werden z.b. beim Anlegen eines Datasets über den Datasource Wizard erzeugt).
User Settings lassen sich über die Save Methode abspeichern (in den AppData Ordner des jeweiligen Benutzers in user.config), appsettings sind schreibgeschützt
testSettingValue
userTestValue
wird in der App.config ein je nach Einstellung ApplicationSettings bzw. UserSettings Abschnitt erzeugt. Ist dieser nciht vorhanden, oder fehlen Settings darus, ist auch die Klasse dann im c# Code nicht über den Namespace Properties.Settings zu erreichen. Weiters werden Connectionstrings, also Settings vom Typ Connectionstings in die appconfigsection Connectionsstrings geschrieben (werden z.b. beim Anlegen eines Datasets über den Datasource Wizard erzeugt).
User Settings lassen sich über die Save Methode abspeichern (in den AppData Ordner des jeweiligen Benutzers in user.config), appsettings sind schreibgeschützt
XPATH & Namespace
Sobald man mit XPATH Elemente mit Namespace finden will, braucht man ja nach verwendeter XPath Implementierung, eine Möglichkeit Namespaces und dazugehörige Prefixe zu übergeben.
//test sucht alle Elemente, die den Namen test und KEINEN NAMESPACE haben.
//pref:test sucht alle Elemente, die den Namen test und den Namespace, der dem prefix pref zugeordnet ist haben.
in .Net braucht man den XmlNamespaceManager:
XmlNode ret= ret = listService.UpdateListItems(strListID, batchElement);
XmlNamespaceManager xmlNsM = new XmlNamespaceManager(ret.OwnerDocument.NameTable);
xmlNsM.AddNamespace("z","#RowsetSchema");
sharepointGUID = ret.SelectSingleNode("//z:row/@ows_GUID", xmlNsM).Value;
siehe auch
//test sucht alle Elemente, die den Namen test und KEINEN NAMESPACE haben.
//pref:test sucht alle Elemente, die den Namen test und den Namespace, der dem prefix pref zugeordnet ist haben.
in .Net braucht man den XmlNamespaceManager:
XmlNode ret= ret = listService.UpdateListItems(strListID, batchElement);
XmlNamespaceManager xmlNsM = new XmlNamespaceManager(ret.OwnerDocument.NameTable);
xmlNsM.AddNamespace("z","#RowsetSchema");
sharepointGUID = ret.SelectSingleNode("//z:row/@ows_GUID", xmlNsM).Value;
siehe auch
Thursday, August 19, 2010
log4net config für Rolling file, Datenbank und smtp
appender schreiben die messages in files, mails, datenbanken; die messages werden mit den loggern erzeugt, wobei es eine logger hirachie gibt an deren SSpitze der root logger steht, der auch alle messages die in von anderen loggern erzeugt wurden loggt (also an seine appender weitergibt). So ist es möglich mit einem logger z.b. alle log messages eines namespaces (+subnamespaces) zu loggen, also einfaches Beispiel:
im Code:
public class Myclass
{
protected static ILog log = log4net.LogManager.GetLogger("System.Windows.Forms");
public static void TestLog()
{
log.Info("UpdateStockValues"+DateTime.Now);
}
}
in App.config:
nach Level filtern im Appender (loggt keine Info und Debug)
Levels:
•ALL
•DEBUG
•INFO
•WARN
•ERROR
•FATAL
•OFF
Beispiel für config die mittels root logger alles loggt in 3 Appender: file, datenbank und email:
im Code:
public class Myclass
{
protected static ILog log = log4net.LogManager.GetLogger("System.Windows.Forms");
public static void TestLog()
{
log.Info("UpdateStockValues"+DateTime.Now);
}
}
in App.config:
nach Level filtern im Appender (loggt keine Info und Debug)
Levels:
•ALL
•DEBUG
•INFO
•WARN
•ERROR
•FATAL
•OFF
Beispiel für config die mittels root logger alles loggt in 3 Appender: file, datenbank und email:
Tuesday, August 17, 2010
Windwos VPN Server
einfach Routing und access services mit wizard konfigurieren, wichtig: benutzer müssen einwahlrechte haben (Eigenscahften des Benutzers, Einwählen)
Protokolle: VPN Server: Routing und Acess, rechte Maustaste Eigenschaften, letzetses Tab Protokolle
Im System Protokoll findet man IP des Client von dem aus versucht wurde einzuloggen
PPTP: 1723 Port
Protokolle: VPN Server: Routing und Acess, rechte Maustaste Eigenschaften, letzetses Tab Protokolle
Im System Protokoll findet man IP des Client von dem aus versucht wurde einzuloggen
PPTP: 1723 Port
Tuesday, August 10, 2010
W2008 Server WOL
Bei Windwos Server 2008 konnte ich WOL (Wake on LAN) zwar über den Gerätemanager, nicht aber über Netzwerkverbindungen Verwalten konfigurieren. Dort steht unter Eigenschaften der Verbindung, Konfigurieren,
Energieverwaltung, Der Computer kann das Gerät ausschalten um Energie zu sparen, Das Gerät kann den Computer aus dem Ruhezustand aktivieren usw. komplett etwas anderes als eben im Gerätemanger unter derselben Netzwerkkarte. Auch merkt er sich die dort geänderten Einstellungen nciht, wohl aber wenn ich das im Gerätemanager ändere. EIn Bug im Treiber der Realtek PCIe FE Family Controller oder in W2008 ??? Habe leider keinen gleichen Server mit anderer NEtzwerkkarte um zu testen ...
Energieverwaltung, Der Computer kann das Gerät ausschalten um Energie zu sparen, Das Gerät kann den Computer aus dem Ruhezustand aktivieren usw. komplett etwas anderes als eben im Gerätemanger unter derselben Netzwerkkarte. Auch merkt er sich die dort geänderten Einstellungen nciht, wohl aber wenn ich das im Gerätemanager ändere. EIn Bug im Treiber der Realtek PCIe FE Family Controller oder in W2008 ??? Habe leider keinen gleichen Server mit anderer NEtzwerkkarte um zu testen ...
Thursday, July 29, 2010
javascrip: suchen nach Id
GetElementById funktioniert auf manchen objekten nciht, und wenn man relativ suchen möchte bleibt einem nur jquery oder:
function FindChild(par, childid) {
for (i = 0; i < par.childNodes.length; i++) {
x = par.childNodes[i];
if (childid == x.id) return x;
f = FindChild(x, childid);
if (null != f) return f;
}
return null;
}
function FindChild(par, childid) {
for (i = 0; i < par.childNodes.length; i++) {
x = par.childNodes[i];
if (childid == x.id) return x;
f = FindChild(x, childid);
if (null != f) return f;
}
return null;
}
Wednesday, July 28, 2010
Identy von INSERT INTO zurückbekommen
ADO Commandtext "INSERT INTO tbl (test) VALUES (@test);" und SQLOut Parameter @@IDENTITY liefert Fehler "incorrect syntax near @@IDENTITY"
auch "INSERT INTO tbl (test) VALUES (@test);Select @@Identity as @Id" und SQLOut Parameter @Id liefert Fehler "incorrect syntax near @Id"
Lösung:
SET NOCOUNT ON; INSERT INTO tbl (test) VALUES (@test); SELECT @@IDENTITY as Id; mit ExecuteScalar ausführen, gibt object zurück mit Id als decimal
auch "INSERT INTO tbl (test) VALUES (@test);Select @@Identity as @Id" und SQLOut Parameter @Id liefert Fehler "incorrect syntax near @Id"
Lösung:
SET NOCOUNT ON; INSERT INTO tbl (test) VALUES (@test); SELECT @@IDENTITY as Id; mit ExecuteScalar ausführen, gibt object zurück mit Id als decimal
Wednesday, July 21, 2010
Sql Server Änderungs Verfolgungs Technologien:
Trigger
SqlDependency … .net Callback (Query Notification OnChange), aber viele Einschränkungen im Select
CDC … ChangeDataCapture …Inhalt der geänderten Spalten in Tabelle_CT (pro Tabelle die man verfolgt eine Änderungstabelle)
CT Change Tracking … nur Primary Key der geänderten Zeilen
SqlTrace … loggt in Files
Notify … Depricated, Notifikationen auf SMS, EMail, http usw.
CT einschalten:
ALTER DATABASE NotificationTest SET CHANGE_TRACKING = ON (CHANGE_RETENTION = 3 DAYS, AUTO_CLEANUP = ON)
SELECT * FROM sys.change_tracking_databases
ALTER DATABASE NotificationTest SET ALLOW_SNAPSHOT_ISOLATION ON;
ALTER TABLE dbo.Tasks ENABLE CHANGE_TRACKING WITH(TRACK_COLUMNS_UPDATED = ON)
SELECT * FROM sys.change_tracking_tables
--Änderungen abfragen
SELECT * FROM CHANGETABLE (CHANGES dbo.Tasks,0) as CT
CDC einschalten:
EXEC sys.sp_cdc_enable_db
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'Tasks',
@role_name = NULL,
@supports_net_changes = 1
select * from cdc.captured_columns
select * from cdc.change_tables
select * from cdc.dbo_Tasks_CT --- History (alle Datensätze vorher, Nachher)
SqlDependency … .net Callback (Query Notification OnChange), aber viele Einschränkungen im Select
CDC … ChangeDataCapture …Inhalt der geänderten Spalten in Tabelle_CT (pro Tabelle die man verfolgt eine Änderungstabelle)
CT Change Tracking … nur Primary Key der geänderten Zeilen
SqlTrace … loggt in Files
Notify … Depricated, Notifikationen auf SMS, EMail, http usw.
CT einschalten:
ALTER DATABASE NotificationTest SET CHANGE_TRACKING = ON (CHANGE_RETENTION = 3 DAYS, AUTO_CLEANUP = ON)
SELECT * FROM sys.change_tracking_databases
ALTER DATABASE NotificationTest SET ALLOW_SNAPSHOT_ISOLATION ON;
ALTER TABLE dbo.Tasks ENABLE CHANGE_TRACKING WITH(TRACK_COLUMNS_UPDATED = ON)
SELECT * FROM sys.change_tracking_tables
--Änderungen abfragen
SELECT * FROM CHANGETABLE (CHANGES dbo.Tasks,0) as CT
CDC einschalten:
EXEC sys.sp_cdc_enable_db
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'Tasks',
@role_name = NULL,
@supports_net_changes = 1
select * from cdc.captured_columns
select * from cdc.change_tables
select * from cdc.dbo_Tasks_CT --- History (alle Datensätze vorher, Nachher)
Web Controls Dynamisch Erzeugen / Web Page Lebenszyklus
Controls immer in PreInit erzeugen (vorher werden die durch den aspx html angegebenen controls erzeugt), dannach werden sie in Init initialisiert (also z.b. Viewstate=Value reingeschrieben ...)
Ein Beispiel mit DropDowns:
public partial class _Default : System.Web.UI.Page
{
//Lebenszyklus: http://msdn.microsoft.com/en-us/library/ms178472.aspx
//Page_PreInit
//Page_Init
//Page_InitComplete
//Page_Load
const int ddlMax=9;
DropDownList[] ddls = new DropDownList[ddlMax];
protected void Page_PreInit(object sender, EventArgs e)
{
/*
Raised after the start stage is complete and before the initialization stage begins.
Use this event for the following:
Check the IsPostBack property to determine whether this is the first time the page is being processed. The IsCallback and IsCrossPagePostBack properties have also been set at this time.
Create or re-create dynamic controls.
Set a master page dynamically.
Set the Theme property dynamically.
Read or set profile property values.
Note
If the request is a postback, the values of the controls have not yet been restored from view state. If you set a control property at this stage, its value might be overwritten in the next event.
*/
for (int i = 0; i < ddlMax; i++)
{
DropDownList ddlx = new DropDownList();
ddlx.ID = "ddl"+i.ToString();
for (int item = 0; item < i; item++)
{
ddlx.Items.Add(ddlx.ID + item.ToString());
}
form1.Controls.Add(ddlx);
ddls[i] = ddlx;
//panDDLs.Controls.Add(ddlx);
}
}
protected void Page_Init(object sender, EventArgs e)
{
/*
* Raised after all controls have been initialized and any skin settings have been applied. The Init event of individual controls occurs before the Init event of the page.
Use this event to read or initialize control properties.
*/
}
protected void Page_InitComplete(object sender, EventArgs e)
{
}
protected void Page_PreLoad(object sender, EventArgs e)
{
}
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("
DropDownValues
");
for (int i = 0; i < ddlMax; i++)
{
Response.Write("ddl Nr.:" + i.ToString() + " value=" + ddls[i].SelectedValue+"
");
}
}
// ------------------ Control Events -------------------
protected void Page_LoadComplete(object sender, EventArgs e)
{
}
protected void Page_PreRender(object sender, EventArgs e)
{
}
protected void Page_PreRenderComplete(object sender, EventArgs e)
{
}
protected void Page_SaveStateComplete(object sender, EventArgs e)
{
}
protected void Page_Render(object sender, EventArgs e)
{
}
protected void Page_Unload(object sender, EventArgs e)
{
}
}
Ein Beispiel mit DropDowns:
public partial class _Default : System.Web.UI.Page
{
//Lebenszyklus: http://msdn.microsoft.com/en-us/library/ms178472.aspx
//Page_PreInit
//Page_Init
//Page_InitComplete
//Page_Load
const int ddlMax=9;
DropDownList[] ddls = new DropDownList[ddlMax];
protected void Page_PreInit(object sender, EventArgs e)
{
/*
Raised after the start stage is complete and before the initialization stage begins.
Use this event for the following:
Check the IsPostBack property to determine whether this is the first time the page is being processed. The IsCallback and IsCrossPagePostBack properties have also been set at this time.
Create or re-create dynamic controls.
Set a master page dynamically.
Set the Theme property dynamically.
Read or set profile property values.
Note
If the request is a postback, the values of the controls have not yet been restored from view state. If you set a control property at this stage, its value might be overwritten in the next event.
*/
for (int i = 0; i < ddlMax; i++)
{
DropDownList ddlx = new DropDownList();
ddlx.ID = "ddl"+i.ToString();
for (int item = 0; item < i; item++)
{
ddlx.Items.Add(ddlx.ID + item.ToString());
}
form1.Controls.Add(ddlx);
ddls[i] = ddlx;
//panDDLs.Controls.Add(ddlx);
}
}
protected void Page_Init(object sender, EventArgs e)
{
/*
* Raised after all controls have been initialized and any skin settings have been applied. The Init event of individual controls occurs before the Init event of the page.
Use this event to read or initialize control properties.
*/
}
protected void Page_InitComplete(object sender, EventArgs e)
{
}
protected void Page_PreLoad(object sender, EventArgs e)
{
}
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("
DropDownValues
");
for (int i = 0; i < ddlMax; i++)
{
Response.Write("ddl Nr.:" + i.ToString() + " value=" + ddls[i].SelectedValue+"
");
}
}
// ------------------ Control Events -------------------
protected void Page_LoadComplete(object sender, EventArgs e)
{
}
protected void Page_PreRender(object sender, EventArgs e)
{
}
protected void Page_PreRenderComplete(object sender, EventArgs e)
{
}
protected void Page_SaveStateComplete(object sender, EventArgs e)
{
}
protected void Page_Render(object sender, EventArgs e)
{
}
protected void Page_Unload(object sender, EventArgs e)
{
}
}
Thursday, July 08, 2010
Installationsprobleme bei SQL 2005
Das SQL 2005 Installationsprogramm prüft immer genau, ob bereits eine andere Installation vorhanden ist. So muss man z.b. wenn SQLExpress bereits installiert ist, entweder deinstallieren oder mit spezieller Option das Setup Programm einer anderen Version aufrufen.
Wenn man ein Service Pack installiert hat, können nur mehr über "Add and Remove Programms" Komponenten hinzugefügt werden.
Wenn man ein Service Pack installiert hat, können nur mehr über "Add and Remove Programms" Komponenten hinzugefügt werden.
Wednesday, July 07, 2010
Sharepoint integrated reporting services
benötig SQL Server SP2;
0) WICHTIG: ssrs (Reporting Service) nicht unter Local System account installieren, da dieser keinen Zugriff auf die Sharepoint Datenbank hat. Wichitg: wenn man bereits unter Local System installiert hat, unbedingt den DatabaseKey sichern, bevor man den Account wechselt, sonst hat man keinen Zugriff mehr auf die ReportServer DB und muß diese löschen und neu erzeugen
1) Reporting Services Configuration: Datenbank auf Sharepoint Integrierten Modus umstellen (wichtig geht nur mit SP2) => eine neue Datenbank wird erzeugt, diverse Rechte gesetz. Der ReportManager (http://server/Reports) funktioniert dann nicht mehr und liefert: Der -Vorgang wird auf einem Berichtsserver, der für die Ausführung im integrierten SharePoint-Modus konfiguriert ist, nicht unterstützt. (rsOperationNotSupportedSharePointMode) 2) Reporting Services-Add für Sharepoint Server installieren
die Reportserver WebAnwendung funktioniert aber nach wie vor http://server/Reportserver)
2) In der Sharepoint Central Administration unter Application Management / Reporting Services die ReportServer Url eintragen und die Datenbank Rechte vergeben, wichtig ist dass:
der Reporting Service User ssrs genannt, der den apppool der Report Server Anwendung betreibt, auf die Document Library am sharepoint Zugriff hat
Sharepoint sendet Request an Report Server Webapp, diese möchte sich Report Definition File rdl vom Sharepoint runterladen, das Windows Service,sollte Zugriff auf Sharepoint Dbs haben
3) erzeugen einer Documentlibrary ohne default typ, raufladen eines rdl files (am besten ohne shared datasource zum ausprobieren, mit Sql Server Credentials , man kann Datasource mit rechte Maustaste auf Report bearbeiten (Mangae Datasources), testen ob der Report funktioniert
4) Troubleshooting:
Integration service logs:
C:\Program Files\Microsoft SQL Server\MSSQL.2\Reporting Services\LogFiles
sowie in Report Datenbank Tabelle Execution Log
0) WICHTIG: ssrs (Reporting Service) nicht unter Local System account installieren, da dieser keinen Zugriff auf die Sharepoint Datenbank hat. Wichitg: wenn man bereits unter Local System installiert hat, unbedingt den DatabaseKey sichern, bevor man den Account wechselt, sonst hat man keinen Zugriff mehr auf die ReportServer DB und muß diese löschen und neu erzeugen
1) Reporting Services Configuration: Datenbank auf Sharepoint Integrierten Modus umstellen (wichtig geht nur mit SP2) => eine neue Datenbank wird erzeugt, diverse Rechte gesetz. Der ReportManager (http://server/Reports) funktioniert dann nicht mehr und liefert: Der -Vorgang wird auf einem Berichtsserver, der für die Ausführung im integrierten SharePoint-Modus konfiguriert ist, nicht unterstützt. (rsOperationNotSupportedSharePointMode) 2) Reporting Services-Add für Sharepoint Server installieren
die Reportserver WebAnwendung funktioniert aber nach wie vor http://server/Reportserver)
2) In der Sharepoint Central Administration unter Application Management / Reporting Services die ReportServer Url eintragen und die Datenbank Rechte vergeben, wichtig ist dass:
der Reporting Service User ssrs genannt, der den apppool der Report Server Anwendung betreibt, auf die Document Library am sharepoint Zugriff hat
Sharepoint sendet Request an Report Server Webapp, diese möchte sich Report Definition File rdl vom Sharepoint runterladen, das Windows Service,sollte Zugriff auf Sharepoint Dbs haben
3) erzeugen einer Documentlibrary ohne default typ, raufladen eines rdl files (am besten ohne shared datasource zum ausprobieren, mit Sql Server Credentials , man kann Datasource mit rechte Maustaste auf Report bearbeiten (Mangae Datasources), testen ob der Report funktioniert
4) Troubleshooting:
Integration service logs:
C:\Program Files\Microsoft SQL Server\MSSQL.2\Reporting Services\LogFiles
sowie in Report Datenbank Tabelle Execution Log
Thursday, June 17, 2010
Monday, May 31, 2010
Miniatur Ansicht statt Symbole im Explorer
Im Extras Menü / Ordneroptionen, Tab Ansicht "Immer Symbole statt Minituransicht anzeigen" abhacken
Tuesday, May 18, 2010
Windows7 Wake Up
In WIndows 7 kann man bei Tastatatur und Mäusen auch im Gerätemanger einstellen, ob sie das System aus dem Ruhezustand wecken dürfen, dies überschreibt die BIOS einstellungen.
POWERCFG -DEVICEQUERY wake_armed
werden alle Devices angezeigt, die das System aus dem Ruhezustand aufwecken können.
POWERCFG -lastwake
gibt den Grund für das letze Aufwachen an (auch im Ereignisprotokoll sichtbar)
POWERCFG -DEVICEQUERY wake_armed
werden alle Devices angezeigt, die das System aus dem Ruhezustand aufwecken können.
POWERCFG -lastwake
gibt den Grund für das letze Aufwachen an (auch im Ereignisprotokoll sichtbar)
Excel 2007 CSV importieren
In früheren Excel Versionen konnte man beim Datei öffnen den Textimport Assisenten benutzen - nun öffnet man einfach die Datei, markiert die Spalte mit den Werten die man aufteilen möchte, wählt im Daten Menü unter Datentools Text in Spalten und teit damit die Daten in mehrere Spalten auf
Friday, April 30, 2010
Tuesday, April 27, 2010
Remotedesktop Port ändern
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp
Portnumber
Portnumber
Windows Server Kennwortrichtlinien, Anmelden als Dienst
Start/Verwaltung/Gruppenrichtlinienverwaltung (als DOmän Admin !)
default domänen policy rechte Maustzaste bearbeiten
ComputerKonfig/WindowsEinst/Sicherheitseinst/Kontorichtlinien
Start|Programme|Verwaltung|Lokale Sicherheitsrichtlinie
Lokale Sicherheitseinstellungen|Lokale Richtlinien "Zuweisung von Benutzerrechten" ,"Als Dienst anmelden".
default domänen policy rechte Maustzaste bearbeiten
ComputerKonfig/WindowsEinst/Sicherheitseinst/Kontorichtlinien
Start|Programme|Verwaltung|Lokale Sicherheitsrichtlinie
Lokale Sicherheitseinstellungen|Lokale Richtlinien "Zuweisung von Benutzerrechten" ,"Als Dienst anmelden".
Tuesday, April 20, 2010
for XML um strings einer unterabfrage zusammenzufügen
einfachste verwendung von for xml:
select * from sys.objects for Xml Auto
erezugt ein XML das für jede tabellenzeile ein xml element mit attributen für jede spalte enthält
select * from sys.objects for XML PATH('') erezugt für jede zeile ein set von xml elementen für jede spalte mit den spaltenwerten
select ','+ name from sys.objects for XML Path('')
enthält keine elemnte tags, da die spalte keinen namen hat, also nur einen , seperierten string als xml
select cast( (select ', '+lastname from [User] for Xml PATH('') ) as Varchar(MAX))
wandelt das ganze in einen string um
select * from sys.objects for Xml Auto
erezugt ein XML das für jede tabellenzeile ein xml element mit attributen für jede spalte enthält
select * from sys.objects for XML PATH('') erezugt für jede zeile ein set von xml elementen für jede spalte mit den spaltenwerten
select ','+ name from sys.objects for XML Path('')
enthält keine elemnte tags, da die spalte keinen namen hat, also nur einen , seperierten string als xml
select cast( (select ', '+lastname from [User] for Xml PATH('') ) as Varchar(MAX))
wandelt das ganze in einen string um
Subscribe to:
Posts (Atom)