All posts by jimmy

Rich Snippets

My name is Walter Tavares but people call me jimmy. Here is my blog: I live in Porto, or like many say Oporto, and work as an Engineer at Adclick Lda. This short text is an example of rich snippets, as you can(‘t) see the snippet declaration is embed in the html and invisible at a first look.

1
2
3
4
5
6
7
8
<div itemscope itemtype="http://data-vocabulary.org/Person">
  <img itemtype="photo" src="https://lh6.googleusercontent.com/-fvZW9TH7daI/AAAAAAAAAAI/AAAAAAAAAAA/nvSFNg3jAEM/s128-c/photo.jpg" />
  My name is <span itemprop="name">Walter Tavares</span>
  but people call me <span itemprop="nickname">jimmy</span>.
  Here is my blog: <a href="http://istopodedarjeito.blospot.com" itemprop="url">istopodedarjeito.blospot.com</a>
  I live in Porto, or like many say Oporto, and work as an <span itemprop="title">Engineer</span>
  at <span itemprop="affiliation">Adclick Lda</span>.
</div>

The Rich Snippets have 3 different formats, microdata, microformat and RFDa.

Implementation:

. microdata

1
2
3
4
5
6
7
8
<div itemscope itemtype="http://data-vocabulary.org/Person">
  <img itemtype="photo" src="https://lh6.googleusercontent.com/-fvZW9TH7daI/AAAAAAAAAAI/AAAAAAAAAAA/nvSFNg3jAEM/s128-c/photo.jpg" />
  My name is <span itemprop="name">Walter Tavares</span>
  but people call me <span itemprop="nickname">jimmy</span>.
  Here is my blog: <a href="http://istopodedarjeito.blospot.com" itemprop="url">istopodedarjeito.blospot.com</a>
  I live in Porto, or like many say Oporto, and work as an <span itemprop="title">Engineer</span>
  at <span itemprop="affiliation">Adclick Lda</span>.
</div>

. microformats

1
2
3
4
5
6
7
8
<div class="vcard">
  <img class="photo" src="https://lh6.googleusercontent.com/-fvZW9TH7daI/AAAAAAAAAAI/AAAAAAAAAAA/nvSFNg3jAEM/s128-c/photo.jpg" />
  My name is <span class="fn">Walter Tavares</span>
  but people call me <span class="nickname">jimmy</span>.
  Here is my blog: <a href="http://istopodedarjeito.blospot.com" class="url">istopodedarjeito.blospot.com</a>
  I live in Porto, or like many say Oporto, and work as an <span class="title">Engineer</span>
  at <span class="affiliation">Adclick Lda</span>.
</div>

. RFDa

1
2
3
4
5
6
7
8
<div xmlns:v="http://rdf.data-vocabulary.org/#" typeof="v:Person">
  <img property="v:photo" src="https://lh6.googleusercontent.com/-fvZW9TH7daI/AAAAAAAAAAI/AAAAAAAAAAA/nvSFNg3jAEM/s128-c/photo.jpg" />
  My name is <span property="v:name">Walter Tavares</span>
  but people call me <span property="v:nickname">jimmy</span>.
  Here is my blog: <a href="http://istopodedarjeito.blospot.com" rel="v:url">istopodedarjeito.blospot.com</a>
  I live in Porto, or like many say Oporto, and work as an <span property="v:title">Engineer</span>
  at <span property="v:affiliation">Adclick Lda</span>.
</div>

Of course the snippets is not implemented as you wish, you need to follow some rules, here’s the dictionary.

Web Testing Tool

/wt

Datas em PHP

Fartei-me de tanto procurar por isso aqui vai uma série de métodos para obter datas em PHP.

Segunda-feira desta semana:

1
date('Y-m-d', strtotime(date('Y')."W".date('W')))

Domingo desta semana:

1
date('Y-m-d', strtotime(date('Y')."W".date('W')."7"))

Quarta-feira da 5ª semana de 2056:

1
date('Y-m-d', strtotime("2056W53"))

Isto funciona assim:

1
date('Y-m-d', strtotime(<ano>."W".<nº semana>.<dia da semana>))

Números da semana

1
2
3
4
Segunda: 1
Terça:   2
...
Domingo: 7

Criar schema.yml a partir do workbench

Para quem utiliza a ferramenta Workbench para desenhar os modelos da base de dados, e depois não quer ter o trabalho de passar os nomes todos para o schema.yml, pode tirar partido desta script.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<?php
/*
 *  The MIT License
 *
 *  Copyright (c) 2010 Johannes Mueller <circus2(at)web.de>
 *
 *  Permission is hereby granted, free of charge, to any person obtaining a copy
 *  of this software and associated documentation files (the "Software"), to deal
 *  in the Software without restriction, including without limitation the rights
 *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 *  copies of the Software, and to permit persons to whom the Software is
 *  furnished to do so, subject to the following conditions:
 *
 *  The above copyright notice and this permission notice shall be included in
 *  all copies or substantial portions of the Software.
 *
 *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 *  THE SOFTWARE.
 */


// show errors
error_reporting(E_ALL);

// lets stop the time
$start = microtime(true);


// enable autoloading of classes
require_once('../lib/MwbExporter/Core/SplClassLoader.php');
$classLoader = new SplClassLoader();
$classLoader->setIncludePath('../lib');
$classLoader->register();

// show a simple text box with the output
echo '<textarea cols="100" rows="50">';

    // configure your output
    $setup = array(
        'extendTableNameWithSchemaName' => true
    );

    // create a formatter
    $formatter = new \MwbExporter\Formatter\Doctrine1\Yaml\Loader($setup);
   
    // parse the mwb file
    $mwb = new \MwbExporter\Core\Workbench\Document('data/er.mwb', $formatter);
   
    // show the export output of the mwb file
    echo $mwb->display();
 
echo "</textarea>";

// save as zip file in current directory and use .yml as file endings
echo "<br><br>";
echo $mwb->zipExport(__DIR__, 'yml');

// show some information about used memory
echo "<br><br>";
echo (memory_get_peak_usage(true) / 1024 / 1024) . " MB used";
echo "<br>";

// show the time needed to parse the mwb file
$end = microtime(true);
echo  sprintf('%0.3f', $end-$start) . " sec needed";

Atenção: Não dispensa verificação do código gerado!!!

Links úteis:
Workbench: http://www.mysql.com/downloads/workbench/
Repositório do projecto: git://github.com/johmue/mysql-workbench-schema-exporter.git

Obrigado ao johmue. :P

Git coloring

Para os utilizadores do git (graças ao Tito, todos nós), descobri uma forma de tornar os outputs na consola um bocadinho mais legíveis e animados. Colem o código que segue no ficheiro ~/.gitconfig

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[color]
  branch = auto
  diff = auto
  status = auto
[color "branch"]
  current = yellow reverse
  local = yellow
  remote = green
[color "diff"]
  meta = yellow bold
  frag = magenta bold
  old = red bold
  new = green bold
[color "status"]
  added = yellow
  changed = green
  untracked = cyan

Throwing errors on symfony forms

Se pretender associar um erro a um campo especifico num formulário. Crie um sfValidatorCallback onde valida o campo e desplota o erro para o campo referido.

1
2
3
4
5
if ($values['user'] == '')
{
    $error = new sfValidatorError($validator,'Invalid user.');
    throw new sfValidatorErrorSchema($validator, array( 'user' => $error));
}
1
2
echo $form['user'];
echo $form['user']->renderError();

Criar sfValidor

Quando for necessário criar uma verificação especifica para um dos campos do formulário basta-nos personalizar a validação do(s) campo(s) da seguinte forma:

FormularioForm.class.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public function configure()
{
    parent::configure();

    $this->validatorSchema['my_field'] = new sfValidatorCallback(
                    array('callback' =>
                        array($this, 'validateMyField')
                    )
    );

}

public function validateMyField($validator, $value)
{
    /* All my action goes here */

    if ($is_everything_ok)
    {
        return $value;
    }
    else
    {
        throw new sfValidatorError($validator, "I guess something goes wrong here!");
    }

}

Et voilá…