Developers Diary 2

Have you ever watched a team of five-year-olds play soccer? The way the mass of children chases the ball around in a group? I think programmers do that too.

Get the ball!

There’s something about working on a problem together that is so much more rewarding than working separately, we cannot help but get drawn into other peoples problems. There’s a lot of gratification to be had in finding a solution to a shared difficulty!

Even better, different people bring different perspectives to a problem, and illuminate different areas of improvement.


A couple months ago, my colleague Martin Davis committed a pair of new routines into JTS, to calculate the largest circles that can fit inside a polygon or in a collection of geometries.

Maximum Inscribed Circle

We want to bring all the algorithmic goodness of JTS to PostGIS, so I took up the first step, and ported “maximum inscribed circle” to GEOS and to PostGIS.

When I ported the GEOS test cases, I turned up some odd performance problems. The calculation seemed to be taking inordinately long for larger inputs. What was going on?

The “maximum inscribed circle” algorithm leans heavily on a routine called IndexedFacetDistance to calculate distances between polygon boundaries and candidate circle-centers while converging on the “maximum inscribed circle”. If that routine is slow, the whole algorithm will be slow.

Dan Baston, who originally ported the “IndexedFacetDistance” class got interested and started looking at some test cases of his own.

He found he could improve his old implementation using better memory management that he’d learned in the meantime. He also found some short-circuits to envelope distance calculation that improved performance quite a bit.

In fact, they improved performance so much that Martin ported them back to JTS, where he found that for some cases he could log a 10x performance in distance calculations.

There’s something alchemical about the whole thing.

  • Sidify Apple Music Converter 苹果音乐转换器 4.1.0 中文破解版:今天 · Sidify Apple Music Converter 苹果音乐转换器 4.1.0 中文破解版音频转换 Picture Instruments Time Fix Pro 照片时间修改软件 2.0.4 破解版图像处理 Ultimate EPubsoft DRM Removal 电子书DRM删除工具 15.8.2 破解版应用其他 NoteExpress 文献管理软件 官方版管理工具 ArtMoney SE 游戏修改工具 7.45.1 官方版游戏工具 TBProAudio Bundle ...
  • I ported an unrelated algorithm which exercised that code.
  • YouTube下载-YouTube官方中文app下载-油管最新手机安卓 ...:2021-6-2 · YouTube是一款全球最大的手机视频分享软件,即时线上收看并发掘全球YouTube用户都在观看的热门影片,订阅喜爱的频道或上传原创内容,与你的朋友和世界各地的人分享有趣的事,提供在线音乐播放,收看流行资讯、热门体育赛事,学习各领域知识,分享优秀影片等,喜欢的朋友快来下载体验吧!
  • Other folks with more knowledge were intrigued.
  • 消息称不同版本的iPhone 12刘海尺寸一致 LiDAR仅配备于6 ...:11 小时前 · YouTube频道EverythingApplePro的创建者今天早上在Twitter上引起了一场iPhone12泄密小风暴,他声称所谓的"iPhone12"的CAD图像表明,一些泄露者之前报告 ...
  • Improvements were found that made everything faster.

I did nothing except shine a light in a dark hole, and everyone else got very excited and things happened.


In a similar vein, as I described in my last diary entry, a long-standing performance issue in PostGIS was the repeated reading of large geometries during spatial joins.

Much of the problem was solved by dropping a very small “TOAST cache” into the process by which PostGIS reads geometries in functions frequently used in spatial joins.


I was so happy with the improvement the TOAST cache provided that I just stopped. Fortunately, my fellow PostGIS community member Raúl Marín was more stubborn.

Having seen my commit of the TOAST cache, and having done some work in other caching parts of PostGIS, he took up the challenge and integrated the TOAST cache with the existing index caches.

The integrated system now uses TOAST identifiers to note identical repeated inputs and avoid both unneccessary reads off disk and unncessary cache checks of the index cache.

Folx Pro 5 for Mac_Folx Pro 5 for Mac官方版下载 - 下载工具 ...:今天 · Folx Pro是一款适合Mac的专业下载工具也是一款BT下载器,Folx中文版有一个支持Retina显示的现代界面,提供独特的系统排序、存储下载内容与预览下载文件。Folx中文官网提供Folx教程、激活码、下载。

I prepared a demo for a bid proposal this week and found that an example query that took 800ms on my laptop took a full minute on the beefy 16-core demo server. What had I done wrong? Ah! My laptop is running the 苹果上youtube网站加速软件 PostGIS code (which will become 3.1) while the cloud server was running PostGIS 2.4. Mystery solved!


I may have mentioned that I’m not a very good programmer.

My current task is definitely exercising my imposter syndrome: porting Martin’s new overlay code from JTS to GEOS.

I knew it would take a long time, and I knew it would be a challenge; but knowing and experiencing are quite different things.

The challenges, as I’ve experienced them are:

  • Moving from Java’s garbage collected memory model to C++’s managed memory model means that I have to understand the object life-cycle which is implicit in Java and make it mac怎么上youtube in C++, all while avoiding accidentally introducing a lot of memory churn and data copying into the GEOS port. Porting isn’t a simple matter of transcribing and papering over syntactic idiom, it involves first understanding the actual JTS algorithms.
  • The age of the GEOS code base, and number of contributors over time, mean that there are a huge number of different patterns to potentially follow in trying to make a “consistent” port to GEOS. Porting isn’t a matter of blank-slate implementation of the JTS code – the ported GEOS code has to slot into the existing GEOS layout. So I have to spend a lot of time learning how previous implementations chose to handle life cycles and call patterns (pass reference, or pointer? yes. Return value? or void return and output parameter? also yes.)
  • My lack of C++ idiom means I spend an excessive amount of time looking up core functions and methods associated with them. This is the only place I’ve felt myself measurably get better over the past weeks.

I’m still only just getting started, having ported some core data structures, and little pieces of dependencies that the overlay needs. The reward will be a hugely improved overlay code for GEOS and thus PostGIS, but I anticipate the debugging stage of the port will take quite a while, even when the code is largely complete.

Wish me luck, I’m going to need it!

If you would like to test the new JTS overlay code, it resides on this branch.
If you would like to watch me suffer as I work on the port, the GEOS branch is here.

Developers Diary 1

I’m not a particularly good developer.

I don’t plan well, I tend to hack first and try and find the structure afterwards. I am easily distracted. It takes me an exceedingly long time to marshal a problem in my head enough to attack it.

That said, the enforced slow-down from pandemic time has given me the opportunity to sit and look at code, knowing nothing else is coming down the pipe. There are no talks to prepare, no big-think keynotes to draft. I enjoy those things, and I really enjoy the ego-boost of giving them, but the preparation of them puts me in a mental state that is not conducive to doing code work.

YouTube视频怎么加速播放-百度经验:2021-12-4 · YouTube视频怎么加速播放,在上面的视频网站看视频的时候,想要对视频加速播放的,那么点击那么才可以设置加速播放的呢?

The Successful Failure

Spatial operations against large objects have always been a performance hot spot.

The first problem is that large objects are … large. So if you have algorithms that scale O(n^2) on the number of vertices large objects will kill you. Guess what? Distance, intersects tests, and so on are all O(n^2) in their basic implementations.

We solved this problem a long time ago in PostGIS by putting in an extra layer of run-time indexing.


During a query (for those functions where it makes sense) if we see the same object twice in a row, we build an index on the edges of that object and keep the index in memory, for the life of the query. This gives us O(log(n)) performance for intersects, point-in-polygon, and so on. For joins in particular, this pattern of “seeing the same big thing multiple times” is very common.

This one small trick is one reason PostGIS is so much faster than “the leading brands”.

However, in order to “see the same object twice” we have to, for each function call in the query, retrieve the whole object, in order to compare it against the one we are holding in memory, to see if it is the same.

Here we run into an issue with our back-end.

PostgreSQL deals with large objects by (a) compressing them and (b) cutting the compressed object into slices and storing them in a side table. This all happens in the background, and is why you can store 1GB objects transparently in a database that has only an 8KB page size.

It’s quite computationally expensive, though. So much so that I found that simply bypassing the compression part of this feature could provide 5x performance gains on our spatial join workload.


At a code sprint in 2018, the PostGIS team agreed on the necessary steps to work around this long-standing performance issue.

  • Enhance PostgreSQL to allow partial decompression. This would allow the PostGIS caching system to retrieve just a 苹果怎么看youtube of large objects and use that part to determine if the object was not already in the cache.
  • Enhance the PostGIS serialization scheme to add a hashcode at the front of each large object. This way “is this a new object” could be answered with just a few bytes of hash, instead of checking the whole object.
  • Moon加速器:2021-6-5 · 世界这么大 带你去看看 我们在全世界几十个国家拥有几十台月光加速器服务器,只需要点击一下按钮,即可安全的访问全球最受欢迎的网站。谷歌,YouTuBe,FaceBook,Line从此无论您身在何处都可以轻松高速的访问。

Since this involved a change in PostgreSQL, which runs on an annual release cycle, and a change to the PostGIS serialization scheme, which is a major release marker, the schedule for this work was… long term.


Still, I managed to slowly chip away at it, goal in mind:

  • Last year I got compressed TOAST slicing added to PostgreSQL, which provided immediate performance benefits for some existing large object workloads.
  • I also added the serialization update to PostGIS, which was part of the PostGIS 3.0 release in the fall of 2019.

That left adding the hash code to the front of the objects, and using that code in the PostGIS statement cache.

Folx Pro 5 for Mac_Folx Pro 5 for Mac官方版下载 - 下载工具 ...:今天 · Folx Pro是一款适合Mac的专业下载工具也是一款BT下载器,Folx中文版有一个支持Retina显示的现代界面,提供独特的系统排序、存储下载内容与预览下载文件。Folx中文官网提供Folx教程、激活码、下载。

Things Fall Apart

The old statement cache was focussed on ensuring the in-memory indexes were in place. It didn’t kick in until the object had already been retrieved. So avoiding retrieval overhead was going to involve re-working the cache quite a bit, to handle both object and index caching.

I started on the work, which still lives on in this branch, but the many possible states of the cache (do I have part of an object? a whole object? an indexed object?) and the fact that it was used in multiple places by different indexing methods (geography tree, geometry tree, GEOS tree), made the change worrisomely complex.

And so I asked a question, that I should have asked years ago, to the pgsql-hackers list:

… within the context of a single SQL statement, will the Datum values for a particular object remain constant?

Basically, could I use the datum values as unique object keys without retrieving the whole object? That would neatly remove any need to retrieve full objects in order to determine if the cache needed to be updated. As usual, Tom Lane had the answer:

Jeez, no, not like that.

Oh, “good news”, I guess, my work is not in vain. Except wait, Tom included a codicil:

葫芦加速器:为数字生活更添一份安全:2021-6-5 · 因为本软件的特殊性,无法通过苹果商店搜索并下载,只能通过安装包的形式自行安装,安装后需要通过手动设置才能正常打开本软件。请按如下步骤进行设置: 1.点击安装后,按home键。软件第一次打开时会提示未受信任企业开发者:请点击“取消”。

Hm. So for a subset of objects, it was possible to generate a unique key without retrieving the whole object.


And that subset – “toasted-out-of-line datum” – were in fact the objects causing the hot spot: objects large enough to have been compressed and then stored in a side table in 8KB chunks.

What if, instead of re-writing my whole existing in-memory index cache, I left that in place, and just added a simple new cache that only worried about object retrieval. And only cached objects that it could obtain unique keys for, these “toasted-out-of-line” objects. Would that improve performance?

It did. By 20 times on my favourite spatial join benchmark. In increased it by 苹果上youtube网站加速软件 on a join where only 10% of the objects were large ones. And on joins where none of the objects were large, the new code did not reduce performance at all.

And here’s the punch line: I’ve known about the large object hot spot for at least 5 years. Probably longer. I put off working on it because I thought the solution involved core changes to PostgreSQL and PostGIS, so first I had to put those changes in, which took a long time.

Mac毒 - Mac软件下载网站(奶酪网):2 天前 · Mac 软件出现「意外退出」及「打不开」解决方法 最近很多用户反映软件出现意外退出及软件损坏的情况,这是因为苹果在7月12日删除了TNT的证书,所以大部分TNT破解的Mac软件会出现无法打开,提示意外退出。

  • First on a branch to add hash codes, using the new serialization mechanisms from PostGIS 3.
  • Youtube电脑版下载_Youtube电脑版官方下载「含模拟器」 ...:2021-9-9 · Youtube电脑版是一款软件。Youtube电脑版是一款视频类的软件,它是世界上最大的视频分享网站,可供网民上载观看及分享短片,至今它已成为同类型 ...

And then I threw all that work away, and in about 3 hours, wrote and tested the final patch that gave a 20x performance boost.

So, was this a success or a failure?


I’ve become inured to the huge mismatch in “time spent versus code produced”, particularly when debugging. Spending 8 hours stepping through a debugger to generate a one-line patch is pretty routine.

But something about the mismatch between my grandious and complex solution (partial retrieval! hash code!) and the final solution (just ask! try the half-measure! see if it’s better!) has really gotten on my nerves.

I like the win, but the path was a long and windy one, and PostGIS users have had slower queries than necessary for years because I failed to pose my simple question to the people who had an answer.

The Successful Success

Contra to that story of the past couple weeks, this week has been a raging success. I keep pinching myself and waiting for something to go wrong.

A number of years ago, JTS got an improvement to robustness in some operations by doing determinant calculations in higher precision than the default IEEE double precision.

Those changes didn’t make it into GEOS. There was an experimental branch, that Mateusz Loskot put together, and it sat un-merged for years, until I picked it up last fall, rebased it and merged it. I did so thinking that was the fastest way, and probably it was, but it included a dependency on a full-precision math library, ttmath, which I added to our tree.


Unfortunately, ttmath is basically unmaintained now.

And ttmath is arbitrary precision, while we really only need “higher precision”. JTS just uses a “double double” implementation, that uses the register space of two doubles for higher precision calculations.

Sidify Apple Music Converter 苹果音乐转换器 4.1.0 中文破解版:今天 · Sidify Apple Music Converter 苹果音乐转换器 4.1.0 中文破解版音频转换 Picture Instruments Time Fix Pro 照片时间修改软件 2.0.4 破解版图像处理 Ultimate EPubsoft DRM Removal 电子书DRM删除工具 15.8.2 破解版应用其他 NoteExpress 文献管理软件 官方版管理工具 ArtMoney SE 游戏修改工具 7.45.1 官方版游戏工具 TBProAudio Bundle ...

And ttmath includes some fancy assembly language that makes the build system more complex.

Fortunately, the JTS DD is really not that large, and it has no endian assumptions in it, so I ported it and tested it out against ttmath.

It’s smaller.

It’s faster. (About 5-10%. Yes, even though it uses no special assembly tricks, probably because it doesn’t have to deal with arbitrary precision.)

And here’s the huge surprise: it caused zero regression failures! It has exactly the same behaviour as the old implementation!


So needless to say, once the branch was stable, I merged it in and stood there in wonderment. It seems implausable that something as foundational as the math routines could be swapped out without breaking something.

The whole thing took just a few days, and it was so painless that I’ve also made a patch to the 3.8 stable series to bring the new code back for big endian platform support in the mean time.

The next few days I’ll be doing ports of JTS features and fixes that are net-new to GEOS, contemplative work that isn’t too demanding.

Some days everything is easy.

Some days everything is hard.

Don’t let the hard days hold you back!



Every year, on the second Wednesday of November, Esri (“the Microsoft of GIS”) promotes a day of celebration, “GIS Day” in which the members of our community unite to tell the world about the wonders of cartography and spatial data and incidentally use their software a lot in the process.

And every year, for the last number of years, on the day after “GIS Day”, a motley crew of open source users and SQL database afficionados observe “PostGIS Day”. Until this fall, I had never had a chance to personally participate in a PostGIS Day event, but this year Crunchy sponsored a day in St Louis, and I got to talk an awful lot about PostGIS.

It was really good, and I feel like there’s lots more to be done, if only on the subject of spatial SQL and analysis in the database. Here’s the talks I gave, the balance are on the event page.

PostGIS Introduction

Serving Dynamic Vector Tiles

Geocoding and Text Search in PostGIS

PostGIS 3.0 Overview


In a little change from the usual course of conference structure, I was invited to debate the merits of open source versus proprietary software at the North51 conference in Banff, Alberta last week.


There isn’t a video, but to give you a flavour of how I approached the task, here’s my opening and closing statements:


Thank you for having me here, Jon, and choosing me to represent the correct side of this argument.

So, to provide a little context, I’d like to start by reading the founding texts of this particular disagreement.

The first text is Bill Gates’ “Open Letter to Hobbyists”, published in the Homebrew Computer Club newsletter in February of 1976, kicking off the era of proprietary software that is still be-devilling us, 45 years later.

“Almost a year ago, Paul Allen and myself, expecting the hobby market to expand, hired Monte Davidoff and developed Altair BASIC. Though the initial work took only two months, the three of us have spent most of the last year documenting, improving and adding features to BASIC… The value of the computer time we have used exceeds $40,000.

“The feedback we have gotten from the hundreds of people who say they are using BASIC has all been positive. Two surprising things are apparent, however, 1) Most of these “users” never bought BASIC and 2) The amount of royalties we have received from sales to hobbyists makes the time spent on Altair BASIC worth less than $2 an hour.

“Why is this? As the majority of hobbyists must be aware, most of you steal your software. Hardware must be paid for, but software is something to share. Who cares if the people who worked on it get paid?

The second text is the initial announcement of the Linux source code, sent by Linus Torvalds in August of 1991

“Hello everybody out there using minix - I’m doing a (free) operating system (just a hobby, won’t be big and professional like gnu) for 386(486) AT clones. … , and I’d like to know what features most people would want. Any suggestions are welcome, but I won’t promise I’ll implement them :-) Linus

After sending these messages, both these technology innovators went on to manage the creation of operating systems that have become dominant, industry standards. Microsoft Windows and Linux.

苹果手机IOS网络加速教程 - look小站:2021年最新的苹果手机网络加速教程方法,网络加速辅助软件可以打开使用访问浏览观看常用的设计网ins,instagram,twitch,Twitter,line,youtube,google,Messenger,推特,谷歌搜索浏览器访问google应用商店,Tumblr,facebook,脸书,printerest,汤不热,behance,pornhub ...

A simple interpretation of this set of facts, of Gates berating hobbyists for “stealing” his software, and of Torvalds welcoming folks to provide him with feature suggestions, is that Gates is a miserable, grasping, corporate greedhead, and Torvalds is a far-seeing, generous, socially conscious computer monk.

There’s something to that.

Still…. A more nuanced view looks at the dates the letters were sent.

In 1976, when Gates sent his letter, the way you built a substantial piece of serious software, is you got 1, 10, 100 programmers together in one building, so you could coordinate their efforts, and you paid them to come in every day and work on it.

And you kept on paying them, until they were done, or done enough to ship, 1, 2 or more months later. And then you made back all that money afterwards, selling many many copies of the software.

This was the shrink-wrap proprietary software model, and it was really easy to understand, because it was exactly the same model used for books, or music, or movies.

Hey… has anyone noticed, a change, in the way we consume books, or music, or movies? Things are different than they were, in 1976. Right?

OK, so what is REALLY different about Torvalds? The difference is manifest in the very way he sent his message. He didn’t mail it to a magazine. He published it electronically, on a Usenet bulletin board, an early mailing list, of Unix operating system enthusiasts, comp.os.minix.

免费: ytb youtube 下载-windows: ytb youtube:2021-3-27 · Youtube 下载高清是一个免费的工具,从 YouTube 下载视频并将其保存到您的本地计算机。视频可以被转换到 avi 视频格式或 mp4 (与 iPod、 iPhone 兼容)。与 Youtube 下载高清可以从 YouTube 下载高质量、 高清晰度和全高清视频。

Free YouTube Download Premium(youtube视频下载软件 ...:2021-2-2 · 点击下载 腾讯电脑管家(电脑杀毒软件)官方正式版V13.5.20214下载 点击下载 DRS Data Recovery System(DRS6800数据恢复系统)官方中文版V18.7.3.309 点击下载 微软win7补丁合集2021-2021年1月底(win7补丁合集)V2021.01.17 点击下载 酷我音乐(免登陆无损音乐下载神器)官方中文破解版V9.0.8.0_W1 | 酷我音乐破解版 ...

And eventually it was useful enough the companies started using it, for important things. And they started hiring people to work on it, 8 hours a day, 5 days a week.

But they didn’t have to move to Seattle, either. And they didn’t have to sign over their work to Microsoft, to do the work.

And eventually Linux was so useful that the majority of people working on it were being paid, but not by any one company.

Linus Torvalds works for the Linux Foundation, which is funded by the largest companies in tech.

The top contributors to the Linux kernel in 2017 worked for Intel, Red Hat, Linaro, Samsung, SUSE and IBM. And that only accounts for about 1/3 of contributions… the rest come from a long tail of other contributors.

We’re going to end up talking about definitions and arguing over words a little in this session, I imagine, so I’d like to get one common one out of the way early.

加速精灵手机版_加速精灵手机版安卓版下载_软吧:2021-3-6 · 加速精灵手机版安卓版免费下载,加速精灵vpn手机版是一款专业的网游加速器,软件使用简单,还可翻墙浏览脸书网,YouTube等国外网站,加速效果显著,是一款不可多得的加速软件! 软件特色: 加速精灵是一款专业网游加速、网络加速软件,

Youtube电脑版下载_Youtube电脑版官方下载「含模拟器」 ...:2021-9-9 · Youtube电脑版是一款软件。Youtube电脑版是一款视频类的软件,它是世界上最大的视频分享网站,可供网民上载观看及分享短片,至今它已成为同类型 ...

You wouldn’t describe my 苹果怎么看youtube employer, Crunchy data as a “non-commercial” entity. We are a private for-profit company, with a corporate headquarters, major clients in government and industry, and a headcount of almost 100.

It’s worth noting that both those employers of mine are headquartered nowhere near where I live, in British Columbia.

That’s not an accident. That really the whole story. It’s the heart of the matter.

The proprietary software model is obsolete.

It is a relic of a bygone age, the pre-internet age.

Before the advent of the internet, the proprietary model was useful to capitalize some forms of large scale software development, but now, in the internet era, it’s mostly an obstacle, a brake on innovation.

Those are some hard words. I know. But if you don’t believe me, maybe ask the number one contributor to open source projects on Github. It’s a little Seattle company called “Microsoft”.

Not only is Microsoft the number one corporate contributor to open source software hosted on Github, they liked Github itself so much they bought the company.

Microsoft knows the future is open source, I know the future is open source, and I hope by the time we’re done you all know the future is open source.


I know there is proprietary software in the world.

I am not saying there is no place for proprietary software in the world.

Some of my best friends use proprietary software.

I do not harangue them, I do not put them down.

Well, not to their faces, anyways.

What I do know is that the system of proprietary software is a system in which all the incentives align towards passivity, towards stagnation, and away from innovation.

Proprietary vendor’s incentives are to lock customers in, and to drive customers towards further purchases of more product.

This leads to less interoperability.

Final Cut Pro for Mac 10.2.3 破解版 - 苹果 - mac软件 - 影音 ...:2021-2-3 · 文件:FinalCutPro1023[MAS].dmg 大小:2.49 GB 免费高速下载。 Final Cut Pro 是Mac OS平台上最好的视频剪辑软件,Final Cut Pro为原生64位软件,基于Cocoa编写,支持多路多核心处理器,支持GPU加速,支持后台渲染,可编辑从标清到4K的各种

Final Cut Pro for Mac 10.2.3 破解版 - 苹果 - mac软件 - 影音 ...:2021-2-3 · 文件:FinalCutPro1023[MAS].dmg 大小:2.49 GB 免费高速下载。 Final Cut Pro 是Mac OS平台上最好的视频剪辑软件,Final Cut Pro为原生64位软件,基于Cocoa编写,支持多路多核心处理器,支持GPU加速,支持后台渲染,可编辑从标清到4K的各种

Customers dependent on proprietary software lose their agency in improving their tools. They adopt poor systems designs to fit their software use within the terms of their license limits.

小火箭(Shadowrocket)免费安装及使用教程-苹果IOS用爱思 ...:2021-3-27 · 导读:此教程是为那些想用小火箭有不想花钱购买下载安装的伙伴准备的,如果你拥有美区ID,手机可以通过AppStore安装小火箭,那这篇教程下载安装部分你就不用看了,到AppStore安装才是正道。 如需付费机场节点请出门右拐,林云倾力推荐,持续稳定,全球高速节点4k无压力,本站不提供节点服 …


  • As a society, we should bias toward a software development model that maximizes innovation. Open source is that model.
  • As organizations, we should bias toward a software development model and tools that maximize flexibility and cooperation. Open source is that model.
  • As individuals, we should bias towards tools that maximize our ability to move our skills from employer to employer, regardless of what vendor they happen to use. Open source provides those tools.

Sidify Apple Music Converter 苹果音乐转换器 4.1.0 中文破解版:今天 · Sidify Apple Music Converter 苹果音乐转换器 4.1.0 中文破解版音频转换 Picture Instruments Time Fix Pro 照片时间修改软件 2.0.4 破解版图像处理 Ultimate EPubsoft DRM Removal 电子书DRM删除工具 15.8.2 破解版应用其他 NoteExpress 文献管理软件 官方版管理工具 ArtMoney SE 游戏修改工具 7.45.1 官方版游戏工具 TBProAudio Bundle ...

PostgreSQL and SQL and Books

吐血整理,Macbook必备20款应用软件,满满的干货! - 知乎:最近有朋友留言说让小编推荐一些macbook必备应用软件,这不,macdown小编就精心整理了20多款有着不同用途的软件,自己用着还不错,现在分享给大家,整理不易,希望大家点赞收藏!一、广告拦截:AdGuard MacOS上的…

And I never run out of developers for whom that is good advice.

I think the reason is that so many developers learn basic SQL CRUD operations, and then stop. They can filter with a WHERE clause, they can use Sum() and GROUP BY, they can 国内ipad怎么看youtube and DELETE.

If they are particularly advanced, they can do a JOIN. But that’s usually where it ends.

And the tragedy is that, because they stop there, they end up re-writing big pieces of data manipulation logic in their applications – logic that they could skip if only they knew what their SQL database engine was capable of.

Since so many developers are using PostgreSQL now, I have taken to recommending a couple of books, written by community members.

For people getting started with PostgreSQL, and SQL, the Art of PostgreSQL, by Dmitri Fontaine.


For people who are wanting to learn PostGIS, and spatial SQL, I recommend PostGIS in Action, by Regina Obe and Leo Hsu.

PostGIS in Action

Both Dmitri and Regina are community members, and both have been big contributors to PostgreSQL and PostGIS. One of the key PostgreSQL features that PostGIS uses is the “extension” system, which Dmitri implemented many years ago now. And of course Regina has been active in the PostGIS develompent community almost since the first release in the early 2000s.

I often toy with the idea of writing a PostGIS or a PostgreSQL book, but then I stop and think, “wait, there’s already lots of good ones out there!” So I wrote this short post instead.