Articles

Comment faire pour que Bower et Git utilisent toujours https://github.com/ au lieu de git://github.com/

En utilisant Bower pour installer Bootstrap j'ai constaté qu'il essayait d'utiliser git://github.com/... ceci ne fonctionnera généralement pas dans le réseau d'entreprise car le protocole est généralement bloqué. Un google plus tard, je touve la solution simple et efficace suivante sur cette discussion stackowerflow : git config --global url.https://github.com/.insteadOf git://github.com/

Déterminer l'encodage d'un fichier texte en ligne de commande

Souvent il faut pouvoir déterminer rapidement le type d'encodage d'un fichier texte, en ligne de commande sous linux il y a un moyen simple : file -bi default.phtml text/x-php; charset=us-ascii ou encore : file -bi default-alter.phtml text/x-php; charset=utf-8

43 millions d'insertions en 4 minutes 47 dans postgresql dans une machine virtuelle kvm !

Image
Je suis en train d'insérer des "zillions" de points provenant d'un campagne de mesure lidar dans une base de données postgresql/postgis et le taux d'insertion/sec est "abassourdissant". Bon il est vrai qu'il a fallu un peu "adapter" les paramètres du fichier de configuration postgresql.conf pour ces opérations d'insertions massives et il est aussi vrai que l'utilisation de la bonne méthode d'insertion est déterminante. Mais tout de même pour un GNU/Linux Debian 6.0.5 Squeeze 64 bit tournant dans une machine virtuelle kvm sur un host physique Proxmox "ça décoiffe sec" les amis. Tout commence par la compilation de la dernière version de liblas  la version 1.7.0 en ce moment. Ensuite on rentre dans le vif du sujet je convertis mes fichiers las en csv avec l'utilitaire las2txt  : las2txt --parse MxyzcipnreadRGB  --precision 3 3 3 3 -i 1243-14-d_color_ortho_r1.las -o 1243-14-d_color_ortho_r1.csv Ensuite avec un  w...
Prendre la geomA et la geomB et retourner : “ Dimensionally Extended 9 Intersection Model (DE-9IM)” selon section 4.3.6 de la doc postgis SELECT ST_Relate('SRID=21781;POINT(538494 152932)'::geometry,'SRID=21781;POINT(538494 152932)'::geometry) --"0FF-FFF-FF2" --deux points diffrents SELECT ST_Relate('SRID=21781;POINT(538494 152932)'::geometry,'SRID=21781;POINT(538492 152932)'::geometry) --"FF0-FFF-0F2" --deux lignes identiques SELECT ST_Relate('SRID=21781;LINESTRING(53 15, 55 16)'::geometry,'SRID=21781;LINESTRING(53 15, 55 16)'::geometry) --"1FF-F0F-FF2" --deux lignes partiellment identiques SELECT ST_Relate('SRID=21781;LINESTRING(53 15, 55 16)'::geometry,'SRID=21781;LINESTRING(53 15, 55 16, 58 18)'::geometry) --""1FF-00F-102" --deux lignes qui se coupe perpendiculaire SELECT ST_Relate('SRID=21781;LINESTRING(0 0, 10 0)'::geometry,'SRID=21781;LINESTRING(5 5, 5 -...

IsoSurface depuis 1 point donné avec une tolérance donnée

CREATE OR REPLACE FUNCTION cncggetisosurface(geomdepart geometry,tolerance float,altitude double precision) RETURNS geometry AS $$ DECLARE idcarredepart integer:=0; carredepart geometry; altituderef double precision:=0; tempidgrid integer:=0; tempgeom geometry; tempaltitude double precision:=0; toutlageometrieavant geometry; toutlageometrie geometry; isendofstory boolean :=false; BEGIN IF GeometryType(geomdepart) = 'POINT' THEN FOR tempidgrid,tempaltitude,tempgeom IN (SELECT idgrid_elevation,mns_lidar, the_geom FROM l3d_grid1m_elevation WHERE ST_DWITHIN(the_geom,geomdepart, 0.01) ) LOOP IF tempaltitude > altituderef THEN idcarredepart := tempidgrid; altituderef := tempaltitude ; carredepart := tempgeom; END IF; END LOOP; --au depart etait le carre toutlageometrie := carredepart; ELSE --ensuite etait la geom carre,polygone etc... toutlageometrie := geomdepart; END IF; WHILE NOT isendofstory LOOP ...

idem mais depuis un grille

Image
CREATE SEQUENCE seq_police_isolines_id MINVALUE 1 START WITH 1 INCREMENT BY 1 CREATE TABLE police_isolines as (SELECT nextval('seq_police_isolines_id') as id, COUNT(*), ST_UNION(the_geom), FLOOR(mns_lidar) FROM l3d_grid1m_elevation WHERE ST_Intersects(the_geom, (SELECT geom as gb from bati_pol where No_eca = '11330')) --AND the_geom && (SELECT geom as gb from bati_pol where No_eca = '11330') GROUP BY FLOOR(mns_lidar) ORDER BY 3 ) ;

recuperer les z d'un batiment sur un ascii grid dans postgis

Image
première étape charger un mns dans postgis:   ./raster2pgsql -I -C -r -t 50x50 -d -s 21781 /home/xao/postgis/MNS_zone_test.asc mns >/tmp/mns.sql puis on insère dans notre base de données: psql -U postgres -f /tmp/mns.sql gis01 enfin on peut créer une table temporaire avec une séquence CREATE SEQUENCE seq_bati_isolines_id MINVALUE 1 START WITH 1 INCREMENT BY 1 CACHE 10 CREATE TABLE bati_isolines as (SELECT nextval('seq_bati_isolines_id') as id, no_eca, (gv).geom, (gv).val as z FROM (SELECT b.no_eca , ST_Intersection(geom,rast) gv FROM bati_pol b, mns WHERE no_eca like '11330' AND st_intersects(geom,rast)) as t ) une fois ce petit détail reglé on peut allez voir nos isolignes dans QGIS avec le plugin "DBManager" avec la requête SELECT id,geom,z FROM bati_isolines

Calcul des distances entre chaque points d'un polygone (CTE)

Cette fois on veut la liste des distances entre tous les points composants un polygone par exemple pour vérifier qu'il n'y a aucun point qui s'approche d'un autre à moins d'une certaine distance WITH line as (SELECT st_geometryn(st_boundary(geom),1) as g FROM bati_pol WHERE no_eca like '11330'), series as (SELECT generate_series(1,ST_NumPoints (g) ) as n FROM line), points1 as (SELECT st_pointn(g,n) as p1, n as n1 FROM line,series), points2 as (SELECT st_pointn(g,n) as p2,n as n2 FROM line,series) SELECT n1,n2,st_distance(p1,p2) FROM points1,points2 WHERE n1 != n2 ORDER BY 3 ASC

calcul distances entre point successif méthode avec CTE

variante même requête en utilisant les Command Table Expression WITH line as (SELECT st_geometryn(st_boundary(geom),1) as g FROM bati_pol WHERE no_eca like '11330'), series as (SELECT generate_series(1,ST_NumPoints (g) ) as n FROM line) SELECT 'point '|| n,st_astext(st_pointn(g,n)), 'point '|| n+1,st_astext(st_pointn(g,n+1)), st_distance(st_pointn(g,n),st_pointn(g,n+1)) FROM line,series

calculer distance entre points successfs d'un polygone

Comment calculer la distance entre les points successifs d'un polygone SELECT ST_AsText(ST_PointN((st_geometryn(st_boundary(geom),1)), generate_series(1,ST_NumPoints (st_geometryn(st_boundary(geom),1))-1) )), ST_AsText(ST_PointN((st_geometryn(st_boundary(geom),1)), generate_series(1,ST_NumPoints (st_geometryn(st_boundary(geom),1))-1)+1 )), ST_Distance( ST_PointN((st_geometryn(st_boundary(geom),1)),s.i ) , ST_PointN((st_geometryn(st_boundary(geom),1)), generate_series(1,ST_NumPoints (st_geometryn(st_boundary(geom),1))-1)+1 ) ) FROM bati_pol , (SELECT generate_series(1,ST_NumPoints (st_geometryn(st_boundary(bati_pol.geom),1))-1) FROM bati_pol WHERE no_eca like '11330') as s(i) WHERE no_eca like '11330'

Postgis comment créer des géomètries en une ligne

Pour remplacer toutes les fonctions de créations géométries avantageusement par une seule syntaxe générique on utilise un string WKT avec un cast: 'SRID=21781;POINT(538460 152947)'::geometry par exemple dans le contexte d'une requête : SELECT * FROM l3d_grid1m_elevation g WHERE st_intersects(g.the_geom,(SELECT st_buffer('SRID=21781;POINT(538460 152947)'::geometry,1))) AND g.the_geom && (SELECT st_buffer('SRID=21781;POINT(538460 152947)'::geometry,1)) Ainsi on a quasiment un remplacement unique pour toutes les fonctions du §8.3 Geometry constructors du manuel postgis

Importation rapide d'un fichier las dans une table de Postgis et analyse de densité.

Image
Je viens d'être confronté à un besoin d'estimation rapide de la densité de points par m2 d'un fihier "las" provenant d'un vol Lidar . Il fallait pouvoir répondre à la question combien de zones de 1m2 contiennnent des densités de points inférieur à un certain seuil. Wikipedia l'explique bien mieux mais en résumé pour les pressés : La télédétection par laser ou LIDAR «  li ght d etection a nd r anging  » est une technique qui permet en substance de "mesurer" depuis un avion ou un hélicoptère la position d'objets aux sol et d'obtenir un nuage de points x,y,z  qui donne un modèle numérique de surface ou MNS. En fonction du plan vol, de la météo des conditions topologiques en présence (grand bâtiments) on peut avoir des "zones d'ombres" ou on a peu ou pas de  données, il faut néanmoins pouvoir quantifier et visualiser ces zones. Pour les curieux je recommande l'excellente présentation de M. Marc Riedo responsable du SITN s...

Comment ajouter des sauts (retour) à la ligne dans un énorme xml d'une seule ligne !

J'avais un grand fichier récupéré via un curl : curl -#v -o /tmp/output.xml "http://www.myserver.ch/extraction_file.php?mode=complex&typef=xml" le problème c'est que ce fichier "output.xml" était un gros xml valide d'une seule  ligne... un "wc -l /tmp/output.xml"  me retourne bien 1 ! Or la plupart des éditeurs n'aiment pas trop ouvrir ce genre de fichier d'une seule "énorme" ligne, voire même ils plantent lamentablement. La solution est d'utiliser un bon vieux oneliner en perl pour rajouter un saut de ligne après un tag fermant : perl -i -pe 's/<\/Adr>/<\/Adr>\n/g' /tmp/output.xml Et voilà , maintenant le fichier contient autant de ligne qu'il y a de tags fermants . Et du coup il est beaucoup plus facile à utiliser dans votre éditeur favori !

Génération automatique d'une liste de requêtes sql pour toutes les tables de Postgresql

Image
Il arrive assez régulièrement que l'on doive appliquer une modification à toute les tables d'une base de données postgresql . Par exemple s'il faut rajouter un droit de consultation pour un user particulier sur toutes les tables. On peut bien entendu se palucher à la main tous les : GRANT SELECT ON TABLE altitude TO userdbreadonly; pour autant de tables qu'il y a dans la base... Mais comme un bon informaticien déteste toutes les tâches répétitives,  il préférera trouver comment  écrire une requête dont le résultat correspondra à la liste des ordres sql qu'il veut exécuter, soit dans ce cas : SELECT 'GRANT SELECT ON TABLE ' || tablename || ' TO cgdbreadonly;' FROM pg_tables WHERE schemaname like 'public'  ORDER BY 1; qui lui retournera la liste de tous les GRANT SELECT pour toutes les tables liste qu'il n'aura plus qu'à exécuter...

GPG error sur template Openvz debian6 lors du apt-get update

Je venais de créer une nouvelle machine virtuelle openvz sur proxmox basée sur le template debian 6 amd64bit :debian-6.0-standard_6.0-2_amd64.tar.gz Une fois connecté dessus en ssh je lance un: apt-get update et j'obtiens un message d'erreur : W: GPG error: http://security.debian.org squeeze/updates Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY AED4B06F473041FA W: GPG error: http://ftp.debian.org squeeze Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY AED4B06F473041F La solution consiste par la mise a niveau du keyring debian avec un simple : apt-get install debian-archive-keyring j'ai pu ensuite relancer le apt-get update qui c'est déroulé sans accroc.

Comment copier une machine virtuelle kvm en raw sur un Volume Group LVM2 se trouvant sur un disque en DRBD

Image
Il se trouve que je devais migrer quelques machines virtuelle se trouvant sur un cluster proxmox sur le site de Lausanne, sur un autre cluster proxmox se trouvant à Lutry. Jusque-la rien de bien sorcier me direz-vous, si ce n'est qu'avec un lien réseau de faible débit entre les deux sites j'ai fait une copie initiale de mes images de bécannes virtuelles en fichier raw sur un disque externe. Sur le site de Lutry j'ai une config avec deux serveurs en cluster proxmox  lutrycalc01:~# pveca -l CID----IPADDRESS----ROLE-STATE--------UPTIME---LOAD----MEM---DISK  1 : 192.168.50.100  M     A     1 day 05:49   2.23     8%     1%  2 : 192.168.50.110  N     A     1 day 05:49   0.00     1%     1% chaque serveur à 3 disques logiques (de taillse identique) s'appuyant sur une config physique en RA...

Compter le nombre d'entités de type différentes dans un dessin dxf

Image
Quand on reçoit des données graphiques sous forme d'un simple fichier DXF, il se peut que l'on soit confronter au fait de vérifier le type d'entités différentes se trouvant dans ce fichier. l'utilitaire ogrinfo de la suite d'outil gdal  est bien pratique et il permet de résoudre ce petit problème en une seule ligne de commande sous n'importe quel shell tel que bash avec votre distribution Gnu/Linux favorite. Ceci permet de filtrer tout de suite un fichier d'un lot qui contiendrait des types d'entités que l'on ne veut pas traiter. ogrinfo -geom=SUMMARY -al  085_VOL2008.dxf |grep AcDbEntity|sort |uniq -c        332   SubClasses (String) = AcDbEntity:AcDb3dPolyline     580   SubClasses (String) = AcDbEntity:AcDbBlockReference     405   SubClasses (String) = AcDbEntity:AcDbCircle      64   SubClasses (String) = AcDbEntity:AcDbCircle:AcDbArc      50   SubClasses (String) = ...

Richard M. Stallman en tournée en Suisse Romande "It's Now & It's Free like in Freedom" !

Image
Richard M. Stallman, alias RMS  est un programmeur à l'origine du projet GNU   , auteur d'outils indispensables tels que l’éditeur de texte  GNU Emacs , le  compilateur C de GNU , le  débogueur GNU  mais aussi, en collaboration avec  Roland McGrath , le  moteur de production   GNU Make .   Il s'agit d'un vrai  "Personnage" figure emblématique, charismatique et incontournable du Monde du Libre Il a déclaré à plusieurs reprises « Je puis expliquer la base philosophique du logiciel libre en trois mots :  liberté, égalité, fraternité .  Liberté , parce que les utilisateurs sont libres. Égalité , parce qu'ils disposent tous des mêmes libertés.  Fraternité , parce que nous encourageons chacun à coopérer dans la communauté ». Il est actuellement en tournée de conférence dans la région suisse romande, le 8 et le 10 novembre à Lausanne, le 9 et le 11 à Genève. Ne ratez pas cette occasion unique de le rencont...

Ubuntu 10.10 est disponible !

Image
La 13ème version de la distribution Linux Ubuntu "The Maverick Meerkat" est disponible ! Plus d'informations en français sur le site du zéro Vous pouvez vous rendre aussi directement sur le site principal Ubuntu pour aller rechercher votre copie   Entre autres caractéristiques on a le passage au noyau Linux  2.6.35, et la nouvelle version de  Gnome 2.32. 

SuperTux is alive : Numéro 2 dans le top500 avec du Linux du Nvidia TESLA

Image
Dans un précédent post en mars dernier j'évoquais le fait qu'il y avait de forte chance que les futurs supercalculateurs dans le Top500 utilisent la puissance de calcul des processeurs graphiques actuels pour atteindre à un moindre coût d'acquisition et de consommation les sommets du top500...    Et bien ça y est c'est chose faite la Chine a rejoint  le classement de juin 2010 des supercalculateurs les plus puissants  de la planète, (le fameux Top500  ) avec trois supercalculateurs ! Et attention pas n'importe ou, elle place directement ces nouveaux   clusters dans le top20 (19ème,7ème et 2ème place) dont une deuxième place d'entrée de jeu. C'est très impressionnant, et surtout ce n'est probablement qu'un début, je suis près à parier qu'avant la fin de l'année la Chine risque de se placer encore plus haut.  En attendant la deuxième place est occupée par un supercalculateur du  National Supercomputing Centre in Shenzhen (NSCS) ...