EnglishSvenska

Getting Andengine to work

This is a basic tutorial for how to get the AndEngineExamples working.

  1. Use Eclipse. Download and install the mercurial plugin.
  2. Clone AndEngine and all the AndEngine extensions. The list of projects to clone is below this list. Clone them all to the same directory.
  3. Open the AndEngineExamples project. Remove all references to libraries. Use the cloned projects as libraries instead since they are newer. To link source right click on the project and choose Build path, Link source. Link andengine and all the extensions. Use different names. See image to see how I organized it.andengine_eclipse_project
  4. When you have no error warnings you should be able to compile the project. I got some problems with the physics plugin. RealMayo on the andengine forum got it working by putting a missing file in the libs folder. See his answer on http://www.andengine.org/forums/bugs/crash-when-running-the-totorials-t4640.html

Read more ›

Using regular expressions in CakePHP and MySQL

If you want to find something in the database using regular expressions:

$domainNamed = $this->DomainName->find('all', array(
'conditions' => array(
'name REGEXP "^www.i"'
),
'fields' => array(
'name'
),
'contain' => false,
'limit' => 10
));

The code above will find all domain names that start with "www.".

USE INDEX the CakePHP way

Well ok not 100% the cakephp way but better than just using $this->query(...).

I wanted it to look like this:

$this->find('all', array(

'fields' => array('id', 'name'),

'use' => 'index_name'

));

To get this working you need to modify dbo_source. Copy it from cake/libs/model/datasources/dbo_source.php to app/models/datasources/dbo_source.php.

You can download my modified dbo_source.php . I have commented the modified lines with "added". I have only tested this on MySQL. I do not know if it will work on other databases. Also I am not sure if my solution is the best. Please feel free to comment if you have any improvements.

 

To manually modify the dbo_source to support the USE INDEX syntax:

in function read:

/* added */

if (!isset($queryData['use']))

    $queryData['use'] = null;

/* /added */

in function generateAssociationQuery:

    return $this->buildStatement(

    array(

'fields' => array_unique($queryData['fields']),

'table' => $this->fullTableName($model),

'alias' => $model->alias,

'limit' => $queryData['limit'],

'offset' => $queryData['offset'],

'joins' => $queryData['joins'],

'conditions' => $queryData['conditions'],

'order' => $queryData['order'],

'group' => $queryData['group'],

'use' => $queryData['use'] // added

    ), $model

    );

in function buildStatement:

return $this->renderStatement('select', array(

    'conditions' => $this->conditions($query['conditions'], true, true, $model),

    'fields' => implode(', ', $query['fields']),

    'table' => $query['table'],

    'alias' => $this->alias . $this->name($query['alias']),

    'order' => $this->order($query['order'], 'ASC', $model),

    'limit' => $this->limit($query['limit'], $query['offset']),

    'joins' => implode(' ', $query['joins']),

    'group' => $this->group($query['group'], $model),

    'use' => $query['use'] // added

));

in function renderStatement:

    case 'select':

/* added */

if (empty($use)) // added

    return "SELECT {$fields} FROM {$table} {$alias} {$joins} {$conditions} {$group} {$order} {$limit}";

else

    return "SELECT {$fields} FROM {$table} {$alias} {$joins} USE INDEX ({$use}) {$conditions} {$group} {$order} {$limit}";

/* /added */

break;

Ftp-server på Ubuntu

Jag gillar vsftpd eftersom den är ganska smidig att arbeta med. För att sätta upp en server och några ftp-konton:  

sudo apt-get install vsftpd

redigera /etc/vsftpd.conf.

listen=YES

anonymous_enable=NO

local_enable=YES

write_enable=YES

local_umask=022

dirmessage_enable=YES

use_localtime=YES

xferlog_enable=YES

connect_from_port_20=YES

chroot_local_user=YES

secure_chroot_dir=/var/run/vsftpd/empty

pam_service_name=vsftpd

rsa_cert_file=/etc/ssl/private/vsftpd.pem

pasv_enable=YES

tcp_wrappers=YES

pasv_min_port=15393

pasv_max_port=15394

port_enable=YES

pasv_address=#SERVERNS EXTERNA IP#

Öppna upp 15393-15394 och 20-21 i brandväggen.

Ftp konton sätts enklast upp med:

useradd -g ubuntu -M NAMN

passwd NAMN

(-g ubuntu är en grupp)

vim /etc/passwd för att sätta hem-mappar till dina användare.

Importera gigantisk databas till MySQL från cmd/terminal

powershell_mysql_cmd_source_import_sqlAtt importera stora databasfiler kan ofta bli lite jobbigt om man inte använder rätt metod. Phpmyadmin är kasst på att importera riktigt stora sql-filer eftersom man får timeout. Har man däremot direkt tillgång till mysql-servern kan man importera därifrån med bättre resultat.

#mysql -u USER -p
#skriv lösenord
#use DATABAS
#SOURCE /path/to/sql/file.sql; (missa inte 😉

Låt den importera!

Om det inte fungerar kan det vara en god idé att ta en titt på my.ini för att ge mysql mer kraft.

Vanliga fel i cron

Ubuntu-logoOm det inte ser ut som att cron körs, läs /var/log/syslog och se om cron finns där.

Jag såg att cron sagt:
(CRON) info (No MTA installed, discarding output)

Detta gör att ditt skript inte körs på grund av att en mailserver inte är konfigurerad. Antingen konfigurerar man upp den eller så lägger man till MAILTO="" i crontab -e. 

För att få output från ett skript som körs via cron skriver man något i stil med:
*/5 * * * * /path/to/script.sh > /path/to/logfile.log 2>&1

Testa cronjob tycker jag går snabbast på det här sättet (tar gärna emot förslag på en förbättrad metodik):

  1. date för att se serverns klocka. 
  2. crontab -e
  3. kopiera jobbet du vill köra till en ny rad. Skriv in serverns klockslag men lägg på 1 eller två minuter. 57 9 * * * /scriptet.sh exempelvis. Spara crontab.
  4. date igen för att se om cronjobbet borde ha körts. 
  5. Öppna /var/log/syslog och se om cronjobbet körts utan problem. Öppna också loggfilen till det specifika skriptet. tail -f /var/log/loggfil fungerar helt ok.

Två till saker att tänka på om crontabs. 

  1. Den kör med begränsade miljövariabler. Skriv alltid hela sökägen till allt!
  2. Avsluta alltid med en tom rad längst ner. Cronjobs kan annars ignorera jobbet.

S3 Bucket och EC2 + enkel backup av mysql

Till dem som vill mounta en S3 bcuket till en EC2. Jag kör ubuntu men det borde fungera andra system också s3cmd är ett verktyg som är väldigt bra när man arbetar med S3 Bucket. Installera och konfigurera:

sudo apt-get install s3cmd

s3cmd --configure
Skriv in access key id och secret access key från AWS. Följ instruktionerna i installationen.

Om allt fungerar kan du lista och skapa buckets. Se instruktioner på http://s3tools.org/s3cmd

#Skript för att göra backup av mysql är ganska enkelt:
/usr/bin/mysqldump -u root -LÖSENORD' DATABAS> /home/ubuntu/backup/DATABAS.sql

#zippa med:
zip /home/ubuntu/backup/DATABAS_`date +%F`.zip /home/ubuntu/backup/*

#Ladda upp till s3:
/usr/bin/s3cmd put /home/ubuntu/backup/DATABAS_`date +%F`.zip s3://BUCKET/DATABAS_`date +%F`.zip

#Rensa bort filerna.
rm -rf /home/ubuntu/backup/*

 

Lägg i skriptfil och kör med cron. Lätt som en plätt. Nedan är min skriptfil som jag brukar använda som mall:

 

#!/bin/bash

DATABASE_USER=''

DATABASE_PASS=''

DATABASE_1=''

DATABASE_2=''

DATESTR=`date +%Y-%m-%d_%H%M%S`

BUCKET_NAME=''

 

/usr/bin/mysqldump -u $DATABASE_USER -p$DATABASE_PASS $DATABASE_1 > /home/ubuntu/backup/$DATABASE_1.sql

/usr/bin/mysqldump -u $DATABASE_USER -p$DATABASE_PASS $DATABASE_2 > /home/ubuntu/backup/$DATABASE_2.sql

zip /home/ubuntu/backup/$DATABASE_1-and-$DATABASE_2-$DATESTR.zip /home/ubuntu/backup/*

/usr/bin/s3cmd put /home/ubuntu/backup/$DATABASE_1-and-$DATABASE_2-$DATESTR.zip s3://$BUCKET_NAME/$DATABASE_1-and-$DATABASE_2-$DATESTR.zip

rm -rf /home/ubuntu/backup/*

 

För att lägga denna i cron varje natt:
#crontab -e (sudo innan för att köra alla crons som root)

0 0 * * * bash /usr/local/bin/SKRIPTET.sh > /var/log/SCRIPTET_cron.log 2>&1

"> /var/log/SCRIPTET_cron.log 2>&1" är för att logga allt till en egen fil. Mycket användbart!

 

Broken pipe error:
Fick detta och förstod inte vad det var. Testade att använda US istället för Ireland på serverplacering och då fungerade det.