Kebmans blogg

SMPTE-synkronisering på GitHub

Posted in Data, Filmredigering, Internett, Programmering, Programvare, Scripting, Teknologi, Video by kebman on 13/05/2013

Endelig har jeg oppdaget GitHub og lagt ut mitt første prosjekt der. Driver på med et videoprosjekt nå, men jeg fikk noen problemer med SMPTE-koder (tidskoder for video) som ikke stemte med hverandre da jeg logget. Først sjekket jeg ut noen programmer, men de dugde ikke, så da bare satte jeg i gang å lage min egen kode.

Sjekk det ut her: https://github.com/kebman/Simple-SMPTE-class-in-PHP

Reklamer

Hvordan traversere JSON med PHP

Posted in Programmering, Scripting, Teknologi, Webdesign by kebman on 10/04/2013

Nå og da trenger man å traversere JSON-data med PHP. Da kan det være greit å vite hvordan man gjør det. Her er et lite eksempel.

La oss si du har fått en fil, folk.json. Her er den:

{
 "folk": [
 { "fornavn": "Ola", "etternavn": "Nordmann" },
 { "fornavn": "Kari", "etternavn": "Nordmann" },
 { "fornavn": "Lars", "etternavn": "Medelsvensson" },
 ]
}

Det du har her er for alle praktiske formål en flerdimensjonell array. Ofte kan slike by på litt hodebry, men egentlig er det ganske enkelt når man holder på med JSON. Alt du trenger å gjøre er å gjøre om innholdet i filen til et PHP-objekt, slik:

<?php
$json_object = json_decode(file_get_contents('folk.json'));
?>

Her er det som skjer i koden: For det første opprettes en variabel til å hodle objektet på plass, $json_object. Deretter må folk.json leses inn til PHP med funksjonen file_get_contents(). Og til slutt må innholdet som er lest inn gjøres om til et objekt med funksjonen json_decode() – om koden den blir servert er korrekt JSON, vel å merke.

Så OK, vi har nå et JSON objekt lagret i PHP. Hva nå? Vel, siden det er et objekt, er det veldig lett å få tak i delene det består av med foreach. Vanligvis brukes foreach til å traversere flerdimensjonelle arrays, men faktisk kan det også brukes til å traversere objekter. Bare se her:

<ul><?php
foreach ($json_object->folk as $key=>$value) {
 echo "<li>" . $value->fornavn ." ". $value->etternavn . "</li>";
}?></ul>

De vi ber foreach-løkken om å gjøre her, er å skippe direkte til objektet folk, og å dele innholdet i objektet opp i nøkler og verdier. Når det er gjort, har vi – siden det er et objekt – direkte tilgang til underobjektene. Hvert av navneparene er her underobjekter av objektet folk, og vi kan nå hver del av dem ganske enkelt med å peke til riktig underobjekt.

Resultatet er en liste, slik:

  • Ola Nordmann
  • Kari Nordmann
  • Lars Medelsvensson

Vil du nå enda dypere, må du nøste flere foreach-løkker inn i hverandre, men dette er altså den grunnleggende idéen.

PHP kobler ikke til MySQL via localhost

Posted in Internett, Programmering, Scripting, Teknologi, Webdesign by kebman on 24/02/2012

Fikk plutselig feil da jeg prøvde å koble til MySQL-databasen via PHP i dag. Vips så ble det en aldri så liten detektivhistorie.

Koden jeg bruker for å koble til MySQL med PHP er veldig enkel, godt testet, og har fungert mange ganger før. Ikke det mest avanserte og ikke objektorientert, men den egner seg godt for testing. Her er den:

$host = 'localhost';
$user = 'root';
$pass = 'password';
$link = mysql_connect($host, $user, $pass);
if (!$link) {
   die('MySQL error '. mysql_errno() . ': ' . mysql_error());
}

Kort forklart, hvis $link klarer å koble opp til databasen går alt som det skal, mens om variablen inneholder feil, blir koblingen brutt og det blir istedenfor sendt tilbake noen feilmeldinger. Og her er den jeg fikk:

MySQL error 2002: No such file or directory

Så jeg prøvde å bytte ute passord, bruker, og byttet fra localhost og til 127.0.0.1, og heureka! Da funket det. Men likevel var jeg jo like langt i forhold til localhost. Jeg blunket litt med de våte øynene mine, og et slags mørke la seg over hjernen min. Feilmeldingen sa meg ikke en dritt, og jeg skjønte ikke hvorfor det bare funket med den lokale IP-adressen. Her var det bare å sette i gang og google.

En av tingene jeg testet var om MySQL i det hele tatt reagerte, men det visste jeg jo at den gjorde, fordi jeg kunne koble til via terminalen og via Sequel Pro. Likevel prøvde jeg å pinge den over telnet i terminale, slik:

telnet localhost 3306

Her tittet MySQL frem og sa hei som normalt, så dette var i orden, og fortsatt var jeg like lite klok.

Heldigvis kom jeg ganske snart over denne fine siden: C.5.2.2. Can’t connect to [local] MySQL server

Der sto det utrolig mye unødvendig og irrelevant, men jeg bet meg i alle fall merke i de tingene som faktisk stemte – blant annet en serie tester man kan gjøre i terminalen, disse her:

  1. mysqladmin version
  2. mysqladmin variables
  3. mysqladmin -h `hostname` version variables
  4. mysqladmin -h `hostname` --port=3306 version
  5. mysqladmin -h host_ip version
  6. mysqladmin --protocol=SOCKET --socket=/tmp/mysql.sock version

Da jeg kom til nummer tre på listen, skjønte jeg at noe var galt. Det gikk helt fint om jeg byttet ut `hostname` med localhost, men da jeg brukte den riktige koden, `hostname`, fikk jeg en feilmelding:

mysqladmin: connect to server at 'kebman.local' failed
error: 'Host '10.0.0.7' is not allowed to connect to this MySQL server'

Dette skjønte jeg ikke noe særlig mer utav heller, men det ante meg at det kunne være at en eller annen trodde at kebman.local var localhost, men det er jo slett ikke tilfelle. Dessuten er jo ikke 10.0.0.7 adressen til localhost heller (127.0.0.1 er adressen til localhost).

Lenger nede i dokumentet sto det noe om å finne navnet på socket-filen som brukes for å koble via localhost:

netstat -ln | grep mysql

Svaret jeg fikk, var dette:

/tmp/mysql.sock

«Hm», tenkte jeg nå. «Kan dette ha noe med denne kebman.local-greia å gjøre, tro? Feilen må jo ligge i php.ini et sted (filen man bruker til å konfigrere PHP med), men hvor?» Hadde også lest noe om det på erværdige stackoverflow.com. Jeg søkte igjennom alt som hadde med MySQL i php.ini, og endelig fant jeg det. I php.ini var det en annen adresse til mysql.sock. Jeg endret det til adressen jeg fikk opp med netstat-koden, og voila, endelig funket det å koble til MySQL via localhost med PHP igjen.

For å redigere php.ini på Mac må du først ha rot-passordet til maskinen din. Deretter er det letteste å bruke TextWrangler (gratis) til å åpne opp /etc/php.ini for redigering. Du kan også åpne filen med pico eller et annet UNIX-program for tekstredigering gjennom sudo-kommandoen (sudo gir ordre som rot-bruker).

Function og array i PHP

Posted in Økonomi, Programmering, Scripting, Webdesign by kebman on 10/11/2010

#Ruter, selskapet med ansvar for kollektivtransporten i Oslo og Akershus, har for mange billettyper å velge imellom, of derfor kan det være svært vanskelig å vite hva slags billett som er den beste å ha til en hver tid. Som ledd i et personlig korstog for å lage en kalkulator som regner ut den beste billettypen for deg – fordi Ruter sannsynligvis ikke har noen planer om det –  har jeg lekt meg litt med funksjoner og listevariabler i PHP.

<?php
// Pris på enkelbilletter for voksne i Akershus
// Nøkkel: sone => pris
$enkelBillA_v = array(1=>30,2=>40,3=>50,4=>60,5=>70,6=>80,7=>90,8=>100,9=>110,10=>120);

// Funksjon som lager barnebilletter av voksenbilletter
// Opprett funksjonen og send prisene for voksenbilletter til den
function enkelBarneBillA($voksenbilletter) {

// Gjør barnebillettene lik voksenbilettene
$barnebilletter = $voksenbilletter;
// Men gå igjennom alle prisene til barnebilettene...
foreach ($barnebilletter as &$value) {

// ...og del dem i to - HEEE-YAHH!
$value = $value / 2;

}

// Returner svaret ut av funksjonen
return $barnebilletter;
}

// Enkelbiletter for barn i Akershus
$enkelBillA_b = enkelBarneBillA($enkelBillA_v);
// Arrayen er lik outputen av funksjonen enkelBarneBillA(),
// og til denne funksjonen sender vi prisene på alle voksenbillettene
?>

Og en stort vanskeligere måte å dele et tall i to på, skal du vel egentlig lete lenge etter… Men nå har du altså et lite eksempel på hvordan funksjoner kan brukes sammen med listevariabler. Du kan teste den nye variabelen ved å ta med følgende kode:

<?php print_r($enkelBillA_b); ?>

Heldigvis finnes det en litt enklere måte å gjøre det på:

<?php
// Funksjon som halverer det den får inn:
function halver(&$value) { $value = $value / 2; }
// Kopierer priser for voksenbilletter til $barnebill:
$barnebill = $enkelBillA_v;
// Spaserer igjennom $barnebill og halverer alle prisene:
array_walk(&$barnebill, 'halver');
// Helt sant, bare sjekk:
print_r($barnebill);
?>