Setting CiviCRM Buildkit to use for running Unit Tests in extension development

In this blog I will describe what I done so setup my local environment to run CiviCRM Buildkit for running unit tests in extension development.

Locally I run Arch Linux so some commands might be different on your machine.

First I download CiviCRM Buildkit to a local directory:

# first install all the required packages:
[jaap ~]$ sudo pacman -S npm nodejs #Pacman is the acrh linux command for apt-get
[jaap ~]$ cd /home/jaap
[jaap ~]$ mkdir bin
[jaap ~]$ cd bin
[jaap ~]$ git clone https://github.com/civicrm/civicrm-buildkit.git
[jaap ~]$ cd civicrm-buildkit
# This will download all tools needed to run Civicrm Buildkit
[jaap ~]$ ./bin/civi-download-tools 

# In my case I had to install/update nodejs
[jaap ~]$ npm update
[jaap ~]$ npm install fs-extra

Now I am ready to run AMP Config

[jaap ~]$ cd bin/civicrm-buildkit
[jaap ~]$ amp config
Enter db_type: mysql_dsn
Enter dsn> mysql://root:pass@localhost:3306 #my mysql dsn 
Enter perm_type: [0] "None"
Enter hosts_type: none
Enter httpd_type: none

Now I need to update my httpd config:

[jaap ~]$ sudo vim /etc/httpd/conf/httpd.conf #this is my appache config
# At the following line at the bottom of the file
Include /home/jaap/.amp/apache.d/*.conf #change this to your personal directory
#Restart apache
[jaap ~]$ sudo systemctl stop httpd
[jaap ~]$ sudo systemctl start httpd
# I have linked the build directory to my /var/www directory
[jaap ~]$ cd bin/civicrm-buildkit/
[jaap ~]$ rm -rf build
[jaap ~]$ ln -s /var/www build

Now test whether AMP is working:

[jaap ~]$ cd bin/civicrm-buildkit
[jaap ~]$ amp test

When AMP test did run without any errors you should add your civicrm-buildkit directory to your path

[jaap ~]$ vim .bashrc
# At the bottom of the file add the following line:
export PATH="$PATH:/home/jaap/bin/civicrm-buildkit/bin"

Now log out and restart after restarting you are ready to run Buildkit to deploy a site.

[jaap ~]$ cd bin/civicrm-buildkit/build
# Create a new site a new site in my /var/www will automaticly be linked to name.local.com in your situation that could differ.
[jaap ~] civibuild create dmaster --type "drupal-clean" --civi-ver "master" --url "http://dmaster.local.com" --admin-pass "admin1234"

Create an extension with a unit test in dmaster:

[jaap ~]$ cd /home/jaap/bin/civicrm-buildkit/build/dmaster/sites/all/modules/civicrm/tools/extensions
[jaap ~]$ civix generate:module org.civicoop.yourmodule
[jaap ~]$ cd org.civicoop.yourmodule
[jaap ~]$ civix generate:test CRM_Yourmodule_TestClassForTestingSomethingUseful

# Now run your test
[jaap ~]$ phpunit4 tests/phpunit/CRM/Yourmodule/TestClassForTestingSomethingUser.php

Links

* https://github.com/civicrm/civicrm-buildkit/blob/master/doc/download-update.md
* https://buildkit.civicrm.org/#/welcome
* https://civicrm.org/blog/totten/developers-extension-testapalooza
* https://phpunit.de/manual/current/en/appendixes.assertions.html

Use the delay mechanism to set the activity date in CiviRules

In this blog I will explain how to use the delay mechanism in CiviRules to set date field. In this example we will set the activity date in the action Add Activity. So that we can schedule an activity which should occur at the 3rd tuesday of the month.

CiviRules already has a delay mechanism to delay actions to a point in the future. But not that will specifically delay the action and nothing will be visible till the date the action should be executed.

The code in this blog could be used to set a contribution date in the future, or to set an end date of a membership or any other date field.

I am going to add the delay mechanism to an action to use it to set a certain date. I am also going to add the delay mechanism to the form where the user can enter the parameters for an action.

The first step we are going to do is to add a field for the Activity Date Time. We will call this field activity_date.

buildQuickForm()

The first step is to add the neccessary code to the buildForm of our action.

// CRM/CivirulesActions/Activity/Form/Activity.php

class CRM_CivirulesActions_Activity_Form_Activity extends CRM_CivirulesActions_Form_Form {

  public function buildQuickForm() {
    ....
    $delayList = array('' => ts(' - Do not set an activity date - ')) + CRM_Civirules_Delay_Factory::getOptionList();
    $this->add('select', 'activity_date', ts('Set activity date'), $delayList);
    foreach(CRM_Civirules_Delay_Factory::getAllDelayClasses() as $delay_class) {
      $delay_class->addElements($this, 'activity_date');
    }
    $this->assign('delayClasses', CRM_Civirules_Delay_Factory::getAllDelayClasses());
  }

The code above first retrieves a list with all the classes which could handle delays. Then for each classes it will make sure that the elements are added by the form. Then the list with classes is assigned to the template.

The line “$delayClass->addElements($this, ‘activity_date’); will allow the delay classes to add elements to the form. The second parameter is the prefix for each element name on the form. This prefix is used through the rest of the code to retrieve the data.

The template

After the elements are added to the form we should tweak our template to include the elements.

// templates/CRM/CivirulesActions/Activity/Form/Activity.tpl
...
<h3>{$ruleActionHeader}</h3>
<div class="crm-block crm-form-block crm-civirule-rule_action-block-activity">
...
 
 <div class="crm-section">
   <div class="label">{$form.activity_date.label}</div>
   <div class="content">{$form.activity_date.html}</div>
   <div class="clear"></div>
 </div>
 {foreach from=$delayClasses item=delayClass}
   <div class="crm-section crm-activity_date-class" id="{$delayClass->getName()}">
   <div class="label"></div>
   <div class="content"><strong>{$delayClass->getDescription()}</strong></div>
   <div class="clear"></div>
   {include file=$delayClass->getTemplateFilename() delayPrefix='activity_date'}
   </div>
 {/foreach}

...
</div>
<div class="crm-submit-buttons">
 {include file="CRM/common/formButtons.tpl" location="bottom"}
</div>

{literal}
 <script type="text/javascript">
 cj(function() {
 cj('select#activity_date').change(triggerDelayChange);

 triggerDelayChange();
 });

 function triggerDelayChange() {
 cj('.crm-activity_date-class').css('display', 'none');
 var val = cj('#activity_date').val();
 if (val) {
 cj('#'+val).css('display', 'block');
 }
 }
 </script>
{/literal}

The template consists first of displaying the activity_date select. After that the template for each delayClass is included and the prefix for the field names is also passed to the template.

The second part of the template is javascript to hide all the elements and only show the needed elements which is determined by the selected value in the activity_date select.

You can now see your form in action. There is no validation and saving yet.

Validation of the form

After creating the form and displaying the elements in the template it is time to validate whether the form is valid when it is submitted. We need to add our own formRule which then calls the validate function in the selected delay option (which done by the user by selecting an option for the Activity Date).

// CRM/CivirulesActions/Activity/Form/Activity.php

...

public function addRules() {
 parent::addRules();
 $this->addFormRule(array(
 'CRM_CivirulesActions_Activity_Form_Activity',
 'validateActivityDate'
 ));
}

static function validateActivityDate($fields) {
 $errors = array();
 if (!empty($fields['activity_date'])) {
 $activityDateClass = CRM_Civirules_Delay_Factory::getDelayClassByName($fields['activity_date']);
 $activityDateClass->validate($fields, $errors, 'activity_date');
 }

 if (count($errors)) {
   return $errors;
 }

 return TRUE;
}
...

The code above first adds the validateActivityDate function to the form as a validation rule. The validation function itself will get the class for the selected delay option and then pass the actual validation to the selected delay class. This is done by the line $activityDateClass->validate($fields, $errors, ‘activity_date’);  The last parameter is the prefix for the field names.

Saving the selected the activity date options

Now it is time to make sure the selected options are being saved with the rule. We do that in the postProcess function of the form. How you want to store the selected date for the activity date is up to you but in this example we are storing the selected option by serializing the delayClass.

// CRM/CivirulesActions/Activity/Form/Activity.php

public function postProcess() {
  ...
  $data['activity_date'] = 'null';
 if (!empty($this->_submitValues['activity_date'])) {
 $scheduledDateClass = CRM_Civirules_Delay_Factory::getDelayClassByName($this->_submitValues['activity_date']);
 $scheduledDateClass->setValues($this->_submitValues, 'activity_date');
 $data['activity_date'] = serialize($scheduledDateClass);
 }
 ...
 $this->ruleAction->action_params = serialize($data);
 ...
}

Setting the defaults

When the user edits the civirule the saved options should appear as selected in the form. This is done by setting the default values in the form.

// CRM/CivirulesActions/Activity/Form/Activity.php

public function setDefaultValues() {
...

foreach(CRM_Civirules_Delay_Factory::getAllDelayClasses() as $delay_class) {
   $delay_class->setDefaultValues($defaultValues, 'activity_date');
 }
 $activityDateClass = unserialize($data['activity_date']);
 if ($activityDateClass) {
   $defaults['activity_date'] = get_class($activityDateClass);
   foreach($activityDateClass->getValues('activity_date') as $key => $val) {
     $defaults[$key] = $val;
   }
 }
 ...
return $defaults;
}

Show a user friendly description of the selected activity date

The code below will show to the user which activity date is selected.

// CRM/CivirulesActions/Activity/Add.php
class CRM_CivirulesActions_Activity_Add extends CRM_CivirulesActions_Generic_Api {
...

public function userFriendlyConditionParams() {
  $return = '';
  ...
  if (!empty($params['activity_date'])) {
    $delayClass = unserialize(($params['activity_date']));
    if ($delayClass instanceof CRM_Civirules_Delay_Delay) {
      $return .= '<br>'.ts('Activity date time').': '.$delayClass->getDelayExplanation();
    }
 }

 return $return;

When the action is executed the the parameter for activity_date_time

The last step consists of setting the activity_date_time parameter in the action for creating an activity.

// CRM/CivirulesActions/Activity/Add.php
class CRM_CivirulesActions_Activity_Add extends CRM_CivirulesActions_Generic_Api {
...

protected function alterApiParameters($params, CRM_Civirules_TriggerData_TriggerData $triggerData) {
 $action_params = $this->getActionParameters();
 ...
  if (!empty($action_params['activity_date'])) {
   $delayClass = unserialize(($action_params['activity_date_time']));
   if ($delayClass instanceof CRM_Civirules_Delay_Delay) {
     $activityDate = $delayClass->delayTo(new DateTime(), $triggerData);
    if ($activityDate instanceof DateTime) {
      $params['activity_date_time'] = $activityDate->format('Ymd His');
   }
  }
 }

 return $params;
}

That is all what was needed to add the delay mechanism to the Add Activity Action.

Installing Pentaho 6.1 Community Edition on Ubuntu

In this tutorial I will explain what I did to install Pentaho 6.1 business analytics platform on an Ubuntu server.

I will also explain what I did to install Pentaho Data Integration, Pentaho Schema Workbench and Pentaho Report Designer on an Ubuntu Desktop.

For this tutorial I wanted to use my CiviCRM database as the source for reporting and analytics and I will use a seperate mysql database for the data warehouse. The Civicrm database is called civicrm  and the data warehouse database is called datawarehouse

I will use JNDI to connect to both databases.

Pentaho Business Analytics Server (or BI-Server)

Before we start make sure you have an ubuntu server up and running.

First install mysql database server, java, and the zip utility.

On the server enter the following command:

# sudo apt-get install mysql-server zip openjdk-8-jre openjdk-8-jdk libmysql-java

This will install all the required prerequisites.

Now it is time to download the BI-Server. You can download it from http://sourceforge.net/projects/pentaho/files/Business%20Intelligence%20Server/6.1/biserver-ce-6.1.0.1-196.zip/download

After the file is downloaded unzip it.

# unzip biserver-ce-6.1.0.1-196.zip

After you have unzipped it it is time to setup a mysql database for de BI Server and to set the connection for the mysql server.

I have followed the guideline from this blog: https://interestingittips.wordpress.com/2011/05/05/complete-pentaho-installation-on-ubuntu-part-2/

Enter the following commands to install the mysql databases.

# mysql --user root -p < /your/path/to/biserver-ce/data/mysql5/create_repository_mysql.sql
# mysql --user root -p < /your/path/to/biserver-ce/data/mysql5/create_quartz_mysql.sql
# mysql --user root -p < /your/path/to/biserver-ce/data/mysql5/create_jcr_mysql.sql

Now it is time to configure the BI-server to use those databases.

Open /your/path/to/biserver-ce/tomcat/webapps/pentaho/META-INF/context.xml and change the lines to match your mysql user and password also change it to use the mysql JDBC driver.

<?xml version="1.0" encoding="UTF-8"?> <Context path="/pentaho" docbase="webapps/pentaho/">
    <Resource name="jdbc/Hibernate" auth="Container" type="javax.sql.DataSource"
        factory="org.apache.commons.dbcp.BasicDataSourceFactory" maxActive="20" maxIdle="5"
        maxWait="10000" username="hibuser" password="password"
        driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/hibernate"
        validationQuery="select 1" /> 

    <Resource name="jdbc/Quartz" auth="Container" type="javax.sql.DataSource"
        factory="org.apache.commons.dbcp.BasicDataSourceFactory" maxActive="20" maxIdle="5"
        maxWait="10000" username="pentaho_user" password="password"
        driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/quartz"
        validationQuery="select 1"/>
</Context>

Make sure the hibernate component will use mysql. Do this by editing the file /your/path/to/biserver-ce/pentaho-solutions/system/hibernate/hibernate-settings.xml and change it to:

<config-file>system/hibernate/mysql5.hibernate.cfg.xml</config-file>

Edit the file /your/path/to/biserver-ce/pentaho-solutions/system/hibernate/mysql5.hibernate.cfg.xml

<!--  MySQL Configuration -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<property name="connection.username">hibuser</property>
<property name="connection.password">password</property>
<property name="connection.pool_size">10</property>
<property name="show_sql">false</property>
<property name="hibernate.jdbc.use_streams_for_binary">true</property>
<!-- replaces DefinitionVersionManager -->

Edit the file /your/path/to/biserver-ce/pentaho-solutions/system/applicationContext-spring-security-hibernate.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/hibernate
jdbc.username=hibuser
jdbc.password=password
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

Edit the file /your/path/to/biserver-ce/pentaho-solutions/system/applicationContext-spring-security-jdbc.xml

<!--  This is only for MySQL. Please update this section for any other database you are using -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/hibernate" />
<property name="username" value="hibuser" />
<property name="password" value="password" />
</bean>

Modify the JNDI file by editing /your/path/to/biserver-ce/pentaho-solutions/system/simple-jndi/jdbc.properties

Hibernate/type=javax.sql.DataSource
Hibernate/driver=com.mysql.jdbc.Driver
Hibernate/url=jdbc:mysql://localhost:3306/hibernate
Hibernate/user=hibuser
Hibernate/password=password
Quartz/type=javax.sql.DataSource
Quartz/driver=com.mysql.jdbc.Driver
Quartz/url=jdbc:mysql://localhost:3306/quartz
Quartz/user=pentaho_user
Quartz/password=password

Add the mysql connector to the lib folder by making a symlink:

# ln -s /usr/share/java/mysql-connector-java.jar /your/path/to/biserver-ce/tomcat/lib/mysql-connector-java.jar

Edit the file /your/path/to/biserver-ce/tomcat/webapps/pentaho/WEB-INF/web.xml to prevent HSQLDB to start. Remove or make a comment from the lines below.

....

<!-- [BEGIN HSQLDB DATABASES]
<context-param> <param-name>hsqldb-databases</param-name> <param-value>sampledata@../../data/hsqldb/sampledata,hibernate@../../data/hsqldb/hibernate,quartz@../../data/hsqldb/quartz</param-value> </context-param>
[END HSQLDB DATABASES] -->

...


<!-- [BEGIN HSQLDB STARTER]
<listener> <listener-class>org.pentaho.platform.web.http.context.HsqldbStartupListener</listener-class> </listener>
[END HSQLDB STARTER] -->

...

That is it you are now ready to start pentaho.

# /your/path/to/biserver-ce/start-pentaho.sh

You can now access pentaho in your browser at http://your.server.name:8080

Install PDI on Ubuntu Desktok

Install the Java Runtime environment

sudo apt-get install openjdk-8-jre

Install the Java Development Kit

sudo apt-get install openjdk-8-jdk

After that run the following commands to check whether the installtion is correct:

# which java
/usr/bin/java
# java -version
openjdk version "1.8.0_91" 
...

Download PDI from [[http://sourceforge.net/projects/pentaho/files/Data%20Integration/6.1/pdi-ce-6.1.0.1-196.zip/download]]
After downloading install unzip

# sudo apt-get install unzip

After installing unzip extract the zip

# unzip pdi-ce-6.1.0.1-196.zip
# cd data-integration
# ./spoon.sh

 Install JDBC Driver

See [[http://stackoverflow.com/a/32873938/3853493]] for more information on how to install the mysql JDBC connector

# sudo apt-get install libmysql-java

This should install a file called mysql-connector-java in /usr/share/java

Now we need to create a symlink to this file in the data integration folder.

# ln -s /usr/share/java/mysql-connector-java.jar /your/path/to/data-integration/lib/mysql-connector-java.jar

Configure PDI to use JNDI

Open the file /your/path/to/data-integration/simple-jndi/jdbc.properties in an editor and add the following lines (settings are copied from above).  In the file below we define two connections one to the civicrm database (which is a data source) and one to the datawarehouse.

civicrm/type=javax.sql.DataSource
civicrm/driver=com.mysql.jdbc.Driver
civicrm/user=user
civicrm/password=*
civicrm/url=jdbc:mysql://your.civicrm.server:3306/civicrm
datawarehouse/type=javax.sql.DataSource
datawarehouse/driver=com.mysql.jdbc.Driver
datawarehouse/user=pentaho
datawarehouse/password=*
datawarehouse/url=jdbc:mysql://your.pentaho.mysql.server:3306/datawarehouse

Install Pentaho Schema Workbench on Ubuntu Desktop

Download schema workbench from [[http://sourceforge.net/projects/mondrian/files/schema%20workbench/3.12.0/psw-ce-3.12.0.1-196.zip/download]]

Unzip the file

# unzip psw-ce-3.12.0.1-196.zip

Install the JDBC driver. See instructions from above for JDBC on Ubuntu for PDI.

# ln -s /usr/share/java/mysql-connector-java.jar /your/path/to/schema-workbench/drivers/mysql-connector-java.jar

Then start the workbench with

# /your.path/to/schema-workbench/workbench.sh

Install Pentaho Report Designer on Ubuntu Desktop

Download report designer from [[http://sourceforge.net/projects/pentaho/files/Report%20Designer/6.1/prd-ce-6.1.0.1-196.zip/download]]

Unzip the file

# unzip prd-ce-6.1.0.1-196.zip

Install the JDBC driver. See instructions from above for JDBC on Ubuntu for PDI.

# ln -s /usr/share/java/mysql-connector-java.jar /your/path/to/report-designer/lib/jdbc/mysql-connector-java.jar

Start report designer with the following command

# /your/path/to/report-designer/report-designer.sh

Setup JNDI for report designer

Open the file in /your/home/.pentaho/simple-jndi/default.properties and add the following lines:

civicrm/type=javax.sql.DataSource
civicrm/driver=com.mysql.jdbc.Driver
civicrm/user=user
civicrm/password=*
civicrm/url=jdbc:mysql://your.civicrm.server:3306/civicrm
datawarehouse/type=javax.sql.DataSource
datawarehouse/driver=com.mysql.jdbc.Driver
datewarehouse/user=pentaho
datawarehouse/password=*
datawarehouse/url=jdbc:mysql://your.pentaho.mysql.server:3306/datawarehouse

Regen, nat en vies

Wij zijn vies. Wij zijn nat. Het heeft vanochtend enorm geregend op Kos. En de afwatering was ook niet echt op orde. Zodat er op straat wel tot een halve meter water staat.

DSC_0464

En dan de vluchtelingen die in kleine tentjes bivakkeren op de kade. Dat is het laagste punt waar het water heen stroomt.

Hieronder een aantal foto’s van vanochtend.

Water uit de tent hozen
Water uit de tent hozen

 

De kade die blank staat
De kade die blank staat
In de regen in de rij voor een appel
In de regen in de rij voor een appel
Nogmaals de kade
Nogmaals de kade
Het park
Het park
Ingestorte tent
Ingestorte tent
Het park
Het park

De tocht van Turkije naar Kos in beeld

Onderstaande video laat zien hoe mensen vanuit Turkije de oversteek van 7km maken. Deze mensen hebben er zeven uur over gedaan. Wij staan iedere ochtend op de uitkijk en als we iets zoals dit zien waarschuwen we ook de kustwacht in de hoop dat die uitvaart en de mensen oppikt. Vaak duurt het dan nog langer dan een uur voordat de kustwacht echt in actie komt.

 

Gemoedelijk

Het is nu kwart over elf ’s avonds en ik ben terug in mijn hotel. Het is opnieuw een lange dag geweest maar dit keer anders dan gisteren. Gisteren was vooral een heftige en chaotische dag waarbij we van kwart over vijf ’s ochtends tot elf uur ’s avonds aan het rondrennen geweest zijn. Maar daarover een andere keer meer.

Vandaag was een dag waarbij alles op rolletjes liep en vanzelf ging. Heerlijk zo’n dag. Zittend op bed en terugdenkend aan vandaag voel ik mij voldaan en moe.

Zo denk ik bijvoorbeeld aan vanmiddag waarbij we een Duitse mevrouw geholpen hebben. Lees dit niet verkeerd die Duitse mevrouw was geen vluchteling maar een vrijwilliger die in haar eentje iedere dag broodjes uitdeelt aan vluchtelingen al 3 maanden lang.

Wij hebben haar geholpen om de chaos van het uitdelen iets te ordenen door alle vluchtelingen in een rij te laten staan. – Zoals wij dat gewend zijn bij alles wat we uitdelen. –

Het effect daarvan was dat de chaos en de stress van het uitdelen omgebogen is in rust en ontspannenheid.

Langs de kade en in het park staan allemaal tentjes. Ondanks alles wat de vluchtelingen meegemaakt hebben en nog moeten meemaken heerst er hier een gemoedelijke sfeer.

Gisteravond tijdens het uitdelen van het fruit en water raakte op een gegeven moment het fruit op terwijl er nog een behoorlijke lange rij stond. Ik legde dat aan ze uit en vertelde daarbij dat ik het jammer voor ze vond.

De vluchtelingen reageerden daar heel goed op. Ze kreeg ik regelmatig te horen dat het niet jammer was omdat ik er ook niks aan kon doen. Terwijl ik weet dat we met alle hulporganisaties op het eiland ongeveer 800 kcal. (per persoon) uitdelen. Terwijl dit eigenlijk 2000 kcal. moeten zijn. Kortom er heerst hier een tekort aan voedsel.

Een uur geleden begon het opeens keihard te regenen. En dus zijn we snel in de auto gestapt om poncho’s om uit te delen. Ondanks dat er een heel aantal tenten al nat van binnen zijn heerste er een soort feeststemming. Net alsof we met z’n allen op een festivalterrein staan. Er wordt veel gelachen en gekletst. Als je niet beter wist dan dacht je dat de vluchtelingen een plezierreisje hebben. Tegelijk is dat echt niet zo want je gaat niet voor je plezier ’s nachts in een rubberbootje de zee oversteken. Om vervolgens in de regen op Kos te gaan liggen.

Holy bread, appels en keeltabletten

DSC_0389Vanmorgen gingen we om zes uur naar het strand om op de uitkijk te gaan staan en zo nodig bootvluchtelingen aan land te helpen. We hebben inmiddels nachtkijkers, dat is ideaal. We speurden het de zee af, maar zagen geen bootjes. De zee was ook behoorlijk onrustig. Wellicht was dat de reden dat er weinig mensen aankwamen. We zagen wel een klein rood lichtpuntje in de verte, dat we niet konden plaatsen. We dachten even dat het een lampje van een zwemvest kon zijn, maar het bleef op dezelfde plek en ging niet mee met de stroming.Toen de zon eenmaal op was, reden we naar een ander punt op het eiland om daar te kijken of er bootjes aan kwamen. We zagen in de verte één bootje. Na een tijdje wachten en turen, kregen we in de gaten hoe ze vaarden en probeerden we zo dicht mogelijk bij de verwachte aankomstplek te komen met de bus vol spullen. Alles ging heel snel op dat moment. Je voelt toch wel een zekere opwinding dan. Gewapend met water en mueslirepen haastten we ons het strand op. Daar aangekomen bleek de kustwacht het bootje opgepikt te hebben en konden we zien dat de vluchtelingen aan boord van het schip stapten. Die waren in ieder geval veilig! We keken nog even goed of verder nog boodjes waren, maar die zagen we niet. Tijd om te gaan ontbijten.

Na het ontbijt zijn we aan de slag gegaan met het sorteren van kleding. Kleding voor mannen, vrouwen, kinderen en baby’s apart. Alle broeken bij elkaar, alle truien bij elkaar, enzovoorts. Er was/is veel gebrek aan warme vesten. We zijn dan ook erg blij met de twee koffers vol vesten die we in Nederland gekregen hebben en mee konden nemen. Hoewel dat in Nederland veel leek, lijkt het nu maar heel weinig. Na het kledingstorteren zijn we met elkaar bij Italiamo gaan zitten om even bij te komen. Dit Italiaanse restaurant zit naast het appartement van Stichting Bootvluchteling en is ook een beetje het stamcafé. Als je blogs van andere vrijwilligers hebt gelezen: dit is het restaurant dat vrijdag pizza’s heeft gebakken voor de vluchtelingen. Hier konden we lekker even bijkomen. Toen we even zaten met alle vrijwilligers en een blikje cola voor ons, kwam de eigenaar naar ons toe met een stukje brood, gewikkeld in een verkreukelde servert. “Wat moeten we daar nou mee?” dacht ik. “For you, it’s Holy Bread.” Een aantal vrijwilligers keek hem vragend aan. “Holy Bread, from church,” zei hij. Euh, was dit een soort avondmaal? Een stukje in servet gewikkeld brood, met cola? Maar ook wel onzettend lief van hem, dat hij aan ons dacht toen hij naar de kerk ging. Anke brak het brood voor ons. Vrouw in het ambt, ook dat nog. 😉 Toch herinnerde het ons er even aan dat het zondag is vandaag.

Om half twaalf gingen we naar de kade om water en appels uit te delen. Dat doen we elke dag. Om half zes staan we er weer en dan delen we water en bananen uit. Gisteren hebben we dat voor het eerst meegemaakt. Op het moment dat we aan komen rijden rennen de vluchtelingen al naar de plek waar we gaan uitdelen. Hier wordt een lange rij gevormd, zodat het uitdelen georganiseerd verloopt. Vrouwen en kinderen gaan voor. Gisteravond viel het me op hoe ontzettend snel en efficiënt dit allemaal ging. En ik heb me echt even afgevraagd, hoe ik ervoor kan zorgen dat ik dit niet als een robot doe. Dus ik kijk iedereen even in de ogen en zeg iets als ‘hello’, ‘goodmorning’ of ‘how are you?’. De mensen zijn echt blij met hun appel of banaan en flesje water. Het is tegelijk ook goed opletten, want er zijn altijd jonge mannen die proberen om iets te krijgen terwijl ze niet in de rij staan of die proberen voor de tweede keer wat te krijgen. Een vrijwilliger gaat daarom achteraan de rij staan. Een andere vrijwilliger gaat het een klein stukje van voren staan, zodat niet iedereen tegelijk naar voren stormt. Je moet streng zijn, maar eigelijk is het altijd wel op te lossen met een lach. In de trant van ‘Jammer joh. We hebben je door. Ik zou het ook geprobeerd hebben, maar we trappen er toch niet in.’

DSC_0395

Hierna hebben we, terwijl de andere vrijwilligers gewoon even een praatje gingen maken, met twee vrijwilligers wat kleine medische dingen gedaan. Het gaat dan om huis, tuin en keuken dingetjes, zoals paracetamol geven aan mensen met hoofdpijn, kleine wondjes ontsmetten met betadine, keeltabletten uitdelen en vooral aandacht geven. We hebben geen medische achtergrond, dus als er mensen zijn met wat ernstigere klachten verwijzen we hen door naar artsen zonder grenzen of zo nodig het ziekenhuis. Artsen zonder grenzen is er alleen niet op zondag, dus het was nogal druk op ons ‘spreekuur’. De mensen bleven maar komen. En ook hier weer grote dankbaarheid. Eén iemand wilde zelfs met mij op de foto, hoewel ik alleen maar een schoon verbandje om zijn knie had gedaan. Er kwam ook iemand met enorme jeuk, zijn beide armen zaten vol muggenbulten. Gelukkig hadden we daar ook een zalfje voor. Een paar kleine meisjes die ook zulke muggenbulten hadden, kwamen ons later bloemen brengen die ze gepukt hadden. Die hebben we in ons haar gestoken. Verder kwam er een meneer met een dikke enkel. Hij hinkte en kon zijn schoen niet aan hebben. “It’s broken,” zei hij. Wellicht was het inderdaad gebroken. Het kan ook zijn dat het alleen verstuikt was. Maar ik zei dat hij even naar het ziekenhuis moest. Dat wilde meneer echter niet, want hij kon vanavond mee met de ferry naar Athene. Hij zei dat hij door wilde reizen naar Duitsland en daar wel naar de dokter zou gaan. Ik heb hem op het hart gebonden dat het echt nodig was, maar verder is het ook zijn eigen keuze. Ik heb hem maar paracetamol gegeven om de pijn te stillen. Dat ‘spreekuur’ heeft behoorlijk veel indruk op mij gemaakt. Ik kon zo weinig doen. De meeste mensen begrijpen nauwelijks Engels, dus je moet veel met gebaren communiceren. En ik heb in een grijs verleden een keer een EHBO curus gevolgd, maar dat diploma is allang verlopen. Tegelijk weet ik weet ik ook wel hoe het voelt om keelpijn te hebben en is het fijn als je dan paracetamol of een keeltablet kan nemen. Keelpijn komt veel voor bij de vluchtelingen. Wat wil je ook: natte kleren, op straat slapen in een dun tentje en ook nog eens veel stress, wat niet bepaald goed is voor je weerstand. Ik was echt moe na het ‘spreekuur’. Ik voelde me zo incapabel, terwijl de vluchtelingen enorm dankbaar waren en de stroom patiënten niet op leek te houden. Na een uur zijn we gewoon gestopt en gaan lunchen. Stoppen is altijd moeilijk. Of het nou met het uitdelen van fruit en water is of met het doen van ‘medische’ handelingen. Iedereen wil aandacht en ze volgen je nog tot de auto. En dan zijn er ook nog de toeristen die willen weten wat we doen en hoe ze kunnen helpen. Regelmatig krijgen we donaties van hen, in de vorm van geld of spullen.

Inmiddels is het weer tijd om te gaan. We moeten zo water en bananen uitdelen. En Jaap zegt dat hij keelpijn heeft. 😉

Groetjes, Harma

Een voorspoedige reis, my friend

Rond lunchtijd zijn we geland op Kos International Airport. Grote naam voor een klein vliegveldje. De reis ging voorspoedig. Vannacht om 3:00 uur stonden we op en na ontbijt, afwas en het inpakken van de laatste toiletspulletjes reden we richting Brussel. Bij de long term parking ontstond even wat stress, omdat het inrijden niet lukte. Uiteindelijk kwam er een mannetje kijken en konden we toch ons ticket scannen, waarna de slagboom open ging. Het inchecken van de bagage en de security controle verliep soepel. En zo kwam het dan we om 6:00 uur al lekker aan de koffie zaten. Jaap hoefde er geen croissant bij, maar at toch gretig het laatste deel van de mijne op. We hebben op heerlijke loungebanken zitten wachten tot het tijd werd om naar de gate te gaan. Daar konden we bijna meteen doorlopen het vliegtuig in. We bleken helemaal op de achterste rij te zitten. Bij het opstijgen was het nog donker, het begon net een beetje te schemeren. Toen we hoger in de lucht kwamen en de eerste wolkenlaag gepasseerd waren, zagen we een mooie roze gloed van de opkomende zon. Een prachtig gezicht zo boven de wolken. Vervolgens passeerden we een andere wolkenlaag en daarboven scheen de zon uitbundig. In één keer was het dag. Zo vredig om daar boven de wolken te vliegen. Ik moest denken aan een liedje dat ik op de kleuterschool geleerd heb: “Boven de wolken, boven de wolken, daar woont God de Heer. Hij zal voor je zorgen, nu en morgen, altijd weer. Altijd weer!” Hij zorgt voor ons, bij alle ellende die we wellicht zullen zien deze week. Ook het vliegen over de alpen was prachtig. Al die besneeuwde bergtoppen! Je kon zien hoe de wolken bleven hangen in het dal. En uiteindelijk kon je de rivieren volgen, die uitkwamen in de zee. We hebben nog een beetje gedut, aangezien we weinig slaap hadden gehad en zo ‘vloog’ de drie uur durende vlucht om.

Aangekomen op Kos hebben we een taxi genomen naar het hotel. Hoewel de chauffeur in een grote Mercedes reed, was het wel proppen met onze vier koffers. De chauffeur stapelde gewoon de hoogte in, waardoor de kofferklep niet meer dicht kon en deze met touw moest worden vast gemaakt. Toch grappig dat we de koffers wel in onze Opel Corsa kregen. (Oké, met de bank plat dan.) We werden netjes voor het hotel afgezet, waar we hartelijk ontvangen werden door moeder en zoon. Toen ze zagen hoeveel bagage we bij ons hadden, stelde moeder voor om ons morgen een grotere kamer te geven. Maar aangezien veel spullen voor Stichting Bootvluchteling zijn en we weinig zin hebben om te verkassen, hebben we dat aanbod afgeslagen. We kregen een welkomstdrankje en ondertussen allerlei uitleg over wat mooi was in Kos. We vertelden dat we hard aan de slag gaan voor Stichting Bootvluchteling en geen tijd hebben voor dat soort dingen, maar dat landde niet echt volgens mij. Dus we hebben maar beleefd geluisterd. We kregen een kaartje van ‘my friend’ de restauranteigenaar waar je lekker kunt dineren. En een kaartje van ‘my friend’ de lunchroomhouder voor als we ergens willen luchen. Toen we vervolgens vroegen waar we fietsen konden huren, kwam hij met ‘my friend’ de fiets- en brommerverhuurder op de proppen. Wel een echte vriend denk ik, want de fietsen van hem stonden voor het hotel. Ideaal! Hij belde even met zijn vriend om er een ‘special price’ voor ons van te maken. Hij noemde een bedrag aan Jaap: “for you, my friend”. Naast vrienden, neemt ook zijn moeder een belangrijke plaats in.Toen we zoonlief vertelden dat we het niet nodig vonden om van kamer te switchen zei hij dat hij dat door zou geven aan zijn moeder. Toen we vroegen wanneer we moesten betalen, bij aankomst of bij vertrek, zei hij dat hij dat aan zijn moeder zou vragen. Kortom, als je hem iets vraagt is de reactie ‘even aan mijn moeder vragen’. Voor de duidelijkheid: ik schat dat hij wel een jaar of veertig is. Maar hij zit dus nog dik onder de plak.

Op dit moment hebben we even de tijd om bij te komen van de reis. We hebben afgesproken om de andere vrijwilligers om half vijf lokale tijd (=half vier in NL) te ontmoeten. Ben benieuwd!

Bedankt!

Morgenochtend vroeg vertrekken Harma en ik naar Kos. Om daar voor een week te helpen om de vluchtelingen welkom te heten. Afgelopen dagen stonden dan voornamelijk in het teken van de voorbereidingen.

En in die voorbereidingen hebben we gemerkt dat er veel mensen om ons heen staan en ons steunen en op die manier ook de vluchtelingen.  Ik wil in deze blog met name een paar hoogtepunten vermelden.

Allereerst was er de PostNL pakketservice. We hadden een pakketje gemist wat dringend mee moest naar Kos. En die pas morgen opnieuw aangeboden zou worden. Dus gebeld met PostNL, de situatie uitgelegd. En wat blijkt opeens blijkt er iets mogelijk te zijn wat normaal niet mogelijk is. De postbode kwam ’s avonds nog speciaal voor ons terug. Huld aan PostNL!

Niet te vergeten de vliegmaatschappij die ons gratis extra bagage geeft! En wij dus nu met vier volle koffers op stap kunnen.

Waarmee zijn de koffers gevuld? Met vesten die we de afgelopen week ingezameld hebben. Wat een hoop vesten hebben we gekregen. We hebben ook nog wat medische spullen in de koffer die we op het laatste moment nog van de apotheek en van een thuiszorgorganisatie gekregen hebben. Ook hiervoor heel veel dank.

En niet te vergeten al die mensen die ons financieel gesteund hebben. Er zijn een hele hoop giften binnengekomen bij Stichting Bootvluchteling.

Wij kunnen nu gaan slapen en morgen vroeg opstaan en we zijn blij en dankbaar voor alles wat we gekregen hebben.

Geluk

DSC_0025

Afgelopen dagen was ik voor mijn werk in het mooie Engelse Peak District. Dat is een gebied welke intrek is bij wandelaars vanwege de mooie heuvels die er zijn. Nu bestond mijn werk eruit dat we met zo’n 20 man ons opsloten in een vakantiehuisje en ondertussen verbeteringen aan CiviCRM aanbrachten dat kon zijn door de documentatie bij te werken, dan wel bugs op te lossen, of een nieuwe module te ontwikkelen.

Lees verder Geluk