Folgende Zeile muss in der App.cs im OnStartup ergänzt werden:
FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
4.28.2016
4.21.2016
IP-Adresse des Client in einem Web.API 2.x Controler ermitteln
Nach dem Einbinden von System.ServiceModel
funktioniert folgender Code:
private string GetClientIp(HttpRequestMessage request = null)
{
request = request ?? this.Request;
if (request.Properties.ContainsKey("MS_HttpContext"))
{
return ((HttpContextWrapper)request.Properties["MS_HttpContext"]).Request.UserHostAddress;
}
else if (request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name))
{
RemoteEndpointMessageProperty prop = (RemoteEndpointMessageProperty)this.Request.Properties[RemoteEndpointMessageProperty.Name];
return prop.Address;
}
else if (HttpContext.Current != null)
{
return HttpContext.Current.Request.UserHostAddress;
}
else
{
return null;
}
}
{
request = request ?? this.Request;
if (request.Properties.ContainsKey("MS_HttpContext"))
{
return ((HttpContextWrapper)request.Properties["MS_HttpContext"]).Request.UserHostAddress;
}
else if (request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name))
{
RemoteEndpointMessageProperty prop = (RemoteEndpointMessageProperty)this.Request.Properties[RemoteEndpointMessageProperty.Name];
return prop.Address;
}
else if (HttpContext.Current != null)
{
return HttpContext.Current.Request.UserHostAddress;
}
else
{
return null;
}
}
1.14.2016
WPF Listbox mit bleibender Markierung
Auch wenn ein anderes Element den Focus bekommt, bleibt der Eintrag "aktiv" markiert.
Events als Behaviors / Events in MVVM
Für WPF:
Verweis auf Microsoft.XAML.Interactions notwendig
...
xmlns:i=http://schemas.microsoft.com/expression/2010/interactivity
...
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<i:InvokeCommandAction Command="{Binding LoadedCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
Für WinPhone 8.1:
Verweis auf Behaviors SDK (XAML)
...
xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
xmlns:core="using:Microsoft.Xaml.Interactions.Core"
...
<interactivity:Interaction.Behaviors>
<core:EventTriggerBehavior EventName="Tapped">
<core:InvokeCommandAction Command="{Binding RufeNummerAnCommand, Mode=OneWay}"/>
</core:EventTriggerBehavior>
</interactivity:Interaction.Behaviors>
Verweis auf Microsoft.XAML.Interactions notwendig
...
xmlns:i=http://schemas.microsoft.com/expression/2010/interactivity
...
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<i:InvokeCommandAction Command="{Binding LoadedCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
Für WinPhone 8.1:
Verweis auf Behaviors SDK (XAML)
...
xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
xmlns:core="using:Microsoft.Xaml.Interactions.Core"
...
<interactivity:Interaction.Behaviors>
<core:EventTriggerBehavior EventName="Tapped">
<core:InvokeCommandAction Command="{Binding RufeNummerAnCommand, Mode=OneWay}"/>
</core:EventTriggerBehavior>
</interactivity:Interaction.Behaviors>
1.13.2016
Veröffentlichen von ASP.NET Web-API RESTService per FileCopy
Vorbereitung des Codes
- Im Projektmappenexplorer von VisualStudio das Webserver-Projekt rechtsklicken
- Neues "Custom"-Profil anlegen
- Publis method:"File System" wählen und Pfad angeben
- Assistent bis zu Ende benutzen
- Inhalt des Zielverzeichnisses auf den Server kopieren, auf dem der IIS läuft
Vorbereitung des IIS
Neue Website einrichten deren physikalischer Pfad auf das Verzeichnis verweist, in dem der Code auf dem Server liegt.11.11.2015
Singelton in C#
#region Singleton
private static xxx _instance;
private xxx() { }
public static xxx Instance
{
get
{
if (_instance == null)
{
_instance = new xxx();
}
return _instance;
}
}
#endregion
private static xxx _instance;
private xxx() { }
public static xxx Instance
{
get
{
if (_instance == null)
{
_instance = new xxx();
}
return _instance;
}
}
#endregion
Converter, die man (fast) immer braucht
Sichtbarkeit über Bool (unsichtbar):
public class Boolean2VisibleConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool)
{
if ((bool)value)
return Visibility.Visible;
}
return Visibility.Hidden;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool)
{
if ((bool)value)
return Visibility.Visible;
}
return Visibility.Hidden;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Sichtbarkeit über Bool (ausgeblendet):
public class Boolean2VisibleCollapsedConverter:IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool)
{
if ((bool)value)
return Visibility.Visible;
}
return Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool)
{
if ((bool)value)
return Visibility.Visible;
}
return Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
5.08.2012
Oldi but goldi: Active-X Registrierung per Kontextmenu
Folgenden Text in eine Textdatei einfügen:
REGEDIT4
' -------------------------------------------------------
' Erweiterung des Windows Explorer-Kontextmenüs um die
' Einträge "Registrieren" und "Deregistrieren" bei Aus-
' wahl von DLL- und OCX-Dateien.
' -------------------------------------------------------
' Explorer-Kontextmenüerweiterung für DLL-Dateien:
[HKEY_CLASSES_ROOT\.dll]
@="dllfile"
[HKEY_CLASSES_ROOT\dllfile]
@="DLL"
[HKEY_CLASSES_ROOT\dllfile\Shell\Registrieren\command]
@="REGSVR32 \"%1\""
[HKEY_CLASSES_ROOT\dllfile\Shell\Deregistrieren\command]
@="REGSVR32 /u \"%1\""
' Explorer-Kontextmenüerweiterung für OCX-Dateien:
[HKEY_CLASSES_ROOT\.ocx]
@="ocxfile"
[HKEY_CLASSES_ROOT\ocxfile]
@="OCX"
[HKEY_CLASSES_ROOT\ocxfile\Shell\Registrieren\command]
@="REGSVR32 \"%1\""
[HKEY_CLASSES_ROOT\ocxfile\Shell\Deregistrieren\command]
@="REGSVR32 /u \"%1\""
' -------------------------------------------------------
Datei als irgendwas.reg speichern, doppelklicken und Registrirung erweitern.
Ab da ist dann bei ActiveX-Dateien das Kontextmenu um Deregistrieren und Registriern erweitert.
Quelle: http://msdn.microsoft.com/de-de/library/bb979360.aspx
REGEDIT4
' -------------------------------------------------------
' Erweiterung des Windows Explorer-Kontextmenüs um die
' Einträge "Registrieren" und "Deregistrieren" bei Aus-
' wahl von DLL- und OCX-Dateien.
' -------------------------------------------------------
' Explorer-Kontextmenüerweiterung für DLL-Dateien:
[HKEY_CLASSES_ROOT\.dll]
@="dllfile"
[HKEY_CLASSES_ROOT\dllfile]
@="DLL"
[HKEY_CLASSES_ROOT\dllfile\Shell\Registrieren\command]
@="REGSVR32 \"%1\""
[HKEY_CLASSES_ROOT\dllfile\Shell\Deregistrieren\command]
@="REGSVR32 /u \"%1\""
' Explorer-Kontextmenüerweiterung für OCX-Dateien:
[HKEY_CLASSES_ROOT\.ocx]
@="ocxfile"
[HKEY_CLASSES_ROOT\ocxfile]
@="OCX"
[HKEY_CLASSES_ROOT\ocxfile\Shell\Registrieren\command]
@="REGSVR32 \"%1\""
[HKEY_CLASSES_ROOT\ocxfile\Shell\Deregistrieren\command]
@="REGSVR32 /u \"%1\""
' -------------------------------------------------------
Datei als irgendwas.reg speichern, doppelklicken und Registrirung erweitern.
Ab da ist dann bei ActiveX-Dateien das Kontextmenu um Deregistrieren und Registriern erweitert.
Quelle: http://msdn.microsoft.com/de-de/library/bb979360.aspx
4.13.2012
ORACLE neu starten
1. Schau mal auf dem Datnbankserver in der Systemsteuerung unter Dienste, ob der Dienst "OracleService" gestartet ist, wobei Du durch den Namen der Oracle-Instanz ersetzen mußt. In Deinem Fall müßte (wenn ich es recht sehe) der Dienstname OracleServiceTest lauten. Sollte der Dienst nicht gestartet sein, starte ihn.
2. Öffne auf dem DB-Server eine DOS-Box. Setze die Umgebungsvariable ORACLE_SID auf den Namen der Datenbankinstanz und melde Dich dann als sysdba mit SQL*Plus an:
set ORACLE_SID= (Achtung: Auch hier wieder durch den Namen der Datenbankinstanz ersetzen!)
sqlplus / as sysdba
Danach setze mal folgende Abfrage in SQL*Plus ab:
SQL1.SELECT STATUS FROM v$instance;
Sollte hier irgendein anderer Status als "OPEN" zurückgegeben werden, ist die Datenbank nicht geöffnet. In diesem Fall würde ich die DB versuchen durchzustarten und zu öffnen:
SQL1.shutdown immediate;2.startup;
2. Öffne auf dem DB-Server eine DOS-Box. Setze die Umgebungsvariable ORACLE_SID auf den Namen der Datenbankinstanz und melde Dich dann als sysdba mit SQL*Plus an:
set ORACLE_SID=
sqlplus / as sysdba
Danach setze mal folgende Abfrage in SQL*Plus ab:
SQL1.SELECT STATUS FROM v$instance;
Sollte hier irgendein anderer Status als "OPEN" zurückgegeben werden, ist die Datenbank nicht geöffnet. In diesem Fall würde ich die DB versuchen durchzustarten und zu öffnen:
SQL1.shutdown immediate;2.startup;
1.25.2012
Datum zu Kalenderwoche in VB.NET
Private Function StartDatumDerKW(ByVal Jahr As Integer, ByVal KW As Integer) As DateTime
' > der vierte Januar des gegebenen Jahres wird erst mal benötigt
Dim dteStartTag As New DateTime(Jahr, 1, 4)
' > hole den ersten Wochentag der ersten Woche
Dim intWochentag As Integer = ((Int(dteStartTag.DayOfWeek) + 6) Mod 7) + 1
' > die Kalenderwoche beginnt aber eventuell n Tage vorher
Dim dteErsterTag As DateTime = dteStartTag.AddDays(1 - intWochentag)
Return CDate(dteErsterTag.AddDays((KW - 1) * 7))
End Function
' > der vierte Januar des gegebenen Jahres wird erst mal benötigt
Dim dteStartTag As New DateTime(Jahr, 1, 4)
' > hole den ersten Wochentag der ersten Woche
Dim intWochentag As Integer = ((Int(dteStartTag.DayOfWeek) + 6) Mod 7) + 1
' > die Kalenderwoche beginnt aber eventuell n Tage vorher
Dim dteErsterTag As DateTime = dteStartTag.AddDays(1 - intWochentag)
Return CDate(dteErsterTag.AddDays((KW - 1) * 7))
End Function
Kalenderwoche in Datum in ORACLE
SELECT
TRUNC(TO_DATE('2511[Jahr]', 'DDMMYYYY'), 'IYYY') + ([KW] - 1) * 7 AS date_from,
TRUNC(TO_DATE('2511[Jahr]', 'DDMMYYYY'), 'IYYY') + ([KW] - 1) * 7 + 6 AS date_to
FROM sys.dual;
TRUNC(TO_DATE('2511[Jahr]', 'DDMMYYYY'), 'IYYY') + ([KW] - 1) * 7 AS date_from,
TRUNC(TO_DATE('2511[Jahr]', 'DDMMYYYY'), 'IYYY') + ([KW] - 1) * 7 + 6 AS date_to
FROM sys.dual;
11.02.2010
Splash-Screen-Problem in VB.Net
Problem: Ein Formular das nach einem Splash-Screen gezeigt werden soll und nicht das Hauptformular ist (z.B. Login) erhält nicht den Fokus.
Lösung:
private m_FormLoaded as boolean
Private Sub frmLogin_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
m_FormLoaded = True
txtUserID.Text = String.Empty
End Sub
Private Sub txtUserID_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtUserID.GotFocus
'This hack ensures that the user id field receives focus.
'For some reason it appeared to have focus however was not responding until
'user clicked on the Form!
If m_FormLoaded = False Then
System.Windows.Forms.SendKeys.Send(ControlChars.Back)
txtUserID.Text = String.Empty
End If
End Sub
Quelle:
http://bytes.com/topic/visual-basic-net/answers/638041-application-startup-event-splash-login-screens
Lösung:
private m_FormLoaded as boolean
Private Sub frmLogin_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
m_FormLoaded = True
txtUserID.Text = String.Empty
End Sub
Private Sub txtUserID_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtUserID.GotFocus
'This hack ensures that the user id field receives focus.
'For some reason it appeared to have focus however was not responding until
'user clicked on the Form!
If m_FormLoaded = False Then
System.Windows.Forms.SendKeys.Send(ControlChars.Back)
txtUserID.Text = String.Empty
End If
End Sub
Quelle:
http://bytes.com/topic/visual-basic-net/answers/638041-application-startup-event-splash-login-screens
8.06.2010
Access schneidet Memofeld ab
Wenn in einer Anfügeabfrage ein Memofeld verwendet wird über das gruppiert wird, so wird der Text auf 255 Zeichen gekürzt!
5.31.2010
.NET-Zauberzeug
System.Diagnostics.Process.Start (BefehlAlsString)
scheint der extrem leistungsfähige Nachfolger des Shell-Befehls zu sein. Egal ob Excel, Word, Bild, Video, HTML-Adresse oder "mailTo"-Anweisung. Es wird immer das Programm gestartet dass unter Windows mit dem Dateityp verbunden ist.
Zauberzeug!
scheint der extrem leistungsfähige Nachfolger des Shell-Befehls zu sein. Egal ob Excel, Word, Bild, Video, HTML-Adresse oder "mailTo"-Anweisung. Es wird immer das Programm gestartet dass unter Windows mit dem Dateityp verbunden ist.
Zauberzeug!
4.27.2010
ORACLE und Kaufmanns-Und (&)
Das habe ich in 256bit.org Blog gefunden:
Montag, 9. Oktober 2006
Oracle SQL und die Bedeutung verschiedener Sonderzeichen
Momentan arbeite ich an einem etwas größerem Data-Warehouse Projekt und verwalte dort die SQL-Scripte. Dabei kommt es schon vor, dass verschiedene Sachen in die Datenbank eingefügt werden müssen. Letztens stolperte ich dabei über das folgende Phänomen:
SQL> insert into temp_data(name, version) values ('A & P', 3);
Enter value for p: blah
old 1: insert into temp_data values ('A & P', 3)
new 1: insert into temp_data values ('A blah', 3)
1 row created.
Was passiert hier? Nun, Zeichenketten, die mit dem Kaufmannsund anfangen, werden von Oracle als Beginn von Variablennamen definiert. So kann man den Inhalt einer Variablen in ein Textfeld einfügen. Eine Variable kann z.B. so definiert werden:
col spoolfile new_value spoolfile
select '/tmp/logfile_'
to_char(sysdate,'yyyymmdd_HHMI')
'.txt' as spoolfile from dual;
spool &spoolfile
Hier wird in die Variable spoolfile der aktuelle Zeitstempel gespeichert und diese Variable nachher genutzt, um die Log-Datei festzulegen.
Bis hier ist es ok. Wie kann man jetzt ein '&' innerhalb eines Insert-Statements verwenden, obiges Statement funktioniert ja nicht? Man kann Oracle beibringen, dass es keine Variablen-Substitution machen soll. Dies geschieht über ein Set-Statement:
-- Ausschalten des Interpretierens von Variablennamen
-- Dadurch kann & innerhalb von SQL-Statements angegeben werden
set define off
Wenn man jetzt also ein Kaufmannsund braucht und Variablensubstitution nicht ausschalten möchte, ist das schwieriger zu erreichen. Die offensichtliche Lösung besteht darin ähnlich wie in den SELECT-Abfragen die Wildcards % und _ mittels ESCAPE-Zusatz zu maskieren. Die Zeichen % stehen für ein Match auf beliebig viele Zeichen, der Unterstrich matcht genau ein beliebiges Zeichen, wenn man jetzt nach dem Zeichen % sucht, muß man dieses dann eben escapen:
SELECT * FROM testtab WHERE textfeld LIKE '%20@%%' ESCAPE '@';
Hiermit würde man alle Felder finden, in denen die Zeichenkette "20%" vorkommt, egal ob am Anfang oder mittendrin oder am Ende.
Das funktioniert nur leider eben nicht für Insert-Statements:
SQL> insert into temp_data(name,version) values ('A @& P' ESCAPE '@', 3);
Enter value for p: blah
old 1: insert into temp_data values ('A & P', 3)
new 1: insert into temp_data values ('A blah', 3)
1 row created.
Wer sich jetzt fragt, warum ich darüber blogge, reicht doch ein einfaches set define off vor dieser Anweisung und evtl. hinterher ein set define on um die Variablensubstitution aus- und wieder einzuschalten, hat noch nicht folgendes probiert:
col version new_value version
select versionsnr into version from versionstabelle where status='aktiv';
SQL> insert into temp_data(name,version) values ('A & P', &version);
Enter value for p: blah
old 1: insert into temp_data values ('A & P', &version)
new 1: insert into temp_data values ('A blah', 3)
1 row created.
Nein, clevererweise hat sich Oracle hier etwas ganz besonderes einfallen lassen. ESCAPE wäre ja auch zu einfach gewesen. Möchte man unbedingt und auf jeden Fall sowohl Variablen, als auch das Kaufmannsund innerhalb eines Statements haben, muß man diese Zeichenkette als 2 Zeichenketten angeben und diese dann noch konkatenieren. Dabei muß das Kaufmannsund das letzte Zeichen des ersten Teils sein. Das obige Statement sähe dann etwa so aus:
col version new_value version
select versionsnr into version from versionstabelle where status='aktiv';
SQL> insert into temp_data(name,version) values ('A &' || ' P', &version);
old 1: insert into temp_data values ('A & P', &version)
new 1: insert into temp_data values ('A & P', 3)
1 row created.
Ja genau, auf sowas muß man erstmal kommen und in den Oracle-Dokus steht dazu nämlich garantiert nichts, zumindest nichts offensichtliches.
Disclaimer: alle obigen SQL-Statements sind aus meiner Erinnerung abgetippt. Sie sind evtl. nicht ganz syntaktisch korrekt, aber ich hab zuhause halt keine Oracle laufen und so muß ich mein Gedächtnis bemühen.
Ein Dank geht an "The Oracle (tm) Users' Co-Operative FAQ"
Montag, 9. Oktober 2006
Oracle SQL und die Bedeutung verschiedener Sonderzeichen
Momentan arbeite ich an einem etwas größerem Data-Warehouse Projekt und verwalte dort die SQL-Scripte. Dabei kommt es schon vor, dass verschiedene Sachen in die Datenbank eingefügt werden müssen. Letztens stolperte ich dabei über das folgende Phänomen:
SQL> insert into temp_data(name, version) values ('A & P', 3);
Enter value for p: blah
old 1: insert into temp_data values ('A & P', 3)
new 1: insert into temp_data values ('A blah', 3)
1 row created.
Was passiert hier? Nun, Zeichenketten, die mit dem Kaufmannsund anfangen, werden von Oracle als Beginn von Variablennamen definiert. So kann man den Inhalt einer Variablen in ein Textfeld einfügen. Eine Variable kann z.B. so definiert werden:
col spoolfile new_value spoolfile
select '/tmp/logfile_'
to_char(sysdate,'yyyymmdd_HHMI')
'.txt' as spoolfile from dual;
spool &spoolfile
Hier wird in die Variable spoolfile der aktuelle Zeitstempel gespeichert und diese Variable nachher genutzt, um die Log-Datei festzulegen.
Bis hier ist es ok. Wie kann man jetzt ein '&' innerhalb eines Insert-Statements verwenden, obiges Statement funktioniert ja nicht? Man kann Oracle beibringen, dass es keine Variablen-Substitution machen soll. Dies geschieht über ein Set-Statement:
-- Ausschalten des Interpretierens von Variablennamen
-- Dadurch kann & innerhalb von SQL-Statements angegeben werden
set define off
Wenn man jetzt also ein Kaufmannsund braucht und Variablensubstitution nicht ausschalten möchte, ist das schwieriger zu erreichen. Die offensichtliche Lösung besteht darin ähnlich wie in den SELECT-Abfragen die Wildcards % und _ mittels ESCAPE-Zusatz zu maskieren. Die Zeichen % stehen für ein Match auf beliebig viele Zeichen, der Unterstrich matcht genau ein beliebiges Zeichen, wenn man jetzt nach dem Zeichen % sucht, muß man dieses dann eben escapen:
SELECT * FROM testtab WHERE textfeld LIKE '%20@%%' ESCAPE '@';
Hiermit würde man alle Felder finden, in denen die Zeichenkette "20%" vorkommt, egal ob am Anfang oder mittendrin oder am Ende.
Das funktioniert nur leider eben nicht für Insert-Statements:
SQL> insert into temp_data(name,version) values ('A @& P' ESCAPE '@', 3);
Enter value for p: blah
old 1: insert into temp_data values ('A & P', 3)
new 1: insert into temp_data values ('A blah', 3)
1 row created.
Wer sich jetzt fragt, warum ich darüber blogge, reicht doch ein einfaches set define off vor dieser Anweisung und evtl. hinterher ein set define on um die Variablensubstitution aus- und wieder einzuschalten, hat noch nicht folgendes probiert:
col version new_value version
select versionsnr into version from versionstabelle where status='aktiv';
SQL> insert into temp_data(name,version) values ('A & P', &version);
Enter value for p: blah
old 1: insert into temp_data values ('A & P', &version)
new 1: insert into temp_data values ('A blah', 3)
1 row created.
Nein, clevererweise hat sich Oracle hier etwas ganz besonderes einfallen lassen. ESCAPE wäre ja auch zu einfach gewesen. Möchte man unbedingt und auf jeden Fall sowohl Variablen, als auch das Kaufmannsund innerhalb eines Statements haben, muß man diese Zeichenkette als 2 Zeichenketten angeben und diese dann noch konkatenieren. Dabei muß das Kaufmannsund das letzte Zeichen des ersten Teils sein. Das obige Statement sähe dann etwa so aus:
col version new_value version
select versionsnr into version from versionstabelle where status='aktiv';
SQL> insert into temp_data(name,version) values ('A &' || ' P', &version);
old 1: insert into temp_data values ('A & P', &version)
new 1: insert into temp_data values ('A & P', 3)
1 row created.
Ja genau, auf sowas muß man erstmal kommen und in den Oracle-Dokus steht dazu nämlich garantiert nichts, zumindest nichts offensichtliches.
Disclaimer: alle obigen SQL-Statements sind aus meiner Erinnerung abgetippt. Sie sind evtl. nicht ganz syntaktisch korrekt, aber ich hab zuhause halt keine Oracle laufen und so muß ich mein Gedächtnis bemühen.
Ein Dank geht an "The Oracle (tm) Users' Co-Operative FAQ"
1.15.2010
Pfad des Ausführenden
In VB.NET:
Dim aPath As String
Dim aName As String
aName = _
System.Reflection.Assembly.GetExecutingAssembly. _
GetModules()(0).FullyQualifiedName
aPath = System.IO.Path.GetDirectoryName(aName)
'
' Or
'
aPath = System.Reflection.Assembly. _
GetExecutingAssembly.Location
Oder ganz einfach unter VB.NET:
My.Application.Info.DirectoryPath
Quelle: http://www.thescarms.com/dotnet/AppPath.aspx
Dim aPath As String
Dim aName As String
aName = _
System.Reflection.Assembly.GetExecutingAssembly. _
GetModules()(0).FullyQualifiedName
aPath = System.IO.Path.GetDirectoryName(aName)
'
' Or
'
aPath = System.Reflection.Assembly. _
GetExecutingAssembly.Location
Oder ganz einfach unter VB.NET:
My.Application.Info.DirectoryPath
Quelle: http://www.thescarms.com/dotnet/AppPath.aspx
11.17.2009
Duck-Tape-Programming und Clean-Code
Als auf der letzten PRIO der Begriff "Duck-Tape-Programming" fiel konnte ich mir sofort was drunter vorstellen - wer könnte das nicht.
Natürlich wurde diese Art der Programmierung als unprofessionell und schlecht gebrandmarkt.
Natürlich?? Warum eigentlich?
Wenn ich Duck-Tape höre fällt mir als erstes der Rally-Sport ein. Hier vollbringen Mechaniker mit Duck-Tape wahre Wunder. Für den Laien völlig zerstörte Fahrzeuge werden mit Duck-Tape, Draht und Spuke wieder zusammen geflickt, bestehen noch die nächste Prüfung und vielleicht gewinnt das Team sogar noch die Rally.
Arbeiten diese Mechaniker unprofessionell?
Sind sie schlecht?
Nein, schlecht sind sie garantiert nicht. Die besten Mechaniker schaffen es vielleicht mal Rally-Mechaniker zu werden.
Sie arbeiten nur unter sehr ungewöhnlichen Bedingungen. Ihre Arbeit erfolgt unter enormen Zeit- und Erfolgsdruck mit einem Ergebnis das nur eine sehr begrenzte Zeit durchhalten muss.
Den Gegenpart bildet der Mechaniker in der Werkstatt in die der Familienvater sein Auto bringt: Hier erwarten wir dass in Ruhe ein Ergebnis erzielt wird das "ewig" hält. Niemand will eine Reperatur die zwar schnell geht aber nur circa 100 km hält.
Und hier sehe ich den Zusammenhang zu unserer Arbeit: Die meisten Entwickler (wie auch die meisten Kfz-Mechaniker) arbeiten in einer "Werkstatt" in der es auf Zuverlässigkeit, Langlebigkeit und Robustheit ankommt. Und somit sollten sie so sauber und sorgfältig wie nur irgend möglich arbeiten. Das Ziel sollte immer das bestmögliche und bestwartbare Produkt sein.
Immer mal wieder ist aber auch eine Rally angesagt:
Wenn der Vorstand JETZT Zahlen haben will die einmalig für diesen Forecast gebraucht werden (für den nächsten gelten eh wieder andere Regeln) und man somit "Wegwerf"-Software baut oder Software JETZT um eine ganz spezielle Funktion erweitert werden muss für die Präsentation HEUTE NACHMITTAG - dann ist "Dranflicken" und Improvisieren angeagt. Duck-Tape-Programming ist dann angesagt - ob wir es so nennen oder nicht.
Aber wie auch bei jeder Rally sollte man nicht die Vor- und Nachbereitung vergessen! Rally-Teams bereiten sich mit einem ungeheuren Aufwand von Zeit und Geld auf die extremen Phasen vor. Und jede dieser Phasen wird hinterher ausgewertet und fließt in Verbesserungen und Veränderungen des Fahrzeugs ein.
Und auch das sollten wir uns zum Vorbild nehmen: Nach der letzten Wertungsprüfung alle mit Tape angeklatschten Teile abreißen und die Ursache analysieren warum sie abgerissen sind. Und diese Ursachen dann beheben.
Und damit sind wir wieder in unserer Werkstatt und arbeiten nach dem Clean-Code-Ansatz.
Bis zur nächsten Rally!
Natürlich wurde diese Art der Programmierung als unprofessionell und schlecht gebrandmarkt.
Natürlich?? Warum eigentlich?
Wenn ich Duck-Tape höre fällt mir als erstes der Rally-Sport ein. Hier vollbringen Mechaniker mit Duck-Tape wahre Wunder. Für den Laien völlig zerstörte Fahrzeuge werden mit Duck-Tape, Draht und Spuke wieder zusammen geflickt, bestehen noch die nächste Prüfung und vielleicht gewinnt das Team sogar noch die Rally.
Arbeiten diese Mechaniker unprofessionell?
Sind sie schlecht?
Nein, schlecht sind sie garantiert nicht. Die besten Mechaniker schaffen es vielleicht mal Rally-Mechaniker zu werden.
Sie arbeiten nur unter sehr ungewöhnlichen Bedingungen. Ihre Arbeit erfolgt unter enormen Zeit- und Erfolgsdruck mit einem Ergebnis das nur eine sehr begrenzte Zeit durchhalten muss.
Den Gegenpart bildet der Mechaniker in der Werkstatt in die der Familienvater sein Auto bringt: Hier erwarten wir dass in Ruhe ein Ergebnis erzielt wird das "ewig" hält. Niemand will eine Reperatur die zwar schnell geht aber nur circa 100 km hält.
Und hier sehe ich den Zusammenhang zu unserer Arbeit: Die meisten Entwickler (wie auch die meisten Kfz-Mechaniker) arbeiten in einer "Werkstatt" in der es auf Zuverlässigkeit, Langlebigkeit und Robustheit ankommt. Und somit sollten sie so sauber und sorgfältig wie nur irgend möglich arbeiten. Das Ziel sollte immer das bestmögliche und bestwartbare Produkt sein.
Immer mal wieder ist aber auch eine Rally angesagt:
Wenn der Vorstand JETZT Zahlen haben will die einmalig für diesen Forecast gebraucht werden (für den nächsten gelten eh wieder andere Regeln) und man somit "Wegwerf"-Software baut oder Software JETZT um eine ganz spezielle Funktion erweitert werden muss für die Präsentation HEUTE NACHMITTAG - dann ist "Dranflicken" und Improvisieren angeagt. Duck-Tape-Programming ist dann angesagt - ob wir es so nennen oder nicht.
Aber wie auch bei jeder Rally sollte man nicht die Vor- und Nachbereitung vergessen! Rally-Teams bereiten sich mit einem ungeheuren Aufwand von Zeit und Geld auf die extremen Phasen vor. Und jede dieser Phasen wird hinterher ausgewertet und fließt in Verbesserungen und Veränderungen des Fahrzeugs ein.
Und auch das sollten wir uns zum Vorbild nehmen: Nach der letzten Wertungsprüfung alle mit Tape angeklatschten Teile abreißen und die Ursache analysieren warum sie abgerissen sind. Und diese Ursachen dann beheben.
Und damit sind wir wieder in unserer Werkstatt und arbeiten nach dem Clean-Code-Ansatz.
Bis zur nächsten Rally!
Labels:
ccd,
Grundlagen,
Philosophie,
Programmierung
11.10.2009
Clean-Code-Developer
Manchmal ist man erstaunt, wenn man Dinge die man fühlt schwarz auf weiß irgendwo liest. Ich habe dann dieses "Genau-Das-Ist-ES"-Gefühl.
Und so geht es mir mit Clean-Code-Developer!
http://clean-code-developer.de/
Jetzt will ich nicht nur MCPD werden sondern auch noch Clean-Code-Developer! Mächtig viel Arbeit ;-)
Und hoffentlich kann ich dann bald immer mal wider diesen Stempel verwenden:
Und so geht es mir mit Clean-Code-Developer!
http://clean-code-developer.de/
Jetzt will ich nicht nur MCPD werden sondern auch noch Clean-Code-Developer! Mächtig viel Arbeit ;-)
Und hoffentlich kann ich dann bald immer mal wider diesen Stempel verwenden:
10.20.2009
Access Wunderreperatur
Wenn Access sich "komisch" verhält und die DB Code enthält kann es helfen die Datei mit dem Zeilenparameter /decompile zu öffnen, wieder zu schließen, nochmals mit diesem Schalter zu öffenen und dann zu komprimieren und reparieren.
Zum einen wird die Dateigröße merklich schrumpfen und zum anderen sind bisher (fast) alle Merkwürdigkeiten verschwunden.
Zum einen wird die Dateigröße merklich schrumpfen und zum anderen sind bisher (fast) alle Merkwürdigkeiten verschwunden.
Abonnieren
Posts (Atom)
