BMI calculator met Jquery

Voor een project wat nog in ontwikkeling is moest ik een BMI calculator maken. Ik had er ooit wel eens één gemaakt maar die werkte via een POST en ‘berekende’ alles met PHP. Het leek me leuk dit keer Jquery te gebruiken.

De oude BMI calculator

Zoals je ziet op zich prima maar een beetje statisch. Tevens niet echt superduidelijk. Er zit een 1 px wit lijntje wat je huidige BMI aanduidt maar je moet wel goed opletten om die te zien.

De nieuwe BMI calculator

Zoals je ziet wel wat overeenkomsten (zelfde opdrachtgever dus moest zelfs alles een beetje gelijk houden) maar toch net even wat frisser. Een duidelijkere pointer voor je BMI en in plaats van invulvelden en een submitbutton gewoon twee Jquery UI sliders.

De code

Wat heb je in iedere geval nodig?

  1. Jquery
  2. Jquery UI
  3. Een BMI afbeelding voor de achtergrond
  4. Eventueel een leuke afbeelding voor de pointer

Voor het gemak kun je het hele gebruikte pakketje voor deze implementatie hier downloaden.

De te includen bestanden in de header

  1. reset.css
  2. screen.css
  3. jquery-ui-1.8.16.custom.css
  4. jquery.1.6.1.min.js
  5. jquery-ui-1.8.16.custom.min.js
  6. bmi.js

De HTML

Dit is de kale HTML voor de slider met tabel etc.


<div id="lengthSlider"></div>
<label for="length">Uw lengte is <input type="text" id="length" /> centimeter</label>

<div id="weightSlider"></div>
<label for="weight">Uw gewicht is <input type="text" id="weight" /> kilogram</label>

<div id="bmiScale">
    Uw Body Mass Index is
    <div id="bmiScalePointer"></div>
</div>

<div id="bmiInformation">
  <h4>Wat is een gezonde BMI?</h4>
  <table border="0" cellpadding="0" cellspacing="0" width="500">
    <tbody>
      <tr>
        <td width="10"><img src="</assets/images/bmi-yellow.gif" alt="ondergewicht" height="10" width="10"></td>
        <td width="130">Tussen 16 - 20</td>
        <td width="240">Uw BMI is iets te laag</td>
      </tr>
      <tr>
        <td><img src="/assets/images/bmi-green.gif" alt="gezond gewicht" height="10" width="10"></td>
        <td>Tussen 20 - 25</td>
        <td>gezond gewicht</td>
      </tr>
      <tr>
        <td><img src="/assets/images/bmi-yellow.gif'" alt="normaal - licht overgewicht" height="10" width="10"></td>
        <td>Tussen 25 – 27</td>
        <td>normaal - licht overgewicht</td>
      </tr>
      <tr>
        <td><img src="/assets/images/bmi-orange.gif" alt="normaal - overgewicht" height="10" width="10"></td>
        <td>Tussen 27 -29</td>
        <td>normaal - overgewicht</td>
      </tr>
      <tr>
        <td><img src="/assets/images/bmi-red-orange.gif'" alt="overgewicht" height="10" width="10"></td>
        <td>Boven de 30</td>
        <td>overgewicht</td>
      </tr>
      <tr>
        <td><img src="/assets/images/bmi-red.gif" alt="ernstig overgewicht" height="10" width="10"></td>
        <td>Boven de 40</td>
        <td>ernstig overgewicht</td>
      </tr>
    </tbody>
</table>
</div>

De Jquery code

De volgende code berekend de BMI, verplaatst de pointer etc.
Zie ook de opmerkingen ertussen.

// Function to calculate the BMI using lenght in centimeters and weight in kilograms
function calculateBMI(lenght, weight)
{
  // Calculate the BMI and round at 1 decimal
  var result = Math.round(weight / (lenght/100 * lenght/100)*10)/10;

  // Determine the left position of the bmiScalePointer (and subtract 50% of it's width)
  var leftPos = (result*10)-22;

  // If the leftpos is > 450 it would run out of the scale so stop it here
  if(leftPos > 450) {
  leftPos = 450;
  result = Math.round(result);
}

// Update the bmiScalePointer value
$('#bmiScalePointer').html("BMI<br/><br/>" + result);

// Move the bmiScalePointer to it's new position
$('#bmiScalePointer').css('left', leftPos);
}

$(document).ready(function() {
  // Just plain Jquery UI slider functionalitiy
  $("#lengthSlider").slider({
    value: 175,
    min: 130,
    max: 220,
    step: 1,
    slide: function( event, ui ) {
      // Initiate the calculation function on sliding
      calculateBMI(ui.value, $('#weight').val());
      $("#length").val(ui.value);
    }
  });

  $("#length").val($("#lengthSlider").slider("value"));

  $("#weightSlider").slider({
    value: 75,
    min: 24,
    max: 250,
    step: 1,
    slide: function( event, ui ) {
      // Initiate the calculation function on sliding
      calculateBMI($('#length').val(), ui.value);
      $("#weight").val(ui.value);
    }
  });
  $("#weight").val($("#weightSlider").slider("value"));

  // Do a initial calculation
  calculateBMI($('#length').val(), $('#weight').val());
});

Nogmaals voor het gemakt: Het hele gebruikte pakketje voor deze implementatie kun je hier downloaden.

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.

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();
        }
    });
});

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.

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

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