Webparking Weblog ZEND Framework | jquery | internet | php | webdesign

26sep/110

Google maps API geocoding met Zend_Http_Client

Voor een leukheidje in een CMS wilde ik de geo-coordinaten van een adres ophalen. Ik had al wel iets liggen maar dat was wat oudere code en wilde de output als JSON hebben. Hier de meest recht-toe-recht-aan oplossing om verder te ontwikkelen naar wens:

// Address to lookup. Don't overlook the + instead of spaces
$address = 'Stationsplein+45,3013+AK,ROTTERDAM';

$client = new Zend_Http_Client();
$client->setUri('https://maps.googleapis.com/maps/geo');
$client->setConfig(array('maxredirects' => 0, 'timeout' => 30));
$client->setParameterGet('output', 'json');
$client->setParameterGet('q', $address);
$response = $client->request('GET');

$body = $response->getBody();
$response = Zend_Json::decode($body, Zend_Json::TYPE_OBJECT);

if($response->Status->code == 200) {
    // Jeej, success
    Zend_Debug::dump($response);
} else {
    // Trouble!
    Zend_Debug::dump($response);
}

Zoals ik al zei, geen übercode die klaar is voor gebruik maar een leuke basis voor implementatie in een Google maps service of class.

23sep/110

Jquery alle hyperlinks naar afbeeldingen koppelen aan Fancybox

Een tijdje terug heb ik voor een klant als service een microstukje javascript gemaakt met Jquery om alle hyperlinks in de content te hooken aan Fancybox (of welk ander script dan ook voor de weergave van foto's). Wat hij doet is alle a elementen in de dom (of een selectie daarvan) opzoeken, kijken of ze een href hebben en of die linkt naar een afbeelding en zo ja, Fancybox eraan hangen. Normaal doe je dit gewoon door een class of iets aan de afbeelding te hangen die je gebruikt als selector maar ik wilde dat alle via het CMS ingevoerde links naar afbeeldingen ook meegepakt werden. Om de klant niet te hoeven uitleggen wat hij moest doen om afbeeldingen te linken kwam ik hierop uit.


$(document).ready(function() {
    $("a").filter(function(){
        if($(this).attr('href').match(/\.(jpe?g|png|gif)/i)) {
            $(this).fancybox();
        }
    });
});

ps. Als je sommige afbeeldingen eruit wilt houden kun je altijd nog iets toevoegen als een not()conditie (waarbij je in dit geval dus aan de hyperlink de class .noFancy meegeeft:

$(document).ready(function() {
    $("a:not(.noFancy)").filter(function(){
        if($(this).attr('href').match(/\.(jpe?g|png|gif)/i)) {
            $(this).fancybox();
        }
    });
});
21sep/110

PHP xmlWriter resultaten naar log schrijven

Een bestaande applicatie die een XML export doet met XMLWriter moest voorzien worden van een mogelijkheid om de exacte XML output weg te schrijven in een log. Het script maakte in eerste instantie gebruik van directe output naar de browser:

$xml->openURI('php://output');

Om het totale resultaat van de XML output in een logfile te schrijven was dit niet ideaal. Het zou op zich wel kunnen maar omzetten naar gebruik van het geheugen voor opslag van de XML was iets handiger (zeker omdat het om relatief weinig data per run ging).

Hieronder de code voor een basis XML die zowel naar de browser gaat als naar een logfile:

// Set correct header
header('Content-Type: application/xml, charset=utf-8');

// Initiate XMLWriter
$xml = new XMLWriter();

// Create new xmlwriter using memory for string output
$xml->openMemory();

// Create document tag
$xml->startDocument('1.0', 'UTF-8');

// Create start element tag
$xml->startElement('test');

//  Write full element tag
$xml->writeElement('value', 'testwaarde');

// End current element
$xml->endElement();

// End current document
$xml->endDocument();

// Define logfile name
$filename = '/logs/' . date('Ymd_hm') . '.xml';

// Open file
$fp = fopen($filename, "w");

// Write memory output to file. The false boolean is to
// prevent XMLWriter from flushing the current buffer
fwrite($fp, $xml->outputMemory(false));

// Close the file
fclose($fp);

// Return the current buffer
echo $xml->outputMemory();

Dit is een redelijk kort samengevat voorbeeld en het kan altijd beter, netter en leuker maar het idee is duidelijk.

18sep/110

Office 365: Shared mailbox aanmaken via Powershell

Binnen Office 365 zijn twee manieren op gedeelde postvakken aan te maken.

Je maakt er een user-account voor aan met licentie
Deze mailbox heeft, dankzij zijn gebruikersaccount en licentie, dezelfde mogelijkheden als een gewone gebruiker. Denk aan zaken als archief-postvak, 25 GB opslag etc.

Je maakt alleen een gedeelde mailbox aan zonder user en licentie
Deze maak je vanuit de Shell aan en heeft beperkingen omdat er ook niet direct voor betaald wordt. Er is geen gebruiker om mee in te loggen, geen archief-postvak en een max van 5 GB mailboxruimte. Voor de meeste bedrijven zijn deze concessies echter geen probleem en dan heb je in principe geen kosten aan je gedeelde mailbox. Zeker voor kleinere organisaties niet onprettig.

Configuratie shared mailbox via shell

In dit geval ga ik uit van een mailbox zonder licentie maar een mailbox met licentie is niet veel anders. De eerste stap, connectie maken via de powershell, sla ik over. Het stelt eigenlijk niet veel voor. Eerst maken we een nieuwe gedeelde mailbox aan met het commando:

New-Mailbox -Name "info@websitenaam.tld" -Alias info -Shared -primarysmtpaddress "info@websitenaam.tld"

De nieuwe mailbox is nu een feit. Nu willen we bepaalde andere mailboxen rechten geven om deze mailbox te openen, mails te versturen namens etc. Dit doen we met het volgende commando:

Add-MailboxPermission "info" -User "gebruikersalias" -AccessRights FullAccess
Add-RecipientPermission "info" -Trustee "gebruikersalias" -AccessRights SendAs

Note: De parameter -user is trouwens een beetje gemeen want dit kan zowel een individuele gebruiker als een groep zijn dus is een beetje misleidende benaming.

Optioneel kun je bijvoorbeeld ook alleen de rechten geven om te verzenden namens door de -accessRights parameter te veranderen. De volledige lijst met functies krijg je met get-help:

get-help Add-MailboxPermission

of

get-help Add-MailboxPermission -examples

bijvoorbeeld.

Als je nu wilt kijken of de rechten  op de mailbox naar wens zijn kun je dit doen met het volgende commando:

get-mailboxpermission info

En om te kijken of de recipient rechten naar wens zijn:

get-recipientPermission info

Als je trouwens echt alles over een mailbox in 1x wilt zien kun je ook nog het volgende commando uitvoeren (let op! veel informatie zal tot u komen):

get-mailbox info | fl
14sep/110

Gegevens versleutelen met Zend_Crypt_Rsa

Hasin Hayder heeft erg netjes uitgewerkt (met voorbeeldcode) hoe je met Zend_Crypt_Rsa gegevens kunt versleutelen en ontcijferen. Omdat dit in de Zend documentatie verder niet echt grondig (eigenlijk gewoon niet) is uitgewerkt kan zijn post je misschien helpen hier meer inzicht in te krijgen.

lees het artikel op zijn blog

12sep/110

Office 365 shell gebruiken

Sinds enige tijd bieden wij onze klanten de mogelijkheid Office 365 te configureren en implementeren. Standaard kun je via de Office 365 portal als administrator diverse basisinstellingen doen zoals licenties beheren, gebruikers aanmaken etc. Tevens krijg je vanuit de portal de mogelijkheid naar Outlook Web Access te gaan op admin niveau om vanuit daar bepaalde Exchange configuratiezaken te regelen. Als je echter meer wilt is de exchange shell de plek om te zijn.

Net als in een "normale" exchange installatie biedt de GUI je wat basics maar kun je het snelst en leukst configureren via de shell. In deze post leg ik in het kort uit hoe je hiermee aan de slag gaat voor jouw Office 365 omgeving. Allereerst: Vergeet Office 365 als je op zoek bent naar documentatie en functionaliteiten en zoek naar exchange 2010. Office 365 is namelijk een visuele verzamelplaats en naam voor exchange online (exchange 2010), sharepoint en office web apps.

Connectie maken met je exchange server

Als je op je lokale windows Powershell start krijg je het volgende scherm:

Voer dan het volgende commando in:

$LiveCred = Get-Credential

Waarna je een prompt krijgt om je inloggegevens in te voeren:

Als je ingelogd bent voer je onderstaand command in:

$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell/ -Credential $LiveCred -Authentication Basic -AllowRedirection

He krijgt dan onderstaand scherm te zien:

Als laatste geef je een commando mee om de powershell opdracht te geven alle ingevoerde commando's aan deze sessie te koppelen:

Import-PSSession $Session

De verbinding is nu gelegd en je kunt via de shell je exchange gaan beheren. Type bijvoorbeeld onderstaande code om een overzicht van alle mailboxen te krijgen inclusief wat simpele statistische data:

Get-Mailbox -ResultSize Unlimited | Get-MailboxStatistics | Select DisplayName,StorageLimitStatus,@{name="TotalItemSize (MB)";expression={[math]::Round(($_.TotalItemSize.Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)}},@{name="TotalDeletedItemSize (MB)";expression={[math]::Round(($_.TotalDeletedItemSize.Split("(")[1].Split(" ")[0].Replace(",","")/1MB),2)}},ItemCount,DeletedItemCount | Sort "TotalItemSize (MB)" -Descending

 

Mocht je bepaalde "krachtigere" commando's willen gaan uitvoeren dan kan het nodig zijn om de executionPolicy aan te passen. Dit doe je met onderstaand commando:

set-ExecutionPolicy unrestricted
18aug/110

Form based authentication for websites

Op Stackoverflow is men druk bezig in een poging "The Definitive Guide To Forms based Website Authentication" te maken. Komen best wat interessante punten voorbij. Sommige zijn relatief eenvoudig implementeerbaar in bestaande omgevingen terwijl andere "aanbevelingen" wat dieper gaan. Zeker als je een nieuwe applicatie opzet die nét dat stukje meer veiligheid vereist kan dit een heel interessant document zijn om nog eens kritisch te kijken naar je bestaande authenticatieprocedures.

De highlites zoals ik ze zie

Onderstaand lijstje is absoluut niet als richtlijn te gebruiken maar meer als "o ja, die" reminders van de zaken die in iedere geval in het oog springen, te gemakkelijk zijn om niet te doen of een flink verschil maken in de veiligheid van de login:

  • CAPTCHA's zijn in basis nutteloos (op reCAPTCHA na want die is echt onmogelijk irritant)
  • Ben je goeroe dan ga je voor een Diffie-Hellman key exchange (wiki)
  • Cookies voor je sessie geef je het beste een HTTP Only header mee en zijn 'secure'
  • Mocht je een "onthoudt mij" willen sla dan in iedere geval een zeer gezouten hash op van de token in je DB en niet de 'kale' cookie token
  • Geheime vragen zijn evil en vormen een veiligheidslek
  • Wachtwoord vergeten = nieuwe kiezen. Een "gereset" wachtwoord toezenden wat onmogelijk ingewikkeld is wordt vermoedelijk geprint, op een post-it gezet etc.
  • Stel minimale eisen aan een wachtwoord (javascript wachtwoord complexiteit checker)
  • Blokkeer massale login pogingen door pogingen te loggen en blocks uit te delen bij X aantal false attempts
  • Geef straf "delays" bijv. 2 seconde na 3e foutieve login, 5 seconde na 4e foutieve login etc zodat het onmogelijk is massa's logins te testen
  • Gebruik SSL (beetje open deur maar hij hoort erbij)
  • Sla wachtwoorden alleen encrypted en salted op

De bron

Dit zijn maar een paar korte hightlites uit dit prachtige artikel:
http://stackoverflow.com/questions/549/the-definitive-guide-to-forms-based-website-authentication

12jul/110

Let me Google that for you voor het antwoord op stomme vragen

ja, ik weet het, stomme vragen bestaan officieel niet maar geloof me dat je met Google aardig wat vragen toch stom worden. Regelmatig komen er vragen voorbij waarvan je denkt "Google het gewoon even, zo lastig is het niet". Als het een vraag van een klant is dan help je ze natuurlijk zo goed mogelijk met een juist antwoord maar zeker als het uit een andere richting komt kan het erg vervelend zijn. Nu is er een prachtige site die wij al lange tijd gebruiken om deze mensen subtiel te vertellen dat de vraag erg overbodig is. lmgtfy.com (Let me Google that for you)

Hoe werkt het?

1. Je voert de zoekvraag in en drukt op de "zoek" of "doe een gok" knop

2. Je krijgt een uniek URL

3. Stuur dit URL naar de vraagsteller

Klaar. De URL brengt je naar een pagina waarop je de Google zoekbalk ziet die gevuld wordt met de vraag, er wordt op de knop gedrukt en de gebruiker wordt doorgestuurd naar Google resultaten van het antwoord op de vraag (of direct naar de 1e site bij de "doe een gok" optie).

Op die manier kun je toch nog een beetje plezier beleven met het beantwoorden van voor de hand liggende vragen. Voorbeeldje: http://tinyurl.com/67e796x

Ook een vraag beantwoorden?
Ga naar http://lmgtfy.com

8jul/110

Gratis Photoshop alternatief wat prima werkt

Enkele dagen geleden kwam ik langs een fantastisch stukje websoftware. Pixl editor genaamd. Een online Flash Photoshop alternatief wat echt superstrak in elkaar zit. Niet alleen zijn de functionaliteiten overweldigend maar het ziet er ook nog eens allemaal heel gelikt uit en is gratis. Wat wil je nog meer?

Niet alleen kun je met Pixl editor afbeeldingen op je PC bewerken (met de nadruk op het woord "op" omdat je als Flash 10 gebruiker gewoon lokaal werkt) maar je kunt ook gelijk een afbeelding van het internet "plukken" of uit een andere bron zoals Facebook etc.

Alle serieuze zaken die je in een betaald pakket tegenkomt zitten erin. Enkele van deze leuke functionaliteiten zijn:

  • Afbeeldingen opbouwen uit lagen
  • Veel prachtige filters zoals tilt shift, water effecten, caleidoscoop, haltone en meer
  • Geschiedenis om bewerkingen ongedaan te maken
  • Eenvoudig afbeeldingen bijsnijden etc
  • Vele mogelijkheden tot bijwerken kleurtinten
  • Meertalig
  • Rotate, flip en meer
  • Layer styling zoals dropdown shadows, bevels etc

Kortom, eigenlijk heel veel voor weinig. Ideaal om "even snel" ergens een afbeeling bij te snijden als je geen pakket op je PC tot je beschikking hebt.
Bezoek http://pixl.com/editor/

 

6jul/110

CSS prism kleuren van stylesheet bepalen

Geen idee of we dit ooit nodig gaan hebben maar wel weer een grappige app. In het kort de werking;

  1. Je geeft hem een url naar een stylesheet
  2. Hij geeft je alle kleuren terug die erin gebruikt worden
  3. Je kunt kleuren in één keer in hele stylesheet aanpassen
  4. Je krijgt een aangepaste stylesheet retour die je in je site kunt gebruiken

Eens testen
Hop, Webparking stylesheet erin en ik krijg inderdaad een scherm met kleurtjes:

 

Als je dan op een kleur klikt zie je welke kleur, kun je hem aanpassen en krijg je gelijk te zien waar hij in de CSS te vinden is:

Als je klaar bent met aanpassen kun je rechtsboven de aangepaste CSS downloaden en klaar. Erg simpel, erg handig en vooral iets waarvan je vergeet dat het er is. Weet nu al dat mocht ik ooit op deze manier iets moeten refactoren ik het vermoedelijk gewoon doe middels een search en replace in mijn code.

Improve the web with Nofollow Reciprocity.