iTopiaBlog

liVe iN oRder tO lEArN
Apr
15

Gunther Wegner beim Venezuela TagIst Venezuela auch euer Traumziel? Holt euch Venezuela doch einfach zu euch nach Hause.

Nehmt am neuen Venezuela-Chat teil, der ab sofort mit dem Venezuela-Experten Gunther Wegner startet. 14 Tage wird er euch alle Fragen rund um Venezuela, sein Buch “Mit dem Rucksack durch Venezuela” und rund um seine Person beantworten. Wir wünschen euch jetzt schon viel Spaß beim Löchern.

Hierzu ist eine Veranstaltung bei facebook eingerichtet worden, in der ihr ab sofort Fragen posten könnt, die von dem Spezialisten täglich beantwortet werden.

Gunther Wegner ist durch seine vielen Reisen ein ausgewiesener Südamerikaexperte mit dem Schwerpunkt Venezuela. Auf seiner Homepage www.gwegner.de könnt ihr viele Fotos und Reiseberichte rund um Südamerika finden. Er präsentiert sehr erfolgreich Reisevorträge und hat neben Venezuela auch Publikationen über den Amazonas und Brasilien veröffentlicht. Er wird die Fragen nicht nur rein sachlich beantworten, vielmehr ist er der Typ, der euch dieses unbeschreiblich vielfältige Land durch persönliche Anekdoten und Insiderinformationen näherbringen wird.

Gunther war in diesem Jahr u.a. im Februar bei einem stimmungsvollen Venezuela Tag in Berlin eingeladen und hat hier “sein” Land in einem vielfältigen und sehr interessanten Vortrag präsentiert. Er zog mit vielen erheiternden Anekdoten sowie wunderschönen Bildern alle Gäste in seinen Bann. Der höchste Wasserfall der Welt, traumhafte Karibikstrände und die majestätischen Tafelberge waren nur einige der Highlights seiner spannenden Präsentation.

Venezolanische Karibikküste

Mehr Informationen findet Ihr hier:

Apr
14

Hi Volks,

today I had a lot of testing with the symfony criteria object. And everyone who knows about the problem to get the raw SQL query out of the criteria object.

There is a toString method, but the result just looks like this:

SELECT FROM media, media_category WHERE media.FEATURED=? AND media.MEDIATYPE IN (?,?) AND 1=1 AND media_category.CID NOT IN (?,?,?,?) AND media.MID=media_category.MID GROUP BY media.MID
Parameters to replace: array (
0 =>
array (
'table' => 'media',
'column' => 'FEATURED',
'value' => true,
),
1 =>
array (
'table' => 'media',
'column' => 'MEDIATYPE',
'value' => 'video',
),
2 =>
array (
'table' => 'media',
'column' => 'MEDIATYPE',
'value' => 'audio',
),
3 =>
array (
'table' => 'media_category',
'column' => 'CID',
'value' => 10,
),
4 =>
array (
'table' => 'media_category',
'column' => 'CID',
'value' => 9,
),
5 =>
array (
'table' => 'media_category',
'column' => 'CID',
'value' => 4,
),
6 =>
array (
'table' => 'media_category',
'column' => 'CID',
'value' => 7,
)
)

And it is very strange to fill the question marks by hand with the related values from the parameters array.

So I wrote a function which does this for me:


function getCriteriaSQL($c, $select = '*')
{
$params = array();
$r = BasePeer::createSelectSql($c, $params);
$o = str_replace('?', '%s', $r);

$ggg = array();
foreach($params AS $e)
{
if(is_integer($e['value']) OR is_bool($e['value']))
{
$ggg[] = $e['value'];
}
else
{
$ggg[] = "'".$e['value']."'";
}
}

$sql = vsprintf($o, $ggg);

$sql = str_replace('SELECT ', 'SELECT '.$select, $sql);

return $sql;
}

I just wanted to share this with you and I appreciate your comments.

Oct
29

I was searching long time for a good auto completer widget, but I couldn’t find one. So I created it by my self.
I did the same with the build in symfony auto completer widget. When I have time I’ll post it, too.
I hope I could help someboby with this small tutorial. Please give me feedback if there are any questions or suggestions.

Now lets start:

1. Copy the dojo package to the js folder
Resulting path to dojo.js: web/js/dojoToolkit/dojo/dojo.js

2. Enable dojo.js
If not yet happend elsewhere:
Modify the view.yml: apps/[YOUR_APP]/config/view.yml

default:
javascripts: [dojoToolkit/dojo/dojo.js]

3. Create the widget
lib/widget/itWidgetFormInputTextDijitAutocomplete.php

class itWidgetFormInputTextDijitAutocomplete extends sfWidgetForm
{
/**
* Constructor.
*
* Available options:
*
* * model: Name of the Model
* * searchfield: Table field in which will be searched
* * action: Optional: request action or url
* * value_method: Optional: getter for form field value
* * output_method: Optional: getter for form field name
* * criteria_method: Optional: getter for additional cirteria
* * add_empty: Optional: add emtpy value option to the list
* * choices: An array of possible choices (n/a)
* * formatter: A callable to call to format the checkbox choices
*
* @see sfWidgetForm
*/
protected function configure($options = array(), $attributes = array())
{
$this->addRequiredOption('model');
$this->addRequiredOption('search_field');
$this->addOption('action', 'default/ajaxAutocomplete');
$this->addOption('value_method', 'getPrimaryKey');
$this->addOption('output_method', 'getPrimaryKey');
$this->addOption('choices', array());
$this->addOption('criteria_method', '');
$this->addOption('formatter', array($this, 'formatter'));
$this->addOption('add_empty', false);
}

/**
* Renders the widget as HTML.
*
* @param string The name of the HTML widget
* @param mixed The value of the widget
* @param array An array of HTML attributes
* @param array An array of errors
*
* @return string A HTML representation of the widget
*
* @see sfWidgetForm
*/
public function render($name, $value = null, $attributes = array(), $errors = array())
{
$choices = $this->getOption('choices');
if ($choices instanceof sfCallable)
{
$choices = $choices->call();
}

$baseAttributes = array(
'action' => $this->getOption('action'),
'name' => $name,
'type' => 'text',
'value' => $value,
'id' => $id = $this->generateId($name, self::escapeOnce($name)),
);

return call_user_func($this->getOption('formatter'), $this, $baseAttributes);
}

/**
* Renders the input fields as HTML.
*
* @param widget
* @param attributes
*
* @return string A HTML representation of the input fields
*/
public function formatter($widget, $attributes)
{
sfLoader::loadHelpers(array('Form', 'Url'));
$request = sfContext::getInstance()->getRequest();
$field_id = $attributes['id'];
$field_name = $attributes['name'];
$ajax_field_id = 'ajax_'.$attributes['id'];
$out_field_id = 'out_'.$attributes['id'];
$object = @call_user_func(array($this->getOption('model').'Peer', 'retrieveByPk'), $attributes['value']);
$default_out = $request->getParameter('ajax_'.$attributes['name'], is_object($object) ? call_user_func(array(&$object, $this->getOption('output_method'))) : '');
$default_value = $request->getParameter($attributes['name'], is_object($object) ? $attributes['value'] : '');

$html = '';
$ajaxParams=array(
'model' => $this->getOption('model'),
'value_method' => $this->getOption('value_method'),
'output_method' => $this->getOption('output_method'),
'search_field' => $this->getOption('search_field'),
'criteria_method' => $this->getOption('criteria_method'),
'field_name' => 'ajax_'.$attributes['name']
);
if($this->getOption('add_empty')===false) $ajaxParams['add_empty'] = 'false';
elseif($this->getOption('add_empty')===true) $ajaxParams['add_empty'] = 'true';
else $ajaxParams['add_empty'] = $this->getOption('add_empty');

$requestUrl = url_for($attributes['action'].'?'.http_build_query($ajaxParams), true);
$requestUrl = str_replace('frontend_dev.php/', '', $requestUrl);
$requestUrl = str_replace('backend_dev.php/', 'backend.php/', $requestUrl);

$html .= << <script type="text/javascript">
dojo.require("dojo.data.ItemFileReadStore");
dojo.require("dijit.form.FilteringSelect");
</script>
<div dojoType="dojo.data.ItemFileReadStore"
jsId="{$field_id}Store" url="{$requestUrl}"></div>
EOF;

$input_text = << <input dojoType="dijit.form.FilteringSelect"
store="{$field_id}Store"
class="medium"
id="{$field_id}"
name="{$field_name}"
value="{$default_value}"
hasDownArrow="true",
invalidMessage="",
ignoreCase="true" />
}

4. Create action for the AJAX request
apps/[APP_NAME]/modules/default/actions/actions.class.php

<?php
class defaultActions extends sfActions
{
public function executeAjaxAutocomplete($request)
{
$model = $request->getParameter('model');
$criteria_method = $request->getParameter('criteria_method');
$add_empty = $request->getParameter('add_empty', 'false');
$this->value_method = $request->getParameter('value_method');
$this->output_method = $request->getParameter('output_method');

$peer_object = $model.'Peer';

if($criteria_method!='') $criteria = call_user_func(array($peer_object, $criteria_method));
else $criteria = new Criteria();

$search_field = $request->getParameter('search_field');
$field_name = $request->getParameter('field_name');
$var = $request->getParameter($field_name);

$j_object = array('identifier' => 'abbreviation', 'items'=>array());

$search_field = strtoupper($search_field);

$sql_field = constant($peer_object.'::'.$search_field);

$c = $criteria;
$c->add($sql_field, $var . '%', Criteria::LIKE);
$this->list = call_user_func(array($peer_object,'doSelect'), $c);

if($add_empty!='false')
{
$j_object['items'][] = array(
'name' => $add_empty=='true' ? '' : $add_empty,
'label' => '',
'abbreviation' => ''
);
}

foreach($this->list AS $v)
{
$j_object['items'][] = array(
'name' => call_user_func(array(&$v, $this->output_method)),
'label' => call_user_func(array(&$v, $this->output_method)),
'abbreviation' => call_user_func(array(&$v, $this->value_method))
);
}
$this->j_object = $j_object;
}
}

5. Create template for the AJAX request
apps/[APP_NAME]/modules/default/templates/ajaxAutocompleteSuccess.php

<?php decorate_with(false); ?>
<?php print_r(json_encode($j_object)); ?>

6. Insert the new widget into your sfForm
apps/[APP_NAME]/modules/default/templates/ajaxAutocompleteSuccess.php

...
# $widgets['user_id'] = new sfWidgetFormInput();
$widgets['user_id'] = new stWidgetFormInputTextDijitAutocomplete(array(
'model' => 'User',
'search_field' => 'username',
'value_method' => 'getId',
'output_method' => 'getUsername',
'criteria_method' => 'getCriteriaRegisteredUsers'
));

6. Clear symfony cache

Links:

  • http://api.dojotoolkit.org/jsdoc/1.3.2/dijit.form.FilteringSelect
Feb
17

Das Problem hatte vielleicht schon manch einer. Hier eine Lösung:

function getShortTextByWord($string, $len)
{
$string = substr($string, 0, $len);
$string_end = strrpos($string, ' ');
if($string_end) $string = substr($string, 0, $string_end);
return $string;
}

Dec
19

Long time I was searching for an application which does what you can read in the title of this posting.
I was working with Mac OS X panther, so it was even more difficult to find an app, because of an old OS and a G4 Prozessor.

Now with my new Mac I can use and test the recent apps for my needs. In the windows and linux world are the following apps very popular:

For Mac OS X however it’s hard to find such popular and worth proved tools. These days I found a saving blog post from echeng and many useful comments for my problem.

For a better overview I made a list of the mentioned code/folder compare, sync, diff and merge applications:

My decision flew to diffmerge because it’s free and does what I want – albeit not very intuitive but it does – namely show me the differences between folders and the exact differernces in the file contents.

When I have the time I’ll enhance more information. You’re invited to help me ;-)

Thx to echeng and the commentators.

Dec
11

Die letzten Tage will ich unbedingt im Norden am Strand der kolumbianischen Karibiküste in Cartagena verbringen.

Die Stadt, welche nach der gleichnamigen Stadt in Spanien benannt ist, hat knapp eine Mio. Einwohner.
Wegen der günstigen Lage ist Cartagena die touristisch meist besuchteste Stadt in Kolumbien, weswegen hier auch der Sicherheitsgrad relativ hoch ist. Mir ist das dadurch aufgefallen, da in Cartagena auch Nachts – zumindest in der Altstadt am Hafen – an jeder Straßenecke (Straßen und Gassen sind übrigens gut ausgeleuchtet) mind. ein Polizist sitzt.

Das Stadtzentrum ist komplett von einer dicken Mauer – welche Teils noch mit Kannonen ausgestattet ist – umgeben, auf welcher man schön entlang spazieren kann. Cartagena ist mit den im andalusischen Stil erbauten Kathedralen und Palästen eine wirklich sehr schöne Stadt und sollte unbedingt besucht werden.

Abends ist hier alles auf den Beinen und man muss auf der Straße aufpassen, dass man nicht von einem Chiva überfahren wird, die hier schon fast in Kolonnen durch die Straßen brausen. Das sind bunte, altmodische Partybusse, wie ich sie auch schon in Quito kennen gelernt hatte. An einer Stelle kann man in den Bus gegen eine Gebühr einsteigen und wird dann mit lauter Musik, lustigem Geschrei und reichlich Alkohol durch die Stadt gefahren. Gelegentlich wird an Sehenswürdigkeiten oder Bars angehalten. Endstation ist meist einer der vielen Nachtclubs, in dem dann weiter gefeiert werden kann, solange einem bei der Fahrt nicht schlecht geworden ist.

Es gibt viele Freiluft-Restaurants, die sich förmlich um einen Schlagen, wenn man abends durch die Straßen schländert, bei denen man dann aber ziemlich von den Starßenverkäufern genervt wird, auch während man isst. Am besten gefiel mir das Restaurant bzw. Bar Cafe del Mar, direkt auf der Stadtmauer mit tollem Ausblick auf das Meer und das Lichterspiel der Stadt.



Dec
10

Ca. eine Stunde von Medellín fand dieser Tage das Festival de Cine y Video in Santa Fe de Antioquia statt. Zu diesem Anlass werden in 10-15 Versammlungsräumen oder Gasthäusern kostenlos verschiedene (Kurz-)Filme und Ihre Macher vorgestellt.

Santa Fe ist ein typisch kolumbianisches Dorf-Städtchen, gar nicht zu vergleichen mit dem Trubel in einer Stadt wie Medellín. Hier hab ich mich sofort wohl gefühlt.



Dec
09

Wie schon erwähnt war von meinen ganzen Unternehmungen letzte Woche noch ziemlich erledigt, weswegen ich die ersten Tage hier nur gemütlich durch die Stadt geschländert bin und mich dann abends angeregt mit den anderen Backpacker unterhalten habe.

Dabei bekam ich mit, dass ein großes Fußballspiel stattfinden sollte. Nämlich Dep Ind Medellin (es gibt noch den Erzrivalen Nacional Medellin) gegen Bogota. In Kolumbien ist Fußball eine der beliebtesten Sportarten und dass die Südamerikaner im Stadion etwas emotionaler sind als die deutschen und ich mir das nicht entgehen lassen will – zumal das Station zu Fuß nur 10 min entfernt liegt – verabredete ich mich mit zwei Holländern, einem Argentinier und einem Kanadier zu dem Spiel. Die ganze Stadt war in blau und rot, ich sah keinen einzigen Bogota-Fan, auch im Stadion nicht. Obwohl das Stadion leider nicht ganz ausverkauft war fand ich die Stimmung super und die Atmosphärse super (mit den Andenhügeln im Hintergrund). Wobei ich sagen muss, dass die Fans, als ich damals in Quito im Stadion war, etwas durchgeknallter waren.



Karten bekamen wir übrigens für ca. 12.000 COP vor dem Station. Cool war, dass der private Verkäufer das Geld erst wollte, als die Kontrolleure uns mit dem Ticket durchgelassen hatten. Das Spiel ging nach einem Freistoßtor 1:0 für Ind. Medellin aus.

Dec
07

Nachdem ich in den drei Tagen in Manizales so viel unternommen hatte, war ich nach der fünfstündigen Autofahrt bei Nacht nach Medellín ziemlich geplättet. Ja, diesmal bin ich mit einer Art Minivan (acht Sitze) gefahren, da mir das für die kurze Strecke von ca. 250 km am bequemsten und schnellsten erschien, kostete allerdings auch fast doppelt soviel (70.000 COP) als mit dem normalen Bus.

Die Strecke war sehr holprig, auf Grund der schlechten Straßenverhältnisse. Der Regen setzt dem Asphalt hier stark zu, auch war die Straße oft durch Erdrutsche von den Hängen halb seitig blockiert, was manche Anwohner in der Nähe solcher Straßenschäden dazu ermutigt durch Regeln des Verkehrs ein paar Pesos dazu zu verdienen.

Unser Fahrer hat sich während der Fahrt bestimmt 20 Mal bekreuzigt. Bei dem Fahrstil auch empfehlenswert. Einem kleinem Jungen und einer älteren Dame schlug die kurvenreiche Fahrt ziemlich auf den Magen, worauf der Fahrer sich dann – mit Tüten um sich werfend – mehr Sorgen über seine Teppiche machte als um die Witterungsverhältnisse. Zum Teil mussten wir durch 30cm hoch überlaufene Straßen fahren, aber je näher wir an Medellín kamen, desto besser wurde glücklicherweise das Wetter.

Angekommen bin ich so gegen sieben Uhr morgens. Mit einem Taxi bin ich dann in das vom Lonely Planet empfohlene Hostel Palm Tree, welches fast im Zentrum von Medellín liegt, gefahren. Auch hier wurde ich wieder sehr freundlich empfangen und habe zum Glück auch ohne Reservierung noch eine Stockbett-Etage in einem Zwei-Mann-Dormitorio bekommen.

Nachdem ich mich nochmal hingelegt hatte traf ich Mittags im gleichen Hostel alte Bekannte wieder, denen ich zuvor schon in Manizales begegnet war. Tsja, so ist das eben wenn man den gleichen Reiseführer benutzt (ist mir dann noch häufiger passiert).



Die Atmosphäre hier im Palm Tree ist super, was sicher auch den netten Gastgeberinnen zu verdanken war, die sich immer gerne mit den Gästen unterhalten, Tipps geben und auch mal mit zum Feiern gehen. Internet gibs for free, auch eine Gitarre hängt hier herum, die abends oft zur guten Stimmung begetrug. Einen Nachteil gab es allerdings, mein Zimmer lag direkt an der Straße, auf welcher ab sechs Uhr morgens LKWs, Busse und Motorräder mit einem Höllenlärm durch brummen. Aber ansonsten wirklich sehr zu empfehlen.

Dec
05

Eigentlich wollte ich ja nur so zwei Tage in Manizales verbringen, um die Busfahrt nach Medellín zu verkürzen. Daraus wurden jetzt aber fast vier Tage, weil es hier einfach so viel zu erleben gibt, wie z.B. auch die beeindruckende La Hacienda Guayabal in Chinchiná das Herz des komlumbianischen Kaffeeanbaus.

Die Fahrt dort hin dauerte von Manizales mit öffentlichen Verkehrsmitteln und ein paar Mal Umsteigen ca. 45 Minuten. Die Hacienda liegt im Gegensatz zu Manizales (2150m) in 1400m Höhe, was man auch gleich am Temperaturunterschied merkt. In Manizales schwanken das Wetter und die Temperaturen stark zw. 10 und 25 Grad, wobei es in Chichiná das ganze Jahr über 21 +/- 1 Grad hat. Ein perfektes Mikroklima für den Kaffeeanbau, um das ganze Jahr über ernten zu können, statt wie gewöhnlich nur im letzten Quartal des Jahres.

Man kann das grossflächige Kaffeeanbaugebiet schon vom Bus aus sehen, aber noch beeindruckender ist es, wenn man direkt mitten drin Steht. Besonders angetan war ich von dem wirklich ökologischen Anbauverfahren. Es wird nichts weggeworfen, alles was nicht verkauft werden kann fliesst wieder z.B. als Dünger zurück in den Anbaukreislauf.

Das ganze Anbaugebiet macht gar nicht den Eindruck grossindustrieller Landwirtschaft, viel mehr hat man hier das Gefühl, sich in einem botanischen Garten zu befinden, aus dem man gar nicht mehr weg will.

Obwohl wir ohne Anmeldung auf die Hacieda kamen, wurde uns gleich eine dreistündige Führung angeboten, in der man uns den kompletten Zyklus vom Zögling bis zur gemalenen Kaffeebohne (21 Monate) erklärte.

Die Pflücker bekommen für ein Kilo Bohnen ca. 300 COP, umgerechnet ca. 10 Cent, davon müssen sie Kost und Logie bezahlen.

Nach der Tour gabs dann noch ein leckers Almuerzo (Abendessen) mit Spiegelei, Gebratenem Schweinefleisch, Wurst, Bohnen, Reis, Avokado Tomaten etc. Und zum Nachtisch, sehr süsse Feigen mit Käse. Achja den ganzen Tag über bekamen natürlich wir frisch gemalenen Kaffee.

Ich habe leider zu spät erfahren, dass man auf der Hacienda auch übernachen kann, sonst wäre ich noch einen Tag länger hier geblieben um zu relaxen.



Sehr gut fand ich auch, dass man hier nach der Tour nicht versucht hat, uns irgendwelche Souviniers oder dergleichen anzudrehen. Eine wirklich gelungene Tour, so wie alle anderen von Manizales aus auch.

Gestern Nacht bin ich hier in Medellín angekommen. Dazu schreib ich Tage mal was.