MNH Gedankensprudel

nicht nur ein stilles Wasser

Samba funktioniert nach update nicht mehr

03.06.18 (Allgemein)

Hier eine Lösung sollte samba nach einen update von Debian streiken.
Hat mir bei meinen Raspbian weitergeholfen (Backup der Konfiguration nicht vergessen):

sudo apt-get clean && sudo apt update
sudo apt-get remove samba
sudo shutdown -r now
dpkg -l | egrep '^ii' | awk '{print $2}' | grep samba | xargs sudo apt install --reinstall -o Dpkg::Options::=--force-confnew -y

 

https://forum-raspberrypi.de/forum/thread/37420-keine-freigabe-vom-pi-mehr/?postID=314136#post314136

Keine Kommentare »

mysql root Password vergessen und jetzt?

15.04.16 (Allgemein)

Folgendes Kurzes Tutorial geht davon aus das ihr screen unter Linux benutzt und zwei offene Fenster habt.

beendet euren MySQL Service z.B. mit

service stop mysql

oder

systemctl mysqld stop

Danach starten wir MySQL mittels mysqld_safe und schalten die grand Tabellen ab um ohne Passwort auf die Datenbank zuzugreifen

mysqld_safe --skip-grant-tables

und melden uns als root ohne Passwort auf unserer MySQL Console an.

mysql --user=root mysql

Im MySQL Terminalprogramm selber updaten wir nun das Passwort mittels dieses Befehls. Tauscht hier NEUESPASSWORT gegen euer neues Passwort aus.

update user set Password=PASSWORD('NEUESPASSWORT') where user='root';
flush privileges;
exit;

danach nur noch im zweiten screen Fenster MySQL wieder beenden mittels

mysqladmin -u root -p  shutdown

Hier könnt ihr bereits euer neues Passwort eingeben (NEUESPASSWORT).

Jetzt nur noch die Dienste wieder normal starten

service start mysql

oder

systemctl mysqld start

Und schon könnt ihr euch wieder einloggen.

 

Keine Kommentare »

Ich und Unitymedia…

13.03.16 (Allgemein)

Dieser Artikel dient erstmal hauptsächlich meinen Persönlichen Frustabbau aber auch als Warnung um nicht in den Kreis der leid genossenen zu Kommen.

Alles fing an einen schönen Mittwoch an als ich tatsächlich mal meinen Flyer von Unitymedia Beachtung schenkte: 1,99€ mehr im Monat dafür doppelte Bandbreite. Alleine die 6 Mbits Upload klangen verführerisch momentan gurke ich mit 2,5 Mbits rum. Der Rest mit 120 Mbits surfen klang auch nach einen „nice to have“. Da ich ein verwöhnter Altkunde bin der sich zum Glück nicht mit Gängelung wie DS-Lite oder schlechter Hardware (habe eine fritzbox 6340) rumärgern musste und sich über echten Dualstack mit ipv4 und ipv6 freut, mussten natürlich vorher Details geklärt:
werden.

Vorher natürlich schon gegoogelt… Ok die 6360 gibt es zu 120er Businesstarif und meine ist auch noch in der liste bis 200 Mbits sollte doch klappen.

Also der griff zum Telefon,

„behalte ich den auch meinen ipv4 (dualstack)“
Antwort: „JA Altkunden eigentlich immer“
„kann ich auch meine Fritz!box weiter benutzen“
Antwort: „JA, wahrscheinlich können sie ihren neuen Tarif sogar schon heute nutzen“

Von dieser Auskunft sehr erfreut, natürlich gleich abgeschlossen.

Am nächsten tag Tarif hat sich nicht geändert, dafür im Kundenmenü eine Paketankündigung. Ok mal eine Mail dorthin was das ist, mit vermerk auf die Zusicherung „meiner“* Fritzbox

Was kommt am Freitag? Eine „Connect Box“ misstrauisch das ding mal begutachtet und ohne an das Kabelnetz zu hängen mal die Oberfläche begutachtet. Ok könnte was werden ich sehe hier einen Modemodus und wenn ich meine Dualstack behalte, kann ich die wohl doch gebrauchen (Modem ist mir eh lieber). Ok mutiger schritt es ist Freitag Nachmittag ich hänge sie trotzdem ans Netz. Box blinkt und scheint irgendwann damit auch fertig zu sein.

Laptop test weise dran und die Ernüchterung: Vorher vorgenommen Einstellung natürlich weg unten auch die tolle Nachricht das sie auf DSlite läuft.

Also mal wieder Support angerufen dort hin und her nein das sollte nicht pasieren beim router könnten sie nichts machen mich aber wenigstens auf Duralsack wieder umstellen.

Nach dem ich also endlich bei einen Techniker in der Leitung war  erklärte der mir das die Firmware der Conectbox das garnicht könnte die läuft softwareseitig nur mit DSlite. Und stellte mich zu einer Dame weiter die sich mit meinen Belangen beschäftigen sollte. Der erklärte ich mein Anliegen, natürlich war ich nach so einen Martyrium auch nicht mehr der Höflichste, Und verwies auch mehrfach auf mein Telefonat mit den Vertragsabschluss (die mal nebenbei gesagt eigentlich bindend sind ansonsten kommt gar kein gültiger Vertrag zu stande naja zumindestens nach Fristverstreich der Nachbesserung…) Das passte der Dame wohl überhaut nicht und erklärte mir das ich als Privatperson überhaupt keine ipv4 bräuchte ich einen Buissnesvertragabschließen müsste und wenn ich eine Fritzbox möchte ich für 5€ mehr im Monat eine Telefon Connfort Option bräuchte. das härteste sie legte nach einer knappen Rückfrage ob ich das verstanden hätte einfach auf.

Also nochmal anrufen irgendjemand wird einen ja helfen können. Diesmal tatsächlich an jemanden kompetenteren geraten der mir wenigstens anbot meine alten Vertragsbedingungen wiederherzustellen, ich solle einfach meine Fritz box wieder anschließen und er leite alles weitere ein.

Nun sehr genervt dafür aber mit einen vermeintlich wieder funktionierenden*(dazu später mehr) Dual stack Anschluss wen auch wieder mit nur 50/2.5mbit also mal das gemacht was alle foren so empfehlen seinen Frust auf Facebook gepostet:

https://m.facebook.com/Unitymedia/posts/1137595382925523

*zwischenzeitlich stellte sich heraus das mein Internet zwar wieder geht und ich keine zwangsdrossel mehr über mein Handymodem brauche aber das Telefon nicht. den das wurde vergessen zu provisionieren.

wie es weitergeht und ging packe ich in einen zweiten Post….

Keine Kommentare »

praktische regex für netbeans und php

06.01.16 (Allgemein)

Das Suchen und ersetzen Feld in Netbeans (STRG+H) ist sehr praktisch vorallem mit regex

ein par regex meiner täglichen arbeit sollen hier nun veröffentlicht werden für alle die sie gebrauchen können oder damit ich sie selber nicht vergesse:

Alte array() schreibweise in php > 5.4 „[]“ Arrays

Find What:array\(([^\(\)]*)\)
Replace With:[$1]
leider muss dieser mehrmals angewendet werden bei Verschachtelungen trotzdem bekommt man damit in nu eine Konfigurationsdatei die deutlich kleiner und aufgeräumter ist.

Keine Kommentare »

Raw code in pilight gui mit eigenen Protokoll 2

01.10.15 (Allgemein)

Nun komm der in diesen Beitrag bereits versprochene zweite Teil…

On Off SoOONY DAS GEHT*

Ganz so arg müssen wir uns nicht ärgern. Doch leider wird es auch nicht mit einen einfachen on/off funktionieren. Damit ihr nicht noch ZWEIHUNDERT PULS bekommt mache ich mal weiter.

nach einen ausführen der install.sh sollte das Protokoll zwar schon auswählbar und kompilierbar sein doch ein:

$ sudo pilight-send -H
Usage: pilight-send -p protocol [options]
-H --help display this message
-V --version display version
-p --protocol=protocol the protocol that you want to control
-S --server=x.x.x.x connect to server address
-P --port=xxxx connect to server port
-F --settings settings file
The supported protocols are:
brennenstuhl Brennenstuhl Comfort
byebyestandbye Bye Bye Standbye Switches
clarus_switch Clarus Switches
cleverwatts Cleverwatts Switches
coco_switch CoCo Technologies Switches
cogex Cogex Switches
dio_switch D-IO Switches
elro_ad Elro Home Easy Advanced Switches
elro_hc Elro Home Control Switches
elro_he Elro Home Easy Switches
generic_dimmer Generic Dimmers
generic_screen Generic Screens
generic_switch Generic Switches
generic_weather Generic Weather Stations
home_easy_old Old Home Easy Switches
impuls Impuls Switches
intertechno_old Old Intertechno Switches
intertechno_switch Intertechno Switches
kaku_dimmer KlikAanKlikUit Dimmers
kaku_screen KlikAanKlikUit Screens
kaku_screen_old Old KlikAanKlikUit Screens
kaku_switch KlikAanKlikUit Switches
kaku_switch_old Old KlikAanKlikUit Switches
nexa_switch Nexa Switches
openweathermap Open Weather Map API
pollin Pollin Switches
program Start / Stop / State of a program
quigg_switch Quigg Switches
raw Raw Codes
relay GPIO Connected Relays
rev1_switch Rev Switches v1
rev2_switch Rev Switches v2
rev3_switch Rev Switches v3
selectremote SelectRemote Switches
silvercrest Silvercrest Switches
unitech Unitech Switches
wunderground Weather Underground API
x10 x10 based devices

liefert leider noch nicht den gewünschten erfolg, wie wir unter „The supported protocols are“ sehen.

Quelltext

Fangen wir also mal an, uns den Quelltext anzuschauen. Also Zurück zu bhc9938d.c und dort die Init Funktion. Den dort müssen wir noch eigne dinge bekanntgeben.

//...
void bhc9938dInit(void) {
    protocol_register(&bhc9938d);
    protocol_set_id(bhc9938d, "bhc9938d");
    protocol_device_add(bhc9938d, "bhc9938d", "BHC9938D protocol");
    bhc9938d -> devtype = RAW;
    bhc9938d -> printHelp = &bhc9938dPrintHelp;
}
//...

beschäftigen wir uns zunächst mit printHelp hier setzen wir einen Funktionszeiger in diesen Fall auf eine Funktion die bhc9938dPrintHelp heißt. Ich würde hier ein ähnliches Namensschema vorschlagen also protokollnameFunktion um Namenskonflikte zu vermeiden.
mit einer pasenden Methode sind wir also schon so weit Hilfetexte auszugeben:

static void bhc9938dPrintHelp(void) {
    printf("\t Ich bin ein  Hilfreicher Text\n");
}

was noch fehlt sind die Parameter zum steuern und natürlich das Senden dafür ergänzen wir wieder die Initfunktion

void bhc9938dInit(void) {
    protocol_register(&bhc9938d);
    protocol_set_id(bhc9938d, "bhc9938d");
    protocol_device_add(bhc9938d, "bhc9938d", "BHC9938D protocol");
    
    options_add(&bhc9938d->options, 'u', "unit", OPTION_HAS_VALUE, CONFIG_ID, JSON_NUMBER, NULL, "^(3[012]?|[012][0-9]|[0-9]{1})$");
    options_add(&bhc9938d->options, 't', "on", OPTION_NO_VALUE, CONFIG_STATE, JSON_STRING, NULL, NULL);
    options_add(&bhc9938d->options, 'f', "off", OPTION_NO_VALUE, CONFIG_STATE, JSON_STRING, NULL, NULL);
    
    bhc9938d -> devtype = RAW;
    bhc9938d -> printHelp = &bhc9938dPrintHelp;
    bhc9938d -> createCode = &bhc9938dCreateCode;
}
/*
 * File:   bhc9938d.c
 * Author: Michael Hegenbarth (carschrotter) <mnh@mn-hegenbarth.de>
 *
 * Created on 23. Januar 2015, 13:19
 */

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <math.h>

#include "../../pilight.h"
#include "common.h"
#include "protocol.h"
#include "log.h"
#include "json.h"
#include "bhc9938d.h"

#ifndef MODULE

__attribute__((weak))
#endif
    
const char * indent = "\t\t\t\t\t";

typedef enum { OFF, ON, UNKNOWN=-1 } switchState;

/*
 * code all codes for on and off state from piligt debug
 */
const char * codes[2][3] = {
    {
    "160 480 480 160 160 480 480 160 160 480 480 160 160 480 480 160 160 480 160 480 160 480 480 160 160 480 480 160 160 480 480 160 160 480 160 480 480 160 480 160 480 160 480 160 160 480 160 480 160 5440",
    "160 480 480 160 160 480 480 160 160 480 480 160 160 480 480 160 160 480 160 480 160 640 480 160 160 640 480 160 160 480 480 160 480 160 480 160 160 640 160 480 480 160 480 160 160 480 160 480 160 5440",
    "160 640 480 160 160 640 480 160 160 480 480 160 160 640 480 160 160 640 160 480 160 480 480 160 160 480 480 160 480 160 480 160 160 480 160 480 160 640 160 480 480 160 480 160 160 480 160 480 160 5440"
    }, //off codes (index 0)
    {
    "161 483 483 161 161 483 483 161 1683 483 161 161 483 483 161 161 644 161 483 161 483 483 161 161 483 483 161 161 483 483 161 161 483 161 644 483 161 483 161 161 483 161 483 483 161 483 161 161 5474",
    "160 480 480 160 160 480 480 160 160 480 480 160 160 640 480 160 160 480 160 480 160 480 480 160 160 480 480 160 160 480 480 320 480 160 480 160 160 480 160 480 160 480 160 640 480 160 480 160 160 5440",
    "160 480 480 160 160 480 480 160 160 480 480 160 160 480 480 160 160 640 160 480 160 480 480 160 160 480 480 160 480 160 480 160 160 480 160 480 160 480 160 480 160 480 160 480 480 160 480 160 160 5440"
    } //On codes (index 1)
};
bool strIsInt(const char * str, int * result){
    char * rest = NULL;
    int tmp = (int) strtol(str, &rest, 10);
    result = &tmp;
    return (bool) !(rest != NULL);
}


static void bhc9938dPrintHelp(void) {
    printf("\t -u --unit=unitnumber\t\tcontrol a device with this unitcode\t (1|2|3)\n");
    printf("\t -t --on\t\t\tsend an on signal\n");
    printf("\t -f --off\t\t\tsend an off signal\n");
/*
    printf("\t -d --device=\"raw\"\t\traw code to tur on device \n");
    printf("\t -f -rawOff=\"raw\"\t\traw code to tur off device \n");
    printf("%sraw code is devided by spaces\n", indent);
    printf("%s(just like the output of debug)\n", indent);
*/
}

static int bhc9938dCreateCode(JsonNode * code) {
    int unit = -1;
    switchState sState = UNKNOWN;
    double itmp = 0;
    
    int codeIndex = 0;
    
    char * rcode = NULL;
    char * pch = NULL;
    int i = 0;

    if(json_find_number(code, "unit", &itmp) == 0){
        unit = (int)round(itmp);
    }
    
    if(json_find_number(code, "off", &itmp) == 0){
        sState=OFF;
    } else if(json_find_number(code, "on", &itmp) == 0){
        sState=ON;
    }
    if(unit == -1 || sState == -1) {
        logprintf(LOG_ERR, "bhc9938d: insufficient number of arguments");
        return EXIT_FAILURE;
    } else if(unit > 4 || unit < 0) {
        logprintf(LOG_ERR, "bhc9938d: invalid unit range");
        return EXIT_FAILURE;
    } else {
    codeIndex = unit -1;
    rcode = strdup(codes[sState][codeIndex]);
    
    printf("\nindex:\t%d\nsState:\t%d\ncode:%s\n", codeIndex, sState, rcode);
    
    pch = strtok(rcode, " ");

    while (pch != NULL) {
        
        bhc9938d -> raw[i] = atoi(pch);
        pch = strtok(NULL, " ");

        i++;
    }

    sfree((void *) &rcode);

    bhc9938d -> rawlen = i;
    }
    return EXIT_SUCCESS;
}

/*
// BHC9938D bhc9938d
*/
void bhc9938dInit(void) {
    protocol_register(&bhc9938d);
    protocol_set_id(bhc9938d, "bhc9938d");
    protocol_device_add(bhc9938d, "bhc9938d", "BHC9938D protocol");
    
    options_add(&bhc9938d->options, 'u', "unit", OPTION_HAS_VALUE, CONFIG_ID, JSON_NUMBER, NULL, "^(3[012]?|[012][0-9]|[0-9]{1})$");
    options_add(&bhc9938d->options, 't', "on", OPTION_NO_VALUE, CONFIG_STATE, JSON_STRING, NULL, NULL);
    options_add(&bhc9938d->options, 'f', "off", OPTION_NO_VALUE, CONFIG_STATE, JSON_STRING, NULL, NULL);
    
    bhc9938d -> devtype = RAW;
    bhc9938d -> printHelp = &bhc9938dPrintHelp;
    bhc9938d -> createCode = &bhc9938dCreateCode;
}

#ifdef MODULE

void compatibility(struct module_t *module) {
    module -> name = "bhc9938d";
    module -> version = "0.1";
    module -> reqversion = "5.0";
    module -> reqcommit = NULL;
}

void init(void) {
    bhc9938dInit();
}
#endif

 

options_add rufe ich hier gleich dreimal auf, einmal für unit eine einfache numerische ID in meinen Fall von 1-3, und jeweils einmal für on und off.
Desweiteren noch ein Pointer auf die bhc9938dCreateCode funktion die dem Protokoll das eigentliche leben Einhaucht.
Der Komplette Kode schaut bei mir dann so aus:

 

 

 

 

 

 

*Mus man gesehen haben um das zu verstehen

Keine Kommentare »

Raw code in pilight gui mit eigenen Protokoll

23.01.15 (Allgemein)

Pilight sieht es offensichtlich nicht vor Rawcode von unbekannten Protokollen in der GUI zuzulassen, jedenfalls  gibt es laut Docu keine config dafür.

Dafür aber eine Anleitung wie man seine eigenen Protokolle implementieren kann.

Als erstes mal die Umgebung

Mein Umfeld:

Ich arbeite in diesen Beispiel mit Raspbian unter den Benutzer pi. Als Entwiklungsmaschine dient mir mein Windows 8.1 PC mit Netbeans 8.0.2.

Nachtrag: Ich gehe hier im Tutorial von der manuellen Installation aus sprich über das Git Repository dies ist auch notwendig um an den Sourcecode zu kommen.  Je nach dem unter welchen Beutzer ihr arbeitet oder wohin ihr die Dateien clont können die Pfade anderst sein

Entwicklungsumgebung/Editor:

Ich benutze bereits für meine Webprojekte Netbeans dort habe ich einfach die C++ Plugins installiert und schon kann es losgehen.
Ihr könnt natürlich eure favorisierte IDE oder Editor (z.B. Notepad++) verwenden.

Dateizugriff:

Um schnell kompelieren zu können belasse ich die Dateien auf dem rasperry pi und Kompeliere gleich dort, so muss man sich nicht mit Einstellungen für die passende Plattform rumärgern. Dazu mounte ich per sftp mein home Verzeichnis auf meine Entwicklungsmaschine. Das geht in Linux mit „Bordmitteln“ für Windos nutze ich momentan „SFTP Net Mount Free“. Natürlich könnt ihr das git repositorry aber auch auf die entwicklungs Maschine clonen.

Auf geht´s

So jetzt haben wir also was zum Editieren und Zugriff auf die Dateien dann kann es ja jetzt losgehen.
Als erstes navigieren wir zum Verzeichnis libs\protocols und erstellen dort zwei Dateien mit unseren Protokollnamen einmal „Protokollnamen.h“ und „Protokollnamen.c“.
Bei mir sieht es folgender masen aus:

~/pilight/libs/protocols/bhc9938d.h
~/pilight/libs/protocols/bhc9938d.c
          Pfad           Datein. Endung

Diese sollten auch noch gefüllt werden das geschieht jetzt streng nach Beispiel:

#ifndef _PROTOCOL_BHC9938D_H_
#define _PROTOCOL_BHC9938D_H_
 
struct protocol_t *bhc9938d;
void bhc9938dInit(void);
 
#endif
#include "../../pilight.h"
#include "common.h"
#include "protocol.h"
#include "bhc9938d.h"
 
#ifndef MODULE
__attribute__((weak))
#endif

//BHC9938D bhc9938d
void bhc9938dInit(void) {
    protocol_register(&bhc9938d);
    protocol_set_id(bhc9938d, "bhc9938d");
    protocol_device_add(bhc9938d, "bhc9938d", "bhc9938d protocol");
    bhc9938d->devtype = RAW;
}
 
#ifdef MODULE
void compatibility(struct module_t *module) {
    module->name = "bhc9938d";
    module->version = "0.1";
    module->reqversion = "5.0";
    module->reqcommit = NULL;
}
 
void init(void) {
    bhc9938dInit();
}
#endif

Dabei habe ich den Quellcode einfach aus den Beispiel übernommen und das Dummy Protokoll einfach gegen meinen eigenen Protokoll Namen sprich BHC9938D getauscht. Dabei immer schön auf Groß,- und Kleinschreibung achten und am besten den Formatierungsstiel beibehalten.
Damit das ganze mitcompeliert wird müssen wir noch zwei einträge machen:
Protokoll „definieren“ in CMakeConfig.txt:

set(PROTOCOL_BHC9938D ON CACHE BOOL "support for my own BHC9938D protocol")

Nun suchen wir in der Datei „CMakeLists.txt“ nach if(${PROTOCOL  bei mir ab Zeile 159 und fügen kurz davor unseren eigen Absatz ein um die Source Files bekannt zu machen:

if(${PROTOCOL_BHC9938D} MATCHES "OFF")
    list(REMOVE_ITEM pilight_headers "${PROJECT_SOURCE_DIR}/libs/protocols/bhc9938d.h")
    list(REMOVE_ITEM pilight "${PROJECT_SOURCE_DIR}/libs/protocols/bhc9938d.c")
endif()

Nach diesen beiden schritten kann das Protokoll zur Instillation ausgewählt werden

Probieren geht über studieren

Nun sind wir bereit das ganze zu testen.
Im folgenden gehe ich aus das ihr piligt schon mal erfolgreich installiert/compiliert habt wenn nicht könnt ihr gleich zum Punkt Erstellen wechseln.

Sicherheit geht vor

Als erstes fertigen wir ein Backup von /etc/piligh insbesondere unsere config.json wenn dort schon Geräte für die Weboberfläche eingetragen sind.

Reinemachen

Zuerst mal mit sudo service pilight stop den Service beenden. Danach sauber deinstallieren.
Ein ./setup.sh help bringt uns folgende Hilfe zu tage:

Usage: ./setup.sh [options]
         clean          remove all cmake and make generated files
         install        install pilight
         uninstall      uninstall pilight

also erstmal mit sudo ./setup.sh uninstall deinstallieren und danach mit sudo ./setup.sh clean saubermachen

Erstellen

nun einfach sudo ./setup.sh ausführen un ihr soltet folgende bild erhalten

Installation von pilight

Installation von pilight

Weiter geht es dann im Zeiten teil….

7 Kommentare »

MySQLTabelle anhand des Spaltennamens finden

18.09.13 (Allgemein)

Manchmal kommt man auf die seltsamsten Ideen z.B. das es möglich sein müsste zu einer Spalte die Tabelle zu finden.

So brauchte ich z.b. Den Namen zu einer Spalte einer unbekannten Tabelle beim Debuggen eines fremden Projekt.

Nach etwas googlen ist folgender Code dabei raus gekommen:

SELECT c.TABLE_SCHEMA AS Datenbank, c.TABLE_NAME AS Tabellenname, c.COLUMN_NAME AS Spalte
FROM INFORMATION_SCHEMA.TABLES t
JOIN INFORMATION_SCHEMA.COLUMNS c ON t.TABLE_CATALOG = c.TABLE_CATALOG
AND t.TABLE_SCHEMA = c.TABLE_SCHEMA
AND t.TABLE_NAME = c.TABLE_NAME
WHERE COLUMN_NAME = "YOURSEARCHCOLUMN"
LIMIT 0 , 30

Dabei ist bei COLUMN_NAME  der Wert „YOURSEARCHCOLUMN“ durch den Gewünschten Spaltennamen zu ersetzen.

Keine Kommentare »

Kostenlos profesionell im Web Teil 1

03.06.13 (Allgemein)

Teil 1 Hostersuche

Heute widme ich mich mal den Einsteigern unter euch häufig werde ich gefragt wie man seine eigen Homepage erstellt was ist des beste Hoster, muss ich wirklich sooo viel zahlen?

Als erstes die Letzte Frage der Rest Kommt in einen Anderen Teil:

….muss ich wirklich sooo viel zahlen?

Nein!
Natürlich sind „die Größen nicht die Günstigsten“ jahrelange Erfahrung und eine gefestigte Marktposition erlauben 1&1, Strato und Co dieses Preisniveau. Adlerdings gibt es auch kleine Hoster bei denen der Service weniger kostet oder gar Kostenlos ist.

Eine Kleine Auswahl liste ich nun hier auf:

  • bplaced.net  Kostenloser Webspace mit FTP, MYSQL, und PHP immer in sehr aktueller Form.

– Keine Sockets (braucht man um Verbindung zu anderen Seiten aufzubauen z.B. für Updates).
+ Deutsche Seite deutscher Support.
+ Software immer aktuell.
# Wenig Werbung nur im Login und auf den Fehlerseiten.

Keine Kommentare »

Mehrzeiliges Suchen und ersetzen in Projekten mit Notepad++

21.01.13 (Allgemein)

 

Fangen wir also an:

Man öffne eine Datei mit dem Störenden Inhalt in Notepad++ …

Mehrzeiliges Suchen und ersetzen in Projekten

und markiere nun den Absatz der der uns stört:

Mehrzeiliges Suchen und ersetzen in Projekten Schritt 2

Danach verwendet man das suchen und ersetzen Tool am einfachsten durch die Tastenkombination [STRG] + [H].

Nun sehen wir unseren selektierten Text in der “Suche nach” Textbox.

Mehrzeiliges Suchen und ersetzen in Projekten Schritt 3

Jetzt wählen wir noch den Tab “In Dateien Suchen” und klicken als
erstes auf “Ordner der akt. Datei” und da wir ja das gesamte Projekt
durchsuchen möchten auf “Unterverzeichnisse”.

Selbstverständlich könnt ihr den passenden Pfad auch manuell heraussuchen.

Den Suchmodus stellt man am besten auf “Normal” damit keine ungewollten Ersetzungen stattfinden.

Mehrzeiliges Suchen und ersetzen in Projekten Schritt 4

Und am ende habt ihr erfolgreich euer Projekt von den ungewollten
Einträgen befreit und das trotz Leerzeichen Tabs und Zeilenumbrüche.

Beachtet aber bitte das immer genau dieser String gesucht
wird, sprich es klappt nicht wenn ein Leerzeichen mehr oder weniger oder
sonst eine Kleinigkeit anders ist!

Mehrzeiliges Suchen und ersetzen in Projekten Schritt 5

 

Keine Kommentare »

PHP wir spielen mit Referenzen

11.02.12 (Tutorial´s)

Wer mal mit C oder C++ gearbeitet hat kennt ein ähnliches Modell bereits die Pointer. Allerdings da PHP ja eine Scriptsprache ist stellt es keine Speicheradressen zur Verfügung.

Dafür haben wir aber Referenzen die zwar keinen Performance voreilt verschaffen dafür aber einen ähnliche Möglichkeiten zur Manipulation der Variablen bietet (von der Arithmetik mal abgesehen).

ein kleines Beispiel habe ich mal hier zusammengestellt ziel war es eine Wrapperklasse für Strings zu erstellen .

global $counter, $memory;
$counter = 0;
$memory = array();
function &getNewReference($dataType) {
    global $counter;
    global $memory;
    do {
	    $name = 'RefKey'.$counter++;

    } while (isset($memory[$name]));

    $memory[$name] = $dataType;

    if(is_object($dataType) && in_array('setRefKey', get_class_methods($dataType))) {
	    $dataType->setRefKey($name);
    }
    return $memory[$name];
}
 
class String{
    private $value;
    private $refKey;

    public function setRefKey($name) {
	$this->refKey = $name;
    }

    public function __construct($value = null){
	$this->value = $value;
    }

    public static function &string($value = null) {
	// Übergibt eine Referenz auf die Funktion  getNewReference,
	// die ihreseits eine Referenz auf das $memory Array übergibt
	$string = &getNewReference(new String($value));
	return $string;
    }

    public function __toString() {
	return (string) $this->value;
    }
    public function __destruct() {
	global $memory;

	// Kann sofort zerstört werden da keine Referenz.
	 if($this->refKey === null) {
	    return;
	}
		// Prüfen ob ein Object gleichen types in die referenz geschrieben wurde.
	if($memory[$this->refKey] instanceof self) {
			// Neuen object alten Referenzkey übertragen.
	    $memory[$this->refKey]->setRefKey($this->refKey);
			// Ist es eine skalaren Variable ("Normaler Datentyp" string, int , bool, usw..)".
	} else if(is_scalar($memory[$this->refKey])){
			// Neuen wert aus der Referenz auslesen.
	    $value = $memory[$this->refKey];
			// Eigene Classe ermittel (für extended).
	    $class = get_class($this);;
	    // Neues Object erzeugen und in das Array mit den Referenzen schreiben
	    $memory[$this->refKey] = new $class($value);
			// Neuen object alten Referenzkey übertragen.
	    $memory[$this->refKey]->setRefKey($this->refKey);
	}
    }
}
$foo = & String::string();

$foo = 'Hallo Welt!';

$bar = & String::string();

$bar = 42;

var_dump($foo);

echo $foo.' Der sinn des Lebens ist '. $bar;

2 Kommentare »