|
|
Daar komt de trein
Leven langs het spoor...
Tijdens onze reis zijn we op bezoek geweest bij de Stichting (Yayasan) Aulia (zie: www.aulia-kids.org of de Stichting Lestari).
Een fragment uit mijn reisdagboek:
In de auto wordt Lies (de directeur van Aulia) een beetje zenuwachtig en drukt ze ons op het hart om vooral op te passen en goed de aanwijzingen op te volgen. De volgende locatie is namelijk erg gevaarlijk. Gevaarlijk in twee opzichten. Ten eerste behoren de bewoners tot de armste mensen in Jakarta en zijn erg crimineel. Daarnaast is er iedere tien minuten nog een externe letterlijk dodelijke bron van gevaar.
Als we uitstappen zien we wat ze bedoelt. We lopen de spoorbaan op, op weg naar de mensen in de hutjes die letterlijk aan de rand van het spoor staan. De bewoners scharrelen op het spoor. Kinderen vliegeren tussen de hoogspanningsleidingen door. En dan begint de bel van de spoorwegovergang te klingelen. De bewoners en de kinderen rennen van het spoor hun huis in en doen hun raam en deur dicht. Waar moeten wij naartoe? Corine en de staf van de stichting gaan onder een afdak tussen twee huisjes staan. Ik ga naar de andere kant in het midden van de twee sporen staan tussen twee huisje op een lege plek.
Een grote personentrein dendert met 40-50 kilometer per uur voorbij. Ik steek mijn camera tussen een hutje en de trein in de hoop dat hij niet wordt geraakt door de mensen die uit de trein hangen. Dit is echt een van de meest bizarre ervaringen in mijn leven. Hebben wij in Nederland collectief last van het NIMBY-syndroom (not in my backyard)... Het leven voor de mensen op deze locatie is uitermate overzichtelijk: ze hoeven niet na te denken over het NIMBY-syndroom. De trein raast voor de voordeur en een achtertuin hebben ze niet. Jaarlijks komen diverse bewoners om het leven (in tegenstelling tot b.v. Mumbai, waar alleen al in die stad jaarlijks ruim 5000 mensen in en om de trein omkomen - en dan hebben we het niet over botsingen met auto's - houden ze hier geen statistieken bij). Je kunt je geen fout permitteren want de trein is dodelijk. Er hangen allemaal mensen uit de trein en voor je het weet, heb je een voet in je nek. Krankzinnig!
Ook op deze locatie bezoeken we enkele gezinnen. Dit zijn voornamelijk bedelaars. Ze zingen of zeulen met een baby - die je voor dat doel kunt huren in Jakarta: serieus er is een plein waar de baby's worden aangeboden - langs de auto's voor de stoplichten. Ik klim over een smalle trap omhoog om een kamertje van een moeder te bezoeken. Ze leeft hier met enkele kinderen. Voor een plek van nog geen twee bij twee meter betaalt ze 250.000 roepia per maand. Dat is omgerekend 22 euro... een godsvermogen voor mensen die amper meer dan een euro per dag verdienen. De stichting beperkt zich op deze locatie tot het monitoren van de kinderen en het stimuleren om ze naar school te sturen. Er is geen fysieke ruimte om een klaslokaal neer te zetten, dus informeel onderwijs is onmogelijk. Ook worden er geen microkredieten verstrekt omdat deze bewoners te onbetrouwbaar zijn. Lies zegt het diplomatieker... 'ze zijn tè arm', maar haar nonverbale communicatie zegt genoeg.
En dat ziet dat er dus zo uit...
En dan komt de trein
De ruimte tussen de trein en de huisjes
Als de trein weg is, lopen we weer verder
en gaat het normale leven ook weer door.
Afvalscheiders
Hier wonen dus mensen...
De kamer/slaapkamer/keuken/opberghok van 22 euro per maand. Hij leeft hier samen met zijn moeder (zij was ergens in de stad aan het bedelen).
En voor je er erg in hebt, komt de trein weer langs...
© Harold Makaske 30 januari 2006
/*
History:
v1.1
- add getTableList
v1.2
- use sql_table
- Added silent mode (configure via option) to support NP_MostViews
- Added Cleanup upon uninstall option
- Added "just number" minimalist mode
- Added supportsFeature
V1.2a
- Added min version support
V1.3
- Replaced doSkinVar with DoTemplateVar
V1.3a
- Added repeat views ignore function aka repeat F5s from those bored and lonely one
V1.3b
- Fixed counting off by 1 bug
V1.3c
- Added <%Views(skipCount)%> to allow skipping count when used in template (ie to not count on click in main page)
V1.4
- Fixed ignoe same IP count problem
V1.5
- Added views_log table and changed plugin performance to check for unique visits by IP address. [gRegor]
- Added option to set the length of time before re-counting hits from the same IP address (default: 2 hours) [gRegor]
V1.6
- Added plugin menu to display all view count, w/ counter reset function
- Delete view counter and log for deleted item
V1.7
- use sql_query
V1.8
- Admin page enhancement to preserve order and sort info
v1.9
- Added item title in admin menu
v1.9.1
- ignore draft in admin menu
*/
class NP_Views extends NucleusPlugin {
// Note: I never run this plugin on 2.0 and have no idea whether it
// wil work on <2.5. A user can simply chnage it to return
// '200' and see if it works (likely will). I will gladly
// change the min version to 2.0 and add the sql_table fix
// upon such report. 8)
function getMinNucleusVersion() {
return '250';
}
function getName() {
return 'Views';
}
function getAuthor() {
return 'Rodrigo Moraes | Edmond Hui (admun) | gRegor Morrill';
}
function getURL() {
return 'http://www.tipos.com.br';
}
function getVersion() {
return '1.9.1';
}
function getDescription() {
return 'This plugin counts how many times an entry has been displayed.';
}
function getEventList() {
return array('PostAddItem', 'QuickMenu', 'PostDeleteItem');
}
function supportsFeature($what) {
switch($what) {
case 'SqlTablePrefix':
return 1;
default:
return 0;
}
}
function getTableList() {
return array( sql_table('plugin_views'), sql_table('plugin_views_log') );
}
function install() {
sql_query('CREATE TABLE IF NOT EXISTS ' . sql_table('plugin_views') . ' (id int(11) NOT NULL default "0", views int(15) NOT NULL default "0")');
sql_query('CREATE TABLE IF NOT EXISTS ' . sql_table('plugin_views_log') . ' (id int(11) NOT NULL auto_increment, ip varchar(20) NOT NULL default "", itemid int(11) NOT NULL default "0", viewtime varchar(32) NOT NULL default "", PRIMARY KEY (id)
)');
$this->createOption('silent','Silent mode - No #Display shown in Item (still need to add the skinVar, for use with MostViewed)','yesno','no');
$this->createOption('deletetables','Delete this plugin\'s table and data when uninstalling?','yesno','yes');
$this->createOption('timespan', 'Hours to wait before re-counting visitors', 'text', '2');
}
function unInstall() {
if ($this->getOption('deletetables') == 'yes') {
sql_query('DROP TABLE ' . sql_table('plugin_views') );
sql_query('DROP TABLE ' . sql_table('plugin_views_log') );
}
}
function hasAdminArea() {
return 1;
}
/**
* Adds an entry to the 'Quick Menu' on the Nucleus administration pages.
* The entry will link to the commentcontrol admin page
*/
function event_QuickMenu(&$data) {
global $member;
if (!($member->isLoggedIn() && $member->isAdmin())) return;
array_push(
$data['options'],
array(
'title' => 'View Counts',
'url' => $this->getAdminURL(),
'tooltip' => 'See the view count of all items'
)
);
}
function doTemplateVar(&$item, $input) {
$itemid = $item->itemid;
$remote_ip = ServerVar('REMOTE_ADDR');
$timespan = $this->getOption('timespan') * 3600;
$now = time();
// get the current Views count
$query = "SELECT views FROM " . sql_table('plugin_views') . " WHERE id=" . $itemid;
$result = sql_query($query);
$row = mysql_fetch_object($result);
$views = intval($row->views);
// Only do count updates if "skipcount" is not set
if ($input != 'skipcount')
{
// This takes care of previous items
if (mysql_num_rows($result) == 0)
{
$query = "INSERT INTO " . sql_table('plugin_views') . " (id, views) VALUES('$itemid', '1')";
sql_query($query);
//$views = 0;
} // end if
// Check the views_log table to see if this IP has a viewtime for this item
$query = "SELECT viewtime FROM " . sql_table('plugin_views_log') . " WHERE ip='" . $remote_ip . "' AND itemid=" . $itemid;
$result = sql_query($query);
// No views from this IP in the past X hours, so update the Views count
if (mysql_num_rows($result) == 0)
{
$views++;
$this->_updateViewsCount($itemid, $views);
$this->_addViewsLog($itemid, $remote_ip, $now);
} // end if
else
{
$viewtime = mysql_result($result, 0, 'viewtime');
// It's been longer than X hours, so recount
if (($now - $timespan) > $viewtime)
{
$views++;
$this->_updateViewsCount($itemid, $views);
$this->_updateViewsLog($itemid, $remote_ip, $now);
}
} // end else
} // end if
// Clear logs that are more than X hours old
$time = $now - $timespan;
$query = "DELETE FROM " . sql_table('plugin_views_log') . " WHERE (viewtime < $time)";
sql_query($query);
if ($this->getOption('silent') == 'no') {
echo $views;
} // end if
}
function event_PostAddItem($data) {
$itemid = $data['itemid'];
$query = "INSERT INTO " . sql_table('plugin_views') . " (id, views) VALUES('$itemid', '0')";
sql_query($query);
}
function event_PostDeleteItem($data) {
$itemid = $data['itemid'];
$query = "DELETE FROM " . sql_table('plugin_views') . " WHERE id=". $itemid;
sql_query($query);
$query = "DELETE FROM " . sql_table('plugin_views_log') . " WHERE itemid=". $itemid;
sql_query($query);
}
function _updateViewsCount($itemid, $views) {
// update the Views table with the new count
$query = "UPDATE " . sql_table('plugin_views') . " SET views='$views' WHERE id=$itemid";
sql_query($query);
}
function _addViewsLog($itemid, $ip, $time) {
// add IP and itemid to views_log table so it won't be recounted for X hours
$query = "INSERT INTO " . sql_table('plugin_views_log') . " (ip, itemid, viewtime) VALUES ('$ip', '$itemid', '$time')";
sql_query($query);
}
function _updateViewsLog($itemid, $ip, $time) {
// update the views_log viewtime so it won't be recounted for X hours
$query = "UPDATE " . sql_table('plugin_views_log') . " SET viewtime='$time' WHERE ip='$ip'";
sql_query($query);
}
function doAction($actionType) {
global $CONF, $member;
if (!($member->isLoggedIn() && $member->isAdmin())) return 'Sorry. not allowed';
if ($actionType == 'resetview'){
$id = requestVar('id');
$query = "UPDATE " . sql_table('plugin_views') . " SET views=0 WHERE id=$id";
sql_query($query);
} else if ($actionType == 'resetallview') {
$query = "UPDATE " . sql_table('plugin_views') . " SET views=0";
sql_query($query);
}
$order = requestVar('order');
$sort = requestVar('sort');
header('Location: ' . $CONF['PluginURL'] . 'views/index.php?sort=' . $sort . '&order='.$order);
}
}
?>
-
Hoofdstuk: 3. Reportages
|