Grässlich redundanter Code^^
Am schönsten wär's sowas in ein eigenes Dateiformat zu packen
Grässlich redundanter Code^^
Am schönsten wär's sowas in ein eigenes Dateiformat zu packen
So fürs Arduino hab ich gerade bissel gebastelt...
Man nehme ... ne alte GPS Maus, in meinem Fall die RGM-2000, die TTL kommuniziert ... bissel schaltdraht und ein wenig Code
Zur verdrahtung ...
Pin 2 RX von GPS Maus
Pin 3 TX zur GPS Maus
5 V zur GPS Maus
GND zur GPS Maus
und nun der Code
#include <SoftwareSerial.h>
SoftwareSerial GPS = SoftwareSerial (2,3); // PIN 2 RX, PIN 3 TX
void setup()
{
GPS.begin(4800); // Mit 4800 Baud kommt es von der GPS Maus
Serial.begin(9600); // Zum PC geht es mit 9600 Baud
}
void loop()
{
if (GPS.available() > 0) {Serial.write(GPS.read());} // Egal was kommt bringe es auf die Serial Konsole
}
Alles anzeigen
Hatte ich vor der letzten Bücherverbrennung im WHF zu einem Coding-Wettbewerb schon mal in Python geschrieben: Zu einem Array eine bestimmte Permutation aus der nach Indizes sortierten Reihenfolge der Permutationen (für [a,s,d,f] wäre das z. B. 0 => [a,s,d,f], 1 => [a,s,f,d], 2 => [a,d,s,f], …, 23 => [f,d,s,a]) zurückgeben.
import java.util.ArrayList;
import java.util.Arrays;
…
public static <T> T[] permute(T[] arr, long permutation) {
if (arr == null) {
return null;
} else if (permutation < 0L || permutation >= factorial(arr.length)) {
throw new IllegalArgumentException();
} else {
// in der Größe unverändliche List-View auf das Array in eine Collection kopieren
ArrayList<T> pickList = new ArrayList<T>(Arrays.asList(arr));
// mit Java 7 wäre das nicht passiert
@SuppressWarnings("unchecked")
T[] resultArray = (T[]) new Object[arr.length];
int i = 0;
while (pickList.size() > 0) {
long quotient = permutation / factorial(pickList.size() - 1);
resultArray[i++] = pickList.remove((int) quotient);
permutation = permutation % factorial(pickList.size());
}
return resultArray;
}
}
public static long factorial(int n) {
// in einen vorzeichenbehafteten 64-Bit-Integer passen alle Fakultäten
// bis 20! hinein
if (n < 0 || n > 20) {
throw new IllegalArgumentException();
} else if (n < 2) {
return 1L;
} else { // 2 <= n <= 20
long f = 1L;
for (int i = 2; i <= n; ++i) {
f *= i;
}
return f;
}
}
Alles anzeigen
Wo ich da grad den ArrayList-Import sehe: Eine Hüllklasse für ArrayList, die selbige um das Observer-Pattern erweitert. An Methoden ist nur das vorhanden was ich gebraucht habe, lässt sich aber leicht erweitern.
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Observable;
public class ObservableArrayList<t> extends Observable
{
ArrayList<t> theList = new ArrayList<t>();
public int size()
{
return theList.size();
}
public Iterator<t> iterator()
{
return theList.iterator();
}
public void add(t anElement)
{
theList.add(anElement);
setChanged();
notifyObservers();
}
public t get(int i)
{
return theList.get(i);
}
public boolean remove(t anElement)
{
if(theList.remove(anElement))
{
setChanged();
notifyObservers();
return true;
}
else
{
return false;
}
}
}
Alles anzeigen
Wie schön das .NET eine BindingList vorimplementiert.
Keine Ahnung, ob ichs schonmal gepostet habe. Nachgucken, wer alles per SCP/SSHFS Dateien mit dem Server tauscht (ja ich weiß, das is teine sehr dreckige Lösung, aber sie funktioniert):
C: Da errno.h angepasste Fehlermeldungen nur sehr stiefmütterlich behandelt (geht das überhaupt?)
Aufgerufene Methoden erzeugen mit void newError(char*); einen neuen Fehler (dies setzt ein Fehler flag) und fügen bei bedarf mit void appendError(char*); weitere Strings an.
Aufrufende Methoden prüfen mit bool checkError(void); das Fehler flag (es wird dann zurück gesetzt) und holen sich ggf. mit char *getError(void); den neuen Fehlerstring (dies können sie beliebig oft tun).
errorReporting.h
#ifndef ERRORREPORTING_H_INCLUDED
#define ERRORREPORTING_H_INCLUDED
#include <stdbool.h>
extern bool checkError(void);
extern char *getError(void);
extern void newError(char*);
extern void appendError(char*);
#endif // ERRORREPORTING_H_INCLUDED
errorReporting.c
#include <stdlib.h>
#include "string.h"
#include "errorReporting.h"
bool errorOccurred = false;
char *errorString = NULL;
bool checkError(void)
{
bool returnValue = errorOccurred;
if(errorOccurred)
{
errorOccurred = false;
}
return returnValue;
}
char *getError(void)
{
return errorString;
}
void newError(char *error)
{
if(errorOccurred)
{
free(errorString);
}
errorString = (char*) calloc( strlen(error) + 1, sizeof(char) );
strcpy(errorString, error);
errorOccurred = true;
}
void appendError(char *error)
{
if( !errorOccurred)
//This function should not be called unless newError() was called, but oh well...
{
newError(error);
}
else
{
errorString = (char*) realloc( errorString, (strlen(errorString) + strlen(error) + 1) * sizeof(char) );
strcat(errorString, error);
}
}
̔
#!/bin/sh
DATE=`date +"%m-%Y"`
NAME="Backup"
LOG=/home/tobias/Backup.log
LOGDATE=`date +"%d-%m-%Y"`
FULLNAME="$NAME-$DATE"
EXIT=$?
if [ -e /home/tobias/$FULLNAME ]; then
cp -ruv /home/tobias/Dokumente* /home/tobias/$FULLNAME |tee >>$LOG
echo Backup vom $LOGDATE >>$LOG
echo ------------------------------------------------------------------------ >>$LOG
else
echo Backup vom $LOGDATE >>$LOG
mkdir /home/tobias/$FULLNAME
cp -ruv /home/tobias/Dokumente* /home/tobias/$FULLNAME |tee >>$LOG
echo ------------------------------------------------------------------------ >>$LOG
fi
if [ $EXIT -eq "0" ]; then
mailx -s "Backup erfolgreich" tobias@localhost </home/tobias/Backup.log
else
mailx -s "Backup fehlgeschlagen" tobias@localhost </home/tobias/Backup.log
fi
Alles anzeigen
Mal auf die Schnelle zusammen gebastelt.
Schönes Script
Als Bonus könntest du noch ${HOME} statt /home/tobias nehmen und die Mail dann an $(whoami)@$(hostname) versenden. Dann könnte man es noch als Cronjob unter den Rechten der jeweiligen Benutzer laufen lassen, für die regelmäßig gebackupped werden soll und schon hat man vollautomatisches Backup.
Schönes ScriptAls Bonus könntest du noch ${HOME} statt /home/tobias nehmen und die Mail dann an $(whoami)@$(hostname) versenden. Dann könnte man es noch als Cronjob unter den Rechten der jeweiligen Benutzer laufen lassen, für die regelmäßig gebackupped werden soll und schon hat man vollautomatisches Backup.
Gute Idee. Danke
Bin aber am überlegen, ob ich das cp net auf n rsync ändere.
Bin aber am überlegen, ob ich das cp net auf n rsync ändere.
Joa, rsync wäre gerade bei großen Datenmengen sinnvoll. Dann könnte er auch vorher gucken, ob sich die jeweilige Datei seit dem letzten Backup geändert hat.
#!/bin/sh
DATE=`date +"%m-%Y"`
NAME="Backup"
LOG=/home/tobias/Backup.log
LOGDATE=`date +"%d-%m-%Y"`
FULLNAME="$NAME-$DATE"
EXIT=$!
if [ -e ${HOME}/$FULLNAME ]; then
cp -ruv ${HOME}/Dokumente* ${HOME}/$FULLNAME |tee >>$LOG
echo Backup vom $LOGDATE >>$LOG
echo ------------------------------------------------------------------------ >>$LOG
else
echo Backup vom $LOGDATE >>$LOG
mkdir ${HOME}/$FULLNAME
cp -ruv /home/tobias/Dokumente* /home/tobias/$FULLNAME |tee >>$LOG
echo ------------------------------------------------------------------------ >>$LOG
fi
if [ $EXIT -z ]; then
mailx -s "Backup erfolgreich" $(whoami)@$(hostname) <${HOME}/Backup.log
else
mailx -s "Backup fehlgeschlagen" $(whoami)@$(hostname) <${HOME}/Backup.log
fi
Alles anzeigen
tobias@voyager:~$ /home/tobias/Test.sh
[: 23: -eq: unexpected operator
tobias@voyager:~$
Was mache ich falsch?
EDIT: if [ $EXIT -eq "0" ]; then stimmt nicht.
So muss es sein: if [ $EXIT -z ]; then
Wenn du Rsync benutzt kannst du mit '--link-dest' auch recht einfach platzsparende inkrementelle Backups durch Hardlinks machen. Wobei dann kannst auch eigtl gleich dirvish oder so benutzen
@echo off
net use q: \\ZEUS\tausch\EDVTmp
if
q:\psinfo\PsInfo.exe -s >>C:\%computername%.txt
move c:\%computername%.txt q:\Ergebnisse\%computername%.txt
del C:\PsInfo.exe
net use q: /delete
pause
Kann ich Windows irgendwie verklickern, dass ich gerne ein Netzwerkshare über 2 Laufwerksbuchstaben verbinden kann?
Ich würde einfach zwei mal net use für das selbe Share machen, jeweils mit anderm Laufwerksbuchstaben.
Ich würde einfach zwei mal net use für das selbe Share machen, jeweils mit anderm Laufwerksbuchstaben.
Das lässt Windows leider net zu. Habe ich schon versucht.
subst <ordner> <buchstabe> ordnet einem Ordner nen Buchstaben zum, bei dir dann subst q: p:
subst <ordner> <buchstabe> ordnet einem Ordner nen Buchstaben zum, bei dir dann subst q: p:
Sowas kann Windows? Cool
Erinnert mich an ASSIGN auf AmigaOS (dort ist die Synatx aber exakt andersrum):
assign mp3: daten:multimedia/musik/mp3/
Das ist ein Überbleibsel von DOS. Unter 9x gibts auch noch assign und noch einen ähnlichen Befehl, die aber beide entfernt wurden.
Für die /usr/share/stormcloud/media/style.css:
#city{ color: #2c64a0; font-size: 1pt;}
#city:before{ font-size: 16pt; color: #ffffff; content: "Eudahausen";}
So kann man auch endlich das Wetter aus Eudahausen sehen!
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!