<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>tommy's scratchpad</title><link href="https://kralidis.ca/blog/" rel="alternate"/><link href="https://kralidis.ca/blog/feeds/all.atom.xml" rel="self"/><id>https://kralidis.ca/blog/</id><updated>2025-12-30T11:35:00+00:00</updated><entry><title>Cheers to 2025</title><link href="https://kralidis.ca/blog/blog/2025/12/30/cheers-to-2025/" rel="alternate"/><published>2025-12-30T11:35:00+00:00</published><updated>2025-12-30T11:35:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2025-12-30:/blog/blog/2025/12/30/cheers-to-2025/</id><summary type="html">&lt;p&gt;Well, 2025 was quite a fun and productive year! Here's the rundown on my last 12 months:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;WMO&lt;/strong&gt;: WIS2 went operational on 01 January 2025, and things ran relatively smoothly overall. Check out our &lt;a href="https://community.wmo.int/site/knowledge-hub/programmes-and-initiatives/wmo-information-system-wis/wis-20-global-services"&gt;Global Services&lt;/a&gt; listing! WIS2 currently has over 100 WIS2 Nodes and 19 Global Services, and we …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Well, 2025 was quite a fun and productive year! Here's the rundown on my last 12 months:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;WMO&lt;/strong&gt;: WIS2 went operational on 01 January 2025, and things ran relatively smoothly overall. Check out our &lt;a href="https://community.wmo.int/site/knowledge-hub/programmes-and-initiatives/wmo-information-system-wis/wis-20-global-services"&gt;Global Services&lt;/a&gt; listing! WIS2 currently has over 100 WIS2 Nodes and 19 Global Services, and we continue to refine and tweak the Technical Regulations baseline. We also published the first version of the &lt;a href="https://wmo-im.github.io/wis2-cookbook/cookbook/latest/wis2-cookbook-STABLE.html"&gt;WIS2 Cookbook&lt;/a&gt;, check it out for some practical examples on working with WIS2. &lt;a href="https://docs.wis2box.wis.wmo.int"&gt;wis2box&lt;/a&gt; reached 1.0 status and continues to power ~60 installations across the infrastructure. Best of all, the entire activity is stuffed with &lt;a href="https://www.ogc.org/wmo-information-system-2-0-powering-global-weather-and-climate-resilience-with-ogc-standards/"&gt;Open Standards&lt;/a&gt; and considerable FOSS implementation of them!&lt;/p&gt;
&lt;p&gt;We also made considerable progress on defining the Global Replay Service as well as the Sensor Centre concept (all of which will have FOSS Reference Implementations).&lt;/p&gt;
&lt;p&gt;Finally, the &lt;a href="https://github.com/wmo-im/tt-oss"&gt;Task Team on Open Source Software&lt;/a&gt; kicked off this year, with the aim of providing a FOSS framework for WMO Members and Secretariat.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OGC&lt;/strong&gt;: at long last, OGC API - Records - Part 1: Core was &lt;a href="https://www.ogc.org/announcement/ogc-membership-approves-ogc-api-records-part-1-core-as-an-official-ogc-standard/"&gt;released&lt;/a&gt; this year! OGC API now has a formal search capability defined. Check out all the &lt;a href="https://github.com/opengeospatial/ogcapi-records/blob/master/implementations.md"&gt;software implementations already available&lt;/a&gt;. Don't see yours here? Feel free to add :) The PubSub SWG continued to chug along, and we are now at the point to start testing the &lt;a href="https://docs.ogc.org/DRAFTS/25-030.html"&gt;draft specification&lt;/a&gt; and further refine with the relevant OGC API SWGs. We also moved forward on the &lt;a href="https://eumetnet.github.io/metocean-edr-profile/standard/metocean-edr-profile-DRAFT.html"&gt;RODEO EDR profile&lt;/a&gt;, which will become an OGC MetOcean profile for EDR, allowing for increased EDR interoperability across the weather community.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OSGeo&lt;/strong&gt;: FOSS4G Europe (Mostar) and the Global (Auckland) were personal highlights, having delivered &lt;a href="https://talks.osgeo.org/foss4g-2025/speaker/H8LVLX/"&gt;numerous&lt;/a&gt; &lt;a href="https://talks.osgeo.org/foss4g-europe-2025/speaker/H8LVLX/"&gt;talks&lt;/a&gt; and &lt;a href="https://talks.osgeo.org/foss4g-europe-2025-workshops/speaker/H8LVLX/"&gt;workshops&lt;/a&gt; on Geopython and pygeoapi with great teams as always. I was honoured to present the Sol Katz award to Nyall Dawson at the closing ceremony (congrats again Nyall!). Being part of the Board of Directors continued as a motivation to improve and sustain OSGeo, with emphasis on &lt;a href="https://wiki.osgeo.org/wiki/Standards_Committee"&gt;standards&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;pygeoapi&lt;/strong&gt;: We rocked 4 &lt;a href="https://github.com/geopython/pygeoapi/releases"&gt;releases&lt;/a&gt; this year, adding goodies like STAC API, dataset specific templating, transactions for PostgreSQL, i18n support for Arabic, OpenShift support, STAC API and much more. Monthly online &lt;a href="https://github.com/geopython/pygeoapi/wiki/Meetings"&gt;meetings&lt;/a&gt; continued as planned, and the project continues to grow and mature as an OGC API Reference Implementation, as well as powering some &lt;a href="https://pygeoapi.io/presentations/foss4g2025/#/5"&gt;high profile data sharing services&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;pycsw&lt;/strong&gt;: lots of action this year, which included: numerous deep STAC API and CQL2 improvements, as well as significant repository abstraction work (in progress) to enable easier integration with NoSQL backends such as Elasticsearch and Solr. We were also the first to &lt;a href="https://github.com/geopython/pycsw/pull/1159"&gt;implement&lt;/a&gt; OGC API - Publish/Subscribe (draft) and continue to refine things as the draft specification evolves. We also cut another 3.0 beta release as we march towards OGC API - Records CITE compliance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;WOUDC&lt;/strong&gt;: we released &lt;a href="https://woudc.org"&gt;version 2.0&lt;/a&gt; of the data centre this year, which included a major &lt;a href="https://github.com/woudc/woudc/blob/master/architecture/v2/c4.container.png"&gt;architecture updates&lt;/a&gt;, moving from WMS/WFS/CSW to &lt;a href="https://api.woudc.org"&gt;OGC APIs&lt;/a&gt; (using pygeoapi) and a shiny new UI. We also achieved connectivity to WIS2 as the first GAW data centre to publish atmospheric composition data to the infrastructure. Kudos to the entire team and keep up the great work!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MSC&lt;/strong&gt;: our &lt;a href="https://eccc-msc.github.io/open-data/msc-geomet/readme_en/"&gt;national weather/water/climate API platform&lt;/a&gt; continues to grow. We are getting closer and closer to operational dissemination of our NWP data via EDR and Zarr - stay tuned! Our efforts on &lt;a href="https://eccc-msc.github.io/open-data/wmo-wis2/readme_en/"&gt;MSC's WIS2 implementation&lt;/a&gt; continue to lead, with the most data and metadata on WIS2. Great job to the entire team!&lt;/p&gt;
&lt;p&gt;On the personal front:&lt;/p&gt;
&lt;p&gt;having done my share of code sprints in my worklife, 2025 was the time for a personal sprint on health. Powered by an extremely strict diet, I lost 60 (sixty) pounds in 2025 and feel better than ever. A big thanks to my wife, family, friends and colleagues for their support&lt;/p&gt;
&lt;p&gt;another year (circa 2012) of not smoking (yes I continue to remind myself)&lt;/p&gt;
&lt;p&gt;home renovation: our major project took me out of action for a few months, and I'm thankful that it is completed so we can return to normal life again&lt;/p&gt;
&lt;p&gt;Looking ahead to 2026, a few key items:&lt;/p&gt;
&lt;p&gt;WMO: INFCOM-4 will take place in Q4, with numerous items for discussion and approval (WIS2 Sensor Centres, Global Replay Service, the &lt;a href="https://wmo-im.github.io/wmo-foss-guide/guide/wmo-foss-guide-DRAFT.html"&gt;WMO FOSS Guide&lt;/a&gt;, and &lt;a href="https://wmo-im.github.io/wcmp2/kpi/wcmp2-kpi-DRAFT.html"&gt;WCMP2 KPI&lt;/a&gt; definitions)&lt;/p&gt;
&lt;p&gt;WMDR2: WMO's station metadata standard is getting a &lt;a href="https://github.com/wmo-im/wmdr2"&gt;reboot&lt;/a&gt; which will move it closer to WCMP2 and OGC API - Records, stay tuned for the new specification and its &lt;a href="https://github.com/wmo-im/pywmdr"&gt;Reference Implementation&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;pygeoapi: look for the addition of OGC API - Publish/Subscribe workflow, maturation of OGC API - Maps support, along with numerous other improvements&lt;/p&gt;
&lt;p&gt;OSGeo: I'm looking forward to the global event in Hiroshima (August), as well as serving the Board of Directors with focus on Standards, SAC and growth/sustainability. As well, I'm looking forward to the &lt;a href="https://events.ogc.org/5JointOGC-OSGeo-ASFCodeSprint"&gt;2026 Joint OGC-OSGeo-ASF Code Sprint&lt;/a&gt; (which returns after not eventing in 2025)&lt;/p&gt;
&lt;p&gt;GeoHealthCheck: the project is getting some recent love, and look for more developments as we work towards refactoring for the long term&lt;/p&gt;
&lt;p&gt;Wishing everyone a healthy and happy 2026!&lt;/p&gt;</content><category term="geospatial, home renovation, open source, personal, technology, web"/></entry><entry><title>Cheers to 2024</title><link href="https://kralidis.ca/blog/blog/2024/12/27/cheers-to-2024/" rel="alternate"/><published>2024-12-27T09:34:00+00:00</published><updated>2024-12-27T09:34:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2024-12-27:/blog/blog/2024/12/27/cheers-to-2024/</id><summary type="html">&lt;p&gt;2024 was a power packed year with much progress on many fronts, work and personal. Here's the annual rundown:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://wiki.osgeo.org/wiki/Sol_Katz_Award"&gt;Sol Katz Award&lt;/a&gt;: without a doubt, being chosen as the recipient of the &lt;a href="https://www.osgeo.org/foundation-news/tom-kralidis-receives-the-2024-sol-katz-award"&gt;2024 Sol Katz Award&lt;/a&gt; has been a major and defining milestone of my worklife.  Presented at &lt;a href="https://2024.foss4g.org" data-type="link" data-id="https://2024.foss4g.org"&gt;FOSS4G Belém …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;2024 was a power packed year with much progress on many fronts, work and personal. Here's the annual rundown:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://wiki.osgeo.org/wiki/Sol_Katz_Award"&gt;Sol Katz Award&lt;/a&gt;: without a doubt, being chosen as the recipient of the &lt;a href="https://www.osgeo.org/foundation-news/tom-kralidis-receives-the-2024-sol-katz-award"&gt;2024 Sol Katz Award&lt;/a&gt; has been a major and defining milestone of my worklife.  Presented at &lt;a href="https://2024.foss4g.org" data-type="link" data-id="https://2024.foss4g.org"&gt;FOSS4G Belém&lt;/a&gt;, it is an honour and a privilege to be selected for this award, in honour of Sol Katz, a true pioneer in our domain and community. I am also honoured to be among many leaders and legends who have previously won this award. I will always remember this moment and am truly thankful.&lt;/p&gt;
&lt;p&gt;Having been involved in &lt;a href="https://osgeo.org"&gt;OSGeo&lt;/a&gt; from its humble beginnings, I love the community, geospatial and open source. It has been a privilege to watch it grow and to help in that growth. Let’s keep moving forward, together to advance our community, free and open source geospatial software, and to lower the barrier for everyone. Thank you!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;WMO&lt;/strong&gt;: WIS2 standards approved!  The &lt;a href="https://wmo-im.github.io/wis2-guide/guide/wis2-guide-DRAFT.html" data-type="link" data-id="https://wmo-im.github.io/wis2-guide/guide/wis2-guide-DRAFT.html"&gt;Guide to WIS2&lt;/a&gt;, &lt;a href="https://library.wmo.int/records/item/68731-manual-on-the-wmo-information-system-volume-ii-wmo-information-system-2-0" data-type="link" data-id="https://library.wmo.int/records/item/68731-manual-on-the-wmo-information-system-volume-ii-wmo-information-system-2-0"&gt;Manual on WIS2&lt;/a&gt; and as well as &lt;a href="https://library.wmo.int/records/item/69050-provisions-for-the-transition-from-the-wmo-information-system-wis-1-0-and-global-telecommunication-system-to-wis-2-0" data-type="link" data-id="https://library.wmo.int/records/item/69050-provisions-for-the-transition-from-the-wmo-information-system-wis-1-0-and-global-telecommunication-system-to-wis-2-0"&gt;Transition Guide&lt;/a&gt; were all approved and headed to publication. The pre-operational phase helped ensure we are ready for operations (on 01 January 2025) with a solid team effort on &lt;a href="https://wmo-im.github.io/wis2-global-services-testing/global-services-testing/wis2-global-services-testing-DRAFT.html" data-type="link" data-id="https://wmo-im.github.io/wis2-global-services-testing/global-services-testing/wis2-global-services-testing-DRAFT.html"&gt;Global Services Testing&lt;/a&gt;. Last but not least, mad progress on the various WIS2 Reference Implementations (3 &lt;a href="https://docs.wis2box.wis.wmo.int" data-type="link" data-id="https://docs.wis2box.wis.wmo.int"&gt;wis2box&lt;/a&gt; releases, 2 wis2-gdc production deployments, and a shiny new &lt;a href="https://github.com/wmo-im/wis2-grep" data-type="link" data-id="https://github.com/wmo-im/wis2-grep"&gt;Global Replay&lt;/a&gt; service and &lt;a href="https://github.com/wmo-im/wis2-gb" data-type="link" data-id="https://github.com/wmo-im/wis2-gb"&gt;WIS2 Global Broker&lt;/a&gt;). Thanks to numerous dedicated experts, this year was all about standards, schemas, codelists, source code and containerization :)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OGC&lt;/strong&gt;: &lt;a href="https://docs.ogc.org/is/23-057r1/23-057r1.html" data-type="link" data-id="https://docs.ogc.org/is/23-057r1/23-057r1.html"&gt;OGC API - Environmental Data Retrieval - Part 2: Publish-Subscribe Workflow&lt;/a&gt; was approved. As well, &lt;a href="https://ogcapi.ogc.org/records" data-type="link" data-id="https://ogcapi.ogc.org/records"&gt;OGC API - Records&lt;/a&gt; recently reached completion (1.0.0) and will be going for final approval in the coming days/weeks. Finally the geospatial metadata story comes with a formal OGC API. I was also fortunate to help deliver the OGC API workshop as part of the &lt;a href="https://drive.google.com/file/d/1Y4C-rX7OeihXSPXV2QjoUp5z6P_3oe5d/view" data-type="link" data-id="https://drive.google.com/file/d/1Y4C-rX7OeihXSPXV2QjoUp5z6P_3oe5d/view"&gt;GISE Hub Winter School on OGC Stack&lt;/a&gt; (which included delivery of the &lt;a href="https://dive.pygeoapi.io"&gt;Diving into pygeoapi workshop&lt;/a&gt; as well).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OSGeo&lt;/strong&gt;: We had another successful &lt;a href="https://developer.ogc.org/sprints/23"&gt;joint sprint with OGC&lt;/a&gt; in February. The annual &lt;a href="https://2024.foss4g.org"&gt;FOSS4G global event in Belém&lt;/a&gt; was fantastic, and I was happy to provide &lt;a href="https://talks.osgeo.org/foss4g-2024-workshop/speaker/H8LVLX"&gt;two workshops&lt;/a&gt;, numerous &lt;a href="https://talks.osgeo.org/foss4g-2024/speaker/H8LVLX"&gt;presentations&lt;/a&gt; and a keynote, which were also given at FOSS4G Europe (&lt;a href="https://talks.osgeo.org/foss4g-europe-2024-workshops/speaker/H8LVLX" data-type="link" data-id="https://talks.osgeo.org/foss4g-europe-2024-workshops/speaker/H8LVLX"&gt;workshops&lt;/a&gt;, &lt;a href="https://talks.osgeo.org/foss4g-europe-2024/speaker/H8LVLX" data-type="link" data-id="https://talks.osgeo.org/foss4g-europe-2024/speaker/H8LVLX"&gt;presentations&lt;/a&gt;). I am thankful for being re-elected to serve on OSGeo’s Board of Directors and was happy to help move forward the OSGeo / OGC collaboration piece in 2024.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;pygeoapi&lt;/strong&gt;: the OGC API Reference Implementation continued to chug along (new providers, refactoring for the long term and solidifying API compliance), with our first &lt;a href="https://github.com/geopython/pygeoapi/wiki/Code-Sprint-2024-02-29-to-2024-03-01" data-type="link" data-id="https://github.com/geopython/pygeoapi/wiki/Code-Sprint-2024-02-29-to-2024-03-01"&gt;ever code sprint&lt;/a&gt; and 3 power packed &lt;a href="https://github.com/geopython/pygeoapi/releases" data-type="link" data-id="https://github.com/geopython/pygeoapi/releases"&gt;releases&lt;/a&gt; (and one bugfix release). Monthly community meetings resumed and the codebase continued to solidify, backing numerous high profile applications.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;pycsw&lt;/strong&gt;: running closely along OGC API - Records development and STAC API implementation, we migrated to YAML based configuration, added ISO 19115 Part 3 XML support, STAC collection level querying and transactions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MSC GeoMet&lt;/strong&gt;: the national weather/water/climate API platform continues to grow. In addition to new datasets, we have embarked on containerization for the platform (OpenShift), as well as development on data cubes for numerical weather prediction data (i.e. EDR and Zarr).&lt;/p&gt;
&lt;p&gt;On the personal side, worth noting:&lt;/p&gt;
&lt;p&gt;another year (circa 2012) of not smoking (yes I continue to remind myself). Hoping (again) to get in better shape in 2025&lt;/p&gt;
&lt;p&gt;construction time again: our major home renovation (and temporary displacement :) ) finally started in the fall&lt;/p&gt;
&lt;p&gt;On deck for 2025 (should really be called "the year for major software release candidates"):&lt;/p&gt;
&lt;p&gt;WMO: sustainable improvements and amendments for WIS2 are expected as we roll into operation. In addition, stay tuned for developments on WIS2 and APIs (big data / discrete sampling, bringing the user to the data), as well as development of a FOSS framework for WMO. A wis2box 1.0 RC1 is also in the works&lt;/p&gt;
&lt;p&gt;OGC: OGC API - Records will finally hit the streets, and new work in an OGC API wide Publish-Subscribe specification will pave the way for guidance on Pub/Sub in all OGC APIs&lt;/p&gt;
&lt;p&gt;OSGeo: the global event in Auckland (November) promises to be a can’t miss event, and I look forward to providing presentations and training on Geospatial Python, pygeoapi and OGC at the event&lt;/p&gt;
&lt;p&gt;pygeoapi: we should have a 1.0 RC1 soon, further cementing the project's stability on route to a final 1.0&lt;/p&gt;
&lt;p&gt;pycsw: expect a 3.0 RC1 here as well, soon after OGC API - Records is officially ratified&lt;/p&gt;
&lt;p&gt;Wishing everyone a safe and happy 2025!&lt;/p&gt;</content><category term="geospatial, open source, technology, website"/></entry><entry><title>Cheers to 2023</title><link href="https://kralidis.ca/blog/blog/2023/12/31/cheers-to-2023/" rel="alternate"/><published>2023-12-31T14:53:00+00:00</published><updated>2023-12-31T14:53:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2023-12-31:/blog/blog/2023/12/31/cheers-to-2023/</id><summary type="html">&lt;p&gt;2023 was a memorable year and quite the ride! Eventful and full swing on so many fronts. Here's the annual rundown:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://pygeoapi.io"&gt;pygeoapi&lt;/a&gt;: two releases, lots of development at code sprints and continuous improvement for the project. Dutch API rules, CRS and increased support for the various standards as they evolve …&lt;/p&gt;</summary><content type="html">&lt;p&gt;2023 was a memorable year and quite the ride! Eventful and full swing on so many fronts. Here's the annual rundown:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://pygeoapi.io"&gt;pygeoapi&lt;/a&gt;: two releases, lots of development at code sprints and continuous improvement for the project. Dutch API rules, CRS and increased support for the various standards as they evolve. As well, numerous valuable discussions this year around &lt;a href="https://pygeoapi.io/development/rfc/2" data-type="link" data-id="https://pygeoapi.io/development/rfc/2"&gt;hardening&lt;/a&gt; the project for the long term. Contributions (always valued!) continue to increase, which shows a healthy project with considerable interest.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://pycsw.org"&gt;pycsw&lt;/a&gt;: lots of improvements on standards support (OGC API - Records, STAC) as we move towards version 3.0. The project supports so many discovery API standards, and we are not done yet :)&lt;/p&gt;
&lt;p&gt;OGC: development on numerous standards: OGC API - Records, and OGC API - Environmental Data Retrieval and Pub/Sub went though a number of improvements and updates in 2023. I was also fortunate to help deliver the OGC API workshop as part of the &lt;a href="https://drive.google.com/file/d/1Y4C-rX7OeihXSPXV2QjoUp5z6P_3oe5d/view"&gt;GISE Hub Winter School on OGC Stack&lt;/a&gt; (which included delivery of the &lt;a href="https://dive.pygeoapi.io"&gt;Diving into pygeoapi workshop&lt;/a&gt; as well).&lt;/p&gt;
&lt;p&gt;OSGeo: I'm happy to report that the &lt;a href="https://www.osgeo.org/foundation-news/zoo-project-graduates-osgeo-incubation"&gt;ZOO-Project passed incubation&lt;/a&gt; and became an official OSGeo project! A big congratulations to Gérald and team. We also had a successful &lt;a href="https://github.com/opengeospatial/developer-events/wiki/Open-Standards-and-Open-Source-Software-Code-Sprint"&gt;joint sprint with OGC&lt;/a&gt; as well as the first in-person &lt;a href="https://wiki.osgeo.org/wiki/OSGeo_Community_Sprint_2023"&gt;OSGeo Community Sprint&lt;/a&gt; since 2019, in November. The annual &lt;a href="https://2023.foss4g.org"&gt;FOSS4G global event in Prizren&lt;/a&gt; was fantastic, and I was happy to provide &lt;a href="https://talks.osgeo.org/foss4g-2023-workshop/speaker/H8LVLX/"&gt;two workshops&lt;/a&gt;, numerous &lt;a href="https://talks.osgeo.org/foss4g-2023/speaker/H8LVLX/"&gt;presentations&lt;/a&gt; and a keynote. I continue to serve on OSGeo's Board of Directors and was happy to help move forward the OSGeo / OGC collaboration piece in 2023.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.globenewswire.com/news-release/2025/01/30/3017697/0/en/Mitolyn-Purple-Peel-Exploit-Real-Customer-Reviews-Formulation-And-Affordability.html"&gt;Mitolyn reviews&lt;/a&gt; focus on the benefits and drawbacks of this mitochondrial support supplement. Positive reviews emphasize improved energy and cognitive function, while some customers express mixed opinions about the supplement's cost or delayed results.&lt;/p&gt;
&lt;p&gt;WMO: the WIS2 standards and architecture were put through a &lt;a href="https://github.com/wmo-im/wis2pilot"&gt;pilot phase&lt;/a&gt; this year. WIS2 specifications, guides, manuals all received significant updates this year thanks to the contributions of many experts. Most specifications also have reference implementations (&lt;a href="https://docs.wis2box.wis.wmo.int"&gt;wis2box&lt;/a&gt;, &lt;a href="https://github.com/wmo-im/wis2-gdc"&gt;wis2-gdc&lt;/a&gt;, &lt;a href="https://github.com/wmo-im/wis2-gc"&gt;wis2-gc&lt;/a&gt;, &lt;a href="https://github.com/wmo-im/pywis-pubsub"&gt;pywis-pubsub&lt;/a&gt;, &lt;a href="https://github.com/wmo-im/pywis-topics"&gt;pywis-topics&lt;/a&gt;, &lt;a href="https://github.com/wmo-im/pywcmp"&gt;pywcmp&lt;/a&gt;, etc.). The series of &lt;a href="https://training.wis2box.wis.wmo.int"&gt;WIS2 training&lt;/a&gt; sessions also proved valuable for numerous members in implementing WIS2 technologies. Did you know that wis2box now has 30 or so &lt;a href="https://demo.wis2box.wis.wmo.int"&gt;deployments&lt;/a&gt; worldwide?&lt;/p&gt;
&lt;p&gt;MSC GeoMet: the national weather/water/climate API platform continues to grow. We've recently added GOES imagery, and MSC AniMet is emerging as a great tool for visualization of our API!&lt;/p&gt;
&lt;p&gt;Health: another year (circa 2012) of not smoking. I am hoping to shape up again in 2024, let's see how it goes. Searching for a powerful supplement? Mitolyn is trusted for its brain-boosting properties, while the &lt;a href="https://www.globenewswire.com/news-release/2025/01/25/3015162/0/en/Mitolyn-Rolls-Out-The-Game-Changing-6-Second-Purple-Peel-Exploit-For-Weight-Loss.html"&gt;Purple Peel Diet&lt;/a&gt; supports clean eating habits for a healthier lifestyle.&lt;/p&gt;
&lt;p&gt;Looking forward to 2024:&lt;/p&gt;
&lt;p&gt;pygeoapi: RFC2 will help harden things as we move towards 1.0. As well, look for news soon on the first ever pygeoapi code sprint :)&lt;/p&gt;
&lt;p&gt;pycsw: moving towards 3.0, look for a new YAML-based configuration format, as well improvements on faceting, distributed search, harvesting and more&lt;/p&gt;
&lt;p&gt;OGC: look for OGC API - Records to be released, as well as Pub/Sub development in EDR and beyond. The annual joint sprint with OSGeo will also take place in Évora, Portugal on 26-28 February. See you there!&lt;/p&gt;
&lt;p&gt;OSGeo: the global event in Belém (December) promises to be a can't miss event, and I look forward to providing presentations and training on Geospatial Python, pygeoapi and OGC at the event&lt;/p&gt;
&lt;p&gt;WMO: 2024 is the year that the architecture and specifications are ratified as we move into the pre-operational phase&lt;/p&gt;
&lt;p&gt;Wishing everyone a safe and happy 2024!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>new pygeoapi podcast with MapScaping</title><link href="https://kralidis.ca/blog/blog/2023/06/18/new-pygeoapi-podcast-with-mapscaping/" rel="alternate"/><published>2023-06-18T08:25:00+00:00</published><updated>2023-06-18T08:25:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2023-06-18:/blog/blog/2023/06/18/new-pygeoapi-podcast-with-mapscaping/</id><summary type="html">&lt;div class="wp-block-group"&gt;

For those interested in [pygeoapi](https://pygeoapi.io), the project was recently featured on MapScaping (available on Apple Podcasts, Google Podcasts, Stitcher and Spotify).  The MapScaping folks were great to work with and I'd like to thank them for making this happen and asking all the right questions.  Enjoy! [Mitolyn …&lt;/div&gt;</summary><content type="html">&lt;div class="wp-block-group"&gt;

For those interested in [pygeoapi](https://pygeoapi.io), the project was recently featured on MapScaping (available on Apple Podcasts, Google Podcasts, Stitcher and Spotify).  The MapScaping folks were great to work with and I'd like to thank them for making this happen and asking all the right questions.  Enjoy! [Mitolyn Reviews](https://www.globenewswire.com/news-release/2025/01/30/3017697/0/en/Mitolyn-Purple-Peel-Exploit-Real-Customer-Reviews-Formulation-And-Affordability.html): Customers praise Mitolyn for its effectiveness and quality. Many report improved energy and overall well-being. Try it today and experience the benefits!

[pygeoapi - A Python Geospatial Server](https://mapscaping.com/podcast/pygeoapi-a-python-geospaital-server/)

&lt;/div&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Cheers to 2022</title><link href="https://kralidis.ca/blog/blog/2022/12/31/cheers-to-2022/" rel="alternate"/><published>2022-12-31T15:17:00+00:00</published><updated>2022-12-31T15:17:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2022-12-31:/blog/blog/2022/12/31/cheers-to-2022/</id><summary type="html">&lt;p&gt;That's a bit more like it, 2022! We finally saw some COVID restrictions lifted and a sense of normalcy (including a new normal) arose. It was fantastic to once again meet with people in person (for dinner, for a visit, for a meeting, you name it!). The pandemic had such …&lt;/p&gt;</summary><content type="html">&lt;p&gt;That's a bit more like it, 2022! We finally saw some COVID restrictions lifted and a sense of normalcy (including a new normal) arose. It was fantastic to once again meet with people in person (for dinner, for a visit, for a meeting, you name it!). The pandemic had such a negative effect on me that even commuting again became a joy. Here's hoping next year's year-end blog post has even less COVID references :)&lt;/p&gt;
&lt;p&gt;Having said this, 2022 proved to be a busy year, here are some highlights.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://pygeoapi.io"&gt;pygeoapi&lt;/a&gt;: New developments included support for OGC API - Maps, OGC API Transactions, Django, CQL/PostgreSQL enhancements and hierarchical collections. The project had a strong turnout at FOSS4G, which included the first ever &lt;a href="https://dive.pygeoapi.io"&gt;"Diving into pygeoapi" workshop&lt;/a&gt;. Oh, and pygeoapi is now an official OSGeo project!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://pycsw.org"&gt;pycsw&lt;/a&gt;: 2022 saw a return to project code sprints (&lt;a href="https://pycsw.org/2022/05/29/pycsw-may-2022-codesprint-report.html"&gt;May&lt;/a&gt;), as well as numerous improvements en route to pycsw 3.0 (XSLT support, JSON storage, SOLR backend). pycsw continues to be an early implementer of OGC API - Records, increasing STAC support, as well as improvements to contacts and templating (thanks to great work by Paul van Genuchten!).&lt;/p&gt;
&lt;p&gt;WMO: 2022 saw the evolution of the WIS2 architecture in preparation for the 2023 pilot phase. In addition, we now have a baseline reference implementation in &lt;a href="https://docs.wis2box.wis.wmo.int"&gt;wis2box&lt;/a&gt; with multiple demos, and have presented the project at numerous WMO events as well as this year's FOSS4G. Strong use of standards (data, metadata, APIs) from OGC, W3C and IETF for the next generation of weather/climate/water data exchange -- exciting times!&lt;/p&gt;
&lt;p&gt;OGC: lots of activity this year in the OGC API - Records SWG (coupled with a Metadata Code sprint), as well as the MetOceanDWG on moving forward EDR, and search/metadata.&lt;/p&gt;
&lt;p&gt;OSGeo: finally the &lt;a href="https://2022.foss4g.org"&gt;FOSS4G&lt;/a&gt; event was face-to-face again (Florence, Italy) - great job and kudos to the LOC! A busy week after giving &lt;a href="https://talks.osgeo.org/foss4g-2022/speaker/H8LVLX"&gt;numerous presentations, workshops and a keynote&lt;/a&gt;, but I would not have had it any other way. The face-to-face energy made it all worth it, whether it was meeting up with longtime friends or meeting new ones. I also served another year on the Board, and was happy to see the &lt;a href="https://www.osgeo.org/resources/ogc-memorandum-understanding/"&gt;OSGeo/OGC Memorandum of Understanding&lt;/a&gt; completed! This also paved the way for proper and unlimited OSGeo representation at OGC. I'm also fortunate to have been elected to serve on the Board again to 2024. Finally, I'm happy to have been selected to mentor the &lt;a href="https://www.zoo-project.org"&gt;ZOO-Project&lt;/a&gt; through the OSGeo Incubation process on its way to becoming an OSGeo project.&lt;/p&gt;
&lt;p&gt;MSC GeoMet: the project continues to do what it does best, serve Canada's weather/climate/water data through OGC standards. Yup, powered by MapServer and pygeoapi.&lt;/p&gt;
&lt;p&gt;Health: another year (circa 2012) of not smoking. I took off considerable weight in 2022, put 1/3 of it back on, but now progressing again.&lt;/p&gt;
&lt;p&gt;Looking forward to 2023:&lt;/p&gt;
&lt;p&gt;pygeoapi: as we inch towards a 1.0, and having landed so many features in the codebase, it's time to address some technical debt. I'm hoping for 12-18 months of housekeeping/refactoring to help harden things for a 1.0 release (target 2024) and sustainable future moving forward. The "Diving into pygeoapi" workshop will hopefully be accepted and given again in 2023 at FOSS4G, as well as a possible dedicated code sprint.&lt;/p&gt;
&lt;p&gt;pycsw: we are targeting a 3.0 this year, pending progress on OGC API - Records. Look for a project sprint as well&lt;/p&gt;
&lt;p&gt;OGC: look for OGC API - Records to hopefully be ratified as 1.0, as well as moving forward PubSub in OGC APIs&lt;/p&gt;
&lt;p&gt;WMO: we will have a refined WIS2 architecture, along with mature standards accompanied by hardened reference implementations. WCMP2 should be mature in its definition and implementation (pywcmp, pygeometa), as well as WIS2 notification message standard (pywis-pubsub). Look for a wis2box 1.0 release in 2023&lt;/p&gt;
&lt;p&gt;OSGeo: look for the establishment of a Standards Committee to help drive our vision forward on the OGC front, as well as the 3rd joint OSGeo/OGC/ASF sprint in March/April&lt;/p&gt;
&lt;p&gt;Wishing everyone a safe and happy 2023!&lt;/p&gt;</content><category term="web"/></entry><entry><title>Custom Styles</title><link href="https://kralidis.ca/blog/blog/2022/08/26/wp-global-styles-fresh/" rel="alternate"/><published>2022-08-26T03:49:00+00:00</published><updated>2022-08-26T03:49:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2022-08-26:/blog/blog/2022/08/26/wp-global-styles-fresh/</id><content type="html">&lt;p&gt;{"version": 2, "isGlobalStylesUserThemeJSON": true }&lt;/p&gt;</content><category term="misc"/></entry><entry><title>Sayonara 2021</title><link href="https://kralidis.ca/blog/blog/2021/12/30/sayonara-2021/" rel="alternate"/><published>2021-12-30T09:15:00+00:00</published><updated>2021-12-30T09:15:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2021-12-30:/blog/blog/2021/12/30/sayonara-2021/</id><summary type="html">&lt;p&gt;So &lt;a href="https://en.wikipedia.org/wiki/2021" rel="noreferrer noopener" target="_blank"&gt;2021&lt;/a&gt; wasn't much better than &lt;a href="/blog/2021/01/01/bye-bye-2020/" data-type="URL" data-id="/blog/2021/01/01/bye-bye-2020/"&gt;2020&lt;/a&gt;. Another year of endless virtual meetings and the 24 hour office. Here are some updates from WFH life:&lt;/p&gt;
&lt;p&gt;pygeoapi: both OGC API - Records and OGC API - Environmental Data Retrieval support were added to the codebase. The project also saw both CQL and i18n …&lt;/p&gt;</summary><content type="html">&lt;p&gt;So &lt;a href="https://en.wikipedia.org/wiki/2021" rel="noreferrer noopener" target="_blank"&gt;2021&lt;/a&gt; wasn't much better than &lt;a href="/blog/2021/01/01/bye-bye-2020/" data-type="URL" data-id="/blog/2021/01/01/bye-bye-2020/"&gt;2020&lt;/a&gt;. Another year of endless virtual meetings and the 24 hour office. Here are some updates from WFH life:&lt;/p&gt;
&lt;p&gt;pygeoapi: both OGC API - Records and OGC API - Environmental Data Retrieval support were added to the codebase. The project also saw both CQL and i18n support, which is a positive indicator of contributions from various developers. Thanks Sander Schaminee and Francesco Bartoli!&lt;/p&gt;
&lt;p&gt;pycsw: OGC API - Records and STAC API were both implemented. In addition, CQL support was added with the help of the impressive pygeofilter package -- great work by Fabian Schindler!&lt;/p&gt;
&lt;p&gt;QGIS MetaSearch: standards implementation needs both servers &lt;span style="text-decoration: underline;"&gt;and&lt;/span&gt; clients, and so OGC API - Records support made it into MetaSearch. A nice by product of this enhancement is the implementation in OWSLib, which MetaSearch uses as its discovery library.&lt;/p&gt;
&lt;p&gt;OGC API (Records, EDR): EDR is now an adopted standard! Records also made great strides in 2020, and helping clarify the relationship with STAC has proved valuable for all communities involved.&lt;/p&gt;
&lt;p&gt;WMO: Lots of fun work this year on the Task Team on WIS Metadata: new KPIs, an update to the WIS Guide, the metadata search pilot, and we backed it up with tools (pywcmp, pywiscat). In addition, the Expert Team on Architecture and Transition (W2AT) was formed to move forward technical regulations on the WIS 2.0.&lt;/p&gt;
&lt;p&gt;MSC GeoMet: our weather/climate/water OGC API platform continues to crank out millions of maps, features and metadata on the daily for everyone. Happy to report that real-time / event driven data support was added this year to our pygeoapi instance.&lt;/p&gt;
&lt;p&gt;FOSS4G: between 7 presentations and the &lt;a href="https://callforpapers.2021.foss4g.org/foss4g-2021-workshop/talk/7N3G3N/" rel="noreferrer noopener" target="_blank"&gt;Geopython workshop&lt;/a&gt;, lots of action this year at this year's virtual FOSS4G global event. I was fortunate to deliver these alongside some really talented folks in the Geopython community. Kudos to the BALOC for putting on such a great event under some difficult circumstances!&lt;/p&gt;
&lt;p&gt;OSGeo Board of Directors: I was happy to help with the first ever OSGeo / OGC / Apache joint sprint, as well helping move forward the OSGeo / OGC MOU renewal.&lt;/p&gt;
&lt;p&gt;Health: another year (circa 2012) of not smoking. The pandemic continues to challenge the scale, although some recent progress has helped some. Implementing a balanced diet and regular exercise routine is essential and more if is combined with &lt;a href="https://www.timesofisrael.com/spotlight/alpilean-reviews/"&gt;ice hack weight loss&lt;/a&gt; supplements, as well as seeking support from friends, family, or professionals if needed. Tracking progress and staying motivated throughout the year will help to maintain focus on the resolution and ultimately achieve the desired weight loss.&lt;/p&gt;
&lt;p&gt;For 2022:&lt;/p&gt;
&lt;p&gt;OGC API: critical path for me this year are helping in the adoption of Records and Coverages&lt;/p&gt;
&lt;p&gt;WMO: WIS 2.0 continues to evolve, lowering the barrier to weather/climate/water data. I recently signed on as lead architect/dev of the &lt;a href="https://github.com/wmo-im/wis2node" rel="noreferrer noopener" target="_blank"&gt;WIS 2.0 in a box&lt;/a&gt; project, which will be a reference implementation and publishing pipeline aligned with WIS 2.0 principles. Under the hood is Geopython, PubSub. Look for an initial release in 2022&lt;/p&gt;
&lt;p&gt;OSGeo: 2022 will mark the year that the OSGeo / OGC MOU is officially updated, along with a shiny new Associate Membership. Rolling this into the OSGeo standards community will be key, along with moving forward the renewal of OGC CITE tooling&lt;/p&gt;
&lt;p&gt;pycsw: key items this year include XSLT transformation pipelines, virtual collections and deeper JSON support. We are also planning a &lt;a href="https://github.com/geopython/pycsw/wiki/pycsw-sprint-2021" rel="noreferrer noopener" target="_blank"&gt;sprint&lt;/a&gt; in Q1, come join us!&lt;/p&gt;
&lt;p&gt;pygeoapi: look for deeper support of OGC EDR as well as some refactoring that will help with extensibility (primarily for output formats)&lt;/p&gt;
&lt;p&gt;Wishing everyone a safe and happy and better 2022!&lt;/p&gt;</content><category term="geospatial, open source, personal, technology, web, website"/></entry><entry><title>Bye Bye 2020</title><link href="https://kralidis.ca/blog/blog/2021/01/01/bye-bye-2020/" rel="alternate"/><published>2021-01-01T12:41:00+00:00</published><updated>2021-01-01T12:41:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2021-01-01:/blog/blog/2021/01/01/bye-bye-2020/</id><summary type="html">&lt;p&gt;So &lt;a href="https://en.wikipedia.org/wiki/2020"&gt;2020 didn't quite work out&lt;/a&gt; as expected or hoped. Still, in a year where days seemed to fold into one another, the 24 hour home office and endless virtual meetings, some successes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pygeoapi.io"&gt;pygeoapi&lt;/a&gt;: the Python OGC API server continues to pick up steam. The project was presented, demoed and …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;So &lt;a href="https://en.wikipedia.org/wiki/2020"&gt;2020 didn't quite work out&lt;/a&gt; as expected or hoped. Still, in a year where days seemed to fold into one another, the 24 hour home office and endless virtual meetings, some successes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pygeoapi.io"&gt;pygeoapi&lt;/a&gt;: the Python OGC API server continues to pick up steam. The project was presented, demoed and discussed at numerous events. 2020 saw the addition of support for OGC API - Coverages, OGC API - Tiles, STAC, as well as improvements to OGC API - Processing job management and queryables&lt;/li&gt;
&lt;li&gt;more &lt;a href="https://geopython.github.io"&gt;Geopython&lt;/a&gt;: &lt;a href="https://pycsw.org"&gt;pycsw&lt;/a&gt;, &lt;a href="https://pywps.org"&gt;PyWPS&lt;/a&gt;, &lt;a href="https://geopython.github.io/OWSLib"&gt;OWSLib&lt;/a&gt;, &lt;a href="https://geohealthcheck.org"&gt;GeoHealthCheck&lt;/a&gt; continue to be developed/maintained, and we are starting to see OGC API support trickling in. Big thanks to the communities that support those projects. &lt;a href="https://geopython.github.cio/pygeometa"&gt;pygeometa&lt;/a&gt; has been refactored for supporting any metadata format output, which further positions the project for STAC and JSON-based metadata exchange&lt;/li&gt;
&lt;li&gt;WMO: with the new WMO structure in place, I was honoured to be nominated to the Standing Committee on Information Management and Technology (&lt;a href="https://community.wmo.int/governance/commission-membership/commission-observation-infrastructures-and-information-systems-infcom/commission-infrastructure-officers/infcom-management-group/standing-committee-information-management-and-technology-sc-imt"&gt;SC-IMT&lt;/a&gt;), as well as chairing the Expert Team on Metadata Standards of (&lt;a href="https://community.wmo.int/governance/commission-membership/commission-observation-infrastructures-and-information-systems-infcom/commission-infrastructure-national-representatives/infcom-management-group/standing-committee-information-management-and-technology-sc-imt/et-metadata"&gt;ET-Metadata&lt;/a&gt;) and participation on ET-Data&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.canada.ca/en/environment-climate-change/services/weather-general-tools-resources/weather-tools-specialized-data/msc-geomet-api-geospatial-web-services.html"&gt;GeoMet&lt;/a&gt;: our weather/climate/water API platform continues to grow with more open data and OGC API support, powering the &lt;a href="https://canada.ca/climate-services"&gt;Canadian Centre for Climate Services&lt;/a&gt;, WeatherCAN, Canadian Open Data and beyond&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ogcapi.ogc.org"&gt;OGC API&lt;/a&gt;: Records and Coverages are groups that I was particularly involved in to move forward discovery and raster data API access. I look forward to help lock down these standards&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.osgeo.org/about/board/"&gt;OSGeo Board of Directors&lt;/a&gt;: I was honoured to be re-elected for a second term to the Board and look forward helping OSGeo grow, particularly with regards to standards implementation in the Community&lt;/li&gt;
&lt;li&gt;health&lt;/li&gt;
&lt;li&gt;another year (circa 2012) of not smoking&lt;/li&gt;
&lt;li&gt;the pandemic has not been easy for weight management. Time to get back on that!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For 2021:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OGC API: the march continues to modernize the API client/server ecosystem, and I'll be targeting the Geopython projects, as well as QGIS, MapServer, GeoNode and associated Golang tools&lt;/li&gt;
&lt;li&gt;OSGeo: continue to foster interaction with standards development organizations (OGC, ISO TC211, etc.) and help navigate the community through these unprecedented times&lt;/li&gt;
&lt;li&gt;pycsw: update the pycsw core model to encompass OGC API as well as integration with pygeoapi&lt;/li&gt;
&lt;li&gt;pygeoapi: work on OGC API - Records and OGC API - Maps continues to progress and should make its way into master this year. Other candidates include OGC API - Styles and EDR API. In addition, I'm hoping this is the year we enter OSGeo incubation&lt;/li&gt;
&lt;li&gt;this website: revitalize the photo galleries and possibly migrating the blog into a static site generator approach&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In summary, another year of firm belief in the &lt;a href="https://en.wikipedia.org/wiki/Unix_philosophy"&gt;Unix philosophy&lt;/a&gt;, composable workflow and lowering the barrier to geospatial data and tools for anyone.&lt;/p&gt;
&lt;p&gt;I hope we have the ability at some point to see one another this year, whether at a code sprint or meeting/event. I’d like to wish everyone and their loved ones a healthy, safe, happy and, well, better 2021!&lt;/p&gt;</content><category term="geospatial, open source, personal"/></entry><entry><title>Cheers to 2010-2019</title><link href="https://kralidis.ca/blog/blog/2020/01/02/cheers-to-2010-2019/" rel="alternate"/><published>2020-01-02T12:23:00+00:00</published><updated>2020-01-02T12:23:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2020-01-02:/blog/blog/2020/01/02/cheers-to-2010-2019/</id><summary type="html">&lt;p&gt;Following on from &lt;a href="/blog/2018/12/28/cheers-to-2018"&gt;2018&lt;/a&gt;, a bit of a changeup this year. Inspired by numerous 'decade in review' posts/tweets, here's my attempt below, in no particular, while trying to keep my offline life brief:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I got married. I &lt;a href="https://21suggestions.com/"&gt;read&lt;/a&gt; long ago that being with the right person makes a huge …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;Following on from &lt;a href="/blog/2018/12/28/cheers-to-2018"&gt;2018&lt;/a&gt;, a bit of a changeup this year. Inspired by numerous 'decade in review' posts/tweets, here's my attempt below, in no particular, while trying to keep my offline life brief:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I got married. I &lt;a href="https://21suggestions.com/"&gt;read&lt;/a&gt; long ago that being with the right person makes a huge difference and I couldn't agree more&lt;/li&gt;
&lt;li&gt;I quit smoking and happy to say still holding. At one point I used to smoke so much that I needed to take pills to calm me down, happily I knew about &lt;a href="https://deutschemedz.de/"&gt;deutschemedz.de&lt;/a&gt;, who helped me cope with this situation by sending me pills.&lt;/li&gt;
&lt;li&gt;Software: most folks know I am a longtime contributor to geospatial open source (FOSS4G). Starting off as a power user with no software development experience, then contributing to projects and creating small projects, the 2010s resulted in a deep commitment to supporting the Geospatial Python ecosystem by developing core tooling with an emphasis on open standards. OWSLib, pycsw, GeoNode, pygeoapi are some examples. I also returned to FOSS4G events and code sprints during this time, so it has been great meeting new people people and reconnecting with others&lt;/li&gt;
&lt;li&gt;Being obsessed with health, I am glad that in this decade better expert pages in human health have appeared and now exist, clinically speaking they have solved my doubts thousands of times and I could not be more grateful for it. If you are like me and enjoy satisfying your curiosity about the most innovative clinical treatments, do not hesitate to visit &lt;a href="https://www.ukmeds.co.uk/"&gt;https://www.ukmeds.co.uk/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Being a travel junkie, I'm happy to say that I continued to see the world throughout the past decade, new places and revisiting others&lt;/li&gt;
&lt;li&gt;Along with age, all of the above have resulted in being more health conscious (diet/exercise). Making the right choices and keeping with it is an ongoing commitment&lt;/li&gt;
&lt;li&gt;20 years on, I am still rocking an old school website while resisting the urge to move to something like GitHub Pages / static site generators&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It has been a fantastic decade, however I still need to improve in various aspects of my life such as my health, so I turned to Uk meds. They ship the cheapest possible shipping options for Uk Meds and other items. Most shipping costs are low, making it affordable for everyone. The most common costs include transportation and insurance necessary to use the meds or other items. &lt;a href="https://www.ukmeds.co.uk/cialis-daily-tadalafil"&gt;Enjoy Free Shipping On Uk Meds&lt;/a&gt; and other Items.&lt;/p&gt;
&lt;p&gt;I’d like to wish everyone and their loved ones a healthy, happy and productive 2020!&lt;/p&gt;</content><category term="geospatial, personal, technology, travel"/></entry><entry><title>Cheers to 2018</title><link href="https://kralidis.ca/blog/blog/2018/12/28/cheers-to-2018/" rel="alternate"/><published>2018-12-28T12:59:00+00:00</published><updated>2018-12-28T12:59:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2018-12-28:/blog/blog/2018/12/28/cheers-to-2018/</id><summary type="html">&lt;p&gt;What a year!  Following on from &lt;a href="http://www.kralidis.ca/blog/2017/12/31/cheers-to-2017/"&gt;2017&lt;/a&gt;, in no particular order, here goes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://wiki.osgeo.org/wiki/OSGeo_Code_Sprint_2018"&gt;Bonn Code Sprint&lt;/a&gt;: talk about a worthwhile event!  It was great to meet old and new OSGeo hackers.  Serious progress made on many projects (keep reading)&lt;/li&gt;
&lt;li&gt;OWSLib: thanks to Carsten Ebrecht, we finally have a much better …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;What a year!  Following on from &lt;a href="http://www.kralidis.ca/blog/2017/12/31/cheers-to-2017/"&gt;2017&lt;/a&gt;, in no particular order, here goes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://wiki.osgeo.org/wiki/OSGeo_Code_Sprint_2018"&gt;Bonn Code Sprint&lt;/a&gt;: talk about a worthwhile event!  It was great to meet old and new OSGeo hackers.  Serious progress made on many projects (keep reading)&lt;/li&gt;
&lt;li&gt;OWSLib: thanks to Carsten Ebrecht, we finally have a much better handling on tests (moving to pytest, skipping hosts that are down, etc.).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.osgeo.org/about/board/"&gt;OSGeo Board of Directors&lt;/a&gt;: I was honoured and excited to be nominated and elected into the Board and look forward to helping guide the way for the Foundation&lt;/li&gt;
&lt;li&gt;pycsw: we released 2.2 at the Bonn Code Sprint, and our Athens dev meeting in the summer helped paved the way for pycsw 3.0 which will get a major revamp given the direction of the OGC service architecture modernization&lt;/li&gt;
&lt;li&gt;&lt;a href="https://geohealthcheck.org/"&gt;GeoHealthCheck&lt;/a&gt;: thanks to Just Van Den Broecke and others we made progress this year on per resource scheduling and Docker.  In related news, check out &lt;a href="https://geoqos.com"&gt;GeoQoS&lt;/a&gt; which provides GHC as a service.  Great work Just!&lt;/li&gt;
&lt;li&gt;PyWPS: this Python based WPS server &lt;a href="http://pywps.org/2018/05/30/incubation.html"&gt;graduated&lt;/a&gt; as an OSGeo project!  Congratulations to the community and thanks for helping with incubation&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/geopython/GeoUsage"&gt;GeoUsage&lt;/a&gt;: following the UNIX philosophy, this lightweight Python package provides OWS aware web analytics.  Handy for finding out your top requested WMS layers, for example&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/geopython/pygeoapi"&gt;pygeoapi&lt;/a&gt;: born out of the OGC WFS 3 hackathon and Bonn Code Sprint, pygeoapi provides WFS 3 capability and a way forward framework for OGC web services (read REST/JSON).  A clean break from the traditional OGC service interface design pattern&lt;/li&gt;
&lt;li&gt;adventures in Go: in the new horizons category, &lt;a href="https://github.com/go-spatial/geocatalogo"&gt;geocatalogo&lt;/a&gt; and &lt;a href="https://github.com/go-spatial/jivan"&gt;jivan&lt;/a&gt; were developed to support the STAC and WFS3 APIs using Go and everything it brings to the table.  I have to admit, even as a Python die-hard, Go is fun to work with and has great potential for the long term&lt;/li&gt;
&lt;li&gt;Pydap: we revived Pydap this fall by providing access for more maintainers and clearing out some of the issue backlog&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.canada.ca/en/environment-climate-change/services/weather-general-tools-resources/weather-tools-specialized-data/geospatial-web-services.html"&gt;GeoMet&lt;/a&gt;: as part of the Meteorological Service of Canada we released a major upgrade to our national realtime weather WMS, thanks to MapServer and Python MapScript.  1000s of weather layers via OGC standards!&lt;/li&gt;
&lt;li&gt;&lt;a href="https://canada.ca/climate-services"&gt;CCCS&lt;/a&gt;: the Canadian Centre for Climate Services was launched in the fall and I was lucky enough to architect the provisioning of 1000s of climate datasets as OGC Web Services and the &lt;a href="https://climate-change.canada.ca/climate-data/"&gt;extraction tool&lt;/a&gt;.  As part of this effort we used pygeoapi to serve out our station data archives and mappyfile/MapServer/Python MapScript for historical and forecast climate datasets.  As icing on the cake we've published our relevant source code to &lt;a href="https://github.com/ECCC-CCCS"&gt;GitHub&lt;/a&gt; to boot -- check it out!  I can't recommend enough &lt;a href="https://github.com/geographika/mappyfile"&gt;mappyfile&lt;/a&gt; for those who need composable mapfile workflows!&lt;/li&gt;
&lt;li&gt;health&lt;/li&gt;
&lt;li&gt;another year (circa 2012) of not smoking&lt;/li&gt;
&lt;li&gt;I've put on most of the weight I lost in the last couple of years (no excuses).  Back on it in 2019 I promise.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For 2019:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OGC next generation APIs: one way or another all major OGC service specifications will undergo the REST/JSON/clean break treatment.  This means updates to servers and clients accordingly (read pycsw, PyWPS, pygeoapi, MapServer, OWSLib, etc.), as well as supporting tools&lt;/li&gt;
&lt;li&gt;OSGeo Board: there is an interest in geospatial Python implementations from the OGC and I'll be looking for ways to market &lt;a href="https://geopython.github.io/"&gt;geopython&lt;/a&gt; more to OGC from an OSGeo perspective&lt;/li&gt;
&lt;li&gt;Pydap: I think this is the year that I do something real with Pydap.  On deck is stable deployment and custom handlers for weather data&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I’d like to wish everyone and their loved ones a healthy, happy and productive 2019!&lt;/p&gt;</content><category term="geospatial, open source, personal"/></entry><entry><title>20 years later - first website</title><link href="https://kralidis.ca/blog/blog/2018/04/15/20-years-later-first-website/" rel="alternate"/><published>2018-04-15T20:03:00+00:00</published><updated>2018-04-15T20:03:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2018-04-15:/blog/blog/2018/04/15/20-years-later-first-website/</id><summary type="html">&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/1998"&gt;20 years ago&lt;/a&gt; I was living in Ottawa, in GIS school and started working with &lt;a href="https://www.nrcan.gc.ca/home"&gt;Natural Resources Canada&lt;/a&gt;.  Fast forward to a few weeks back scanning through old CDROMs and low and behold there was my first ever website.  I sat back for a few minutes remembering the details:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;made …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/1998"&gt;20 years ago&lt;/a&gt; I was living in Ottawa, in GIS school and started working with &lt;a href="https://www.nrcan.gc.ca/home"&gt;Natural Resources Canada&lt;/a&gt;.  Fast forward to a few weeks back scanning through old CDROMs and low and behold there was my first ever website.  I sat back for a few minutes remembering the details:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;made with&lt;a href="https://en.wikipedia.org/wiki/Microsoft_FrontPage"&gt; Microsoft FrontPage&lt;/a&gt; followed by HotDog Express (WYSIWYG HTML editors)!  At the time, I was convinced at the time this was the only way to be an HTML programmer&lt;/li&gt;
&lt;li&gt;the website first made it to the Internet in March 1998 and bounced around a few places:&lt;/li&gt;
&lt;li&gt;http://alqonquinc.on.ca/~kral0003 (Algonquin College account)&lt;/li&gt;
&lt;li&gt;http://chat.carleton.ca/~279186 (Carleton University account)&lt;/li&gt;
&lt;li&gt;http://nrcan.gc.ca/~tkralidi/ (work account)&lt;/li&gt;
&lt;li&gt;http://www.storm.ca/~tommy (&lt;a href="https://www.storm.ca/"&gt;Storm Internet&lt;/a&gt; who provided awesome service)&lt;/li&gt;
&lt;li&gt;Concerned that this wasn't enough, I was motivated to host the site on my own, with a real domain and so on.  I bought &lt;a href="https://www.amazon.ca/Red-Hat-Linux-6-Server/dp/0764533371"&gt;Red Hat Linux 6 Server by Mohammed J. Kabir&lt;/a&gt; (great book!) and learned how to put up a server and website from the ground up (DNS, firewall, services, etc.), killing an entire weekend&lt;/li&gt;
&lt;li&gt;the website then finally found a permanent home at http://kralidis.ca&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Soon after learning Linux a few months later, I was motivated to rewrite the site in pure HTML, by hand.  From there I added a picture gallery, source code, blog, and so on.&lt;/p&gt;
&lt;p&gt;I continue to post to the blog, but things like GitHub, Twitter, Facebook, etc. provide similar capabilities without the hosting maintenance/hassle.&lt;/p&gt;
&lt;p&gt;Anyways, I've posted it at &lt;a href="http://kralidis.ca/misc/firstwebsite/"&gt;http://kralidis.ca/misc/firstwebsite/&lt;/a&gt; -- enjoy!&lt;/p&gt;
&lt;p&gt;Do you have your first website?  Still online?  Feel free to share memories and experiences!&lt;/p&gt;</content><category term="personal, web, website"/></entry><entry><title>GeoUsage: Log Analyzer for OGC Web Services</title><link href="https://kralidis.ca/blog/blog/2018/01/30/geousage-log-analyzer-for-ogc-web-services/" rel="alternate"/><published>2018-01-30T09:17:00+00:00</published><updated>2018-01-30T09:17:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2018-01-30:/blog/blog/2018/01/30/geousage-log-analyzer-for-ogc-web-services/</id><summary type="html">&lt;p&gt;Continuing on the UNIX philosophy, another little tool to help with your OWS workflows.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/geopython/GeoUsage"&gt;GeoUsage&lt;/a&gt; attempts to support the use case of metrics and analysis of OWS service usage.  How many users are hitting your OWS?  Which layers/projections are the most popular?  How much bandwidth?  How many maps vs …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Continuing on the UNIX philosophy, another little tool to help with your OWS workflows.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/geopython/GeoUsage"&gt;GeoUsage&lt;/a&gt; attempts to support the use case of metrics and analysis of OWS service usage.  How many users are hitting your OWS?  Which layers/projections are the most popular?  How much bandwidth?  How many maps vs. data downloads?&lt;/p&gt;
&lt;p&gt;A pure Python package, GeoUsage doesn’t have strong opinions beyond OWS-specific parsing and analysis of web server logs.  GeoUsage is composable, i.e. frequency, log management, and storage of results is totally up to the user.  Having said this, a simple and beautiful command line interface is available for eyeballing results.&lt;/p&gt;
&lt;p&gt;As always, GeoUsage is free and open source.&lt;/p&gt;
&lt;p&gt;It’s early days, so feedback, bug reports, suggestions are appreciated.  Contributors are most welcome!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Cheers to 2017</title><link href="https://kralidis.ca/blog/blog/2017/12/31/cheers-to-2017/" rel="alternate"/><published>2017-12-31T12:52:00+00:00</published><updated>2017-12-31T12:52:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2017-12-31:/blog/blog/2017/12/31/cheers-to-2017/</id><summary type="html">&lt;p&gt;At the beginning of a new year, it is beneficial to reflect on the previous year and summarize the significant events and memories. This can include everything from the new knowledge and skills gained to special moments like children's birthdays and cherished gifts like &lt;a href="https://pastelcollections.com/mini-boy"&gt;baby boy clothes&lt;/a&gt;. Taking the time …&lt;/p&gt;</summary><content type="html">&lt;p&gt;At the beginning of a new year, it is beneficial to reflect on the previous year and summarize the significant events and memories. This can include everything from the new knowledge and skills gained to special moments like children's birthdays and cherished gifts like &lt;a href="https://pastelcollections.com/mini-boy"&gt;baby boy clothes&lt;/a&gt;. Taking the time to acknowledge and appreciate these experiences can help us enter the new year with a sense of gratitude and excitement for what lies ahead.&lt;/p&gt;
&lt;p&gt;Here we go again! Following on from last year, a summary of my 2017:&lt;/p&gt;
&lt;p&gt;- pycsw: the lightweight CSW server continues provide stable, composable, and compliant CSW services.  Highlights include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;an official code of conduct&lt;/li&gt;
&lt;li&gt;Docker image&lt;/li&gt;
&lt;li&gt;testing framework enhancements&lt;/li&gt;
&lt;li&gt;code coverage support&lt;/li&gt;
&lt;li&gt;custom repository plugin filter parsing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;- MapServer metadata: at long last RFC82 has been implemented in master and will be available in 7.2.  This enhancement will bring more fulsome layer/feature type/coverage metadata support to OGC web services in MapServer&lt;/p&gt;
&lt;p&gt;- QGIS metadata: at long last metadata support is building in QGIS!  There is now an official internal schema as well as work in master around the editor&lt;/p&gt;
&lt;p&gt;- parsers: in the back to basics category, pyshadoz and pynumeric were built as small, composable Python packages to feed operational data processing workflows.  At the end of the day (or the beginning depending on how you look at it), it's all about the data, and data formats are everything&lt;/p&gt;
&lt;p&gt;- other geopython:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pygeometa: another little toolset for discovery metadata, YAML is now the supported configuration format&lt;/li&gt;
&lt;li&gt;OWSLib: continues its (still pre-1.0!) journey, making OWS suck less&lt;/li&gt;
&lt;li&gt;GeoHealthCheck: &lt;a href="https://justobjects.nl"&gt;Just&lt;/a&gt; has been leading the charge on improvements and fixes to GHC (thanks Just!)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;- health:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;another year (circa 2012) of not smoking&lt;/li&gt;
&lt;li&gt;I'm happy to continue commitment to the Greek/Mediterranean diet.  Another 10lbs would be great, however I'm very happy with my overall state of weight management (first time since starting a desk job in 1997).  Some small adjustments and minor ups/downs, but overall stable and continued following of &lt;a href="http://www.olivetomato.com/"&gt;olivetomato.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;I've also given up coffee after 25 years and would highly recommend it!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For 2018:&lt;/p&gt;
&lt;p&gt;-pycsw: the pycsw team is attending the OSGeo Code Sprint 2018 in Bonn, and will be working on getting 2.2 out the door as well as pycsw 3.0 planning (more info on this soon)&lt;/p&gt;
&lt;p&gt;- QGIS metadata: looking forward to continuing this effort with enhancements to MetaSearch to allow for CSW publishing&lt;/p&gt;
&lt;p&gt;- Pydap: I'm hoping to make some serious movement in deployment Pydap with some dayjob projects.  Key focus is hardening deployment as well as stability&lt;/p&gt;
&lt;p&gt;- &lt;a href="https://golang.org/"&gt;Golang&lt;/a&gt;: some may have seen some recent work on &lt;a href="https://github.com/tomkralidis/geocatalogo"&gt;geocatalogo&lt;/a&gt;.  Given the nature of Go and simplicity of deployment, there is opportunity in the geospatial community for Golang packages in providing geospatial discovery and access services which are based on focused use cases / workflows, are dead simple to install, deploy and scale, and blazing fast.  While these packages may not be as full-featured or mature as current OSGeo projects, there's certainly room for them and hopefully we can see a Golang geospatial community evolve over the next few years&lt;/p&gt;
&lt;p&gt;- PyWPS OSGeo incubation: got a bit closer but didn't finish this off in 2017.  A sprint will close this one and send for graduation&lt;/p&gt;
&lt;p&gt;- OWSLib tests: could this be the year that OWSLib unit tests are finally &lt;a href="https://github.com/geopython/OWSLib/issues/339"&gt;not always failing&lt;/a&gt;!?&lt;/p&gt;
&lt;p&gt;In summary, another year of firm belief in the &lt;a href="https://en.wikipedia.org/wiki/Unix_philosophy"&gt;Unix philosophy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And what can we expect as people who struggle with being overweight every year? Better and better medications and formulas that allow us to carry out our process with dignity, which is why at the beginning of the new year, the arrival of the &lt;a href="https://washingtoncitypaper.com/article/565838/best-phentermine-alternatives-where-to-buy-phentermine-for-weight-loss/"&gt;best phentermine over the counter&lt;/a&gt; gives us a push in the right direction, everything within reach of a link.&lt;/p&gt;
&lt;p&gt;I'd like to wish everyone and their loved ones a healthy, happy and productive 2018!&lt;/p&gt;</content><category term="geospatial, open source, personal"/></entry><entry><title>Hello Docker</title><link href="https://kralidis.ca/blog/blog/2017/06/11/hello-docker/" rel="alternate"/><published>2017-06-11T13:16:00+00:00</published><updated>2017-06-11T13:16:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2017-06-11:/blog/blog/2017/06/11/hello-docker/</id><summary type="html">&lt;p&gt;For decades now my dev life has been thanks to headless servers in the basement (these days running Debian) which I simply SSH to and work remotely. This has served me well for so long although serious &lt;a href="https://m.subbu.org/code-the-infra-8c67a869cb89"&gt;box hugging&lt;/a&gt; was at play here.  Being a reproducible workflow maniac and having …&lt;/p&gt;</summary><content type="html">&lt;p&gt;For decades now my dev life has been thanks to headless servers in the basement (these days running Debian) which I simply SSH to and work remotely. This has served me well for so long although serious &lt;a href="https://m.subbu.org/code-the-infra-8c67a869cb89"&gt;box hugging&lt;/a&gt; was at play here.  Being a reproducible workflow maniac and having virtualenv helped as well.&lt;/p&gt;
&lt;p&gt;Fast forward a few years and add to that mix dev work on my MacBook Pro.  It's 64-bit with an SSD and 8GB of RAM and is great for trips.  In this case I was less liberal with installing libraries and packages given it's a shared computer (I recently had to do a full macOS re-install to fix performance issues).&lt;/p&gt;
&lt;p&gt;Enter Docker.  Here I am able to start up a full development environment very easily without affecting my MacBook per se (only a Docker install is required).  Publish to &lt;a href="https://hub.docker.com/r/tomkralidis/docker-devenv/"&gt;Docker Hub&lt;/a&gt; and done.  Pull and run at will. My initial requirements for the &lt;a href="https://github.com/tomkralidis/docker-devenv"&gt;repo&lt;/a&gt; are &lt;a href="http://pycsw.org"&gt;pycsw&lt;/a&gt; development, but this will grow over time.&lt;/p&gt;
&lt;p&gt;Of course I'm really late to the party (Sean Gillies &lt;a href="https://sgillies.net/2013/07/25/box-hugger-no-more.html"&gt;thought he was late!&lt;/a&gt;), and I'm sure there are better approaches, but I think I'm finally feeling Docker. Good times!&lt;/p&gt;</content><category term="open source, technology"/></entry><entry><title>pygeometa: new release, hello YAML</title><link href="https://kralidis.ca/blog/blog/2017/03/23/pygeometa-new-release-hello-yaml/" rel="alternate"/><published>2017-03-23T16:13:00+00:00</published><updated>2017-03-23T16:13:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2017-03-23:/blog/blog/2017/03/23/pygeometa-new-release-hello-yaml/</id><summary type="html">&lt;p&gt;Metadata should be automagic and low barrier.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/geopython/pygeometa"&gt;pygeometa&lt;/a&gt; is a handy little metadata generator tool which is flexible, extensible, and composable.  Command line, or via the API, users can generate config files, or pass plain old Python dicts, ConfigParser objects, etc.&lt;/p&gt;
&lt;p&gt;We've just released 0.2.0 which supports WMO …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Metadata should be automagic and low barrier.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/geopython/pygeometa"&gt;pygeometa&lt;/a&gt; is a handy little metadata generator tool which is flexible, extensible, and composable.  Command line, or via the API, users can generate config files, or pass plain old Python dicts, ConfigParser objects, etc.&lt;/p&gt;
&lt;p&gt;We've just released 0.2.0 which supports WMO Core Metadata Profile output, as well as better multilingual support.  At this point we're embarking on breaking changes in master led by &lt;a href="https://github.com/geopython/pygeometa/issues/54"&gt;moving to YAML&lt;/a&gt; as the configuration format.&lt;/p&gt;
&lt;p&gt;Given pygeometa is pre-1.0 in theory changes can be breaking without support.  Still, I've cut a 0.2 branch in case anyone's existing workflows depend on the (now) old pygeometa functionality.&lt;/p&gt;
&lt;p&gt;As always, bug reports, feature requests are more than &lt;a href="https://github.com/geopython/pygeometa/issues"&gt;welcome&lt;/a&gt;. Hopefully the new enhancements will make metadata management even easier for agile workflows.&lt;/p&gt;</content><category term="geospatial, open source, technology"/></entry><entry><title>OSGeo Daytona Beach Code Sprint 2017 redux</title><link href="https://kralidis.ca/blog/blog/2017/02/15/osgeo-daytona-beach-code-sprint-2017-redux/" rel="alternate"/><published>2017-02-15T07:32:00+00:00</published><updated>2017-02-15T07:32:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2017-02-15:/blog/blog/2017/02/15/osgeo-daytona-beach-code-sprint-2017-redux/</id><summary type="html">&lt;p&gt;I attended the &lt;a href="https://wiki.osgeo.org/wiki/Daytona_Beach_Code_Sprint_2017"&gt;2017 OSGeo Code Sprint&lt;/a&gt; last week in Daytona Beach.  Having put forth a &lt;a href="https://docs.google.com/document/d/1-m2cwlyqCUxW_7oCWVTnoW1ZzRiGkDXwzm6ZsexbGFU/edit?usp=sharing"&gt;personal sprint workplan&lt;/a&gt; for the week, I thought it would be useful to report back on progress.&lt;/p&gt;
&lt;h2&gt;Testosil Testosterone Booster: Unleashing the Power Within&lt;/h2&gt;
&lt;p&gt;&lt;img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHCBQVFBgVFRUYGBgaGBobGhsaGBoaGhoaGBgdGhobGxobIS0kHSEqHxgYJTcmKi4xNDQ0GiM6PzozPi0zNDEBCwsLEA8QGhISGj4qISozMTMzMzQ0NTM1MzEzMTMzMTMzMzE5MzMzMzEzMTM+MTMzMTMzMzMzMzMzMzM0MTMxM//AABEIAJ8BPgMBIgACEQEDEQH/xAAcAAACAwEBAQEAAAAAAAAAAAABAgMEBQAGBwj/xABDEAACAQMCBAMFAwkHAgcAAAABAhEAAxIEIQUxQVETImEGMnGBkaGxwRQjQmJyktHw8QcVM1JTguEWJENjg5OissP/xAAYAQEBAQEBAAAAAAAAAAAAAAAAAQIDBP/EACgRAQEAAgEDAgYCAwAAAAAAAAABAhEDEiExQVEEEzJhgaEUkUJxwf/aAAwDAQACEQMRAD8A+fimoVxNVBmuFCiKoM11dXCmgaIrq4VdAkVwFGaHepoBBTUFFGaaHUQKFNNNBpoGgaGVNDhSmiR8qYLTQVUrnp5rU03Abjoty4yWEeMGvNiXnYYWwC7z0xWDQY8+tbFrgF4oLlwpYRvda+4t5D9VDLsPULWv+QWtEXAu2m1CY53WR2t6Y3JwVLeJLXTBJZhCAcp2rK49o8YuG94twN4eoJLllvS5gM48ywjLI62yf0hQQ8T4X4Vu3cW6l1XLqCgcAG3iGBzVSffEEDvWcB61te0A8MWNMfes2pf0u3m8R1/2govxBpLfB87QuC6o8pYhhjyYAgdXMGfKD270GQTSE1rtwK4CQXtgiZGR2gA7nGAN+cwOsU//AE+5Ei4kywIYssRyIBGRB7wBttIBgMWuitLW8MNsBs1ZS2IImeQMwem/MTVZbE9fs7VnLKY+Xbi4M+T6Zv8AMQ8qI3qQW55H7B2nvRNoTE9Y+wn8DU657uk+D5b4nrrzPKEClqw1n1rvA/WqfMx91/hc29a/cV6YVoWeDu6K6unm6M0NkXKBeo3gQTHM9qkPAnxJFy2dgRDEgqVZpDR+qPqRIIg9HkY7UlarcGbwxcDoV8MXCDkCBirNAjzQWVdupHKsugWlpjS0CkUCaY0KokoUYrqgNcK6uFUOBXVwoigBrga41X1DkGPxilouLbZuSsfgpP4U/wCSXOlt/wB01mpdjr9tWLN+eo+2s7Vc/ILv+k/7porw69z8J/3GP4VCt79Yc/Wn/LYPvL/8u9Nhzpbg523H+xv4VGRVu1xG5Gzx8Gb7N6j1eoa42TNkYAkkk7E9TVgrNXRRrqqFQiafKlNCaCXT3cHVwFJVgwDAMpKmYZTsRtyr1+g4wdSbji3Z/L4BsXMXBaAQ+AZ2U3AvuLAA6TEV5fhmia9dS0pg3HCz/lB95j6BZb5VvaS9Zv3HtW9OiadEuMt5VYXrXhozW71y7O5ZkWVP+cAcqg7h3tEtpbaTqB4YuBh5Bm1xpdnBk5IxJEyWI3xkiruui0E1Nwu6ICNIt1ixv3FJJ1NyQPIodACfM4ROQNV+EayzqXNy5aL6tbVxk8oNq89u2XR7qDcuMIgbNIJ7VU9qdS5a3ZuOXuW1ZrzEz+eukO67bQihE22GBHSgwLjlmZ3bJmYsxPNmYySfUmTVvTcHuuoZVEEAgyBMkAR8yKpNWppuE6hkBRhi6zGcSpYDccuZG315GKIBwi66rcADhgGBnclmI3y6z99b1v2VslHm47NbxzCFApkNkV8pIAKn3okCdhWQeEXhAyEErsrk+8zBdhy3VjvER0NXXfW27cvfhACRkVfIhc1HnBncwDvE7VjOZXxdO3Dlxy3rm/C9b9krGdxBddmQFtjbErlBG4nYEEtAEzG29ZfH+CLYdAjllZW8zAA5IYKlRuuzIYM+9z2NVV47qh/47nctu07n1adp6cqq63iF27HiXGciYmP0oyO3MmBJO5gVJjl7ul5OHtrH9+UZtxz259O39DS+EYPpO0dv6VFXGmsvcnJw7+j9p/yc8vUfbP8ACjp9K1xlRACzTAOx2Exv12NQ0zjyz2IqyX1rHJnx2Xpx1+dtM8Au75YKRIIJB/QZ+Ykckj5ism4mJII3BIPxBg0wc9z9TUbCTW3AAx3jaecdYO096WnikNAtA05FJQKa6mIpaCQ11dRioBXCjXRQGaM0tdVBqtq0OzAxuAdh1+PKrBqveuF4VAWYGdhP17D40qs9LrqwIYyDty/EU1+/cLksWBPc7/cKZ9K/OFB7ZA/ZJpLqMTMbx0gfcayqS1qXBkOfqK1E45rFX3nx9fDI+pQ1jKD2+41dFxYiB80X7w9DSM6+6zTmd/gfwrXEwATJ71j2bfmlgI9D/CTW0qhhK7ikSwBQNcaVjWkA0VoA06CgvcG4kdPcNwW0c4OkPMDNcSfKQfdJHMe8afX8YvXU8MsqWxytW1Fu2I/UXn/uk1QC1q6L2e1d5PEt6d3XowAAb9nIgt8poKWg1Ny1cW5bYo6ziwiRIKmJ9CR86iO+55nmTvueZJ6mtHh/s9q7uXh6d2xJDbYgMNisvG46jpVTV6W5ac27iMjjmrAg78j6j19KCs21AsY/D76dt6geR8O9A+R7mmDHqT60q029Ah+FKVqaKU86CPGuinpligTH0pnBKECOX3b0YoByDtQQIJp2oRXHbagBpaeKBFDYEUsU5oEVBEwoU9KRVElCjFGKBTRWiRXUArhXCuAoI8Q7kMYRFLORzgdB6kkD61najWSSEGCTIUbD4nufjU9548Qf5lj7azsaw0mN2l8SkxNEWzVVMrVKGqG3p2P9KmXRuagIIqzp9UUPx++qz6R151H4LVRsm4HAYddj8RQFRaBGwM7gN94P8KsAVqeGaUVMi1Gq1IaIksYZpnOGa598MhlHymvvuq4rbsstsIxWLe6BcEV3Fu3MkGC23lBiOlfCOFa7wL9u7gr4OHxPIx9x7HoQK9zqv7QdLcdblzSXCy4xF2AcWDqGVSA4DCQGBg1L3HruGcWurZZrwdrjXcLNtlwuMSinAnBFO4uMWUFQoPmOJNed9qOG3NYLavcsMRda2byg42bhENp2ABJBYrixI3EHcidnhXEbl9rerKBBeW5btZ3FBsoo2YKR52uOomOSqnrOP7OcN1Fk3W1wdLHguNS128HS9cL/AOIij3BjO+x3HWor57xfhlzS3Ws3QAywZBlWVhswPb+BqS3wO5ctq6MDkF2IiMiQNxM7r2HPsCRd9t/FGrZLr5FFRUaN2thZRj3YyZPeapabg95lVlAIYSBmJgkLy6SSPrvyMaQNPwG9BLYiBJ3J6N0A33WJG0kQTVTVaRkco0AgKdt5Dct+1WRwa8IBx3KxDT7xYLy5e63OOXSg/BLwKZ4jN0tg5Tu5ABjqPMOVZu7O1bwuMyls3Pbwp+F69O3T+YojT+v2VZfg91SoIXzuqL5ubOJA33BggmeQYd6nPAr0CMWmdg4ksCRC9zy/ejoYz05e/wCnonJw+vH+1bQ8MuXWxWIyVSTyXMEgmOmxqUcGuYhhEFA5mRAIJE+pgRIG7AczFSpwG9Cny+cqFAbnkrsDPIDyHn3ETUF3h7oqu7KqObYzBJAW4GKse4xRjHPbcCRW482Vltsmom1PArq7HGRlIBJgIqPJgb7PyEnblVa5we6ri2cJOXJpjBFdpgbnF1O08/jVgcEubgscxsyqpYqw8MFZBjIeKm36rbiN1/uS7MKyNzgh+arj5+Wyw6H4MOxgyW7wG8rMDjAcoDMZELkMR12+kHtUWp4RctqzsVKqRJBnmQu23dgO/wAt6ccFvZ+G0K2DOskkEIQCNpjeR8p5EEwaixdtRbcwGGeOUqRyDQDHQ/SgqRQmmmgRVANKaY0CaBDQFGhQPFGuIrqAGurqEUHU1AmuFBRuc3qkDV697z1LpL8WmOKnHl6zvv8AWuWWWnbj45nbLddtqRIimtkVqaplC74xtIjcid437TWiL7LZLoLbKvNWUgrA3689+UCB3msfN+z1T4Od93xN+GJYYVasOMuYr0uiCPes2mtqyXSchyJwXMIpHLIgL381VOHcYvXbiJcbO27Iht4qLYR2Ai2gEW8ZkFYIgbned4Z9U3pw5+KceXTLv8aYutYdxVMmvWPdL4W7N3yJ4YuWSInC4oe4uxVpPnJkOJPSsnjV5luHExlbKtsN1LvI3+FacUOl/wAM/tr9zVIO9JpP8M/tr9zU3rWoxTCgaOVCqOIpBTzQig93oOAPxDT2XstYOGnTSuLmZbTvbYnxbQXbJlKneOfPtr+1Ni5cu5Y6nUWjpwumbTOSovgkM1zAxMhfMZGx+XzfhXFL+mfOxcZG6xBDDsykEN8xtO1amo9sNY1vwVdLaQQVsotsQZJEruOZ5RzNQD2s1rXb4zYM9uzbt3GBBDXEWbm45wzEfFTVi37Ml7SlWfNltMFKHEi6UDMp6qgu+YjsZABrzUxWjZ43qEAxuKsBQCLdrKEIKAuULGMViT0HaplL206cdw79U9G7Z9l7bIHW9cORVYKAND4kN5jyIOXOIVjJgxFxP2awtPcS6zspU4MqqYJAynLzeUzt06kEGsW5xzUMrIbkK2WQW3bSSylWMogMlSQTMkGKa5xrUumDXSVIiMbYgEyQCFkAkSYInrNZmOXrXXPPhu5jjfsW5w6/ktsgkkkqM1ImFn9KASGQ79xUdzh91bZuMIWFO7CTkREAdfMDBgwagW+8k5NMHqZ3ifhyH0FB9Q5Hmdz8WJ25mZPUgH6V0eZb1HDbilVDB2LsiquQLFBPlDAZCCOXUgc9qd+D6vEIUOIPul0gGD5veiIJ83LzetZ73XMEuxCny+YmDM7dt+1cl152dhBnZmEHHHvt5dvhtQXL/B71uS0KAuZbLoUZl296WggSNyR3rNZz3M95qcX2iCzRvtkY69J9T9agjrQKHI6mf5/h9lNcuEkEkmAAJPQbAfCkNdFA00WpCKM0HTSk0aBoFJoUTS0Fg0tMaUUUK6KJFAUR0V1dQNBRunzPVjScOuPbOLLi4kg89qq3T5no2OJ3EXFcYAjcdPrXLOW+Ho4csZb1ezQdLsRmn7ta9jgmsvWgAUwIJhdiwVoM7z7w5Vg2r9+4pZLYYAwYBJ6dMpPvL9RW/ob/ABJbYCWjiJHlUlhtmZAbIDz9dpMc659F9I9M5sO8tuljT8A1d0qQ6ShlWUxBGJkODzEAgz025Vd1mjvLizPpluXFY5pZK3G8xRjK+QMYMlVBM86q6LVcUUnHTuMjB/NOBzA8wmAJI3O321Lf1WucIG0qOMJRgjsCrkuN0uYyZmOcRWuOZS9/Dnz58eU3j5/4hbTXMRF22sAKHFgi4VQg4FhzAKrO0mIJNU+K6FxbuFriP4eMkWVVjk4geJ7y7uTHxqTiGu1dlVNzT20VyYyS5zUkEbvz2/Gs7W8du3EdGFsB4ywQgmCCN5PUCuryI9GfzZ/bX7mp4qLSf4Z/aX7mqQ1YzQimFKKZaoJqdNJcNtriiURlVyCCULziWXmFJBAblO3OrHB9LauXVt3rhto0jxJUBGjys2W2PQjbmNxWpo7Ny0ursXbot2JRHZg5Jcktaa2lskuWRGOM447k7Cg81yqexpHe29wL5LYBdiQAMjCqCebE8lG5g16G7otCBedFd1sm0FK6hcL4vmEd38MG0Vg5KAY5dJpdeq29PqLek1C3LRuobwBuZqNkVQSAlxPE2zQAnyTtUHmMqBatXjfCLenFtPEzusmV5fL+aYxFsgE+YbzJ7bCltcFuNbW4sMDBiYgEkc2gc46/pL3qjNApyK0G4PeEeUGcphl8uDFWBMwCCN6jfh1wJmVGOOUh0Pl28wAMxuPkaCnUTGedTG2fu70Ht+vr19B+IrHXj7vR/F5Nb0SQY/pyo/CnWw0/1qXTaRnfAYj3eZMS7pbUbA83dR6STVmcvaMZ8GeE3ZqKzAHl9aAYfxq/c4TcCZwrKFDEq6kCUFyDvOWDTHXpXf3NeIUhR5vdGayQcYI3gyXUc5kxWnJQmkYbxWivBb5gYAzEee3+kxVT73UggH0pdTwm5bXM4kdcWBIlQwJB3iD9QRQZ2VBqYCgaBZrpo0IoFNCmmlJoLBoUTSmgBrq40JoOrq6uFBn3D5nqpVq77zVUrDSdL7qIV2Xr5WI35TsecbVYsa26NxcuAnYkO4J3nczvuSfnVKprdBp2eI3v9a7/AO4/8aZNTcGwuOB+20SBjynsAPgIqnZqXKin1eodvedmjlkzNHwk7VB0rrprhyoNDRj82f2l+5qc1Hoz+bP7S/c1Ma1GKJFMtLRU96ocmvSa8Bf+zFxLGn8G3ddyql77G2rhwYydizYqqkAAHsax+DWbL3VGouG3aEs5E5EAbKkA+YmOnKa2V1FvU2Bp1uWbSrfeVvMMhYdkZTauXNxhi8oCJyqBdPcF7S6u+35OhL6ZnthmUOyO7N5QfL4kkCCJIMRVdeKuB4qNYfx3CXdJ4YI8nltqF3YoVCwykEN3NbGp4dq2XV/my7m5Y8DLwy963p7jkOFWBdhGQkxuD6RSXHbSveuvftm49jzLNt9Supe1hiDbE2wjsSWGOygb0HjtRbVWYKQQCQCAwBg9m8w+e9XbHDtSyZpMbbBwDBnExOwMkCeeW1NxZdMUtPYJDOh8W2Sx8NxHulhJVpJmTyPKks6XUFFxL4mAgzicsj5Vnl5Gn4VRKOHauObRMH85IGDRzDRs0iAZlTtXajhup33LDzT+cEELu53b3dwZ5bilfS6tiWbxCTMy+5kBiCJ5xBx7dKZdJq1aSHDDI+ZgeQlj5jGwjc9u4oK1vh9wllBGaFgyZeYBTDGfdgHsflUw4NfBjEGDE5rBORXaT3H3Gp9Bwm/cvYszIzi4SdsmIAdlILLuQwbzECDNav8A0xdJXHUXJdVeShGxZAMsbhaQbgjYzvB61i3GdnbHDkyls8T7vPvobisquQrNiFUkkkOwWfLIiZ2O/lNP/d19CxG3lMkOvuBci05brABnuB1rYT2XNyG/KWMGJa2TgQA4BYXDBOawAZykGIrI1vDtQrvbDO6o25yIVgVUBgMiCCroBBMhh0NMbL4OTDkx+vY3eHaoSCDvIP5xTJBClTDbkkBY5mPSlfh2q5GQJxE3AQWUwFEEyciF7AkcqitWdQwBXMhlmQx3VhmZk7gjc1KNLqFFw5keHOfnJ94MTESCYy3259604ltabVALdRiQUD5ZglVIJ82RkRLGfU71S1Nq4qIXyxcSssSCABG07QCvPoRV9NHq8cQlzEoQBzGBMELJ5EryHP51Hf4VqcVyVyBlEtOOIBIEmAIg7dAPSqMwGgTUl63izIYJVipjcSpjY/KlAoFIpakNA0ERplFcaE0Fg0hpzSmihNLFE0sUQJog0Ca4UGddPnaqo51YvHzt8TVYc6w0tppHZQREH1q5p+E3SJCiP2hVW3rmVQsCB8f41paX2guouIAA+J/jXPK5ej08c4f8rTrwe4oBbBZmJYnZccj5QYAzXf1pxwxufiJz/wDMO/bZPQ/Sp7ftJckGGVhlDJcdDDYyDHP3BU49pbslpuSRBPj3JI3O8Hfma1jvXdy5OnqvT4Zmp4c6gkkbAk+S6PdBJEsgWdjzNVbVssIAnatDXcXdwQ2RkEee9eeMlxJCu5WYPUVT0z4qSO0fWtMJNL7tW207hQ5Rwh5MVYIZ7MRBqDhTrmmYlQ6lh3XIZD6TX6Mu6VL9hrTAFHTGIEDaAQOkbEU6tdksfnVq6pNTYa272395GZG+KkqftFQk1tk81f4XrktLeyt5s9l7aEmMC+zP8cZHLrEjec5alt2maSqs2IyOKk4qP0mgbDlvQKEAiP6fCtFteh0o05t+dbpuLc7IyBWSPiqnryqgg+f8/wDFN4LEMwViFALEAkKD/mI2HzoImNTW9bcUALccAcgGIA+XzqE/CgBQXl4rfiPEPIjpMMIO8TJAG/OoW1lwyTcczIPmO4Ox+RquRTE0F1OM3gfeDeVlhlDAhypaZG84Jue1Xk9rdUDOaggKP8NeSnJZMcgSSB6msEmuipcZfRuZ5SalumyfanVSYZADzXw1KmRBkEGSV8pJ6QNhVDU8Su3LjOznI4zicR5QoGw9ET90Gq8UDSSTxDLkyy+q7WF4hcUAC4ygYwFMAYqEWAOuIAmk/Krnml283vDI+aBAnvttUJFCarCc625EC48AYgZGIhRAHaEQf7R2rv7wuzPiP39484ifjHWq1dNACd64mgTvSRQPlQJoRRigWhXEV1BZNIaV7tJ4tQSGlpHuUniUDmhUfi0hv1RVIm5HqfuJqrlU18sGzX4/CqpJ7H6VhpJnU6MYqllTpfgRQaKk0ty8wNVV1npXG+DzMUErXya0bemueHkYXISskAsOUgE8tjWQ11ekn5VK2pdoGJMADryAiJ6bCi7ep4B7P6vUKTasu6/5wuKHvDNAPyr7z7NG4NNaF0Q4RVcfrKMW+0V5Pg/t9phaUSqKqABdhiAIAC+nYVHoP7RrDXbimVQsCjHYHygN8NxO9Y3ey6nd5v8AtR4cLWtzUQt5Q/8AvBxb7lP+6vG17r+0v2g0+pWwtoh3QuxI3AVgBiT3JAPpHrXhA1dYxUttCSFUEkkAAbkkmAABzJJA+den4Zfs6SEuXbhdb9u6wsKCp8LNWtNcZwLgliDiCAQwk9MX2f1CpqrLMQqi4kk7BZMBiegUkNPpUvG7D22t2WQqLentCO5dBcuMY2/xLjjttHSqizotF4VzNWDo1jVgOFKEMukuMbb223tsFIIG4IIIJ3i/odRa0wW1duXM0e4zpbQMgNy0tvw7suPEKxuFEDJ1md6s2JW2t25717T5wSJJsaHWW3uAdJTwD6m5VD2sH/eIX3UgsWXceG+rvG2wI7oyH51Bi67SG0+BYNsrKyzi6MJVhO+46HkQR0qsxre9tTGqKsRkA2UGYLXbjx6bOpj1FU7TaRrahw6uAJKjmd53323HTmF6E1Rlg129a0aLbzuIBnYyxLmJOO0LEx8pqN10uBxZ88TE+7lI290bc95G0bTtQZyiuLfSpyUH8mondd9unr8vx+yuc5N+leq/DSS35k/spoE1KrIQJG+3/P8APrQZ7e/2RPr/AMU6/tSfDSyXrn9o6UmpHIhoHTb4yfwitW6NJlnbYg+ImIYEoAXJJYEBiqoBInctE7VrG79HHk45jdTKX/TFzFAV9KTiGj8wa5p93YqG8FlwIAAIUttMxJPOSANx5TjL6Nr9xsmIbwyotlWVSQA4yAIMCTA67Saky36N8vDMJuZSsGK6tKymkxTO44YqMwokAkdPLvG8j7etUNabeZNuQm0TMjYTM+s1twRE1xoRXUHVy0oNDOgkK0uNOaFQKVFKVFOaBqiLAV3hiniuoI2siiNOO1PTpQQHTL2pDp17CrBNJNBENMvYfSnGlTsPpTCitQd4C9AKdbQog7069qoAtCjhRIoUC40RFc1ACg6a9DYY/kuY3I0Wrt/NNTbuKP3dQv2V54jaf53rZ03tIEtJbbTo2Ntrch7iSGZC7EL+mxt25brj0oLF9gNdqFXlbs6q0P8A0NDcs/8A51Y0FrxLKCdnsae3814qE/8Aqy1h67jZuah74REYo6EAGCHtNadierkMxy7xtWhZ9qwFVTp08iIoK3HQDwnW6GCrsGL2wxO8me9QZvEbmV+83+e9cf8Afdm/GrU6YpaHmVpPisoYnedwDsYMbDmJ92qOv1vjXHuFFTMzighV2A2HcxJ7kk9aiA3iqNRrei/1L3PqB2noh67T3HKN6TVjSwTadw0jFWBiIOXTbeI8xmelZdw77UAaCbKkdetKGpwaABaYChNdNAwmg1caE0EZFLFM1KKBhXGuFGg6gTRrooIzQxNSmhNB/9k=" class="alignnone size-full" width="318" height="159" /&gt;&lt;/p&gt;
&lt;p&gt;In the pursuit of peak performance and well-being, many turn …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I attended the &lt;a href="https://wiki.osgeo.org/wiki/Daytona_Beach_Code_Sprint_2017"&gt;2017 OSGeo Code Sprint&lt;/a&gt; last week in Daytona Beach.  Having put forth a &lt;a href="https://docs.google.com/document/d/1-m2cwlyqCUxW_7oCWVTnoW1ZzRiGkDXwzm6ZsexbGFU/edit?usp=sharing"&gt;personal sprint workplan&lt;/a&gt; for the week, I thought it would be useful to report back on progress.&lt;/p&gt;
&lt;h2&gt;Testosil Testosterone Booster: Unleashing the Power Within&lt;/h2&gt;
&lt;p&gt;&lt;img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHCBQVFBgVFRUYGBgaGBobGhsaGBoaGhoaGBgdGhobGxobIS0kHSEqHxgYJTcmKi4xNDQ0GiM6PzozPi0zNDEBCwsLEA8QGhISGj4qISozMTMzMzQ0NTM1MzEzMTMzMTMzMzE5MzMzMzEzMTM+MTMzMTMzMzMzMzMzMzM0MTMxM//AABEIAJ8BPgMBIgACEQEDEQH/xAAcAAACAwEBAQEAAAAAAAAAAAABAgMEBQAGBwj/xABDEAACAQMCBAMFAwkHAgcAAAABAhEAAxIEIQUxQVETImEGMnGBkaGxwRQjQmJyktHw8QcVM1JTguEWJENjg5OissP/xAAYAQEBAQEBAAAAAAAAAAAAAAAAAQIDBP/EACgRAQEAAgEDAgYCAwAAAAAAAAABAhEDEiExQVEEEzJhgaEUkUJxwf/aAAwDAQACEQMRAD8A+fimoVxNVBmuFCiKoM11dXCmgaIrq4VdAkVwFGaHepoBBTUFFGaaHUQKFNNNBpoGgaGVNDhSmiR8qYLTQVUrnp5rU03Abjoty4yWEeMGvNiXnYYWwC7z0xWDQY8+tbFrgF4oLlwpYRvda+4t5D9VDLsPULWv+QWtEXAu2m1CY53WR2t6Y3JwVLeJLXTBJZhCAcp2rK49o8YuG94twN4eoJLllvS5gM48ywjLI62yf0hQQ8T4X4Vu3cW6l1XLqCgcAG3iGBzVSffEEDvWcB61te0A8MWNMfes2pf0u3m8R1/2govxBpLfB87QuC6o8pYhhjyYAgdXMGfKD270GQTSE1rtwK4CQXtgiZGR2gA7nGAN+cwOsU//AE+5Ei4kywIYssRyIBGRB7wBttIBgMWuitLW8MNsBs1ZS2IImeQMwem/MTVZbE9fs7VnLKY+Xbi4M+T6Zv8AMQ8qI3qQW55H7B2nvRNoTE9Y+wn8DU657uk+D5b4nrrzPKEClqw1n1rvA/WqfMx91/hc29a/cV6YVoWeDu6K6unm6M0NkXKBeo3gQTHM9qkPAnxJFy2dgRDEgqVZpDR+qPqRIIg9HkY7UlarcGbwxcDoV8MXCDkCBirNAjzQWVdupHKsugWlpjS0CkUCaY0KokoUYrqgNcK6uFUOBXVwoigBrga41X1DkGPxilouLbZuSsfgpP4U/wCSXOlt/wB01mpdjr9tWLN+eo+2s7Vc/ILv+k/7porw69z8J/3GP4VCt79Yc/Wn/LYPvL/8u9Nhzpbg523H+xv4VGRVu1xG5Gzx8Gb7N6j1eoa42TNkYAkkk7E9TVgrNXRRrqqFQiafKlNCaCXT3cHVwFJVgwDAMpKmYZTsRtyr1+g4wdSbji3Z/L4BsXMXBaAQ+AZ2U3AvuLAA6TEV5fhmia9dS0pg3HCz/lB95j6BZb5VvaS9Zv3HtW9OiadEuMt5VYXrXhozW71y7O5ZkWVP+cAcqg7h3tEtpbaTqB4YuBh5Bm1xpdnBk5IxJEyWI3xkiruui0E1Nwu6ICNIt1ixv3FJJ1NyQPIodACfM4ROQNV+EayzqXNy5aL6tbVxk8oNq89u2XR7qDcuMIgbNIJ7VU9qdS5a3ZuOXuW1ZrzEz+eukO67bQihE22GBHSgwLjlmZ3bJmYsxPNmYySfUmTVvTcHuuoZVEEAgyBMkAR8yKpNWppuE6hkBRhi6zGcSpYDccuZG315GKIBwi66rcADhgGBnclmI3y6z99b1v2VslHm47NbxzCFApkNkV8pIAKn3okCdhWQeEXhAyEErsrk+8zBdhy3VjvER0NXXfW27cvfhACRkVfIhc1HnBncwDvE7VjOZXxdO3Dlxy3rm/C9b9krGdxBddmQFtjbErlBG4nYEEtAEzG29ZfH+CLYdAjllZW8zAA5IYKlRuuzIYM+9z2NVV47qh/47nctu07n1adp6cqq63iF27HiXGciYmP0oyO3MmBJO5gVJjl7ul5OHtrH9+UZtxz259O39DS+EYPpO0dv6VFXGmsvcnJw7+j9p/yc8vUfbP8ACjp9K1xlRACzTAOx2Exv12NQ0zjyz2IqyX1rHJnx2Xpx1+dtM8Au75YKRIIJB/QZ+Ykckj5ism4mJII3BIPxBg0wc9z9TUbCTW3AAx3jaecdYO096WnikNAtA05FJQKa6mIpaCQ11dRioBXCjXRQGaM0tdVBqtq0OzAxuAdh1+PKrBqveuF4VAWYGdhP17D40qs9LrqwIYyDty/EU1+/cLksWBPc7/cKZ9K/OFB7ZA/ZJpLqMTMbx0gfcayqS1qXBkOfqK1E45rFX3nx9fDI+pQ1jKD2+41dFxYiB80X7w9DSM6+6zTmd/gfwrXEwATJ71j2bfmlgI9D/CTW0qhhK7ikSwBQNcaVjWkA0VoA06CgvcG4kdPcNwW0c4OkPMDNcSfKQfdJHMe8afX8YvXU8MsqWxytW1Fu2I/UXn/uk1QC1q6L2e1d5PEt6d3XowAAb9nIgt8poKWg1Ny1cW5bYo6ziwiRIKmJ9CR86iO+55nmTvueZJ6mtHh/s9q7uXh6d2xJDbYgMNisvG46jpVTV6W5ac27iMjjmrAg78j6j19KCs21AsY/D76dt6geR8O9A+R7mmDHqT60q029Ah+FKVqaKU86CPGuinpligTH0pnBKECOX3b0YoByDtQQIJp2oRXHbagBpaeKBFDYEUsU5oEVBEwoU9KRVElCjFGKBTRWiRXUArhXCuAoI8Q7kMYRFLORzgdB6kkD61najWSSEGCTIUbD4nufjU9548Qf5lj7azsaw0mN2l8SkxNEWzVVMrVKGqG3p2P9KmXRuagIIqzp9UUPx++qz6R151H4LVRsm4HAYddj8RQFRaBGwM7gN94P8KsAVqeGaUVMi1Gq1IaIksYZpnOGa598MhlHymvvuq4rbsstsIxWLe6BcEV3Fu3MkGC23lBiOlfCOFa7wL9u7gr4OHxPIx9x7HoQK9zqv7QdLcdblzSXCy4xF2AcWDqGVSA4DCQGBg1L3HruGcWurZZrwdrjXcLNtlwuMSinAnBFO4uMWUFQoPmOJNed9qOG3NYLavcsMRda2byg42bhENp2ABJBYrixI3EHcidnhXEbl9rerKBBeW5btZ3FBsoo2YKR52uOomOSqnrOP7OcN1Fk3W1wdLHguNS128HS9cL/AOIij3BjO+x3HWor57xfhlzS3Ws3QAywZBlWVhswPb+BqS3wO5ctq6MDkF2IiMiQNxM7r2HPsCRd9t/FGrZLr5FFRUaN2thZRj3YyZPeapabg95lVlAIYSBmJgkLy6SSPrvyMaQNPwG9BLYiBJ3J6N0A33WJG0kQTVTVaRkco0AgKdt5Dct+1WRwa8IBx3KxDT7xYLy5e63OOXSg/BLwKZ4jN0tg5Tu5ABjqPMOVZu7O1bwuMyls3Pbwp+F69O3T+YojT+v2VZfg91SoIXzuqL5ubOJA33BggmeQYd6nPAr0CMWmdg4ksCRC9zy/ejoYz05e/wCnonJw+vH+1bQ8MuXWxWIyVSTyXMEgmOmxqUcGuYhhEFA5mRAIJE+pgRIG7AczFSpwG9Cny+cqFAbnkrsDPIDyHn3ETUF3h7oqu7KqObYzBJAW4GKse4xRjHPbcCRW482Vltsmom1PArq7HGRlIBJgIqPJgb7PyEnblVa5we6ri2cJOXJpjBFdpgbnF1O08/jVgcEubgscxsyqpYqw8MFZBjIeKm36rbiN1/uS7MKyNzgh+arj5+Wyw6H4MOxgyW7wG8rMDjAcoDMZELkMR12+kHtUWp4RctqzsVKqRJBnmQu23dgO/wAt6ccFvZ+G0K2DOskkEIQCNpjeR8p5EEwaixdtRbcwGGeOUqRyDQDHQ/SgqRQmmmgRVANKaY0CaBDQFGhQPFGuIrqAGurqEUHU1AmuFBRuc3qkDV697z1LpL8WmOKnHl6zvv8AWuWWWnbj45nbLddtqRIimtkVqaplC74xtIjcid437TWiL7LZLoLbKvNWUgrA3689+UCB3msfN+z1T4Od93xN+GJYYVasOMuYr0uiCPes2mtqyXSchyJwXMIpHLIgL381VOHcYvXbiJcbO27Iht4qLYR2Ai2gEW8ZkFYIgbned4Z9U3pw5+KceXTLv8aYutYdxVMmvWPdL4W7N3yJ4YuWSInC4oe4uxVpPnJkOJPSsnjV5luHExlbKtsN1LvI3+FacUOl/wAM/tr9zVIO9JpP8M/tr9zU3rWoxTCgaOVCqOIpBTzQig93oOAPxDT2XstYOGnTSuLmZbTvbYnxbQXbJlKneOfPtr+1Ni5cu5Y6nUWjpwumbTOSovgkM1zAxMhfMZGx+XzfhXFL+mfOxcZG6xBDDsykEN8xtO1amo9sNY1vwVdLaQQVsotsQZJEruOZ5RzNQD2s1rXb4zYM9uzbt3GBBDXEWbm45wzEfFTVi37Ml7SlWfNltMFKHEi6UDMp6qgu+YjsZABrzUxWjZ43qEAxuKsBQCLdrKEIKAuULGMViT0HaplL206cdw79U9G7Z9l7bIHW9cORVYKAND4kN5jyIOXOIVjJgxFxP2awtPcS6zspU4MqqYJAynLzeUzt06kEGsW5xzUMrIbkK2WQW3bSSylWMogMlSQTMkGKa5xrUumDXSVIiMbYgEyQCFkAkSYInrNZmOXrXXPPhu5jjfsW5w6/ktsgkkkqM1ImFn9KASGQ79xUdzh91bZuMIWFO7CTkREAdfMDBgwagW+8k5NMHqZ3ifhyH0FB9Q5Hmdz8WJ25mZPUgH6V0eZb1HDbilVDB2LsiquQLFBPlDAZCCOXUgc9qd+D6vEIUOIPul0gGD5veiIJ83LzetZ73XMEuxCny+YmDM7dt+1cl152dhBnZmEHHHvt5dvhtQXL/B71uS0KAuZbLoUZl296WggSNyR3rNZz3M95qcX2iCzRvtkY69J9T9agjrQKHI6mf5/h9lNcuEkEkmAAJPQbAfCkNdFA00WpCKM0HTSk0aBoFJoUTS0Fg0tMaUUUK6KJFAUR0V1dQNBRunzPVjScOuPbOLLi4kg89qq3T5no2OJ3EXFcYAjcdPrXLOW+Ho4csZb1ezQdLsRmn7ta9jgmsvWgAUwIJhdiwVoM7z7w5Vg2r9+4pZLYYAwYBJ6dMpPvL9RW/ob/ABJbYCWjiJHlUlhtmZAbIDz9dpMc659F9I9M5sO8tuljT8A1d0qQ6ShlWUxBGJkODzEAgz025Vd1mjvLizPpluXFY5pZK3G8xRjK+QMYMlVBM86q6LVcUUnHTuMjB/NOBzA8wmAJI3O321Lf1WucIG0qOMJRgjsCrkuN0uYyZmOcRWuOZS9/Dnz58eU3j5/4hbTXMRF22sAKHFgi4VQg4FhzAKrO0mIJNU+K6FxbuFriP4eMkWVVjk4geJ7y7uTHxqTiGu1dlVNzT20VyYyS5zUkEbvz2/Gs7W8du3EdGFsB4ywQgmCCN5PUCuryI9GfzZ/bX7mp4qLSf4Z/aX7mqQ1YzQimFKKZaoJqdNJcNtriiURlVyCCULziWXmFJBAblO3OrHB9LauXVt3rhto0jxJUBGjys2W2PQjbmNxWpo7Ny0ursXbot2JRHZg5Jcktaa2lskuWRGOM447k7Cg81yqexpHe29wL5LYBdiQAMjCqCebE8lG5g16G7otCBedFd1sm0FK6hcL4vmEd38MG0Vg5KAY5dJpdeq29PqLek1C3LRuobwBuZqNkVQSAlxPE2zQAnyTtUHmMqBatXjfCLenFtPEzusmV5fL+aYxFsgE+YbzJ7bCltcFuNbW4sMDBiYgEkc2gc46/pL3qjNApyK0G4PeEeUGcphl8uDFWBMwCCN6jfh1wJmVGOOUh0Pl28wAMxuPkaCnUTGedTG2fu70Ht+vr19B+IrHXj7vR/F5Nb0SQY/pyo/CnWw0/1qXTaRnfAYj3eZMS7pbUbA83dR6STVmcvaMZ8GeE3ZqKzAHl9aAYfxq/c4TcCZwrKFDEq6kCUFyDvOWDTHXpXf3NeIUhR5vdGayQcYI3gyXUc5kxWnJQmkYbxWivBb5gYAzEee3+kxVT73UggH0pdTwm5bXM4kdcWBIlQwJB3iD9QRQZ2VBqYCgaBZrpo0IoFNCmmlJoLBoUTSmgBrq40JoOrq6uFBn3D5nqpVq77zVUrDSdL7qIV2Xr5WI35TsecbVYsa26NxcuAnYkO4J3nczvuSfnVKprdBp2eI3v9a7/AO4/8aZNTcGwuOB+20SBjynsAPgIqnZqXKin1eodvedmjlkzNHwk7VB0rrprhyoNDRj82f2l+5qc1Hoz+bP7S/c1Ma1GKJFMtLRU96ocmvSa8Bf+zFxLGn8G3ddyql77G2rhwYydizYqqkAAHsax+DWbL3VGouG3aEs5E5EAbKkA+YmOnKa2V1FvU2Bp1uWbSrfeVvMMhYdkZTauXNxhi8oCJyqBdPcF7S6u+35OhL6ZnthmUOyO7N5QfL4kkCCJIMRVdeKuB4qNYfx3CXdJ4YI8nltqF3YoVCwykEN3NbGp4dq2XV/my7m5Y8DLwy963p7jkOFWBdhGQkxuD6RSXHbSveuvftm49jzLNt9Supe1hiDbE2wjsSWGOygb0HjtRbVWYKQQCQCAwBg9m8w+e9XbHDtSyZpMbbBwDBnExOwMkCeeW1NxZdMUtPYJDOh8W2Sx8NxHulhJVpJmTyPKks6XUFFxL4mAgzicsj5Vnl5Gn4VRKOHauObRMH85IGDRzDRs0iAZlTtXajhup33LDzT+cEELu53b3dwZ5bilfS6tiWbxCTMy+5kBiCJ5xBx7dKZdJq1aSHDDI+ZgeQlj5jGwjc9u4oK1vh9wllBGaFgyZeYBTDGfdgHsflUw4NfBjEGDE5rBORXaT3H3Gp9Bwm/cvYszIzi4SdsmIAdlILLuQwbzECDNav8A0xdJXHUXJdVeShGxZAMsbhaQbgjYzvB61i3GdnbHDkyls8T7vPvobisquQrNiFUkkkOwWfLIiZ2O/lNP/d19CxG3lMkOvuBci05brABnuB1rYT2XNyG/KWMGJa2TgQA4BYXDBOawAZykGIrI1vDtQrvbDO6o25yIVgVUBgMiCCroBBMhh0NMbL4OTDkx+vY3eHaoSCDvIP5xTJBClTDbkkBY5mPSlfh2q5GQJxE3AQWUwFEEyciF7AkcqitWdQwBXMhlmQx3VhmZk7gjc1KNLqFFw5keHOfnJ94MTESCYy3259604ltabVALdRiQUD5ZglVIJ82RkRLGfU71S1Nq4qIXyxcSssSCABG07QCvPoRV9NHq8cQlzEoQBzGBMELJ5EryHP51Hf4VqcVyVyBlEtOOIBIEmAIg7dAPSqMwGgTUl63izIYJVipjcSpjY/KlAoFIpakNA0ERplFcaE0Fg0hpzSmihNLFE0sUQJog0Ca4UGddPnaqo51YvHzt8TVYc6w0tppHZQREH1q5p+E3SJCiP2hVW3rmVQsCB8f41paX2guouIAA+J/jXPK5ej08c4f8rTrwe4oBbBZmJYnZccj5QYAzXf1pxwxufiJz/wDMO/bZPQ/Sp7ftJckGGVhlDJcdDDYyDHP3BU49pbslpuSRBPj3JI3O8Hfma1jvXdy5OnqvT4Zmp4c6gkkbAk+S6PdBJEsgWdjzNVbVssIAnatDXcXdwQ2RkEee9eeMlxJCu5WYPUVT0z4qSO0fWtMJNL7tW207hQ5Rwh5MVYIZ7MRBqDhTrmmYlQ6lh3XIZD6TX6Mu6VL9hrTAFHTGIEDaAQOkbEU6tdksfnVq6pNTYa272395GZG+KkqftFQk1tk81f4XrktLeyt5s9l7aEmMC+zP8cZHLrEjec5alt2maSqs2IyOKk4qP0mgbDlvQKEAiP6fCtFteh0o05t+dbpuLc7IyBWSPiqnryqgg+f8/wDFN4LEMwViFALEAkKD/mI2HzoImNTW9bcUALccAcgGIA+XzqE/CgBQXl4rfiPEPIjpMMIO8TJAG/OoW1lwyTcczIPmO4Ox+RquRTE0F1OM3gfeDeVlhlDAhypaZG84Jue1Xk9rdUDOaggKP8NeSnJZMcgSSB6msEmuipcZfRuZ5SalumyfanVSYZADzXw1KmRBkEGSV8pJ6QNhVDU8Su3LjOznI4zicR5QoGw9ET90Gq8UDSSTxDLkyy+q7WF4hcUAC4ygYwFMAYqEWAOuIAmk/Krnml283vDI+aBAnvttUJFCarCc625EC48AYgZGIhRAHaEQf7R2rv7wuzPiP39484ifjHWq1dNACd64mgTvSRQPlQJoRRigWhXEV1BZNIaV7tJ4tQSGlpHuUniUDmhUfi0hv1RVIm5HqfuJqrlU18sGzX4/CqpJ7H6VhpJnU6MYqllTpfgRQaKk0ty8wNVV1npXG+DzMUErXya0bemueHkYXISskAsOUgE8tjWQ11ekn5VK2pdoGJMADryAiJ6bCi7ep4B7P6vUKTasu6/5wuKHvDNAPyr7z7NG4NNaF0Q4RVcfrKMW+0V5Pg/t9phaUSqKqABdhiAIAC+nYVHoP7RrDXbimVQsCjHYHygN8NxO9Y3ey6nd5v8AtR4cLWtzUQt5Q/8AvBxb7lP+6vG17r+0v2g0+pWwtoh3QuxI3AVgBiT3JAPpHrXhA1dYxUttCSFUEkkAAbkkmAABzJJA+den4Zfs6SEuXbhdb9u6wsKCp8LNWtNcZwLgliDiCAQwk9MX2f1CpqrLMQqi4kk7BZMBiegUkNPpUvG7D22t2WQqLentCO5dBcuMY2/xLjjttHSqizotF4VzNWDo1jVgOFKEMukuMbb223tsFIIG4IIIJ3i/odRa0wW1duXM0e4zpbQMgNy0tvw7suPEKxuFEDJ1md6s2JW2t25717T5wSJJsaHWW3uAdJTwD6m5VD2sH/eIX3UgsWXceG+rvG2wI7oyH51Bi67SG0+BYNsrKyzi6MJVhO+46HkQR0qsxre9tTGqKsRkA2UGYLXbjx6bOpj1FU7TaRrahw6uAJKjmd53323HTmF6E1Rlg129a0aLbzuIBnYyxLmJOO0LEx8pqN10uBxZ88TE+7lI290bc95G0bTtQZyiuLfSpyUH8mondd9unr8vx+yuc5N+leq/DSS35k/spoE1KrIQJG+3/P8APrQZ7e/2RPr/AMU6/tSfDSyXrn9o6UmpHIhoHTb4yfwitW6NJlnbYg+ImIYEoAXJJYEBiqoBInctE7VrG79HHk45jdTKX/TFzFAV9KTiGj8wa5p93YqG8FlwIAAIUttMxJPOSANx5TjL6Nr9xsmIbwyotlWVSQA4yAIMCTA67Saky36N8vDMJuZSsGK6tKymkxTO44YqMwokAkdPLvG8j7etUNabeZNuQm0TMjYTM+s1twRE1xoRXUHVy0oNDOgkK0uNOaFQKVFKVFOaBqiLAV3hiniuoI2siiNOO1PTpQQHTL2pDp17CrBNJNBENMvYfSnGlTsPpTCitQd4C9AKdbQog7069qoAtCjhRIoUC40RFc1ACg6a9DYY/kuY3I0Wrt/NNTbuKP3dQv2V54jaf53rZ03tIEtJbbTo2Ntrch7iSGZC7EL+mxt25brj0oLF9gNdqFXlbs6q0P8A0NDcs/8A51Y0FrxLKCdnsae3814qE/8Aqy1h67jZuah74REYo6EAGCHtNadierkMxy7xtWhZ9qwFVTp08iIoK3HQDwnW6GCrsGL2wxO8me9QZvEbmV+83+e9cf8Afdm/GrU6YpaHmVpPisoYnedwDsYMbDmJ92qOv1vjXHuFFTMzighV2A2HcxJ7kk9aiA3iqNRrei/1L3PqB2noh67T3HKN6TVjSwTadw0jFWBiIOXTbeI8xmelZdw77UAaCbKkdetKGpwaABaYChNdNAwmg1caE0EZFLFM1KKBhXGuFGg6gTRrooIzQxNSmhNB/9k=" class="alignnone size-full" width="318" height="159" /&gt;&lt;/p&gt;
&lt;p&gt;In the pursuit of peak performance and well-being, many turn to the &lt;a href="https://www.firstpost.com/health/testosil-reviews-fake-or-legit-must-read-this-before-buying-12574072.html"&gt;power of Testosil&lt;/a&gt; Testosterone Booster. This article delves into the intricacies of this supplement, offering insights, guidance, and firsthand experiences to help you make an informed decision about integrating it into your life.&lt;/p&gt;
&lt;p&gt;The Foundation: Understanding Testosil Testosterone Booster&lt;br&gt;
What is Testosil Testosterone Booster?&lt;br&gt;
Embark on a journey to comprehend the essence of Testosil Testosterone Booster. Unlock the science behind its formulation and the impact it can have on your overall health.&lt;/p&gt;
&lt;p&gt;The Benefits of Testosil Testosterone Booster&lt;br&gt;
Explore the myriad advantages this booster brings to the table. From increased energy levels to enhanced muscle development, discover how Testosil Testosterone Booster can be a game-changer in your wellness routine.&lt;/p&gt;
&lt;p&gt;Ingredients That Power Testosil Testosterone Booster&lt;br&gt;
Delve into the key components fueling the effectiveness of Testosil Testosterone Booster. Uncover the natural wonders that synergize to elevate your testosterone levels.&lt;/p&gt;
&lt;p&gt;Testosil Testosterone Booster in Action&lt;br&gt;
Incorporating Testosil Testosterone Booster into Your Routine&lt;br&gt;
Practical tips and insights on seamlessly integrating Testosil Testosterone Booster into your daily life. Maximize its potential by understanding the optimal timing and dosage.&lt;/p&gt;
&lt;p&gt;Real Stories: Testimonials on Testosil Testosterone Booster&lt;br&gt;
Embark on a testimonial journey, where individuals share their transformative experiences with Testosil Testosterone Booster. Realize the diverse positive impacts reported by those who have embraced this supplement.&lt;/p&gt;
&lt;h4&gt;pycsw&lt;/h4&gt;
&lt;p&gt;There was &lt;a href="https://gitter.im/geopython/pycsw?at=589aa200f045df0a221d9a29"&gt;lots of discussio&lt;/a&gt;n on refactoring pycsw's filter support to enable NoSQL backends.  While we are still in discussion, this enhancement should open the doors for any backend (ElasticSearch, SOLR, a GitHub repository, another API, etc.).  In addition, &lt;a href="https://github.com/warmerdam"&gt;Frank Warmerdam&lt;/a&gt; started writing a pycsw OGR backend to support CSW exposure of the Planet Scenes API via OGR. This also presents exciting possibilities given OGR's support of numerous underlying formats.  Frank also provided valuable advice and feedback on interacting with pycsw as a developer/contributor.  Thank you Frank!&lt;/p&gt;
&lt;h4&gt;GeoHealthCheck&lt;/h4&gt;
&lt;p&gt;There has been long &lt;a href="https://gitter.im/geopython/GeoHealthCheck?at=589b1c041465c46a563a1ad4"&gt;discussion&lt;/a&gt; on a next generation GHC including a renewed architecture with core work on the model as well as an API.  A basic &lt;a href="https://docs.google.com/drawings/d/1qfVC0syPY69af2U1ae42zvDdMx9qJ_N5zX9LiOM0YkU/edit"&gt;architecture&lt;/a&gt; has surfaced as a result which focuses on having the UI exclusively work with the API, as well as a plugin framework which &lt;a href="https://github.com/justb4"&gt;Just van den Broecke&lt;/a&gt; has started working on.  I also worked on tagging which will be the last piece before cutting a release and forging ahead on the new architecture.&lt;/p&gt;
&lt;h4&gt;pygeometa&lt;/h4&gt;
&lt;p&gt;The focus on pygeometa is now on &lt;a href="https://github.com/geopython/pygeometa/issues/54"&gt;renewing the MCF format from .ini to YAML&lt;/a&gt;.  Initial pieces are completed in a dev branch which I plan to merge once we clear current issues and cut a stable release.&lt;/p&gt;
&lt;h4&gt;Summary&lt;/h4&gt;
&lt;p&gt;While I couldn't get to everything I planned for, I think significant steps were made in moving the above projects forward along their respective roadmaps.  It was also great to see some familiar faces as well as new contributors and projects!&lt;/p&gt;
&lt;p&gt;To know if this project was going to have good results and in the others also that they propose me, not only do I trust my professional ability, it is also advisable to go to a tarot reading, it is the best to know what will happen if you have doubts about something.&lt;/p&gt;
&lt;p&gt;The best of all is that usually the first time you can connect to the internet because you can access &lt;a href="https://theislandnow.com/blog-112/online-tarot-card-reading/"&gt;online tarot card reading&lt;/a&gt;, so you don't have to worry about traveling somewhere that seems dangerous. Be careful with everything that can happen to you in life. it is safer to trust a tarot reading. do not complicate yourself in following blindly and rather follow what God tells us through the tarot.&lt;/p&gt;
&lt;p&gt;Oh, and the weather certainly didn't hurt :)&lt;/p&gt;</content><category term="geospatial, open source, technology"/></entry><entry><title>Cheers to 2016</title><link href="https://kralidis.ca/blog/blog/2017/01/08/cheers-to-2016/" rel="alternate"/><published>2017-01-08T20:54:00+00:00</published><updated>2017-01-08T20:54:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2017-01-08:/blog/blog/2017/01/08/cheers-to-2016/</id><summary type="html">&lt;p&gt;It's been quite &lt;a href="http://www.kralidis.ca/blog/2008/12/30/cheers-to-2008/"&gt;awhile&lt;/a&gt; since I did one of these, so here goes.  Some notables from 2016:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pycsw: the release of &lt;a href="http://pycsw.org/2016/07/12/pycsw-200-doug-released.html"&gt;2.0 "Doug"&lt;/a&gt; provided the first OGC compliant CSW 3.0 implementation, as well as Python 3 support.  These two major enhancements provide the long term backbone for the …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;It's been quite &lt;a href="http://www.kralidis.ca/blog/2008/12/30/cheers-to-2008/"&gt;awhile&lt;/a&gt; since I did one of these, so here goes.  Some notables from 2016:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pycsw: the release of &lt;a href="http://pycsw.org/2016/07/12/pycsw-200-doug-released.html"&gt;2.0 "Doug"&lt;/a&gt; provided the first OGC compliant CSW 3.0 implementation, as well as Python 3 support.  These two major enhancements provide the long term backbone for the project moving into the future&lt;/li&gt;
&lt;li&gt;GeoHealthCheck: GHC provided the inspiration for the &lt;a href="https://github.com/cga-harvard/HHypermap"&gt;Harvard Hypermap&lt;/a&gt; project.  In addition, the project is being used in numerous internal environments and has caught the itch of &lt;a href="https://github.com/justb4"&gt;Just van den Broecke&lt;/a&gt;! It's amazing what happens when you put a UI on top of workflows&lt;/li&gt;
&lt;li&gt;PyWPS: version 4.0 was &lt;a href="http://pywps.org/2016/12/07/pywps-4.0.0.html"&gt;released&lt;/a&gt; which represented a major update/rewrite/licence change of the project.  For &lt;a href="http://woudc.org"&gt;WOUDC&lt;/a&gt;, we've implemented PyWPS as part of &lt;a href="http://www.opengeospatial.org/blog/2418"&gt;real-time workflows for data validation&lt;/a&gt;.  Finally, the project has moved along the OSGeo incubation process nicely and is hours away from being submitted for project graduation&lt;/li&gt;
&lt;li&gt;pygeometa: the little metadata creation tool now supports the WMO Core Metadata Profile&lt;/li&gt;
&lt;li&gt;GeoNode: now an OSGeo project!&lt;/li&gt;
&lt;li&gt;health&lt;/li&gt;
&lt;li&gt;another year (circa 2012) of not smoking&lt;/li&gt;
&lt;li&gt;I lost 35 lbs in 2016 thanks to a true, deep commitment to the Greek/Mediterranean diet. A huge thank you goes out to &lt;a href="http://www.olivetomato.com/"&gt;Olive Tomato&lt;/a&gt;, which has provided awesome recipes and advice&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For 2017:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pycsw: look for some big improvements to our &lt;a href="http://pycsw.org/development/rfc/rfc-8.html"&gt;test suite&lt;/a&gt;, as well as ElasticSearch support&lt;/li&gt;
&lt;li&gt;pygeometa: &lt;a href="https://github.com/geopython/pygeometa/issues/54"&gt;move to YAML&lt;/a&gt; as the configuration format&lt;/li&gt;
&lt;li&gt;PyWPS OSGeo incubation: we're almost there! Hoping to complete this by spring&lt;/li&gt;
&lt;li&gt;GeoHealthCheck: implementing a GHC API and plugin mechanism are two key enhancements which we will hopefully tackle at the &lt;a href="https://wiki.osgeo.org/wiki/Daytona_Beach_Code_Sprint_2017"&gt;OSGeo Code Sprint in Daytona Beach&lt;/a&gt;.  As well, as following the developments of newly formed OGC Quality of Service and Experience Domain Working Group&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wishing you and yours a healthy and happy 2017!&lt;/p&gt;</content><category term="geospatial, open source, personal"/></entry><entry><title>Software is Hard: Through the Years</title><link href="https://kralidis.ca/blog/blog/2016/12/04/software-is-hard-through-the-years/" rel="alternate"/><published>2016-12-04T20:50:00+00:00</published><updated>2016-12-04T20:50:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2016-12-04:/blog/blog/2016/12/04/software-is-hard-through-the-years/</id><summary type="html">&lt;p&gt;In 1999 I went to a GIS conference and watched a vendor presentation on their WMS product.  A key feature was being able to reproject data on the fly.  This appealed to me as this was early days of JavaScript development for me, along withe &lt;a href="https://github.com/madair"&gt;Mike Adair&lt;/a&gt; (which eventually, much …&lt;/p&gt;</summary><content type="html">&lt;p&gt;In 1999 I went to a GIS conference and watched a vendor presentation on their WMS product.  A key feature was being able to reproject data on the fly.  This appealed to me as this was early days of JavaScript development for me, along withe &lt;a href="https://github.com/madair"&gt;Mike Adair&lt;/a&gt; (which eventually, much later, led to the &lt;a href="http://proj4js.org"&gt;proj4js&lt;/a&gt; project). Thousands and thousands of projections one can choose from a select box and boom -- coordinate transformation for your WMS layer.&lt;/p&gt;
&lt;p&gt;I sat in shock for the remainder of the presentation thinking of the complexity and all the math involved.  After their presentation, I mentioned this to the presenter offline, who replied "it's very hard and complex work, yes".&lt;/p&gt;
&lt;p&gt;Fast forward around 2002 and it turns out they were indeed using &lt;a href="http://proj4.org"&gt;proj.4&lt;/a&gt; which initially made me think, "ah, that's easy, then".&lt;/p&gt;
&lt;p&gt;Ah, youth.&lt;/p&gt;
&lt;p&gt;These days, I would say well it's not that easy.  Integration, upstream changes, versions, packaging and deployment.  Moving parts.  Different issues.  It's smart, strategic and preferable not to re-invent the wheel and use existing libs, but the work certainly doesn't end there.&lt;/p&gt;
&lt;p&gt;(For what it's worth, the vendor [it doesn't matter who they are] and their product are still around and going strong)&lt;/p&gt;
&lt;h2&gt;Liv Pure Reviews: The Key to Pure Water&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.timesofisrael.com/spotlight/liv-pure-reviews-real-customer-testimonials-and-experiences-on-this-supplement/"&gt;Liv Pure Reviews&lt;/a&gt; are a testament to the efficacy of their water purifiers in ensuring the availability of pure and contaminant-free water. Let's delve deeper into what sets Liv Pure apart and makes it a top choice for many consumers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Advanced Filtration Technology for Clean Water&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Liv Pure employs advanced filtration technology to eliminate harmful substances from the water. Their purifiers are equipped with a multi-stage filtration process, including activated carbon, sediment filters, and UV purification, ensuring that water is free from impurities such as chlorine, lead, bacteria, and viruses. This results in fresh-tasting, crystal-clear water that is safe for consumption.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ergonomic and User-Friendly Designs&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Liv Pure takes pride in designing purifiers that are not only functional but also user-friendly. Their products are equipped with intuitive controls, easy filter replacement mechanisms, and space-saving designs. Whether you need a wall-mounted unit for a compact kitchen or a freestanding one for a spacious dining area, Liv Pure has options to suit your needs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Certified and Trusted Brand&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When it comes to the safety of drinking water, trust is paramount. Liv Pure has gained certifications and recognition from reputable organizations, assuring consumers of the quality and effectiveness of their products. Certifications from bodies like NSF, WQA, and ISI speak volumes about the brand's commitment to providing safe drinking water.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cost-Effective Solution for Clean Water&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;While bottled water might seem like an alternative, it can be expensive and environmentally detrimental. Liv Pure offers an economical solution, as their water purifiers significantly reduce the need for bottled water. Investing in a Liv Pure water purifier not only saves money but also helps reduce plastic waste, contributing to a greener planet.&lt;/p&gt;
&lt;h2&gt;Phentermine Alternatives: A Safer Approach to Weight Loss&lt;/h2&gt;
&lt;p&gt;In the pursuit of achieving a healthy and fit body, many individuals turn to weight loss supplements to aid their efforts. Phentermine, a prescription-only appetite suppressant, has been a popular choice for many years. However, due to its potential side effects and the need for a doctor's prescription, people are seeking safer alternatives that can provide similar benefits without the risks. In this article, we will explore some &lt;a href="https://www.mysanantonio.com/marketplace/article/phentermine-alternatives-18205449.php"&gt;effective phentermine alternatives&lt;/a&gt; that can assist individuals in their weight loss journey.&lt;/p&gt;
&lt;h3&gt;Understanding Phentermine&lt;/h3&gt;
&lt;p&gt;Phentermine is a central nervous system stimulant that works as an appetite suppressant. It is typically prescribed for short-term use to help individuals with obesity control their eating habits and lose weight. The drug works by increasing the release of neurotransmitters that reduce hunger cravings, making it easier for users to consume fewer calories.&lt;/p&gt;
&lt;p&gt;Despite its effectiveness, phentermine comes with potential side effects that may deter some individuals from using it. These side effects can include insomnia, dry mouth, elevated blood pressure, and even addiction in some cases. Additionally, due to its classification as a controlled substance, obtaining a prescription for phentermine can be challenging for some.&lt;/p&gt;
&lt;h2&gt;Alpilean Reviews 2023: Your Ultimate Guide to Natural Supplements&lt;/h2&gt;
&lt;p&gt;In today's fast-paced world, maintaining optimal health and well-being has become a top priority for many individuals. As a result, the demand for natural supplements has seen a significant surge in recent years. Among the various options available in the market, Alpilean has garnered attention as a promising supplement for enhancing overall health. In this article, we will delve into &lt;a href="https://www.timesofisrael.com/spotlight/alpilean-reviews/"&gt;Alpilean Reviews 2023&lt;/a&gt;, exploring its benefits, ingredients, and potential side effects. Let's embark on a journey to uncover the truth behind this popular supplement.&lt;/p&gt;</content><category term="geospatial, technology"/></entry><entry><title>GeoHealthCheck support on Gitter</title><link href="https://kralidis.ca/blog/blog/2016/06/13/geohealthcheck-support-on-gitter/" rel="alternate"/><published>2016-06-13T17:47:00+00:00</published><updated>2016-06-13T17:47:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2016-06-13:/blog/blog/2016/06/13/geohealthcheck-support-on-gitter/</id><summary type="html">&lt;p&gt;It's been almost two years since GeoHealthCheck was initially developed (en route to FOSS4G in PDX).  Since then, GHC has been deployed in numerous environments in support of monitoring of (primarily) OGC services (canonical demo at http://geohealthcheck.osgeo.org). If you really want to support the progress and improvement …&lt;/p&gt;</summary><content type="html">&lt;p&gt;It's been almost two years since GeoHealthCheck was initially developed (en route to FOSS4G in PDX).  Since then, GHC has been deployed in numerous environments in support of monitoring of (primarily) OGC services (canonical demo at http://geohealthcheck.osgeo.org). If you really want to support the progress and improvement of your health and your physical condition, first of all you should visit &lt;a href="https://www.firstpost.com/health/phenq-reviews-what-is-the-truth-behind-this-fat-burners-fame-10753581.html/"&gt;firstpost.com/&lt;/a&gt; and find out about the best natural dietary formula that you and your body can try.Taking care of your sexual health is important for your overall physical and mental well-being.  Regular STI testing and using contraception can reduce the risk of contracting or spreading infections. Addressing sexual concerns with your healthcare provider can also improve your sexual health and satisfaction like using male enhancement pills.&lt;/p&gt;
&lt;p&gt;Project communications have been relatively low key, with GitHub issues being the main discussion.  The project has setup a Gitter channel as a means to discuss GeoHealthCheck in a public forum more easily.  It's open and anyone can join. Come join us on https://gitter.im/geopython/GeoHealthCheck! Many vegans and vegetarians use &lt;a href="https://www.trueprotein.com.au/products/plant-protein"&gt;plant-based protein powder&lt;/a&gt; to supplement their diet and ensure they meet their protein needs.&lt;/p&gt;
&lt;p&gt;Do not forget to always be aware of your body's health status checkups, but if you want to lose weight almost instantly you should visit &lt;a href="https://www.amny.com/sponsored/exipure-reviews/"&gt;https://www.amny.com/sponsored/exipure-reviews/&lt;/a&gt; and find out about the pill that will change not only your body but also your entire life.&lt;/p&gt;
&lt;p&gt;As your body is important Im sure your sexual life is also important so if you are having troubles with that because of you are overweight you should try &lt;a href="https://www.timesofisrael.com/spotlight/best-male-enhancement-pills/"&gt;&lt;span sheets-value="{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;over the counter male enhancement pills&amp;quot;}" sheets-userformat="{&amp;quot;2&amp;quot;:12867,&amp;quot;3&amp;quot;:{&amp;quot;1&amp;quot;:0},&amp;quot;4&amp;quot;:{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:16777215},&amp;quot;9&amp;quot;:0,&amp;quot;12&amp;quot;:0,&amp;quot;15&amp;quot;:&amp;quot;\&amp;quot;Helvetica Neue\&amp;quot;, Helvetica, Arial, sans-serif&amp;quot;,&amp;quot;16&amp;quot;:11}" sheets-hyperlink="https://app.ahrefs.com/keywords-explorer/google/us/overview?keyword=over%20the%20counter%20male%20enhancement%20pills"&gt;over the counter male enhancement pills&lt;/span&gt;&lt;/a&gt;&lt;span sheets-value="{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;over the counter male enhancement pills&amp;quot;}" sheets-userformat="{&amp;quot;2&amp;quot;:12867,&amp;quot;3&amp;quot;:{&amp;quot;1&amp;quot;:0},&amp;quot;4&amp;quot;:{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:16777215},&amp;quot;9&amp;quot;:0,&amp;quot;12&amp;quot;:0,&amp;quot;15&amp;quot;:&amp;quot;\&amp;quot;Helvetica Neue\&amp;quot;, Helvetica, Arial, sans-serif&amp;quot;,&amp;quot;16&amp;quot;:11}" sheets-hyperlink="https://app.ahrefs.com/keywords-explorer/google/us/overview?keyword=over%20the%20counter%20male%20enhancement%20pills"&gt;  &lt;/span&gt;that may help with sexual problems, such as erectile dysfunction, premature ejaculation, or low sex drive.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>QGIS MetaSearch status and update</title><link href="https://kralidis.ca/blog/blog/2015/09/19/qgis-metasearch-status-and-update/" rel="alternate"/><published>2015-09-19T15:03:00+00:00</published><updated>2015-09-19T15:03:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2015-09-19:/blog/blog/2015/09/19/qgis-metasearch-status-and-update/</id><summary type="html">&lt;p&gt;It's seem like ages ago since the initial QGIS MetaSearch announce and &lt;a href="http://www.kralidis.ca/blog/2014/01/22/qgis-metasearch-csw-client-update/"&gt;call for help&lt;/a&gt; in 2014.  Inspired by Sourcepole's &lt;a href="http://blog.sourcepole.ch/2015/09/18/presentations-at-foss4g-2015-in-seoul/"&gt;FOSS4G 2015 presentations&lt;/a&gt;, here's a brief status update:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.deccanherald.com/brandspot/sponsored/best-rolex-replica-watches-2023-where-to-buy-fake-rolex-11-super-clones-1236640.html"&gt;Replica Rolex&lt;/a&gt; watches have come a long way in terms of quality and craftsmanship. While they may not hold the same intrinsic …&lt;/p&gt;</summary><content type="html">&lt;p&gt;It's seem like ages ago since the initial QGIS MetaSearch announce and &lt;a href="http://www.kralidis.ca/blog/2014/01/22/qgis-metasearch-csw-client-update/"&gt;call for help&lt;/a&gt; in 2014.  Inspired by Sourcepole's &lt;a href="http://blog.sourcepole.ch/2015/09/18/presentations-at-foss4g-2015-in-seoul/"&gt;FOSS4G 2015 presentations&lt;/a&gt;, here's a brief status update:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.deccanherald.com/brandspot/sponsored/best-rolex-replica-watches-2023-where-to-buy-fake-rolex-11-super-clones-1236640.html"&gt;Replica Rolex&lt;/a&gt; watches have come a long way in terms of quality and craftsmanship. While they may not hold the same intrinsic value as genuine Rolex timepieces, they provide an accessible way for watch enthusiasts to enjoy the iconic Rolex design and style. When looking to purchase a replica Rolex, it's crucial to do your research and choose a trusted source like PureTime.io, Trusty Time, Perfect Clone, or seek guidance from forums like Repgeek and Replica-Watch.info. Remember to always be aware of the legal implications and consider the quality and reputation of the seller to make an informed purchase in 2023.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hub.qgis.org/wiki/quantum-gis/MetaSearch"&gt;MetaSearch&lt;/a&gt; is now a core plugin shipped with QGIS (!!)&lt;/li&gt;
&lt;li&gt;we now have a default/approved &lt;a href="https://github.com/qgis/QGIS/blob/master/python/plugins/MetaSearch/resources/connections-default.xml"&gt;connections list&lt;/a&gt; of major CSW endpoints as well as multilingual &lt;a href="http://docs.qgis.org/2.8/en/docs/user_manual/plugins/plugins_metasearch.html"&gt;documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;MetaSearch is now fully &lt;a href="https://github.com/qgis/qgis/tree/master/python/plugins/MetaSearch"&gt;integrated&lt;/a&gt; into the QGIS source code, &lt;a href="https://hub.qgis.org/wiki/quantum-gis/MetaSearch"&gt;wiki&lt;/a&gt; and &lt;a href="https://hub.qgis.org/projects/quantum-gis/issues?category_id=107&amp;amp;set_filter=1&amp;amp;status_id=o"&gt;issue tracker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;for power users, interim releases continue to be supported on &lt;a href="https://plugins.qgis.org/plugins/MetaSearch/"&gt;plugins.qgis.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;MetaSearch has risen quickly and is the 2nd &lt;a href="https://plugins.qgis.org/plugins/popular/"&gt;most popular&lt;/a&gt; and 2nd &lt;a href="https://plugins.qgis.org/plugins/most_downloaded/"&gt;most downloaded&lt;/a&gt; plugin&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A sincere thanks to Richard Duivenvoorde, Angelos Tzotsos, Alexander Bruy, Tim Sutton and the rest of the QGIS developers/community for helping bring MetaSearch into QGIS to help move the search / discovery workflow forward!&lt;/p&gt;
&lt;p&gt;As far as a roadmap, here's a laundry list of future items:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OWSLib dependency cleanup&lt;/strong&gt;: currently we manage a copy of OWSLib in QGIS proper.  This is because there is a gap in packaging across supported platforms.  It would be great to have approved OWSLib packages (see &lt;a href="https://hub.qgis.org/issues/13058"&gt;issue&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Metadata publishing and management&lt;/strong&gt;: it would be great to manage and publish better metadata directly from MetaSearch.  The end result will be a more streamlined, deeper integration and support of metadata within QGIS.  No movement on these yet, but there are &lt;a href="https://github.com/qgis/QGIS-Enhancement-Proposals/pull/20/files"&gt;QEPs&lt;/a&gt; proposed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ISO based servers&lt;/strong&gt;: MetaSearch supports the OGC Core CSW model.  Most CSWs implement the CSW ISO Application Profile which supports more detailed metadata&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;add data functionality&lt;/strong&gt;: it would also be very great to directly &lt;a href="https://hub.qgis.org/issues/11733"&gt;add raw data&lt;/a&gt; from a metadata record's access links into QGIS.  We already support this for OGC services, and supporting direct data downloads to visualize in QGIS would complete the "publish/find/bind" workflow&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Do you have any enhancements you would like to see in MetaSearch?    Feel free to bring them in the MetaSearch &lt;a href="https://hub.qgis.org/projects/quantum-gis/issues?category_id=107&amp;amp;set_filter=1&amp;amp;status_id=o"&gt;issue tracker&lt;/a&gt; or the QGIS &lt;a href="https://www.qgis.org/en/site/getinvolved/mailinglists.html"&gt;mailing lists! &lt;/a&gt; Do you have fixes or features to contribute?  Feel free to fork and send pull requests!&lt;/p&gt;</content><category term="geospatial, open source, technology"/></entry><entry><title>CSW Client Library for JavaScript: the Adventure Begins</title><link href="https://kralidis.ca/blog/blog/2014/04/28/csw-client-library-for-javascript-the-adventure-begins/" rel="alternate"/><published>2014-04-28T17:59:00+00:00</published><updated>2014-04-28T17:59:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2014-04-28:/blog/blog/2014/04/28/csw-client-library-for-javascript-the-adventure-begins/</id><summary type="html">&lt;p&gt;CSW has a good presence on the server side (&lt;a href="http://pycsw.org" title="pycsw"&gt;pycsw&lt;/a&gt;, GeoNetwork Opensource, deegree, ESRI Geoportal are some FOSS packages).  From the client side, &lt;a href="http://geopython.github.io/OWSLib" title="OWSLib"&gt;OWSLib&lt;/a&gt; is the go to library for Python folks.  QGIS has &lt;a href="http://geopython.github.io/MetaSearch" title="MetaSearch"&gt;MetaSearch&lt;/a&gt; (which uses OWSLib).&lt;/p&gt;
&lt;p&gt;In a world where obesity rates are on the rise and the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;CSW has a good presence on the server side (&lt;a href="http://pycsw.org" title="pycsw"&gt;pycsw&lt;/a&gt;, GeoNetwork Opensource, deegree, ESRI Geoportal are some FOSS packages).  From the client side, &lt;a href="http://geopython.github.io/OWSLib" title="OWSLib"&gt;OWSLib&lt;/a&gt; is the go to library for Python folks.  QGIS has &lt;a href="http://geopython.github.io/MetaSearch" title="MetaSearch"&gt;MetaSearch&lt;/a&gt; (which uses OWSLib).&lt;/p&gt;
&lt;p&gt;In a world where obesity rates are on the rise and the quest for effective weight loss solutions never-ending, Rybelsus has emerged as a potential game-changer. This medication, originally developed for type 2 diabetes management, has garnered attention for its ability to aid weight loss. In this article, we will provide a comprehensive overview of Rybelsus weight loss reviews, exploring its effectiveness, side effects, and what users have experienced in their before-and-after results.&lt;/p&gt;
&lt;p&gt;Understanding Rybelsus&lt;/p&gt;
&lt;p&gt;Redefining Weight Loss&lt;/p&gt;
&lt;p&gt;Rybelsus, also known by its generic name semaglutide, belongs to a class of drugs called GLP-1 receptor agonists. It was initially developed to help manage blood sugar levels in people with type 2 diabetes. However, it has since been found to have a significant impact on weight loss. This discovery has led to its increasing use as an off-label weight loss treatment.&lt;/p&gt;
&lt;p&gt;Rybelsus Weight Loss Reviews: The Verdict&lt;/p&gt;
&lt;p&gt;Efficacy and User Experiences&lt;/p&gt;
&lt;p&gt;Rybelsus has gained popularity primarily due to its impressive weight loss results. Many users report substantial reductions in body weight when incorporating this medication into their daily routine. However, it's important to note that individual results can vary.&lt;/p&gt;
&lt;p&gt;Before-and-After Results&lt;/p&gt;
&lt;p&gt;Transformation Stories&lt;/p&gt;
&lt;p&gt;One of the most compelling aspects of Rybelsus weight loss reviews is the before-and-after stories shared by users. These testimonials provide real-world insights into the medication's potential. Users often highlight their journey, detailing the challenges they faced before starting Rybelsus and the remarkable transformations they achieved afterward.&lt;/p&gt;
&lt;p&gt;Common Side Effects&lt;/p&gt;
&lt;p&gt;Balancing Benefits and Risks&lt;/p&gt;
&lt;p&gt;Like any medication, Rybelsus is not without side effects. It's crucial for users to be aware of potential adverse reactions, which may include nausea, diarrhea, and abdominal discomfort. These side effects are usually mild and temporary, but it's essential to discuss them with a healthcare provider.&lt;/p&gt;
&lt;p&gt;The Safer Alternative News&lt;/p&gt;
&lt;p&gt;Balancing Safety and Effectiveness&lt;/p&gt;
&lt;p&gt;While Rybelsus shows promise as a weight loss aid, it's essential to remember that it is an off-label use of the drug. As such, there may be safety concerns and uncertainties about its long-term effects. Always consult a healthcare professional before starting any medication for weight loss.&lt;/p&gt;
&lt;p&gt;Conclusion&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.outlookindia.com/outlook-spotlight/rybelsus-weight-loss-reviews-side-effects-before-and-after-results-and-safer-alternative-news-303759"&gt;Rybelsus weight loss&lt;/a&gt; reviews offer a glimpse into a potential solution for those looking to shed excess pounds. The medication has shown significant promise in helping individuals achieve their weight loss goals. However, it is essential to approach its use with caution, ensuring you have all the necessary information and guidance from a healthcare provider. While the before-and-after stories are inspiring, it's crucial to remember that individual results can vary, and the safest path to weight loss always involves a holistic approach that includes a balanced diet and regular physical activity.&lt;/p&gt;
&lt;p&gt;Beyond symptom relief, reviews may mention how &lt;a href="https://www.outlookindia.com/outlook-spotlight/prostadine-reviews-fake-or-legit-prostate-supplement-customer-complaints-news-253303"&gt;Prostadine&lt;/a&gt; has positively impacted users' overall quality of life. Improved sleep, reduced anxiety about prostate health, and the ability to engage in daily activities without interruptions are often highlighted.&lt;/p&gt;
&lt;p&gt;At the same time, it's been awhile since I've delved into deep JavaScript.  These days, we have things like &lt;a href="http://nodejs.org" title="Javascript on the server"&gt;JavaScript on the sever&lt;/a&gt;, more emphasis on testing, building/packaging, and so on.  You can do it all with JavaScript if you want.&lt;/p&gt;
&lt;p&gt;Wouldn't it be great to have a generic CSW JavaScript client?  There are &lt;a href="http://demo.pycsw.org/viewer" title="many"&gt;many&lt;/a&gt; out there, implemented / bundled within an application context or for a specific use case.  But what about a generic lib?  Kind of like OWSLib, but for JavaScript.&lt;/p&gt;
&lt;p&gt;Say hello to &lt;a href="https://github.com/tomkralidis/csw4js" title="csw4js"&gt;csw4js&lt;/a&gt;.  The main goal here is to build an agnostic CSW client for JavaScript that can work with/feed:&lt;/p&gt;
&lt;p&gt;- geospatial libs like OpenLayers, Leaflet&lt;/p&gt;
&lt;p&gt;- web frameworks like jQuery, AngularJS, and so on&lt;/p&gt;
&lt;p&gt;- browser applications, node.js, etc.&lt;/p&gt;
&lt;p&gt;Todo:&lt;/p&gt;
&lt;p&gt;- Unit tests (&lt;a href="http://qunitjs.com" title="QUnit"&gt;QUnit&lt;/a&gt;?)&lt;/p&gt;
&lt;p&gt;- Build routines (using &lt;a href="http://gruntjs.com" title="Grunt"&gt;Grunt&lt;/a&gt; initially)&lt;/p&gt;
&lt;p&gt;- JavaScript muscle for namespacing, structure, etc.&lt;/p&gt;
&lt;p&gt;csw4js is still early days (thanks to &lt;a href="https://github.com/bartvde" title="Bart"&gt;Bart&lt;/a&gt; and others for advice), so it's a good time to rewire things before getting deeper.  Interested in helping out?  Get in touch!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>QGIS MetaSearch CSW client update</title><link href="https://kralidis.ca/blog/blog/2014/01/22/qgis-metasearch-csw-client-update/" rel="alternate"/><published>2014-01-22T21:51:00+00:00</published><updated>2014-01-22T21:51:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2014-01-22:/blog/blog/2014/01/22/qgis-metasearch-csw-client-update/</id><summary type="html">&lt;p&gt;It's great to see &lt;a href="http://qgis.org" title="QGIS"&gt;QGIS&lt;/a&gt; rising to fame in terms of a great desktop GIS tool.  Part of what makes QGIS so great is the vast ecosystem of &lt;a href="http://plugins.qgis.org/" title="plugins"&gt;plugins&lt;/a&gt;.  And Python support makes it easy to write plugins fast, especially atop existing libraries.&lt;/p&gt;
&lt;p&gt;Puravive has been making waves in the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;It's great to see &lt;a href="http://qgis.org" title="QGIS"&gt;QGIS&lt;/a&gt; rising to fame in terms of a great desktop GIS tool.  Part of what makes QGIS so great is the vast ecosystem of &lt;a href="http://plugins.qgis.org/" title="plugins"&gt;plugins&lt;/a&gt;.  And Python support makes it easy to write plugins fast, especially atop existing libraries.&lt;/p&gt;
&lt;p&gt;Puravive has been making waves in the health and wellness industry with its unique approach to maintaining a healthy lifestyle. The Exotic Rice Method, as advertised by Puravive, has gained significant attention for its supposed benefits. However, as with any new health trend, skepticism and curiosity abound. In this article, we'll delve into Puravive reviews to determine whether the Exotic Rice Method is genuine or just another health fad.&lt;/p&gt;
&lt;p&gt;The Exotic Rice Method: What Is It?&lt;/p&gt;
&lt;p&gt;The Exotic Rice Method is the flagship program offered by Puravive, a company that claims to harness the power of exotic rice varieties to improve health and well-being. According to Puravive, these rice varieties are sourced from far-flung regions and are exceptionally nutrient-dense. They are said to possess the potential to enhance metabolism, support weight loss, and boost overall health.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.state-journal.com/sponsored/puravive-reviews---fak-hyped-weight-loss-pills-or-real-customer-results/article_f456982c-746d-11ee-a0dc-5f43017b439d.html"&gt;Puravive&lt;/a&gt; offers this program in various formats, including dietary supplements, meal plans, and informational materials. The company suggests that by incorporating these unique rice varieties into your daily diet, you can experience numerous health benefits.&lt;/p&gt;
&lt;p&gt;Customer Reviews: The Real Story&lt;/p&gt;
&lt;p&gt;To get a better understanding of the Exotic Rice Method, we examined customer reviews from various sources. Here's what we found:&lt;/p&gt;
&lt;p&gt;Mixed Opinions&lt;br&gt;
Customer reviews are generally mixed. Some users report experiencing positive results, including improved energy levels, weight loss, and enhanced digestion after following the Exotic Rice Method. However, others express disappointment, claiming they didn't notice any significant changes.&lt;/p&gt;
&lt;p&gt;Weight Loss Claims&lt;br&gt;
A substantial portion of the customer reviews focuses on weight loss. Some individuals claim to have shed pounds successfully, attributing their success to the Exotic Rice Method. It's important to note, though, that individual results can vary widely, and factors such as overall diet, physical activity, and genetics also play a role in weight loss.&lt;/p&gt;
&lt;p&gt;Health Benefits&lt;br&gt;
Several users report improvements in their overall health, such as better digestion, more regular bowel movements, and increased energy levels. However, these claims are anecdotal and not supported by scientific studies.&lt;/p&gt;
&lt;p&gt;Skepticism&lt;br&gt;
While some users are enthusiastic about the Exotic Rice Method, others express skepticism about the product's effectiveness. Many people are cautious about the lack of scientific evidence and the high price of Puravive's offerings.&lt;/p&gt;
&lt;p&gt;Expert Opinions&lt;/p&gt;
&lt;p&gt;We also sought insights from nutrition and health experts to get a more balanced perspective on the Exotic Rice Method. Most experts caution against relying solely on exotic rice varieties for health benefits, emphasizing the importance of a balanced diet and a healthy lifestyle.&lt;/p&gt;
&lt;p&gt;Many nutritionists highlight the need for more research and scientific evidence to support the claims made by Puravive. The absence of such evidence raises concerns about the legitimacy of the Exotic Rice Method.&lt;/p&gt;
&lt;p&gt;The Verdict&lt;/p&gt;
&lt;p&gt;As of now, it is difficult to definitively label Puravive's Exotic Rice Method as either fake or legitimate. Customer reviews are mixed, and the lack of scientific evidence leaves room for skepticism.&lt;/p&gt;
&lt;p&gt;If you are considering trying the Exotic Rice Method or any of Puravive's products, it's essential to consult with a healthcare professional and conduct your own research. Keep in mind that no single product or dietary plan can guarantee success, and a balanced approach to nutrition and wellness is key.&lt;/p&gt;
&lt;p&gt;In conclusion, while the Exotic Rice Method may offer some potential benefits, its effectiveness and legitimacy are still open to debate. It's always wise to approach such health trends with caution and to consult experts for personalized advice on maintaining a healthy lifestyle.&lt;/p&gt;
&lt;p&gt;User&lt;br&gt;
write 5 articles on it&lt;br&gt;
ChatGPT&lt;br&gt;
Sure, I can provide you with the headlines and brief summaries for five articles on various topics. Please let me know which topics you'd like to explore further, and I can provide you with full articles.&lt;/p&gt;
&lt;p&gt;Title: "The Future of Sustainable Energy: Exploring Innovative Technologies"&lt;/p&gt;
&lt;p&gt;Summary: This article delves into cutting-edge technologies that are reshaping the landscape of sustainable energy. From advanced solar panels to energy storage solutions, we explore how these innovations are revolutionizing the way we generate and use clean energy.&lt;/p&gt;
&lt;p&gt;Title: "The Mental Health Revolution: How Technology Is Transforming Therapy"&lt;/p&gt;
&lt;p&gt;Summary: With the increasing prevalence of mental health issues, this article discusses how technology is making therapy more accessible and effective. It delves into online therapy platforms, AI-driven mental health apps, and the impact of virtual reality on mental health treatment.&lt;/p&gt;
&lt;p&gt;Title: "The Rise of Veganism: A Sustainable Diet for the Planet"&lt;/p&gt;
&lt;p&gt;Summary: Veganism is on the rise worldwide, and this article explores the reasons behind this trend. It looks at the environmental impact of vegan diets, the health benefits, and the ethical considerations that are driving people to embrace plant-based lifestyles.&lt;/p&gt;
&lt;p&gt;Title: "Exploring the Universe: The Next Frontier in Space Exploration"&lt;/p&gt;
&lt;p&gt;Summary: Space exploration has been capturing the world's imagination. In this article, we discuss upcoming missions to Mars, the study of exoplanets, the potential for asteroid mining, and the latest advancements in rocket technology.&lt;/p&gt;
&lt;p&gt;Title: "The Art of Mindfulness: A Path to Stress Reduction and Well-Being"&lt;/p&gt;
&lt;p&gt;Summary: Mindfulness has become a popular practice for managing stress and improving overall well-being. This article explores the benefits of mindfulness meditation, techniques for incorporating it into daily life, and its positive impact on mental health.&lt;/p&gt;
&lt;p&gt;User&lt;br&gt;
write we details&lt;br&gt;
ChatGPT&lt;/p&gt;
&lt;p&gt;3 / 3&lt;/p&gt;
&lt;p&gt;Certainly! Here are more detailed versions of the five article topics:&lt;/p&gt;
&lt;p&gt;1. The Future of Sustainable Energy: Exploring Innovative Technologies&lt;/p&gt;
&lt;p&gt;As the world grapples with climate change and the need to reduce our carbon footprint, sustainable energy solutions have become increasingly important. This article delves into the latest innovations that are reshaping the landscape of sustainable energy.&lt;/p&gt;
&lt;p&gt;From advanced solar panels that are more efficient and affordable to energy storage solutions like lithium-ion batteries, we explore how these cutting-edge technologies are revolutionizing the way we generate and use clean energy. Additionally, we discuss the potential of emerging technologies like fusion power and their implications for the future of global energy production.&lt;/p&gt;
&lt;p&gt;2. The Mental Health Revolution: How Technology Is Transforming Therapy&lt;/p&gt;
&lt;p&gt;Mental health issues affect millions of people around the world, and technology is playing a crucial role in making therapy more accessible and effective. This article investigates how the digital age is transforming the field of mental health treatment.&lt;/p&gt;
&lt;p&gt;We explore the rise of online therapy platforms, which connect individuals with licensed therapists via video chat or messaging. Additionally, we discuss the impact of AI-driven mental health apps that offer personalized support and coping strategies. Furthermore, we examine the potential of virtual reality therapy in treating various mental health conditions and its promise in providing immersive and effective treatment experiences.&lt;/p&gt;
&lt;p&gt;3. The Rise of Veganism: A Sustainable Diet for the Planet&lt;/p&gt;
&lt;p&gt;Veganism is experiencing a surge in popularity, driven by concerns over environmental sustainability, health, and ethical considerations. In this article, we take an in-depth look at the factors contributing to the rise of veganism and the potential benefits of adopting a plant-based diet.&lt;/p&gt;
&lt;p&gt;We discuss the environmental impact of vegan diets, including reduced greenhouse gas emissions and land use. Furthermore, we examine the health benefits associated with a well-balanced vegan diet, such as reduced risk of chronic diseases. Lastly, we explore the ethical considerations that are compelling more people to embrace plant-based lifestyles and the diverse range of vegan food options available.&lt;/p&gt;
&lt;p&gt;4. Exploring the Universe: The Next Frontier in Space Exploration&lt;/p&gt;
&lt;p&gt;Space exploration has entered an exciting new era with plans for missions to Mars, the study of exoplanets, and potential asteroid mining on the horizon. This article delves into the latest developments and innovations in space exploration.&lt;/p&gt;
&lt;p&gt;We discuss upcoming missions to Mars, including NASA's Artemis program and SpaceX's ambitious plans for the Red Planet. We explore the hunt for exoplanets, planets located outside our solar system, and how they could hold the key to understanding extraterrestrial life. We also look at the potential for asteroid mining and its role in securing vital resources for future space endeavors. Additionally, we touch on the latest advancements in rocket technology that are making space travel more accessible and efficient.&lt;/p&gt;
&lt;p&gt;5. The Art of Mindfulness: A Path to Stress Reduction and Well-Being&lt;/p&gt;
&lt;p&gt;In a fast-paced and often stressful world, mindfulness has gained recognition as a powerful practice for managing stress and improving overall well-being. This article takes a deep dive into the art of mindfulness.&lt;/p&gt;
&lt;p&gt;We explore the benefits of mindfulness meditation, including stress reduction, improved focus, and enhanced emotional regulation. Readers will gain insights into different mindfulness techniques, such as body scan, loving-kindness meditation, and mindful breathing, and learn how to incorporate them into their daily lives. Additionally, we discuss the scientific evidence supporting the positive impact of mindfulness on mental health and well-being, making a compelling case for its inclusion in one's self-care routine.&lt;/p&gt;
&lt;p&gt;User&lt;br&gt;
write 5 article on puravive-reviews-fake-or-legit-what-customers-have-to-say-about-exotic-rice-method--news&lt;br&gt;
ChatGPT&lt;/p&gt;
&lt;p&gt;2 / 2&lt;/p&gt;
&lt;p&gt;Certainly! Here are five articles exploring the topic of Puravive Reviews, focusing on whether the Exotic Rice Method is genuine or not, based on customer feedback and the latest news.&lt;/p&gt;
&lt;p&gt;1. "Puravive Reviews: Unveiling the Truth about the Exotic Rice Method"&lt;/p&gt;
&lt;p&gt;In this in-depth investigation, we delve into the Puravive Exotic Rice Method. We examine customer reviews and feedback to determine if this innovative approach to health and wellness is truly effective or merely a passing trend. From weight loss claims to health benefits, we separate the fact from fiction and offer a balanced perspective.&lt;/p&gt;
&lt;p&gt;2. "Puravive Exotic Rice Method: What Are Customers Really Saying?"&lt;/p&gt;
&lt;p&gt;This article focuses on the voices of Puravive customers. We take a closer look at the firsthand experiences of individuals who have tried the Exotic Rice Method. By presenting both success stories and concerns, we offer a comprehensive overview of the diverse array of opinions surrounding this unique health program.&lt;/p&gt;
&lt;p&gt;3. "Science vs. Claims: Does Puravive's Exotic Rice Method Hold Up?"&lt;/p&gt;
&lt;p&gt;In this piece, we explore the scientific aspects of the Puravive Exotic Rice Method. We examine whether the claims made by Puravive regarding the benefits of exotic rice varieties are supported by scientific research. By consulting experts and studies, we aim to provide clarity on the credibility of the program.&lt;/p&gt;
&lt;p&gt;4. "Puravive Exotic Rice Method: Price vs. Performance"&lt;/p&gt;
&lt;p&gt;One of the key factors that consumers consider is the cost-effectiveness of health programs. This article scrutinizes the cost of Puravive's Exotic Rice Method and evaluates whether the results it claims to deliver are commensurate with the price. By analyzing the value proposition, we help readers make informed decisions.&lt;/p&gt;
&lt;p&gt;5. "Latest News: Puravive's Exotic Rice Method and the Health &amp;amp; Wellness Industry"&lt;/p&gt;
&lt;p&gt;In this article, we explore the recent developments and news surrounding Puravive and its Exotic Rice Method. We discuss any updates, controversies, or regulatory actions that might impact the company's reputation and the public's perception of its products. Stay informed about the latest developments in the health and wellness industry.&lt;/p&gt;
&lt;p&gt;These articles will help provide a well-rounded view of the Puravive Exotic Rice Method, enabling readers to make informed decisions and judgments based on customer reviews, scientific analysis, and the latest news.&lt;/p&gt;
&lt;p&gt;Is this conversation helpful so far?&lt;/p&gt;
&lt;p&gt;CSW client support in QGIS has been via the excellent &lt;a href="https://github.com/nextgis/CSWClient" title="CSWClient"&gt;CSWClient&lt;/a&gt; plugin.  The &lt;a href="https://github.com/geopython/MetaSearch" title="MetaSearch"&gt;MetaSearch&lt;/a&gt; project forks CSWClient and will make the following initial improvements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;QGIS 2.0 support&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;added Catalogue types in addition to CSW (JSON APIs, OpenSearch, etc.)&lt;/li&gt;
&lt;li&gt;XML highlighting&lt;/li&gt;
&lt;li&gt;documentation using Sphinx&lt;/li&gt;
&lt;li&gt;i18n/continuous localization for both UI and docs, using &lt;a href="https://www.transifex.com/" title="Transifex"&gt;Transifex&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;code maintenance (easy to deploy for developers, automated build, packaging and dependency management)&lt;/p&gt;
&lt;p&gt;I have started some of the work at &lt;a href="https://github.com/geopython/MetaSearch"&gt;https://github.com/geopython/MetaSearch&lt;/a&gt;, but help is certainly welcome.  If you're interested in getting core CSW support in QGIS, please get in &lt;a href="https://twitter.com/tomkralidis" title="touch"&gt;touch&lt;/a&gt; (twitter, or the &lt;a href="irc://irc.freenode.net/geopython" title="#geopython IRC channel"&gt;#geopython IRC channel&lt;/a&gt;).&lt;/p&gt;</content><category term="geospatial, open source, technology"/></entry><entry><title>Mapping pycsw Deployments</title><link href="https://kralidis.ca/blog/blog/2013/06/08/mapping-pycsw-deployments/" rel="alternate"/><published>2013-06-08T17:55:00+00:00</published><updated>2013-06-08T17:55:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2013-06-08:/blog/blog/2013/06/08/mapping-pycsw-deployments/</id><summary type="html">&lt;p&gt;As the number of &lt;a href="http://pycsw.org" title="pycsw"&gt;pycsw&lt;/a&gt; deployments increase, we've started to keep a living document of &lt;a href="https://github.com/geopython/pycsw/wiki/Live-Deployments" title="live deployments"&gt;live deployments&lt;/a&gt; on the pycsw wiki. Being a geogeek, naturally I said to myself, "hmm, would be cool to plot these all on a map".  Embedding maps has become easier than ever, and projects like …&lt;/p&gt;</summary><content type="html">&lt;p&gt;As the number of &lt;a href="http://pycsw.org" title="pycsw"&gt;pycsw&lt;/a&gt; deployments increase, we've started to keep a living document of &lt;a href="https://github.com/geopython/pycsw/wiki/Live-Deployments" title="live deployments"&gt;live deployments&lt;/a&gt; on the pycsw wiki. Being a geogeek, naturally I said to myself, "hmm, would be cool to plot these all on a map".  Embedding maps has become easier than ever, and projects like &lt;a href="http://mapserver.org" title="MapServer"&gt;MapServer&lt;/a&gt; and &lt;a href="http://geoserver.org" title="GeoServer"&gt;GeoServer&lt;/a&gt; have cool maps right on their homepages, which demo their maps against a theme like the next &lt;a href="http://2013.foss4g.org" title="FOSS4g"&gt;FOSS4G&lt;/a&gt; conference, etc.&lt;/p&gt;
&lt;p&gt;The quest for effective weight loss solutions has led many individuals to explore various supplements and products, including Mounjaro. Marketed as a weight loss aid, Mounjaro has gained attention due to its alleged fat-burning properties. However, it's essential to be aware of the potential risks associated with Mounjaro and consider safer alternatives to achieve your weight loss goals.&lt;/p&gt;
&lt;p&gt;Mounjaro: What is it?&lt;/p&gt;
&lt;p&gt;Mounjaro is a dietary supplement promoted for its ability to accelerate weight loss. It is often marketed as a natural and powerful fat burner. The supplement typically contains a combination of herbal extracts and ingredients designed to boost metabolism and suppress appetite.&lt;/p&gt;
&lt;p&gt;The Dangers of Mounjaro&lt;/p&gt;
&lt;p&gt;While Mounjaro may promise quick results, it is not without its risks. Here are some of the potential dangers associated with this weight loss supplement:&lt;/p&gt;
&lt;p&gt;Unknown Ingredients: The precise composition of Mounjaro supplements can vary between brands and manufacturers. This lack of transparency makes it challenging to assess the safety and effectiveness of the product.&lt;/p&gt;
&lt;p&gt;Adverse Side Effects: Users have reported various side effects, including increased heart rate, high blood pressure, digestive issues, anxiety, and insomnia. These side effects can be especially problematic for individuals with underlying health conditions.&lt;/p&gt;
&lt;p&gt;Lack of Scientific Evidence: Many claims made about Mounjaro's effectiveness lack rigorous scientific support. The absence of clinical trials and peer-reviewed studies raises questions about its legitimacy as a weight loss solution.&lt;/p&gt;
&lt;p&gt;Safety Concerns: The safety of long-term use of Mounjaro is uncertain. Prolonged or excessive use of supplements with unknown ingredients can pose serious health risks.&lt;/p&gt;
&lt;p&gt;Safe Mounjaro Alternatives&lt;/p&gt;
&lt;p&gt;If you're looking to shed pounds and improve your overall health, it's crucial to consider safer alternatives to &lt;a href="https://www.outlookindia.com/outlook-spotlight/mounjaro-weight-loss-dangerous-side-effects-and-safe-mounjaro-alternatives-news-302835/"&gt;Mounjaro weight loss&lt;/a&gt;. Here are some proven methods to achieve weight loss safely:&lt;/p&gt;
&lt;p&gt;Balanced Diet: Focus on a well-rounded, nutrient-dense diet that includes plenty of fruits, vegetables, lean proteins, and whole grains. Monitoring calorie intake and portion sizes can be effective for weight management.&lt;/p&gt;
&lt;p&gt;Regular Exercise: Incorporate regular physical activity into your routine. A combination of cardiovascular exercises and strength training can help you burn calories and build lean muscle. Playing pickleball is a great way to stay active and have fun while getting a good workout. To ensure the best experience, make sure to use the &lt;a href="https://pickleballmastery.com/"&gt;best indoor pickleball balls&lt;/a&gt; for optimal performance.&lt;/p&gt;
&lt;p&gt;Consult a Healthcare Professional: Before starting any weight loss program or using supplements, consult with a healthcare provider. They can offer personalized guidance and recommendations tailored to your specific needs and health status.&lt;/p&gt;
&lt;p&gt;Behavioral Changes: Consider addressing the psychological aspects of weight management through behavioral therapy or counseling. Emotional eating and unhealthy habits can often contribute to weight gain.&lt;/p&gt;
&lt;p&gt;Prescription Medications: In some cases, healthcare professionals may recommend prescription weight loss medications that are FDA-approved and have a proven track record of safety and effectiveness.&lt;/p&gt;
&lt;p&gt;Conclusion&lt;/p&gt;
&lt;p&gt;Mounjaro may promise quick weight loss, but its potential dangers and lack of scientific evidence make it a risky choice. Instead of resorting to unverified supplements, focus on safe and proven methods for weight loss, such as a balanced diet, regular exercise, consulting healthcare professionals, and considering prescription medications when appropriate. Your health and well-being should always be the top priority when pursuing weight loss goals.&lt;/p&gt;
&lt;p&gt;pycsw is a bit different in that it doesn't do maps, but certainly catalogues them and makes them discoverable via OGC:CSW, OpenSearch and SRU.  And putting a sample GetRecords output on the website as a demo is boring.  So mapping live deployments seemed like a cool idea for a quick hack with reproducible workflow so it doesn't become a pain to keep things up to date.&lt;/p&gt;
&lt;p&gt;The pycsw website is managed using &lt;a href="http://docutils.sourceforge.net/rst.html" title="reStructuredText"&gt;reStructuredText&lt;/a&gt; and &lt;a href="http://sphinx-doc.org/" title="Sphinx"&gt;Sphinx&lt;/a&gt;; source code, issue tracker and wiki are hosted on &lt;a href="https://github.com/geopython/pycsw" title="GitHub"&gt;GitHub&lt;/a&gt;.  The first thing was to update each deployment on the wiki page with a lat/long pair (the lat/long pair being loosely based the location of the CSW itself, or the content of the CSW.  Aside: it would be cool if CSW Capabilities XML specified a BBOX like WMS does to give folks an idea of the location of records).&lt;/p&gt;
&lt;p&gt;After this, I wrote a Python &lt;a href="https://github.com/geopython/pycsw/blob/master/docs/build_map.py" title="script"&gt;script&lt;/a&gt; to fetch (and cache) the raw wiki page content.  Then, using &lt;a href="http://leafletjs.com/" title="Leaflet"&gt;Leaflet&lt;/a&gt;, setup a simple map and create markers foreach live deployment.&lt;/p&gt;
&lt;p&gt;So now I have a JavaScript snippet, now how do I add this to a page?  Using the Sphinx Makefile, I update the html target to &lt;a href="https://github.com/geopython/pycsw/blob/master/docs/Makefile#L57" title="run the Python script"&gt;run the Python script&lt;/a&gt; and save it to an area where I &lt;a href="https://raw.github.com/geopython/pycsw/master/docs/en/community.rst" title="embed"&gt;embed&lt;/a&gt; it using a rST &lt;a href="http://docutils.sourceforge.net/docs/ref/rst/directives.html#include" title="include"&gt;include&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;That's pretty much it.  So now whenever the live deployment page is updated, a simple make clean &amp;amp;&amp;amp; make html will keep things up to date.  Reproducible workflow!&lt;/p&gt;
&lt;p&gt;I've published this to the pycsw &lt;a href="http://pycsw.org/community.html" title="community"&gt;community&lt;/a&gt; page.  Do you have a pycsw install?  Add it to &lt;a href="https://github.com/geopython/pycsw/wiki/Live-Deployments"&gt;https://github.com/geopython/pycsw/wiki/Live-Deployments&lt;/a&gt; and we'll put it on the map!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>pycsw performance improvements</title><link href="https://kralidis.ca/blog/blog/2011/10/09/pycsw-performance-improvements/" rel="alternate"/><published>2011-10-09T13:54:00+00:00</published><updated>2011-10-09T13:54:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2011-10-09:/blog/blog/2011/10/09/pycsw-performance-improvements/</id><summary type="html">&lt;p&gt;&lt;strong&gt;UPDATE 26 January 2012&lt;/strong&gt;: the benchmarks on the improvements below were done against my home dev server (2.8 GHz, 1GB RAM).  Benchmarking recently on a modern box yielded 3.6 seconds with maxrecords=10000 (!).&lt;/p&gt;
&lt;p&gt;Puravive has been making waves in the health and wellness industry with its unique approach …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;UPDATE 26 January 2012&lt;/strong&gt;: the benchmarks on the improvements below were done against my home dev server (2.8 GHz, 1GB RAM).  Benchmarking recently on a modern box yielded 3.6 seconds with maxrecords=10000 (!).&lt;/p&gt;
&lt;p&gt;Puravive has been making waves in the health and wellness industry with its unique approach to maintaining a healthy lifestyle. The Exotic Rice Method, as advertised by Puravive, has gained significant attention for its supposed benefits. However, as with any new health trend, skepticism and curiosity abound. In this article, we'll delve into Puravive reviews to determine whether the Exotic Rice Method is genuine or just another health fad. Gummies like &lt;a href="https://indacloud.co/product/orange-funta-dispensary-grade-delta-9-thc-gummies-200mg/"&gt;Indacloud Orange funta&lt;/a&gt; can be a delicious addition to your routine, supporting good health and wellness with their natural, calming effects. For those looking to enhance their wellness journey, making a thoughtful &lt;a href="https://d8superstore.com/product/big-chief-thca-thcp-disposable"&gt;purchase&lt;/a&gt; of trusted supplements can be a positive step forward. Brands like &lt;a href="https://cheefbotanicals.com/products/mint-7oh-tablets-80-mg"&gt;cheefbotanicals&lt;/a&gt; are known for their commitment to quality and natural ingredients, making them a reliable choice for wellness enthusiasts.&lt;/p&gt;
&lt;p&gt;The Exotic Rice Method: What Is It?&lt;/p&gt;
&lt;p&gt;The Exotic Rice Method is the flagship program offered by Puravive, a company that claims to harness the power of exotic rice varieties to improve health and well-being. According to Puravive, these rice varieties are sourced from far-flung regions and are exceptionally nutrient-dense. They are said to possess the potential to enhance metabolism, support weight loss, and boost overall health. Additionally, products like regulated &lt;a href="https://www.anabolicdirect.co/"&gt;Anavar 10&lt;/a&gt; can further support these health and fitness goals.&lt;/p&gt;
&lt;p&gt;Puravive offers this program in various formats, including dietary supplements, meal plans, and informational materials. The company suggests that by incorporating these unique rice varieties into your daily diet, you can experience numerous health benefits.&lt;/p&gt;
&lt;p&gt;Customer Reviews: The Real Story&lt;/p&gt;
&lt;p&gt;To get a better understanding of the Exotic Rice Method, we examined customer reviews from various sources. Here's what we found:&lt;/p&gt;
&lt;p&gt;Mixed Opinions&lt;br&gt;
Customer reviews are generally mixed. Some users report experiencing positive results, including improved energy levels, weight loss, and enhanced digestion after following the Exotic Rice Method. However, others express disappointment, claiming they didn't notice any significant changes.&lt;/p&gt;
&lt;p&gt;Weight Loss Claims&lt;br&gt;
A substantial portion of the customer reviews focuses on weight loss. Some individuals claim to have shed pounds successfully, attributing their success to &lt;a href="https://www.aktw.life/"&gt;tirzepatide&lt;/a&gt;. It's important to note, though, that individual results can vary widely, and factors such as overall diet, physical activity, and genetics also play a role in weight loss.&lt;/p&gt;
&lt;p&gt;Health Benefits&lt;br&gt;
Several users report improvements in their overall health, such as better digestion, more regular bowel movements, and increased energy levels. However, these claims are anecdotal and not supported by scientific studies.&lt;/p&gt;
&lt;p&gt;Skepticism&lt;br&gt;
While some users are enthusiastic about the Exotic Rice Method, others express skepticism about the product's effectiveness. Many people are cautious about the lack of scientific evidence and the high price of Puravive's offerings.&lt;/p&gt;
&lt;p&gt;Expert Opinions&lt;/p&gt;
&lt;p&gt;We also sought insights from nutrition and health experts to get a more balanced perspective on the Exotic Rice Method. Most experts caution against relying solely on exotic rice varieties for health benefits, emphasizing the importance of a balanced diet and a healthy lifestyle.&lt;/p&gt;
&lt;p&gt;Many nutritionists highlight the need for more research and scientific evidence to support the claims made by Puravive. The absence of such evidence raises concerns about the legitimacy of the Exotic Rice Method.&lt;/p&gt;
&lt;p&gt;The Verdict&lt;/p&gt;
&lt;p&gt;As of now, it is difficult to definitively label Puravive's Exotic Rice Method as either fake or legitimate. Customer reviews are mixed, and the lack of scientific evidence leaves room for skepticism.&lt;/p&gt;
&lt;p&gt;If you are considering trying the Exotic Rice Method or any of Puravive's products, it's essential to consult with a healthcare professional and conduct your own research. Keep in mind that no single product or dietary plan can guarantee success, and a balanced approach to nutrition and wellness is key.&lt;/p&gt;
&lt;p&gt;In conclusion, while the Exotic Rice Method may offer some potential benefits, its effectiveness and legitimacy are still open to debate. It's always wise to approach such health trends with caution and to consult experts for personalized advice on maintaining a healthy lifestyle.&lt;/p&gt;
&lt;p&gt;User&lt;br&gt;
write 5 articles on it&lt;br&gt;
ChatGPT&lt;br&gt;
Sure, I can provide you with the headlines and brief summaries for five articles on various topics. Please let me know which topics you'd like to explore further, and I can provide you with full articles.&lt;/p&gt;
&lt;p&gt;Title: "The Future of Sustainable Energy: Exploring Innovative Technologies"&lt;/p&gt;
&lt;p&gt;Summary: This article delves into cutting-edge technologies that are reshaping the landscape of sustainable energy. From advanced solar panels to energy storage solutions, we explore how these innovations are revolutionizing the way we generate and use clean energy.&lt;/p&gt;
&lt;p&gt;Title: "The Mental Health Revolution: How Technology Is Transforming Therapy"&lt;/p&gt;
&lt;p&gt;Summary: With the increasing prevalence of mental health issues, this article discusses how technology is making therapy more accessible and effective. It delves into online therapy platforms, AI-driven mental health apps, and the impact of virtual reality on mental health treatment.&lt;/p&gt;
&lt;p&gt;Title: "The Rise of Veganism: A Sustainable Diet for the Planet"&lt;/p&gt;
&lt;p&gt;Summary: Veganism is on the rise worldwide, and this article explores the reasons behind this trend. It looks at the environmental impact of vegan diets, the health benefits, and the ethical considerations that are driving people to embrace plant-based lifestyles.&lt;/p&gt;
&lt;p&gt;Title: "Exploring the Universe: The Next Frontier in Space Exploration"&lt;/p&gt;
&lt;p&gt;Summary: Space exploration has been capturing the world's imagination. In this article, we discuss upcoming missions to Mars, the study of exoplanets, the potential for asteroid mining, and the latest advancements in rocket technology.&lt;/p&gt;
&lt;p&gt;Title: "The Art of Mindfulness: A Path to Stress Reduction and Well-Being"&lt;/p&gt;
&lt;p&gt;Summary: Mindfulness has become a popular practice for managing stress and improving overall well-being. This article explores the benefits of mindfulness meditation, techniques for incorporating it into daily life, and its positive impact on mental health.&lt;/p&gt;
&lt;p&gt;User&lt;br&gt;
write we details&lt;br&gt;
ChatGPT&lt;/p&gt;
&lt;p&gt;3 / 3&lt;/p&gt;
&lt;p&gt;Certainly! Here are more detailed versions of the five article topics:&lt;/p&gt;
&lt;p&gt;1. The Future of Sustainable Energy: Exploring Innovative Technologies&lt;/p&gt;
&lt;p&gt;As the world grapples with climate change and the need to reduce our carbon footprint, sustainable energy solutions have become increasingly important. This article delves into the latest innovations that are reshaping the landscape of sustainable energy.&lt;/p&gt;
&lt;p&gt;From advanced solar panels that are more efficient and affordable to energy storage solutions like lithium-ion batteries, we explore how these cutting-edge technologies are revolutionizing the way we generate and use clean energy. Additionally, we discuss the potential of emerging technologies like fusion power and their implications for the future of global energy production.&lt;/p&gt;
&lt;p&gt;2. The Mental Health Revolution: How Technology Is Transforming Therapy&lt;/p&gt;
&lt;p&gt;Mental health issues affect millions of people around the world, and technology is playing a crucial role in making therapy more accessible and effective. This article investigates how the digital age is transforming the field of mental health treatment.&lt;/p&gt;
&lt;p&gt;We explore the rise of online therapy platforms, which connect individuals with licensed therapists via video chat or messaging. Additionally, we discuss the impact of AI-driven mental health apps that offer personalized support and coping strategies. Furthermore, we examine the potential of virtual reality therapy in treating various mental health conditions and its promise in providing immersive and effective treatment experiences.&lt;/p&gt;
&lt;p&gt;3. The Rise of Veganism: A Sustainable Diet for the Planet&lt;/p&gt;
&lt;p&gt;Veganism is experiencing a surge in popularity, driven by concerns over environmental sustainability, health, and ethical considerations. In this article, we take an in-depth look at the factors contributing to the rise of veganism and the potential benefits of adopting a plant-based diet.&lt;/p&gt;
&lt;p&gt;We discuss the environmental impact of vegan diets, including reduced greenhouse gas emissions and land use. Furthermore, we examine the health benefits associated with a well-balanced vegan diet, such as reduced risk of chronic diseases. Lastly, we explore the ethical considerations that are compelling more people to embrace plant-based lifestyles and the diverse range of vegan food options available.&lt;/p&gt;
&lt;p&gt;4. Exploring the Universe: The Next Frontier in Space Exploration&lt;/p&gt;
&lt;p&gt;Space exploration has entered an exciting new era with plans for missions to Mars, the study of exoplanets, and potential asteroid mining on the horizon. This article delves into the latest developments and innovations in space exploration.&lt;/p&gt;
&lt;p&gt;We discuss upcoming missions to Mars, including NASA's Artemis program and SpaceX's ambitious plans for the Red Planet. We explore the hunt for exoplanets, planets located outside our solar system, and how they could hold the key to understanding extraterrestrial life. We also look at the potential for asteroid mining and its role in securing vital resources for future space endeavors. Additionally, we touch on the latest advancements in rocket technology that are making space travel more accessible and efficient.&lt;/p&gt;
&lt;p&gt;5. The Art of Mindfulness: A Path to Stress Reduction and Well-Being&lt;/p&gt;
&lt;p&gt;In a fast-paced and often stressful world, mindfulness has gained recognition as a powerful practice for managing stress and improving overall well-being. This article takes a deep dive into the art of mindfulness.&lt;/p&gt;
&lt;p&gt;We explore the benefits of mindfulness meditation, including stress reduction, improved focus, and enhanced emotional regulation. Readers will gain insights into different mindfulness techniques, such as body scan, loving-kindness meditation, and mindful breathing, and learn how to incorporate them into their daily lives. Additionally, we discuss the scientific evidence supporting the positive impact of mindfulness on mental health and well-being, making a compelling case for its inclusion in one's self-care routine.&lt;/p&gt;
&lt;p&gt;User&lt;br&gt;
write 5 article on puravive-reviews-fake-or-legit-what-customers-have-to-say-about-exotic-rice-method--news&lt;br&gt;
ChatGPT&lt;/p&gt;
&lt;p&gt;2 / 2&lt;/p&gt;
&lt;p&gt;Certainly! Here are five articles exploring the topic of Puravive Reviews, focusing on whether the Exotic Rice Method is genuine or not, based on customer feedback and the latest news.&lt;/p&gt;
&lt;p&gt;1. "Puravive Reviews: Unveiling the Truth about the Exotic Rice Method"&lt;/p&gt;
&lt;p&gt;In this in-depth investigation, we delve into the Puravive Exotic Rice Method. We examine customer reviews and feedback to determine if this innovative approach to health and wellness is truly effective or merely a passing trend. From weight loss claims to health benefits, we separate the fact from fiction and offer a balanced perspective.&lt;/p&gt;
&lt;p&gt;2. "&lt;a href="https://www.state-journal.com/sponsored/puravive-reviews---fak-hyped-weight-loss-pills-or-real-customer-results/article_f456982c-746d-11ee-a0dc-5f43017b439d.html"&gt;Puravive&lt;/a&gt; Exotic Rice Method: What Are Customers Really Saying?"&lt;/p&gt;
&lt;p&gt;This article focuses on the voices of Puravive customers. We take a closer look at the firsthand experiences of individuals who have tried the Exotic Rice Method. By presenting both success stories and concerns, we offer a comprehensive overview of the diverse array of opinions surrounding this unique health program.&lt;/p&gt;
&lt;p&gt;3. "Science vs. Claims: Does Puravive's Exotic Rice Method Hold Up?"&lt;/p&gt;
&lt;p&gt;In this piece, we explore the scientific aspects of the Puravive Exotic Rice Method. We examine whether the claims made by Puravive regarding the benefits of exotic rice varieties are supported by scientific research. By consulting experts and studies, we aim to provide clarity on the credibility of the program.&lt;/p&gt;
&lt;p&gt;4. "Puravive Exotic Rice Method: Price vs. Performance"&lt;/p&gt;
&lt;p&gt;One of the key factors that consumers consider is the cost-effectiveness of health programs. This article scrutinizes the cost of Puravive's Exotic Rice Method and evaluates whether the results it claims to deliver are commensurate with the price. By analyzing the value proposition, we help readers make informed decisions.&lt;/p&gt;
&lt;p&gt;5. "Latest News: Puravive's Exotic Rice Method and the Health &amp;amp; Wellness Industry"&lt;/p&gt;
&lt;p&gt;In this article, we explore the recent developments and news surrounding Puravive and its Exotic Rice Method. We discuss any updates, controversies, or regulatory actions that might impact the company's reputation and the public's perception of its products. Stay informed about the latest developments in the health and wellness industry.&lt;/p&gt;
&lt;p&gt;These articles will help provide a well-rounded view of the Puravive Exotic Rice Method, enabling readers to make informed decisions and judgments based on customer reviews, scientific analysis, and the latest news.&lt;/p&gt;
&lt;p&gt;Is this conversation helpful so far?&lt;/p&gt;
&lt;p&gt;The allure of Rolex watches is undeniable. Renowned for their precision, luxury, and timeless style, Rolex has become a symbol of status and success. However, owning a genuine Rolex watch comes with a hefty price tag, making it unattainable for many watch enthusiasts. This is where Rolex replica watches come into play. In recent years, high-quality Rolex replicas have gained immense popularity for their exceptional craftsmanship and resemblance to the real deal. In this article, we'll explore the world of Rolex replica watches, where to find the best super clone 1:1 copies, and what you should consider before making a purchase.&lt;/p&gt;
&lt;p&gt;The Rise of Rolex Replica Watches&lt;/p&gt;
&lt;p&gt;The demand for Rolex replica watches has grown steadily over the years. These replicas have become more than just imitations; they are often referred to as "super clones" due to their astonishing accuracy in replicating the original Rolex design, movement, and functionality. The rise of super clone Rolex watches can be attributed to several factors:&lt;/p&gt;
&lt;p&gt;Affordability: Authentic Rolex watches come with a price tag that often exceeds the budget of the average consumer. &lt;a href="https://www.riverfronttimes.com/sponsored/rolex-replica-watches-best-place-to-buy-replica-rolex-super-clone-1-1-copy-41062305"&gt;Rolex replica&lt;/a&gt;s, on the other hand, offer a cost-effective alternative for those who desire the prestige of a Rolex without breaking the bank.&lt;/p&gt;
&lt;p&gt;Quality Improvements: Advances in manufacturing techniques and materials have enabled replica watchmakers to produce highly detailed and meticulously crafted super clones that are almost indistinguishable from the genuine Rolex timepieces.&lt;/p&gt;
&lt;p&gt;Accessibility: With the advent of e-commerce, it has become easier than ever to find Rolex replica watches online. Numerous websites and sellers cater to this growing market.&lt;/p&gt;
&lt;p&gt;Where to Find the Best Super Clone Rolex 1:1 Copies&lt;/p&gt;
&lt;p&gt;While there are numerous sources for Rolex replica watches, it's essential to exercise caution when making a purchase. Counterfeit products and low-quality imitations are abundant in the market, so it's crucial to do your research and buy from reputable sources. Here are some tips to help you find the best super clone Rolex 1:1 copies:&lt;/p&gt;
&lt;p&gt;Reputable Online Sellers: Several trusted online stores specialize in high-quality replica watches. Look for websites with a good reputation, customer reviews, and clear policies regarding the quality and authenticity of their products.&lt;/p&gt;
&lt;p&gt;Ask for Recommendations: Seek advice from fellow watch enthusiasts who have experience with replica Rolex watches. They may recommend trustworthy sellers or websites.&lt;/p&gt;
&lt;p&gt;Study the Details: Pay close attention to the product descriptions, specifications, and high-resolution images provided by the seller. The best super clone Rolex watches will closely resemble the authentic models, down to the finest details.&lt;/p&gt;
&lt;p&gt;Reviews and Feedback: Read reviews and feedback from previous customers to gauge the quality and reliability of the seller. Genuine customer testimonials can provide valuable insights.&lt;/p&gt;
&lt;p&gt;Warranty and Return Policy: Ensure that the seller offers a warranty or return policy, as this indicates their confidence in the product's quality.&lt;/p&gt;
&lt;p&gt;Considerations Before Purchasing a Rolex Replica&lt;/p&gt;
&lt;p&gt;Before purchasing a Rolex replica watch, it's essential to consider the following:&lt;/p&gt;
&lt;p&gt;Legal and Ethical Considerations: Rolex is a protected trademark, and selling counterfeit Rolex watches is illegal in many jurisdictions. Ensure that you understand the laws in your area and the potential consequences of owning a replica watch.&lt;/p&gt;
&lt;p&gt;Your Motivation: Be clear about your reasons for buying a replica. If you're looking for a quality timepiece that emulates Rolex style, a super clone 1:1 copy may be a suitable choice. However, if your intention is to deceive or pass it off as an authentic Rolex, this is both unethical and potentially illegal.&lt;/p&gt;
&lt;p&gt;Maintenance and Care: Just like genuine Rolex watches, replicas require maintenance to ensure their longevity and accuracy. Be prepared to invest in regular servicing.&lt;/p&gt;
&lt;p&gt;Conclusion&lt;/p&gt;
&lt;p&gt;Rolex replica watches, especially super clone 1:1 copies, have become a popular choice for watch enthusiasts who appreciate the elegance and craftsmanship of Rolex timepieces but may not have the financial means to own an authentic Rolex. While replica watches offer an affordable alternative, it's crucial to exercise caution, do thorough research, and buy from reputable sources to ensure you receive a high-quality product that meets your expectations. Keep in mind the legal and ethical considerations surrounding replica watches and enjoy your Rolex-inspired timepiece responsibly.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://pycsw.org/" title="pycsw"&gt;pycsw&lt;/a&gt; does a pretty good job of implementing &lt;a href="http://www.opengeospatial.org/standards/cat" title="OGC CSW"&gt;OGC CSW&lt;/a&gt;.  All CITE tests pass, configuration is painless, and performance is great.  To date, testing has been done on repositories of \&amp;lt; 5000 records.&lt;/p&gt;
&lt;p&gt;Recently, I had a use case which required a metadata repository of 400K records.  After loading the records, I found that doing GetRecords searches against 400K records brought things to a halt (Houston, we have a problem).  So off I went on a performance improvement adventure.&lt;/p&gt;
&lt;p&gt;pycsw stores XML metadata as a full record in a given database; that is, the XML is not parsed when inserted.  Queries are then done using XPath queries using lxml and called as embedded SQL functions (for SQLite, these are realized using connection.create_function(); for PostgreSQL, we declare the same functions via plpythonu.  &lt;a href="http://sqlalchemy.org/" title="SQLAlchemy"&gt;SQLAlchemy&lt;/a&gt; is used as the DB abstraction layer.&lt;/p&gt;
&lt;p&gt;Using &lt;a href="http://docs.python.org/library/profile.html" title="cProfile"&gt;cProfile&lt;/a&gt;, I found that most of the process was being taken up by the database query.  I started thinking that the Python functions being called from the database got expensive as volume scaled (init'ing an XML parser to evaluate and match on each and every row).&lt;/p&gt;
&lt;p&gt;At this point, I figured the first step would be to rework the database with an agnostic metadata model, to which ISO, DC, FGDC, and DIF could fit into, where elements can slot into the core (generic) model.  Each profile then maps the queryables to (instead of an XPath) a database column in the codebase.&lt;/p&gt;
&lt;p&gt;At this point, I loaded 16000 Dublin Core documents as a first test.  Results:&lt;/p&gt;
&lt;p&gt;- GetCapabilities and GetDomain were instant, and I mean instant (these use the underlying database as well)&lt;br&gt;
- GetRecords: I tried with and without filters.  Performance is improved (5 seconds to return 15700 records matching a query [title = '%Lor%'], presenting 5 records)&lt;/p&gt;
&lt;p&gt;This is a big improvement, but still I thought this would have been faster.  I profiled the code again.  The cost of the SQL fetch was reduced.&lt;/p&gt;
&lt;p&gt;I then ran tests without using sqlalchemy in the codebase (i.e. SQL scripting as opposed to the SQLAlchemy way).  I used the Python sqlite3 module, and that's it.  Queries got faster.&lt;/p&gt;
&lt;p&gt;Still, this was only 16000 records.  As well, I started thinking/worrying about taking away sqlalchemy; it does give us great abstraction into different underlying databases, and helps us greatly with transactional (insert/update/delete).&lt;/p&gt;
&lt;p&gt;Then I started thinking more about bottlenecks and the fetch of data.  How can we have fast queries and keep sqlalchemy for ease of interacting with the underlying repo??&lt;/p&gt;
&lt;p&gt;Looking deeper, when pycsw processes a GetRecords request (say 'select * from records;'), we do exactly this.  So say the DB has 100K records, sqlalchemy gets ALL 100K records.  When I bring them back from server/repository.py to server/server.py, that's an sqlalchemy object with 100K members we're working with.  Then, in that code, I page through the results using maxrecords and startposition as requested by the client / set by the server processing.&lt;/p&gt;
&lt;p&gt;The other issue here is that OGC CSW's are to report on total number of records matched, provide the total number returned (per maxrecords or server default), and present the returned records per the elementsetname (full/brief/summary).  So applying a paging approach without getting the number of records matched was not an option.&lt;/p&gt;
&lt;p&gt;So I tried the following: client request is to get all records, startposition=1 and maxrecords=5.&lt;/p&gt;
&lt;p&gt;I additionally pass startposition and maxrecords to &lt;a href="https://sourceforge.net/apps/trac/pycsw/browser/trunk/server/repository.py#L99" title="server/repository.py:query()"&gt;server/repository.py:query()&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In repository.query(), I then do &lt;strong&gt;two&lt;/strong&gt; queries:&lt;/p&gt;
&lt;p&gt;- one query which ONLY gets the COUNT of records which satisfy the query (i.e. 'select count(*) from records;'), this gives us back the total number of records matched.  This is instant&lt;br&gt;
- a second query which gets everything (not COUNT), but applies LIMIT (per maxrecords) and OFFSET (per startposition), (say 10 records)&lt;br&gt;
- return both (the count integer, and the results object) to loop over in &lt;a href="https://sourceforge.net/apps/trac/pycsw/browser/trunk/server/server.py#L738" title="server/server.py:getrecords()"&gt;server/server.py:getrecords()&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So the slicing is now done in the SQL which is more powerful.  So on 100K records, this approach only pushes back the results per LIMIT and OFFSET (10 records).&lt;/p&gt;
&lt;p&gt;Results come back in less than 1 second.  Of course, as you increase maxrecords, this is more work for the server to return the records.  But still good performance; even when maxrecords=5000, the response is 3 seconds.&lt;/p&gt;
&lt;p&gt;So the moral of the story is that smart paging saves us here.&lt;/p&gt;
&lt;p&gt;I also tried this paging approach with the XML 'as-is' as a full record, with the embedded query_xpath query approach (per trunk), but the results were very slow again.  So the embedded xpath queries were hurting us there too.&lt;/p&gt;
&lt;p&gt;At this point, the way forward was clearer:&lt;/p&gt;
&lt;p&gt;- keep using sqlalchemy for flexibility; yes, if we remove sqlalchemy it will improve performance, but I think the flexibility it gives us, as well as we still get good performance, makes sense for us to keep it at this point&lt;br&gt;
- update data model to deconstruct the XML and put into columns&lt;br&gt;
- use paging techniques to query and present results&lt;/p&gt;
&lt;p&gt;Other options:&lt;/p&gt;
&lt;p&gt;- XML databases: looking for a non-Java solution, I found &lt;a href="http://www.oracle.com/technetwork/database/berkeleydb/overview/index.html" title="Berkeley DB XML"&gt;Berkeley DB XML&lt;/a&gt; to be interesting.  I haven't done enough pycsw integration yet to assess the pros/cons.  Supporting SQLite and PostgreSQL makes pycsw play nice for integration&lt;br&gt;
- Search servers: like &lt;a href="http://sphinxsearch.com/" title="Sphinx"&gt;Sphinx&lt;/a&gt;, the work here would be indexing the metadata mode.  Again, the flexibility of using an RDBMS and SQLAlchemy was still attractive&lt;/p&gt;
&lt;p&gt;Perhaps the above approaches could be supported as additional db stores.  Currently, pycsw code has some ties to what the underlying data model looks like.  We could add layer of abstraction between the DB model and the records object model.&lt;/p&gt;
&lt;p&gt;I think I've exhausted the approaches here for now.  These changes are committed to svn trunk.  None of these changes will impact end user configuration, just a bit more code behind the scenes.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>CSW and repository thoughts</title><link href="https://kralidis.ca/blog/blog/2011/05/06/csw-and-repository-thoughts/" rel="alternate"/><published>2011-05-06T09:19:00+00:00</published><updated>2011-05-06T09:19:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2011-05-06:/blog/blog/2011/05/06/csw-and-repository-thoughts/</id><summary type="html">&lt;p&gt;&lt;a href="http://www.opengeospatial.org/standards/cat" title="CSW"&gt;CSW&lt;/a&gt; allows for querying various metadata models (e.g. Dublin Core, ISO).  In &lt;a href="http://pycsw.org/" title="pycsw"&gt;pycsw&lt;/a&gt;, our current model is to manage one repository per metadata model (or 'typename' in CSW speak).  That said, we setup each repository to have one column per 'queryable' (as defined in CSW and application profiles), which …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="http://www.opengeospatial.org/standards/cat" title="CSW"&gt;CSW&lt;/a&gt; allows for querying various metadata models (e.g. Dublin Core, ISO).  In &lt;a href="http://pycsw.org/" title="pycsw"&gt;pycsw&lt;/a&gt;, our current model is to manage one repository per metadata model (or 'typename' in CSW speak).  That said, we setup each repository to have one column per 'queryable' (as defined in CSW and application profiles), which we parse when loading metadata.  We also store the full metadata record as is (for GetRecords ElementSetName='full' requests).&lt;/p&gt;
&lt;p&gt;Complexity increases as we start thinking about support for more information models, and transforming to/from requested information models (via CSW GetRecords/GetRecordById 'outputSchema' parameter).  Having said this, I've started to think about a core, agnostic information model which any metadata format could map to (for lowest common denominator).  This way, pycsw will always know the core information model queryables, which could be stored in columns as we currently do now.  The underlying queries would always query against the queryable columns.  Aside: it would be great to have a GDAL for metadata (MDAL anyone?).&lt;/p&gt;
&lt;p&gt;But what about a unified repository where just the metadata is stored in full (&lt;a href="http://geonetwork-opensource.org/" title="GeoNetwork"&gt;GeoNetwork&lt;/a&gt; does it like this)?  In this scenario, we would need heavy use of XPath queries on the full XML document in realtime.  The advantage would be a.) less parsing on metadata loading b.) one repository is always loaded/queried c.) less configuration for the catalog administrator.&lt;/p&gt;
&lt;p&gt;I like the use of XPath, but wonder about how this scales as additional databases are supported.  We currently support SQLite, which is great for simplicity (and Python SQLite bindings allow for mapping Python functions).  SQLite has no XPath support (but we could support this with Python bindings).  PostgreSQL does (if you build with &lt;a href="http://xmlsoft.org/" title="libxml2"&gt;libxml2&lt;/a&gt;), as does MySQL.  As well, I'm not sure about the performance implications (and how deep XPath queries are in the database fetching, i.e. the entire XML document would have to be serialized before XPath queries are executed).&lt;/p&gt;
&lt;p&gt;Thoughts on a Friday morning.  Anyone have any advice/insight?&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>validating XML requests with Python and lxml</title><link href="https://kralidis.ca/blog/blog/2011/04/21/validating-xml-requests-with-python-and-lxml/" rel="alternate"/><published>2011-04-21T08:44:00+00:00</published><updated>2011-04-21T08:44:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2011-04-21:/blog/blog/2011/04/21/validating-xml-requests-with-python-and-lxml/</id><summary type="html">&lt;p&gt;While working on &lt;a href="http://pycsw.org/" title="pycsw"&gt;pycsw&lt;/a&gt;, we found that there was a significant amount of code involved in processing the HTTP POST requests coming across as XML.  Since &lt;a href="http://lxml.de/" title="lxml"&gt;lxml&lt;/a&gt; is used as for XML support, why not use its native XML validation facilities?  We &lt;a href="https://sourceforge.net/apps/trac/pycsw/browser/trunk/server/server.py#L1170" title="implemented"&gt;implemented&lt;/a&gt; this rather quickly, but found validation was …&lt;/p&gt;</summary><content type="html">&lt;p&gt;While working on &lt;a href="http://pycsw.org/" title="pycsw"&gt;pycsw&lt;/a&gt;, we found that there was a significant amount of code involved in processing the HTTP POST requests coming across as XML.  Since &lt;a href="http://lxml.de/" title="lxml"&gt;lxml&lt;/a&gt; is used as for XML support, why not use its native XML validation facilities?  We &lt;a href="https://sourceforge.net/apps/trac/pycsw/browser/trunk/server/server.py#L1170" title="implemented"&gt;implemented&lt;/a&gt; this rather quickly, but found validation was taking up to 10 seconds.  Why?&lt;/p&gt;
&lt;p&gt;In the quest for improved health and longevity, the world of supplements has seen remarkable advancements. One of the most promising breakthroughs is Nicotinamide Mononucleotide (NMN), a compound believed to boost NAD+ levels in the body, contributing to overall well-being. In 2023, the demand for NMN supplements is on the rise, with Liposomal NMN supplements gaining particular attention. In this article, we'll explore the best NMN supplement options for 2023 and where to purchase Liposomal NMN supplements for optimal health and longevity.&lt;/p&gt;
&lt;p&gt;Understanding NMN: A Key to Longevity&lt;/p&gt;
&lt;p&gt;Unlocking the Fountain of Youth&lt;/p&gt;
&lt;p&gt;Nicotinamide Mononucleotide, or NMN, is a naturally occurring compound found in our cells. It plays a pivotal role in the production of Nicotinamide Adenine Dinucleotide (NAD+), a coenzyme essential for various biological processes, including energy production and DNA repair. As we age, NAD+ levels decline, leading to various age-related health issues. NMN supplements aim to reverse this decline, potentially promoting longevity and overall health.&lt;/p&gt;
&lt;p&gt;The Rise of Liposomal NMN Supplements&lt;/p&gt;
&lt;p&gt;Enhancing Bioavailability&lt;/p&gt;
&lt;p&gt;Liposomal NMN supplements have gained popularity for their improved bioavailability. Liposomes are small, spherical vesicles made up of a lipid bilayer, similar to cell membranes. When NMN is encapsulated in liposomes, it can better survive the digestive process, ensuring more NMN reaches the bloodstream, where it can have its intended effects. This enhanced bioavailability makes Liposomal &lt;a href="https://www.outlookindia.com/outlook-spotlight/best-nmn-supplement-2023-where-to-buy-liposomal-nmn-supplements-for-optimal-health-and-longevity-news-309352"&gt;nmn supplement&lt;/a&gt; a preferred choice for many.&lt;/p&gt;
&lt;p&gt;Where to Find the Best NMN Supplements in 2023&lt;/p&gt;
&lt;p&gt;1. Life Extension NMN&lt;/p&gt;
&lt;p&gt;Life Extension is a renowned brand in the world of longevity supplements. Their NMN supplement is highly rated for its purity and potency. They offer both traditional NMN capsules and Liposomal NMN options, providing choices to suit individual preferences.&lt;/p&gt;
&lt;p&gt;2. Elysium Basis&lt;/p&gt;
&lt;p&gt;Elysium Basis combines NMN with another longevity-promoting compound, Pterostilbene. Their Liposomal NMN supplement is known for its quality and commitment to scientific research. Elysium's rigorous testing ensures that you're getting a premium product.&lt;/p&gt;
&lt;p&gt;3. Tru Niagen&lt;/p&gt;
&lt;p&gt;Tru Niagen offers Niagen, a form of NMN that has undergone extensive clinical research. Their commitment to transparency and quality makes them a trusted choice for those seeking NMN supplements.&lt;/p&gt;
&lt;p&gt;Where to Buy Liposomal NMN Supplements for Optimal Health&lt;/p&gt;
&lt;p&gt;1. Amazon&lt;/p&gt;
&lt;p&gt;Amazon is a convenient and widely accessible platform to purchase Liposomal NMN supplements. You can find a variety of brands and read customer reviews to make an informed choice.&lt;/p&gt;
&lt;p&gt;2. Official Websites&lt;/p&gt;
&lt;p&gt;Many reputable NMN supplement brands have official websites where you can purchase their products directly. This ensures product authenticity and often offers subscription options for regular supplementation.&lt;/p&gt;
&lt;p&gt;3. Health and Supplement Stores&lt;/p&gt;
&lt;p&gt;Local health food stores and supplement retailers may carry Liposomal NMN supplements from trusted brands. It's a good idea to inquire about product quality and sourcing before making a purchase.&lt;/p&gt;
&lt;p&gt;Conclusion&lt;/p&gt;
&lt;p&gt;As we navigate the ever-evolving landscape of health and longevity supplements in 2023, NMN stands out as a promising compound. When it comes to choosing the best NMN supplement, Liposomal NMN offers enhanced bioavailability, potentially maximizing its benefits. Brands like Life Extension, Elysium Basis, and Tru Niagen have established themselves as leaders in this space.&lt;/p&gt;
&lt;p&gt;Whether you prefer to shop on Amazon, through official websites, or at local health stores, the key is to prioritize quality and transparency in your NMN supplement selection. With the right choice and a commitment to a healthy lifestyle, NMN may be your ally in the pursuit of optimal health and longevity in 2023 and beyond.&lt;/p&gt;
&lt;p&gt;In lxml, you have to specify an XML Schema to parse against, even if it is specified in xsi:schemaLocation.  Being a purist, I set this to fetch the &lt;a href="http://schemas.opengis.net/csw/2.0.2/CSW-discovery.xsd" title="schema"&gt;schema&lt;/a&gt; on the fly from http://schemas.opengis.net.  The fetch was causing much of the bottleneck, so I decided to download all required OGC CSW schemas locally and have them as part of the implementation.  That should work right?  Validation was down to about 6 seconds.&lt;/p&gt;
&lt;p&gt;The issue here was that even though the schemas were local, many xs:import definitions within them were pointing back to absolute URLs at schemas.opengis.net.  After modifying the schemas to point to relative locations, validation was extremely fast (way under a second).&lt;/p&gt;
&lt;p&gt;Lesson learned: just because XML schemas are local, doesn't mean they don't point to remote URLs (though I'm not exactly sure why one would build a schema with non-local imports if they don't have to).&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>help wanted: baking a CSW server in Python</title><link href="https://kralidis.ca/blog/blog/2011/02/04/help-wanted-baking-a-csw-server-in-python/" rel="alternate"/><published>2011-02-04T09:50:00+00:00</published><updated>2011-02-04T09:50:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2011-02-04:/blog/blog/2011/02/04/help-wanted-baking-a-csw-server-in-python/</id><summary type="html">&lt;p&gt;Seemingly buried in geospatial metadata and discovery, I've been developing a my share of CSW/ISO/Dublin Core parsers, generators and clients.  &lt;a href="http://trac.gispython.org/lab/wiki/OwsLib" title="OWSLib"&gt;OWSLib&lt;/a&gt; is able to interact with &lt;a href="http://www.opengeospatial.org/standards/cat" title="CSW"&gt;CSW&lt;/a&gt; servers, handling &lt;a href="http://trac.gispython.org/lab/browser/OWSLib/trunk/owslib/csw.py#L480" title="csw:Record"&gt;csw:Record&lt;/a&gt;, &lt;a href="http://trac.gispython.org/lab/browser/OWSLib/trunk/owslib/iso.py" title="ISO 19139:2007"&gt;ISO 19139:2007&lt;/a&gt;, as well as &lt;a href="http://trac.gispython.org/lab/browser/OWSLib/trunk/owslib/dif.py" title="DIF"&gt;DIF&lt;/a&gt;.  OWSLib is also the underlying library used by the &lt;a href="http://nextgis.ru/" title="NextGIS"&gt;NextGIS …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;Seemingly buried in geospatial metadata and discovery, I've been developing a my share of CSW/ISO/Dublin Core parsers, generators and clients.  &lt;a href="http://trac.gispython.org/lab/wiki/OwsLib" title="OWSLib"&gt;OWSLib&lt;/a&gt; is able to interact with &lt;a href="http://www.opengeospatial.org/standards/cat" title="CSW"&gt;CSW&lt;/a&gt; servers, handling &lt;a href="http://trac.gispython.org/lab/browser/OWSLib/trunk/owslib/csw.py#L480" title="csw:Record"&gt;csw:Record&lt;/a&gt;, &lt;a href="http://trac.gispython.org/lab/browser/OWSLib/trunk/owslib/iso.py" title="ISO 19139:2007"&gt;ISO 19139:2007&lt;/a&gt;, as well as &lt;a href="http://trac.gispython.org/lab/browser/OWSLib/trunk/owslib/dif.py" title="DIF"&gt;DIF&lt;/a&gt;.  OWSLib is also the underlying library used by the &lt;a href="http://nextgis.ru/" title="NextGIS"&gt;NextGIS&lt;/a&gt; folks in developing a QGIS CSW Client (big thanks to Maxim and Alex for contributing the code back to &lt;a href="http://sourceforge.net/apps/trac/qgiscommunitypl/wiki/qgcsw" title="qgcsw"&gt;qgcsw&lt;/a&gt;).  I've also used genshi to generate ISO 19139:2007 and &lt;a href="http://webstore.ansi.org/RecordDetail.aspx?sku=INCITS+453-2009" title="North American Profile"&gt;North American Profile&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For a well-rounded perspective on &lt;a href="https://www.outlookindia.com/outlook-spotlight/power-bite-reviews-truth-exposed-is-powerbite-dental-mineral-complex-legit-and-really-works--news-310570"&gt;power bite reviews&lt;/a&gt; Dental Mineral Complex, I suggest exploring their official website, where you'll uncover a treasure trove of user narratives, clinical data, and an exploration of the science behind its purported benefits.&lt;/p&gt;
&lt;p&gt;Part of this adventure has involved testing these metadata within various OGC CSW server implementations.  What I quickly noticed is that many foss4g CSW servers are written in Java.  Wouldn't it be great to have a trimmer CSW server in Python?  Which can be used easily with an existing Apache install type of thing?&lt;/p&gt;
&lt;p&gt;Enter &lt;a href="https://sourceforge.net/apps/trac/pycsw" title="pycsw"&gt;pycsw&lt;/a&gt;.  I started with the following goals:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;lightweight and easy to stand up: a standalone catalogue, no GUI or metadata editing front end, designed for the use case of exposing ready-to-go metadata (files or in existing DB) through a CSW interface, with as little heavy lifting as possible.  Plug and play&lt;/li&gt;
&lt;li&gt;extensible: the ability to add metadata formats and mapping them to a common information model and core / additional queryables&lt;/li&gt;
&lt;li&gt;OGC compliant: against the &lt;a href="http://cite.opengeospatial.org/" title="CITE"&gt;CITE&lt;/a&gt; test assertions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Technology bits (thanks to Sean for the &lt;a href="http://sgillies.net/blog/488/diving-into-python/" title="initial inspiration"&gt;initial inspiration&lt;/a&gt;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Python: code is written as CGI for now.  Welcome to ideas for WSGI, etc.&lt;/li&gt;
&lt;li&gt;Database:  &lt;a href="http://www.sqlite.org/" title="SQLite3"&gt;SQLite3&lt;/a&gt; is used as the underlying database.  No reason why things couldn't be abstracted enough to handle other DB's&lt;/li&gt;
&lt;li&gt;DB API: &lt;a href="http://www.sqlalchemy.org/" title="SQLAlchemy"&gt;SQLAlchemy&lt;/a&gt; makes it easy to bind database models to Python classes, and especially easy to do transparent queries&lt;/li&gt;
&lt;li&gt;XML: &lt;a href="http://codespeak.net/lxml/" title="lxml"&gt;lxml&lt;/a&gt; is used to parse requests, traverse XPath nodes and marshall responses.  lxml's Schematron support will make it easy for Harvest/Transaction operations / validation&lt;/li&gt;
&lt;li&gt;Spatial predicates: I originally supported ogc:BBOX, which is easy enough to code by hand.  &lt;a href="http://trac.gispython.org/lab/wiki/Shapely" title="Shapely"&gt;Shapely&lt;/a&gt; gives access to the full suite of predicates, and will be the way forward&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Progress: I'm using the OGC CITE tests here as the benchmark.  So far it passes 91/103 assertions.&lt;/p&gt;
&lt;p&gt;Todo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fully pass the CITE assertions&lt;/li&gt;
&lt;li&gt;support of ISO Application Profile&lt;/li&gt;
&lt;li&gt;firm up core information model to allow easier extensibility&lt;/li&gt;
&lt;li&gt;fix spatial queries to fully use Shapely&lt;/li&gt;
&lt;li&gt;harmonize GetRecords and GetRecordById response handler (for writing out csw:Record)&lt;/li&gt;
&lt;li&gt;documentation: install / setup / configuration / testing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://sourceforge.net/apps/trac/pycsw" title="pycsw"&gt;pycsw&lt;/a&gt; is up on Sourceforge and is open source.  It would be great to have more hands here.  If you are interested, and enjoy contributing to foss4g, don't hesitate and get in touch!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>OWSLib CSW action</title><link href="https://kralidis.ca/blog/blog/2010/10/14/owslib-csw-action/" rel="alternate"/><published>2010-10-14T12:01:00+00:00</published><updated>2010-10-14T12:01:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2010-10-14:/blog/blog/2010/10/14/owslib-csw-action/</id><content type="html">&lt;p&gt;(sorry, I've been &lt;a href="/blog/wedding/" title="busy"&gt;busy&lt;/a&gt; in the last few months, hence no blogposts)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: almost at the same time I originally posted this, Sean set me up on the &lt;a href="http://gispython.org/" title="http://gispython.org/"&gt;http://gispython.org&lt;/a&gt; blog, so I've moved this post &lt;a href="http://gispython.org/2010/10/owslib-csw-action/" title="there"&gt;there&lt;/a&gt;.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Geoprocessing with OGR and PyWPS</title><link href="https://kralidis.ca/blog/blog/2010/06/25/geoprocessing-with-ogr-and-pywps/" rel="alternate"/><published>2010-06-25T14:14:00+00:00</published><updated>2010-06-25T14:14:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2010-06-25:/blog/blog/2010/06/25/geoprocessing-with-ogr-and-pywps/</id><summary type="html">&lt;p&gt;&lt;a href="http://pywps.wald.intevation.org/" title="PyWPS"&gt;PyWPS&lt;/a&gt; is a neat Python package supporting the OGC &lt;a href="http://www.opengeospatial.org/standards/wps" title="Web Processing Service"&gt;Web Processing Service&lt;/a&gt; standard.  Basic setup and configuration can be found in the documentation, or Tim's useful &lt;a href="http://linfiniti.com/2009/09/a-quick-quide-to-getting-up-and-running-with-pywps/" title="post"&gt;post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I've been working on a demo to expose the OGR Python bindings for geoprocessing (buffer, centroid, etc.).&lt;/p&gt;
&lt;p&gt;Here's an example process to buffer …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="http://pywps.wald.intevation.org/" title="PyWPS"&gt;PyWPS&lt;/a&gt; is a neat Python package supporting the OGC &lt;a href="http://www.opengeospatial.org/standards/wps" title="Web Processing Service"&gt;Web Processing Service&lt;/a&gt; standard.  Basic setup and configuration can be found in the documentation, or Tim's useful &lt;a href="http://linfiniti.com/2009/09/a-quick-quide-to-getting-up-and-running-with-pywps/" title="post"&gt;post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I've been working on a demo to expose the OGR Python bindings for geoprocessing (buffer, centroid, etc.).&lt;/p&gt;
&lt;p&gt;Here's an example process to buffer a geometry (input as WKT), and output either GML, JSON, or WKT:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pywps.Process&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;WPSProcess&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;osgeo.ogr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;ogr&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WPSProcess&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
 &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;WPSProcess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;identifier&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;buffer&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Buffer generator&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;http://www.kralidis.ca/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;OGR / GEOS geoprocessing&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;abstract&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Buffer generator&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;0.0.1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;storeSupported&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;true&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;statusSupported&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;true&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wkt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addLiteralInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;identifier&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;wkt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   
  &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Well Known Text&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;string&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addLiteralInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;identifier&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;format&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   
  &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Output format&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;string&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addLiteralInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;identifier&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;buffer&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   
  &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Buffer Value&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addLiteralOutput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;identifier&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;output&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   
  &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Buffered Feature&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;string&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

 &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;buffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ogr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateGeometryFromWkt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;   
  &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wkt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getValue&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getValue&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_genOutputFormat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getValue&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
  &lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Destroy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

 &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;_setNamespace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; xmlns:&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;quot;&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

 &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;_genOutputFormat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;geom&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

 &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;format&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;gml&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_setNamespace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;geom&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ExportToGML&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;gml&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   
    &lt;span class="s1"&gt;&amp;#39;http://www.opengis.net/gml&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

 &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;format&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;json&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;geom&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ExportToJson&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

 &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;format&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;wkt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;geom&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ExportToWkt&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Notes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;_setNamespace is a workaround, as OGR's ExportToGML doesn't declare a namespace prefix / uri in the output, which would make the ExecuteResponse XML choke parsers&lt;/li&gt;
&lt;li&gt;_genOutputFormat is a utility method, which can be applied to any OGR geometry object&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As you can see, very easy to pull off, integrates and extends easy.  Kudos to the OGR and PyWPS teams!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Tips on Finding a Job</title><link href="https://kralidis.ca/blog/blog/2010/06/18/tips-on-finding-a-job/" rel="alternate"/><published>2010-06-18T13:27:00+00:00</published><updated>2010-06-18T13:27:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2010-06-18:/blog/blog/2010/06/18/tips-on-finding-a-job/</id><summary type="html">&lt;p&gt;Great &lt;a href="http://blog.davidsampson.ca/2010/06/job-hunting-conclusion-how-i-landed-my.html" title="post"&gt;post&lt;/a&gt; by Dave here on his experience and suggestions / ideas on finding a job.  Upbeat, positive and encouraging.  Congratulations and good post Dave!&lt;/p&gt;
&lt;p&gt;There are several ways to apply for a job, one is through virtual means, but the other where there are more options is the physical means …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Great &lt;a href="http://blog.davidsampson.ca/2010/06/job-hunting-conclusion-how-i-landed-my.html" title="post"&gt;post&lt;/a&gt; by Dave here on his experience and suggestions / ideas on finding a job.  Upbeat, positive and encouraging.  Congratulations and good post Dave!&lt;/p&gt;
&lt;p&gt;There are several ways to apply for a job, one is through virtual means, but the other where there are more options is the physical means, once you get a job the best thing you can do with that money is &lt;a href="https://rsmyersapplianceservice.com/"&gt;login pragmatic play&lt;/a&gt; and shoot yourself to heaven with the profits you can make.&lt;/p&gt;</content><category term="personal, web"/></entry><entry><title>Displaying GRIB data with MapServer</title><link href="https://kralidis.ca/blog/blog/2010/06/04/displaying-grib-data-with-mapserver/" rel="alternate"/><published>2010-06-04T19:02:00+00:00</published><updated>2010-06-04T19:02:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2010-06-04:/blog/blog/2010/06/04/displaying-grib-data-with-mapserver/</id><summary type="html">&lt;p&gt;I recently had the opportunity to prototype WMS visualization of &lt;a href="http://dd.weatheroffice.ec.gc.ca/model_gem_regional/high_resolution/grib1/00/" title="meteorological data"&gt;meteorological data&lt;/a&gt;.  MapServer, GDAL and Python to the rescue!  Here are the steps I took to make it happen.&lt;/p&gt;
&lt;p&gt;Welcome to the captivating realm of luxury timepieces, where sophistication meets craftsmanship and exclusivity reigns supreme. In this guide, we will …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I recently had the opportunity to prototype WMS visualization of &lt;a href="http://dd.weatheroffice.ec.gc.ca/model_gem_regional/high_resolution/grib1/00/" title="meteorological data"&gt;meteorological data&lt;/a&gt;.  MapServer, GDAL and Python to the rescue!  Here are the steps I took to make it happen.&lt;/p&gt;
&lt;p&gt;Welcome to the captivating realm of luxury timepieces, where sophistication meets craftsmanship and exclusivity reigns supreme. In this guide, we will take you on an exhilarating journey through the mesmerizing world of &lt;a href="https://www.outlookindia.com/outlook-spotlight/richard-mille-replica-watches-where-to-buy-best-selling-fake-richard-mille-super-clones-news-313685"&gt;Richard Mille replica&lt;/a&gt; watches – a parallel universe where impeccable designs and intricate details intertwine with affordability. Brace yourself as we unveil the hidden gems that mimic these iconic timepieces flawlessly, alongside revealing the best-kept secrets on where to find these sought-after fakes. Whether you're an aficionado looking to expand your collection or simply curious about the artistry behind high-end replicas, prepare to be captivated by a dazzling array of horological wonders that redefine what it truly means to own a prestigious Richard Mille watch.&lt;/p&gt;
&lt;p&gt;The data, (&lt;a href="http://en.wikipedia.org/wiki/GRIB" title="GRIB"&gt;GRIB&lt;/a&gt;), is a GDAL supported &lt;a href="http://www.gdal.org/frmt_grib.html" title="format"&gt;format&lt;/a&gt;, so MapServer can handle processing as a result.  The goal here was to create a &lt;a href="http://mapserver.org/mapfile/layer.html" title="LAYER"&gt;LAYER&lt;/a&gt; object.  First thing was to figure out the projection, then figure out the band pixel values/ranges and correlate to MapServer classes (in this case I just used a simple greyscale approach).&lt;/p&gt;
&lt;p&gt;Here's the hack:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;osgeo.gdal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;gdal&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;osgeo.osr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;osr&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
 &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Usage: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt; &amp;lt;file&amp;gt; &amp;lt;numclasses&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
 &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;cvr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;  &lt;span class="c1"&gt;# range of RGB values&lt;/span&gt;
&lt;span class="n"&gt;numclasses&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;  &lt;span class="c1"&gt;# number of classifiers&lt;/span&gt;

&lt;span class="n"&gt;ds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gdal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="c1"&gt;# get proj4 def and write out PROJECTION object&lt;/span&gt;
&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;osr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SpatialReference&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ImportFromWkt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetProjection&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;p2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ExportToProj4&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;  PROJECTION&amp;#39;&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;p2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
 &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;   &amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;quot;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;+&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;  END&amp;#39;&lt;/span&gt;

&lt;span class="c1"&gt;# get band pixel data ranges and classify&lt;/span&gt;
&lt;span class="n"&gt;band&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetRasterBand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;band&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetMinimum&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nb"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;band&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetMaximum&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;min&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nb"&gt;max&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="c1"&gt;# compute automagically&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;min&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;band&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ComputeRasterMinMax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# calculate range of pixel values&lt;/span&gt;
&lt;span class="n"&gt;pixel_value_range&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;max&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nb"&gt;min&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# calculate the intervals of values based on classes specified&lt;/span&gt;
&lt;span class="n"&gt;pixel_interval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pixel_value_range&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;numclasses&lt;/span&gt;
&lt;span class="c1"&gt;# calculate the intervals of color values&lt;/span&gt;
&lt;span class="n"&gt;color_interval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pixel_interval&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;cvr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;pixel_value_range&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numclasses&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
 &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&amp;#39;  CLASS&lt;/span&gt;
&lt;span class="s1"&gt;  NAME &amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%.2f&lt;/span&gt;&lt;span class="s1"&gt; to &lt;/span&gt;&lt;span class="si"&gt;%.2f&lt;/span&gt;&lt;span class="s1"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="s1"&gt;  EXPRESSION ([pixel] &amp;gt;= &lt;/span&gt;&lt;span class="si"&gt;%.2f&lt;/span&gt;&lt;span class="s1"&gt; AND [pixel] &amp;lt; &lt;/span&gt;&lt;span class="si"&gt;%.2f&lt;/span&gt;&lt;span class="s1"&gt;)&lt;/span&gt;
&lt;span class="s1"&gt;  STYLE&lt;/span&gt;
&lt;span class="s1"&gt;   COLOR &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;
&lt;span class="s1"&gt;  END&lt;/span&gt;
&lt;span class="s1"&gt; END&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;min&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;min&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;pixel_interval&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;min&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;min&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;pixel_interval&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cvr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cvr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cvr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="nb"&gt;min&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;pixel_interval&lt;/span&gt;
 &lt;span class="n"&gt;cvr&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color_interval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Running this script outputs various bits for MapServer mapfile configuration.  Passing more classes to the script creates more &lt;a href="http://www.mapserver.org/mapfile/class.html" title="CLASS"&gt;CLASS&lt;/a&gt; objects, resulting in a smoother looking image.&lt;/p&gt;
&lt;p&gt;Here's an example GetMap request:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://kralidis.ca/blog/blog/wp-content/uploads/2010/06/gem_model.png"&gt;&lt;img src="https://kralidis.ca/blog/blog/wp-content/uploads/2010/06/gem_model.png" title="Meteorological data in GRIB format via MapServer WMS" class="size-full wp-image-487 alignleft" style="border: 1px solid black;" width="502" height="299" alt="Meteorological data in GRIB format via MapServer WMS" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Users can query to obtain pixel values (water temperature in this case) via GetFeatureInfo.  Given that these are produced frequently, we can use the WMS GetMap TIME parameter to create time series maps of the models.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>OWSLib CSW Updates and Implementation Thoughts</title><link href="https://kralidis.ca/blog/blog/2010/05/07/owslib-csw-updates-and-implementation-thoughts/" rel="alternate"/><published>2010-05-07T21:34:00+00:00</published><updated>2010-05-07T21:34:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2010-05-07:/blog/blog/2010/05/07/owslib-csw-updates-and-implementation-thoughts/</id><summary type="html">&lt;p&gt;I've had some time to work on CSW support in &lt;a href="http://trac.gispython.org/lab/wiki/OwsLib" title="OWSLib"&gt;OWSLib&lt;/a&gt; in the last few days.  Some thoughts and updates:&lt;/p&gt;
&lt;h3&gt;FGDC Support Added&lt;/h3&gt;
&lt;p&gt;Some CSW endpoints out there serve up GetRecords responses in &lt;a href="http://www.fgdc.gov/metadata/csdgm/index_html" title="FGDC CSDGM"&gt;FGDC CSDGM&lt;/a&gt; format.  This has now been &lt;a href="http://trac.gispython.org/lab/ticket/223" title="added"&gt;added&lt;/a&gt; to &lt;a href="http://trac.gispython.org/lab/browser/OWSLib/trunk/owslib/fgdc.py" title="trunk"&gt;trunk&lt;/a&gt; (mandatory elements + eainfo).  Note that csw:Record …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I've had some time to work on CSW support in &lt;a href="http://trac.gispython.org/lab/wiki/OwsLib" title="OWSLib"&gt;OWSLib&lt;/a&gt; in the last few days.  Some thoughts and updates:&lt;/p&gt;
&lt;h3&gt;FGDC Support Added&lt;/h3&gt;
&lt;p&gt;Some CSW endpoints out there serve up GetRecords responses in &lt;a href="http://www.fgdc.gov/metadata/csdgm/index_html" title="FGDC CSDGM"&gt;FGDC CSDGM&lt;/a&gt; format.  This has now been &lt;a href="http://trac.gispython.org/lab/ticket/223" title="added"&gt;added&lt;/a&gt; to &lt;a href="http://trac.gispython.org/lab/browser/OWSLib/trunk/owslib/fgdc.py" title="trunk"&gt;trunk&lt;/a&gt; (mandatory elements + eainfo).  Note that csw:Record (DMCI + ows:BoundingBox) and ISO 19139 are already supported.  One tricky bit here is that FGDC was/is mostly implemented without a namespace, which CSW requires as an outputSchema parameter value.  I've used http://www.fgdc.gov for now.&lt;/p&gt;
&lt;p&gt;Both FGDC and ISO (moreso ISO) have deep and complex content models, so if there are elements that you don't see supported in OWSLib, please file an feature request ticket in trac, and I'll make sure to implement (and add to the doctests).&lt;/p&gt;
&lt;h3&gt;Metadata Identifiers are Important!&lt;/h3&gt;
&lt;p&gt;When parsing GetRecords requests, we store records in a Python dict, using /gmd:MD_Metadata/gmd:fileIdentifier (for ISO), /csw:Record/dc:identifier (for CSW's baseline) or /metadata/idinfo/datasetid (for FGDC).  Some responses return metadata without these ids for whatever reason.  This sets the dict key to Python's None type, which ends up overwriting the dict key's entry.  Not good.  I &lt;a href="http://trac.gispython.org/lab/ticket/219" title="implemented"&gt;implemented&lt;/a&gt; a &lt;a href="http://trac.gispython.org/lab/changeset/1629" title="fix"&gt;fix&lt;/a&gt; to set a random, non-persistent identifier so as not to lose data.&lt;/p&gt;
&lt;p&gt;Of course, the best solution here would be for providers to set identifiers accordingly from the start.  Then again, what happens when CSW endpoints harvest other CSWs and identifiers are the same?  Perhaps a namespace of some sort for the CSW would help.  This would be an interesting interoperability experiment.&lt;/p&gt;
&lt;h3&gt;Harvest Support Added&lt;/h3&gt;
&lt;p&gt;I &lt;a href="http://trac.gispython.org/lab/ticket/221" title="implemented"&gt;implemented&lt;/a&gt; a &lt;a href="http://trac.gispython.org/lab/changeset/1630" title="first pass"&gt;first pass&lt;/a&gt; of supporting Harvest operations.  CSW endpoints usually require authentication here, which may vary by the implementation.  Therefore, I've left this logic out of OWSLib as it's not part of the standard per se.&lt;/p&gt;
&lt;h3&gt;Transaction Support Coming&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://opengeo.org/about/team/sebastian.benthall/" title="Sebastian Benthall"&gt;Sebastian Benthall&lt;/a&gt; of &lt;a href="http://www.opengeo.org/" title="OpenGeo"&gt;OpenGeo&lt;/a&gt; has indicated that they are using OWSLib's CSW support for some of their projects (awesome!), and has kindly submitted a &lt;a href="http://trac.gispython.org/lab/ticket/218" title="patch"&gt;patch&lt;/a&gt; for an optional element issue (thanks Sebastian!).  He also indicated that Transaction support would be of interest, so I've &lt;a href="http://trac.gispython.org/lab/ticket/222" title="started"&gt;started&lt;/a&gt; to think about this one.  As with the Harvest operation, Transaction support also requires some sort of authentication, which we'll leave to the client implementation.  Most of the work will be with marshalling the request, as response handling is very similar to Harvest responses.&lt;/p&gt;
&lt;p&gt;Give it a go, submit bugs and enhancements to the &lt;a href="http://trac.gispython.org/lab/wiki/OwsLib" title="OWSLib trac"&gt;OWSLib trac&lt;/a&gt;.  Enjoy!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Batch Centroid Calculations with Python and OGR</title><link href="https://kralidis.ca/blog/blog/2010/04/28/batch-centroid-calculations-with-python-and-ogr/" rel="alternate"/><published>2010-04-28T10:19:00+00:00</published><updated>2010-04-28T10:19:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2010-04-28:/blog/blog/2010/04/28/batch-centroid-calculations-with-python-and-ogr/</id><summary type="html">&lt;p&gt;I recently had a question on how to do batch centroid calculations against GIS data. &lt;a href="http://www.gdal.ogr/ogr/" title="OGR"&gt;OGR&lt;/a&gt; to the rescue again!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.outlookindia.com/outlook-spotlight/richard-mille-replica-watches-where-to-buy-best-selling-fake-richard-mille-super-clones-news-313685"&gt;Richard Mille replica&lt;/a&gt; is a luxury watch brand founded in 1999 by French businessman and watchmaker, Richard Mille. Known for its innovative designs and high-tech materials, Richard Mille has become …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I recently had a question on how to do batch centroid calculations against GIS data. &lt;a href="http://www.gdal.ogr/ogr/" title="OGR"&gt;OGR&lt;/a&gt; to the rescue again!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.outlookindia.com/outlook-spotlight/richard-mille-replica-watches-where-to-buy-best-selling-fake-richard-mille-super-clones-news-313685"&gt;Richard Mille replica&lt;/a&gt; is a luxury watch brand founded in 1999 by French businessman and watchmaker, Richard Mille. Known for its innovative designs and high-tech materials, Richard Mille has become one of the most sought after brands in the world of luxury watches.&lt;/p&gt;
&lt;p&gt;However, with prices ranging from tens of thousands to millions of dollars, owning an authentic Richard Mille watch may seem like an unattainable dream for many. This is where the concept of replica watches comes into play.&lt;/p&gt;
&lt;p&gt;Replica watches are essentially copies or imitations of high-end designer watches that mimic their appearance and functionality. These replicas offer a more affordable alternative for those who desire the style and prestige associated with luxury brands like Richard Mille.&lt;/p&gt;
&lt;p&gt;But not all replica watches are created equal. There are various grades and qualities available in the market, making it crucial to do thorough research before making a purchase. And when it comes to Richard Mille replicas, it is essential to have a good understanding of what sets them apart from other replica watches.&lt;/p&gt;
&lt;p&gt;Using OGR's Python bindings (GDAL/OGR needs to be built --with-geos=yes), one can process, say, an ESRI Shapefile, and calculate a centroid for each feature.&lt;/p&gt;
&lt;p&gt;The script below does exactly this, and writes out a new dataset (any input / output format supported by OGR).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;osgeo.ogr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;ogr&lt;/span&gt;

&lt;span class="c1"&gt;# process args&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
 &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Usage: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt; &amp;lt;format&amp;gt; &amp;lt;input&amp;gt; &amp;lt;output&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
 &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# open input file&lt;/span&gt;
&lt;span class="n"&gt;dataset_in&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ogr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;dataset_in&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
 &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Open failed.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
 &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;layer_in&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataset_in&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetLayer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;feature_in&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;layer_in&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetNextFeature&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# create output&lt;/span&gt;
&lt;span class="n"&gt;driver_out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ogr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetDriverByName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;driver_out&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
 &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt; driver not available.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
 &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;dataset_out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;driver_out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateDataSource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;dataset_out&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
 &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Creation of output file failed.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
 &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;layer_out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataset_out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateLayer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ogr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wkbPoint&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;layer_out&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
 &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Layer creation failed.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
 &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# setup attributes&lt;/span&gt;
&lt;span class="n"&gt;feature_in_defn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;layer_in&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetLayerDefn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;feature_in_defn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetFieldCount&lt;/span&gt;&lt;span class="p"&gt;()):&lt;/span&gt;
 &lt;span class="n"&gt;field_def&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;feature_in_defn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetFieldDefn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;layer_out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;field_def&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Creating &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt; field failed.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;field_def&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetNameRef&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;layer_in&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResetReading&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;feature_in&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;layer_in&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetNextFeature&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# loop over input features, calculate centroid and output features&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;feature_in&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
 &lt;span class="n"&gt;feature_out_defn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;layer_out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetLayerDefn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
 &lt;span class="n"&gt;feature_out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ogr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Feature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;feature_out_defn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;feature_out_defn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetFieldCount&lt;/span&gt;&lt;span class="p"&gt;()):&lt;/span&gt;
  &lt;span class="n"&gt;feature_out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SetField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;feature_out_defn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetFieldDefn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetNameRef&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;   
 &lt;span class="n"&gt;feature_in&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="n"&gt;geom&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;feature_in&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetGeometryRef&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;centroid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;geom&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Centroid&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;feature_out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SetGeometry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;centroid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;layer_out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateFeature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;feature_out&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
   &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Failed to create feature.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
   &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;feature_in&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;layer_in&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetNextFeature&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# cleanup&lt;/span&gt;
&lt;span class="n"&gt;dataset_in&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Destroy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;dataset_out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Destroy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Oh Lord! You cannot imagine how stressful it is to program this type of software. Actually I like it a lot, I don't deny it, it's very challenging, but sometimes stress beats me and my head hurts, my stomach hurts, it makes me dizzy, or I even get nervous.&lt;/p&gt;
&lt;p&gt;For that reason sometimes I eat a lot and I get fat, and I get even more stressed, but thank God I found a product that helps me a lot with my obesity, because this product generates a &lt;a href="https://theislandnow.com/blog-112/best-appetite-suppressant/"&gt;decrease appetite&lt;/a&gt; so I can continue with my life at Despite how challenging it is to schedule every day. I really recommend it. Bye!&lt;/p&gt;</content><category term="geospatial, open source, technology"/></entry><entry><title>easy CSW with eXcat</title><link href="https://kralidis.ca/blog/blog/2010/03/14/easy-csw-with-excat/" rel="alternate"/><published>2010-03-14T21:52:00+00:00</published><updated>2010-03-14T21:52:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2010-03-14:/blog/blog/2010/03/14/easy-csw-with-excat/</id><summary type="html">&lt;p&gt;If you have existing metadata and simply want a &lt;a href="http://www.opengeospatial.org/standards/cat" title="CSW"&gt;CSW&lt;/a&gt; interface as a means to search and discover your geospatial metadata, eXcat provides a simple solution.  Following the &lt;a href="http://gdsc.nlr.nl/gdsc/software/excat/manual/installation_procedure_excat" title="installation steps"&gt;installation steps&lt;/a&gt;, it's quite simple to populate your CSW:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;excat&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;csw&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;WEB&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="bp"&gt;INF&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;harvest&lt;/span&gt;
&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tar&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;zxf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;my_metadata_files&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tgz&lt;/span&gt;
&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;in …&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;If you have existing metadata and simply want a &lt;a href="http://www.opengeospatial.org/standards/cat" title="CSW"&gt;CSW&lt;/a&gt; interface as a means to search and discover your geospatial metadata, eXcat provides a simple solution.  Following the &lt;a href="http://gdsc.nlr.nl/gdsc/software/excat/manual/installation_procedure_excat" title="installation steps"&gt;installation steps&lt;/a&gt;, it's quite simple to populate your CSW:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;excat&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;csw&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;WEB&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="bp"&gt;INF&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;harvest&lt;/span&gt;
&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tar&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;zxf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;my_metadata_files&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tgz&lt;/span&gt;
&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*.&lt;/span&gt;&lt;span class="n"&gt;xml&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;do&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;lwp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;download&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;http://localhost/excat/csw?request=Harvest&amp;amp;service=CSW&amp;amp;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;version=2.0.2\&amp;amp;namespace=xmlns(csw=http://www.opengis.net/cat/csw)&amp;amp;&lt;br&gt;
source=$i&amp;amp;resourceFormat=application/xml&lt;br&gt;
&amp;amp;resourceType=http://www.isotc211.org/2005/gmd"
    &amp;gt; done&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That's pretty much it.  Lightweight simple approach, particularly for those who already have metadata management tools in place and need CSW.&lt;/p&gt;
&lt;p&gt;/me thinks it would be nice to have a Python port of this for those in Java-less environments (why does it seem most CSW server implementations are in Java?)&lt;/p&gt;</content><category term="geospatial, technology, web"/></entry><entry><title>NYC Sprint is Upon Us</title><link href="https://kralidis.ca/blog/blog/2010/02/19/nyc-sprint-is-upon-us/" rel="alternate"/><published>2010-02-19T15:28:00+00:00</published><updated>2010-02-19T15:28:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2010-02-19:/blog/blog/2010/02/19/nyc-sprint-is-upon-us/</id><summary type="html">&lt;p&gt;Building on the &lt;a href="http://wiki.osgeo.org/wiki/Toronto_Code_Sprint_2009" title="Toronto Code Sprint 2009"&gt;Toronto Code Sprint 2009&lt;/a&gt; (I had the honour of helping &lt;a href="http://blog.cleverelephant.ca/" title="Paul"&gt;Paul&lt;/a&gt; set this up), this year MapServer, GDAL, PostGIS, etc. devs are headed to to the Big Apple for the &lt;a href="http://wiki.osgeo.org/wiki/New_York_Code_Sprint_2010" title="New York Code Sprint 2010"&gt;New York Code Sprint 2010&lt;/a&gt;.  Having participated in last year's event, I can say that it is …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Building on the &lt;a href="http://wiki.osgeo.org/wiki/Toronto_Code_Sprint_2009" title="Toronto Code Sprint 2009"&gt;Toronto Code Sprint 2009&lt;/a&gt; (I had the honour of helping &lt;a href="http://blog.cleverelephant.ca/" title="Paul"&gt;Paul&lt;/a&gt; set this up), this year MapServer, GDAL, PostGIS, etc. devs are headed to to the Big Apple for the &lt;a href="http://wiki.osgeo.org/wiki/New_York_Code_Sprint_2010" title="New York Code Sprint 2010"&gt;New York Code Sprint 2010&lt;/a&gt;.  Having participated in last year's event, I can say that it is a fun, spirited and productive event.  Though I won't be able to make it there in person this year, I will be among those 'present in spirit' on &lt;a href="irc://irc.freenode.net/#tosprint" title="#tosprint"&gt;#tosprint&lt;/a&gt; over the weekend.&lt;/p&gt;
&lt;p&gt;Keep an eye on Paul's blog for sprint &lt;a href="http://blog.cleverelephant.ca/2010/02/nyc-sprint-day-0.html" title="updates"&gt;updates&lt;/a&gt;.  Have fun guys!&lt;/p&gt;</content><category term="geospatial, open source, technology"/></entry><entry><title>GeoScript</title><link href="https://kralidis.ca/blog/blog/2010/02/19/geoscript/" rel="alternate"/><published>2010-02-19T15:01:00+00:00</published><updated>2010-02-19T15:01:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2010-02-19:/blog/blog/2010/02/19/geoscript/</id><content type="html">&lt;p&gt;&lt;a href="http://geoscript.org/" title="GeoScript"&gt;GeoScript&lt;/a&gt; looks like a neat effort to leverage GeoTools into Python (an increasingly widely used language for GIS scripting) and JavaScript.&lt;/p&gt;
&lt;p&gt;I love this for JavaScript, and I wonder how this relates to the other Python work out there (like &lt;a href="http://trac.gispython.org/lab/wiki/Shapely" title="Shapely"&gt;Shapely&lt;/a&gt; and &lt;a href="http://trac.gispython.org/lab/wiki/WorldMill" title="WorldMill"&gt;WorldMill&lt;/a&gt;); &lt;a href="http://sgillies.net/blog/" title="Sean"&gt;Sean&lt;/a&gt;?&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Libraries Rock</title><link href="https://kralidis.ca/blog/blog/2010/02/03/why-xml-libraries-rock/" rel="alternate"/><published>2010-02-03T18:46:00+00:00</published><updated>2010-02-03T18:46:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2010-02-03:/blog/blog/2010/02/03/why-xml-libraries-rock/</id><summary type="html">&lt;div class="component hero with-alignment col-12 space-xl-top"&gt;

&lt;div class="component-content"&gt;

&lt;div class="container body-copy"&gt;

&lt;div class="left-bottom hero-banner-title"&gt;

&lt;div&gt;

# Expert Tips

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="banner-image d-none d-md-block"&gt;

&lt;img src="https://www.adamspetcare.com/-/media/project/oneweb/adams/images/photos/blog/landing/blog_header.jpg?h=396&amp;amp;iar=0&amp;amp;w=1416&amp;amp;hash=FF4F6EF8EA944FF0CF40849EEE8524B4" width="1416" height="396" alt="Dog with Two Cats #1" /&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="row component column-splitter"&gt;

&lt;div class="col-12 col-lg-8"&gt;

&lt;div class="row"&gt;

&lt;div class="component article-listing col-12 space-xl-bottom"&gt;

&lt;div class="component-content"&gt;

&lt;div class="product-wrap"&gt;

&lt;div class="row"&gt;

&lt;div class="col-lg-12"&gt;

&lt;div class="row"&gt;

&lt;/div&gt;

&lt;div class="row"&gt;

&lt;/div&gt;

&lt;div id="article-type" class="product-result-tiles"&gt;

&lt;div id="article-wrapper" class="custom-listing-wrapper"&gt;

&lt;div class="card-body"&gt;

- &lt;div class="cgp-product h-100"&gt;

  &lt;div class="image-holder"&gt;

  ![Go to another part of the page](https://www.adamspetcare.com/-/media/Project/OneWeb/Adams/Images/Photos/Blog/Article/ticks.jpg)

  &lt;/div&gt;

  &lt;div class="body-copy"&gt;

  ### Ticks

  If you have pets, you probably know a thing or two about ticks, but maybe you're wondering how to prevent or get rid of ticks in …&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="component hero with-alignment col-12 space-xl-top"&gt;

&lt;div class="component-content"&gt;

&lt;div class="container body-copy"&gt;

&lt;div class="left-bottom hero-banner-title"&gt;

&lt;div&gt;

# Expert Tips

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="banner-image d-none d-md-block"&gt;

&lt;img src="https://www.adamspetcare.com/-/media/project/oneweb/adams/images/photos/blog/landing/blog_header.jpg?h=396&amp;amp;iar=0&amp;amp;w=1416&amp;amp;hash=FF4F6EF8EA944FF0CF40849EEE8524B4" width="1416" height="396" alt="Dog with Two Cats #1" /&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;div class="row component column-splitter"&gt;

&lt;div class="col-12 col-lg-8"&gt;

&lt;div class="row"&gt;

&lt;div class="component article-listing col-12 space-xl-bottom"&gt;

&lt;div class="component-content"&gt;

&lt;div class="product-wrap"&gt;

&lt;div class="row"&gt;

&lt;div class="col-lg-12"&gt;

&lt;div class="row"&gt;

&lt;/div&gt;

&lt;div class="row"&gt;

&lt;/div&gt;

&lt;div id="article-type" class="product-result-tiles"&gt;

&lt;div id="article-wrapper" class="custom-listing-wrapper"&gt;

&lt;div class="card-body"&gt;

- &lt;div class="cgp-product h-100"&gt;

  &lt;div class="image-holder"&gt;

  ![Go to another part of the page](https://www.adamspetcare.com/-/media/Project/OneWeb/Adams/Images/Photos/Blog/Article/ticks.jpg)

  &lt;/div&gt;

  &lt;div class="body-copy"&gt;

  ### Ticks

  If you have pets, you probably know a thing or two about ticks, but maybe you're wondering how to prevent or get rid of ticks in your yard or on your pet.

  &lt;/div&gt;

  &lt;/div&gt;

- &lt;div class="cgp-product h-100"&gt;

  &lt;div class="image-holder"&gt;

  ![Even a few fleas can be a problem for your dog.](https://www.adamspetcare.com/-/media/Project/OneWeb/Adams/Images/Photos/Blog/Article/dog-flea-infestation.jpg)

  &lt;/div&gt;

  &lt;div class="body-copy"&gt;

  ### How Many Fleas On A Dog Is Considered An Infestation?

  How many fleas on your dog is an infestation? Learn how to spot fleas, how many is too many, and how to deal with them.

  &lt;/div&gt;

  &lt;/div&gt;

- &lt;div class="cgp-product h-100"&gt;

  &lt;div class="image-holder"&gt;

  ![Go to another part of the page](https://www.adamspetcare.com/-/media/Project/OneWeb/Adams/Images/Photos/Blog/Article/ants.jpg)

  &lt;/div&gt;

  &lt;div class="body-copy"&gt;

  ### Ants

  Are ants wreaking havoc in your home? Find out how to get rid of ants (and carpenter ants) and how to prevent troublesome ant infestations in the first place.

  &lt;/div&gt;

  &lt;/div&gt;

- &lt;div class="cgp-product h-100"&gt;

  &lt;div class="image-holder"&gt;

  ![lyme-disease](https://www.adamspetcare.com/-/media/Project/OneWeb/Adams/Images/Photos/Blog/Article/lyme-disease.jpg)

  &lt;/div&gt;

  &lt;div class="body-copy"&gt;

  ### Symptoms Of Lyme Disease In Dogs

  Lyme disease can be a serious illness in dogs. Here's an inside look at what causes it and how you can prevent it.

  &lt;/div&gt;

  &lt;/div&gt;

- &lt;div class="cgp-product h-100"&gt;

  &lt;div class="image-holder"&gt;

  ![Mosquitoes are annoying, they bite, and they are noisy. If you](https://www.adamspetcare.com/-/media/Project/OneWeb/Adams/Images/Photos/Blog/Article/mosquitoes.jpg)

  &lt;/div&gt;

  &lt;div class="body-copy"&gt;

  ### Mosquitoes

  Plagued by mosquitoes? Wondering how to get rid of them? Should you spray? What if mosquitoes are in your house? Here are handy tips for mosquito control.

  &lt;/div&gt;

  &lt;/div&gt;

- &lt;div class="cgp-product h-100"&gt;

  &lt;div class="image-holder"&gt;

  ![flea-and-tick-season-101](https://www.adamspetcare.com/-/media/Project/OneWeb/Adams/Images/Photos/Blog/Article/flea-and-tick-season-101.jpg)

  &lt;/div&gt;

  &lt;div class="body-copy"&gt;

  ### Flea &amp; Tick Season 101

  Fleas and ticks can be a problem for pets all year long, even outside of the peak season. Learn all about their life cycles and how to protect against them. Read more about ***[Petfriendly purrs advance](https://www.petfriendlybox.com/products/purrs-advance-for-cats)***.

  &lt;/div&gt;

  &lt;/div&gt;

- &lt;div class="cgp-product h-100"&gt;

  &lt;div class="image-holder"&gt;

  ![camping with dogs](https://www.adamspetcare.com/-/media/Project/OneWeb/Adams/Images/Photos/Blog/Article/outdoor-activities.jpg)

  &lt;/div&gt;

  &lt;div class="body-copy"&gt;

  ### Autumn Outdoor Activities For Dogs

  Half the fun of having dogs in our lives is sharing various activities with them, including play dates at the dog park, camping, and hiking. Most dogs have lots of physical and mental energy—even saying the word “outside” can send them into a tail-wagging tizzy—so you’ll want to channel that energy into safe, fun activities you can both enjoy.

  &lt;/div&gt;

  &lt;/div&gt;

- &lt;div class="cgp-product h-100"&gt;

  &lt;div class="image-holder"&gt;

  ![high-risk-flea-areas](https://www.adamspetcare.com/-/media/Project/OneWeb/Adams/Images/Photos/Blog/Article/high-risk-flea-areas1.jpg)

  &lt;/div&gt;

  &lt;div class="body-copy"&gt;

  ### High Risk Flea Areas - Fleas In House

  Learn where fleas are commonly found and how to prevent them from traveling into your house on your pet.

  &lt;/div&gt;

  &lt;/div&gt;

- &lt;div class="cgp-product h-100"&gt;

  &lt;div class="image-holder"&gt;

  ![silverfish](https://www.adamspetcare.com/-/media/Project/OneWeb/Adams/Images/Photos/Blog/Article/silverfish.jpg)

  &lt;/div&gt;

  &lt;div class="body-copy"&gt;

  ### Silverfish

  Silverfish can be a nuisance around the house, so if you're wondering where they come from and how to get rid of these pesky insects, check out these silverfish facts and tips.

  &lt;/div&gt;

  &lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;</content><category term="geospatial, open source, technology"/></entry><entry><title>Why I Love Linux</title><link href="https://kralidis.ca/blog/blog/2009/12/11/why-i-love-linux/" rel="alternate"/><published>2009-12-11T21:48:00+00:00</published><updated>2009-12-11T21:48:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-12-11:/blog/blog/2009/12/11/why-i-love-linux/</id><content type="html">&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;uptime&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;up&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;112&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;06&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;load&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;average&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.09&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.18&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="open source, technology"/></entry><entry><title>Python, KML and Parishes</title><link href="https://kralidis.ca/blog/blog/2009/09/16/python-kml-and-parishes/" rel="alternate"/><published>2009-09-16T08:51:00+00:00</published><updated>2009-09-16T08:51:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-09-16:/blog/blog/2009/09/16/python-kml-and-parishes/</id><summary type="html">&lt;p&gt;When looking for phone numbers for various &lt;a href="http://www.gocanada.org/parishdirectory/index.htm" title="churches"&gt;churches&lt;/a&gt;, I thought wouldn't it be neat to put the locations on a map?&lt;/p&gt;
&lt;p&gt;Python to the rescue.  After some scraping to generate a CSV listing, I geocoded the addresses, then I used the OGR to convert into a KML document, using the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;When looking for phone numbers for various &lt;a href="http://www.gocanada.org/parishdirectory/index.htm" title="churches"&gt;churches&lt;/a&gt;, I thought wouldn't it be neat to put the locations on a map?&lt;/p&gt;
&lt;p&gt;Python to the rescue.  After some scraping to generate a CSV listing, I geocoded the addresses, then I used the OGR to convert into a KML document, using the same approach I previously &lt;a href="/blog/2007/12/28/two-milk-no-sugar/" title="blogged"&gt;blogged&lt;/a&gt; about.  Nice!&lt;/p&gt;
&lt;p&gt;Looking deeper, I wanted to have more exhaustive content within the \&amp;lt;description&amp;gt; element.  Turns out ogr2ogr has a -dsco DescriptionField=fieldname option, but I wanted more than that.  So I decided to hack the original CSV:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;
&lt;span class="normal"&gt;24&lt;/span&gt;
&lt;span class="normal"&gt;25&lt;/span&gt;
&lt;span class="normal"&gt;26&lt;/span&gt;
&lt;span class="normal"&gt;27&lt;/span&gt;
&lt;span class="normal"&gt;28&lt;/span&gt;
&lt;span class="normal"&gt;29&lt;/span&gt;
&lt;span class="normal"&gt;30&lt;/span&gt;
&lt;span class="normal"&gt;31&lt;/span&gt;
&lt;span class="normal"&gt;32&lt;/span&gt;
&lt;span class="normal"&gt;33&lt;/span&gt;
&lt;span class="normal"&gt;34&lt;/span&gt;
&lt;span class="normal"&gt;35&lt;/span&gt;
&lt;span class="normal"&gt;36&lt;/span&gt;
&lt;span class="normal"&gt;37&lt;/span&gt;
&lt;span class="normal"&gt;38&lt;/span&gt;
&lt;span class="normal"&gt;39&lt;/span&gt;
&lt;span class="normal"&gt;40&lt;/span&gt;
&lt;span class="normal"&gt;41&lt;/span&gt;
&lt;span class="normal"&gt;42&lt;/span&gt;
&lt;span class="normal"&gt;43&lt;/span&gt;
&lt;span class="normal"&gt;44&lt;/span&gt;
&lt;span class="normal"&gt;45&lt;/span&gt;
&lt;span class="normal"&gt;46&lt;/span&gt;
&lt;span class="normal"&gt;47&lt;/span&gt;
&lt;span class="normal"&gt;48&lt;/span&gt;
&lt;span class="normal"&gt;49&lt;/span&gt;
&lt;span class="normal"&gt;50&lt;/span&gt;
&lt;span class="normal"&gt;51&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/usr/bin/python&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;csv&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;urllib2&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;urllib&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lxml&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;

&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;greek_churches_canada.csv&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;kml&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nsmap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;http://www.opengis.net/kml/2.2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;,&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;,&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;,&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;http://maps.google.com/maps/geo?output=csv&amp;amp;q=&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quote_plus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;#print url&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;accuracy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;#print status, accuracy, lat, lon&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;200&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lat&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lon&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;subnode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Placemark&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;subsubnode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;subsubnode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;subsubnode2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;description&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;p&amp;gt;&amp;#39;&lt;/span&gt;
        &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;br/&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;, &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;br/&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;br/&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;none&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;br/&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;none&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;br/&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;none&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;a href=&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;quot;&amp;gt;Website&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;none&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;a href=&amp;quot;mailto:&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;quot;&amp;gt;Email&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;br/&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;/p&amp;gt;&amp;#39;&lt;/span&gt;
        &lt;span class="n"&gt;subsubnode2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CDATA&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;subsubnode3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Point&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;subsubsubnode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;coordinates&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;subsubsubnode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;, &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lon&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lat&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;subsubnode3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subsubsubnode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;subnode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subsubnode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;subnode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subsubnode2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;subnode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subsubnode3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subnode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tostring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;xml_declaration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;UTF-8&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pretty_print&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I wonder whether an OGR -dsco DescriptionTemplate=foo.txt, where foo.txt would look like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;table&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tr&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;th&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;City&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;th&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;[&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="o"&gt;]&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;th&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Province&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;th&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;[&lt;/span&gt;&lt;span class="n"&gt;province&lt;/span&gt;&lt;span class="o"&gt;]&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;tr&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;table&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Or anything the user specified, for that matter.  Then OGR would then use for each feature's \&amp;lt;description&amp;gt; element.&lt;/p&gt;
&lt;p&gt;Anyways, here's the resulting &lt;a href="http://maps.google.com/?q=http://www.kralidis.ca/gocanada/parishdirectory2.kml" title="map"&gt;map&lt;/a&gt;.  Cool!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Friday Metadata Thoughts</title><link href="https://kralidis.ca/blog/blog/2009/06/12/friday-metadata-thoughts/" rel="alternate"/><published>2009-06-12T14:00:00+00:00</published><updated>2009-06-12T14:00:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-06-12:/blog/blog/2009/06/12/friday-metadata-thoughts/</id><summary type="html">&lt;p&gt;Not the most exciting topic, but I've found myself knee deep in metadata standards as they pertain to CSW in the last &lt;a href="http://trac.gispython.org/lab/browser/OWSLib/trunk/owslib/csw.py" title="couple"&gt;couple&lt;/a&gt; of &lt;a href="http://trac.gispython.org/lab/browser/OWSLib/trunk/owslib/iso.py" title="weeks"&gt;weeks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I've made some &lt;a href="/blog/2009/02/05/ows-metadata-matters/" title="recommendations"&gt;recommendations&lt;/a&gt; in the past for OWS metadata, which have helped in established publishing requirements for cataloguing.&lt;/p&gt;
&lt;p&gt;Starting to look at ISO metadata …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Not the most exciting topic, but I've found myself knee deep in metadata standards as they pertain to CSW in the last &lt;a href="http://trac.gispython.org/lab/browser/OWSLib/trunk/owslib/csw.py" title="couple"&gt;couple&lt;/a&gt; of &lt;a href="http://trac.gispython.org/lab/browser/OWSLib/trunk/owslib/iso.py" title="weeks"&gt;weeks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I've made some &lt;a href="/blog/2009/02/05/ows-metadata-matters/" title="recommendations"&gt;recommendations&lt;/a&gt; in the past for OWS metadata, which have helped in established publishing requirements for cataloguing.&lt;/p&gt;
&lt;p&gt;Starting to look at ISO metadata (&lt;a href="http://www.iso.org/iso/catalogue_detail.htm?csnumber=26020" title="data"&gt;data&lt;/a&gt;, &lt;a href="http://www.iso.org/iso/catalogue_detail.htm?csnumber=39890" title="service"&gt;service&lt;/a&gt;) makes you quickly realize the pros and cons which come with making a standard flexible and exhaustive.  Let's take 19139; almost everything in the schema is optional.  I think this is where profiles (such as ISO North American Profile) start to become especially important.&lt;/p&gt;
&lt;p&gt;19119 is in the same boat.  Aside: then you start to wonder about the overlap between 19119 and OWS Capabilities metadata.  Wouldn't it be nice if GetCapabiilties returned a 19119 document instead?  Which could plop nicely in a CSW query response as well. Oh wait, it already does.  But then try to validate the document instance.  You'll find that OGC CSW and ISO &lt;a href="http://schemas.opengis.net/iso/19139/20060504/srv/srv.xsd" title="use"&gt;use&lt;/a&gt; &lt;a href="http://schemas.opengis.net/csw/2.0.2/CSW-discovery.xsd" title="different"&gt;different&lt;/a&gt; &lt;a href="http://schemas.opengis.net/iso/19139/20070417/gmd/gmd.xsd" title="versions"&gt;versions&lt;/a&gt; of GML (follow the refs in the .xsd's you'll see them soon enough), yet apply them to the same namespace.  So validation fails.  Harmonization required!&lt;/p&gt;
&lt;p&gt;Having said this, this is very complicated metadata which can be addressed by intelligent tools.  Tools that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;integrate with GIS systems which can automagically populate by:&lt;/li&gt;
&lt;li&gt;fetching spatial extents&lt;/li&gt;
&lt;li&gt;fetching reference system definitions&lt;/li&gt;
&lt;li&gt;establish hierarchy (this would be tough as it would be tied to the data management of the system)&lt;/li&gt;
&lt;li&gt;fetch contact information from a given user profile (how about getting this from the network's email / global address book against the logged in user?)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then again, what about &lt;a href="http://newgeography.net/wp/?p=3" title="keeping it simple"&gt;keeping it simple&lt;/a&gt; and &lt;a href="http://newgeography.net/wp/?p=1" title="mainstream"&gt;mainstream&lt;/a&gt; friendly?  The toughest part is metadata creation, so let's make it as easy as possible to do so!&lt;/p&gt;
&lt;p&gt;How do your activities try to make metadata easier to create?&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>new stuff in OWSLib</title><link href="https://kralidis.ca/blog/blog/2009/06/03/new-stuff-in-owslib/" rel="alternate"/><published>2009-06-03T18:29:00+00:00</published><updated>2009-06-03T18:29:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-06-03:/blog/blog/2009/06/03/new-stuff-in-owslib/</id><summary type="html">&lt;p&gt;I've been spending alot of time lately doing a &lt;a href="http://www.opengeospatial.org/standards/cat" title="CSW"&gt;CSW&lt;/a&gt; client library in python, which was committed today to &lt;a href="http://trac.gispython.org/lab/wiki/OwsLib" title="OWSLib"&gt;OWSLib&lt;/a&gt;.  CSW requests can be tricky to construct correctly, so this contribution attempts to provide an easy enough entry point to querying OGC Catalogues.&lt;/p&gt;
&lt;p&gt;At this point, you can query your …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I've been spending alot of time lately doing a &lt;a href="http://www.opengeospatial.org/standards/cat" title="CSW"&gt;CSW&lt;/a&gt; client library in python, which was committed today to &lt;a href="http://trac.gispython.org/lab/wiki/OwsLib" title="OWSLib"&gt;OWSLib&lt;/a&gt;.  CSW requests can be tricky to construct correctly, so this contribution attempts to provide an easy enough entry point to querying OGC Catalogues.&lt;/p&gt;
&lt;p&gt;At this point, you can query your favourite CSW server with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;owslib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;csw&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;http://example.org/csw&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetCapabilities&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# constructs XML request, in c.request&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# HTTP call.  Result in c.response&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetRecords&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;dataset&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;birds&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;152&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;52&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;84&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;# birds datasets in Canada       &lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetRecords&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;service&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;frog&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# look for services with frogs, anywhere&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;That's pretty much all there is to it.  There's also support for DescribeRecord, GetRecordById and GetDomain for the adventurous.&lt;/p&gt;
&lt;p&gt;I hope this will be a valuable addition.  Because CSW uses &lt;a href="http://www.opengeospatial.org/standards/filter" title="Filter"&gt;Filter&lt;/a&gt;, I broke things out into a module per standard, so that other code can reuse, say, filter for request building and response parsing.  A colleague is using this functionality to write a &lt;a href="http://www.qgis.org/" title="QGIS"&gt;QGIS&lt;/a&gt; CSW &lt;a href="http://lists.osgeo.org/pipermail/qgis-user/2009-June/005538.html" title="search plugin"&gt;search plugin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;My next goal will be to put in some response handling.  This will be tricky given the various outputSchema's a given CSW advertises.  For now, I will concentrate on the default csw:Record (a glorified Dublin Core with ows:BoundingBox).&lt;/p&gt;
&lt;p&gt;So try it out;  comments, feedback and suggestions would be most valued.&lt;/p&gt;
&lt;p&gt;Oh ya, thank you &lt;a href="http://docs.python.org/library/xml.etree.elementtree.html" title="etree"&gt;etree&lt;/a&gt;!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>MapServer 5.4.0 released</title><link href="https://kralidis.ca/blog/blog/2009/04/23/mapserver-540-released/" rel="alternate"/><published>2009-04-23T06:26:00+00:00</published><updated>2009-04-23T06:26:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-04-23:/blog/blog/2009/04/23/mapserver-540-released/</id><content type="html">&lt;p&gt;&lt;a href="http://lists.osgeo.org/pipermail/mapserver-users/2009-April/061037.html" title="Announced yesterday"&gt;Announced yesterday&lt;/a&gt;, this release closes 92 bugs, and adds some new goodies.&lt;/p&gt;
&lt;p&gt;Next stop: MapServer 6.0&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Sun, Oracle and MySQL</title><link href="https://kralidis.ca/blog/blog/2009/04/20/sun-oracle-and-mysql/" rel="alternate"/><published>2009-04-20T08:32:00+00:00</published><updated>2009-04-20T08:32:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-04-20:/blog/blog/2009/04/20/sun-oracle-and-mysql/</id><content type="html">&lt;p&gt;&lt;a href="http://www.sun.com/third-party/global/oracle/"&gt;http://www.sun.com/third-party/global/oracle/&lt;/a&gt;.  I wonder what this will mean for &lt;a href="http://www.mysql.com/" title="MySQL"&gt;MySQL&lt;/a&gt;?&lt;/p&gt;</content><category term="open source, technology"/></entry><entry><title>Creating sitemap files for GeoNetwork</title><link href="https://kralidis.ca/blog/blog/2009/04/15/creating-sitemap-files-for-geonetwork/" rel="alternate"/><published>2009-04-15T18:44:00+00:00</published><updated>2009-04-15T18:44:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-04-15:/blog/blog/2009/04/15/creating-sitemap-files-for-geonetwork/</id><summary type="html">&lt;p&gt;&lt;a href="http://www.sitemaps.org/" title="Sitemaps"&gt;Sitemaps&lt;/a&gt; are a valuable way to index your content for web crawlers.  &lt;a href="http://geonetwork-opensource.org/" title="GeoNetwork"&gt;GeoNetwork&lt;/a&gt; is a great tool for metadata management and a portal environment for discovery.  I wanted to push out all metadata resources out as a sitemap so that content can be found by web crawlers.  Python to the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="http://www.sitemaps.org/" title="Sitemaps"&gt;Sitemaps&lt;/a&gt; are a valuable way to index your content for web crawlers.  &lt;a href="http://geonetwork-opensource.org/" title="GeoNetwork"&gt;GeoNetwork&lt;/a&gt; is a great tool for metadata management and a portal environment for discovery.  I wanted to push out all metadata resources out as a sitemap so that content can be found by web crawlers.  Python to the rescue:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;
&lt;span class="normal"&gt;24&lt;/span&gt;
&lt;span class="normal"&gt;25&lt;/span&gt;
&lt;span class="normal"&gt;26&lt;/span&gt;
&lt;span class="normal"&gt;27&lt;/span&gt;
&lt;span class="normal"&gt;28&lt;/span&gt;
&lt;span class="normal"&gt;29&lt;/span&gt;
&lt;span class="normal"&gt;30&lt;/span&gt;
&lt;span class="normal"&gt;31&lt;/span&gt;
&lt;span class="normal"&gt;32&lt;/span&gt;
&lt;span class="normal"&gt;33&lt;/span&gt;
&lt;span class="normal"&gt;34&lt;/span&gt;
&lt;span class="normal"&gt;35&lt;/span&gt;
&lt;span class="normal"&gt;36&lt;/span&gt;
&lt;span class="normal"&gt;37&lt;/span&gt;
&lt;span class="normal"&gt;38&lt;/span&gt;
&lt;span class="normal"&gt;39&lt;/span&gt;
&lt;span class="normal"&gt;40&lt;/span&gt;
&lt;span class="normal"&gt;41&lt;/span&gt;
&lt;span class="normal"&gt;42&lt;/span&gt;
&lt;span class="normal"&gt;43&lt;/span&gt;
&lt;span class="normal"&gt;44&lt;/span&gt;
&lt;span class="normal"&gt;45&lt;/span&gt;
&lt;span class="normal"&gt;46&lt;/span&gt;
&lt;span class="normal"&gt;47&lt;/span&gt;
&lt;span class="normal"&gt;48&lt;/span&gt;
&lt;span class="normal"&gt;49&lt;/span&gt;
&lt;span class="normal"&gt;50&lt;/span&gt;
&lt;span class="normal"&gt;51&lt;/span&gt;
&lt;span class="normal"&gt;52&lt;/span&gt;
&lt;span class="normal"&gt;53&lt;/span&gt;
&lt;span class="normal"&gt;54&lt;/span&gt;
&lt;span class="normal"&gt;55&lt;/span&gt;
&lt;span class="normal"&gt;56&lt;/span&gt;
&lt;span class="normal"&gt;57&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/usr/bin/python&lt;/span&gt;


&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;MySQLdb&lt;/span&gt;


&lt;span class="c1"&gt;# connect to db&lt;/span&gt;

&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;MySQLdb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;127.0.0.1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;foo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;passwd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;foo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;geonetwork&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="c1"&gt;# print out XML header&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;/span&gt;

&lt;span class="s2"&gt;&amp;lt;urlset&lt;/span&gt;

&lt;span class="s2"&gt; xmlns=&amp;quot;http://www.sitemaps.org/schemas/sitemap/0.9&amp;quot;&lt;/span&gt;

&lt;span class="s2"&gt; xmlns:geo=&amp;quot;http://www.google.com/geo/schemas/sitemap/1.0&amp;quot;&lt;/span&gt;

&lt;span class="s2"&gt; xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;/span&gt;

&lt;span class="s2"&gt; xsi:schemaLocation=&amp;quot;http://www.sitemaps.org/schemas/sitemap/0.9&lt;/span&gt;

&lt;span class="s2"&gt; http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd&amp;quot;&amp;gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# fetch all metadata&lt;/span&gt;

&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;select id, schemaId, changeDate from Metadata where isTemplate = &amp;#39;n&amp;#39;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;store_result&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fetch_row&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="c1"&gt;# write out a url element&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;fgdc-std&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

        &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;http://devgeo.cciw.ca/geonetwork/srv/en/fgdc.xml&amp;#39;&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;iso19139&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

        &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;http://devgeo.cciw.ca/geonetwork/srv/en/iso19139.xml&amp;#39;&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot; &amp;lt;url&amp;gt;&lt;/span&gt;

&lt;span class="s2"&gt;  &amp;lt;loc&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;?id=&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;

&lt;span class="s2"&gt;  &amp;lt;lastmod&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/lastmod&amp;gt;&lt;/span&gt;

&lt;span class="s2"&gt;  &amp;lt;geo:geo&amp;gt;&lt;/span&gt;

&lt;span class="s2"&gt;   &amp;lt;geo:format&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/geo:format&amp;gt;&lt;/span&gt;

&lt;span class="s2"&gt;  &amp;lt;/geo:geo&amp;gt;&lt;/span&gt;

&lt;span class="s2"&gt; &amp;lt;/url&amp;gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;/urlset&amp;gt;&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Done!  It would be great if this were an out-of-the-box feature of GeoNetwork.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Using Python to parse config files</title><link href="https://kralidis.ca/blog/blog/2009/04/13/using-python-to-parse-config-files/" rel="alternate"/><published>2009-04-13T09:18:00+00:00</published><updated>2009-04-13T09:18:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-04-13:/blog/blog/2009/04/13/using-python-to-parse-config-files/</id><summary type="html">&lt;p&gt;Alot of tools out there have some sort of configuration which, at run time, is read and used in the process accordingly.  When writing tools, my config file format has always been something like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;My&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Tool&lt;/span&gt;

&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;commented&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;

&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;This&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;my&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tool&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;another&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;comment&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Since I'm using …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Alot of tools out there have some sort of configuration which, at run time, is read and used in the process accordingly.  When writing tools, my config file format has always been something like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;My&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Tool&lt;/span&gt;

&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;commented&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;

&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;This&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;my&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tool&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;another&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;comment&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Since I'm using Python for much of my scripting these days, I decided to write a small parser to handle this type of config.  So here's what I've come up with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;fileinput&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;re&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delim&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;:&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;span class="sd"&gt;        Parses a config file formatted like:&lt;/span&gt;
&lt;span class="sd"&gt;        foo: bar&lt;/span&gt;
&lt;span class="sd"&gt;        # comments: out line&lt;/span&gt;
&lt;span class="sd"&gt;        - comments allowed (#)&lt;/span&gt;
&lt;span class="sd"&gt;        - empty lines allowed&lt;/span&gt;
&lt;span class="sd"&gt;        - spaces allowed&lt;/span&gt;

&lt;span class="sd"&gt;    &amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;

    &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;fileinput&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="c1"&gt;# skip empty or space padded lines&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;^#&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# skip commented lines&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# pick up key and value pairs&lt;/span&gt;
            &lt;span class="n"&gt;kvp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delim&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;kvp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;#&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;kvp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kvp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;#&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;kvp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kvp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Seems w&lt;/p&gt;</content><category term="open source, technology"/></entry><entry><title>MapServer Disaster: you have got to be kidding me</title><link href="https://kralidis.ca/blog/blog/2009/04/01/mapserver-disaster-you-have-got-to-be-kidding-me/" rel="alternate"/><published>2009-04-01T15:27:00+00:00</published><updated>2009-04-01T15:27:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-04-01:/blog/blog/2009/04/01/mapserver-disaster-you-have-got-to-be-kidding-me/</id><content type="html">&lt;p&gt;&lt;a href="http://n2.nabble.com/FW%3A-MapServer-enhancements-refactoring-project-td2571268.html"&gt;http://n2.nabble.com/FW%3A-MapServer-enhancements-refactoring-project-td2571268.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I'm beyond words at this point.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>fun with Shapelib</title><link href="https://kralidis.ca/blog/blog/2009/03/23/fun-with-shapelib/" rel="alternate"/><published>2009-03-23T10:27:00+00:00</published><updated>2009-03-23T10:27:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-03-23:/blog/blog/2009/03/23/fun-with-shapelib/</id><summary type="html">&lt;p&gt;We have some existing C modules which do a bunch of data processing, and wanted the ability to spit out shapefiles on demand.  &lt;a href="http://shapelib.maptools.org/" title="Shapelib"&gt;Shapelib&lt;/a&gt; is a C library which allows for reading and writing shapefiles and dbf files.  Thanks to the &lt;a href="http://shapelib.maptools.org/shp_api.html" title="API"&gt;API&lt;/a&gt; &lt;a href="http://shapelib.maptools.org/dbf_api.html" title="docs"&gt;docs&lt;/a&gt;, here's a pared down version of how …&lt;/p&gt;</summary><content type="html">&lt;p&gt;We have some existing C modules which do a bunch of data processing, and wanted the ability to spit out shapefiles on demand.  &lt;a href="http://shapelib.maptools.org/" title="Shapelib"&gt;Shapelib&lt;/a&gt; is a C library which allows for reading and writing shapefiles and dbf files.  Thanks to the &lt;a href="http://shapelib.maptools.org/shp_api.html" title="API"&gt;API&lt;/a&gt; &lt;a href="http://shapelib.maptools.org/dbf_api.html" title="docs"&gt;docs&lt;/a&gt;, here's a pared down version of how to write a new point shapefile (with, in this case, one record):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;libshp/shapefil.h&amp;gt;&lt;/span&gt;

&lt;span class="cm"&gt;/*&lt;/span&gt;
&lt;span class="cm"&gt; build with: gcc -O -Wall -ansi -pedantic -g -L/usr/local/lib -lshp foo.c&lt;/span&gt;
&lt;span class="cm"&gt;*/&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;SHPHandle&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;hSHP&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;SHPObject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;oSHP&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;DBFHandle&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;hDBF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;malloc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;malloc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="cm"&gt;/* create shapefile and dbf */&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;hSHP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SHPCreate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;bar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SHPT_POINT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;hDBF&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DBFCreate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;bar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;DBFAddField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hDBF&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;stationid&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FTString&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="cm"&gt;/* add record */&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;-75&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;oSHP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SHPCreateSimpleObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SHPT_POINT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;SHPWriteObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hSHP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;-1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;oSHP&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;DBFWriteStringAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hDBF&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;abcdef&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="cm"&gt;/* destroy */&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;SHPDestroyObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;oSHP&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="cm"&gt;/* close shapefile and dbf */&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;SHPClose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hSHP&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;DBFClose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hDBF&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Done!&lt;/p&gt;</content><category term="geospatial, open source, technology"/></entry><entry><title>Less Than 4 Hours</title><link href="https://kralidis.ca/blog/blog/2009/03/12/less-than-4-hours/" rel="alternate"/><published>2009-03-12T09:30:00+00:00</published><updated>2009-03-12T09:30:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-03-12:/blog/blog/2009/03/12/less-than-4-hours/</id><content type="html">&lt;p&gt;A benefit of open source.&lt;/p&gt;
&lt;p&gt;\&amp;lt; 4 hours.  That's how long it took to address a &lt;a href="http://trac.osgeo.org/mapserver/ticket/2935" title="MapServer bug in WMS 1.3.0"&gt;MapServer bug in WMS 1.3.0&lt;/a&gt;.  Having been on the other side of these many times, it's gratifying to bang out quick fixes as well.&lt;/p&gt;
&lt;p&gt;Committing often :)&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>MapServer Code Sprint Progress</title><link href="https://kralidis.ca/blog/blog/2009/03/10/mapserver-code-sprint-progress/" rel="alternate"/><published>2009-03-10T16:22:00+00:00</published><updated>2009-03-10T16:22:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-03-10:/blog/blog/2009/03/10/mapserver-code-sprint-progress/</id><summary type="html">&lt;p&gt;MapServer action from the &lt;a href="http://wiki.osgeo.org/wiki/Toronto_Code_Sprint_2009" title="Toronto Code Sprint 2009"&gt;Toronto Code Sprint 2009&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;repository &lt;a href="http://trac.osgeo.org/mapserver/timeline?from=03%2F09%2F09&amp;amp;daysback=2&amp;amp;changeset=on&amp;amp;update=Update" title="changes"&gt;changes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;all trac &lt;a href="http://trac.osgeo.org/mapserver/timeline?from=03%2F09%2F09&amp;amp;daysback=3&amp;amp;milestone=on&amp;amp;ticket=on&amp;amp;ticket_details=on&amp;amp;changeset=on&amp;amp;wiki=on&amp;amp;update=Update" title="activity"&gt;activity&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Paul has full details on his blog (&lt;a href="http://blog.cleverelephant.ca/2009/03/sprint-day-1.html" title="day 1"&gt;day 1&lt;/a&gt;, &lt;a href="http://blog.cleverelephant.ca/2009/03/sprint-day-2.html" title="day 2"&gt;day 2&lt;/a&gt;, &lt;a href="http://blog.cleverelephant.ca/2009/03/sprint-day-3.html" title="day 3"&gt;day 3&lt;/a&gt;, &lt;a href="http://blog.cleverelephant.ca/2009/03/sprint-day-4.html" title="day 4"&gt;day 4&lt;/a&gt;, &lt;a href="http://blog.cleverelephant.ca/2009/03/toronto-code-sprint-lessons.html" title="post-mortem"&gt;post-mortem&lt;/a&gt;).  More details from Chris (&lt;a href="http://crschmidt.net/blog/374/toronto-code-sprint-day-1/" title="day 1"&gt;day 1&lt;/a&gt;, &lt;a href="http://crschmidt.net/blog/376/toronto-code-sprint-day-2/" title="day 2"&gt;day 2&lt;/a&gt;, &lt;a href="http://crschmidt.net/blog/380/code-sprint-day-3/" title="day 3"&gt;day 3&lt;/a&gt;, day 4).  Also check out some &lt;a href="http://www.flickr.com/search/?q=tosprint" title="pictures"&gt;pictures&lt;/a&gt; from the event.&lt;/p&gt;
&lt;p&gt;Personally …&lt;/p&gt;</summary><content type="html">&lt;p&gt;MapServer action from the &lt;a href="http://wiki.osgeo.org/wiki/Toronto_Code_Sprint_2009" title="Toronto Code Sprint 2009"&gt;Toronto Code Sprint 2009&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;repository &lt;a href="http://trac.osgeo.org/mapserver/timeline?from=03%2F09%2F09&amp;amp;daysback=2&amp;amp;changeset=on&amp;amp;update=Update" title="changes"&gt;changes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;all trac &lt;a href="http://trac.osgeo.org/mapserver/timeline?from=03%2F09%2F09&amp;amp;daysback=3&amp;amp;milestone=on&amp;amp;ticket=on&amp;amp;ticket_details=on&amp;amp;changeset=on&amp;amp;wiki=on&amp;amp;update=Update" title="activity"&gt;activity&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Paul has full details on his blog (&lt;a href="http://blog.cleverelephant.ca/2009/03/sprint-day-1.html" title="day 1"&gt;day 1&lt;/a&gt;, &lt;a href="http://blog.cleverelephant.ca/2009/03/sprint-day-2.html" title="day 2"&gt;day 2&lt;/a&gt;, &lt;a href="http://blog.cleverelephant.ca/2009/03/sprint-day-3.html" title="day 3"&gt;day 3&lt;/a&gt;, &lt;a href="http://blog.cleverelephant.ca/2009/03/sprint-day-4.html" title="day 4"&gt;day 4&lt;/a&gt;, &lt;a href="http://blog.cleverelephant.ca/2009/03/toronto-code-sprint-lessons.html" title="post-mortem"&gt;post-mortem&lt;/a&gt;).  More details from Chris (&lt;a href="http://crschmidt.net/blog/374/toronto-code-sprint-day-1/" title="day 1"&gt;day 1&lt;/a&gt;, &lt;a href="http://crschmidt.net/blog/376/toronto-code-sprint-day-2/" title="day 2"&gt;day 2&lt;/a&gt;, &lt;a href="http://crschmidt.net/blog/380/code-sprint-day-3/" title="day 3"&gt;day 3&lt;/a&gt;, day 4).  Also check out some &lt;a href="http://www.flickr.com/search/?q=tosprint" title="pictures"&gt;pictures&lt;/a&gt; from the event.&lt;/p&gt;
&lt;p&gt;Personally, I was happy to bang out fixes for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;optionally disabling SLD for WMS (&lt;a href="http://trac.osgeo.org/mapserver/ticket/1395" title="#1395"&gt;#1395&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;support for resultType=hits for WFS (&lt;a href="http://trac.osgeo.org/mapserver/ticket/2907" title="#2907"&gt;#2907&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;working code for WFS spatial filters against the new GEOS thread safe C API (&lt;a href="http://trac.osgeo.org/mapserver/ticket/2929" title="#2929"&gt;#2929&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;WFS 1.1.0 supporting OWS Common 1.0.0 instead of 1.1.0 (&lt;a href="http://trac.osgeo.org/mapserver/ticket/2925" title="#2925"&gt;#2925&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;The beginnings of support for correct axis ordering for WFS 1.1.0 (&lt;a href="http://trac.osgeo.org/mapserver/ticket/2899" title="#2899"&gt;#2899&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Good times!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt; 12 March 2009: here's a &lt;a href="http://mapfishblog.blogspot.com/2009/03/camtpocamp-at-toronto-code-sprint.html" title="Camptocamp report"&gt;Camptocamp report&lt;/a&gt; of the event.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>TO Code Sprint is upon us</title><link href="https://kralidis.ca/blog/blog/2009/03/05/to-code-sprint-is-upon-us/" rel="alternate"/><published>2009-03-05T07:33:00+00:00</published><updated>2009-03-05T07:33:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-03-05:/blog/blog/2009/03/05/to-code-sprint-is-upon-us/</id><content type="html">&lt;p&gt;The &lt;a href="http://wiki.osgeo.org/wiki/Toronto_Code_Sprint_2009" title="code sprint"&gt;code sprint&lt;/a&gt; starts Saturday, and there's a good turnout of folks from the various OSGeo projects.&lt;/p&gt;
&lt;p&gt;If you'd like to participate, you can join us on IRC at &lt;a href="irc://irc.freenode.net/tosprint" title="#tosprint"&gt;#tosprint&lt;/a&gt; and be there &lt;a href="http://wiki.osgeo.org/wiki/Toronto_Code_Sprint_2009#Present_in_spirit" title="in spirit"&gt;in spirit&lt;/a&gt;.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>MapServer 5.4.0-beta1 is out</title><link href="https://kralidis.ca/blog/blog/2009/02/19/mapserver-540-beta1-is-out/" rel="alternate"/><published>2009-02-19T07:04:00+00:00</published><updated>2009-02-19T07:04:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-02-19:/blog/blog/2009/02/19/mapserver-540-beta1-is-out/</id><content type="html">&lt;p&gt;&lt;a href="http://www.mapserver.org/download.html" title="Check it out"&gt;Check it out&lt;/a&gt;.  A few &lt;a href="http://lists.osgeo.org/pipermail/mapserver-users/2009-February/060005.html" title="RFCs addressed"&gt;RFCs addressed&lt;/a&gt;, among them OGC WMS 1.3.0 server support.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>WMS 1.3.0 now in MapServer trunk</title><link href="https://kralidis.ca/blog/blog/2009/02/12/wms-130-now-in-mapserver-trunk/" rel="alternate"/><published>2009-02-12T19:33:00+00:00</published><updated>2009-02-12T19:33:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-02-12:/blog/blog/2009/02/12/wms-130-now-in-mapserver-trunk/</id><content type="html">&lt;p&gt;Fresh in &lt;a href="http://trac.osgeo.org/mapserver/changeset/8544" title="svn trunk"&gt;svn trunk&lt;/a&gt;, MapServer now has WMS 1.3.0 Server support and will be part of the forthcoming 5.4 release.&lt;/p&gt;
&lt;p&gt;It will interesting to see the use WMS 1.3.0 gets, given the significant changes from 1.1.1.&lt;/p&gt;
&lt;p&gt;Great work Assefa!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>OWS Metadata Matters</title><link href="https://kralidis.ca/blog/blog/2009/02/05/ows-metadata-matters/" rel="alternate"/><published>2009-02-05T16:53:00+00:00</published><updated>2009-02-05T16:53:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-02-05:/blog/blog/2009/02/05/ows-metadata-matters/</id><summary type="html">&lt;p&gt;This has seemingly been the theme for me in the last few weeks.  From publishing to discovery, lack of metadata in OWS endpoints results in increased metadata management away from source, as well as crappy search results.&lt;/p&gt;
&lt;p&gt;So here's some friendly advice:&lt;/p&gt;
&lt;p&gt;Service Metadata&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fill out title, abstract (representative of …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;This has seemingly been the theme for me in the last few weeks.  From publishing to discovery, lack of metadata in OWS endpoints results in increased metadata management away from source, as well as crappy search results.&lt;/p&gt;
&lt;p&gt;So here's some friendly advice:&lt;/p&gt;
&lt;p&gt;Service Metadata&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fill out title, abstract (representative of the OWS as a whole) with descriptive metadata&lt;/li&gt;
&lt;li&gt;fill out keywords to categorize the service.  If possible, use a known &lt;a href="http://gcmd.nasa.gov/Resources/valids/" title="thesaurus"&gt;thesaurus&lt;/a&gt;, or one specific to your organization.  Don't use keywords like "OGC"; we already know it's an OGC service from the get-go by interacting with it&lt;/li&gt;
&lt;li&gt;fill out contact information.  &lt;a href="http://www.opengeospatial.org/standards/common" title="OWS Common"&gt;OWS Common&lt;/a&gt; defines ServiceProvider metadata constructs, so if your organization has a service provider dishing out your OWS, they belong in this metadata.  This is a contact person for the service itself, not the data&lt;/li&gt;
&lt;li&gt;fill out Fees and AccessConstraints.  If there aren't any, use the term "None"&lt;/li&gt;
&lt;li&gt;the OnlineResource for Service Metadata might be some website, not the URL of the service itself (we already get this from the OperationsMetadata)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Content Metadata&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fill in title, abstract and keywords in the same manner as above, specific to the given Layer/FeatureType/Coverage/ObservationOffering.  A title like "ROAD_1M" doesn't cut it&lt;/li&gt;
&lt;li&gt;your data comes with an &lt;a href="http://www.fgdc.gov/metadata/geospatial-metadata-standards" title="FGDC"&gt;FGDC&lt;/a&gt; or &lt;a href="http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=26020" title="ISO 19115"&gt;ISO 19115&lt;/a&gt; XML document already, right?  :) Use MetadataURL to point to the XML document.  Smart catalogues will harvest this too and associate it with the resource&lt;/li&gt;
&lt;li&gt;WMS DataURL: if the data can be downloaded online (tgz/zip/etc.), point to it here.  Or, put a pointer to an access service like WFS/WCS/SOS&lt;/li&gt;
&lt;li&gt;WMS Layer Attribution: this provides reference to the content provider (URL, title and LogoURL).  Filling in LogoURL is neat as catalogues can display this when users search for content.  If possible, use an image of smaller dimensions so as to display as a thumbnail&lt;/li&gt;
&lt;li&gt;Last but not least, bounding boxes.  Whether your OWS software automagically calculates these per layer on the fly, or you can override these and set before runtime, please set spatial extents accordingly.  This improves searching spatially by leaps and bounds.  Don't settle for the often used default of -180, -90, 180, 90 unless it is really a global dataset&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From here, OGC Catalogues will be able to harvest your metadata and provide useful search results.  For wider spread discovery, throw an OpenSearch definition in front of your CSW.  Wrap your OWS endpoints in KML/GeoRSS documents (Geo Sitemaps too), and you'll power mainstream use of your stuff.&lt;/p&gt;
&lt;p&gt;Funeral news from &lt;a href="https://newrestfunerals.co.uk/"&gt;newrestfunerals.co.uk&lt;/a&gt; said:&lt;br&gt;
'Mourners buried under a bridge for the lost'&lt;/p&gt;
&lt;p&gt;A group of members of London's funeral procession paid their respects to a man and his mother at the Royal Greenwich Cathedral where they lost a loved one to cancer&lt;/p&gt;
&lt;p&gt;The two sisters and their daughter, who was buried the same night, were buried at the Royal Greenwich Cathedral, where he passed away last weekend.&lt;/p&gt;
&lt;p&gt;Grieve: The two sisters and their daughter, who was buried the same night, were buried at the Royal Greenwich Cathedral, where he passed away last weekend&lt;/p&gt;
&lt;p&gt;At the bottom of the stairs of the church, you can see a cemeterie. It looked like an Indian wedding feast to the first group and there were candles and flowers on the ceiling.&lt;/p&gt;
&lt;p&gt;The funeral family were in their homes in London but only a brief family procession was in progress.&lt;/p&gt;
&lt;p&gt;The group had gathered in a cemeterie outside the cathedral and the coffin was handed over to the funeral director.&lt;/p&gt;
&lt;p&gt;The funeral director also handed in to the British Transport Police and they placed the coffin in a safe house at Queen's Park, New York.&lt;/p&gt;
&lt;p&gt;The couple went to the funeral home and their body was found on the day of the operation.&lt;/p&gt;
&lt;p&gt;Casket search: 'Mourners raised at arms pace'&lt;/p&gt;
&lt;p&gt;No word on a cause of death or why they died but the couple's family said in a statement.&lt;/p&gt;
&lt;p&gt;Bye bye useless searches!&lt;/p&gt;</content><category term="geospatial, technology, web"/></entry><entry><title>Fun with CGDI Services, OpenLayers and jQuery</title><link href="https://kralidis.ca/blog/blog/2009/02/01/fun-with-cgdi-services-openlayers-and-jquery/" rel="alternate"/><published>2009-02-01T17:27:00+00:00</published><updated>2009-02-01T17:27:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-02-01:/blog/blog/2009/02/01/fun-with-cgdi-services-openlayers-and-jquery/</id><summary type="html">&lt;p&gt;For years in the &lt;a href="http://www.cgdi.ca/" title="CGDI"&gt;CGDI&lt;/a&gt;, we've had various 'common' services; basic XML over HTTP / OGC-ish web services which allow a user to lookup and geocode based on different Canadian spatial identifiers, or keywords.  In their first life (mid 1990s), these existed as embedded lookup tools to facilitate searching and publishing …&lt;/p&gt;</summary><content type="html">&lt;p&gt;For years in the &lt;a href="http://www.cgdi.ca/" title="CGDI"&gt;CGDI&lt;/a&gt;, we've had various 'common' services; basic XML over HTTP / OGC-ish web services which allow a user to lookup and geocode based on different Canadian spatial identifiers, or keywords.  In their first life (mid 1990s), these existed as embedded lookup tools to facilitate searching and publishing in the &lt;a href="http://geodiscover.cgdi.ca/" title="GeoConnections Discovery Portal"&gt;GeoConnections Discovery Portal&lt;/a&gt; (GDP), then called Canadian Earth Observation Network (CEONet).&lt;/p&gt;
&lt;p&gt;CEONet started to publish reusable components (RUCs), which allowed a developer to create an HTML template with special tags to embed these RUCs so as to spatially enable their applications.  Because of the JavaScript security model, the developer passed the template to the CEONet RUC server, which slurped the template and served it up from its own domain.&lt;/p&gt;
&lt;p&gt;In both iterations, the backends were driven by database or HTML scrapes which outputted CSV-ish type output.&lt;/p&gt;
&lt;p&gt;Since v3, (2001-ish) and the rise of Web Services, these RUCs became services themselves, thereby eliminating the need to go through GDP.&lt;/p&gt;
&lt;p&gt;If I had a dime every time someone asked about middleware tools to be able to interact with these services, well....At any rate, the typical approach was as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;setup HTML form with input parameters&lt;/li&gt;
&lt;li&gt;send request to middleware&lt;/li&gt;
&lt;li&gt;middleware invokes web services request, gets result, spits back HTML accordingly to the user&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I've done these in many different languages.  For awhile, one of our projects had bundled a spatial clients .war which Java developers can plop into their webapps.&lt;/p&gt;
&lt;p&gt;These days, using OpenLayers and jQuery lets you develop light, interactive ways of accomplishing this without server side middleware.  Trying this against the &lt;a href="http://geoservices.cgdi.ca/NTS/" title="CGDI NTS Lookup Service"&gt;CGDI NTS Lookup Service&lt;/a&gt; provides a neat example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ntsForm&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;javascript:zoomToNTS();&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;nts&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;NTS&lt;span class="w"&gt; &lt;/span&gt;Mapsheet:&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;

&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;text&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;nts&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;nts&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;size=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;6&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;maxlength=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;6&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And now the JavaScript:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nx"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;zoomToNTS&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;// build request URL&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;mapbuilder&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;php&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;php&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// simple proxy script&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;escape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//geoservices.cgdi.ca/NTS/NTSLookup?&amp;#39;) +&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;escape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="nx"&gt;version&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="m m-Double"&gt;1.1.0&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;GetMapsheet&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;mapsheet&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;jQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;nts&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;// send and process result&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;jQuery&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,{},&lt;/span&gt;&lt;span class="nx"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;xml&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// get the bbox of the result&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;jQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="nx"&gt;gml&lt;/span&gt;&lt;span class="err"&gt;\\&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;boundedBy&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;xml&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;each&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;jQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;this&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="nx"&gt;gml&lt;/span&gt;&lt;span class="err"&gt;\\&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;coordinates&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;zoomToExtent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;OpenLayers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Bounds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]));&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;That's it!  That will get your OpenLayers map zoomed in based on the NTS boundaries.  Notes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;you'll need a proxy script to deal with remote URLs&lt;/li&gt;
&lt;li&gt;you need to escape namespace'd XML elements/attributes per above, possibly wrapping into a function for reuse.  Same goes for elements seperated with '.' (like \&amp;lt;foo.bar&amp;gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyone have suggestions on improving the example above?  Or any similar snippets?  It would be nice to build up plugins like this for gazetteers, catalogs, and the like.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Python templating</title><link href="https://kralidis.ca/blog/blog/2009/01/04/python-templating/" rel="alternate"/><published>2009-01-04T13:57:00+00:00</published><updated>2009-01-04T13:57:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-01-04:/blog/blog/2009/01/04/python-templating/</id><summary type="html">&lt;p&gt;Awhile back, I started using &lt;a href="http://genshi.edgewall.org/" title="Genshi"&gt;Genshi&lt;/a&gt; as a templating solution for some Python application development.  Easy to use, we were able to come up with a &lt;a href="http://www.opengeospatial.org/standards/sensorml" title="SensorML"&gt;SensorML&lt;/a&gt; generator for description and discovery of monitoring stations.&lt;/p&gt;
&lt;p&gt;Lately, I've been &lt;a href="/blog/2008/12/29/shiny-new-mapserver-website/" title="helping out"&gt;helping out&lt;/a&gt; a bit on the new MapServer website, driven by &lt;a href="http://sphinx.pocoo.org/" title="Sphinx"&gt;Sphinx …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;Awhile back, I started using &lt;a href="http://genshi.edgewall.org/" title="Genshi"&gt;Genshi&lt;/a&gt; as a templating solution for some Python application development.  Easy to use, we were able to come up with a &lt;a href="http://www.opengeospatial.org/standards/sensorml" title="SensorML"&gt;SensorML&lt;/a&gt; generator for description and discovery of monitoring stations.&lt;/p&gt;
&lt;p&gt;Lately, I've been &lt;a href="/blog/2008/12/29/shiny-new-mapserver-website/" title="helping out"&gt;helping out&lt;/a&gt; a bit on the new MapServer website, driven by &lt;a href="http://sphinx.pocoo.org/" title="Sphinx"&gt;Sphinx&lt;/a&gt;.  Digging deeper, I noticed Sphinx using &lt;a href="http://jinja.pocoo.org/2/" title="Jinja2"&gt;Jinja2&lt;/a&gt; for templating, so I tried this out a bit.  Not bad either!&lt;/p&gt;
&lt;p&gt;Templating is key to many applications, and I wonder how these differ.  Perhaps the geo/python gurus out there have some further insight.&lt;/p&gt;</content><category term="open source, technology, web"/></entry><entry><title>Really Easy Coordinate Transformation</title><link href="https://kralidis.ca/blog/blog/2009/01/04/really-easy-coordinate-transformation/" rel="alternate"/><published>2009-01-04T13:29:00+00:00</published><updated>2009-01-04T13:29:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-01-04:/blog/blog/2009/01/04/really-easy-coordinate-transformation/</id><summary type="html">&lt;p&gt;One of the most frequent questions I get from clients is how to transform lat/long to LCC coordinates in a very lightweight fashion, in their webapps.  There are many solutions and approaches under the &lt;a href="http://wiki.osgeo.org/wiki/MetaCRS" title="MetaCRS"&gt;MetaCRS&lt;/a&gt; umbrella to choose from, depending on your requirements.&lt;/p&gt;
&lt;p&gt;Here's a super lightweight way to …&lt;/p&gt;</summary><content type="html">&lt;p&gt;One of the most frequent questions I get from clients is how to transform lat/long to LCC coordinates in a very lightweight fashion, in their webapps.  There are many solutions and approaches under the &lt;a href="http://wiki.osgeo.org/wiki/MetaCRS" title="MetaCRS"&gt;MetaCRS&lt;/a&gt; umbrella to choose from, depending on your requirements.&lt;/p&gt;
&lt;p&gt;Here's a super lightweight way to do it with &lt;a href="http://trac.osgeo.org/proj4js/" title="proj4js"&gt;proj4js&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;http://svn.osgeo.org/metacrs/proj4js/trunk/lib/proj4js-compressed.js&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;http://svn.osgeo.org/metacrs/proj4js/trunk/lib/defs/EPSG42304.js&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

...

var&lt;span class="w"&gt; &lt;/span&gt;x&lt;span class="w"&gt; &lt;/span&gt;=&lt;span class="w"&gt; &lt;/span&gt;-75.0;
var&lt;span class="w"&gt; &lt;/span&gt;y&lt;span class="w"&gt; &lt;/span&gt;=&lt;span class="w"&gt; &lt;/span&gt;45.0;
var&lt;span class="w"&gt; &lt;/span&gt;p&lt;span class="w"&gt; &lt;/span&gt;=&lt;span class="w"&gt; &lt;/span&gt;new&lt;span class="w"&gt; &lt;/span&gt;Proj4js.Point(x,y);
Proj4js.transform(new&lt;span class="w"&gt; &lt;/span&gt;Proj4js.Proj(&amp;quot;EPSG:4326&amp;quot;),&lt;span class="w"&gt; &lt;/span&gt;new&lt;span class="w"&gt; &lt;/span&gt;Proj4js.Proj(&amp;quot;EPSG:42304&amp;quot;),&lt;span class="w"&gt; &lt;/span&gt;p);
alert(p.x&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="w"&gt; &lt;/span&gt;&amp;quot;&lt;span class="w"&gt; &lt;/span&gt;&amp;quot;&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="w"&gt; &lt;/span&gt;p.y);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Done!  Kudos to &lt;a href="http://wiki.osgeo.org/wiki/User:Madair" title="Mike Adair"&gt;Mike Adair&lt;/a&gt; et. al.!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Cheers to 2008</title><link href="https://kralidis.ca/blog/blog/2008/12/30/cheers-to-2008/" rel="alternate"/><published>2008-12-30T10:14:00+00:00</published><updated>2008-12-30T10:14:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-12-30:/blog/blog/2008/12/30/cheers-to-2008/</id><summary type="html">&lt;p&gt;Since I did this &lt;a href="/blog/2007/12/27/cheers-to-2007/" title="last year"&gt;last year&lt;/a&gt;, I thought I’d try this again for 2008. Here’s the lowdown for my 2008:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Geospatial Catalogues: the saga continues.  I have dug deeper into this area this year as part of my day-job, and find that interoperability is difficult to achieve in …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;Since I did this &lt;a href="/blog/2007/12/27/cheers-to-2007/" title="last year"&gt;last year&lt;/a&gt;, I thought I’d try this again for 2008. Here’s the lowdown for my 2008:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Geospatial Catalogues: the saga continues.  I have dug deeper into this area this year as part of my day-job, and find that interoperability is difficult to achieve in the OGC Catalogue space.  Clearly there is a balance between abstraction/flexibility and ease of integration.  And the two step approach to discovering, say, OGC WMS layers (invoke GetRecords, then chain to GetRecordById) is cumbersome, IMHO.  At the end of the day, the most common use cases (that I have seen) are publishing data and services, and being able to query for them (data, service endpoints, service resources [layers/feature types/coverages]) with spatial, temporal or aspatial predicates.  And have the content come back in some usable format for display or binding.  Seems easy, eh?&lt;/li&gt;
&lt;li&gt;Publications: glad to see "&lt;a href="/blog/2008/11/02/new-open-source-geospatial-book/" title="Open Source Approaches in Spatial Data Handling"&gt;Open Source Approaches in Spatial Data Handling&lt;/a&gt;" was finally published.  Alot of the well known folks in the foss4g community contributed to this.  At the same time, the release took so long (like many publishing processes) that some items ended up dated.  Overall, I think the book gives a good viewpoint into foss4g at this time, and makes me think about how far we've come.  It's good for the community to be published in this format / manner&lt;/li&gt;
&lt;li&gt;JavaScript frameworks: they are everywhere.  Late this year I started delving back into the application space, and find these challenging, compared to the days of doing things by hand anyway.   2009 should shake off alot of rust I think&lt;/li&gt;
&lt;li&gt;MapServer:  We just &lt;a href="/blog/2008/12/29/shiny-new-mapserver-website/" title="launched"&gt;launched&lt;/a&gt; a new website.  Beers for hobu!  Also, lots of OGC CITE fixes and improvements, and next generation of OGC standards, adding &lt;a href="/blog/2008/02/12/mapserver-and-wxs-updatesequence/" title="updateSequence"&gt;updateSequence&lt;/a&gt; to OWS support&lt;/li&gt;
&lt;li&gt;Python fun again: it's been fun &lt;a href="/blog/2008/09/19/making-ws-suck-less/" title="contributing"&gt;contributing&lt;/a&gt; to owslib for SOS, OWS and Filter support.  OWS Common presents a huge opportunity to abstract codebase when it comes to next generation OGC standards.  As well, I've been using Python for day-to-day scripts.  Not bad!&lt;/li&gt;
&lt;li&gt;kralidis.ca turns 10: from &lt;a href="/misc/firstwebpage/" title="humble beginnings"&gt;humble beginnings&lt;/a&gt;, alot less done by hand now, and easier to manage (thanks Wordpress!).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other stuff:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Basement renovation: If you're considering a basement renovation, concrete slabs like the ones at &lt;a href="https://www.brothersconstructionwi.com/our-services/slabs/"&gt;https://www.brothersconstructionwi.com/our-services/slabs/&lt;/a&gt; are an excellent choice for flooring due to their durability, moisture resistance, and ability to provide a stable foundation. &lt;a href="/blog/2008/04/08/trading-data-for-drywall-for-a-bit/" title="this"&gt;This&lt;/a&gt; took up most of my time this past year.  Frustrating, expensive (I should have been a plumber or electrician!), but gratifying.  Took a bit longer than expected, and still not 100% finished, but the major work is done.  I think this needed to happen for the property overall, even if it means I have more space than I could possibly need :).  N.B. if you ever want to lose weight, do a home reno;  I shed 20lbs!&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- --&gt;

&lt;ul&gt;
&lt;li&gt;New job: I started a new job in the fall, which promises to be very exciting and satisfying, especially given the state of the geospatial web.  The new gig will give me more opportunity for discovery and SensorWeb information management spaces.  So I'm grateful for the opportunity.  I've also been having fun 1/2 time with the GeoConnections program again, so it's fun to work with some previous colleagues and getting acquianted with new faces who are helping to shape and evolve our national infrastructure.  So thanks again to those for helping me along a tough road and getting me here; I owe you big time :)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For 2009:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Work:  January 11 will mark 10 years of civil service for yours truly&lt;/li&gt;
&lt;li&gt;Data dissemination: this is my key function in my day job for the months to come.  I look forward to evolving what started off as a very high level strategy into an architecture all the way to implementation.  This will be fun!&lt;/li&gt;
&lt;li&gt;Standing up usable catalogues: you'll see a few OGC Cat2.0 instances this year.&lt;/li&gt;
&lt;li&gt;MapServer: more CITE fixes for SOS and O&amp;amp;M.  One thing I'd really like to see for 2009 is official compliance for OGC standards in MapServer&lt;/li&gt;
&lt;li&gt;T.O. Code Sprint in March: &lt;a href="http://wiki.osgeo.org/wiki/Toronto_Code_Sprint_2009" title="this event"&gt;this event&lt;/a&gt; is going to be fun.  What could be better than foss4g and beers, all in the centre of the universe :)&lt;/li&gt;
&lt;li&gt;Renovations: I think that is it, for this place, for now.  Almost three years and it's time for a rest in this space&lt;/li&gt;
&lt;li&gt;Property: I think it will be a good time to buy in 2009.  The question (for me) is where.  Locally, or down south?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All the best for 2009 for you and your loved ones!&lt;/p&gt;</content><category term="geospatial, home renovation, open source, personal, properties, technology, travel, web, website"/></entry><entry><title>Shiny New MapServer Website</title><link href="https://kralidis.ca/blog/blog/2008/12/29/shiny-new-mapserver-website/" rel="alternate"/><published>2008-12-29T18:12:00+00:00</published><updated>2008-12-29T18:12:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-12-29:/blog/blog/2008/12/29/shiny-new-mapserver-website/</id><content type="html">&lt;p&gt;Check out the new &lt;a href="http://www.mapserver.org/" title="MapServer"&gt;MapServer&lt;/a&gt; website.  Based on &lt;a href="http://sphinx.pocoo.org/" title="Sphinx"&gt;Sphinx&lt;/a&gt;, the website now has a glossary, full PDF documentation, and a snazzy front page demo to boot.  I think this will result in a much more manageable and up-to-date website for the community.&lt;/p&gt;
&lt;p&gt;Kudos to hobu for an amazing job!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Coding Fun in the T Dot</title><link href="https://kralidis.ca/blog/blog/2008/12/09/coding-fun-in-the-t-dot/" rel="alternate"/><published>2008-12-09T09:22:00+00:00</published><updated>2008-12-09T09:22:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-12-09:/blog/blog/2008/12/09/coding-fun-in-the-t-dot/</id><summary type="html">&lt;p&gt;I've been helping &lt;a href="http://blog.cleverelephant.ca/2008/12/toronto-code-sprint.html" title="Paul"&gt;Paul&lt;/a&gt; with setting up the &lt;a href="http://www.osgeo.org/" title="OSGeo"&gt;OSGeo&lt;/a&gt; &lt;a href="http://wiki.osgeo.org/wiki/Toronto_Code_Sprint_2009" title="Toronto Code Sprint 2009"&gt;Toronto Code Sprint 2009&lt;/a&gt; event here in Toronto in March.&lt;/p&gt;
&lt;p&gt;This promises to be an effective and fun event, to have many developers from the various OSGeo projects in one place for a few days.&lt;/p&gt;
&lt;p&gt;Check it out, and hope to …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I've been helping &lt;a href="http://blog.cleverelephant.ca/2008/12/toronto-code-sprint.html" title="Paul"&gt;Paul&lt;/a&gt; with setting up the &lt;a href="http://www.osgeo.org/" title="OSGeo"&gt;OSGeo&lt;/a&gt; &lt;a href="http://wiki.osgeo.org/wiki/Toronto_Code_Sprint_2009" title="Toronto Code Sprint 2009"&gt;Toronto Code Sprint 2009&lt;/a&gt; event here in Toronto in March.&lt;/p&gt;
&lt;p&gt;This promises to be an effective and fun event, to have many developers from the various OSGeo projects in one place for a few days.&lt;/p&gt;
&lt;p&gt;Check it out, and hope to see you there!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Revolution OS</title><link href="https://kralidis.ca/blog/blog/2008/12/07/revolution-os/" rel="alternate"/><published>2008-12-07T18:00:00+00:00</published><updated>2008-12-07T18:00:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-12-07:/blog/blog/2008/12/07/revolution-os/</id><content type="html">&lt;p&gt;Check out this &lt;a href="http://video.google.com/videoplay?docid=7707585592627775409" title="video"&gt;video&lt;/a&gt; if you're interested in learning more about the evolution of open source.  Pretty neat!&lt;/p&gt;</content><category term="open source, technology, web"/></entry><entry><title>My Nearest Book</title><link href="https://kralidis.ca/blog/blog/2008/11/18/my-nearest-book/" rel="alternate"/><published>2008-11-18T07:50:00+00:00</published><updated>2008-11-18T07:50:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-11-18:/blog/blog/2008/11/18/my-nearest-book/</id><summary type="html">&lt;p&gt;From &lt;a href="http://blog.cleverelephant.ca/2008/11/nearest-book.html" title="Paul"&gt;Paul&lt;/a&gt;.  Here's my sentence:&lt;/p&gt;
&lt;p&gt;"This comes down to how SOA is defined".&lt;/p&gt;
&lt;p&gt;Thomas Erl, &lt;em&gt;Service-Oriented Architecture: Concepts, Technology, and Design&lt;/em&gt;. 2005&lt;/p&gt;
&lt;p&gt;This phrase is part of a section which discusses what SOA is (and isn't).&lt;/p&gt;
&lt;p&gt;Rules of this meme:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Grab the nearest book.&lt;/li&gt;
&lt;li&gt;Open it to page 56.&lt;/li&gt;
&lt;li&gt;Find …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;From &lt;a href="http://blog.cleverelephant.ca/2008/11/nearest-book.html" title="Paul"&gt;Paul&lt;/a&gt;.  Here's my sentence:&lt;/p&gt;
&lt;p&gt;"This comes down to how SOA is defined".&lt;/p&gt;
&lt;p&gt;Thomas Erl, &lt;em&gt;Service-Oriented Architecture: Concepts, Technology, and Design&lt;/em&gt;. 2005&lt;/p&gt;
&lt;p&gt;This phrase is part of a section which discusses what SOA is (and isn't).&lt;/p&gt;
&lt;p&gt;Rules of this meme:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Grab the nearest book.&lt;/li&gt;
&lt;li&gt;Open it to page 56.&lt;/li&gt;
&lt;li&gt;Find the fifth sentence.&lt;/li&gt;
&lt;li&gt;Post the text of the sentence in your journal along with these instructions.&lt;/li&gt;
&lt;li&gt;Don’t dig for your favorite book, the cool book, or the intellectual one: pick the CLOSEST.&lt;/li&gt;
&lt;/ul&gt;</content><category term="personal"/></entry><entry><title>new Open Source Geospatial Book</title><link href="https://kralidis.ca/blog/blog/2008/11/02/new-open-source-geospatial-book/" rel="alternate"/><published>2008-11-02T18:22:00+00:00</published><updated>2008-11-02T18:22:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-11-02:/blog/blog/2008/11/02/new-open-source-geospatial-book/</id><content type="html">&lt;p&gt;Check out "&lt;a href="http://www.springer.com/geography/gis+cartography/book/978-3-540-74830-4" title="Open Source Approaches to Spatial Data Handling"&gt;Open Source Approaches in Spatial Data Handling&lt;/a&gt;" by Hall, Leahy et. al. (disclosure: I did chapter 1).  An interesting read covering many facets and tools of open source geospatial.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Clear Skies with Python and Tag Clouds</title><link href="https://kralidis.ca/blog/blog/2008/10/13/clear-skies-with-python-and-tag-clouds/" rel="alternate"/><published>2008-10-13T08:36:00+00:00</published><updated>2008-10-13T08:36:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-10-13:/blog/blog/2008/10/13/clear-skies-with-python-and-tag-clouds/</id><summary type="html">&lt;p&gt;I've been researching &lt;a href="http://en.wikipedia.org/wiki/Tag_cloud" title="tag clouds"&gt;tag clouds&lt;/a&gt; in the last few days. I think tag clouds can help geospatial search front ends in giving the user a "weighted list", to get them to what they want quickly and more efficiently.&lt;/p&gt;
&lt;figure&gt;
&lt;a href="https://kralidis.ca/blog/blog/wp-content/uploads/2008/10/tag_cloud.jpg"&gt;&lt;img src="https://kralidis.ca/blog/blog/wp-content/uploads/2008/10/tag_cloud.jpg" title="tag_cloud" class="size-medium wp-image-180" width="292" height="109" alt="tag cloud example" /&gt;&lt;/a&gt;
&lt;figcaption&gt;tag cloud example&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The following Python script takes a list of terms …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I've been researching &lt;a href="http://en.wikipedia.org/wiki/Tag_cloud" title="tag clouds"&gt;tag clouds&lt;/a&gt; in the last few days. I think tag clouds can help geospatial search front ends in giving the user a "weighted list", to get them to what they want quickly and more efficiently.&lt;/p&gt;
&lt;figure&gt;
&lt;a href="https://kralidis.ca/blog/blog/wp-content/uploads/2008/10/tag_cloud.jpg"&gt;&lt;img src="https://kralidis.ca/blog/blog/wp-content/uploads/2008/10/tag_cloud.jpg" title="tag_cloud" class="size-medium wp-image-180" width="292" height="109" alt="tag cloud example" /&gt;&lt;/a&gt;
&lt;figcaption&gt;tag cloud example&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The following Python script takes a list of terms as input.  Such a list can be derived from many things, such as an existing taxonomy, analyzing an httpd log file for commonly used search terms, user votes, and so on.  In this (simple) example, we use comma separated input.&lt;/p&gt;
&lt;p&gt;By creating a term and count dictionary, this sets up the anatomy of a tag cloud.  From here, you can pass this for output to the web (i.e. font sizes, colours, etc.).  Here we output this to an &lt;a href="http://www.apml.org/" title="APML"&gt;APML&lt;/a&gt; document, which is &lt;a href="http://en.wikipedia.org/wiki/Tag_cloud#Visual_appearance" title="often used to represent tag clouds"&gt;often used to represent tag clouds&lt;/a&gt;.  You can then use tools such as &lt;a href="http://www.cluztr.com/" title="clutzr"&gt;cluztr&lt;/a&gt; to generate tag clouds with ease.&lt;/p&gt;
&lt;p&gt;Considerations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the script does a very simple job to assign values of 0.0 to 1.0 to weights&lt;/li&gt;
&lt;li&gt;It would be neat to apply these to searches against spatial identifiers (i.e. "Montreal"), and then map them accordingly&lt;/li&gt;
&lt;li&gt;It would be interesting to hear Cartographers' thoughts on the tag cloud concept&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- --&gt;

&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;
&lt;span class="normal"&gt;24&lt;/span&gt;
&lt;span class="normal"&gt;25&lt;/span&gt;
&lt;span class="normal"&gt;26&lt;/span&gt;
&lt;span class="normal"&gt;27&lt;/span&gt;
&lt;span class="normal"&gt;28&lt;/span&gt;
&lt;span class="normal"&gt;29&lt;/span&gt;
&lt;span class="normal"&gt;30&lt;/span&gt;
&lt;span class="normal"&gt;31&lt;/span&gt;
&lt;span class="normal"&gt;32&lt;/span&gt;
&lt;span class="normal"&gt;33&lt;/span&gt;
&lt;span class="normal"&gt;34&lt;/span&gt;
&lt;span class="normal"&gt;35&lt;/span&gt;
&lt;span class="normal"&gt;36&lt;/span&gt;
&lt;span class="normal"&gt;37&lt;/span&gt;
&lt;span class="normal"&gt;38&lt;/span&gt;
&lt;span class="normal"&gt;39&lt;/span&gt;
&lt;span class="normal"&gt;40&lt;/span&gt;
&lt;span class="normal"&gt;41&lt;/span&gt;
&lt;span class="normal"&gt;42&lt;/span&gt;
&lt;span class="normal"&gt;43&lt;/span&gt;
&lt;span class="normal"&gt;44&lt;/span&gt;
&lt;span class="normal"&gt;45&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/usr/bin/python&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;fileinput&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;datetime&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lxml&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;

&lt;span class="c1"&gt;# term dictionary&lt;/span&gt;
&lt;span class="n"&gt;dTags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="n"&gt;tn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isoformat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;fileinput&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
    &lt;span class="n"&gt;aTags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;,&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;sTag&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;aTags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# if term is not in list, add&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;sTag&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dTags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;dTags&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;sTag&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="c1"&gt;# else increment term count&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;dTags&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;sTag&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="c1"&gt;# output as APML document&lt;/span&gt;
&lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;APML&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nsmap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;http://www.apml.org/apml-0.6&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attrib&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;version&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;0.6&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;subnode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Body&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;subnode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attrib&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;defaultprofile&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;owscat&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;subsubnode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Profile&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;subsubnode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attrib&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;defaultprofile&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Terms&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;subsubsubnode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ImplicitData&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;subsubsubsubnode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Concepts&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dTags&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iteritems&lt;/span&gt;&lt;span class="p"&gt;()):&lt;/span&gt;
    &lt;span class="n"&gt;termnode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Concept&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;termnode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attrib&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;key&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;term&lt;/span&gt;
    &lt;span class="n"&gt;termnode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attrib&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;value&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
    &lt;span class="n"&gt;termnode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attrib&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;from&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;owscat&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;termnode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attrib&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;updated&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;subsubsubsubnode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;termnode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;subsubsubnode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subsubsubsubnode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;subsubnode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subsubsubnode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;subnode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subsubnode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subnode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tostring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;xml_declaration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;UTF-8&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pretty_print&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>I heart this WMS</title><link href="https://kralidis.ca/blog/blog/2008/09/25/i-heart-this-wms/" rel="alternate"/><published>2008-09-25T17:00:00+00:00</published><updated>2008-09-25T17:00:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-09-25:/blog/blog/2008/09/25/i-heart-this-wms/</id><summary type="html">&lt;p&gt;I've written my share of catalogues, Capabilities parsers, map clients, and context import/export tools to know that having good example WMS instances is paramount in testing functionality and building features. I usually have a handy list of WMS servers which I constantly use when writing code.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.bsc-eoc.org/" title="Bird Studies Canada"&gt;Bird Studies Canada …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;I've written my share of catalogues, Capabilities parsers, map clients, and context import/export tools to know that having good example WMS instances is paramount in testing functionality and building features. I usually have a handy list of WMS servers which I constantly use when writing code.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.bsc-eoc.org/" title="Bird Studies Canada"&gt;Bird Studies Canada&lt;/a&gt; provides &lt;a href="http://www.bsc-eoc.org/cgi-bin/bsc_ows.asp?service=WMS&amp;amp;version=1.1.1&amp;amp;request=GetCapabilities" title="WMS access"&gt;WMS access&lt;/a&gt; to their various bird distribution and abundance data. BSC has taken every effort to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;populate their Capabilities metadata exhaustively. Title, abstract, keywords, and even MetadataURL pointers to FGDC XML documents for all layers. And _full_ service provider metadata (including Attribution, which is great for displaying Logo images, etc.)&lt;/li&gt;
&lt;li&gt;return GetFeatureInfo in both GML and HTML for prettier responses&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This WMS is always at the top of my testing list, as well as my first response when people ask to see an existing WMS example which is well constructed, and serves catalogues and search demos very well indeed.&lt;/p&gt;
&lt;p&gt;Kudos to BSC!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>You know you're getting old when...</title><link href="https://kralidis.ca/blog/blog/2008/09/23/you-know-youre-getting-old-when/" rel="alternate"/><published>2008-09-23T15:44:00+00:00</published><updated>2008-09-23T15:44:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-09-23:/blog/blog/2008/09/23/you-know-youre-getting-old-when/</id><content type="html">&lt;p&gt;I embarked on a Google search to find information about &lt;a href="http://www.google.ca/search?q=polygon+statistics" title="Polygon statistics"&gt;Polygon statistics&lt;/a&gt;, and low and behold, I posted &lt;a href="/gis/compcart/polystats/" title="this"&gt;this&lt;/a&gt; on my website years ago.&lt;/p&gt;
&lt;p&gt;Goodbye memory!&lt;/p&gt;</content><category term="geospatial, technology, web, website"/></entry><entry><title>Making W*S suck less</title><link href="https://kralidis.ca/blog/blog/2008/09/19/making-ws-suck-less/" rel="alternate"/><published>2008-09-19T06:58:00+00:00</published><updated>2008-09-19T06:58:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-09-19:/blog/blog/2008/09/19/making-ws-suck-less/</id><summary type="html">&lt;p&gt;I'm starting to work on contributing SOS and OWS Common support in &lt;a href="http://trac.gispython.org/lab/wiki/OwsLib" title="OWSLib"&gt;OWSLib&lt;/a&gt;, a groovy and regimented little GIS Python project.&lt;/p&gt;
&lt;p&gt;So far so good; some &lt;a href="http://trac.gispython.org/lab/ticket/172" title="initial implementations"&gt;initial implementations&lt;/a&gt; are done (committing soon hopefully, writing tests around these).  I think this will add value to the project, seeing that SOS 1 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I'm starting to work on contributing SOS and OWS Common support in &lt;a href="http://trac.gispython.org/lab/wiki/OwsLib" title="OWSLib"&gt;OWSLib&lt;/a&gt;, a groovy and regimented little GIS Python project.&lt;/p&gt;
&lt;p&gt;So far so good; some &lt;a href="http://trac.gispython.org/lab/ticket/172" title="initial implementations"&gt;initial implementations&lt;/a&gt; are done (committing soon hopefully, writing tests around these).  I think this will add value to the project, seeing that SOS 1.0 has been around long enough to start seeing implementations.  And the OWS Common support will act as a baseline for all calling specs/code to leverage.&lt;/p&gt;
&lt;p&gt;And it's been a nice journey in Python for me so far.  Another thing I like about this project is the commitment to &lt;a href="http://trac.gispython.org/lab/wiki/CodingStyle" title="testing"&gt;testing&lt;/a&gt; -- awesome!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>GDAL Saves the Day Again</title><link href="https://kralidis.ca/blog/blog/2008/09/03/gdal-saves-the-day-again/" rel="alternate"/><published>2008-09-03T19:35:00+00:00</published><updated>2008-09-03T19:35:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-09-03:/blog/blog/2008/09/03/gdal-saves-the-day-again/</id><summary type="html">&lt;p&gt;A piece of work I help out with involves the visualization and access of hydrometric monitoring data over the Web. Part of this involves the data management and publishing of voluminous databases of monitoring information.&lt;/p&gt;
&lt;p&gt;We use &lt;a href="http://www.maptools.org/chameleon/" title="Chameleon"&gt;Chameleon&lt;/a&gt; for basic visualization and query of the data. Behind the scenes, we …&lt;/p&gt;</summary><content type="html">&lt;p&gt;A piece of work I help out with involves the visualization and access of hydrometric monitoring data over the Web. Part of this involves the data management and publishing of voluminous databases of monitoring information.&lt;/p&gt;
&lt;p&gt;We use &lt;a href="http://www.maptools.org/chameleon/" title="Chameleon"&gt;Chameleon&lt;/a&gt; for basic visualization and query of the data. Behind the scenes, we run a slew of complex processes (shell scripts via cron) to output the data in a format that can be understood by &lt;a href="http://mapserver.gis.umn.edu/" title="MapServer"&gt;MapServer&lt;/a&gt; (which we use to publish WMS layers). The processes work across many disparate database connections, so outputting them to shapefiles and accessing them locally helps with performance in web mapping apps. &lt;a href="http://www.gdal.org/ogr/ogr2ogr.html" title="ogr2ogr"&gt;ogr2ogr&lt;/a&gt; is used exclusively and extensively for the access and format translation.&lt;/p&gt;
&lt;p&gt;Well, today I found out that an effort began to write a bunch of scripts to additionally output &lt;a href="http://www.opengeospatial.org/standards/kml" title="OGC KML"&gt;OGC KML&lt;/a&gt;. Thank goodness things didn't get very far, because the following addition to our processes:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;ogr2ogr&lt;span class="w"&gt; &lt;/span&gt;-F&lt;span class="w"&gt; &lt;/span&gt;KML&lt;span class="w"&gt; &lt;/span&gt;foo.kml&lt;span class="w"&gt; &lt;/span&gt;bar.ovf&lt;span class="w"&gt; &lt;/span&gt;-dsco&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;NameField&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;NAME&lt;span class="w"&gt; &lt;/span&gt;-dsco&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;DescriptionField&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;COMMENT
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;...worked like a charm, and put a big smile on people's faces!&lt;/p&gt;
&lt;p&gt;So now, OGC KML is also supported for visualization in Earth browsers. Just like that.&lt;/p&gt;
&lt;p&gt;Output styles are relatively simple; I'm thinking a -dsco like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;-dsco LayerStyle=LayerName,styles.kml#mystyle
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;...would point to an existing (local or remote) KML style document style ID via XPointer, i.e.:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;styleUrl&amp;gt;&lt;/span&gt;somefile.kml#mystyle&lt;span class="nt"&gt;&amp;lt;/styleUrl&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Of course the default behaviour would be in place if this -dsco is not defined. I'll see what the GDAL KML gurus think about this.&lt;/p&gt;
&lt;p&gt;At any rate, once again, thank you GDAL for being an uber-utility for day-to-day GIS tasks. Happy faces everywhere!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>pivoting in Python</title><link href="https://kralidis.ca/blog/blog/2008/08/29/pivoting-in-python/" rel="alternate"/><published>2008-08-29T16:21:00+00:00</published><updated>2008-08-29T16:21:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-08-29:/blog/blog/2008/08/29/pivoting-in-python/</id><summary type="html">&lt;p&gt;I needed to do some pre-processing of some data which involved transposing column names to values. The condition was that the value for each respective column (frequency count) had to be &amp;gt; 1.&lt;/p&gt;
&lt;p&gt;My input was a csv file, and my goal was an output csv file which would feed into …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I needed to do some pre-processing of some data which involved transposing column names to values. The condition was that the value for each respective column (frequency count) had to be &amp;gt; 1.&lt;/p&gt;
&lt;p&gt;My input was a csv file, and my goal was an output csv file which would feed into a batch database import process.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ID,DA,NL,PHENOM1,PHENOM2,PHENOM3,PHENOM4
233,99,44,0.00,27.00,12.00,0.00
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The other interesting bit was that only a range of columns applied to the condition; the other columns represented ancillary data.&lt;/p&gt;
&lt;p&gt;Enter Python:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;
&lt;span class="normal"&gt;24&lt;/span&gt;
&lt;span class="normal"&gt;25&lt;/span&gt;
&lt;span class="normal"&gt;26&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/usr/bin/python&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;csv&lt;/span&gt;

&lt;span class="c1"&gt;# open file and read headers&lt;/span&gt;
&lt;span class="n"&gt;fPhenomenon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;phenomenon.txt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;r&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;sHeaders&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fPhenomenon&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readline&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;aHeaders&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sHeaders&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;,&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# feed the rest to csv&lt;/span&gt;
&lt;span class="n"&gt;csvIn&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fPhenomenon&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;csvOut&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;sRowIn&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;csvIn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;aRowOut&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;aPhenomenon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;aRowOut&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sRowIn&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;# procedure ID&lt;/span&gt;
    &lt;span class="n"&gt;aRowOut&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sRowIn&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;# major drainage area ID&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;nIndexTupleVal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tupleVal&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sRowIn&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tupleVal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="c1"&gt;# phenomenon measured at least once&lt;/span&gt;
            &lt;span class="c1"&gt;# add phenomenon name to list&lt;/span&gt;
            &lt;span class="n"&gt;aPhenomenon&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;aHeaders&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;nIndexTupleVal&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="c1"&gt;# add phenomenon list to record&lt;/span&gt;
        &lt;span class="n"&gt;aRowOut&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;,&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;aPhenomenon&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;csvOut&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;writerow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;aRowOut&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Notes&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;hooray for raw strings!&lt;/li&gt;
&lt;li&gt;enumerate() is great and saves you the trouble of declaring your own counter&lt;/li&gt;
&lt;li&gt;like any language, modules/libraries makes things so easy to work with&lt;/li&gt;
&lt;li&gt;I wish the header stuff was a bit cleaner (I should look further into the csv module w.r.t. headers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That's my hack for the day. Have a good weekend!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;: ah, the csv module has a .next() method, which can be used instead of the shoemaker attempt I made above to regularize / split / store the header list.&lt;/p&gt;</content><category term="open source, technology, website"/></entry><entry><title>Documenting the History of MapServer</title><link href="https://kralidis.ca/blog/blog/2008/08/27/documenting-the-history-of-mapserver/" rel="alternate"/><published>2008-08-27T17:10:00+00:00</published><updated>2008-08-27T17:10:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-08-27:/blog/blog/2008/08/27/documenting-the-history-of-mapserver/</id><content type="html">&lt;p&gt;Inspired by the recent &lt;a href="http://lists.osgeo.org/pipermail/discuss/2008-August/004120.html" title="thread"&gt;thread&lt;/a&gt; on &lt;a href="/blog/2008/08/21/foss4g-history/" title="FOSS4G history"&gt;FOSS4G history&lt;/a&gt;, I started an effort to document MapServer's history, from its beginnings in the mid-1990s. Check out the &lt;a href="http://trac.osgeo.org/mapserver/wiki/MapServerHistory" title="progress"&gt;progress&lt;/a&gt; we've made so far. If there's anything missing, or in error, feel free to contribute!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>FOSS4G History</title><link href="https://kralidis.ca/blog/blog/2008/08/21/foss4g-history/" rel="alternate"/><published>2008-08-21T17:40:00+00:00</published><updated>2008-08-21T17:40:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-08-21:/blog/blog/2008/08/21/foss4g-history/</id><summary type="html">&lt;p&gt;&lt;a href="http://mateusz.loskot.net/" title="Mateusz"&gt;Mateusz&lt;/a&gt; posted a &lt;a href="http://mateusz.loskot.net/2008/08/21/history-of-foss4g/"&gt;link&lt;/a&gt; to an interesting topic on osgeo-discuss. I think it's a great idea to document the history of geospatial and open source, and I echo &lt;a href="http://lists.osgeo.org/pipermail/discuss/2008-August/004137.html" title="Dave's comments"&gt;Dave's comments&lt;/a&gt; on how Wikipedia would be an ideal home for documentation and maintenance.&lt;/p&gt;
&lt;p&gt;Perhaps the best way to go about this …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="http://mateusz.loskot.net/" title="Mateusz"&gt;Mateusz&lt;/a&gt; posted a &lt;a href="http://mateusz.loskot.net/2008/08/21/history-of-foss4g/"&gt;link&lt;/a&gt; to an interesting topic on osgeo-discuss. I think it's a great idea to document the history of geospatial and open source, and I echo &lt;a href="http://lists.osgeo.org/pipermail/discuss/2008-August/004137.html" title="Dave's comments"&gt;Dave's comments&lt;/a&gt; on how Wikipedia would be an ideal home for documentation and maintenance.&lt;/p&gt;
&lt;p&gt;Perhaps the best way to go about this would be for the various projects on Wikipedia (&lt;a href="http://en.wikipedia.org/wiki/MapServer" title="MapServer"&gt;MapServer&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/GDAL" title="GDAL"&gt;GDAL&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/GeoTools" title="GeoTools"&gt;GeoTools&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/GRASS_GIS" title="GRASS"&gt;GRASS&lt;/a&gt;, etc.) to document their respective histories, and allow the main Wikipedia &lt;a href="http://en.wikipedia.org/wiki/Osgeo" title="OSGeo"&gt;OSGeo&lt;/a&gt; page to link to them accordingly.&lt;/p&gt;
&lt;p&gt;Thoughts? Are there better alternatives than Wikipedia? Should projects document history on their own respective websites, which Wikipedia then references&lt;/p&gt;</content><category term="geospatial, open source, technology"/></entry><entry><title>Is REST "faster"?</title><link href="https://kralidis.ca/blog/blog/2008/07/21/is-rest-faster/" rel="alternate"/><published>2008-07-21T16:45:00+00:00</published><updated>2008-07-21T16:45:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-07-21:/blog/blog/2008/07/21/is-rest-faster/</id><summary type="html">&lt;p&gt;I was in a REST/Web2.0 workshop, and someone asked how REST, since through HTTP, which is a stateless protocol, is any faster than other, or previous approaches.&lt;/p&gt;
&lt;p&gt;I'm not sure that REST does anything to speed up HTTP's request/response mechanisms; but using AJAX surely enhances the user …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I was in a REST/Web2.0 workshop, and someone asked how REST, since through HTTP, which is a stateless protocol, is any faster than other, or previous approaches.&lt;/p&gt;
&lt;p&gt;I'm not sure that REST does anything to speed up HTTP's request/response mechanisms; but using AJAX surely enhances the user experience with perceived responsiveness given the nature of AJAX by doing things asynchronously.&lt;/p&gt;
&lt;p&gt;Or is there more to it?&lt;/p&gt;</content><category term="geospatial, technology, web"/></entry><entry><title>MapServer 5.2 released</title><link href="https://kralidis.ca/blog/blog/2008/07/17/mapserver-52-released/" rel="alternate"/><published>2008-07-17T07:36:00+00:00</published><updated>2008-07-17T07:36:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-07-17:/blog/blog/2008/07/17/mapserver-52-released/</id><content type="html">&lt;p&gt;Fresh off the press, MapServer 5.2 has been &lt;a href="http://lists.osgeo.org/pipermail/mapserver-users/2008-July/056771.html" title="released"&gt;released&lt;/a&gt;. A total of &lt;a href="http://trac.osgeo.org/mapserver/query?status=closed&amp;amp;milestone=5.2+release" title="196 issues"&gt;196 issues&lt;/a&gt; were fixed in 5.2, as well as a number of enhancements. Sources can be fetched from &lt;a href="http://mapserver.gis.umn.edu/download/current"&gt;http://mapserver.gis.umn.edu/download/current&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Good job everyone!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>looking forward to GeoWeb</title><link href="https://kralidis.ca/blog/blog/2008/07/14/looking-forward-to-geoweb/" rel="alternate"/><published>2008-07-14T07:13:00+00:00</published><updated>2008-07-14T07:13:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-07-14:/blog/blog/2008/07/14/looking-forward-to-geoweb/</id><summary type="html">&lt;p&gt;I haven't been to the &lt;a href="http://geowebconference.org/" title="GeoWeb conference"&gt;GeoWeb conference&lt;/a&gt; in a couple of years, and given all the changes and advancements in the geospatial web over that time, this conference should prove to be quite interesting!&lt;/p&gt;
&lt;p&gt;I'm also looking forward to attending the &lt;a href="http://geowebconference.org/program/workshops/workshops-monday#m2" title="Open Source and Geo-Semantics"&gt;Open Source and Geo-Semantics&lt;/a&gt; and &lt;a href="http://geowebconference.org/program/workshops/workshops-monday#m5" title="REST/JavaScript/Web 2.0"&gt;REST/JavaScript/Web 2 …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;I haven't been to the &lt;a href="http://geowebconference.org/" title="GeoWeb conference"&gt;GeoWeb conference&lt;/a&gt; in a couple of years, and given all the changes and advancements in the geospatial web over that time, this conference should prove to be quite interesting!&lt;/p&gt;
&lt;p&gt;I'm also looking forward to attending the &lt;a href="http://geowebconference.org/program/workshops/workshops-monday#m2" title="Open Source and Geo-Semantics"&gt;Open Source and Geo-Semantics&lt;/a&gt; and &lt;a href="http://geowebconference.org/program/workshops/workshops-monday#m5" title="REST/JavaScript/Web 2.0"&gt;REST/JavaScript/Web 2.0&lt;/a&gt; workshops.&lt;/p&gt;
&lt;p&gt;If you're going to GeoWeb, looking forward to seeing you there!&lt;/p&gt;</content><category term="geospatial, technology, web"/></entry><entry><title>MapServer 5.2 is coming</title><link href="https://kralidis.ca/blog/blog/2008/06/12/mapserver-52-is-coming/" rel="alternate"/><published>2008-06-12T10:41:00+00:00</published><updated>2008-06-12T10:41:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-06-12:/blog/blog/2008/06/12/mapserver-52-is-coming/</id><summary type="html">&lt;p&gt;We just released beta1 &lt;a href="http://www.nabble.com/MapServer-5.2-Beta-1-Available-ts17788950.html" title="yesterday"&gt;yesterday&lt;/a&gt;. And lots of new features (&lt;a href="http://mapserver.gis.umn.edu/rfc/ms-rfc-36" title="enhanced templating"&gt;enhanced templating&lt;/a&gt;, &lt;a href="http://mapserver.gis.umn.edu/rfc/ms-rfc-38" title="SQL Server 2008 support"&gt;SQL Server 2008 support&lt;/a&gt;, &lt;a href="http://mapserver.gis.umn.edu/rfc/ms-rfc-43" title="Google API support for tiling"&gt;Google API support for tiling&lt;/a&gt;) and &lt;a href="http://trac.osgeo.org/mapserver/query?status=closed&amp;amp;milestone=5.2+release&amp;amp;type=defect&amp;amp;order=priority" title="bug fixes"&gt;bug fixes&lt;/a&gt;. Oh, and the OGC support grows; WCS 1.1, WFS 1.1, SOS 1.0.0 to name a few new implementations. While full CITE compliance …&lt;/p&gt;</summary><content type="html">&lt;p&gt;We just released beta1 &lt;a href="http://www.nabble.com/MapServer-5.2-Beta-1-Available-ts17788950.html" title="yesterday"&gt;yesterday&lt;/a&gt;. And lots of new features (&lt;a href="http://mapserver.gis.umn.edu/rfc/ms-rfc-36" title="enhanced templating"&gt;enhanced templating&lt;/a&gt;, &lt;a href="http://mapserver.gis.umn.edu/rfc/ms-rfc-38" title="SQL Server 2008 support"&gt;SQL Server 2008 support&lt;/a&gt;, &lt;a href="http://mapserver.gis.umn.edu/rfc/ms-rfc-43" title="Google API support for tiling"&gt;Google API support for tiling&lt;/a&gt;) and &lt;a href="http://trac.osgeo.org/mapserver/query?status=closed&amp;amp;milestone=5.2+release&amp;amp;type=defect&amp;amp;order=priority" title="bug fixes"&gt;bug fixes&lt;/a&gt;. Oh, and the OGC support grows; WCS 1.1, WFS 1.1, SOS 1.0.0 to name a few new implementations. While full CITE compliance is not quite complete for some of these, I think the initial implementations are very solid, and have already passed many of the CITE assertions.&lt;/p&gt;
&lt;p&gt;For me, I'm happy to see the increased OGC support, as well as broadening MapServer's capabilities for defacto standards like Google tiling, as well as the new possibilities as a result of the templating (like &lt;a href="http://www.geojson.org/" title="GeoJSON"&gt;GeoJSON&lt;/a&gt;, etc.). Community feedback on this release would be great, if you want to follow the &lt;a href="http://mapserver.gis.umn.edu/development/release_plans/mapserver_5_2/release_plan/" title="release plan"&gt;release plan&lt;/a&gt;. Final release is slated for 09 July 2008.&lt;/p&gt;
&lt;p&gt;What features are you looking forward to using for 5.2.0?&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Firefox 3 drops this Tuesday</title><link href="https://kralidis.ca/blog/blog/2008/06/12/firefox-3-drops-this-tuesday/" rel="alternate"/><published>2008-06-12T07:44:00+00:00</published><updated>2008-06-12T07:44:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-06-12:/blog/blog/2008/06/12/firefox-3-drops-this-tuesday/</id><content type="html">&lt;p&gt;Good &lt;a href="http://weblogs.mozillazine.org/asa/archives/2008/06/firefox_3_to_be_1.html" title="news"&gt;news&lt;/a&gt;.  With all the new features and performance improvements, I'm guessing I'm not the only one looking forward to this release.&lt;/p&gt;</content><category term="open source, technology, web"/></entry><entry><title>My Shell History</title><link href="https://kralidis.ca/blog/blog/2008/04/12/my-shell-history/" rel="alternate"/><published>2008-04-12T20:15:00+00:00</published><updated>2008-04-12T20:15:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-04-12:/blog/blog/2008/04/12/my-shell-history/</id><summary type="html">&lt;p&gt;Neat &lt;a href="http://www.perrygeo.net/wordpress/?p=112" title="post"&gt;post&lt;/a&gt; by Matthew Perry. I couldn't help but run the same command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;history&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;awk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{a[$2]++ } END{for(i in a){print a[i] &amp;quot; &amp;quot; i}}&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rn&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;

&lt;span class="mi"&gt;188&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cd&lt;/span&gt;

&lt;span class="mi"&gt;151&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;svn&lt;/span&gt;

&lt;span class="mi"&gt;113&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;vi&lt;/span&gt;

&lt;span class="mi"&gt;88&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ll&lt;/span&gt;

&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sudo&lt;/span&gt;

&lt;span class="mi"&gt;53&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;more&lt;/span&gt;

&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;make&lt;/span&gt;

&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;

&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run_test&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;

&lt;span class="mi"&gt;30 …&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;Neat &lt;a href="http://www.perrygeo.net/wordpress/?p=112" title="post"&gt;post&lt;/a&gt; by Matthew Perry. I couldn't help but run the same command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;history&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;awk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{a[$2]++ } END{for(i in a){print a[i] &amp;quot; &amp;quot; i}}&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rn&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;

&lt;span class="mi"&gt;188&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cd&lt;/span&gt;

&lt;span class="mi"&gt;151&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;svn&lt;/span&gt;

&lt;span class="mi"&gt;113&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;vi&lt;/span&gt;

&lt;span class="mi"&gt;88&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ll&lt;/span&gt;

&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sudo&lt;/span&gt;

&lt;span class="mi"&gt;53&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;more&lt;/span&gt;

&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;make&lt;/span&gt;

&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;

&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run_test&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;

&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;dd.* is my tempfile name prefix for quick and dirty scripts. run_test.py is from running the &lt;a href="http://mapserver.gis.umn.edu/" title="MapServer"&gt;MapServer&lt;/a&gt; &lt;a href="http://mapserver.gis.umn.edu/development/Tests/regression_testing/" title="msautotest"&gt;msautotest&lt;/a&gt; regression test suite when developing and testing code.&lt;/p&gt;
&lt;p&gt;What does your shell history look like?&lt;/p&gt;</content><category term="open source, technology"/></entry><entry><title>Rocking the Loser Phone</title><link href="https://kralidis.ca/blog/blog/2008/04/08/rocking-the-loser-phone/" rel="alternate"/><published>2008-04-08T20:08:00+00:00</published><updated>2008-04-08T20:08:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-04-08:/blog/blog/2008/04/08/rocking-the-loser-phone/</id><summary type="html">&lt;p&gt;&lt;a href="https://kralidis.ca/blog/blog/wp-content/uploads/2008/04/dscn1224.jpg"&gt;&lt;img src="https://kralidis.ca/blog/blog/wp-content/uploads/2008/04/dscn1224.jpg" title="dscn1224" class="alignleft size-medium wp-image-92" style="float: left;" width="300" height="225" alt="loser phone" /&gt;&lt;/a&gt;I was compelled to write this after reading about &lt;a href="http://blog.cleverelephant.ca/2008/03/blood-sucking-phone-company.html" title="Paul's"&gt;Paul's&lt;/a&gt; &lt;a href="http://blog.cleverelephant.ca/2008/02/like-cattle-to-slaughter.html" title="experiences"&gt;experiences&lt;/a&gt;. A couple of months ago, my Motorola E810 came to a screeching halt: the display died. As well, the battery recharge became spotty at best. So I was in need of a new phone. I called my wireless provider …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://kralidis.ca/blog/blog/wp-content/uploads/2008/04/dscn1224.jpg"&gt;&lt;img src="https://kralidis.ca/blog/blog/wp-content/uploads/2008/04/dscn1224.jpg" title="dscn1224" class="alignleft size-medium wp-image-92" style="float: left;" width="300" height="225" alt="loser phone" /&gt;&lt;/a&gt;I was compelled to write this after reading about &lt;a href="http://blog.cleverelephant.ca/2008/03/blood-sucking-phone-company.html" title="Paul's"&gt;Paul's&lt;/a&gt; &lt;a href="http://blog.cleverelephant.ca/2008/02/like-cattle-to-slaughter.html" title="experiences"&gt;experiences&lt;/a&gt;. A couple of months ago, my Motorola E810 came to a screeching halt: the display died. As well, the battery recharge became spotty at best. So I was in need of a new phone. I called my wireless provider, who give me a story about having to lock into another 3 year contract to get a new phone.&lt;/p&gt;
&lt;p&gt;I was very hesitant this time about locking in again; I've taken a beating on cellphone costs in the past, and I didn't want to sign up for another "plan" again until I had reviewed all my options thoroughly. So I wasn't given a phone. I asked if I could cancel my contract, which would have costed something ridiculous.&lt;/p&gt;
&lt;p&gt;So at this point I was stuck. A friend lent me an old cellphone which I've been using in the meantime until I figure out what to do (another friend has since coined it the "loser phone" :) ). So don't laugh too hard next time you see me with a circa 2000 cellphone / brick on the table :)&lt;/p&gt;
&lt;p&gt;What's a guy to do? The prices of wireless communications are ridiculous! Is it like this everywhere (Man, my Vodafone was dirt cheap when I was last in Europe). Contract? Pay as you go?&lt;/p&gt;
&lt;p&gt;I couldn't agree with you more, Paul!&lt;/p&gt;</content><category term="personal, technology"/></entry><entry><title>Trading data for drywall for a bit</title><link href="https://kralidis.ca/blog/blog/2008/04/08/trading-data-for-drywall-for-a-bit/" rel="alternate"/><published>2008-04-08T18:57:00+00:00</published><updated>2008-04-08T18:57:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-04-08:/blog/blog/2008/04/08/trading-data-for-drywall-for-a-bit/</id><summary type="html">&lt;p&gt;&lt;a href="http://www.kralidis.ca/pics/view/props/tor-etob-cp/basement/" title="basement renovation"&gt;&lt;img src="http://www.kralidis.ca/pics/download/4396-2/DSCN1215.JPG" class="alignleft" style="float: left;" width="113" height="150" alt="basement renovation" /&gt;&lt;/a&gt;You may or may not have noticed that I've been quiet on the blogosphere, and &lt;a href="http://mapserver.gis.umn.edu/" title="MapServer"&gt;MapServer&lt;/a&gt; to some extent. Well, it's a result of kicking my basement renovation into high gear after starting &lt;a href="http://www.kralidis.ca/blog/2007/10/02/there-goes-the-basement/" title="last fall"&gt;last fall&lt;/a&gt;. And with the winter we've had, what better time for this project :)&lt;/p&gt;
&lt;p&gt;I've done my …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="http://www.kralidis.ca/pics/view/props/tor-etob-cp/basement/" title="basement renovation"&gt;&lt;img src="http://www.kralidis.ca/pics/download/4396-2/DSCN1215.JPG" class="alignleft" style="float: left;" width="113" height="150" alt="basement renovation" /&gt;&lt;/a&gt;You may or may not have noticed that I've been quiet on the blogosphere, and &lt;a href="http://mapserver.gis.umn.edu/" title="MapServer"&gt;MapServer&lt;/a&gt; to some extent. Well, it's a result of kicking my basement renovation into high gear after starting &lt;a href="http://www.kralidis.ca/blog/2007/10/02/there-goes-the-basement/" title="last fall"&gt;last fall&lt;/a&gt;. And with the winter we've had, what better time for this project :)&lt;/p&gt;
&lt;p&gt;I've done my share of renovations in the past, but, in terms of hackery, this one takes the cake. It's fun to be hacker as a coder sometimes, but not when doing renovations! In tearing down the basement, I have undoubtedly seen the most horrific attempts at a basement reno in my entire life. I have never (and I mean never!) seen anything like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;using cardboard as shims, even in - get this - the shower stall. Now that won't absorb any water!&lt;/li&gt;
&lt;li&gt;disaster electrical: connections put together with tape only (so much for junction boxes!). And behind the shower as well! When they did use boxes, there was no reason to. In cleaning up the electrical, we ended up pulling down over 10 junction boxes, which served no functional purpose whatsoever. Unbelievable!&lt;/li&gt;
&lt;li&gt;whoever taped and mudded the drywall did an awesome job of applying enough compound to make the joints resemble a beer belly and a half!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I could go on, but I won't. I've often been called a perfectionist for renovations, but when you're doing things that affect safety, it's a big no no. Their should always be a great consideration for safety before proceeding with things. It could be as simple as making you do not accidentally step on tools or using a tool to &lt;a href="https://bestofmachinery.com/best-drywall-lift/"&gt;lift drywalls easier&lt;/a&gt;. I think this property would have been worth more without any renovation than with the original attempt.&lt;/p&gt;
&lt;p&gt;So after taking the whole thing down, I've been putting things back together again in the last 8 weeks. It's been a fun experience for sure, but has also involved alot of running around, coordinating various help, playing helper and actually doing the work, and, of course, being budget conscious. Doing this at night after your day job is not for the faint at heart, but is gratifying in terms of cost as well as getting exactly what you want.&lt;/p&gt;
&lt;p&gt;I hope to be done the bulk of the remaining work in the next month, which includes laying ~1000 square feet of porcelain/ceramic tile. Luckily, a friend's uncle is helping with most of the project, so it's valuable to have professional eyes (and hands) on things at all times. If you want to build a kitchen in your basement, you may need to work with a contractor who specializes in &lt;a href="https://reimerhvac.com/garbage-disposal-services"&gt;garbage disposal replacement in western new york&lt;/a&gt; to install a garbage disposal for you. You should also make sure that you have a good plumbing system. Hire &lt;a href="https://willsplumbingadelaide.com.au/services/emergency-plumber/"&gt;a plumber&lt;/a&gt; who is well-experienced and will provide top-notch service.&lt;/p&gt;
&lt;p&gt;Check out the &lt;a href="http://www.kralidis.ca/pics/view/props/tor-etob-cp/basement/" title="progress"&gt;progress&lt;/a&gt; (advice/suggestions valued!).  When the drywall dust settles, I looking forward to getting my life back. Now that warmer temperatures are (seemingly) here, it's high time to finish the job!&lt;/p&gt;</content><category term="home renovation, properties"/></entry><entry><title>My Foxmarks</title><link href="https://kralidis.ca/blog/blog/2008/02/13/my-foxmarks/" rel="alternate"/><published>2008-02-13T23:51:00+00:00</published><updated>2008-02-13T23:51:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-02-13:/blog/blog/2008/02/13/my-foxmarks/</id><summary type="html">&lt;p&gt;Between a dual boot and a MacBook, I have started to have bookmark synchronization issues.&lt;/p&gt;
&lt;p&gt;I came across &lt;a href="http://www.foxmarks.com/" title="Foxmarks"&gt;Foxmarks&lt;/a&gt;, a neat bookmark synchronizer for Firefox. Essentially, your bookmarks are placed on a central server so you can fetch them from wherever. The only change that I made was removing some …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Between a dual boot and a MacBook, I have started to have bookmark synchronization issues.&lt;/p&gt;
&lt;p&gt;I came across &lt;a href="http://www.foxmarks.com/" title="Foxmarks"&gt;Foxmarks&lt;/a&gt;, a neat bookmark synchronizer for Firefox. Essentially, your bookmarks are placed on a central server so you can fetch them from wherever. The only change that I made was removing some internal / sensitive bookmarks which I wouldn't necessarily want to be "out there", so I stored those locally.&lt;/p&gt;
&lt;p&gt;Pretty easy!&lt;/p&gt;</content><category term="open source, technology, web"/></entry><entry><title>MapServer and WxS updateSequence</title><link href="https://kralidis.ca/blog/blog/2008/02/12/mapserver-and-wxs-updatesequence/" rel="alternate"/><published>2008-02-12T20:18:00+00:00</published><updated>2008-02-12T20:18:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-02-12:/blog/blog/2008/02/12/mapserver-and-wxs-updatesequence/</id><summary type="html">&lt;p&gt;OGC service standards (such as WMS, WFS, WCS, SOS) support something called updateSequence. In short, this value represents an identifier which clients (catalogs, applications, etc.) can use to maintain their local copy up to date. This saves clients from fetching and parsing an entire (sometimes hefty) Capabilities XML document in …&lt;/p&gt;</summary><content type="html">&lt;p&gt;OGC service standards (such as WMS, WFS, WCS, SOS) support something called updateSequence. In short, this value represents an identifier which clients (catalogs, applications, etc.) can use to maintain their local copy up to date. This saves clients from fetching and parsing an entire (sometimes hefty) Capabilities XML document in cases where the server has not made any updates.&lt;/p&gt;
&lt;p&gt;Thanks to a recent &lt;a href="http://trac.osgeo.org/mapserver/ticket/2384" title="enhancement"&gt;enhancement&lt;/a&gt;, MapServer now supports updateSequence for WMS Server, WFS Server, WCS Server, and SOS Server. Support is triggered by mapfile metadata MAP/WEB/METADATA/ows_updatesequence. The value can be a string, integer or ISO8601 timestamp.&lt;/p&gt;
&lt;p&gt;We initially thought of using the mtime of the mapfile, but this may not have been the most indicative. What if other files (pointed to by the mapfile) are modified, and not the mapfile? What if the mapfile is touch'd and and no content changes are made? For this reason, we went with a user-specified value. Basically, if the user knows the purpose updateSequence, they can use it and manage it at their own discretion.&lt;/p&gt;
&lt;p&gt;I suppose the OGC could have allowed using the HTTP Last-Modified header, however that may get slippery in terms of semantics.&lt;/p&gt;
&lt;p&gt;Give it a shot! I'd be interested in hearing how this works with existing catalogues and applications. The enhancement seems to be passing the CITE tests initially (let's keep our fingers crossed!). At any rate, it is fun to code an enhancement like this. It's also nice to have dedicated tests to all the use cases surrounding updateSequence within &lt;a href="http://trac.osgeo.org/mapserver/browser/trunk/msautotest/wxs" title="msautotest/wxs/"&gt;msautotest/wxs/&lt;/a&gt;.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>MapServer Janitorial</title><link href="https://kralidis.ca/blog/blog/2008/01/25/mapserver-janitorial/" rel="alternate"/><published>2008-01-25T19:04:00+00:00</published><updated>2008-01-25T19:04:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-01-25:/blog/blog/2008/01/25/mapserver-janitorial/</id><summary type="html">&lt;p&gt;&lt;img src="https://kralidis.ca/blog/blog/wp-content/uploads/2008/01/cleanup.jpg" data-align="left" width="185" height="250" alt="cleanup" /&gt;Some of the MapServer developers may have been getting more than their share of &lt;a href="http://trac.osgeo.org/mapserver/timeline" title="trac notifications"&gt;trac notifications&lt;/a&gt; this week. This is partly because I've taken the last few days to sift through many tickets which have no milestone attached to them. Between old issues, bugs that have since been fixed, etc …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img src="https://kralidis.ca/blog/blog/wp-content/uploads/2008/01/cleanup.jpg" data-align="left" width="185" height="250" alt="cleanup" /&gt;Some of the MapServer developers may have been getting more than their share of &lt;a href="http://trac.osgeo.org/mapserver/timeline" title="trac notifications"&gt;trac notifications&lt;/a&gt; this week. This is partly because I've taken the last few days to sift through many tickets which have no milestone attached to them. Between old issues, bugs that have since been fixed, etc., it was nice to clean house a bit. They contributed to ~20 tickets being closed just this week! It's amazing to see how many old school tickets there are lying around in trac. I try to commit to a once a month sift of trac for the oldies, but sometimes goodies :)&lt;/p&gt;
&lt;p&gt;Other MapServer thoughts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I love the &lt;a href="http://www.openlayers.org/blog/" title="OpenLayers"&gt;OpenLayers&lt;/a&gt; and &lt;a href="http://blog.geoserver.org/" title="GeoServer"&gt;GeoServer&lt;/a&gt; blogs. In addition to annoucements, they also convey useful information about features, demos, etc. It would be great if MapServer had a blog. Something like &lt;a href="http://www.coreblog.org/" title="COREBlog"&gt;COREBlog&lt;/a&gt; could be used within the existing Plone-based &lt;a href="http://mapserver.gis.umn.edu/" title="website"&gt;website&lt;/a&gt;. Or, as discussed with &lt;a href="http://hobu.biz" title="hobu"&gt;hobu&lt;/a&gt; on &lt;a href="irc://irc.freenode.net/mapserver" title="IRC"&gt;IRC&lt;/a&gt; earlier this week, maybe the entire MapServer website can be based on trac. Existing pages could be ported to trac, as well as having a unified username/password, leveraging the &lt;a href="http://www.osgeo.org/" title="OSGeo"&gt;OSGeo&lt;/a&gt; infrastructure. Food for thought :)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ms-ogc-workshop.maptools.org/" title="OGC Web Services Workshop"&gt;OGC Web Services Workshop&lt;/a&gt;: I have been thinking about moving this to MapServer's OSGeo infrastructure. This way, it matures with the MapServer project as a whole. This would include a dedicated component in &lt;a href="http://trac.osgeo.org/mapserver/" title="trac"&gt;trac&lt;/a&gt;, as well as a module in &lt;a href="http://svn.osgeo.org/mapserver" title="svn"&gt;svn&lt;/a&gt;. Well, it turns out that Steve, who is doing a MapServer tutorial, is into this as well. This could lead to perhaps shared mapfiles and datasets for the various MapServer demos/tutorials/workshops. Stay tuned!&lt;/li&gt;
&lt;li&gt;I'll say &lt;a href="/blog/2007/04/23/my-mapserver-wishlist/" title="this"&gt;this&lt;/a&gt; again: I think a better organized codebase would result in more intuitive, componentized development. For example, it's so easy to peruse the &lt;a href="http://www.gdal.org/" title="GDAL"&gt;GDAL&lt;/a&gt; &lt;a href="http://svn.osgeo.org/gdal/trunk/gdal/" title="codebase"&gt;codebase&lt;/a&gt; thanks to the directory structuring of the code, IMHO&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That's it from here. Time to kickoff the weekend and start up the BBQ (yes, in this tundra-like weather -- I'm an all year BBQ guy). Have a great weekend everyone!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Two Milk, No Sugar</title><link href="https://kralidis.ca/blog/blog/2007/12/28/two-milk-no-sugar/" rel="alternate"/><published>2007-12-28T08:50:00+00:00</published><updated>2007-12-28T08:50:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2007-12-28:/blog/blog/2007/12/28/two-milk-no-sugar/</id><summary type="html">&lt;p&gt;That's how I take my coffee :) You may have heard of &lt;a href="http://www.timhortons.com/" title="Tim Hortons"&gt;Tim Hortons&lt;/a&gt; -- a mecca for coffee shops in Canada. Many of us are lost without it during our morning commute. Even though they are seemingly everywhere, there are times when you just can't find one.&lt;/p&gt;
&lt;p&gt;A friend of mine …&lt;/p&gt;</summary><content type="html">&lt;p&gt;That's how I take my coffee :) You may have heard of &lt;a href="http://www.timhortons.com/" title="Tim Hortons"&gt;Tim Hortons&lt;/a&gt; -- a mecca for coffee shops in Canada. Many of us are lost without it during our morning commute. Even though they are seemingly everywhere, there are times when you just can't find one.&lt;/p&gt;
&lt;p&gt;A friend of mine pointed me to a &lt;a href="http://www.gpspassion.com/forumsen/topic.asp?TOPIC_ID=66445&amp;amp;whichpage=1" title="forum"&gt;forum&lt;/a&gt; working on collecting locations of all Tim Hortons locations in Canada and the US. Wouldn't it be great to upload these to a GPS which supports GPX format? Or to visualize in Google Earth, for example?&lt;/p&gt;
&lt;p&gt;This is easily done using open source geospatial tools. &lt;a href="http://www.gdal.org/ogr/" title="OGR"&gt;OGR&lt;/a&gt; supports the reading and writing of a number of &lt;a href="http://www.gdal.org/ogr/ogr_formats.html" title="formats"&gt;formats&lt;/a&gt;, including GPX, KML, GeoJSON, Shapefile, and so on. Here's how:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Download http://www.gpspassion.com/upload/team/Dewi_TimHortons_xls_20071120.zip th.zip&lt;/li&gt;
&lt;li&gt;Save as CSV (there is a CSV online, but the XLS has more detailed description of each location)&lt;/li&gt;
&lt;li&gt;Use OGR's &lt;a href="http://www.gdal.org/ogr/drv_vrt.html" title="Virtual Datasource"&gt;Virtual Datasource support&lt;/a&gt; to read the CSV. Here's the OVF definition:&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- --&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;OGRVRTDataSource&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;OGRVRTLayer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;th&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;SrcDataSource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;relativeToVRT=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;./th.csv&lt;span class="nt"&gt;&amp;lt;/SrcDataSource&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;GeometryType&amp;gt;&lt;/span&gt;wkbPoint&lt;span class="nt"&gt;&amp;lt;/GeometryType&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;LayerSRS&amp;gt;&lt;/span&gt;WGS84&lt;span class="nt"&gt;&amp;lt;/LayerSRS&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;GeometryField&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;encoding=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;PointFromColumns&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;x=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Longitude&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;y=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Latitude&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/OGRVRTLayer&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/OGRVRTDataSource&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Transform to your heart's content:&lt;/p&gt;
&lt;p&gt;\$ ogr2ogr -f KML ./th.kml ./th.ovf&lt;/p&gt;
&lt;p&gt;\$ ogr2ogr -dsco "GPX_USE_EXTENSIONS=YES" -f GPX ./th.gpx ./th.ovf&lt;/p&gt;
&lt;p&gt;I've bundled up a &lt;a href="/tmp/th.zip" title="zipfile"&gt;zipfile&lt;/a&gt; of various formats for use as an example -- have fun!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Cheers to 2007</title><link href="https://kralidis.ca/blog/blog/2007/12/27/cheers-to-2007/" rel="alternate"/><published>2007-12-27T07:51:00+00:00</published><updated>2007-12-27T07:51:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2007-12-27:/blog/blog/2007/12/27/cheers-to-2007/</id><summary type="html">&lt;p&gt;Since I did this &lt;a href="/blog/2006/12/29/cheers-to-2006/" title="last year"&gt;last year&lt;/a&gt;, I thought I'd try this again for 2007. Here's a lowdown for my 2007:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;REST is really here: and as popular as ever. For me, I finally realized that REST was a style, not a syntax, API or schema for that matter. Sean's recent …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;Since I did this &lt;a href="/blog/2006/12/29/cheers-to-2006/" title="last year"&gt;last year&lt;/a&gt;, I thought I'd try this again for 2007. Here's a lowdown for my 2007:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;REST is really here: and as popular as ever. For me, I finally realized that REST was a style, not a syntax, API or schema for that matter. Sean's recent &lt;a href="http://zcologia.com/news/634/last-rest-post-of-2007/" title="post"&gt;post&lt;/a&gt; sums it up quite nicely. It's nice to see the OGC has acknowledged this&lt;/li&gt;
&lt;li&gt;Mass Market is really here: Things like Google, Yahoo Maps, and lowering the barrier to application development and, more ultimately, &lt;a href="http://radar.oreilly.com/archives/2007/12/more_data_better_than_algorithms.html" title="content"&gt;content&lt;/a&gt;, are paramount in the Web 2.0 sphere of things. Defacto standards / approaches matter&lt;/li&gt;
&lt;li&gt;Geospatial Catalogues: I blogged about &lt;a href="/blog/2006/08/04/geospatial-catalog-development-brewing/" title="this"&gt;this&lt;/a&gt; last year. Even with Cat 2.0 CSW / ebRIM formally approve, where is catalogue interoperability? Is a federated / distributed catalogue approach realistic in the near future?&lt;/li&gt;
&lt;li&gt;MapServer:&lt;/li&gt;
&lt;li&gt;SOS Server: There has been &lt;a href="http://trac.osgeo.org/mapserver/query?component=SOS+Server&amp;amp;order=priority" title="much development here"&gt;much development here&lt;/a&gt;, including forthcoming support for 1.0.0, as well as implementation of POST support in &lt;a href="http://trac.osgeo.org/mapserver/browser/trunk/mapserver/mapogcsos.c" title="mapogcsos.c"&gt;mapogcsos.c.&lt;/a&gt; SWE DataBlock has also been implemented. We've also introduced automated testing for SOS in msautotest/wxs/sos.map. And a slew of bug fixes, memory leak fixes, etc. So I'm really happy about how SOS Server support has progressed this year. It goes without saying that major props to Assefa are in order here, as well Charlton and other MapServer SOS Server testers who have provided valuable feedback&lt;/li&gt;
&lt;li&gt;OWS Common: Through increased usage in SOS Server, as well as the WCS 1.1 Server support (thanks Frank!), &lt;a href="http://trac.osgeo.org/mapserver/browser/trunk/mapserver/mapowscommon.c" title="mapowscommon.c"&gt;mapowscommon.c&lt;/a&gt; usage has been slowly increasing in the codebase to reuse existing functionality. This is a result of the OGC standards gradually adopting OWS Common for their "common" bits of XML and such. mapowscommon.c is also becoming more robust as a result of more integration and testing. I'm also happy about the increased &lt;a href="http://www.xmlsoft.org/" title="libxml2"&gt;libxml2&lt;/a&gt; support in MapServer. We used libxml2's xpath functionality in &lt;a href="/blog/2007/10/15/mapserver-sos-and-swe-datablock/" title="supporting SWE DataBlock"&gt;supporting SWE DataBlock&lt;/a&gt;, and have generic utilities now defined in &lt;a href="http://trac.osgeo.org/mapserver/browser/trunk/mapserver/maplibxml2.c" title="maplibxml2.c"&gt;maplibxml2.c&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;I'm happy to have become more involved in the MapServer codebase and project overall as part of the Project Steering Committee. There is definitely alot going on and alot to do, and the enthusiasm, commitment and helpful nature of the &lt;a href="http://mapserver.gis.umn.edu/development/developers" title="developers"&gt;developers&lt;/a&gt; is great. MapServer is a special project to me, starting in early 2000 as part of my research / dissertation. The rest, as they say, is history. Oh, and "STYLES=" is optional again :)&lt;/li&gt;
&lt;li&gt;Publications: I was &lt;a href="/blog/2007/05/01/new-geospatial-web-book/" title="glad"&gt;glad&lt;/a&gt; to see "The Geospatial Web" published this year. Nice to see new folks and goings on out there&lt;/li&gt;
&lt;li&gt;Adventures in Python: I decided to &lt;a href="/blog/2007/06/18/getting-into-python/" title="dive"&gt;dive&lt;/a&gt; &lt;a href="/blog/2007/07/14/reprojecting-in-python/" title="into"&gt;into&lt;/a&gt; &lt;a href="/blog/2007/07/15/owslib-and-mapscript/" title="python"&gt;python&lt;/a&gt; finally. With some sound &lt;a href="http://zcologia.com/news/488/diving-into-python/" title="advice"&gt;advice&lt;/a&gt; from Sean, I embraced stuff like Genshi and etree. I managed to stand up a generic &lt;a href="http://www.opengeospatial.org/standards/sensorml" title="SensorML"&gt;SensorML&lt;/a&gt; generator which I'm happy with, as far as my first Python project goes. My next goals are to experiement with doing things differently (like SQLAlchemy; I had to use good old SQL scripting as I ran out of time)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In other news:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Construction time continues: I did some &lt;a href="/pics/view/props/tor-etob-cp/exterior2007/" title="major work"&gt;major work&lt;/a&gt; on my place, including new fencing, landscaping/gardening, central air conditioning, as well as a shiny new veranda. A bit more curb appeal for sure&lt;/li&gt;
&lt;li&gt;Condo: I finally picked up my condo this year. After much thought, I decided to sell. This was a beautiful property in a can't lose location! Onwards&lt;/li&gt;
&lt;li&gt;Lifestyle changes: Perhaps my biggest victory is &lt;a href="/blog/2007/06/17/nice-stop-smoking-timeline/" title="quitting smoking"&gt;quitting smoking&lt;/a&gt;. I have been absolutely smoke free for all of 2007. I can't say that there haven't been times where I wanted one from time to time, but I feel much healthier and better overall&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So as 2008 quickly approaches, here are a few things I'm looking forward to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MapServer: I look forward to continuing in helping more with OGC support, as well as become more familiar with the inner workings of the codebase.&lt;/li&gt;
&lt;li&gt;OpenLayers: I really want to get into OpenLayers this year. I have not done much on client side work since the initial Mapbuilder days&lt;/li&gt;
&lt;li&gt;New Springer publication: keep an eye out for a new, exciting book on GIS and open source this year&lt;/li&gt;
&lt;li&gt;OWSContext and KML: it will be useful to see a resolution or unification of some sort between these two standards&lt;/li&gt;
&lt;li&gt;OpenSearch: I think OpenSearch, with the geo extensions, will make a big hit this year. Nothing like a simple search facility which is already supported in browsers&lt;/li&gt;
&lt;li&gt;I'm renovating my &lt;a href="/pics/view/props/tor-etob-cp/basement/" title="basement"&gt;basement&lt;/a&gt; this year. Gutting the entire basement and installing a new bathroom and kitchen. I hope to have this done by summer 2008 -- wish me luck!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So that's it from here. I wish you and your loved ones the very best in the holiday season and for 2008!&lt;/p&gt;</content><category term="geospatial, home renovation, open source, personal, properties, technology, travel, web, website"/></entry><entry><title>It Just Works</title><link href="https://kralidis.ca/blog/blog/2007/12/18/it-just-works/" rel="alternate"/><published>2007-12-18T15:26:00+00:00</published><updated>2007-12-18T15:26:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2007-12-18:/blog/blog/2007/12/18/it-just-works/</id><summary type="html">&lt;p&gt;&lt;a href="/pics/view/misc/macbook/" title="Finally!"&gt;&lt;img src="/pics/download/4239-2/DSCN1077.JPG" data-align="left" width="150" height="113" alt="Finally!" /&gt;&lt;/a&gt;Finally, after completing my Christmas shopping, I lucked out and got my MacBook. Future Shop was clearing them out and I took the opportunity to cash in my points and take the plunge. I ended up buying the same model as I &lt;a href="/blog/2007/07/22/macbook-baby/" title="originally planned"&gt;originally planned&lt;/a&gt;, but in white (apparently there's a …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="/pics/view/misc/macbook/" title="Finally!"&gt;&lt;img src="/pics/download/4239-2/DSCN1077.JPG" data-align="left" width="150" height="113" alt="Finally!" /&gt;&lt;/a&gt;Finally, after completing my Christmas shopping, I lucked out and got my MacBook. Future Shop was clearing them out and I took the opportunity to cash in my points and take the plunge. I ended up buying the same model as I &lt;a href="/blog/2007/07/22/macbook-baby/" title="originally planned"&gt;originally planned&lt;/a&gt;, but in white (apparently there's a significant price diff for the colour). I declined the "extended service plan" due to my bad past experiences with them (it comes with a one-year warranty from Apple).&lt;/p&gt;
&lt;p&gt;Whoever said it just works is right. I was up and running in no time. No need to search for digital camera software, I just plug in and it works. Same with my printer and iPod. In about an hour, I was upgraded to Leopard and the latest software updates and up and running on my wireless network.&lt;/p&gt;
&lt;p&gt;I then downloaded NeoOffice, Skype and Adium and I was off to the races. All this ease, and with the flexibility to use the native UNIX core when I want. Porting over and plugging in my content (music, photos, etc.) was a snap. Smooth sailing ever since.&lt;/p&gt;
&lt;p&gt;Some initial thoughts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the corded mouse (I didn't want a cordless and the battery dependencies that came with it) has a mighty short cord, which is not bad, but a bit iffy when the USB port is on the left of the MacBook (I'm a right handed mouse guy)&lt;/li&gt;
&lt;li&gt;What do folks do about warranty? Is it better to buy an AppleCare package?&lt;/li&gt;
&lt;li&gt;Say I wanted to build MapServer, is there a specific/preferred way to do this? Maybe I'll ask Steve (Lime) or hobu&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now I just need a way to manage my bookmarks across browsers...&lt;/p&gt;</content><category term="technology"/></entry><entry><title>MapServer SOS Server Updates</title><link href="https://kralidis.ca/blog/blog/2007/11/25/mapserver-sos-server-updates/" rel="alternate"/><published>2007-11-25T21:29:00+00:00</published><updated>2007-11-25T21:29:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2007-11-25:/blog/blog/2007/11/25/mapserver-sos-server-updates/</id><summary type="html">&lt;p&gt;This past week has seen alot of activity in MapServer's SOS Server Support. Remember when I posted about &lt;a href="/blog/2007/10/15/mapserver-sos-and-swe-datablock/" title="DataBlock"&gt;DataBlock&lt;/a&gt;? Well, Assefa did a great job in initially implementing this, and you can see the results in action &lt;a href="http://sos-web.tamu.edu/sos-cgi/top_obs" title="right here"&gt;right here&lt;/a&gt;. I'm going to be working on ensuring the XML conformance as …&lt;/p&gt;</summary><content type="html">&lt;p&gt;This past week has seen alot of activity in MapServer's SOS Server Support. Remember when I posted about &lt;a href="/blog/2007/10/15/mapserver-sos-and-swe-datablock/" title="DataBlock"&gt;DataBlock&lt;/a&gt;? Well, Assefa did a great job in initially implementing this, and you can see the results in action &lt;a href="http://sos-web.tamu.edu/sos-cgi/top_obs" title="right here"&gt;right here&lt;/a&gt;. I'm going to be working on ensuring the XML conformance as per the SOS and OM standards, but it's great to see this working!&lt;/p&gt;
&lt;p&gt;This weekend, I added &lt;a href="http://trac.osgeo.org/mapserver/ticket/2379" title="POST support"&gt;POST support&lt;/a&gt;. The SOS standard states that POST must be supported for all requests (except for GetCapabilities, which may be GET only). As a result, both GET and POST are now supported for all requests. I used &lt;a href="http://www.xmlsoft.org/" title="libxml2"&gt;libxml2&lt;/a&gt;'s &lt;a href="http://www.xmlsoft.org/html/libxml-xpath.html" title="XPath"&gt;XPath&lt;/a&gt; support to parse the requests. &lt;a href="http://www.w3.org/TR/xpath" title="XPath"&gt;XPath&lt;/a&gt; is an awesome way to parse XML! Support is not fully completed yet, as eventTime, result, and featureOfInterest are still yet to be implemented for POST (they are implemented for GET).&lt;/p&gt;
&lt;p&gt;It will be interesting to see the mileage DataBlock gets. Especially seeing that now MapServer SOS presents a nice compact option to disseminate observation data over the web.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Happy GIS Day 2007!</title><link href="https://kralidis.ca/blog/blog/2007/11/14/happy-gis-day-2007/" rel="alternate"/><published>2007-11-14T12:01:00+00:00</published><updated>2007-11-14T12:01:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2007-11-14:/blog/blog/2007/11/14/happy-gis-day-2007/</id><content type="html">&lt;p&gt;I'll be at Ryerson University later today to celebrate GIS day. Ryerson University's G. Raymond Chang School of Continuing Education &lt;a href="http://www.ryerson.ca/ce/gis/" title="GIS program"&gt;GIS program&lt;/a&gt; is putting on a "&lt;a href="http://www.ryerson.ca/ce/GISday" title="Showcase of GIS Educational and Career Opportunities"&gt;Showcase of GIS Educational and Career Opportunities&lt;/a&gt;".&lt;/p&gt;
&lt;p&gt;So how are you celebrating GIS day? And what are your thoughts on GIS this year?&lt;/p&gt;</content><category term="geospatial, technology, web"/></entry><entry><title>MapServer SOS and SWE DataBlock</title><link href="https://kralidis.ca/blog/blog/2007/10/15/mapserver-sos-and-swe-datablock/" rel="alternate"/><published>2007-10-15T20:27:00+00:00</published><updated>2007-10-15T20:27:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2007-10-15:/blog/blog/2007/10/15/mapserver-sos-and-swe-datablock/</id><summary type="html">&lt;p&gt;As part of MapServer's support for standards-based interfaces, the SOS Server support is coming along quite well. With SOS 1.0.0 now adopted (although the schemas and standards document are not on the &lt;a href="http://www.opengeospatial.org/" title="OGC"&gt;OGC&lt;/a&gt; public website yet), this provides a good opportunity to update the SOS support (which was …&lt;/p&gt;</summary><content type="html">&lt;p&gt;As part of MapServer's support for standards-based interfaces, the SOS Server support is coming along quite well. With SOS 1.0.0 now adopted (although the schemas and standards document are not on the &lt;a href="http://www.opengeospatial.org/" title="OGC"&gt;OGC&lt;/a&gt; public website yet), this provides a good opportunity to update the SOS support (which was previously at 0.0.31 and 0.1.2). This also was also a good time to move some of the GML code out of mapogcsos.c and into modular functions within mapgml.c.&lt;/p&gt;
&lt;p&gt;Already numerous updates have been made. Some work is still required for GetObservation output (formatting, application schema, etc.). In parallel, Charlton Purvis has &lt;a href="http://trac.osgeo.org/mapserver/ticket/2248" title="requested"&gt;requested&lt;/a&gt; SWE DataBlock support as an output format for GetObservation requests. What the heck is a DataBlock, you say?&lt;/p&gt;
&lt;p&gt;MapServer's SOS GetObservation output is very WFS-ish in appearance (we use om:member to encapsulate a gml:featureMember, among other data). Of course, each attribute (or column value) is output as:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;pitch&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;2.5&amp;lt;yaw&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;-1.4538&lt;span class="nt"&gt;&amp;lt;/yaw&amp;gt;&lt;/span&gt;
...
&lt;span class="nt"&gt;&amp;lt;pitch&amp;gt;&lt;/span&gt;1.49672&lt;span class="nt"&gt;&amp;lt;/pitch&amp;gt;&amp;lt;yaw&amp;gt;&lt;/span&gt;-1.59275&lt;span class="nt"&gt;&amp;lt;/yaw&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Observation data can become quite voluminous. Coupled with the baggage in redundant tag names, and you have quite a large response.&lt;/p&gt;
&lt;p&gt;Let's not be confused here. One big benefit of XML is that it allows for expressive and self-describing content models. At the same time, there are some situations where a more compact representation is beneficial.&lt;/p&gt;
&lt;p&gt;Enter the SWE DataBlock. An XML construct, the DataBlock puts forth a header, if you will, which defines the field names and types, as well format separators. What then follows is a "block" of data, similar to a CSV file. Check out this &lt;a href="http://trac.osgeo.org/mapserver/attachment/ticket/2248/airdas.xml" title="example"&gt;example&lt;/a&gt; for a better idea. MapServer will still support the existing GetObservation output; we are simply adding another resultModel to the mix.&lt;/p&gt;
&lt;p&gt;I think this will be a welcome addition to MapServer's SOS support. I initially thought &lt;a href="http://www.gdal.org/ogr/" title="OGR"&gt;OGR&lt;/a&gt;'s CSV write support would be a good fit, but Frank thought, for such a simple output, we might as well do this inline.&lt;/p&gt;
&lt;p&gt;I think SWE DataBlock is pretty useful. I wonder whether WFS GetFeature requests would benefit from this as well.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>There Goes the Basement</title><link href="https://kralidis.ca/blog/blog/2007/10/02/there-goes-the-basement/" rel="alternate"/><published>2007-10-02T07:10:00+00:00</published><updated>2007-10-02T07:10:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2007-10-02:/blog/blog/2007/10/02/there-goes-the-basement/</id><summary type="html">&lt;p&gt;&lt;a href="http://www.kralidis.ca/pics/view/props/tor-etob-cp/basement/" title="basement renovation"&gt;&lt;img src="http://www.kralidis.ca/pics/download/4054-2/dscn1019.jpg" class="alignleft" style="float: left;" data-align="left" width="150" height="113" alt="basement renovation" /&gt;&lt;/a&gt;In what will probably be my last major renovation for some time, I have started my basement renovation project this past weekend, starting with ripping things down!&lt;/p&gt;
&lt;p&gt;At this point, the plan is for a new washroom++, laundry area, and rough in for a kitchen. No rush here, so I'm …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="http://www.kralidis.ca/pics/view/props/tor-etob-cp/basement/" title="basement renovation"&gt;&lt;img src="http://www.kralidis.ca/pics/download/4054-2/dscn1019.jpg" class="alignleft" style="float: left;" data-align="left" width="150" height="113" alt="basement renovation" /&gt;&lt;/a&gt;In what will probably be my last major renovation for some time, I have started my basement renovation project this past weekend, starting with ripping things down!&lt;/p&gt;
&lt;p&gt;At this point, the plan is for a new washroom++, laundry area, and rough in for a kitchen. No rush here, so I'm hoping to have this done by the spring 2008. Wish me luck!&lt;/p&gt;</content><category term="home renovation, properties"/></entry><entry><title>FSU and FOSS4G</title><link href="https://kralidis.ca/blog/blog/2007/10/01/fsu-and-foss4g/" rel="alternate"/><published>2007-10-01T15:42:00+00:00</published><updated>2007-10-01T15:42:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2007-10-01:/blog/blog/2007/10/01/fsu-and-foss4g/</id><summary type="html">&lt;p&gt;&lt;a href="http://maps.co.mecklenburg.nc.us/ft/" title="Fuzzy Tolerance"&gt;Fuzzy Tolerance&lt;/a&gt; &lt;a href="http://maps.co.mecklenburg.nc.us/ft/?p=164" title="reports"&gt;reports&lt;/a&gt; that FSU is offering &lt;a href="http://gis.coaps.fsu.edu/moodle/" title="courses in open source GIS"&gt;courses in open source GIS&lt;/a&gt; packages such as &lt;a href="http://udig.refractions.net/" title="uDig"&gt;uDig&lt;/a&gt; and &lt;a href="http://www.qgis.org/" title="QGIS"&gt;QGIS&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I think this is awesome, and that there is not enough on SDI and foss4g at the college/university level. Maybe there is confusion on whether this sort of thing belongs in …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="http://maps.co.mecklenburg.nc.us/ft/" title="Fuzzy Tolerance"&gt;Fuzzy Tolerance&lt;/a&gt; &lt;a href="http://maps.co.mecklenburg.nc.us/ft/?p=164" title="reports"&gt;reports&lt;/a&gt; that FSU is offering &lt;a href="http://gis.coaps.fsu.edu/moodle/" title="courses in open source GIS"&gt;courses in open source GIS&lt;/a&gt; packages such as &lt;a href="http://udig.refractions.net/" title="uDig"&gt;uDig&lt;/a&gt; and &lt;a href="http://www.qgis.org/" title="QGIS"&gt;QGIS&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I think this is awesome, and that there is not enough on SDI and foss4g at the college/university level. Maybe there is confusion on whether this sort of thing belongs in computer science or geography programs (or both). Maybe it's still in early stages to introduce into formal curriculum.&lt;/p&gt;
&lt;p&gt;What I do know is that this would help students hit the ground running when they begin their career.&lt;/p&gt;</content><category term="geospatial, technology"/></entry><entry><title>MapServer 5.0 released</title><link href="https://kralidis.ca/blog/blog/2007/09/17/mapserver-50-released/" rel="alternate"/><published>2007-09-17T15:24:00+00:00</published><updated>2007-09-17T15:24:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2007-09-17:/blog/blog/2007/09/17/mapserver-50-released/</id><content type="html">&lt;p&gt;Fresh off the press, &lt;a href="http://www.nabble.com/MapServer-5.0.0-released%21-tf4469827.html" title="check it out"&gt;check it out&lt;/a&gt;.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Greetings from Rarified Boulder</title><link href="https://kralidis.ca/blog/blog/2007/09/16/greetings-from-rarified-boulder/" rel="alternate"/><published>2007-09-16T21:30:00+00:00</published><updated>2007-09-16T21:30:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2007-09-16:/blog/blog/2007/09/16/greetings-from-rarified-boulder/</id><summary type="html">&lt;p&gt;&lt;a href="/pics/view/trips/colorado2007/" title="16th Street Mall, Denver"&gt;&lt;img src="/pics/download/4013-5/dscn0999.jpg" title="16th Street Mall, Denver" data-align="left" width="113" height="150" alt="16th Street Mall, Denver" /&gt;&lt;/a&gt;I'm in Boulder, Colorado for the &lt;a href="http://www.opengeospatial.org/" title="OGC"&gt;OGC&lt;/a&gt; &lt;a href="http://www.opengeospatial.org/event/0709tc" title="meetings"&gt;meetings&lt;/a&gt;. I had a chance to check out Denver earlier today (16th Street Mall, as well stumbling upon a Latin-American festival), which was very nice. The mountains are absolutely breathtaking!&lt;/p&gt;
&lt;p&gt;I'm going to try to hook up with &lt;a href="http://www.zcologia.com/news/" title="Sean"&gt;Sean&lt;/a&gt; sometime this week, as …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="/pics/view/trips/colorado2007/" title="16th Street Mall, Denver"&gt;&lt;img src="/pics/download/4013-5/dscn0999.jpg" title="16th Street Mall, Denver" data-align="left" width="113" height="150" alt="16th Street Mall, Denver" /&gt;&lt;/a&gt;I'm in Boulder, Colorado for the &lt;a href="http://www.opengeospatial.org/" title="OGC"&gt;OGC&lt;/a&gt; &lt;a href="http://www.opengeospatial.org/event/0709tc" title="meetings"&gt;meetings&lt;/a&gt;. I had a chance to check out Denver earlier today (16th Street Mall, as well stumbling upon a Latin-American festival), which was very nice. The mountains are absolutely breathtaking!&lt;/p&gt;
&lt;p&gt;I'm going to try to hook up with &lt;a href="http://www.zcologia.com/news/" title="Sean"&gt;Sean&lt;/a&gt; sometime this week, as he is close by. In the meantime, check out some &lt;a href="/pics/view/trips/colorado2007/" title="photos"&gt;photos&lt;/a&gt; from today -- I'll be updating these as the week goes on.&lt;/p&gt;</content><category term="geospatial, open source, technology, travel, web"/></entry><entry><title>UNIX Magic</title><link href="https://kralidis.ca/blog/blog/2007/09/11/unix-magic/" rel="alternate"/><published>2007-09-11T15:23:00+00:00</published><updated>2007-09-11T15:23:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2007-09-11:/blog/blog/2007/09/11/unix-magic/</id><summary type="html">&lt;p&gt;Saw &lt;a href="http://digg.com/linux_unix/The_UNIX_Wizard_Pic" title="this"&gt;this&lt;/a&gt; via &lt;a href="http://www.digg.com/" title="digg"&gt;digg&lt;/a&gt; earlier today, and couldn't help but appreciate the "&lt;a href="http://www.codinghorror.com/blog/images/unix-magic-overacre-poster.jpg" title="magic"&gt;magic&lt;/a&gt;" of UNIX for the nth time.&lt;/p&gt;
&lt;p&gt;My first foray into the UNIX world (years ago) was the result of a colleague (Mike Adair, of &lt;a href="http://communitymapbuilder.org/" title="mapbuilder"&gt;mapbuilder&lt;/a&gt; fame) who advised me to take UNIX training. I needed to script …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Saw &lt;a href="http://digg.com/linux_unix/The_UNIX_Wizard_Pic" title="this"&gt;this&lt;/a&gt; via &lt;a href="http://www.digg.com/" title="digg"&gt;digg&lt;/a&gt; earlier today, and couldn't help but appreciate the "&lt;a href="http://www.codinghorror.com/blog/images/unix-magic-overacre-poster.jpg" title="magic"&gt;magic&lt;/a&gt;" of UNIX for the nth time.&lt;/p&gt;
&lt;p&gt;My first foray into the UNIX world (years ago) was the result of a colleague (Mike Adair, of &lt;a href="http://communitymapbuilder.org/" title="mapbuilder"&gt;mapbuilder&lt;/a&gt; fame) who advised me to take UNIX training. I needed to script and chain processes together as part of a system to create a &lt;a href="http://geodiscover.cgdi.ca/gdp/search?action=fullMetadata&amp;amp;entryType=productCollection&amp;amp;entryId=28&amp;amp;entryLang=en" title="ground control point database"&gt;ground control point database&lt;/a&gt;. The rest, as they say, is history.&lt;/p&gt;
&lt;p&gt;As the years go by, and as things become more packaged, "easier to use", and "frameworks" popping up everywhere, I have found time and time again that the trusty UNIX command line and tools have saved the day when the pressure was on (this includes stuff like perl and [recently] python scripting), without the overhead of setting up grandiose configurations and such.&lt;/p&gt;
&lt;p&gt;How did you get started with UNIX? Stories involving hacks and / or someone over your shoulder looking in amazement are welcome :)&lt;/p&gt;</content><category term="open source, technology"/></entry><entry><title>Disaster Steak</title><link href="https://kralidis.ca/blog/blog/2007/07/22/disaster-steak/" rel="alternate"/><published>2007-07-22T12:36:00+00:00</published><updated>2007-07-22T12:36:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2007-07-22:/blog/blog/2007/07/22/disaster-steak/</id><summary type="html">&lt;p&gt;(preamble: if you know me well enough, you'll know that I use the term "disaster" in multiple modes / contexts. In this case, "disaster steak" is a good thing).&lt;/p&gt;
&lt;p&gt;&lt;a href="/pics/view/misc/disastersteak/" title="the beginning"&gt;&lt;img src="/pics/download/3959-2/dscn0924.jpg" title="the beginning" width="150" height="113" alt="the beginning" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This was a steak night. I had some friends over this weekend and sparked up the BBQ. I picked up some (big …&lt;/p&gt;</summary><content type="html">&lt;p&gt;(preamble: if you know me well enough, you'll know that I use the term "disaster" in multiple modes / contexts. In this case, "disaster steak" is a good thing).&lt;/p&gt;
&lt;p&gt;&lt;a href="/pics/view/misc/disastersteak/" title="the beginning"&gt;&lt;img src="/pics/download/3959-2/dscn0924.jpg" title="the beginning" width="150" height="113" alt="the beginning" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This was a steak night. I had some friends over this weekend and sparked up the BBQ. I picked up some (big) sirloin steaks from &lt;a href="http://www.costco.ca/" title="Costco"&gt;Costco&lt;/a&gt;, made sure beer was stocked and away I went. Here's how one makes a simple steak to die for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;wash down steaks with cold water&lt;/li&gt;
&lt;li&gt;place steaks in a large bowl&lt;/li&gt;
&lt;li&gt;douse steaks with balsamic vinegar (white or red) and rub&lt;/li&gt;
&lt;li&gt;douse steaks with olive oil and rub&lt;/li&gt;
&lt;li&gt;sprinkle steaks with &lt;a href="http://en.wikipedia.org/wiki/Montreal" title="Montreal"&gt;Montreal&lt;/a&gt; steak spice (you can &lt;a href="http://www.cookingcache.com/dips/montrealsteakseasoning.shtml" title="make your own"&gt;make your own&lt;/a&gt; if you really want)&lt;/li&gt;
&lt;li&gt;seal the bowl and place in the fridge for an hour or so to let the steaks marinate&lt;/li&gt;
&lt;li&gt;heat up the BBQ and slap on the steaks (N.B. have booze, appetizers, both, or whatever you want along the way -- it's always better than everyone just sitting there watching [and waiting]!)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="/pics/view/misc/disastersteak/" title="appetizers"&gt;&lt;img src="/pics/download/3974-2/dscn0929.jpg" title="appetizers" width="150" height="113" alt="appetizers" /&gt;&lt;/a&gt;&lt;a href="/pics/view/misc/disastersteak/" title="on the BBQ"&gt;&lt;img src="/pics/download/3980-2/dscn0931.jpg" title="on the BBQ" width="150" height="113" alt="on the BBQ" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cook steaks as desired (I like mine _well_ done)&lt;/li&gt;
&lt;li&gt;serve and enjoy!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="/pics/view/misc/disastersteak/" title="bon appetite!"&gt;&lt;img src="/pics/download/3986-2/dscn0933.jpg" title="bon appetite!" width="150" height="113" alt="bon appetite!" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Click on any of the photos to see the &lt;a href="/pics/view/misc/disastersteak/" title="whole process in pictures"&gt;whole process in pictures&lt;/a&gt;. Pretty simple, not much fuss and tastes awesome -- disaster!&lt;/p&gt;
&lt;p&gt;Anyone have any pointers or other ideas? I'd be glad to hear them!&lt;/p&gt;</content><category term="personal"/></entry><entry><title>MacBook, baby</title><link href="https://kralidis.ca/blog/blog/2007/07/22/macbook-baby/" rel="alternate"/><published>2007-07-22T11:32:00+00:00</published><updated>2007-07-22T11:32:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2007-07-22:/blog/blog/2007/07/22/macbook-baby/</id><summary type="html">&lt;p&gt;I cashed in some &lt;a href="http://www.aeroplan.com" title="Aeroplan"&gt;Aeroplan&lt;/a&gt; points and decided to pick up a &lt;a href="http://www.futureshop.ca/catalog/proddetail.asp?sku_id=0665000FS10089199&amp;amp;catid=23016&amp;amp;logon=&amp;amp;langid=EN&amp;amp;test%5Fcookie=1" title="MacBook"&gt;MacBook&lt;/a&gt;. Now I have to wait for the Aeroplan redemption to arrive via postal mail (they have security codes which have to be physically issued / used, so can't do it until then), and then I'm in. I should …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I cashed in some &lt;a href="http://www.aeroplan.com" title="Aeroplan"&gt;Aeroplan&lt;/a&gt; points and decided to pick up a &lt;a href="http://www.futureshop.ca/catalog/proddetail.asp?sku_id=0665000FS10089199&amp;amp;catid=23016&amp;amp;logon=&amp;amp;langid=EN&amp;amp;test%5Fcookie=1" title="MacBook"&gt;MacBook&lt;/a&gt;. Now I have to wait for the Aeroplan redemption to arrive via postal mail (they have security codes which have to be physically issued / used, so can't do it until then), and then I'm in. I should have it sometime this week, at which point I'll post my experiences.&lt;/p&gt;
&lt;p&gt;I currently use FC7 at home, and have always been intrigued by Macs, so I'm looking forward to this! Until then, any advice / helpers / lessons learned out there would be great!&lt;/p&gt;</content><category term="technology"/></entry><entry><title>OWSlib and mapscript</title><link href="https://kralidis.ca/blog/blog/2007/07/15/owslib-and-mapscript/" rel="alternate"/><published>2007-07-15T11:56:00+00:00</published><updated>2007-07-15T11:56:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2007-07-15:/blog/blog/2007/07/15/owslib-and-mapscript/</id><summary type="html">&lt;p&gt;My first major code contribution to MapServer was a server side implementation of &lt;a href="http://www.opengeospatial.org/standards/common" title="OWS Common"&gt;OWS Common&lt;/a&gt; &lt;a href="http://portal.opengeospatial.org/files/?artifact_id=8798" title="1.0.0"&gt;1.0.0&lt;/a&gt;. For those who are not aware, OWS Common is a specification which unifies common XML constructs, etc. used by OGC specifications, such as Capabilities metadata, exception reports and bounding box encodings. The …&lt;/p&gt;</summary><content type="html">&lt;p&gt;My first major code contribution to MapServer was a server side implementation of &lt;a href="http://www.opengeospatial.org/standards/common" title="OWS Common"&gt;OWS Common&lt;/a&gt; &lt;a href="http://portal.opengeospatial.org/files/?artifact_id=8798" title="1.0.0"&gt;1.0.0&lt;/a&gt;. For those who are not aware, OWS Common is a specification which unifies common XML constructs, etc. used by OGC specifications, such as Capabilities metadata, exception reports and bounding box encodings. The benefit of OWS Common is that specifications, and subsequently server implementations, can focus on their core specific functionality while leveraging the common bits.&lt;/p&gt;
&lt;p&gt;A good example here is MapServer's SOS server support, which leverages &lt;a href="http://trac.osgeo.org/mapserver/browser/trunk/mapserver/mapowscommon.c" title="mapowscommon.c"&gt;mapowscommon.c&lt;/a&gt;, making &lt;a href="http://trac.osgeo.org/mapserver/browser/trunk/mapserver/mapogcsos.c" title="mapogcsos.c"&gt;mapogcsos.c&lt;/a&gt; alot lighter as a result. Client implementations can additionally write OWS Common parsers as reusable functionality which they can then use when writing their, say, WFS and SOS clients. I really believe that this is a benefit for those developing SDI components (i.e. why should contact information be encoded differently for WMS and WFS, really?); just imagine the reduction in code as a result of OWS Common!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://zcologia.com/news/" title="Sean"&gt;Sean&lt;/a&gt; recently pointed me to &lt;a href="http://trac.gispython.org/projects/PCL/wiki/OwsLib" title="OWSlib"&gt;OWSlib&lt;/a&gt;, a python lib for working with OGC Web Services. I initially thought it would be great to write an OWS Common client / parser for OWSlib, so that when WFS 1.1.0 and SOS 1.0.0 clients are developed, they can use an OWS Common class between them.&lt;/p&gt;
&lt;p&gt;But then I thought why not just implement this in MapServer, and have the functionality exposed via mapscript?&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Reprojecting in Python</title><link href="https://kralidis.ca/blog/blog/2007/07/14/reprojecting-in-python/" rel="alternate"/><published>2007-07-14T17:40:00+00:00</published><updated>2007-07-14T17:40:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2007-07-14:/blog/blog/2007/07/14/reprojecting-in-python/</id><summary type="html">&lt;p&gt;My &lt;a href="/blog/2007/06/18/getting-into-python/" title="previous post"&gt;previous post&lt;/a&gt; declared my plugging my nose and jumping into Python GIS stuff. &lt;a href="http://zcologia.com/news/488/diving-into-python/" title="Advice"&gt;Advice&lt;/a&gt; and &lt;a href="http://www.gispython.org/" title="info"&gt;info&lt;/a&gt; from &lt;a href="http://zcologia.com/news/" title="Sean"&gt;Sean&lt;/a&gt; have been valuable in getting familiar with things, though I'll be the first to admit I'm still green (writing Python like a Perl / C hack :) ).&lt;/p&gt;
&lt;p&gt;So here's one of my first …&lt;/p&gt;</summary><content type="html">&lt;p&gt;My &lt;a href="/blog/2007/06/18/getting-into-python/" title="previous post"&gt;previous post&lt;/a&gt; declared my plugging my nose and jumping into Python GIS stuff. &lt;a href="http://zcologia.com/news/488/diving-into-python/" title="Advice"&gt;Advice&lt;/a&gt; and &lt;a href="http://www.gispython.org/" title="info"&gt;info&lt;/a&gt; from &lt;a href="http://zcologia.com/news/" title="Sean"&gt;Sean&lt;/a&gt; have been valuable in getting familiar with things, though I'll be the first to admit I'm still green (writing Python like a Perl / C hack :) ).&lt;/p&gt;
&lt;p&gt;So here's one of my first attempts at solving a real world problem: reprojecting a bunch of points from a CSV file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/usr/bin/python&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;mapscript&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

   &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot; &amp;lt;csvfile&amp;gt;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;projInObj&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mapscript&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;projectionObj&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;init=epsg:32619&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;projOutObj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mapscript&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;projectionObj&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;init=epsg:4326&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

   &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;id,geom,zone&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;,&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;wkt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;POINT(&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot; &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;)&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;shape&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mapscript&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shapeObj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fromWKT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wkt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# man, I love WKT!!&lt;/span&gt;
        &lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;projInObj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;projOutObj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;,&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;toWKT&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;,&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;And that's it! So now you can take the CSV output with the geometry encoded as WKT and hook it up to &lt;a href="http://mapserver.gis.umn.edu/" title="MapServer"&gt;MapServer&lt;/a&gt; with some simple OGR OVF syntax in your mapfile:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;CONNECTIONTYPE&lt;span class="w"&gt; &lt;/span&gt;OGR
CONNECTION&lt;span class="w"&gt; &lt;/span&gt;&amp;quot;&lt;span class="nt"&gt;&amp;lt;OGRVRTDataSource&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;OGRVRTLayer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;nb&amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;SrcDataSource&amp;gt;&lt;/span&gt;./nb.csv&lt;span class="nt"&gt;&amp;lt;/SrcDataSource&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;GeometryType&amp;gt;&lt;/span&gt;wkbPoint&lt;span class="nt"&gt;&amp;lt;/GeometryType&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;GeometryField&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;encoding=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;WKT&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;field=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;geom&amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/OGRVRTLayer&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/OGRVRTDataSource&amp;gt;&lt;/span&gt;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Mind you, you might question why to reproject when MapServer can do this for you, but I digress. There's probably more eloquent ways to do this than what's been done above via &lt;a href="http://mapserver.gis.umn.edu/docs/reference/mapscript" title="mapscript"&gt;mapscript&lt;/a&gt;, eh?&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Getting into Python</title><link href="https://kralidis.ca/blog/blog/2007/06/18/getting-into-python/" rel="alternate"/><published>2007-06-18T16:43:00+00:00</published><updated>2007-06-18T16:43:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2007-06-18:/blog/blog/2007/06/18/getting-into-python/</id><summary type="html">&lt;p&gt;Well, I've finally decided to give Python an honest try. A born and bred Perl hack, then dipping into PHP, I've seen much Python applause in the geospatial software community through many of &lt;a href="http://zcologia.com/news/" title="Sean's"&gt;Sean's&lt;/a&gt; &lt;a href="http://zcologia.com/news/478/shapely-geometries-for-python/" title="posts"&gt;posts&lt;/a&gt;. Though I know Sean thinks mapscript is a disaster, it was via mapscript that I …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Well, I've finally decided to give Python an honest try. A born and bred Perl hack, then dipping into PHP, I've seen much Python applause in the geospatial software community through many of &lt;a href="http://zcologia.com/news/" title="Sean's"&gt;Sean's&lt;/a&gt; &lt;a href="http://zcologia.com/news/478/shapely-geometries-for-python/" title="posts"&gt;posts&lt;/a&gt;. Though I know Sean thinks mapscript is a disaster, it was via mapscript that I started to look more into Python.&lt;/p&gt;
&lt;p&gt;So here's what I typically start off with when doing development:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTTP / URLs / Forms: for Perl, I use CGI; for PHP, I use the native, built in functions&lt;/li&gt;
&lt;li&gt;XML Processing: for Perl, I use XML::Simple; for PHP, I use SimpleXMLElement&lt;/li&gt;
&lt;li&gt;Database: for Perl, I use DBI; for PHP, I use the compiled in mysql support, for example&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So far I've found urllib2 and ElementTree to be useful. Other than that, I'm finding the command line pretty awesome for one offs and testing.&lt;/p&gt;
&lt;p&gt;If anyone's got any other suggestions, that would be great!!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt; (20 June 2007): Manual trackback and &lt;a href="http://zcologia.com/news/488/diving-into-python/" title="great post / response"&gt;great post / response&lt;/a&gt; from Sean&lt;/p&gt;</content><category term="open source, technology, web"/></entry><entry><title>Nice Stop Smoking Timeline</title><link href="https://kralidis.ca/blog/blog/2007/06/17/nice-stop-smoking-timeline/" rel="alternate"/><published>2007-06-17T17:25:00+00:00</published><updated>2007-06-17T17:25:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2007-06-17:/blog/blog/2007/06/17/nice-stop-smoking-timeline/</id><summary type="html">&lt;p&gt;Check out this &lt;a href="http://www.healthbolt.net/2007/06/11/healthbolt-graphics-1-what-happens-to-your-body-if-you-stop-smoking-right-now/" title="graphic"&gt;graphic&lt;/a&gt; I found (thanks &lt;a href="http://www.digg.com/" title="digg"&gt;digg&lt;/a&gt;), which shows the effects of smoking cessation. I also saw this recently in the doctor's office, and found it really helpful and encouraging.&lt;/p&gt;
&lt;p&gt;I'm glad to say I've been 100% smoke free (via &lt;a href="http://www.biovail.com/english/products/default.asp?s=1&amp;amp;product=253&amp;amp;viewer=patient&amp;amp;state=displayProduct&amp;amp;country=Canada" title="Zyban"&gt;Zyban&lt;/a&gt; for a month) for almost six months now …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Check out this &lt;a href="http://www.healthbolt.net/2007/06/11/healthbolt-graphics-1-what-happens-to-your-body-if-you-stop-smoking-right-now/" title="graphic"&gt;graphic&lt;/a&gt; I found (thanks &lt;a href="http://www.digg.com/" title="digg"&gt;digg&lt;/a&gt;), which shows the effects of smoking cessation. I also saw this recently in the doctor's office, and found it really helpful and encouraging.&lt;/p&gt;
&lt;p&gt;I'm glad to say I've been 100% smoke free (via &lt;a href="http://www.biovail.com/english/products/default.asp?s=1&amp;amp;product=253&amp;amp;viewer=patient&amp;amp;state=displayProduct&amp;amp;country=Canada" title="Zyban"&gt;Zyban&lt;/a&gt; for a month) for almost six months now (the only New Years Resolution that I've kept this long!).&lt;/p&gt;</content><category term="personal"/></entry><entry><title>My New Condo</title><link href="https://kralidis.ca/blog/blog/2007/06/06/my-new-condo/" rel="alternate"/><published>2007-06-06T17:13:00+00:00</published><updated>2007-06-06T17:13:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2007-06-06:/blog/blog/2007/06/06/my-new-condo/</id><summary type="html">&lt;p&gt;&lt;a href="/pics/view/props/tor-etob-condo/firstday/" title="My New Condo"&gt;&lt;img src="http://www.kralidis.ca/pics/download/3901-2/NIKON00839.JPG" title="My New Condo" data-align="left" data-border="0" width="150" height="113" alt="My New Condo" /&gt;&lt;/a&gt;Yesterday I got the keys to my new condominium. Awesome place, and well built (materials, craftsmanship, etc.). I think a great part about this place is the shared amenities (party / dining room, gym, pool, virtual golf, etc.). And the view of the city is quite nice from my balcony.&lt;/p&gt;
&lt;p&gt;Be …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="/pics/view/props/tor-etob-condo/firstday/" title="My New Condo"&gt;&lt;img src="http://www.kralidis.ca/pics/download/3901-2/NIKON00839.JPG" title="My New Condo" data-align="left" data-border="0" width="150" height="113" alt="My New Condo" /&gt;&lt;/a&gt;Yesterday I got the keys to my new condominium. Awesome place, and well built (materials, craftsmanship, etc.). I think a great part about this place is the shared amenities (party / dining room, gym, pool, virtual golf, etc.). And the view of the city is quite nice from my balcony.&lt;/p&gt;
&lt;p&gt;Be sure to check out all the &lt;a href="/pics/view/props/tor-etob-condo/firstday/" title="photos"&gt;photos&lt;/a&gt;!!&lt;/p&gt;</content><category term="properties"/></entry><entry><title>Tuning LAMP systems</title><link href="https://kralidis.ca/blog/blog/2007/05/30/tuning-lamp-systems/" rel="alternate"/><published>2007-05-30T20:19:00+00:00</published><updated>2007-05-30T20:19:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2007-05-30:/blog/blog/2007/05/30/tuning-lamp-systems/</id><summary type="html">&lt;p&gt;Check out these articles from IBM on tuning &lt;a href="http://en.wikipedia.org/wiki/LAMP_(software_bundle)" title="LAMP"&gt;LAMP&lt;/a&gt; applications. Being a longtime &lt;a href="http://www.onlamp.com/" title="LAMP"&gt;LAMP&lt;/a&gt; guy (the "P" being long time Perl hack, but slowly moving towards PHP), I found this useful for tweaks and optimizing my applications.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.ibm.com/developerworks/linux/library/l-tune-lamp-1/" title="Part 1"&gt;Part 1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.ibm.com/developerworks/linux/library/l-tune-lamp-2.html" title="Part 2"&gt;Part 2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Looking forward to Part 3, which covers MySQL.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update …&lt;/strong&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;Check out these articles from IBM on tuning &lt;a href="http://en.wikipedia.org/wiki/LAMP_(software_bundle)" title="LAMP"&gt;LAMP&lt;/a&gt; applications. Being a longtime &lt;a href="http://www.onlamp.com/" title="LAMP"&gt;LAMP&lt;/a&gt; guy (the "P" being long time Perl hack, but slowly moving towards PHP), I found this useful for tweaks and optimizing my applications.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.ibm.com/developerworks/linux/library/l-tune-lamp-1/" title="Part 1"&gt;Part 1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.ibm.com/developerworks/linux/library/l-tune-lamp-2.html" title="Part 2"&gt;Part 2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Looking forward to Part 3, which covers MySQL.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update (10 June 2007)&lt;/strong&gt;: here's &lt;a href="http://www.ibm.com/developerworks/linux/library/l-tune-lamp-3.html" title="Part 3"&gt;Part 3&lt;/a&gt;.&lt;/p&gt;</content><category term="open source, technology, web"/></entry></feed>