Update alle MySQL collate en character sets met 1 SQL commando

August 9th, 2011 by admin No comments »

Aan het begin bij het opzetten van wat nu een grote database is geworden, heb ik gekozen voor de standaard latin codering. Door allerlei veranderingen in de PHP code en de overstap naar Zend Framework moest de collcation overgezet worden naar utf8-unicode-ci. Met zo’n 80 tabellen met ieder gemiddeld zo’n 30 velden is dat een hoop werk om handmatig te doen.

Dus google erbij gehaald en uiteindelijk het in enkele minuten voor elkaar gekregen met de volgende SQL:

select concat( 'alter table `', a.table_name, '` convert to character set utf8 collate utf8_unicode_ci;' )
from information_schema.tables a
where a.table_schema = "schema"

Vergeet niet om achter table_schema de juiste database in te vullen in plaats van schema wat er nu staat. De uitvoer van de bovenstaande SQL kan je weer kopieren en plakken via de SQL tab van je database in phpMyAdmin.

Om het ook meteen in Zend Framework goed te krijgen moest ik ook nog bij het aanmaken van het Zend_DB object een driver optie meegeven:

'driver_options' => array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8;'

Dit plaats je dus in de zelfde array als waar je ook de login, wachtwoord en database opgeeft voor de te openen database.

Zend Framework class voor Twinfield SOAP API

July 9th, 2011 by admin No comments »

Tijdens de ontwikkeling van het nieuwe controle paneel moest er onder andere een Zend Framework class geschreven worden voor verbinding tussen ons eigen systeem en Twinfield. Hier heeft Twinfield een heel mooie API beschikbaar via SOAP. Hieronder de basis van de My_Soap_Client_Twinfield class.

Zodra de class verder af is, zal ik nog een update plaatsen.

class My_Soap_Client_Twinfield extends Zend_Soap_Client
{
protected $cache = NULL;

protected $user = "********";
protected $password = "********";
protected $organisation = "********";
protected $administration = "********";

protected $header = NULL;

protected $data = false;

private function getSession() {
$ret = false;

$params = array( 'user' => $this->user,
'password' => $this->password,
'organisation' => $this->organisation
);

$cache = Zend_Registry::get ( 'Cache' );

if( $this->data === false && ( $this->data = $cache->load( md5("Twinfield_Session_And_Url") ) ) === false ) {
$client = new Zend_Soap_Client( "https://login.twinfield.com/webservices/session.asmx?wsdl" );

$client->logon( $params );

$doc = new domDocument();
$doc->loadXML( $client->getLastResponse() );

$this->data['SessionID'] = $doc->getElementsByTagName('SessionID')->item(0)->textContent;
$cluster = $doc->getElementsByTagName('cluster')->item(0)->textContent;
$this->data['cluster'] = $cluster . '/webservices/processxml.asmx?wsdl';

$client = new Zend_Soap_Client( $cluster . '/webservices/session.asmx?wsdl' );
$header = new SoapHeader( 'http://www.twinfield.com/', 'Header', array( 'SessionID' => $this->data['SessionID'] ) );
$client->addSoapInputHeader( $header );
$client->SelectCompany( array( 'company' => $this->administration ) );

$doc = new domDocument();
$doc->loadXML( $client->getLastResponse() );
$result = $doc->getElementsByTagName('SelectCompanyResult')->item(0)->textContent;

# Alleen het resultaat bewaren als alles goed gegaan is
if( strcmp( $result, "Ok" ) ) {
$cache->save( $this->data );
$ret = true;
}
}

return $ret;
}

public function __construct( ) {
if( $this->getSession() ) {
parent::__construct( $this->data['cluster'] );

$this->header = new SoapHeader( 'http://www.twinfield.com/', 'Header', array( 'SessionID' => $this->data['SessionID'] ) );

# Add permanent session header
$this->addSoapInputHeader( $this->header, true );
} else {
throw new Exception( "Error creating Twinfield session" );
}
}

Gebruik niet de FTP layer in Joomla

November 11th, 2010 by admin No comments »

Voor mijn webhosting bedrijf beantwoord ik via de helpdesk regelmatig vragen over CMS systemen. Daarbij loop je ook regelmatig tegen vreemde situaties aan, maar wat de ontwikkelaars van Joomla gedacht hebben tijdens de ontwikkeling van de FTP layer is mij volslagen onduidelijk.

Joomla is al een CMS met de meeste beveiligingslekken en wordt het vaakst gehackt. Daarbij komt de hacker binnen en krijgt vaak daarbij volledige toegang tot het account. Met de introductie van de FTP layer wil Joomla problemen omzeilen met rechten, maar vergeet daarbij wel te vermelden dat deze FTP gegevens in klare tekst in het configuratie bestand worden gezet.

Gevolg hiervan: als de Joomla installatie gehackt wordt heeft de hacker ook meteen de beschikking over je FTP login gegevens. Vaak zijn deze gegevens gelijk aan de SSH login gegevens en de login gegevens voor het controle paneel van het eventuele webhosting bedrijf waar je je website hebt onder gebracht. Oftewel: de hacker kan overal bij, inclusief de domeinregistratie gegevens.

Als je dus niet oppast en de hacker is een beetje handig, dan ben je uiteindelijk zelfs je domein kwijt. Gebruik de FTP layer van Joomla dus niet. Het gebruik hiervan is ook vaak niet nodig. Zeker niet als de PHP scripts door de webserver uitgevoerd worden onder de eigen user.

Waarom heeft een iPhone geen normaal toetsenbord?

November 2nd, 2010 by admin No comments »

Vanwege de vele vragen die er op de helpdesk binnen komen hebben al meer dan ‘n half jaar een iPhone op kantoor liggen… Na 5 minuten was ik het apparaat al zat: geen normaal toetsenbord. En dan bedoel ik een toetsenbord met fysieke toetsen zoals op het uitklaptoetsenbord van mijn N97, geen touchscreen ramp voor mensen met dikke vingers. Ik vind het echt een gemis.

Nu ik een AR Drone heb aangeschaft die aangestuurd wordt met een iPhone of iPad, is de iPhone weer uit de kast gekomen. Na wat proberen ben ik weer tegen die beperking gelopen: geen normaal fysiek toetsenbord… Maar ik zal wel de enige zijn die dat een te groot nadeel vindt om hem daadwerkelijk te gebruiken.

Eenvoudige Zoom functie met javascript

April 12th, 2010 by admin No comments »

In de Sieraden webwinkel waar ik al eerder over schreef zat een mooie zoomfunctie in: Als je met het pijltje over een foto heen gaat, dan wordt er een vergroting getoond van het gedeelte waar je met de muis overheen gaat. Dit is een aanvulling op de JQuery javascript library. Op zich al heel mooi, maar het is handiger als je de vergroting naast het origineel hebt staan. Dit naar voorbeeld van de wehkamp zoom (zie ‘n willekeurig artikel), zoals we die zelf inmiddels noemen.

Zelf dacht ik dat dit lastig ging worden, maar er is naast de reeds genoemde module ook een module die het precies op die manier doet: jqZoom. Geweldig. Omdat er al een zoom functie in de website zat, was de aanpassing heel eenvoudig: andere scripts instellen en de html iets aanpassen. Zie de installatie uitleg op de jqZoom pagina.

Het resultaat mag er zijn (al zeg ik het zelf): Kettingen en Armbanden worden nu netjes vergroot naast het origineel. Helemaal geweldig.

iDeal gateway voor CMS Made Simple

April 2nd, 2010 by admin 6 comments »

Al enige tijd ben ik bezig met de webshop voor een Sieraden webwinkel. Hierbij heb ik gebruik gemaakt van CMS Made Simple. Hiervoor bestaat alleen een betaalde iDeal gateway. Daar hou ik niet zo van, dus vandaar dat ik eindelijk maar eens ga terug geven aan de open source community door een gratis iDeal gateway voor CMS Made Simple te schrijven.
Na een paar keer uitgesteld te hebben, heb ik vandaag de eerste release gedaan: CMS Made Simple iDeal gateway, versie 0.1.0.
Deze versie is getest tegen de iDeal simulator en de Rabobank test en live omgeving. De code is gebaseerd op onder andere de code van de iDeal simulator website, en die code is ook getest tegen de ING en ABN Amro omgevingen. Dus ik ga er vanuit dat het allemaal probleemloos werkt.

Vervangen van een harde schijf bij een QNAP 209

March 16th, 2010 by admin No comments »

Je merkt er niets van wat er in je meterkast staat te zoemen, totdat je ineens op Zondag ‘n mailtje krijgt dat 1 van de harde schijven kapot is. Maar omdat het apparaat toch in RAID 1 is geconfigureerd, draait het allemaal vrolijk verder.

Nieuwe harde schijf besteld, in dit geval toevallig bij Azerty, omdat die volgens de Tweakers pricewatch de goedkoopste waren voor wat betreft de harde schijf die ik nodig heb. Op Dinsdag binnen en ‘s avonds er meteen ingezet.

Omdat ik uiteraard de handleiding niet had gelezen heb ik het apparaat uitgezet voor het vervangen van de harde schijf, maar achteraf blijkt het volgens de QNAP website helemaal niet nodig te zijn geweest: De schijven zijn hot-swappable.

Afijn. Apparaat weer aangezet en na wat piepjes zie ik netjes in de admin interface dat de RAID staat te rebuilden. Dus over ‘n uurtje is het allemaal weer redundant. Ik kan weer gerust slapen.

Een QNAP backup share met daarin alle shares die gebackupped moeten worden

September 16th, 2009 by admin No comments »

Een checklist wat je allemaal uit moet halen om in 1 keer alle shares die je wilt rsyncen, te rsyncen. Helaas laat de QNAP momenteel dat nog niet toe, dus heb ik een truukje gevonden op internet om dat toch te doen. Het komt er op neer dat je 1 share moet maken met daarin alle shares die je wilt backuppen.

  1. Maak de backup share aan via de administrator website en geef alleen de admin user toegang.
  2. Maak in de backup share de mappen aan met de namen van de shared die je wilt backuppen.
    cd /share/MD0_DATA/Backup/
    mkdir Qmultimedia
  3. Mount de shares in de backup share
    mount -o bind /share/MD0_DATA/Qmultimedia /share/MD0_DATA/Backup/Qmultimedia
  4. Pas autorun.sh aan (of maak het script aan) in de /etc/config map
    mount -t ext2 /dev/mtdblock5 /tmp/config
    cd /tmp/config
    vi autorun.sh
    chmod +x /tmp/config/autorun.sh
  5. Plaats in dit script alle mount -o bind … commando’s
  6. Umount /tmp/config weer
    umount /tmp/config

Maak daarna een schedule aan om de backup share met rsync te kopieren naar een andere server via de webinterface.

QNAP NAS synchroniseren met een externe rsync server

September 16th, 2009 by admin 1 comment »

‘n Jaar geleden heb ik veel tijd gestoken in het draaiende krijgen van een rsync verbinding tussen een QNAP TS-209 PRO II en een rsync onder linux installatie. Door onbekende oorzaak was het script ineens verdwenen op de QNAP, bleek vorige week.

Vanacht kon ik toch niet slapen, dus er maar even tijd in gestoken om het weer aan de praat te krijgen. Stap 1 is altijd even kijken of er een nieuwe firmware voor de QNAP is. En die was er: versie 3. Die eerst maar eens installeren, want er staat bij dat er een volledig nieuwe user interface in deze nieuwe versie zit. Inderdaad, dat klopt. Het lijkt wel of er ineens een nieuw apparaat in de meterkast staat. Ziet er gelikt uit.

Stap 2 is kijken naar de rsync mogelijkheden. De nieuwe interface blijkt daarvoor een soort wizard te bieden onder Backup -> Remote Replication. De rsync op de linux server draaide nog gewoon, dus maar eens gekeken of de QNAP kan connecten: zonder problemen. Synchroniseren dan maar eens testen: zonder problemen. Of te wel het hele probleem van het schrijven van een script is ineens niet meer nodig. De nieuwe QNAP administrator interface handelt het zo voor je af.

Uiteraard nog een wensenlijstje: er is geen mogelijkheid om bepaalde files en/of mappen uit te zonderen van synchronisatie. Dat zou wel handig zijn, want de QNAP maakt veel mappen en bestanden aan voor thumbs van de foto’s. Die worden nu ook gesynchroniseerd.

Form met read-only veld

September 15th, 2009 by admin No comments »

Het was niet duidelijk hoe er een veld getoond kan worden binnen een form, dat niet gewijzigd kan worden. Na wat zoekwerk kwam de volgende constructie naar boven:

$form->addElement(‘text’, ‘ip’,
array(‘label’ => ‘IP adres’, ‘value’ => $_SERVER['REMOTE_ADDR'] ));
$form->getElement(‘ip’)->helper = ‘formNote’;