Le blog de Jean David TECHER, un Réunionnais à Saint-Priest/Lyon

Aller au contenu | Aller au menu | Aller à la recherche


< 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 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 >

samedi 19 avril 2008

Changer l'heure du système

Depuis qu'on est passé à l'heure d'été, j'avais complètemement oublié de changer l'heure sur mon portable. La commande suivante suffit amplement

date -s HH:MM:SS
Par exemple date -s 14:36:48 Maintenant mon portable est à l'heure

mercredi 16 avril 2008

Test de PostgreSQL 8.3 sur fonction en C pour extraire les 'e' d'une chaîne de caractères

Les fonctionnalités en C ont quelques peu changé depuis le temps! Faisons donc un petit test sur une fonctionnalité extract_e() qui enlève tous les 'e' contenues dans une chaîne de caractère de type text. Commençons donc par créer une petite table pour nos tests. Je profite ici d'utiliser la structure de requête INSERT INTO ... RETURNING ... apparu depuis la 8.2

BEGIN TRANSACTION;
-- Déclaration de la fonction extract_e en tant que module C
SET search_path = public;
CREATE OR REPLACE FUNCTION extract_e(text) RETURNS text
     AS 'MODULE_PATHNAME', 'extract_e'
     LANGUAGE 'C' IMMUTABLE STRICT;
-- table de test
DROP TABLE IF EXISTS test;
CREATE TABLE test(id serial,data text)WITH OIDS;
INSERT INTO test(data) VALUES 
('david'),
('maman je t''aime'),
('Isabelle tu es la plus belle de toutes'),
('La vie vaut parfois le coup d''être vécue!'),
(NULL),
('Isidore dort dans la chambre')
RETURNING id,data,length(data),extract_e(data),length(extract_e(data));
END TRANSACTION;
qui me renverra
 id |                   data                    | length |               extract_e               | length 
----+-------------------------------------------+--------+---------------------------------------+--------
  1 | david                                     |      5 | david                                 |      5
  2 | maman je t'aime                           |     15 | maman j t'aim                         |     13
  3 | Isabelle tu es la plus belle de toutes    |     38 | Isabll tu s la plus bll d touts       |     31
  4 | La vie vaut aussi le coup d'être vécue! |     41 | La vi vaut aussi l coup d'êtr vécu! |     37
  5 |                                           |        |                                       |       
  6 | Isidore dort dans la chambre              |     28 | Isidor dort dans la chambr            |     26
(6 rows)

Le progamme extract_e.c

#include "postgres.h" 
#include "fmgr.h" 

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

#ifndef SET_VARSIZE
#define SET_VARSIZE(n,s) VARATT_SIZEP(n) = s; 
#endif 

#define VARDATALENGTH(s) VARSIZE(s)-VARHDRSZ;

Datum extract_e( PG_FUNCTION_ARGS );
int GetNb_e(text *);
text* Chaine_WithOut_E(text *,int);


// chaine sans les 'e'
text* Chaine_WithOut_E(text *chaine_In,int Nb_e){
  int i=0,j,t=0,len=VARDATALENGTH(chaine_In);
  text* chaine_Out=(text*)palloc(len-Nb_e+VARHDRSZ);
  SET_VARSIZE(chaine_Out,len-Nb_e+VARHDRSZ);
  while(i<len){j=(!(*(VARDATA(chaine_In)+i)=='e'))?(*(VARDATA(chaine_Out)+t++)=*(VARDATA(chaine_In)+i++)):i++;}
  return chaine_Out;
}

// Retourne le nombre de lettres 'e' de chaine
int GetNb_e(text *chaine){
  int pos,nb,len=VARDATALENGTH(chaine);
   nb=pos=0;
  while(pos<len){nb+=(*(VARDATA(chaine)+pos++)=='e');}
  return nb;
}

PG_FUNCTION_INFO_V1( extract_e );
Datum extract_e( PG_FUNCTION_ARGS )
{
   text *chaine_In;
   int Nb_e;
   chaine_In = PG_GETARG_TEXT_P(0);
   PG_RETURN_TEXT_P((!(Nb_e=GetNb_e(chaine_In)))?chaine_In:Chaine_WithOut_E(chaine_In,Nb_e)); 
}

Le Makefile

MODULES = extract_e
#PG_CPPFLAGS = -ggdb
DATA_built = extract_e.sql
DATA = uninstall_extract_e.sql
PGXS := $(shell pg_config --pgxs)
include $(PGXS)

Le fichier extract_e.sql.in


BEGIN TRANSACTION;
-- Déclaration de la fonction extract_e en tant que module C
SET search_path = public;
CREATE OR REPLACE FUNCTION extract_e(text) RETURNS text
     AS 'MODULE_PATHNAME', 'extract_e'
     LANGUAGE 'C' IMMUTABLE STRICT;
-- table de test
DROP TABLE IF EXISTS test;
CREATE TABLE test(id serial,data text)WITH OIDS;
INSERT INTO test(data) VALUES 
('david'),
('maman je t''aime'),
('Isabelle tu es la plus belle de toutes'),
('La vie vaut parfois le coup d''être vécue!'),
('Isidore dort dans la chambre')
RETURNING id,data,length(data),extract_e(data);
END TRANSACTION;;

Le fichier uninstall_extract_e.sql.in

SET search_path = public;
DROP FUNCTION extract_e(text);

dimanche 13 avril 2008

PostGIS 1.3.3 is out et refonte du site de GEOS sous Track

C'est en me rendant sur le site de PostGIS ce matin que j'ai vu que cette nouvelle version était sortie hier. Quand j'aurais le temps j'en profiterais pour tester les nouvelles fonctionnalités. Les news sur cette version mineure sont disponibles ici

Entre temps, j'ai aussi noté la refonte du site de geos sous Tracks...

A l'heure où j'écris ce billet, vous pouvez retrouver la doc au format PDF de la 1.3.3 ici généré grâce à db2latex

Exemple pour ST_SimplifyPreserveTopology()

En considérant le multipolygon suivant,
testgis=# select ST_AsText(the_geom) from testorig;
-[ RECORD 1 ]---------------------------------------------------------------------------------------------------------------------------------------------------
st_astext | MULTIPOLYGON(((283.681871106464 262.407705415416,333.681871106464 327.407705415416,406.681871106464 

273.407705415416,398.681871106464 238.407705415416,434.681871106464 224.407705415416,409.681871106464 215.407705415416,375.681871106464 

216.407705415416,391.681871106464 223.407705415416,361.681871106464 220.407705415416,387.681871106464 233.407705415416,375.681871106464 

246.407705415416,358.681871106464 226.407705415416,355.681871106464 254.407705415416,318.681871106464 229.407705415416,333.681871106464 

255.407705415416,319.681871106464 259.407705415416,312.681871106464 246.407705415416,310.681871106464 260.407705415416,302.681871106464 

244.407705415416,300.681871106464 260.407705415416,287.681871106464 246.407705415416,263.681871106464 237.407705415416,262.681871106464 

260.407705415416,286.681871106464 283.407705415416,283.681871106464 262.407705415416)))
On aura par exemple
testgis=# select ST_AsText(st_simplifypreservetopology(the_geom,10)) from testorig;
 POLYGON((283.681871106464 262.407705415416,333.681871106464 327.407705415416,406.681871106464 273.407705415416,398.681871106464 

238.407705415416,434.681871106464 224.407705415416,361.681871106464 220.407705415416,387.681871106464 233.407705415416,375.681871106464 

246.407705415416,358.681871106464 226.407705415416,355.681871106464 254.407705415416,318.681871106464 229.407705415416,333.681871106464 

255.407705415416,312.681871106464 246.407705415416,310.681871106464 260.407705415416,302.681871106464 244.407705415416,300.681871106464 

260.407705415416,263.681871106464 237.407705415416,262.681871106464 260.407705415416,286.681871106464 283.407705415416,283.681871106464 

262.407705415416))
correspondant au cas de l'image suivante

ST_SimplifyPreserveTopology sur un MULTIPOLYGON

Samedi soir à l'Australian Café de Montpellier

Après la semaine de m...passé sous la pluie sur Sophia, il a commencé à faire beau vendredi aprem' sur Juan les Pins. Samedi matin, suite à la rédaction de mon précédent billet, j'ai finalement décidé décoller pour rentrer sur Montpellier sur les coups de 15h00~15h15. Sur la route, vents et chaleurs mais il faisait un super temps.

Arrivé sur place un petit wiski-coca au bar de la plage avec un couple d'amis, ensuite retour à l'appart. Mon coloc' avait réorganisé la disposition des meubles. Il s'y est bien pris. Sur les coups de 22h30, on a tracé à l'Australian Café de Montpellier...Y'avait du monde! Au bout de 4 p'ti punchs j'étais assez entamé mais bien réveillé...J'ai pu tapé la discut' avec un jeune mexicain de passage et d'autres personnes! Bonne soirée, en tout cas y'avait la zikmu que je kiffe!

Ce matin dimanche, c'est acheter de la bouffe pour le chat au Super U de la pompignane, lessive et courrier! Retour programmé vers 17h00~18h00... Levée vers 10h00, après avoir fait les courses, j'en ai profité pour m'arrêter à la terrasse du bar de Castelnau pour prendre un petit café et me dorer au soleil...Il faut beau ces temps-ci.