<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress/2.2.2" -->
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
	<title>Comments for A Sense of Design</title>
	<link>https://codesynthesis.com/~boris/blog/</link>
	<description>Boris Kolpackov's blog about software</description>
	<pubDate>Wed, 22 Apr 2026 00:37:02 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.2.2</generator>

	<item>
		<title>Comment on build2 &#8211; C++ Build Toolchain by ajneu</title>
		<link>https://codesynthesis.com/~boris/blog//2016/02/03/build2-cxx-build-toolchain/#comment-2463</link>
		<author>ajneu</author>
		<pubDate>Sat, 13 Feb 2016 14:21:52 +0000</pubDate>
		<guid>https://codesynthesis.com/~boris/blog//2016/02/03/build2-cxx-build-toolchain/#comment-2463</guid>
		<description>Hi Boris,

another build system for C++ !?! Yikes!
This is really a hard long task, if you want it feature-rich and want to get people to use it. (at least that's my opinion.)

Particularly with CMake being really very very nice.
To me CMake is the answer to all my build tasks:

* It can do multi-platform and generate Makefiles for Linux, MSYS2, Mingw, Visual Studio, Eclipse, etc.
* It handles Qt moc without problems. http://doc.qt.io/qt-5/cmake-manual.html
* It handles cross-builds nicely (example: https://github.com/arobenko/embxx_on_rpi )
* It has a good plugin system e.g. for finding libraries (e.g. cmake -DBOOST_ROOT=/path/to/boost ..) https://cmake.org/cmake/help/latest/module/FindBoost.html
* It has good support for building libraries (shared, static)
* debug vs release builds
* build vs install commands
* flexible RPath support
* support for pulling in remote projects via git (e.g. https://github.com/Crascit/DownloadProject )
* command language (copy this here, do this after build, etc.)
* detect platform, detect endianness, detect 32 bit vs 64 bit
* generate files (e.g. special .h file)
* support for packaging (e.g. deb files)

Regards,
ajneu</description>
		<content:encoded><![CDATA[<p>Hi Boris,</p>
<p>another build system for C++ !?! Yikes!<br />
This is really a hard long task, if you want it feature-rich and want to get people to use it. (at least that&#8217;s my opinion.)</p>
<p>Particularly with CMake being really very very nice.<br />
To me CMake is the answer to all my build tasks:</p>
<p>* It can do multi-platform and generate Makefiles for Linux, MSYS2, Mingw, Visual Studio, Eclipse, etc.<br />
* It handles Qt moc without problems. <a href="http://doc.qt.io/qt-5/cmake-manual.html" rel="nofollow">http://doc.qt.io/qt-5/cmake-manual.html</a><br />
* It handles cross-builds nicely (example: <a href="https://github.com/arobenko/embxx_on_rpi" rel="nofollow">https://github.com/arobenko/embxx_on_rpi</a> )<br />
* It has a good plugin system e.g. for finding libraries (e.g. cmake -DBOOST_ROOT=/path/to/boost ..) <a href="https://cmake.org/cmake/help/latest/module/FindBoost.html" rel="nofollow">https://cmake.org/cmake/help/latest/module/FindBoost.html</a><br />
* It has good support for building libraries (shared, static)<br />
* debug vs release builds<br />
* build vs install commands<br />
* flexible RPath support<br />
* support for pulling in remote projects via git (e.g. <a href="https://github.com/Crascit/DownloadProject" rel="nofollow">https://github.com/Crascit/DownloadProject</a> )<br />
* command language (copy this here, do this after build, etc.)<br />
* detect platform, detect endianness, detect 32 bit vs 64 bit<br />
* generate files (e.g. special .h file)<br />
* support for packaging (e.g. deb files)</p>
<p>Regards,<br />
ajneu</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on libstudxml &#8211; modern XML API for C++ by Boris Kolpackov</title>
		<link>https://codesynthesis.com/~boris/blog//2014/05/20/libstudxml-modern-xml-api-cxx/#comment-2437</link>
		<author>Boris Kolpackov</author>
		<pubDate>Wed, 21 May 2014 20:16:04 +0000</pubDate>
		<guid>https://codesynthesis.com/~boris/blog//2014/05/20/libstudxml-modern-xml-api-cxx/#comment-2437</guid>
		<description>The parser needs the document name for diagnostics (error messages will look like "input.xml:12:23 ...").

As for conversion of "male" to gender, that's a good question that is answered in the documentation.</description>
		<content:encoded><![CDATA[<p>The parser needs the document name for diagnostics (error messages will look like &#8220;input.xml:12:23 &#8230;&#8221;).</p>
<p>As for conversion of &#8220;male&#8221; to gender, that&#8217;s a good question that is answered in the documentation.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on libstudxml &#8211; modern XML API for C++ by DeadMG</title>
		<link>https://codesynthesis.com/~boris/blog//2014/05/20/libstudxml-modern-xml-api-cxx/#comment-2436</link>
		<author>DeadMG</author>
		<pubDate>Wed, 21 May 2014 20:09:55 +0000</pubDate>
		<guid>https://codesynthesis.com/~boris/blog//2014/05/20/libstudxml-modern-xml-api-cxx/#comment-2436</guid>
		<description>Why on earth does the parser need both the filename and the stream? Shouldn't it only need the stream?

And how do you convert from "male" to gender::male? C++ does not support reflection.</description>
		<content:encoded><![CDATA[<p>Why on earth does the parser need both the filename and the stream? Shouldn&#8217;t it only need the stream?</p>
<p>And how do you convert from &#8220;male&#8221; to gender::male? C++ does not support reflection.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on libstudxml &#8211; modern XML API for C++ by Boris Kolpackov</title>
		<link>https://codesynthesis.com/~boris/blog//2014/05/20/libstudxml-modern-xml-api-cxx/#comment-2435</link>
		<author>Boris Kolpackov</author>
		<pubDate>Wed, 21 May 2014 15:30:43 +0000</pubDate>
		<guid>https://codesynthesis.com/~boris/blog//2014/05/20/libstudxml-modern-xml-api-cxx/#comment-2435</guid>
		<description>Arseny, as I mentioned in my post, I discuss the issue of real XML parsers in my talk in much more detail, so I suggest that you check it out when the video is available. In a nutshell, the argument boils down to this: The intended use of XML is as a data interchange format, not just a data storage format. If your application is the sole producer and consumer of the data, then you might as well choose a more natural and efficient format than XML. So assuming we use XML for data interchange, while your code may not use any of the CDATA's or DTD's, it is only a matter of time before someone sends you a perfectly valid XML that your application won't be able to parse. In fact, most of the "subset" parsers, including pugixml, don't even document what happens when valid but unsupported XML constructs are encountered. Are they ignored? Is there an error? Crash? Nobody knows. In fact, you don't even document that your XML parser only supports a subset of XML, which is what I find misleading.

So in my talk I suggested that people don't corner themselves and instead stick to real XML parsers. There are plenty of conforming and fast implementations out there. And not a single person in the audience raised your "but it works in 99% of use cases" objection.

Regarding the in-memory vs streaming API argument (which is also covered in the talk extensively), most people think they need DOM but I think this is just because of the really bad streaming APIs that were available up to this point. So I tried to convince the audience that streaming is actually sufficient for the majority of cases. Plus, it is easy to go from streaming to in-memory but not the other way around. In fact, libstudxml has the 'hybrid' example which shows how to do hybrid, partially streaming/partially in-memory parsing and serialization.</description>
		<content:encoded><![CDATA[<p>Arseny, as I mentioned in my post, I discuss the issue of real XML parsers in my talk in much more detail, so I suggest that you check it out when the video is available. In a nutshell, the argument boils down to this: The intended use of XML is as a data interchange format, not just a data storage format. If your application is the sole producer and consumer of the data, then you might as well choose a more natural and efficient format than XML. So assuming we use XML for data interchange, while your code may not use any of the CDATA&#8217;s or DTD&#8217;s, it is only a matter of time before someone sends you a perfectly valid XML that your application won&#8217;t be able to parse. In fact, most of the &#8220;subset&#8221; parsers, including pugixml, don&#8217;t even document what happens when valid but unsupported XML constructs are encountered. Are they ignored? Is there an error? Crash? Nobody knows. In fact, you don&#8217;t even document that your XML parser only supports a subset of XML, which is what I find misleading.</p>
<p>So in my talk I suggested that people don&#8217;t corner themselves and instead stick to real XML parsers. There are plenty of conforming and fast implementations out there. And not a single person in the audience raised your &#8220;but it works in 99% of use cases&#8221; objection.</p>
<p>Regarding the in-memory vs streaming API argument (which is also covered in the talk extensively), most people think they need DOM but I think this is just because of the really bad streaming APIs that were available up to this point. So I tried to convince the audience that streaming is actually sufficient for the majority of cases. Plus, it is easy to go from streaming to in-memory but not the other way around. In fact, libstudxml has the &#8216;hybrid&#8217; example which shows how to do hybrid, partially streaming/partially in-memory parsing and serialization.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on libstudxml &#8211; modern XML API for C++ by Arseny Kapoulkine</title>
		<link>https://codesynthesis.com/~boris/blog//2014/05/20/libstudxml-modern-xml-api-cxx/#comment-2434</link>
		<author>Arseny Kapoulkine</author>
		<pubDate>Wed, 21 May 2014 15:02:21 +0000</pubDate>
		<guid>https://codesynthesis.com/~boris/blog//2014/05/20/libstudxml-modern-xml-api-cxx/#comment-2434</guid>
		<description>As an author of pugixml, I can't help but comment on the "real XML parser" thing... Your link is very misleading - you stumbled upon a parser that can't read content from valid XML at all, CDATA of all things. Great.

Fast/compact XML libraries solve real problems. As long as a parser can read a valid XML disregarding DTD entities, it's applicable to 99% real-world problems.

If I were to consider libstudxml vs pugixml in a project, I would *not* use this as a disctinction point. A much more important thing is that all three parsers that you specified are DOM, and this parser is pull-based - so depending on the task at hand one is more applicable.</description>
		<content:encoded><![CDATA[<p>As an author of pugixml, I can&#8217;t help but comment on the &#8220;real XML parser&#8221; thing&#8230; Your link is very misleading - you stumbled upon a parser that can&#8217;t read content from valid XML at all, CDATA of all things. Great.</p>
<p>Fast/compact XML libraries solve real problems. As long as a parser can read a valid XML disregarding DTD entities, it&#8217;s applicable to 99% real-world problems.</p>
<p>If I were to consider libstudxml vs pugixml in a project, I would *not* use this as a disctinction point. A much more important thing is that all three parsers that you specified are DOM, and this parser is pull-based - so depending on the task at hand one is more applicable.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on ODB 2.2.0 Released by Boris Kolpackov</title>
		<link>https://codesynthesis.com/~boris/blog//2013/02/13/odb-2-2-0-released/#comment-2395</link>
		<author>Boris Kolpackov</author>
		<pubDate>Thu, 14 Feb 2013 03:42:12 +0000</pubDate>
		<guid>https://codesynthesis.com/~boris/blog//2013/02/13/odb-2-2-0-released/#comment-2395</guid>
		<description>mrB, of course we can, if someone writes them ;-). 

Seriously, though, I can't imagine them being very different compared to Raspberry PI, provided you are using one of the Linux distributions on BeagleBone. Most likely it is just a matter of getting a different cross-compiler toolchain.</description>
		<content:encoded><![CDATA[<p>mrB, of course we can, if someone writes them ;-). </p>
<p>Seriously, though, I can&#8217;t imagine them being very different compared to Raspberry PI, provided you are using one of the Linux distributions on BeagleBone. Most likely it is just a matter of getting a different cross-compiler toolchain.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on ODB 2.2.0 Released by mrB</title>
		<link>https://codesynthesis.com/~boris/blog//2013/02/13/odb-2-2-0-released/#comment-2393</link>
		<author>mrB</author>
		<pubDate>Thu, 14 Feb 2013 00:23:01 +0000</pubDate>
		<guid>https://codesynthesis.com/~boris/blog//2013/02/13/odb-2-2-0-released/#comment-2393</guid>
		<description>Can we have build instructions for Beaglebone/Board as well?</description>
		<content:encoded><![CDATA[<p>Can we have build instructions for Beaglebone/Board as well?</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Visual Studio 2012 First Impressions by Boris Kolpackov</title>
		<link>https://codesynthesis.com/~boris/blog//2012/10/09/visual-studio-2012-first-impressions/#comment-2352</link>
		<author>Boris Kolpackov</author>
		<pubDate>Thu, 11 Oct 2012 12:44:50 +0000</pubDate>
		<guid>https://codesynthesis.com/~boris/blog//2012/10/09/visual-studio-2012-first-impressions/#comment-2352</guid>
		<description>Kenneth, the problem with this approach is it requires modification of each project. In my case that would be hundreds of them. Plus, what I am looking for here is the equivalent to /usr/{include, lib} on UNIX; i.e., a mechanism to locate common headers/libraries (e.g., database access libraries) without having to hardcode non-portable locations into project files/makefiles.</description>
		<content:encoded><![CDATA[<p>Kenneth, the problem with this approach is it requires modification of each project. In my case that would be hundreds of them. Plus, what I am looking for here is the equivalent to /usr/{include, lib} on UNIX; i.e., a mechanism to locate common headers/libraries (e.g., database access libraries) without having to hardcode non-portable locations into project files/makefiles.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Visual Studio 2012 First Impressions by Kenneth Benzie</title>
		<link>https://codesynthesis.com/~boris/blog//2012/10/09/visual-studio-2012-first-impressions/#comment-2351</link>
		<author>Kenneth Benzie</author>
		<pubDate>Wed, 10 Oct 2012 19:36:13 +0000</pubDate>
		<guid>https://codesynthesis.com/~boris/blog//2012/10/09/visual-studio-2012-first-impressions/#comment-2351</guid>
		<description>Your issue pertaining to your include and library directories and so forth. Have you looked into creating your own Property Sheets instead of editing Microsoft.Cpp.Win32.User or Microsoft.Cpp.x64.User directly? This way you can set specific properties per solution/project and keep things separate if so required.

Alternatively properties that are not specific to a solution can be shared by loading the same Property Sheet in the various projects where required.

I suspect this would avoid the problems you encountered re VS2010 and VS2012 sharing</description>
		<content:encoded><![CDATA[<p>Your issue pertaining to your include and library directories and so forth. Have you looked into creating your own Property Sheets instead of editing Microsoft.Cpp.Win32.User or Microsoft.Cpp.x64.User directly? This way you can set specific properties per solution/project and keep things separate if so required.</p>
<p>Alternatively properties that are not specific to a solution can be shared by loading the same Property Sheet in the various projects where required.</p>
<p>I suspect this would avoid the problems you encountered re VS2010 and VS2012 sharing</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Emulating Boost.MultiIndex with Standard Containers by Maxim Yegorushkin</title>
		<link>https://codesynthesis.com/~boris/blog//2012/09/11/emulating-boost-multi-index-with-std-containers/#comment-2326</link>
		<author>Maxim Yegorushkin</author>
		<pubDate>Thu, 13 Sep 2012 11:40:55 +0000</pubDate>
		<guid>https://codesynthesis.com/~boris/blog//2012/09/11/emulating-boost-multi-index-with-std-containers/#comment-2326</guid>
		<description>&#62; ...  multi_index which has serious limitations on the mutability of elements

Not sure if const === serious. 

Boost multi_index tries to protect one from accidentally changing the key by returning references to const elements from find(). There is nothing wrong with casting away that const qualifier, it is like saying: "yeah, I know the key must not change, I promise not to do that and I know what I am doing".</description>
		<content:encoded><![CDATA[<p>&gt; &#8230;  multi_index which has serious limitations on the mutability of elements</p>
<p>Not sure if const === serious. </p>
<p>Boost multi_index tries to protect one from accidentally changing the key by returning references to const elements from find(). There is nothing wrong with casting away that const qualifier, it is like saying: &#8220;yeah, I know the key must not change, I promise not to do that and I know what I am doing&#8221;.</p>
]]></content:encoded>
	</item>
</channel>
</rss>
