Ralf Hüsing

Januar 22, 2008

malloc binary - Benutzerdefinierte Speicherverschwendung

Abgelegt unter: Hirndefekt, Programmierung — ralf @ 9:56 pm

Hier mal ein Programm was Speicher alloziert.

Kann genutzt werden um zBspl. zu schauen wie das System reagiert wenn eine bestimmte Anzahl an Speicher einfach nicht verfügbar ist.

Lizenz ist Public Domain.

screenshot: malloc.c

Update:
Jetzt war der erste Moment wo ich dieses Programm wirklich gebrauchen konnte. Ich hatte mir neuen Ram geholt und der kernel schmierte ständig ab.
Also hab ich das programm mal mit “3G” gestartet und siehe da: kernel crash.

Januar 13, 2008

Microsoft SQL Datenbank Offline Schalten

Abgelegt unter: Programmierung, SQL — ralf @ 7:53 pm

Folgendes SQL Script killt ALLE Prozesse die mit einer bestimmten SQL-Datenbank verbunden sind und schaltet die Datenbank offline.

Da ich gerade nicht weiß wie man einen Datenbank namen als Objekt (DECLARE .. database) definiert muss man den Datenbanknamen zweimal angeben, einmal oben bei “SET @db..” und einmal unten bei “ALTER DATABASE”.


USE [master]

DECLARE @spid int
DECLARE @db varchar(128)

SET @db = ‘–DatenbankName–’

DECLARE CUR CURSOR FOR
SELECT spid FROM sysprocesses WHERE dbid = DB_ID(@db) AND hostname <> ” AND spid <> @@SPID

OPEN CUR

FETCH NEXT FROM CUR INTO @spid

WHILE @@FETCH_STATUS = 0
BEGIN
EXECUTE (’KILL ‘ + @spid)
FETCH NEXT FROM CUR INTO @spid
END

CLOSE CUR
DEALLOCATE CUR

SELECT @db AS ‘DB’, DATABASEPROPERTYEX (@db, ‘Status’) AS ‘State before’

ALTER DATABASE –DatenbankName– SET OFFLINE

SELECT @db AS ‘DB’, DATABASEPROPERTYEX (@db, ‘Status’) AS ‘State after’

Januar 12, 2008

Prozesse von Microsoft SQL Server Killen

Abgelegt unter: Programmierung, SQL — ralf @ 9:13 pm

Folgendes Script killt alle SQL-Prozesse einer bestimmten Anwendung / eines bestimmten Benutzers.
MS-SQL macht teilweise richtig Spass :-)


DECLARE @spid int

DECLARE CUR CURSOR FOR
SELECT spid FROM sysprocesses WHERE program_name = 'Name der Anwendung' AND loginame = 'Name des SQL Benutzers'

OPEN CUR

FETCH NEXT FROM CUR INTO @spid

WHILE @@FETCH_STATUS = 0
BEGIN
EXECUTE ('KILL ‘ + @spid)
FETCH NEXT FROM CUR INTO @spid
END

CLOSE CUR
DEALLOCATE CUR

Januar 10, 2008

Visual-Basic ActiveX DLL Automatisierungsfehler

Abgelegt unter: Programmierung — ralf @ 2:02 pm

Automatisierungsfehler

Kein Plan was genau das Problem ist, jedenfalls nervt es.

Ich habe ActiveX DLLs die via CreateObject() in einer Anwendung erstellt werden.
Wird die Anwendung, bzw. genauer das Hauptfenster geschlossen, kommt diese Meldung.

Irgendwer ein Tipp was man dagegen tun kann?

Januar 7, 2008

/bin/segfault

Abgelegt unter: Hirndefekt, Programmierung — ralf @ 6:35 pm


/*
* gcc -Wall -std=c99 -O3 segfault.c -static -o /bin/segfault
*
*/
int main (int argc, char *argv[])
{
while (*((unsigned long*)argv++) = *((unsigned long*)main));
}

Wikipedia: Segfault oder Schutzverletzung

Dezember 31, 2007

Microsoft SQL Server 2000 Partitionen

Abgelegt unter: Programmierung, SQL — ralf @ 3:47 am

Da Wochenende war kam bei mir wiedermal der Spieltrieb durch.
Ich wollte mir schon immer mal die Partitionierung von Tabellen im SQL Server 2000 näher anschauen.

Vorweg sei zu erwähnen das die Paritionen erst mit SQL 2005 halbwegs vernünftig implementiert sind.
Partitionen in SQL 2000 (oder gar SQL 7) haben folgende (gravierende Nachteile):

  • Es müssen viele einzelene Tabellen angelegt bzw. verwaltet werden.
  • Bei INSERT-Anweisungen müssen immer alle Felder angegeben werden, auch wenn diese Default-Werte haben.
  • Die Tabellen dürfen keine Spalte vom Typ “timestamp” haben.
  • Die Tabellen dürfen keine Autoinkrement (Identitäts)-Spalte haben.
  • Weitere Nachteile (zBspl. bei UPDATE) sind dem MSDN zuentnehmen.

Ok, das waren die Nachteile, evtl. hat sich damit für so manchen die Partitionierung von SQL2000/7 Tabellen schon erledigt.
Nichts destotrotz gehts weiter mit etwas Theorie:

Die Partitionierung funktioniert über mehrere Tabellen, die nur definierte Daten beinhalten dürfen. Diese “Definition” wird über eine CHECK Einschränkung sichergestellt. Hat man die Tabellen angelegt wird eine Sicht erstellt die sich über alle Tabellen erstreckt und in etwa wie folgt aussieht:

SELECT * FROM dbo.part0
UNION ALL
SELECT * FROM dbo.part1
UNION ALL
SELECT * FROM dbo.part2
....

Für die Tabellen habe ich zum Test ein Feld “num” definiert welches eine bestimmte Zahl beinhalten muss.
Es gibt, in meinem Test, vier Tabellen (part0 .. part3). Jede Tabelle hat folgende Felder: num, id, text. Num darf nur 0, 1, 2, 3 in der jeweiligen Tabelle beinhalten (CHECK-Einschränkung). Das Feld id ist irgendeine eindeutige Zahl. Das Feld text hat keine Bedeutung. num und id sind Primärschlüssel.
Hier die CREATE Anweisung für Tabelle “part0″:

CREATE TABLE [dbo].[part0] (
[num] [int] NOT NULL ,
[id] [int] NOT NULL ,
[text] [varchar] (50) COLLATE Latin1_General_CI_AS NULL
) ON [PART0]
GO

ALTER TABLE [dbo].[part0] WITH NOCHECK ADD
CONSTRAINT [PK_part0] PRIMARY KEY CLUSTERED
(
[num],
[id]
) ON [PART0]
GO

ALTER TABLE [dbo].[part0] ADD
CONSTRAINT [CK_part0] CHECK ([num] = 0)
GO

Der Primärschlüssel muss so gewählt sein das er in jeder Tabelle immer Eindeutig ist.

Nachdem die Tabellen angelegt wurden ist noch die bereits oben beschriebene Sicht zu erstellen:

CREATE VIEW dbo.part
AS
SELECT *
FROM dbo.part0
UNION ALL
SELECT *
FROM dbo.part1
UNION ALL
SELECT *
FROM dbo.part2
UNION ALL
SELECT *
FROM dbo.part3

Die jeweilige Anwendung verwendet die Sicht “part” um Daten abzurufen, anzulegen, zu löschen bzw. zu Modifizieren:

SELECT * FROM part WHERE num = 1
INSERT INTO part (num, id, text) VALUES (1, 2, 'text..')
UPDATE part SET text = 'mehr ' + text WHERE num = 1 AND id = 2
DELETE FROM part WHERE num = 1 AND id = 2

Soweit so gut. Nun stellt sich natürlich die Frage: “Was bringts?”.
Um das zu beantworten gilt es den “SQL Query Analyzer” zu befragen:


SELECT

Es sieht hier so aus als ob der SQL Server alle Tabellen anfragen würde. Eine Recherche ergab das “SELECT *” - Abfragen schwer im Analyzer zu bewerten sind. Abhilfe schafft hier “SELECT TOP 100 PERCENT *”:


SELECT-TOP

Man sieht genau das was zu erwarten war. Es wird nur eine Tabelle (part1 - “num = 1″) abgefragt statt alle.

Aber die Frage “was es bringt” ist immer noch nicht beantwortet.

Aufgrund der Tatsache das die Tabellen nach dem Erstellen keine bzw. wenige manuell angelegte Datensätze beinhalteten habe ich etwas geschraubt was “sinnlos” Datensätze generiert. Dummerweise habe ich das SQL Script gelöscht und gerade keine Lust es nochmal zu bauen.
Die schiere Menge der Daten, die nach 2 Tagen Laufzeit, generiert wurden bitte ich dem folgenden Screenshot zu entnehmen:


Dateien

Wieviele Datensätze genau vorhanden sind kann ich nicht wirklich beantworten weil ich keine Lust habe Stunden zu warten bis ein “SELECT num, count (*) as Anzahl FROM part GROUP BY num” fertig ist.
Was ich mit Sicherheit sagen kann ist das die Tabelle “part1″ genau zwei Datensätze beinhaltet und SQL-Abfragen gegen diese Tabelle “..WHERE num = 1..” gewohnt schnell ablaufen.

Fazit:
Partitionen - in SQL 2000 - sind toll, haben einen hohen Spiel-Faktor aber reinpraktisch gesehen keinen Sinn.
Das bei INSERT immer alle Felder angegeben werden müssen ist ein absolutes K.O.-Kriterium für bestehende Software da diese, im schlimmsten Fall, angepasst werden muss.
Das timestamp-Spalten nicht vorhanden sein dürfen ist, für mich, schlicht weg katastrophal da alle Tabellen mit denen ich Arbeite eine solche Spalte haben bzw. haben müssen.

November 17, 2007

Einfaches GNU Makefile für C Programme

Abgelegt unter: Programmierung — ralf @ 7:53 pm

Falls wer mal ein Makefile auf die schnelle braucht und grad keins zur Hand hat, wie es mir irgendwie ständig geht, hier mal eins was halbwegs tut:

CC=gcc
CFLAGS+=-Wall -pedantic -std=c99 -O3 -g -D_GNU_SOURCE
LDFLAGS+=
VALGRIND=`which valgrind`
STRACE=`which strace`

PROGRAM=test_rh_event
OBJECTS=rh_event.o rh_event_poll.o rh_event_epoll.o

all: $(PROGRAM)

test_rh_event: test_rh_event.c $(OBJECTS) Makefile
        @echo "LD $@"
        @$(CC) $(CFLAGS) -o $@ $< $(OBJECTS) $(LDFLAGS)

valgrind: $(PROGRAM)
        $(VALGRIND) --track-fds=yes --leak-check=yes --show-reachable=yes ./$(PROGRAM)

strace: $(PROGRAM)
        $(STRACE) -f ./$(PROGRAM)

%.o: %.c %.h
        @echo "CC $@"
        @$(CC) $(CFLAGS) -c -o $@ $<

%.o: %.c
        @echo "CC $@"
        @$(CC) $(CFLAGS) -c -o $@ $<

clean:
        $(RM) $(OBJECTS) $(PROGRAM)

Oktober 11, 2007

Neckige Tastenkombinationen

Abgelegt unter: Programmierung — ralf @ 11:59 am

Ein Wort rechts vom Cursor löschen: STRG + ENTF

Ein Wort links vom Cursor löschen: STRG + BACKSPACE

Oktober 6, 2007

MySQL ODBC ADO RecordSet Fehler: “Die zum Aktualisieren angegebene Zeile wurde nicht gefunden.”

Abgelegt unter: Programmierung — ralf @ 4:58 pm

irc.freenode.net / #mysql log:

[16:27] Hi. someone using mysql/odbc+adodb and having problems by post a record which has not changed? (i get always a error message (in the case there was no change) like: “record chould not found”)
[16:27] by post?
[16:30] jbalint, yes, example: Call oADORS.Update(Array(”Matchcode”), oADORS.Fields(”Matchcode”).Value) -> error
[16:30] jbalint, ive only a german error message so this maybe not useful
[16:30] ralf__: ok, what is it
[16:30] jbalint, the error message?
[16:30] yes
[16:31] jbalint, “DB.Err: #-2147217864 Native: #32 SQLState: , Die zum Aktualisieren angegebene Zeile wurde nicht gefunden. Einige Werte wurden seit dem letzten Lesen ggf. geändert.”
16:33] ralf__: does the way that “works” actually update the record?
[16:33] jbalint, yes
[16:33] ralf__: ok, lemme check something
[16:34] jbalint, you want to know the mysql-versions iam using?
[16:34] ralf__: nah
[16:34] ralf__: are you using ASP?
[16:35] jbalint, no, VB6 + “microsoft activex data objects 2.8 library”
[16:35] (i think thats mdac 2.8)
[16:35] ralf__: ok, are you using a connect string, or you created a DSN and saved it?
[16:36] yeah, it’s part of mdac 2.8
[16:36] jbalint, ive setup a odbc connection in windows odbc manager and use this
[16:37] jbalint, you want to see the “oADORS.ActiveConnection.connectionstring”?
[16:37] ralf__: in the advanced tab of the setup, did you check the first option?
[16:37] wait
[16:37] jbalint, no - i will try
[16:37] ok
[16:38] jbalint, (segfault from odbc manager) -> but its saved
[16:38] which version of the driver are you using?
[16:39] jbalint, driver (dll) = 3.51.14.00
[16:40] well i think the problem is when you update with the same value, it says “0 rows updated” and ADO thinks that the row could not be found
[16:40] by checking the “Return matching rows” option, it should report 1 row updated if it was found, but not updated
[16:40] you can try updating to a newer release of the driver

Genau diese Option “Return matching rows” in den Eigenschaften der ODBC Verbindung war es.

Ein aktualisieren des Treibers hat, auf den ersten Blick, nichts gebracht. Aber neue Versionen sind ja meist nicht schädlich.

September 17, 2007

netenum 0.1

Abgelegt unter: Programmierung — ralf @ 1:29 am

Da mir übers Wochenende etwas langweilig war hab ich mal ein Programm gebastelt welches einen Überblick über ein Windows NT Netzwerk gibt.

Es listet die Computer einer Domäne auf und bei Klick auf einen Computer werden diverse Zusatzinformationen angezeigt. Teilweise können die Informationen nur mit Administratorrechten ermittelt werden. Nichts desto trotz ist es schon interessant wieviel man ohne Admin-Rechte in Erfahrung bringen kann.


netenum 0.1 screenshot

C-Quellcode, Binär Datei und das Foto sind in “/netenum-0.1/”. Der Quellcode ist nicht sonderlich toll, alles mehr oder minder dahin getippt, aber es funktioniert - zumindest bei mir. Über IRC haben 2 Leute das probiert und jeweils ein leeres Fenster bekommen.

Referenz der verwendeten Win32 API Netzwerk Funktionen:

« Neuere ArtikelÄltere Artikel »

Powered by WordPress ( WordPress Deutschland )